public void SetAttackUnitDetail(AttackTask task)
    {
        if (grid.transform.childCount > 0)
        {
            Transform[] child = new Transform[grid.transform.childCount];

            for (int i = 0; i < grid.transform.childCount; i++)
            {
                child[i] = grid.transform.GetChild(i);
            }

            for (int i = 0; i < child.Length; i++)
            {
                child[i].parent = null;

                NGUITools.Destroy(child[i].gameObject);
            }
        }

        foreach (CombatUnit unit in task.PlayerUnit.Keys)
        {
            GameObject go = NGUITools.AddChild(grid.gameObject, attackUnitRowPrefab);

            UIAttackUnitRow rowDisplay = go.GetComponent <UIAttackUnitRow>();

            rowDisplay.SetUnitInfo(unit.unitType, task.PlayerUnit[unit]);
        }

        grid.Reposition();

        scrollview.ResetPosition();
    }
Esempio n. 2
0
    private void OnRightClick()
    {
        GameObject hittedObj      = GameObjectUnderMouse();
        int        hittedObjLayer = hittedObj.layer;

        if (hittedObjLayer == layerMaskToLayer(TerrainLayerMask))
        {
            ClearDeadUnits();
            SortByDistance(endDragRayHit.point);
            for (int i = 0; i < SelectedUnits.Count; i++)
            {
                if (SelectedUnits[i].IsTaskAvailable <GoToTask>())
                {
                    GoToTask goToTask = SelectedUnits[i].ChangeTask <GoToTask>();
                    goToTask.StartTask(endDragRayHit.point);
                }
            }
        }
        else if (hittedObjLayer == layerMaskToLayer(EnemyUnitsLayerMask) || hittedObjLayer == layerMaskToLayer(EnemyBuildingLayerMask))
        {
            ClearDeadUnits();
            SortByDistance(hittedObj.transform.position);
            for (int i = 0; i < SelectedUnits.Count; i++)
            {
                if (SelectedUnits[i].IsTaskAvailable <AttackTask>())
                {
                    AttackTask attackTask = SelectedUnits[i].ChangeTask <AttackTask>();
                    attackTask.StartTask(hittedObj.transform);
                }
            }
        }
    }
Esempio n. 3
0
        public override void InitializeTasks()
        {
            base.InitializeTasks();
            SiegeTask.Enable();
            TimingAttackTask.Enable();
            //WorkerScoutTask.Enable();
            DefenseTask.Enable();
            BunkerDefendersTask.Enable();
            SupplyDepotTask.Enable();
            ArmyRavenTask.Enable();
            MechDestroyExpandsTask.Enable();
            RepairTask.Enable();
            ReplenishBuildingSCVTask.Enable();
            ClearBlockedExpandsTask.Enable();
            HomeRepairTask.Enable();
            TransformTask.Enable();
            ThorretTask.Enable();
            HideBuildingTask.Enable();
            HideUnitsTask.Enable();
            //AttackTask.Enable();

            AttackTask.Enable();

            if (TankDefenseTasks.Count == 0)
            {
                foreach (Base b in Bot.Main.BaseManager.Bases)
                {
                    if (b == Natural ||
                        b == Main)
                    {
                        continue;
                    }
                    TankDefenseTasks.Add(new DefenseSquadTask(b, UnitTypes.SIEGE_TANK)
                    {
                        MaxDefenders = 2
                    });
                    LiberatorDefenseTasks.Add(new DefenseSquadTask(b, UnitTypes.LIBERATOR)
                    {
                        MaxDefenders = 1
                    });
                    VikingDefenseTasks.Add(new DefenseSquadTask(b, UnitTypes.VIKING_FIGHTER)
                    {
                        MaxDefenders = 1
                    });
                }
            }

            foreach (DefenseSquadTask task in TankDefenseTasks)
            {
                Task.Enable(task);
            }
            foreach (DefenseSquadTask task in LiberatorDefenseTasks)
            {
                Task.Enable(task);
            }
            foreach (DefenseSquadTask task in VikingDefenseTasks)
            {
                Task.Enable(task);
            }
        }
        /// <summary>
        /// Executes behavior with given context
        /// </summary>
        /// <param name="context">The context.</param>
        /// <returns></returns>
        public override BehaviorReturnCode Behave(IBehaviorContext context)
        {
            UnitBehaviorContext unitContext = context as UnitBehaviorContext;

            if (unitContext == null)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            StaticUnit unit = unitContext.Unit as StaticUnit;

            if (unit == null ||
                unit.Environment is Galaxy ||
                unit.Target == null ||
                unit.Environment != unit.Target.Environment ||
                !unit.CanAttack ||
                unit.Owner == unit.Target.Owner)
            {
                returnCode = BehaviorReturnCode.Failure;
                return(returnCode);
            }

            context.AddLogMessage("Attacking Target - " + unit.Target.Name);
            AttackTask task = new AttackTask(unit);

            while (!task.IsTaskFinished)
            {
                task.Execute();
            }

            returnCode = BehaviorReturnCode.Success;
            return(returnCode);
        }
