- Timestamp:
- 2013-07-24 15:02:03 (8 years ago)
- 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 11 11 using CastleMaster.Graphics; 12 12 using CastleMaster.Entities; 13 using System.Collections; 13 14 14 15 namespace CastleMaster.Units.Mobs 15 16 { 16 public class Mob : Unit17 public abstract class Mob : Unit 17 18 { 18 pr ivateOrder currentOrder;19 protected Order currentOrder; 19 20 private float dir = 0.0F; 20 pr ivateAStar pathFinder;21 protected AStar pathFinder; 21 22 protected int dirID; 22 23 protected AnimationHelper walkingAnimation; … … 36 37 pushResistance = 0.0F; 37 38 } 39 40 public Level Level { get { return level; } } 38 41 39 42 protected float Direction { get { return dir; } } … … 65 68 MoveTo(dir, pushPower); 66 69 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; 67 90 } 68 91 } … … 156 179 return (int)(Math.Floor(dir * 8 / MathHelper.TwoPi + 0.5F)) & 7; 157 180 } 181 182 public abstract int TypeID { get; } 158 183 } 159 184 } -
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobRanger.cs
r4616 r4635 15 15 private enum OrderType { ATTACK, WALK, NONE } 16 16 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; 19 19 20 20 private Unit target; 21 21 private OrderType currentOrderType = OrderType.NONE; 22 22 private bool isAttacking = false; 23 private int maxDamage = 5;23 private int maxDamage = 4; 24 24 private AnimationHelper hitAnimation; 25 25 private int spriteX; 26 private float pushPower = 5.0F;26 private float pushPower = 2.0F; 27 27 28 28 public MobRanger(Level level, Player owner) … … 30 30 { 31 31 HasHealth = true; 32 maxHealth = 50;32 maxHealth = 30; 33 33 34 34 spriteSize.X = 17; … … 41 41 rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F); 42 42 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); 45 45 hitAnimation.RoundEnded += delegate() 46 46 { 47 47 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); 49 49 }; 50 } 51 52 public override int TypeID 53 { 54 get { return 1; } 50 55 } 51 56 … … 70 75 } 71 76 72 private void CreateAttackOrder(Unit u )77 private void CreateAttackOrder(Unit u, bool wasCalledBefore) 73 78 { 74 79 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)); 76 83 target = u; 77 84 } … … 81 88 base.Damage(attacker, damage, dir, pushPower); 82 89 if (!isAttacking && currentOrderType == OrderType.NONE) 83 CreateAttackOrder(attacker );90 CreateAttackOrder(attacker, false); 84 91 } 85 92 … … 93 100 } 94 101 95 public override void OnFunctionClick(float x, float z )102 public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 96 103 { 97 104 Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 98 105 if (u != null) 99 CreateAttackOrder(u );106 CreateAttackOrder(u, wasCalledBefore); 100 107 else 101 108 { 102 109 if (target != null) StopAttack(); 103 110 currentOrderType = OrderType.WALK; 104 SetOrder(new OrderMove(x, z ));111 SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 105 112 } 106 113 } … … 112 119 if (isAttacking) 113 120 { 114 if (DistanceToSqr(target.X, target.Z) > ATTACK_RANGE_SQR)121 if (DistanceToSqr(target.X, target.Z) > attackRangeSqr) 115 122 { 116 123 isAttacking = false; 117 CreateAttackOrder(target );124 CreateAttackOrder(target, false); 118 125 } 119 126 else … … 129 136 List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 4); 130 137 if (units.Count > 0) 131 CreateAttackOrder(units[0] );138 CreateAttackOrder(units[0], false); 132 139 } 133 140 -
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWarrior.cs
r4616 r4635 15 15 private enum OrderType { ATTACK, WALK, NONE } 16 16 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; 19 19 20 20 private Unit target; 21 21 private OrderType currentOrderType = OrderType.NONE; 22 22 private bool isAttacking = false; 23 private int maxDamage = 5;23 private int maxDamage = 7; 24 24 private AnimationHelper hitAnimation; 25 25 private int spriteX; … … 41 41 rectOffset.Update(-4.0F, -4.0F, 5.0F, 5.0F); 42 42 isSolid = true; 43 moveSpeed = 1. 0F;43 moveSpeed = 1.25F; 44 44 hitAnimation = new AnimationHelper(8, 5, false, 3); 45 45 hitAnimation.RoundEnded += delegate … … 48 48 Hit(target, Game.Random.Next(1, maxDamage + 1), Direction, pushPower); 49 49 }; 50 } 51 52 public override int TypeID 53 { 54 get { return 2; } 50 55 } 51 56 … … 70 75 } 71 76 72 private void CreateAttackOrder(Unit u )77 private void CreateAttackOrder(Unit u, bool wasCalledBefore) 73 78 { 74 79 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)); 76 83 target = u; 77 84 } … … 81 88 base.Damage(attacker, damage, dir, pushPower); 82 89 if (!isAttacking && currentOrderType == OrderType.NONE) 83 CreateAttackOrder(attacker );90 CreateAttackOrder(attacker, false); 84 91 } 85 92 … … 93 100 } 94 101 95 public override void OnFunctionClick(float x, float z )102 public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 96 103 { 97 104 Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 98 105 if (u != null) 99 CreateAttackOrder(u );106 CreateAttackOrder(u, wasCalledBefore); 100 107 else 101 108 { 102 109 if (target != null) StopAttack(); 103 110 currentOrderType = OrderType.WALK; 104 SetOrder(new OrderMove(x, z ));111 SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 105 112 } 106 113 } … … 112 119 if (isAttacking) 113 120 { 114 if (DistanceToSqr(target.X, target.Z) > ATTACK_RANGE_SQR)121 if (DistanceToSqr(target.X, target.Z) > attackRangeSqr) 115 122 { 116 123 isAttacking = false; 117 CreateAttackOrder(target );124 CreateAttackOrder(target, false); 118 125 } 119 126 else … … 124 131 StopAttack(); 125 132 } 133 if (target == null || target.Removed) 134 StopAttack(); 126 135 } 127 136 else if (!isAttacking && currentOrderType == OrderType.NONE) … … 129 138 List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 2); 130 139 if (units.Count > 0) 131 CreateAttackOrder(units[0] );140 CreateAttackOrder(units[0], false); 132 141 } 133 142 -
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Mobs/MobWoodcutter.cs
r4616 r4635 23 23 { 24 24 HasHealth = true; 25 maxHealth = 15;25 maxHealth = 20; 26 26 27 27 spriteSize.X = 17; … … 35 35 isSolid = true; 36 36 37 moveSpeed = 1.0F;37 moveSpeed = 2.0F; 38 38 choppingAnimation = new AnimationHelper(10, 5, false, 3); 39 39 choppingAnimation.RoundEnded += delegate() … … 47 47 } 48 48 }; 49 } 50 51 public override int TypeID 52 { 53 get { return 0; } 49 54 } 50 55 … … 63 68 } 64 69 65 public override void OnFunctionClick(float x, float z )70 public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 66 71 { 67 72 TileEntity te = level.GetTileEntity((int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE)); … … 71 76 isOrderedToChop = true; 72 77 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)); 74 79 } 75 80 else … … 80 85 currentTarget = null; 81 86 } 82 SetOrder(new OrderMove(x, z ));87 SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 83 88 } 84 89 } -
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/Unit.cs
r4616 r4635 83 83 } 84 84 85 public virtual void OnFunctionClick(float x, float z ) { }85 public virtual void OnFunctionClick(float x, float z, bool wasCalledBefore) { } 86 86 87 87 public override void Update() 88 88 { 89 base.Update(); 90 89 91 if (IsSelected) 90 92 { … … 105 107 } 106 108 } 109 } 110 111 public override void OnRemoved() 112 { 113 level.RemoveUnit(this); 107 114 } 108 115 -
2013/30/DenisZ/CastleMaster/CastleMaster/CastleMaster/Units/UnitKing.cs
r4616 r4635 14 14 : base(level, owner) 15 15 { 16 width = 5 * Viewport.TILESIZE; 17 depth = 5 * Viewport.TILESIZE; 16 18 HasHealth = true; 17 19 maxHealth = 150; … … 29 31 30 32 rectOffset.Update(-2 * Viewport.TILESIZE, -2 * Viewport.TILESIZE, 2 * Viewport.TILESIZE, 2 * Viewport.TILESIZE); 33 immunityTime = 20; 31 34 } 32 35 33 36 public override void Render(RenderHelper renderer) 34 37 { 35 renderer.Render(ScreenPos, 0, 0, Resources.SPRITE_KING, Viewport.ZOOM);38 renderer.Render(ScreenPos, 0, 0, Resources.SPRITE_KING, colorizer, Viewport.ZOOM); 36 39 base.Render(renderer); 37 40 }
Note: See TracChangeset
for help on using the changeset viewer.