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/MobRanger.cs

    r4635 r4646  
    88using IsometricEngineTest.Ai.Orders; 
    99using CastleMaster.Entities; 
     10using CastleMaster.Ai.Orders; 
    1011 
    1112namespace CastleMaster.Units.Mobs 
     
    1314    public class MobRanger : 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 = 30.0F; 
    1819        private float attackRange, attackRangeSqr; 
    1920 
     
    2526        private int spriteX; 
    2627        private float pushPower = 2.0F; 
     28        private int lastSameOrderAmount = 0; 
     29        private bool attack = false; 
    2730 
    2831        public MobRanger(Level level, Player owner) 
     
    7578        } 
    7679 
    77         private void CreateAttackOrder(Unit u, bool wasCalledBefore) 
     80        private void CreateAttackOrder(Unit u, int orderAmount, bool wasCalledBefore) 
    7881        { 
    7982            currentOrderType = OrderType.ATTACK; 
    8083            attackRange = u.Width + ATTACK_RANGE_OFFSET; 
    8184            attackRangeSqr = attackRange * attackRange; 
    82             SetOrder(new OrderMove(u.X, u.Z, attackRange, true, !wasCalledBefore)); 
     85            SetOrder(new OrderMove(u.X, u.Z, attackRange, orderAmount * 2.0F, true, !wasCalledBefore)); 
    8386            target = u; 
    8487        } 
     
    8891            base.Damage(attacker, damage, dir, pushPower); 
    8992            if (!isAttacking && currentOrderType == OrderType.NONE) 
    90                 CreateAttackOrder(attacker, false); 
     93                CreateAttackOrder(attacker, 1, false); 
    9194        } 
    9295 
     
    98101            else if (currentOrderType == OrderType.WALK) 
    99102                currentOrderType = OrderType.NONE; 
     103            else if (currentOrderType == OrderType.AVOID) 
     104            { 
     105                currentOrderType = OrderType.ATTACK; 
     106                attack = true; 
     107            } 
    100108        } 
    101109 
    102         public override void OnFunctionClick(float x, float z, bool wasCalledBefore) 
     110        public override Order GetNextOrder() 
     111        { 
     112            if (attack) 
     113            { 
     114                attack = false; 
     115                return new OrderMove(target.X, target.Z, attackRange, excludeEndSolidness: true); 
     116            } 
     117            return base.GetNextOrder(); 
     118        } 
     119 
     120        public override void OnFunctionClick(float x, float z, int sameOrders, bool wasCalledBefore) 
    103121        { 
    104122            Unit u = Owner.SelectUnit(Game.GetEnemyTeam(Owner.Team)); 
    105123            if (u != null) 
    106                 CreateAttackOrder(u, wasCalledBefore); 
     124                CreateAttackOrder(u, sameOrders, wasCalledBefore); 
    107125            else 
    108126            { 
    109127                if (target != null) StopAttack(); 
    110128                currentOrderType = OrderType.WALK; 
    111                 SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore)); 
     129                SetOrder(new OrderMove(x, z, createNewPathFinder: !wasCalledBefore, stopOnMoveFail: true)); 
    112130            } 
     131            lastSameOrderAmount = sameOrders; 
    113132        } 
    114133 
     
    122141                { 
    123142                    isAttacking = false; 
    124                     CreateAttackOrder(target, false); 
     143                    CreateAttackOrder(target, 1, false); 
    125144                } 
    126145                else 
     
    131150                        StopAttack(); 
    132151                } 
     152                if (target == null || target.Removed) 
     153                    StopAttack(); 
    133154            } 
    134155            else if (!isAttacking && currentOrderType == OrderType.NONE) 
    135156            { 
    136                 List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 4); 
     157                List<Unit> units = level.GetNearbyEnemyUnits(Game.GetEnemyTeam(Owner.Team), (int)(x / Viewport.TILESIZE), (int)(z / Viewport.TILESIZE), 5); 
    137158                if (units.Count > 0) 
    138                     CreateAttackOrder(units[0], false); 
     159                    CreateAttackOrder(units[0], 1, false); 
     160            } 
     161            else if (!isAttacking && currentOrderType == OrderType.ATTACK) 
     162            { 
     163                float dist = lastSameOrderAmount * 20.0F; 
     164                if (currentOrder != null && currentOrder is OrderMove && ((OrderMove)currentOrder).FailingToMove && DistanceToSqr(target.X, target.Z) < attackRangeSqr + dist * dist) 
     165                { 
     166                    int tp = level.GetClosestDiagonalOpenPos(this); 
     167                    if (tp > 0) 
     168                    { 
     169                        currentOrderType = OrderType.AVOID; 
     170                        SetOrder(new OrderMove(tp % level.Width * Viewport.TILESIZE, tp / level.Width * Viewport.TILESIZE, stopOnMoveFail: true)); 
     171                    } 
     172                } 
     173                if (target == null || target.Removed) 
     174                { 
     175                    StopAttack(); 
     176                    StopCurrentOrder(); 
     177                } 
    139178            } 
    140179 
Note: See TracChangeset for help on using the changeset viewer.