Esempio n. 5
0
        private IActorTask HandlePersiutMode()
        {
            var isAttackAllowed = CheckAttackAvailability(_targetIntruder);

            if (isAttackAllowed)
            {
                var attackTask = new AttackTask(_actor, _targetIntruder, _actService);
                return(attackTask);
            }
            else
            {
                // Маршрут до цели обновляем каждые 3 хода.
                // Для оптимизации.
                // Эффект потери цели.

                //TODO Сделать тест аналогичный GetActorTasks_PatrolsTryToAttackEnemy_ReturnsMoveTask
                if (_persuitCounter > 0 && _moveTask != null)
                {
                    _persuitCounter--;
                    return(_moveTask);
                }
                else
                {
                    RefreshPersuiteCounter();
                    _moveTask = new MoveTask(_actor, _targetIntruder.Node, _map);
                    return(_moveTask);
                }
            }
        }
        private Vec3 CalculateTargetPosition(AttackTask attackTask)
        {
            Dynamic target = attackTask.TargetEntity;

            Vec3 targetPos = target != null ? target.Position : attackTask.TargetPosition;

            //to consider speed of the target
            if (target != null)
            {
                Gun gun = attackTask.Weapon as Gun;
                if (gun != null)
                {
                    BulletType bulletType = gun.Type.NormalMode.BulletType;
                    if (bulletType.Velocity != 0)
                    {
                        float flyTime = (targetPos - ControlledObject.Position).Length() /
                                        bulletType.Velocity;

                        if (target.PhysicsModel != null && target.PhysicsModel.Bodies.Length != 0)
                        {
                            Body targetBody = target.PhysicsModel.Bodies[0];
                            targetPos += targetBody.LinearVelocity * flyTime;
                        }
                    }
                }
            }

            return(targetPos);
        }
Esempio n. 7
0
        private IActorTask HandlePersuitMode()
        {
            var isAttackAllowed = CheckAttackAvailability(_targetIntruder);

            if (isAttackAllowed)
            {
                var attackTask = new AttackTask(Actor, _targetIntruder, _actService);
                return(attackTask);
            }
            else
            {
                // Маршрут до цели обновляем каждые 3 хода.
                // Для оптимизации.
                // Эффект потери цели.

                if (_pursuitCounter > 0 && _moveTask != null && _moveTask.CanExecute())
                {
                    _pursuitCounter--;
                    return(_moveTask);
                }
                else
                {
                    RefreshPursuitCounter();
                    _moveTask = new MoveTask(Actor, _targetIntruder.Node, Map);
                    return(_moveTask);
                }
            }
        }
Esempio n. 8
0
        public async Task AttackTask_NoWall_NotThrowsInvalidOperationException()
        {
            // Подготовка. Два актёра через клетку. Радиус действия 1-2, достаёт.
            _testMap = await SquareMapFactory.CreateAsync(3).ConfigureAwait(false);

            var tacticalActMock = new Mock <ITacticalAct>();

            tacticalActMock.SetupGet(x => x.Stats).Returns(new TestTacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            });
            var tacticalAct = tacticalActMock.Object;

            var combatActModuleMock = new Mock <ICombatActModule>();

            combatActModuleMock.Setup(x => x.CalcCombatActs())
            .Returns(new[] { tacticalAct });
            var combatActModule = combatActModuleMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.Setup(x => x.GetModule <ICombatActModule>(It.IsAny <string>())).Returns(combatActModule);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();
            var actorNode = _testMap.Nodes.SelectByHexCoords(0, 0);

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            actorMock.SetupGet(x => x.Person).Returns(person);
            actorMock.Setup(x => x.UseAct(It.IsAny <IGraphNode>(), It.IsAny <ITacticalAct>()))
            .Raises <IGraphNode, ITacticalAct>(x => x.UsedAct += null,
                                               (target1, act1) => new UsedActEventArgs(target1, act1));
            _actor = actorMock.Object;

            var targetMock = new Mock <IActor>();
            var targetNode = _testMap.Nodes.SelectByHexCoords(2, 0);

            targetMock.Setup(x => x.CanBeDamaged()).Returns(true);
            targetMock.SetupGet(x => x.Node).Returns(targetNode);
            var target = targetMock.Object;

            var actServiceMock = new Mock <ITacticalActUsageService>();
            var actService     = actServiceMock.Object;

            var taskContextMock = new Mock <IActorTaskContext>();
            var taskContext     = taskContextMock.Object;

            // Создаём саму команду
            _attackTask = new AttackTask(_actor, taskContext, target, tacticalAct, actService);

            Action act = () =>
            {
                // ACT
                _attackTask.Execute();
            };

            // ASSERT
            act.Should().NotThrow <InvalidOperationException>();
        }
