protected CreatureBase(string animationIdentifier, 
            int frameWidth, int frameHeight, int frames,
            GameWorld gameWorldRef, GamePlayer playerRef, Vector2 position, float animationSpeed)
        {
            PlayerRef = playerRef;
            GameWorldRef = gameWorldRef;
            _mapRef = gameWorldRef.Map ;

            // walking animation is unified in all creatures
            #region setting appropriate walking animation
            AnimationSet = GameGraphics.GetTexture(animationIdentifier);
            Animation = new SpriteAnimation(AnimationSet.SourceTexture);

            Animation.AddAnimation("Walk_E", 0, frameHeight * 0, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_N", 0, frameHeight * 1, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_NE", 0, frameHeight * 2, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_NW", 0, frameHeight * 3, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_S", 0, frameHeight * 4, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_SE", 0, frameHeight * 5, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_SW", 0, frameHeight * 6, frameWidth, frameHeight, frames, animationSpeed);
            Animation.AddAnimation("Walk_W", 0, frameHeight * 7, frameWidth, frameHeight, frames, animationSpeed);

            Animation.AddAnimation("Idle_E", 3 * frameWidth, frameHeight * 0, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_N", 3 * frameWidth, frameHeight * 1, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_NE", 3 * frameWidth, frameHeight * 2, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_NW", 3 * frameWidth, frameHeight * 3, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_S", 3 * frameWidth, frameHeight * 4, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_SE", 3 * frameWidth, frameHeight * 5, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_SW", 3 * frameWidth, frameHeight * 6, frameWidth, frameHeight, 1, 0.2f);
            Animation.AddAnimation("Idle_W", 3 * frameWidth, frameHeight * 7, frameWidth, frameHeight, 1, 0.2f);

            CurrentAnimation = "Idle_SE";

            Animation.IsAnimating = true;

            #endregion

            Position = position;
            _currentMoveDir = Vector2.Zero;
            _previousMovDir = Vector2.Zero;
            Distination = position;

            HealthStatusLine = new StatusLine(StatusLineType.Green);
            _healthStatusLineOffset = new Vector2(-13, -50);

            Actions = new ActionManager();
        }
        public ResidentialHouse(GameWorld gameWorldRef, GamePlayer playerRef, Point Location)
            : base("building1", gameWorldRef, playerRef, Location)
        {
            // filling the occupied_cells_locations List
            // (the purpose is to make these cells not walkable)
            #region Occupied Cells Work
            int cells_east = 3, cells_west = 5;

            Point west_indexer = Location;
            Point east_indexer = Location;

            for (int i = 0; i < cells_west; i++)
            {
                for (int j = 0; j < cells_east; j++)
                {
                    OccupiedCellsLocations.Add(east_indexer);
                    east_indexer = east_indexer.WalkTo(Direction.NE);
                }
                west_indexer = west_indexer.WalkTo(Direction.NW);
                east_indexer = west_indexer;
            }

            // now set the Mapcells at locations found to be not walkable..
            foreach (var location in OccupiedCellsLocations)
            {
                MapRef.MapCellAt(location).Walkable = false;
            }
            #endregion

            // making smoke on the roof
            #region smoke
            smoke = new SpriteAnimation(GameGraphics.GetTexture("smoke").SourceTexture);
            smoke.AddAnimation("normal", 0, 0, 30, 64, 16, 0.15f);
            smoke.Position = Camera.WorldToScreen(new Vector2(this.BuildingOrigin.X + 65, this.BuildingOrigin.Y - 64 + 35));
            smoke.CurrentAnimation = "normal";
            smoke.DrawDepth = BuildingInfo.SmokeDrawDepth;
            smoke.IsAnimating = true;
            #endregion

            selectionGroup = GroupMapper.HouseGroup;

            SelectionLineTexture = GameGraphics.GetTexture("residence_selection_line");

            #region Setting Entity Properties
            MaxHealth = 500;
            MaxDefense = 100;
            MaxAttack = 0;

            Health = MaxHealth;
            Defense = MaxDefense;
            Attack = MaxAttack;
            #endregion
        }
        public TrainingCamp(GameWorld gameWorldRef, GamePlayer playerRef, Point Location)
            : base("building6", gameWorldRef, playerRef, Location)
        {
            // filling the occupied_cells_locations List
            // (the purpose is to make these cells not walkable)
            #region Occupied Cells Work

            const int cellsEast = 3;
            const int cellsWest = 4;

            Point westIndexer = Location;
            Point eastIndexer = Location;

            for (int i = 0; i < cellsWest; i++)
            {
                for (int j = 0; j < cellsEast; j++)
                {
                    OccupiedCellsLocations.Add(eastIndexer);
                    eastIndexer = eastIndexer.WalkTo(Direction.NE);
                }
                westIndexer = westIndexer.WalkTo(Direction.NW);
                eastIndexer = westIndexer;
            }

            // add the irregular occupied cells..
            Point indexer = Location;
            indexer = indexer.WalkTo(Direction.SW);
            indexer = indexer.WalkTo(Direction.NW);
            indexer = indexer.WalkTo(Direction.NW);
            OccupiedCellsLocations.Add(indexer);
            indexer = indexer.WalkTo(Direction.NW);
            OccupiedCellsLocations.Add(indexer);

            // now set the Mapcells at locations found to be not walkable..
            foreach (var location in OccupiedCellsLocations)
            {
                MapRef.MapCellAt(location).Walkable = false;
            }

            //setting depths of irregular occupied cells..
            float irregularDepth1;
            float irregularDepth2;
            indexer = Location.WalkTo(Direction.SW).WalkTo(Direction.NW).WalkTo(Direction.NW);
            irregularDepth1 = MapRef.MapCellAt(indexer).DrawDepth;
            indexer = indexer.WalkTo(Direction.NW);
            irregularDepth2 = MapRef.MapCellAt(indexer).DrawDepth;

            int segIndexer = (ImgSegmentsDepthsOrdered.Count / 2) - 3; // indexes segment no. 3 counting from middle segment leftwards
            SegDepth newSegment = new SegDepth(ImgSegmentsDepthsOrdered[segIndexer].SegRect, irregularDepth1);
            ImgSegmentsDepthsOrdered[segIndexer] = newSegment;
            segIndexer--;
            SegDepth newSegment2 = new SegDepth(ImgSegmentsDepthsOrdered[segIndexer].SegRect, irregularDepth1);
            ImgSegmentsDepthsOrdered[segIndexer] = newSegment2;
            segIndexer--;
            SegDepth newSegment3 = new SegDepth(ImgSegmentsDepthsOrdered[segIndexer].SegRect, irregularDepth2);
            ImgSegmentsDepthsOrdered[segIndexer] = newSegment3;
            #endregion

            #region Generating Custom Built Units Locations
               //remove last location
            BuiltUnitsLocations.RemoveAt(BuiltUnitsLocations.Count-1);
            //get the new last location
            var loc = BuiltUnitsLocations[BuiltUnitsLocations.Count-1];

            Vector2 cell = new Vector2(MapRef.WorldToMapCell(loc).X,
                    MapRef.WorldToMapCell(loc).Y);

            cell = cell.WalkTo(Direction.SW);
            BuiltUnitsLocations.Add(MapRef.MapCellAt(cell).CenterPosition);
            cell = cell.WalkTo(Direction.NW);
            BuiltUnitsLocations.Add(MapRef.MapCellAt(cell).CenterPosition);
            cell = cell.WalkTo(Direction.NW);
            BuiltUnitsLocations.Add(MapRef.MapCellAt(cell).CenterPosition);

            #endregion

            // making smoke on the roof
            #region smoke
            _smoke = new SpriteAnimation(GameGraphics.GetTexture("smoke").SourceTexture);
            _smoke.AddAnimation("normal", 0, 0, 30, 64, 16, 0.1f);
            _smoke.Position = Camera.WorldToScreen(new Vector2( this.BuildingOrigin.X+85, this.BuildingOrigin.Y-60));
            _smoke.CurrentAnimation = "normal";
            _smoke.DrawDepth = BuildingInfo.SmokeDrawDepth;
            _smoke.IsAnimating = true;
            #endregion

            selectionGroup = GroupMapper.CampGroup;

            SelectionLineTexture = GameGraphics.GetTexture("camp_selection_line");

            #region Setting Entity Properties
            MaxHealth = 800;
            MaxDefense = 300;
            MaxAttack = 0;

            Health = MaxHealth;
            Defense = MaxDefense;
            Attack = MaxAttack;
            #endregion
        }