예제 #1
0
    private TreeStatusEnum KeepExistingTarget()
    {
        if (!_turret.hasAttackTarget)
        {
            return(TreeStatusEnum.FAILURE);
        }
        if (!_turret.isAutoAttacking)
        {
            return(TreeStatusEnum.SUCCESS);
        }

        GameEntity target = _game.GetEntityWithID(_turret.attackTarget.targetID);

        //target still alive?
        if (target == null)
        {
            return(TreeStatusEnum.FAILURE);
        }
        if (target.health.value < 0)
        {
            return(TreeStatusEnum.FAILURE);
        }
        if (target.isKilled)
        {
            return(TreeStatusEnum.FAILURE);
        }

        //out of range?
        int distance = _grid.DistanceBetween(_turret.location.cell, target.location.cell);

        if (distance > _turret.weapon.range)
        {
            return(TreeStatusEnum.FAILURE);
        }

        return(TreeStatusEnum.SUCCESS);
    }
예제 #2
0
        void IExecuteSystem.Execute()
        {
            foreach (var unit in _attackingUnits.GetEntities())
            {
                GameEntity attackTarget = _game.GetEntityWithID(unit.attackTarget.targetID);
                if (attackTarget == null)
                {
                    unit.RemoveAttackTarget();
                    continue; //no more attacking; continue with next unit
                }

                //no friendly fire
                if (unit.team.value == attackTarget.team.value)
                {
                    unit.RemoveAttackTarget();
                    continue;
                }

                int nrCells = _grid.DistanceBetween(unit.location.cell, attackTarget.location.cell);
                //out of range; don't shoot
                if (nrCells > unit.weapon.range)
                {
                    continue;
                }

                //not aimed; don't shoot
                //if (!unit.isWeaponAimed) continue; // => this is enforced using GameMatcher

                //still reloading; don't shoot
                if (unit.hasFireWeapon && (unit.fireWeapon.time + 1 / unit.weapon.rateOfFire) > Time.time)
                {
                    continue;
                }

                //we got here, we're ready to shoot
                unit.ReplaceFireWeapon(Time.time);
            }
        }