Esempio n. 9
0
 void ResetAttackTask(AttackTask task)
 {
     if (task.TargetEntity != null)
     {
         RemoveRelationship(task.TargetEntity);
     }
     attackTasks.Remove(task);
 }
 private void ResetAttackTask(AttackTask task)
 {
     if (task.TargetEntity != null)
     {
         UnsubscribeToDeletionEvent(task.TargetEntity);
     }
     attackTasks.Remove(task);
 }
Esempio n. 11
0
    /// <summary>
    /// Start track  attack task.
    /// </summary>
    /// <param name="task">Task.</param>
    public void TrackAttackTask(AttackTask task)
    {
        attackTaskId = task.TaskId;
        attackTask   = task;

        task.Evt_OnTimeLeftToComplete += OnUpdateProgress;
        task.Evt_OnAttackComplete     += OnAttackTaskComplete;
    }
        public override IActorTask GetTask(IActor actor, ISectorTaskSourceContext context,
                                           ILogicStrategyData strategyData)
        {
            var triggerTarget = strategyData.TriggerIntuder;

            if (triggerTarget == null)
            {
                throw new InvalidOperationException(
                          $"Assign {nameof(strategyData.TriggerIntuder)} with not null valie in related trigger.");
            }

            var targetCanBeDamaged = triggerTarget.CanBeDamaged();

            if (!targetCanBeDamaged)
            {
                Complete = true;
                return(null);
            }

            var attackParams = CheckAttackAvailability(actor, triggerTarget, context.Sector.Map);

            if (attackParams.IsAvailable)
            {
                var act = attackParams.CombatAct;

                var taskContext = new ActorTaskContext(context.Sector);

                var attackTask = new AttackTask(actor, taskContext, triggerTarget, act, _actService);
                return(attackTask);
            }

            // Маршрут до цели обновляем каждые 3 хода.
            // Для оптимизации.
            // Эффект потери цели.
            if (_refreshCounter > 0 && _moveTask?.CanExecute() == true)
            {
                _refreshCounter--;
                return(_moveTask);
            }

            var map = context.Sector.Map;

            _refreshCounter = REFRESH_COUNTER_VALUE;
            var targetIsOnLine = map.TargetIsOnLine(actor.Node, triggerTarget.Node);

            if (targetIsOnLine)
            {
                var taskContext = new ActorTaskContext(context.Sector);
                var moveModule  = actor.Person.GetModule <IMovingModule>();
                var moveCost    = moveModule.CalculateCost();

                _moveTask = new MoveTask(actor, taskContext, triggerTarget.Node, map, moveCost);
                return(_moveTask);
            }

            // Цел за пределами видимости. Считается потерянной.
            return(null);
        }
Esempio n. 13
0
    public static AttackTask CreateTask(string taskId, string targetId, string targetName, Dictionary <CombatUnit, int> targetUnit,
                                        Dictionary <CombatUnit, int> playerUnit, OnAttackComplete completeCallBack = null,
                                        OnTimeLeftToComplete timeLeftCallBack = null, int duration = 1)
    {
        AttackTask task = new AttackTask();

        task.InitTask(taskId, targetId, targetName, targetUnit, playerUnit, completeCallBack, timeLeftCallBack, duration);

        return(task);
    }
