Ignore:
Timestamp:
2013-07-24 15:02:03 (8 years ago)
Author:
dezhidki
Message:

Talletus.

Location:
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/Mob.cs

    r4616 r4635  
    1111using CastleMaster.Graphics; 
    1212using CastleMaster.Entities; 
     13using System.Collections; 
    1314 
    1415namespace CastleMaster.Units.Mobs 
    1516{ 
    16     public class Mob : Unit 
     17    public abstract class Mob : Unit 
    1718    { 
    18         private Order currentOrder; 
     19        protected Order currentOrder; 
    1920        private float dir = 0.0F; 
    20         private AStar pathFinder; 
     21        protected AStar pathFinder; 
    2122        protected int dirID; 
    2223        protected AnimationHelper walkingAnimation; 
     
    3637            pushResistance = 0.0F; 
    3738        } 
     39 
     40        public Level Level { get { return level; } } 
    3841 
    3942        protected float Direction { get { return dir; } } 
     
    6568                MoveTo(dir, pushPower); 
    6669                isPushed = false; 
     70            } 
     71        } 
     72 
     73        public void OnGroupOrder(List<Mob> mobs, float x, float z) 
     74        { 
     75            foreach (var mobGroup in mobs.GroupBy(m => m.TypeID)) 
     76            { 
     77                List<Mob> ms = mobGroup.ToList(); 
     78                ms[0].OnSameTypeGroupOrder(ms, x, z); 
     79            } 
     80        } 
     81 
     82        protected virtual void OnSameTypeGroupOrder(List<Mob> mobs, float x, float z) 
     83        { 
     84            OnFunctionClick(x, z, false); 
     85            foreach (Mob m in mobs) 
     86            { 
     87                if (m == this) continue; 
     88                m.OnFunctionClick(x, z, true); 
     89                m.pathFinder = pathFinder; 
    6790            } 
    6891        } 
     
    156179            return (int)(Math.Floor(dir * 8 / MathHelper.TwoPi + 0.5F)) & 7; 
    157180        } 
     181 
     182        public abstract int TypeID { get; } 
    158183    } 
    159184} 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobRanger.cs

    r4616 r4635  
    1515        private enum OrderType { ATTACK, WALK, NONE } 
    1616 
    17         private const float ATTACK_RANGE = 60.0F; 
    18         private const float ATTACK_RANGE_SQR = ATTACK_RANGE * ATTACK_RANGE; 
     17        private float ATTACK_RANGE_OFFSET = 20.0F; 
     18        private float attackRange, attackRangeSqr; 
    1919 
    2020        private Unit target; 
    2121        private OrderType currentOrderType = OrderType.NONE; 
    2222        private bool isAttacking = false; 
    23         private int maxDamage = 5; 
     23        private int maxDamage = 4; 
    2424        private AnimationHelper hitAnimation; 
    2525        private int spriteX; 
    26         private float pushPower = 5.0F; 
     26        private float pushPower = 2.0F; 
    2727 
    2828        public MobRanger(Level level, Player owner) 
     
    3030        { 
    3131            HasHealth = true; 
    32             maxHealth = 50; 
     32            maxHealth = 30; 
    3333 
    3434            spriteSize.X = 17; 
     
    4141            rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F); 
    4242            isSolid = true; 
    43             moveSpeed = 1.0F; 
    44             hitAnimation = new AnimationHelper(10, 5, false, 3); 
     43            moveSpeed = 1.6F; 
     44            hitAnimation = new AnimationHelper(5, 5, false, 3); 
    4545            hitAnimation.RoundEnded += delegate() 
    4646            { 
    4747                if (target != null) 
    48                     level.AddEntity(new EntityArrow(level, 5, 2.0F, target, this, Owner.Team), X + (float)Math.Cos(Direction) * 2.0F, Z + (float)Math.Sin(Direction) * 2.0F); 
     48                    level.AddEntity(new EntityArrow(level, Game.Random.Next(0, maxDamage + 1), pushPower, target, this, Owner.Team), X + (float)Math.Cos(Direction) * 2.0F, Z + (float)Math.Sin(Direction) * 2.0F); 
    4949            }; 
     50        } 
     51 
     52        public override int TypeID 
     53        { 
     54            get { return 1; } 
    5055        } 
    5156 
     
    7075        } 
    7176 
    72         private void CreateAttackOrder(Unit u) 
     77        private void CreateAttackOrder(Unit u, bool wasCalledBefore) 
    7378        { 
    7479            currentOrderType = OrderType.ATTACK; 
    75             SetOrder(new OrderMove(u.X, u.Z, ATTACK_RANGE, true)); 
     80            attackRange = u.Width + ATTACK_RANGE_OFFSET; 
     81            attackRangeSqr = attackRange * attackRange; 
     82            SetOrder(new OrderMove(u.X, u.Z, attackRange, true, !wasCalledBefore)); 
    7683            target = u; 
    7784        } 
     
    8188            base.Damage(attacker, damage, dir, pushPower); 
    8289            if (!isAttacking && currentOrderType == OrderType.NONE) 
    83                 CreateAttackOrder(attacker); 
     90                CreateAttackOrder(attacker, false); 
    8491        } 
    8592 
     
    93100        } 
    94101 
    95         public override void OnFunctionClick(float x, float z) 
     102        public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 
    96103        { 
    97104            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 
    98105            if (u != null) 
    99                 CreateAttackOrder(u); 
     106                CreateAttackOrder(u, wasCalledBefore); 
    100107            else 
    101108            { 
    102109                if (target != null) StopAttack(); 
    103110                currentOrderType = OrderType.WALK; 
    104                 SetOrder(new OrderMove(x, z)); 
     111                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 
    105112            } 
    106113        } 
     
    112119            if (isAttacking) 
    113120            { 
    114                 if (DistanceToSqr(target.X, target.Z) > ATTACK_RANGE_SQR) 
     121                if (DistanceToSqr(target.X, target.Z) > attackRangeSqr) 
    115122                { 
    116123                    isAttacking = false; 
    117                     CreateAttackOrder(target); 
     124                    CreateAttackOrder(target, false); 
    118125                } 
    119126                else 
     
    129136                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 4); 
    130137                if (units.Count > 0) 
    131                     CreateAttackOrder(units[0]); 
     138                    CreateAttackOrder(units[0], false); 
    132139            } 
    133140 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWarrior.cs

    r4616 r4635  
    1515        private enum OrderType { ATTACK, WALK, NONE } 
    1616 
    17         private const float ATTACK_RANGE = 20.0F; 
    18         private const float ATTACK_RANGE_SQR = ATTACK_RANGE * ATTACK_RANGE; 
     17        private float ATTACK_RANGE_OFFSET = 20.0F; 
     18        private float attackRange, attackRangeSqr; 
    1919 
    2020        private Unit target; 
    2121        private OrderType currentOrderType = OrderType.NONE; 
    2222        private bool isAttacking = false; 
    23         private int maxDamage = 5; 
     23        private int maxDamage = 7; 
    2424        private AnimationHelper hitAnimation; 
    2525        private int spriteX; 
     
    4141            rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F); 
    4242            isSolid = true; 
    43             moveSpeed = 1.0F; 
     43            moveSpeed = 1.25F; 
    4444            hitAnimation = new AnimationHelper(8, 5, false, 3); 
    4545            hitAnimation.RoundEnded += delegate 
     
    4848                    Hit(target, Game.Random.Next(1, maxDamage + 1), Direction, pushPower); 
    4949            }; 
     50        } 
     51 
     52        public override int TypeID 
     53        { 
     54            get { return 2; } 
    5055        } 
    5156 
     
    7075        } 
    7176 
    72         private void CreateAttackOrder(Unit u) 
     77        private void CreateAttackOrder(Unit u, bool wasCalledBefore) 
    7378        { 
    7479            currentOrderType = OrderType.ATTACK; 
    75             SetOrder(new OrderMove(u.X, u.Z, ATTACK_RANGE, true)); 
     80            attackRange = u.Width / 2 + ATTACK_RANGE_OFFSET; 
     81            attackRangeSqr = attackRange * attackRange; 
     82            SetOrder(new OrderMove(u.X, u.Z, attackRange, true, !wasCalledBefore)); 
    7683            target = u; 
    7784        } 
     
    8188            base.Damage(attacker, damage, dir, pushPower); 
    8289            if (!isAttacking && currentOrderType == OrderType.NONE) 
    83                 CreateAttackOrder(attacker); 
     90                CreateAttackOrder(attacker, false); 
    8491        } 
    8592 
     
    93100        } 
    94101 
    95         public override void OnFunctionClick(float x, float z) 
     102        public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 
    96103        { 
    97104            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 
    98105            if (u != null) 
    99                 CreateAttackOrder(u); 
     106                CreateAttackOrder(u, wasCalledBefore); 
    100107            else 
    101108            { 
    102109                if (target != null) StopAttack(); 
    103110                currentOrderType = OrderType.WALK; 
    104                 SetOrder(new OrderMove(x, z)); 
     111                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 
    105112            } 
    106113        } 
     
    112119            if (isAttacking) 
    113120            { 
    114                 if (DistanceToSqr(target.X, target.Z) > ATTACK_RANGE_SQR) 
     121                if (DistanceToSqr(target.X, target.Z) > attackRangeSqr) 
    115122                { 
    116123                    isAttacking = false; 
    117                     CreateAttackOrder(target); 
     124                    CreateAttackOrder(target, false); 
    118125                } 
    119126                else 
     
    124131                        StopAttack(); 
    125132                } 
     133                if (target == null || target.Removed) 
     134                    StopAttack(); 
    126135            } 
    127136            else if (!isAttacking && currentOrderType == OrderType.NONE) 
     
    129138                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 2); 
    130139                if (units.Count > 0) 
    131                     CreateAttackOrder(units[0]); 
     140                    CreateAttackOrder(units[0], false); 
    132141            } 
    133142 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWoodcutter.cs

    r4616 r4635  
    2323        { 
    2424            HasHealth = true; 
    25             maxHealth = 15; 
     25            maxHealth = 20; 
    2626 
    2727            spriteSize.X = 17; 
     
    3535            isSolid = true; 
    3636 
    37             moveSpeed = 1.0F; 
     37            moveSpeed = 2.0F; 
    3838            choppingAnimation = new AnimationHelper(10, 5, false, 3); 
    3939            choppingAnimation.RoundEnded += delegate() 
     
    4747                } 
    4848            }; 
     49        } 
     50 
     51        public override int TypeID 
     52        { 
     53            get { return 0; } 
    4954        } 
    5055 
     
    6368        } 
    6469 
    65         public override void OnFunctionClick(float x, float z) 
     70        public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 
    6671        { 
    6772            TileEntity te = level.GetTileEntity((int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE)); 
     
    7176                isOrderedToChop = true; 
    7277                currentTarget = (TileEntityTree)te; 
    73                 SetOrder(new OrderMove(te.X, te.Z, 20.0F, true)); 
     78                SetOrder(new OrderMove(currentTarget.X, currentTarget.Z, 20.0F, true, !wasCalledBefore)); 
    7479            } 
    7580            else 
     
    8085                    currentTarget = null; 
    8186                } 
    82                 SetOrder(new OrderMove(x, z)); 
     87                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 
    8388            } 
    8489        } 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Unit.cs

    r4616 r4635  
    8383        } 
    8484 
    85         public virtual void OnFunctionClick(float x, float z) { } 
     85        public virtual void OnFunctionClick(float x, float z, bool wasCalledBefore) { } 
    8686 
    8787        public override void Update() 
    8888        { 
     89            base.Update(); 
     90 
    8991            if (IsSelected) 
    9092            { 
     
    105107                } 
    106108            } 
     109        } 
     110 
     111        public override void OnRemoved() 
     112        { 
     113            level.RemoveUnit(this); 
    107114        } 
    108115 
  • 2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/UnitKing.cs

    r4616 r4635  
    1414            : base(level, owner) 
    1515        { 
     16            width = 5 * Viewport.TILESIZE; 
     17            depth = 5 * Viewport.TILESIZE; 
    1618            HasHealth = true; 
    1719            maxHealth = 150; 
     
    2931 
    3032            rectOffset.Update(-2 * Viewport.TILESIZE, -2 * Viewport.TILESIZE, 2 * Viewport.TILESIZE, 2 * Viewport.TILESIZE); 
     33            immunityTime = 20; 
    3134        } 
    3235 
    3336        public override void Render(RenderHelper renderer) 
    3437        { 
    35             renderer.Render(ScreenPos, 0, 0, Resources.SPRITE_KING, Viewport.ZOOM); 
     38            renderer.Render(ScreenPos, 0, 0, Resources.SPRITE_KING, colorizer, Viewport.ZOOM); 
    3639            base.Render(renderer); 
    3740        } 
Note: See TracChangeset for help on using the changeset viewer.