001    /**
002     * 
003     */
004    package components;
005    
006    import java.util.HashMap;
007    import java.util.HashSet;
008    import java.util.Map;
009    import java.util.Set;
010    
011    import physics3d.Angle;
012    import physics3d.Shape;
013    import physics3d.Vect3;
014    
015    /**
016     * <p>
017     * Wall is a mutable object that specifies the outside boundaries of a GameSpace.
018     * Wall extends GameObject
019     * <br>
020     * Walls are inserted by the GameSpace itself, and are created in no other way.
021     * </p>
022     * @specfield length : int 
023     * @specfield width : int
024     */
025    
026    /*
027     * Abstraction Function 
028     * AF(r) = a Wall, w, such that
029     * w.length = r.length
030     * w.width = r.width
031     */
032    
033    /*
034     * Rep Invariant 
035     * length, width > 0
036     */
037    
038    public class Wall extends GameObject {
039    
040            //fields
041            int length; //length in L
042            int width; //width in L
043            
044            /**
045             * @param tlf      - the top left corner of the wall
046             * @param ov       - the normal vector to the wall
047             * @param oa       - tilt around ov
048             * @param name     - a name
049             * @param g        - the gamespace this wall is for
050             * @effects creates a new Wall
051             */
052            public Wall(Vect3 tlf, int length, int width, Vect3 ov, Angle oa, boolean visible, String name, GameSpace g) {
053                    super(tlf, ov, oa, name, g);
054                    
055                    this.length = length;
056                    this.width = width;
057                    shape = Shape.getWallShape(length, width);
058                    this.visible = visible;
059                    this.frozen = true;
060                    this.center = tlf.plus(new Vect3(width/2.0, length/2.0, 0) );
061                    this.coRef = 1.0;
062            }
063            
064            public Wall(Map<String, String> props, GameSpace g) {
065                    super (props, g);
066            }
067            
068            @Override
069            public Vect3 getDiff() {
070                    return new Vect3(width/2.0, height/2.0, 0);
071            }
072            
073            /**
074             * @return the GameObjectClassification of this object
075             */
076            public GameObjectClassification getGOClassification() {
077                    return GameObjectClassification.WALL;
078            }
079            
080            @Override
081            protected Shape shape() {
082                    return Shape.getWallShape(length, width);
083            }
084            
085            @Override
086            protected Map<String, String> defaults() {
087                    Map<String, String> smap = super.defaults();
088                    smap.put("visible", "false");
089                    return smap;
090            }
091            
092            /**
093             * @return a vect3 not in the GameSpace
094             */
095            public Set<Vect3> getOccupiedPositions() {
096                    Set<Vect3> ops = new HashSet<Vect3>();
097                    ops.add(new Vect3(-1, -1, -1)); //returns a spot not in the GameSpace
098                    return ops;
099            }
100    }