Esempio n. 14
0
        private bool FindAutomaticTask()
        {
            Mech controlledObj = ControlledObject;

            float     maximalPriority  = 0;
            MapObject needAttackObject = null;

            //find object. units only.
            Map.Instance.GetObjects(new Sphere(controlledObj.Position, controlledObj.ViewRadius),
                                    MapObjectSceneGraphGroups.UnitGroupMask, delegate(MapObject mapObject)
            {
                Unit unit = (Unit)mapObject;

                //check distance
                Vec3 diff            = unit.Position - controlledObj.Position;
                float objDistanceSqr = diff.LengthSqr();
                if (objDistanceSqr <= controlledObj.ViewRadius * controlledObj.ViewRadius)
                {
                    float priority;

                    //Attack task
                    if (weapons.Length != 0)
                    {
                        priority = GetTaskAttackObjectPriority(unit);
                        if (priority != 0 && priority > maximalPriority)
                        {
                            maximalPriority  = priority;
                            needAttackObject = unit;
                        }
                    }
                }
            });

            //do task
            if (needAttackObject != null)
            {
                MapObject currentAttackedUnit = null;
                {
                    AttackTask currentAttackTask = currentTask as AttackTask;
                    if (currentAttackTask != null)
                    {
                        currentAttackedUnit = currentAttackTask.TaskEntity;
                    }
                }
                if (needAttackObject != currentAttackedUnit)
                {
                    DoTask(new AttackTask(this, needAttackObject), false);
                }

                return(true);
            }

            return(false);
        }
Esempio n. 15
0
    /// <summary>
    /// Handle attack task complete event.
    /// </summary>
    /// <param name="task">Task.</param>
    void OnAttackTaskComplete(AttackTask task)
    {
        transform.parent = null;

        NGUITools.Destroy(gameObject);

        if (Evt_OnAttackProgressDestroy != null)
        {
            Evt_OnAttackProgressDestroy();
        }
    }
Esempio n. 16
0
        public AttackDataManager(AttackData attackData, ActiveUnitData activeUnitData, AttackTask attackTask, TargetPriorityService targetPriorityService, TargetingData targetingData, MacroData macroData, BaseData baseData, DebugService debugService)
        {
            AttackData            = attackData;
            ActiveUnitData        = activeUnitData;
            AttackTask            = attackTask;
            TargetPriorityService = targetPriorityService;
            TargetingData         = targetingData;
            MacroData             = macroData;
            BaseData = baseData;

            DebugService = debugService;
        }
