Ignore:
Timestamp:
2013-07-24 23:56:47 (6 years ago)
Author:
dezhidki
Message:

Muokattu sotilaita viimeiseen muotoon.

File:
1 edited

Legend:

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

    r4635 r4646  
    88using IsometricEngineTest.Ai.Orders; 
    99using System.Diagnostics; 
     10using CastleMaster.Ai.Orders; 
    1011 
    1112namespace CastleMaster.Units.Mobs 
     
    1314    public class MobWarrior : Mob 
    1415    { 
    15         private enum OrderType { ATTACK, WALK, NONE } 
     16        private enum OrderType { ATTACK, WALK, AVOID, NONE } 
    1617 
    17         private float ATTACK_RANGE_OFFSET = 20.0F; 
     18        private float ATTACK_RANGE_OFFSET = 25.0F; 
    1819        private float attackRange, attackRangeSqr; 
    1920 
     
    2526        private int spriteX; 
    2627        private float pushPower = 5.0F; 
     28        private int lastSameOrderAmount = 0; 
     29        private bool engageAttack = false; 
    2730 
    2831        public MobWarrior(Level level, Player owner) 
     
    6669            target = null; 
    6770            currentOrderType = OrderType.NONE; 
     71            StopCurrentOrder(); 
    6872        } 
    6973 
     
    7579        } 
    7680 
    77         private void CreateAttackOrder(Unit u, bool wasCalledBefore) 
     81        private void CreateAttackOrder(Unit u, int orderAmount, bool wasCalledBefore) 
    7882        { 
    7983            currentOrderType = OrderType.ATTACK; 
    8084            attackRange = u.Width / 2 + ATTACK_RANGE_OFFSET; 
    8185            attackRangeSqr = attackRange * attackRange; 
    82             SetOrder(new OrderMove(u.X, u.Z, attackRange, true, !wasCalledBefore)); 
     86            SetOrder(new OrderMove(u.X, u.Z, attackRange, orderAmount * 2.0F, true, !wasCalledBefore)); 
    8387            target = u; 
    8488        } 
     
    8892            base.Damage(attacker, damage, dir, pushPower); 
    8993            if (!isAttacking && currentOrderType == OrderType.NONE) 
    90                 CreateAttackOrder(attacker, false); 
     94                CreateAttackOrder(attacker, 1, false); 
    9195        } 
    9296 
     
    98102            else if (currentOrderType == OrderType.WALK) 
    99103                currentOrderType = OrderType.NONE; 
     104            else if (currentOrderType == OrderType.AVOID) 
     105            { 
     106                currentOrderType = OrderType.ATTACK; 
     107                engageAttack = true; 
     108            } 
    100109        } 
    101110 
    102         public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 
     111        public override Order GetNextOrder() 
     112        { 
     113            if (engageAttack) 
     114            { 
     115                engageAttack = false; 
     116                return new OrderMove(target.X, target.Z, attackRange, excludeEndSolidness: true); 
     117            } 
     118            return base.GetNextOrder(); 
     119        } 
     120 
     121        public override void OnFunctionClick(float x, float z, int sameOrders, bool wasCalledBefore) 
    103122        { 
    104123            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 
    105124            if (u != null) 
    106                 CreateAttackOrder(u, wasCalledBefore); 
     125                CreateAttackOrder(u, sameOrders, wasCalledBefore); 
    107126            else 
    108127            { 
    109128                if (target != null) StopAttack(); 
    110129                currentOrderType = OrderType.WALK; 
    111                 SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 
     130                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore, stopOnMoveFail: true)); 
    112131            } 
     132            lastSameOrderAmount = sameOrders; 
    113133        } 
    114134 
     
    122142                { 
    123143                    isAttacking = false; 
    124                     CreateAttackOrder(target, false); 
     144                    CreateAttackOrder(target, 1, false); 
    125145                } 
    126146                else 
     
    136156            else if (!isAttacking && currentOrderType == OrderType.NONE) 
    137157            { 
    138                 List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 2); 
     158                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 3); 
    139159                if (units.Count > 0) 
    140                     CreateAttackOrder(units[0], false); 
     160                    CreateAttackOrder(units[0], 1, false); 
     161            } 
     162            else if (!isAttacking && currentOrderType == OrderType.ATTACK) 
     163            { 
     164                float dist = lastSameOrderAmount * 12.0F; 
     165                if (currentOrder != null && currentOrder is OrderMove && ((OrderMove)currentOrder).FailingToMove && DistanceToSqr(target.X, target.Z) < attackRangeSqr + dist * dist) 
     166                { 
     167                    int tp = level.GetClosestDiagonalOpenPos(this); 
     168                    if (tp > 0) 
     169                    { 
     170                        currentOrderType = OrderType.AVOID; 
     171                        SetOrder(new OrderMove(tp % level.Width * Viewport.TILESIZE, tp / level.Width * Viewport.TILESIZE, stopOnMoveFail: true)); 
     172                    } 
     173                } 
     174                if (target == null || target.Removed) 
     175                    StopAttack(); 
    141176            } 
    142177 
Note: See TracChangeset for help on using the changeset viewer.