Changeset 4592 for 2013/30


Ignore:
Timestamp:
2013-07-23 22:36:26 (6 years ago)
Author:
dezhidki
Message:

Lisätty toimiva sotilas. Korjattu OrderMove:n epätarkkuuksia. Lisätty AStariin muuttuja, jolla voi jättää loppupisteen läpipääsemättömyyden huomioimatta.

Location:
2013/30/DenisZ/CastleMaster/CastleMaster
Files:
2 added
14 edited

Legend:

Unmodified
Added
Removed
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Ai/Orders/OrderMove.cs

    r4590 r4592  
    1515        private bool excludeEndSolidness; 
    1616        private float stopDistance; 
     17        private int moveFails = 0; 
     18        private float lastDist = 0.0F; 
    1719 
    1820        public OrderMove(float x, float z, float stopDistance = 2.0F, bool excludeEndSolidness = false) 
     
    4446                float ztPoint = currentTarget.Z * Viewport.TILESIZE + 8.0F; 
    4547 
    46                 if (mob.DistanceTo(xtPoint, ztPoint) > 8.0F) 
     48                float dist = mob.DistanceTo(xtPoint, ztPoint); 
     49                if (dist > 8.0F) 
    4750                { 
    4851                    if (mob.TurnTowards(xtPoint, ztPoint)) 
     52                    { 
    4953                        mob.MoveForward(); 
     54 
     55                        if (dist == lastDist) 
     56                            moveFails++; 
     57                        else 
     58                            moveFails = 0; 
     59                        lastDist = dist; 
     60                    } 
    5061                } 
    5162                else 
     
    5465            else 
    5566            { 
    56                 if (mob.DistanceTo(x, z) > 1.0F) 
     67                float dist = mob.DistanceTo(x, z); 
     68                if (dist > 1.0F) 
    5769                { 
    5870                    if (mob.TurnTowards(x, z)) 
     71                    { 
    5972                        mob.MoveForward(); 
     73 
     74                        if (dist == lastDist) 
     75                            moveFails++; 
     76                        else 
     77                            moveFails = 0; 
     78                        lastDist = dist; 
     79                    } 
    6080                } 
    6181            } 
     
    6686            get 
    6787            { 
    68                 return (mob.DistanceTo(x, z) < stopDistance) || !mob.PathFinder.CanFindPath; 
     88                return (mob.DistanceTo(x, z) < stopDistance) || moveFails > 10 || !mob.PathFinder.CanFindPath; 
    6989            } 
    7090        } 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/CastleMaster.csproj

    r4590 r4592  
    9494    <Compile Include="Physics\BoundingRectangleOwner.cs" /> 
    9595    <Compile Include="Players\Player.cs" /> 
     96    <Compile Include="Players\PlayerAI.cs" /> 
    9697    <Compile Include="Players\PlayerReal.cs" /> 
    9798    <Compile Include="Players\Team.cs" /> 
     
    100101    <Compile Include="Game.cs" /> 
    101102    <Compile Include="Units\Mobs\Mob.cs" /> 
     103    <Compile Include="Units\Mobs\MobWarrior.cs" /> 
    102104    <Compile Include="Units\Mobs\MobWoodcutter.cs" /> 
    103105    <Compile Include="Units\Unit.cs" /> 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Entities/Entity.cs

    r4590 r4592  
    8383        public bool Move(float xd, float zd) 
    8484        { 
     85            if(xd == 0.0F && zd == 0.0F) return false; 
     86 
    8587            if (BoundingRectangle.XRight + xd > level.Width * Viewport.TILESIZE) return false; 
    8688            if (BoundingRectangle.XLeft + xd < 0.0F) return false; 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Entities/TileEntities/TileEntityTree.cs

    r4590 r4592  
    1212        private int spriteID; 
    1313 
    14         public TileEntityTree(Level level, int spriteID) 
     14        public TileEntityTree(Level level, int spriteID, int logAmount) 
    1515            : base(level) 
    1616        { 
     
    2020            renderOffset.Y = 18; 
    2121 
    22             AvaliableLogs = 8; 
     22            AvaliableLogs = logAmount; 
    2323        } 
    2424 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Game.cs

    r4590 r4592  
    4141 
    4242        public static FastRandom Random { get; private set; } 
     43 
     44        public static readonly Team TEAM1 = new Team("Team1", 0); 
     45        public static readonly Team TEAM2 = new Team("Team2", 1); 
    4346 
    4447        public Game() 
     
    9295        } 
    9396 
     97        public static Team GetEnemyTeam(Team team) 
     98        { 
     99            return team == TEAM1 ? TEAM2 : TEAM1; 
     100        } 
     101 
    94102        /// <summary> 
    95103        /// LoadContent will be called once per game and is the place to load 
     
    119127            level = new LevelTest(Resources.LEVEL_TEST); 
    120128            camera = new Camera(level); 
    121             AddPlayer(new PlayerReal(new Team("The men", 0), level, camera)); 
     129            AddPlayer(new PlayerReal(TEAM1, level, camera)); 
     130            AddPlayer(new PlayerAI(TEAM2, level, camera)); 
    122131            level.InitLevel(); 
    123132            camera.CenterOn(level.Width / 2 * Viewport.TILESIZE, level.Height / 2 * Viewport.TILESIZE); 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Graphics/Resources.cs

    r4550 r4592  
    1010        public static Texture2D LEVEL_TEST { get; private set; } 
    1111        public static int SPRITESHEET_WOODCUTTER { get; private set; } 
     12        public static int SPRITESHEET_WARRIOR { get; private set; } 
    1213 
    1314        public static void LoadResources(ContentManager cm, RenderHelper renderer) 
     
    1617            SPRITESHEET_ICONS = renderer.RegisterSpriteSheet(new SpriteSheet(cm.Load<Texture2D>("misc/icons"), 16, 16)); 
    1718            SPRITESHEET_WOODCUTTER = renderer.RegisterSpriteSheet(new SpriteSheet(cm.Load<Texture2D>("mobs/woodcutter"), 32, 32)); 
     19            SPRITESHEET_WARRIOR = renderer.RegisterSpriteSheet(new SpriteSheet(cm.Load<Texture2D>("mobs/warrior"), 32, 32)); 
    1820            LEVEL_TEST = cm.Load<Texture2D>("levels/levelTest"); 
    1921        } 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Players/Player.cs

    r4581 r4592  
    55using CastleMaster.World; 
    66using CastleMaster.Graphics; 
     7using CastleMaster.Units; 
    78 
    89namespace CastleMaster.Players 
    910{ 
    10     public class Player 
     11    public abstract class Player 
    1112    { 
    1213        protected Team team; 
     
    3031        { 
    3132        } 
     33 
     34        public abstract Unit SelectUnit(Team team); 
    3235    } 
    3336} 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Players/PlayerReal.cs

    r4581 r4592  
    4646            if (InputHandler.HasMouseButtonBeenPressed(MouseButtons.Right)) 
    4747            { 
    48                 Unit u = SelectUnit(); 
     48                Unit u = SelectUnit(Team); 
    4949                if (selectedUnit != null) 
    50                     selectedUnit.OnSelectLost(); 
     50                    selectedUnit.IsSelected = false; 
    5151                selectedUnit = u; 
    5252                if (selectedUnit != null) 
    53                     selectedUnit.OnSelectGain(); 
     53                    selectedUnit.IsSelected = true; 
    5454            } 
    5555 
     
    5757            { 
    5858                if (selectedUnit != null) 
    59                     selectedUnit.OnFunctionClick(); 
     59                    selectedUnit.OnFunctionClick(camera.MouseWorldPos.X, camera.MouseWorldPos.Y); 
    6060            } 
    6161        } 
    6262 
    63         public Unit SelectUnit() 
     63        public override Unit SelectUnit(Team team) 
    6464        { 
    6565            float mouseX = InputHandler.MouseX + camera.XLeft; 
     
    6767 
    6868            float r = 1.0F; 
    69             List<Unit> units = level.GetUnitsWithinScreenSpace(mouseX - r, mouseY - r, mouseX + r, mouseY + r, this); 
     69            List<Unit> units = level.GetUnitsWithinScreenSpace(mouseX - r, mouseY - r, mouseX + r, mouseY + r, team); 
    7070 
    7171            Unit current = null; 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/Mob.cs

    r4590 r4592  
    1010using IsometricEngineTest.Ai.Orders; 
    1111using CastleMaster.Graphics; 
     12using CastleMaster.Entities; 
    1213 
    1314namespace CastleMaster.Units.Mobs 
     
    2021        protected int dirID; 
    2122        protected AnimationHelper walkingAnimation; 
     23        protected float pushResistance; 
     24        protected bool canBePushed; 
     25        private bool isPushed; 
     26        private float pushDir, pushPower; 
    2227 
    2328        public Mob(Level level, Player owner) 
     
    2732            pathFinder = new AStar(level, this); 
    2833            walkingAnimation = new AnimationHelper(10, 2).Start(); 
     34            immunityTime = 20; 
     35            canBePushed = true; 
     36            pushResistance = 0.0F; 
    2937        } 
    3038 
     39        protected float Direction { get { return dir; } } 
     40 
    3141        public AStar PathFinder { get { return pathFinder; } } 
     42 
     43        //public override bool IsSolidTo(Entity ent) 
     44        //{ 
     45        //    Mob mob = ent as Mob; 
     46        //    if (mob != null) 
     47        //        return mob.Owner != Owner; 
     48        //    return base.IsSolidTo(ent); 
     49        //} 
    3250 
    3351        public override void Update() 
     
    4159                    StopCurrentOrder(); 
    4260                } 
     61            } 
     62 
     63            if (isPushed) 
     64            { 
     65                MoveTo(dir, pushPower); 
     66                isPushed = false; 
    4367            } 
    4468        } 
     
    6185        } 
    6286 
    63         public override void OnFunctionClick() 
     87        public override void OnDamage(Unit attacker, int damage, float dir, float pushPower) 
    6488        { 
     89            base.OnDamage(attacker, damage, dir, pushPower); 
     90            if (canBePushed) 
     91                Push(dir, pushPower); 
     92        } 
     93 
     94        private void Push(float dir, float pushPower) 
     95        { 
     96            isPushed = true; 
     97            pushDir = dir; 
     98            this.pushPower = pushPower - pushResistance; 
     99        } 
     100 
     101        private void MoveTo(float dir, float amount) 
     102        { 
     103            float moveX = (float)Math.Cos(dir) * amount; 
     104            float moveZ = (float)Math.Sin(dir) * amount; 
     105 
     106            Move(moveX, moveZ); 
    65107        } 
    66108 
     
    104146        } 
    105147 
     148        protected void UpdateDir(float x, float z) 
     149        { 
     150            dir = (float)Math.Atan2(z - Z, x - X); 
     151            dirID = GetDirectionID(); 
     152        } 
     153 
    106154        public int GetDirectionID() 
    107155        { 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWoodcutter.cs

    r4590 r4592  
    2323            : base(level, owner) 
    2424        { 
     25            HasHealth = true; 
     26            maxHealth = 15; 
     27 
    2528            spriteSize.X = 17; 
    2629            spriteSize.Y = 20; 
     
    6568        } 
    6669 
    67         public override void OnFunctionClick() 
     70        public override void OnFunctionClick(float x, float z) 
    6871        { 
    69             TileEntity te = level.GetTileEntity(Owner.Camera.MouseTilePos.X, Owner.Camera.MouseTilePos.Y); 
     72            TileEntity te = level.GetTileEntity((int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE)); 
    7073            if (te != null && typeof(TileEntityTree).IsAssignableFrom(te.GetType())) 
    7174            { 
     
    8285                    currentTarget = null; 
    8386                } 
    84                 SetOrder(new OrderMove(Owner.Camera.MouseWorldPos.X, Owner.Camera.MouseWorldPos.Y)); 
     87                SetOrder(new OrderMove(x, z)); 
    8588            } 
    8689        } 
     
    108111        { 
    109112            base.Render(renderer); 
    110             renderer.Render(ScreenPos, currentSpriteX, dirID, Resources.SPRITESHEET_WOODCUTTER, Viewport.ZOOM); 
     113            renderer.Render(ScreenPos, currentSpriteX, dirID, Resources.SPRITESHEET_WOODCUTTER, colorizer, Viewport.ZOOM); 
    111114        } 
    112115    } 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Unit.cs

    r4581 r4592  
    1414    public class Unit : Entity 
    1515    { 
    16         protected bool isSelectable, isSelected; 
     16        protected bool isSelectable; 
    1717        protected BoundingRectangle screenRect; 
    1818        protected BoundingRectangle screenRectOffset; 
     
    2222        private Vector2 arrowOffs = Vector2.Zero; 
    2323        private Player owner; 
     24        private int immunityTimer = 0; 
     25        protected int maxHealth, immunityTime; 
     26        protected Color colorizer = Color.White; 
     27        protected bool colorizeOnHit, wasHurt = false; 
    2428 
    2529        public Unit(Level level, Player owner) 
     
    3135            screenRectOffset = new BoundingRectangle(0, 0, spriteSize.X, spriteSize.Y, null); 
    3236            isSelectable = true; 
    33             isSelected = false; 
     37            IsSelected = false; 
     38            HasHealth = false; 
     39            maxHealth = 10; 
     40            colorizeOnHit = true; 
     41            immunityTime = 0; 
    3442        } 
     43 
     44        public int Health { get; protected set; } 
     45 
     46        public bool HasHealth { get; protected set; } 
    3547 
    3648        public bool IsSelectable { get { return isSelectable; } } 
     
    3850        public Player Owner { get { return owner; } } 
    3951 
     52        public bool IsSelected { get; set; } 
     53 
    4054        public override void Init() 
    4155        { 
    4256            base.Init(); 
     57            Health = maxHealth; 
    4358        } 
    4459 
    45         public virtual void OnSelectGain() 
     60        public virtual bool CanBeHurtBy(Unit u) 
    4661        { 
    47             isSelected = true; 
     62            return HasHealth && u.Owner != Owner; 
    4863        } 
    4964 
    50         public virtual void OnSelectLost() 
     65        public void Hit(Unit u, int damage, float dir, float pushPower) 
    5166        { 
    52             isSelected = false; 
     67            if (u.CanBeHurtBy(this)) 
     68                u.OnDamage(this, damage, dir, pushPower); 
     69            if (u.Health <= 0) 
     70                u.Remove(); 
    5371        } 
    5472 
    55         public virtual void OnFunctionClick() { } 
     73        public virtual void OnDamage(Unit attacker, int damage, float dir, float pushPower) 
     74        { 
     75            Health -= damage; 
     76            if (colorizeOnHit) 
     77                colorizer = Color.Red; 
     78            if (immunityTime > 0) 
     79            { 
     80                wasHurt = true; 
     81                HasHealth = false; 
     82            } 
     83        } 
     84 
     85        public virtual void OnFunctionClick(float x, float z) { } 
    5686 
    5787        public override void Update() 
    5888        { 
    59             if (isSelected) 
     89            if (IsSelected) 
    6090            { 
    6191                timer += arrowSpeed; 
    6292                if (timer >= MathHelper.TwoPi) timer = -MathHelper.TwoPi; 
    6393                arrowOffs.Y = (float)Math.Sin(timer) * 2.0F; 
     94            } 
     95 
     96            if (wasHurt) 
     97            { 
     98                immunityTimer++; 
     99                if (immunityTimer >= immunityTime) 
     100                { 
     101                    wasHurt = false; 
     102                    immunityTimer = 0; 
     103                    colorizer = Color.White; 
     104                    HasHealth = true; 
     105                } 
    64106            } 
    65107        } 
     
    80122        } 
    81123 
     124        public float DistanceToSqr(float x, float z) 
     125        { 
     126            float xd = X - x; 
     127            float zd = Z - z; 
     128 
     129            return xd * xd + zd * zd; 
     130        } 
     131 
    82132        public float DistanceFromScreenSpaceSqr(float x, float y) 
    83133        { 
     
    95145        public override void Render(RenderHelper renderer) 
    96146        { 
    97             if (isSelected) 
     147            if (IsSelected) 
    98148                RenderHighLight(renderer); 
    99149        } 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/World/Level.cs

    r4590 r4592  
    177177            } 
    178178 
    179             foreach (Entity ent in entities) 
    180             { 
     179            for (int i = 0; i < entities.Count; i++) 
     180            { 
     181                Entity ent = entities[i]; 
     182 
    181183                int xTile_old = (int)(ent.X / Viewport.TILESIZE); 
    182184                int zTile_old = (int)(ent.Z / Viewport.TILESIZE); 
     
    188190                    RemoveEntity(ent); 
    189191                    TakeEntity(ent, xTile_old, zTile_old); 
     192                    i--; 
    190193                    continue; 
    191194                } 
     
    274277        } 
    275278 
    276         //public Vector2 GetNearestEmptyTileWorldPos(int xTile, int zTile, Entity ent) 
    277         //{ 
    278         //    int xt = 0, zt = 0; 
    279         //    for (int z = zTile - 1; z <= zTile + 1; z++) 
    280         //    { 
    281         //        for (int x = xTile - 1; x <= xTile + 1; x++) 
    282         //        { 
    283         //            if (x == xTile && z == zTile) continue; 
    284         //            int tp = xTile + zTile * width; 
    285  
    286         //            if (registeredTiles[tiles[tp]].IsSolid) continue; 
    287  
    288         //            TileEntity te = GetTileEntity(xTile, zTile); 
    289         //            if (te != null && te.IsSolidTo(ent)) continue; 
    290         //            xt = x; 
    291         //            zt = z; 
    292         //        } 
    293         //    } 
    294  
    295         //    if (xt != 0 || zt != 0) 
    296         //        return new Vector2(xt * Viewport.TILESIZE + 8.0F, zt * Viewport.TILESIZE + 8.0F); 
    297  
    298         //    return new Vector2(-1, -1); 
    299         //} 
    300  
    301279        public TileEntity GetTileEntity(int xTile, int zTile) 
    302280        { 
     
    308286        } 
    309287 
    310         public List<Unit> GetUnitsWithinScreenSpace(float x0, float y0, float x1, float y1, Player player) 
     288        public List<Unit> GetUnitsWithinScreenSpace(float x0, float y0, float x1, float y1, Team team) 
    311289        { 
    312290            List<Unit> result = new List<Unit>(); 
    313291 
    314             foreach (Unit u in units[player.Team.ID]) 
     292            foreach (Unit u in units[team.ID]) 
    315293            { 
    316294                if (u.IsSelectable && u.IntersectsWithScreenSpace(x0, y0, x1, y1)) 
     
    356334        } 
    357335 
     336 
     337        public List<Unit> GetNearbyEnemyUnits(Team enemyTeam, int xTile, int zTile, int radius) 
     338        { 
     339            List<Unit> result = new List<Unit>(); 
     340 
     341            for (int z = zTile - radius; z <= zTile + radius; z++) 
     342            { 
     343                if (z < 0 || z >= height) continue; 
     344                for (int x = xTile - radius; x <= xTile + radius; x++) 
     345                { 
     346                    if (x < 0 || x >= width) continue; 
     347 
     348                    List<Entity> ents = entitiesInTiles[x + z * width]; 
     349 
     350                    foreach (Entity ent in ents) 
     351                    { 
     352                        Mob m = ent as Mob; 
     353                        if (m != null && m.Owner.Team.ID == enemyTeam.ID) 
     354                            result.Add(m); 
     355                    } 
     356                } 
     357            } 
     358 
     359            return result; 
     360        } 
     361 
    358362        private bool IsValidPos(int tileX, int tileZ) 
    359363        { 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/World/LevelTest.cs

    r4590 r4592  
    55using CastleMaster.Units; 
    66using CastleMaster.Units.Mobs; 
     7using Viewport = CastleMaster.Graphics.Viewport; 
    78 
    89namespace CastleMaster.World 
     
    2829 
    2930            lb.AddTile(0xFFFF0000, TILE_FLOOR); 
     31            lb.AddTile(0xFF0000FF, TILE_FLOOR); 
     32            lb.AddTile(0xFF21007F, TILE_FLOOR); 
    3033            lb.AddTile(0xFF404040, TILE_FLOOR); 
    3134            lb.AddTile(0xFF0094FF, TILE_WATER); 
     
    4649            lb.AddEntity(0xFF00E500, typeof(TileEntityBlock), 8.0F, 8.0F, this, 0, 2); 
    4750            lb.AddEntity(0xFF00FF00, typeof(TileEntityBlock), 8.0F, 8.0F, this, 6, 0); 
     51            lb.AddEntity(0xFF0000FF, typeof(MobWarrior), 8.0F, 8.0F, this, Players[0]); 
    4852            lb.AddEntity(0xFFFF0000, typeof(MobWoodcutter), 8.0F, 8.0F, this, Players[0]); 
    49             lb.AddEntity(0xFF7F3300, typeof(TileEntityTree), 8.0F, 8.0F, this, 1); 
     53            lb.AddEntity(0xFF21007F, typeof(MobWarrior), 8.0F, 8.0F, this, Players[1]); 
     54 
     55            lb.AddCustom(0xFF7F3300, delegate(Level level, int xTile, int zTile) 
     56            { 
     57                level.AddEntity(new TileEntityTree(level, 1, Game.Random.Next(3, 9)), xTile * Viewport.TILESIZE + 8.0F, zTile * Viewport.TILESIZE + 8.0F); 
     58            }); 
     59 
    5060            lb.AddTile(0xFF7F3300, TILE_FLOOR); 
    5161 
Note: See TracChangeset for help on using the changeset viewer.