Esempio n. 17
0
    /*
     * public bool AttackPlayer(string playerId, int sentUnit)
     * {
     *      AIPlayer aiPlayer = GetAIPlayer (playerId);
     *
     *      if(aiPlayer != null)
     *      {
     *              AttackManagerMetaData data = AttackManagerMetaData.Load();
     *
     *              string taskId = GenerateTaskId();
     *
     *              if(data.AddAttackTask(taskId, aiPlayer.playerId, aiPlayer.playerName, aiPlayer.totalCombatUnit, sentUnit, aiPlayer.attackDuration))
     *              {
     *                      AttackTask task = AttackTask.CreateTask(taskId, aiPlayer.playerId, aiPlayer.playerName, aiPlayer.totalCombatUnit, OnAttackTaskComplete, null, aiPlayer.attackDuration);
     *
     *                      _attackTasks.Add(task);
     *
     *                      TaskManager.Instance.AddTask(task);
     *
     *                      EventManager.GetInstance().ExecuteEvent<EventNewAttack>(new EventNewAttack(task));
     *
     *                      return true;
     *              }
     *      }
     *      else
     *      {
     *              Debug.LogError("Attack player with id "+playerId+" not exist");
     *      }
     *
     *      return false;
     * }
     */

    /// <summary>
    /// Attacks player.
    /// </summary>
    /// <returns><c>true</c>, if player was attacked, <c>false</c> otherwise.</returns>
    /// <param name="playerId">Player identifier.</param>
    /// <param name="sentUnit">Sent unit.</param>
    public bool AttackPlayer(string playerId, Dictionary <CombatUnitType, int> sentUnit)
    {
        //todo:send unit

        AIPlayer aiPlayer = GetAIPlayer(playerId);

        if (aiPlayer != null)
        {
            AttackManagerMetaData data = AttackManagerMetaData.Load();

            string taskId = GenerateTaskId();

            //attacker(player) unit
            Dictionary <CombatUnit, int> dic = new Dictionary <CombatUnit, int>();

            foreach (CombatUnitType type in sentUnit.Keys)
            {
                if (sentUnit[type] > 0)
                {
                    CombatUnit unit = CombatUnitManager.Instance.GetCombatUnitInfoByType(type);

                    dic.Add(unit, sentUnit[type]);
                }
            }

            Dictionary <ResourceType, float> resoruceAward = new Dictionary <ResourceType, float>();

            for (int i = 0; i < aiPlayer.resourceAwardType.Count; i++)
            {
                resoruceAward.Add(aiPlayer.resourceAwardType[i], aiPlayer.resourceAwardAmount[i]);
            }

            if (data.AddAttackTask(taskId, aiPlayer.playerId, aiPlayer.playerName, aiPlayer.GetPlayerCombatUnitInfo(), dic, aiPlayer.attackDuration, resoruceAward))
            {
                AttackTask task = AttackTask.CreateTask(taskId, aiPlayer.playerId, aiPlayer.playerName, aiPlayer.GetPlayerCombatUnitInfo(), dic,
                                                        OnAttackTaskComplete, null, aiPlayer.attackDuration);

                _attackTasks.Add(task);

                TaskManager.Instance.AddTask(task);

                EventManager.GetInstance().ExecuteEvent <EventNewAttack>(new EventNewAttack(task));

                return(true);
            }
        }
        else
        {
            Debug.LogError("Attack player with id " + playerId + " not exist");
        }

        return(false);
    }
        private bool IsWeaponDirectedToTarget(AttackTask attackTask)
        {
            Vec3 targetPos = CalculateTargetPosition(attackTask);

            Weapon weapon = attackTask.Weapon;

            //to check up a weapon angle
            {
                Vec3 needDirection   = (targetPos - weapon.Position).GetNormalize();
                Vec3 weaponDirection = weapon.Rotation.GetForward();

                Radian angle = Math.Abs(MathFunctions.ACos(Vec3.Dot(needDirection, weaponDirection)));
                Radian minimalDifferenceAngle = new Degree(2).InRadians();

                if (angle > minimalDifferenceAngle)
                {
                    return(false);
                }
            }

            //to check up a line of fire
            {
                Ray ray = new Ray(weapon.Position, targetPos - weapon.Position);

                RayCastResult[] piercingResult = PhysicsWorld.Instance.RayCastPiercing(
                    ray, (int)ContactGroup.CastOnlyContact);

                foreach (RayCastResult result in piercingResult)
                {
                    Dynamic dynamic = MapSystemWorld.GetMapObjectByBody(result.Shape.Body) as Dynamic;
                    if (dynamic != null)
                    {
                        Unit parentUnit = dynamic.GetParentUnit();
                        if (parentUnit != null)
                        {
                            if (parentUnit == attackTask.TargetEntity)
                            {
                                continue;
                            }
                            if (parentUnit == ControlledObject)
                            {
                                continue;
                            }
                        }
                    }

                    return(false);
                }
            }

            return(true);
        }
        public override IActorTask GetTask(IActor actor, ILogicStrategyData strategyData)
        {
            if (_target == null)
            {
                _target = GetTarget(actor);
            }

            var targetCanBeDamaged = _target.CanBeDamaged();

            if (!targetCanBeDamaged)
            {
                Complete = true;
                return(null);
            }

            var attackParams = CheckAttackAvailability(actor, _target);

            if (attackParams.IsAvailable)
            {
                var act        = attackParams.TacticalAct;
                var attackTask = new AttackTask(actor, _target, act, _actService);
                return(attackTask);
            }
            else
            {
                // Маршрут до цели обновляем каждые 3 хода.
                // Для оптимизации.
                // Эффект потери цели.

                if (_refreshCounter > 0 && _moveTask?.CanExecute() == true)
                {
                    _refreshCounter--;
                    return(_moveTask);
                }
                else
                {
                    _refreshCounter = REFRESH_COUNTER_VALUE;
                    var targetIsOnLine = _map.TargetIsOnLine(actor.Node, _target.Node);

                    if (targetIsOnLine)
                    {
                        _moveTask = new MoveTask(actor, _target.Node, _map);
                        return(_moveTask);
                    }
                    else
                    {
                        // Цел за пределами видимости. Считается потерянной.
                        return(null);
                    }
                }
            }
        }
Esempio n. 20
0
        void TickAttackTasks()
        {
            if (unitWeapons == null)
            {
                FindUnitWeapons();
            }

            foreach (Weapon weapon in unitWeapons)
            {
                float radius = 0;
                if (weapon.Type.WeaponNormalMode.IsInitialized)
                {
                    radius = Math.Max(radius, weapon.Type.WeaponNormalMode.UseDistanceRange.Maximum);
                }
                if (weapon.Type.WeaponAlternativeMode.IsInitialized)
                {
                    radius = Math.Max(radius, weapon.Type.WeaponAlternativeMode.UseDistanceRange.Maximum);
                }

                Dynamic enemy = FindEnemy(radius);


                AttackTask task = attackTasks.Find(delegate(AttackTask t)
                {
                    return(t.Weapon == weapon);
                });

                if (task != null)
                {
                    if (task.TargetEntity != enemy)
                    {
                        if (enemy != null)
                        {
                            DoAttackTask(weapon, enemy);
                        }
                        else
                        {
                            ResetAttackTask(task);
                        }
                    }
                }
                else
                {
                    if (enemy != null)
                    {
                        DoAttackTask(weapon, enemy);
                    }
                }
            }
        }
        private void DoAttackTask(Weapon weapon, Vec3 target)
        {
            AttackTask task = attackTasks.Find(delegate(AttackTask t)
            {
                return(t.Weapon == weapon);
            });

            if (task != null && task.TargetPosition == target)
            {
                return;
            }

            ResetAttackTask(task);

            task = new AttackTask(weapon, target);
            attackTasks.Add(task);
        }
Esempio n. 22
0
    AIBehaviour m_aibehaviourThis;              //The Behaviour to be used for this AI

    // Use this for initialization
    void Start()
    {
        m_aimodelThis = GetComponent <AIModel>();    //Initialize the model


#pragma warning disable 0219
        //From here on the Behaviourtree is constructed; For more info on this you can find a graphic of the tree:
        m_aibehaviourThis = new AIBehaviour(m_aimodelThis);
        {
            Selector selectorIdleOrAction = new Selector(m_aibehaviourThis);
            {
                Sequence sequenceConditionsOrIdle = new Sequence(selectorIdleOrAction);
                {
                    //if the player is dead => idle
                    //if the player is not dead and not in range => idle
                    //if the payer is not dead and in range => idle
                    Selector                   selectorDeadOrNotInRange = new Selector(sequenceConditionsOrIdle);
                    Condition_PlayerDead       conditionDead            = new Condition_PlayerDead(selectorDeadOrNotInRange, m_aibehaviourThis);
                    Inverter                   inverterNotInRange       = new Inverter(selectorDeadOrNotInRange);
                    Condition_InDetectionRange conditionInRange         = new Condition_InDetectionRange(inverterNotInRange, m_aibehaviourThis);
                    IdleTask                   idleTask = new IdleTask(sequenceConditionsOrIdle, m_aibehaviourThis);
                }
                Selector selectorFleeOrFight = new Selector(selectorIdleOrAction);
                {
                    Sequence sequenceConditionsThenFlee = new Sequence(selectorFleeOrFight);
                    {
                        Selector selectorTimerOrHealth = new Selector(sequenceConditionsThenFlee);
                        {
                            Condition_FleeTimerRunning conditionFleeDelay        = new Condition_FleeTimerRunning(selectorTimerOrHealth, m_aibehaviourThis);
                            Condition_HealthLow        conditionHealthHighEnough = new Condition_HealthLow(selectorTimerOrHealth, m_aibehaviourThis);
                        }
                        FleeTask fleetask = new FleeTask(sequenceConditionsThenFlee, m_aibehaviourThis);
                    }
                    AttackTask attackTask = new AttackTask(selectorFleeOrFight, m_aibehaviourThis);
                }
            }
        }
#pragma warning restore 0219
        m_aibehaviourThis.StartBehaviour();                             //After constructing the Behaviour, start it
        InvokeRepeating("UpdateAIBehaviour", m_fTickRate, m_fTickRate); //Start regularly updating the AI after one "tick"

        //Subscribe to the Model to see if it is Dead in order to stop ticking
        m_aimodelThis.m_modelstateCurrent
        .Where(m_modelstateCurrent => m_modelstateCurrent == ModelState.Dead)
        .Subscribe(m_modelstateCurrent => CancelInvoke());
    }
Esempio n. 23
0
    /// <summary>
    /// Fetch data from meta data.
    /// </summary>
    void DoFetchData()
    {
        AttackManagerMetaData data = AttackManagerMetaData.Load(true);

        AttackInfo[] infos = data.GetAttackInfo();

        for (int i = 0; i < infos.Length; i++)
        {
            AttackInfo info = infos[i];

            AttackTask task = AttackTask.CreateTask(info.taskId, info.targetId, info.targetName, info.targetUnit, info.attackerUnit,
                                                    OnAttackTaskComplete, null, info.duration);

            _attackTasks.Add(task);

            TaskManager.Instance.AddTask(task);

            EventManager.GetInstance().ExecuteEvent <EventNewAttack>(new EventNewAttack(task));
        }
    }
        private void DoAttackTask(Weapon weapon, Dynamic target)
        {
            AttackTask task = attackTasks.Find(delegate(AttackTask t)
            {
                return(t.Weapon == weapon);
            });

            if (task != null && task.TargetEntity == target)
            {
                return;
            }

            if (task != null)
            {
                ResetAttackTask(task);
            }

            task = new AttackTask(weapon, target);
            SubscribeToDeletionEvent(target);
            attackTasks.Add(task);
        }
Esempio n. 25
0
        void DoAttackTask(Weapon weapon, Dynamic target)
        {
            AttackTask task = attackTasks.Find(delegate(AttackTask t)
            {
                return(t.Weapon == weapon);
            });

            if (task != null && task.TargetEntity == target)
            {
                return;
            }

            if (task != null)
            {
                ResetAttackTask(task);
            }

            task = new AttackTask(weapon, target);
            AddRelationship(target);
            attackTasks.Add(task);
        }
    void DispalyAttackTask()
    {
        if (_target.AllAttackTask == null)
        {
            return;
        }

        EditorGUILayout.BeginVertical();

        for (int i = 0; i < _target.AllAttackTask.Count; i++)
        {
            AttackTask task = _target.AllAttackTask[i];

            EditorGUILayout.BeginHorizontal();

            EditorGUILayout.LabelField(new GUIContent(task.TargetPlayerName));

            EditorGUILayout.LabelField(new GUIContent(task.CurrentDuration.ToString()));

            EditorGUILayout.EndHorizontal();
        }

        EditorGUILayout.EndVertical();
    }
Esempio n. 27
0
 /// <summary>
 /// Handle attack task complete.
 /// </summary>
 /// <param name="task">Task.</param>
 void OnAttackTaskComplete(AttackTask task)
 {
     _attackTasks.Remove(task);
 }
Esempio n. 28
0
        public void AttackTaskTest()
        {
            // ARRANGE
            // Подготовка. Два актёра через клетку. Радиус действия 1-2, достаёт.
            var testMap = new TestGridGenMap(3);

            var actMock = new Mock <ITacticalAct>();

            actMock.SetupGet(x => x.Stats).Returns(new TacticalActStatsSubScheme
            {
                Range = new Range <int>(1, 2)
            });
            var act = actMock.Object;

            var actCarrierMock = new Mock <ITacticalActCarrier>();

            actCarrierMock.SetupGet(x => x.Acts)
            .Returns(new ITacticalAct[] { act });
            var actCarrier = actCarrierMock.Object;

            var personMock = new Mock <IPerson>();

            personMock.SetupGet(x => x.TacticalActCarrier).Returns(actCarrier);
            var person = personMock.Object;

            var actorMock = new Mock <IActor>();
            var actorNode = testMap.Nodes.OfType <HexNode>().SelectBy(0, 0);

            actorMock.SetupGet(x => x.Node).Returns(actorNode);
            actorMock.SetupGet(x => x.Person).Returns(person);
            actorMock.Setup(x => x.UseAct(It.IsAny <IAttackTarget>(), It.IsAny <ITacticalAct>()))
            .Raises <IAttackTarget, ITacticalAct>(x => x.UsedAct += null, (target1, act1) => new UsedActEventArgs(target1, act1));
            var actor = actorMock.Object;


            var targetMock = new Mock <IActor>();
            var targetNode = testMap.Nodes.OfType <HexNode>().SelectBy(2, 0);

            targetMock.Setup(x => x.CanBeDamaged()).Returns(true);
            targetMock.SetupGet(x => x.Node).Returns(targetNode);
            var target = targetMock.Object;

            var actServiceMock = new Mock <ITacticalActUsageService>();
            var actService     = actServiceMock.Object;


            // Создаём саму команду
            var attackTask = new AttackTask(actor, target, actService);


            using (var monitor = actor.Monitor())
            {
                // ACT
                attackTask.Execute();



                // ASSERT
                monitor.Should().Raise(nameof(IActor.UsedAct));
            }
        }
 void ResetAttackTask( AttackTask task )
 {
     if( task.TargetEntity != null )
         RemoveRelationship( task.TargetEntity );
     attackTasks.Remove( task );
 }
        private void DoAttackTask(Weapon weapon, Dynamic target)
        {
            AttackTask task = attackTasks.Find(delegate(AttackTask t)
            {
                return t.Weapon == weapon;
            });

            if (task != null && task.TargetEntity == target)
                return;

            if (task != null)
                ResetAttackTask(task);

            task = new AttackTask(weapon, target);
            SubscribeToDeletionEvent(target);
            attackTasks.Add(task);
        }
        void DoAttackTask( Weapon weapon, Dynamic target )
        {
            AttackTask task = attackTasks.Find( delegate( AttackTask t )
            {
                return t.Weapon == weapon;
            } );

            if( task != null && task.TargetEntity == target )
                return;

            if( task != null )
                ResetAttackTask( task );

            task = new AttackTask( weapon, target );
            AddRelationship( target );
            attackTasks.Add( task );
        }
        bool IsWeaponDirectedToTarget( AttackTask attackTask )
        {
            Vec3 targetPos = CalculateTargetPosition( attackTask );

            Weapon weapon = attackTask.Weapon;

            //to check up a weapon angle
            {
                Vec3 needDirection = ( targetPos - weapon.Position ).GetNormalize();
                Vec3 weaponDirection = weapon.Rotation.GetForward();

                Radian angle = Math.Abs( MathFunctions.ACos( Vec3.Dot( needDirection, weaponDirection ) ) );
                Radian minimalDifferenceAngle = new Degree( 2 ).InRadians();

                if( angle > minimalDifferenceAngle )
                    return false;
            }

            //to check up a line of fire
            {
                Ray ray = new Ray( weapon.Position, targetPos - weapon.Position );

                RayCastResult[] piercingResult = PhysicsWorld.Instance.RayCastPiercing(
                    ray, (int)ContactGroup.CastOnlyContact );

                foreach( RayCastResult result in piercingResult )
                {
                    Dynamic dynamic = MapSystemWorld.GetMapObjectByBody( result.Shape.Body ) as Dynamic;
                    if( dynamic != null )
                    {
                        Unit parentUnit = dynamic.GetParentUnit();
                        if( parentUnit != null )
                        {
                            if( parentUnit == attackTask.TargetEntity )
                                continue;
                            if( parentUnit == ControlledObject )
                                continue;
                        }
                    }

                    return false;
                }
            }

            return true;
        }
        void DoAttackTask( Weapon weapon, Vec3 target )
        {
            AttackTask task = attackTasks.Find( delegate( AttackTask t )
            {
                return t.Weapon == weapon;
            } );

            if( task != null && task.TargetPosition == target )
                return;

            ResetAttackTask( task );

            task = new AttackTask( weapon, target );
            attackTasks.Add( task );
        }
        Vec3 CalculateTargetPosition( AttackTask attackTask )
        {
            Dynamic target = attackTask.TargetEntity;

            Vec3 targetPos = target != null ? target.Position : attackTask.TargetPosition;

            //to consider speed of the target
            if( target != null )
            {
                Gun gun = attackTask.Weapon as Gun;
                if( gun != null )
                {
                    BulletType bulletType = gun.Type.NormalMode.BulletType;
                    if( bulletType.Velocity != 0 )
                    {
                        float flyTime = ( targetPos - ControlledObject.Position ).LengthFast() /
                            bulletType.Velocity;

                        if( target.PhysicsModel != null && target.PhysicsModel.Bodies.Length != 0 )
                        {
                            Body targetBody = target.PhysicsModel.Bodies[ 0 ];
                            targetPos += targetBody.LinearVelocity * flyTime;
                        }
                    }
                }
            }

            return targetPos;
        }
Esempio n. 35
0
 public EventNewAttack(AttackTask task)
 {
     newAttackTask = task;
 }
Esempio n. 36
0
 void ResetAttackTask( AttackTask task )
 {
     if( task.TargetEntity != null )
         UnsubscribeToDeletionEvent( task.TargetEntity );
     attackTasks.Remove( task );
 }
Esempio n. 37
0
 void OnEnable()
 {
     attackTask    = GetComponent <AttackTask>();
     RunAllTheTime = true;
 }