示例#1
0
        public void TestFindTwoTurnCompultionWinForTile2()
        {
            //setup the initial condition
            var player1 = "Player 1";
            var player2 = "Player 2";
            var game    = new GameCore(player1, player2);
            var board   = game.Board;

            //
            //
            //
            // . . x x . . .
            //////////////////

            board[2][0].OwningPlayer = player1;
            board[3][0].OwningPlayer = player1;

            List <Tile> compulsionWin = AIHelper.FindTwoTurnCompulsionWin(game, player1);

            Assert.AreEqual(2, compulsionWin.Count);
            Assert.AreEqual(board[1][0], compulsionWin[0]);
            Assert.AreEqual(board[4][0], compulsionWin[1]);
        }
示例#2
0
        } // Update

        public void ScanForTarget(GameTime gameTime)
        {
            NextDefendScan -= (float)gameTime.ElapsedGameTime.TotalMilliseconds;

            if (NextDefendScan <= 0)
            {
                NextDefendScan = 0;

                var newTarget = AIHelper.FindClosestDamagedFriend(this);

                if (newTarget != null)
                {
                    var repair = StateMachine.GetState <RepairShipRepairState>();
                    repair.Target     = newTarget;
                    repair.RepairRate = RepairRate;
                    StateMachine.SetState(repair);
                }
                else
                {
                    NextDefendScan = DefendScanFrequency;
                }
            }
        } // ScanForTarget
示例#3
0
    /// <summary>
    /// 找最近的可以寻路的触发器
    /// </summary>
    /// <param name="runningProperty"></param>
    /// <returns></returns>
    public static Vector3 GetNearestNeedNavigateColliderPosition(AIRunningProperty runningProperty)
    {
        if (runningProperty == null)
        {
            return(Vector3.zero);
        }

        float   shortest     = float.MaxValue;
        Vector3 selfActorPos = runningProperty.SelfActorPos;
        Vector3 targetPos    = Vector3.zero;

        List <xc.Dungeon.ColliderObject> colliderObjects = xc.Dungeon.ColliderObjectManager.Instance.GetNeedNavigateColliderObjects();

        foreach (xc.Dungeon.ColliderObject colliderObject in colliderObjects)
        {
            if (colliderObject == null || colliderObject.BindGameObject == null || colliderObject.BindGameObject.transform == null)
            {
                continue;
            }

            Vector3 pos = colliderObject.BindGameObject.transform.position;
            if (!TargetPositionHeightIsAbnormal(pos))
            {
                continue;
            }

            float distanceSquare = AIHelper.DistanceSquare(selfActorPos, pos);
            if (distanceSquare < shortest)
            {
                shortest  = distanceSquare;
                targetPos = pos;
            }
        }

        return(targetPos);
    }
示例#4
0
        public void TestFindTwoTurnCompultionWinForTile1()
        {
            //setup the initial condition
            var player1 = "Player 1";
            var player2 = "Player 2";
            var game    = new GameCore(player1, player2);
            var board   = game.Board;

            // . . . . . x
            // . . . . . t
            // . . x x . x
            // . . x t . t .
            ////////////////////

            board[2][0].OwningPlayer = player1;
            board[2][1].OwningPlayer = player1;

            board[3][0].OwningPlayer = player2;
            board[3][1].OwningPlayer = player1;

            //column 4 is empty, with which we can create a compulsion.
            //If player one places a tile in column four, it will cause a potential
            //win if they place another one (4 horizontally) so player 2 will have to
            //block it. But that will let player 1 place a tile there to win
            //via a diagonal.

            board[5][0].OwningPlayer = player2;
            board[5][1].OwningPlayer = player1;
            board[5][2].OwningPlayer = player2;
            board[5][3].OwningPlayer = player1;

            List <Tile> compulsionWin = AIHelper.FindTwoTurnCompulsionWin(game, player1);

            Assert.AreEqual(1, compulsionWin.Count);
            Assert.AreEqual(board[4][0], compulsionWin[0]);
        }
示例#5
0
文件: Bot.cs 项目: LHGames-2018/XSF
 internal string getType(int u)
 {
     if (u == 0)
     {
         return(AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity));
     }
     if (u == 1)
     {
         return(AIHelper.CreateUpgradeAction(UpgradeType.CollectingSpeed));
     }
     if (u == 2)
     {
         return(AIHelper.CreateUpgradeAction(UpgradeType.Defence));
     }
     if (u == 3)
     {
         return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
     }
     if (u == 4)
     {
         return(AIHelper.CreateUpgradeAction(UpgradeType.MaximumHealth));
     }
     return("");
 }
示例#6
0
    void Update()
    {
        if (currentCooldown >= 0)
        {
            currentCooldown -= Time.deltaTime;
        }

        //Dead
        if (hc.isDead)
        {
            if (this.gameObject.name.Contains("Big Fish Enemy"))
            {
                SFXHelper.PlayEffect(SFXs.BigFishDeath);
            }
            if (this.gameObject.name.Contains("Jelly Fish Enemy"))
            {
                SFXHelper.PlayEffect(SFXs.JellyFishDeath);
            }

            Destroy(this.gameObject);
        }

        /* BEHAVIOUR ACTIONS */
        timeSinceLastAction += Time.deltaTime;
        if (timeSinceLastAction > TimeBetweenActions)
        {
            timeSinceLastAction = 0;
            currentBehaviour.BehaviorAction(this);
            //Flock adjustments
            CurrentDirection += AIHelper.FlockMainBehaviour(this).normalized;
        }

        UpdateVelocity();
        UpdateSpriteDirection();
        enemyBrain.CheckConditionsForNewBehaviours(this);
    }
示例#7
0
 public override string Execute()
 {
     return(AIHelper.CreateUpgradeAction(_upgradeList.Pop()));
 }
示例#8
0
    /// <summary>
    /// 设置最近的目标
    /// </summary>
    /// <returns></returns>
    public BehaviourReturnCode ActionSetPlayerOrMonsterToTarget()
    {
        if (RunningProperty.TargetActor != null)
        {
            if (HookSettingManager.Instance.RangeType == EHookRangeType.FixedPos && RunningProperty.GetToTargetDistanceSquare() > (MaxAttackDistance * MaxAttackDistance))
            {
                RunningProperty.TargetActor = null;
            }
            else if (RunningProperty.TargetActor.IsDead() == false)
            {
                return(BehaviourReturnCode.Success);
            }
        }

        var player = AIHelper.GetNearestActor(RunningProperty, ActorManager.Instance.PlayerSet);

        if (SceneHelp.Instance.PrecedentPlayer)// 优先选择玩家
        {
            if (player != null)
            {
                RunningProperty.TargetActor = player;
                RunningProperty.TargetActorIsCounterattack = false;

                return(BehaviourReturnCode.Success);
            }
        }

        float motionRadius = RunningProperty.MotionRadius;

        // 定点挂机
        if (RunningProperty.SelfActor is LocalPlayer && HookSettingManager.Instance.RangeType == EHookRangeType.FixedPos)
        {
            motionRadius = 1f;
        }

        Dictionary <UnitID, Actor> monsters = null;

        if (RunningProperty.TargetMonsterId == 0)
        {
            monsters = AIHelper.GetMonsterListByRange(RunningProperty.OriginalSelfActorPos, motionRadius + MaxAttackDistance);
        }
        else
        {
            monsters = AIHelper.GetMonsterListByActorIdAndRange(RunningProperty.TargetMonsterId, RunningProperty.OriginalSelfActorPos, motionRadius + MaxAttackDistance);
        }

        Actor monster = null;

        // 先看看怪物列表里面是否有boss,有的话只在boss里面选
        Actor boss = AIHelper.GetBossActor(monsters);

        if (boss != null)
        {
            monster = boss;
        }
        else
        {
            monster = AIHelper.GetNearestActor(RunningProperty, monsters);
        }

        if (player == null)
        {
            RunningProperty.TargetActor = monster;
        }
        else if (monster == null)
        {
            RunningProperty.TargetActor = player;
        }
        else
        {
            if (Vector3.Distance(RunningProperty.SelfActorPos, player.transform.position) <= Vector3.Distance(RunningProperty.SelfActorPos, monster.transform.position))
            {
                RunningProperty.TargetActor = player;
            }
            else
            {
                RunningProperty.TargetActor = monster;
            }
        }

        if (RunningProperty.TargetActor != null && Vector3.Distance(RunningProperty.SelfActorPos, RunningProperty.TargetActor.transform.position) <= AttackCtrl.MaxTargetRange)
        {
            RunningProperty.SelfActor.AttackCtrl.CurSelectActor = RunningProperty.TargetActor.GetActorMono();
        }

        RunningProperty.RefreshState();

        if (RunningProperty.TargetActor == null)
        {
            return(BehaviourReturnCode.Success);
        }

        if (RunningProperty.GetToTargetDistanceSquare() > ((motionRadius + MaxAttackDistance) * (motionRadius + MaxAttackDistance)))
        {
            RunningProperty.TargetActor = null;
            return(BehaviourReturnCode.Success);
        }

        if (HookSettingManager.Instance.RangeType == EHookRangeType.FixedPos && RunningProperty.GetToTargetDistanceSquare() > (MaxAttackDistance * MaxAttackDistance))
        {
            RunningProperty.TargetActor = null;
            return(BehaviourReturnCode.Success);
        }

        if (RunningProperty.TargetActor.IsDead() == true)
        {
            RunningProperty.TargetActor = null;
            return(BehaviourReturnCode.Success);
        }

        RunningProperty.TargetActorIsCounterattack = false;

        return(BehaviourReturnCode.Success);
    }
示例#9
0
    protected virtual bool RunConditionImplement(string condition, object[] parameters)
    {
        if (condition == "ConditionTargetIsInAttackRange")
        {
            return(mFunction.ConditionTargetIsInAttackRange());
        }
        else if (condition == "ConditionIsSeeTarget")
        {
            return(mFunction.ConditionIsSeeTarget());
        }
        else if (condition == "ConditionIsInMotionRange")
        {
            return(mFunction.ConditionIsInMotionRange());
        }
        else if (condition == "ConditionIsNeedPatrol")
        {
            return(mFunction.ConditionIsNeedPatrol());
        }
        else if (condition == "ConditionIsNeedFollowPlayer")
        {
            return(mFunction.ConditionIsNeedFollowPlayer());
        }
        else if (condition == "ConditionHaveTargetDrop")
        {
            return(mFunction.ConditionHaveTargetDrop());
        }
        else if (condition == "ConditionHaveTargetCollection")
        {
            return(mFunction.ConditionHaveTargetCollection());
        }
        else if (condition == "ConditionSelfActorIsInteraction")
        {
            return(mFunction.ConditionSelfActorIsInteraction());
        }
        else if (condition == "ConditionIsChasingOverrideTime")
        {
            float time = (float)parameters[0];
            return(mFunction.ConditionIsChasingOverrideTime(time));
        }
        else if (condition == "ConditionIsStandingOverrideTime")
        {
            float time = (float)parameters[0];
            return(mFunction.ConditionIsStandingOverrideTime(time));
        }
        else if (condition == "ConditionIsInSafaArea")
        {
            return(mFunction.ConditionIsInSafaArea());
        }
        else if (condition == "ConditionIsInWildScene")
        {
            return(mFunction.ConditionIsInWildScene());
        }
        else if (condition == "ConditionPlayerIsControlling")
        {
            return(mFunction.ConditionPlayerIsControlling());
        }
        else if (condition == "ConditionIsHaveFollowInfo")
        {
            return(mFunction.ConditionIsHaveFollowInfo());
        }
        else if (condition == "ConditionIsFarAwayFollowActor")
        {
            return(mFunction.ConditionIsFarAwayFollowActor());
        }
        else if (condition == "ConditionIsInChaosState")
        {
            return(mFunction.ConditionIsInChaosState());
        }
        else if (condition == "ConditionFollowActorIsAttacked")
        {
            return(mFunction.ConditionFollowActorIsAttacked());
        }
        else if (condition == "ConditionIsIdle")
        {
            return(mFunction.ConditionIsIdle());
        }
        else if (condition == "ConditionSelectSkillInCanFire")
        {
            return(mFunction.ConditionSelectSkillInCanFire());
        }
        else if (condition == "ConditionIsWalking")
        {
            return(mFunction.ConditionIsWalking());
        }
        else if (condition == "ConditionIsAttacking")
        {
            return(mFunction.ConditionIsAttacking());
        }
        else if (condition == "ConditionIsAttackingOrBeAttacking")
        {
            return(mFunction.ConditionIsAttackingOrBeAttacking());
        }
        else if (condition == "ConditionTargetSkillIsInBeforeSkillActionEndingStage")
        {
            return(mFunction.ConditionTargetSkillIsInBeforeSkillActionEndingStage());
        }
        else if (condition == "ConditionIsWalkingToOriginalPos")
        {
            return(mFunction.ConditionIsWalkingToOriginalPos());
        }
        else if (condition == "ConditionIsWalkingToDropPos")
        {
            return(mFunction.ConditionIsWalkingToDropPos());
        }
        else if (condition == "ConditionIsWalkingToCollectionPos")
        {
            return(mFunction.ConditionIsWalkingToCollectionPos());
        }
        else if (condition == "ConditionIsFarAwayParentActor")
        {
            float distanceSquare = 0f;

            if (parameters.Length >= 1)
            {
                distanceSquare = (float)parameters[0];
            }

            return(mFunction.ConditionIsFarAwayParentActor(distanceSquare));
        }
        else if (condition == "ConditionIsNearParentActor")
        {
            float distanceSquare = 0f;

            if (parameters.Length >= 1)
            {
                distanceSquare = (float)parameters[0];
            }

            return(mFunction.ConditionIsNearParentActor(distanceSquare));
        }
        else
        {
            AIHelper.WriteErrorLog("BehaviourAI.RunConditionImplement can not find condition:" + condition, this);
        }

        return(true);
    }
示例#10
0
    public override string GetNextMove(IPlayer player, IEnumerable <IPlayer> visiblePlayers, LegacyMap map)
    {
        // Dropper nos ressoruces si on est colles a la maison
        if (Point.DistanceManhatan(player.HouseLocation, player.Position) == 0 && player.CarriedResources > 0)
        {
            return(AIHelper.CreateEmptyAction());
        }

        // Verifier si on doit rentrer pour drop nos ressources
        if (player.CarryingCapacity - player.CarriedResources < 100)
        {
            Move moveTowardsHome = new Move(player, map, player.HouseLocation);
            return(moveTowardsHome.NextAction(map, player));
        }

        // Trouver le filon le plus proche
        Point closestMineralPosition = GetClosestMineralPosition(player, map);

        // Si le filon le plus proche renvoit la maison, ca veut dire quon ne truove rien proche de nous. Nous allons donc aller explorer.
        //if (closestMineralPosition.X == player.HouseLocation.X && closestMineralPosition.Y == player.HouseLocation.Y)
        //{
        //    Random random = new Random();
        //    int randomlyGeneratedNumber = random.Next(1, 3);
        //    if (randomlyGeneratedNumber == 1)
        //    {
        //        Move moveTowardsHome = new Move(player, map, new Point(player.Position.X + 1, player.Position.Y));
        //        return moveTowardsHome.NextAction(map, player);
        //    }
        //    else
        //    {
        //        Move moveTowardsHome = new Move(player, map, new Point(player.Position.X, player.Position.Y -1));
        //        return moveTowardsHome.NextAction(map, player);
        //    }
        //}
        Console.WriteLine("");

        // Sinon, good, on a qqch a miner. On trouve la case a partir de laquelle on va miner
        Point closestMineralAdjacentPosition = GetClosestFreeAdjacentPosition(player, closestMineralPosition, map);

        // Si on est colles au filon, le miner
        if (Point.DistanceManhatan(closestMineralPosition, player.Position) <= 1)
        {
            return(AIHelper.CreateCollectAction(new Point(closestMineralPosition.X - player.Position.X,
                                                          closestMineralPosition.Y - player.Position.Y)));
        }

        // Si aller passer par la maison avant daller au filon ne nous ralenti pas, on va aller a la maison tds
        // Verifier si on doit rentrer pour drop nos ressources
        if ((player.CarriedResources >= 500) &&
            ((player.Position.X <= player.HouseLocation.X && closestMineralAdjacentPosition.X >= player.HouseLocation.X &&
              player.Position.Y <= player.HouseLocation.Y && closestMineralAdjacentPosition.Y >= player.HouseLocation.Y)

             || (player.Position.X <= player.HouseLocation.X && closestMineralAdjacentPosition.X >= player.HouseLocation.X &&
                 player.Position.Y >= player.HouseLocation.Y && closestMineralAdjacentPosition.Y <= player.HouseLocation.Y)

             || (player.Position.X >= player.HouseLocation.X && closestMineralAdjacentPosition.X <= player.HouseLocation.X &&
                 player.Position.Y >= player.HouseLocation.Y && closestMineralAdjacentPosition.Y <= player.HouseLocation.Y)

             || (player.Position.X >= player.HouseLocation.X && closestMineralAdjacentPosition.X <= player.HouseLocation.X &&
                 player.Position.Y <= player.HouseLocation.Y && closestMineralAdjacentPosition.Y >= player.HouseLocation.Y)))
        {
            Move moveTowardsHome = new Move(player, map, player.HouseLocation);
            return(moveTowardsHome.NextAction(map, player));
        }

        // Si on est pas colles, quon rentre pas, aller vers le filon
        Move moveTowardsMineral = new Move(player, map, closestMineralAdjacentPosition);

        return(moveTowardsMineral.NextAction(map, player));
    }
示例#11
0
        /// <summary>
        /// Implement your bot here.
        /// </summary>
        /// <param name="map">The gamemap.</param>
        /// <param name="visiblePlayers">Players that are visible to your bot.</param>
        /// <returns>The action you wish to execute.</returns>
        internal string ExecuteTurn(Map map, IEnumerable <IPlayer> visiblePlayers)
        {
            Console.WriteLine("My pos = " + PlayerInfo.Position.ToString());
            Console.WriteLine("House  = " + PlayerInfo.HouseLocation.ToString());
            Console.WriteLine("Total  = " + PlayerInfo.TotalResources.ToString());
            Console.WriteLine("Collect= " + PlayerInfo.CollectingSpeed.ToString());
            Console.WriteLine("Carryin= " + PlayerInfo.CarryingCapacity.ToString());
            Console.WriteLine("Atk    = " + PlayerInfo.AttackPower.ToString());
            Console.WriteLine("Def    = " + PlayerInfo.Defence.ToString());
            Console.WriteLine("Health = " + PlayerInfo.Health.ToString());
            Console.WriteLine("Max Hea= " + PlayerInfo.MaxHealth.ToString());
            Console.WriteLine("C1     = " + (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                                             PlayerInfo.TotalResources >= 10000 &&
                                             PlayerInfo.CollectingSpeed == 1).ToString());
            Console.WriteLine("C2     = " + (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                                             PlayerInfo.TotalResources >= 10000 &&
                                             PlayerInfo.CarryingCapacity == 1000).ToString());


            //Bypass upgrade
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 10000 &&
                PlayerInfo.CarryingCapacity == 1000)
            {
                Console.WriteLine("Buying a Carrying Capacity");
                return(AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 10000 &&
                PlayerInfo.CarryingCapacity == 1250)
            {
                Console.WriteLine("Buying a Carrying Capacity");
                return(AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 10000 &&
                PlayerInfo.AttackPower == 1)
            {
                Console.WriteLine("Buying a Attack");
                return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 10000 &&
                PlayerInfo.Defence == 1)
            {
                Console.WriteLine("Buying a Defence");
                return(AIHelper.CreateUpgradeAction(UpgradeType.Defence));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 15000 &&
                PlayerInfo.AttackPower == 2)
            {
                Console.WriteLine("Buying a Attack");
                return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 15000 &&
                PlayerInfo.Defence == 2)
            {
                Console.WriteLine("Buying a Defence");
                return(AIHelper.CreateUpgradeAction(UpgradeType.Defence));
            }
            if (PlayerInfo.Position == PlayerInfo.HouseLocation &&
                PlayerInfo.TotalResources >= 25000 &&
                PlayerInfo.AttackPower == 4)
            {
                Console.WriteLine("Buying a Attack");
                return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
            }

            //fin des upgrades


            //update map of the world
            worldMap.UpdateMap(map.GetVisibleTiles());
            //worldMap.UpdateOtherPLayerMap(gameInfo.OtherPlayers);
            StrategyManager.PickStrategy(PlayerInfo, visiblePlayers, worldMap);
            return(StrategyManager.currentStrategy.GetNextMove(PlayerInfo, visiblePlayers, worldMap));

            /*string action = null;
             *
             * Console.WriteLine("Collect= " + PlayerInfo.CollectingSpeed.ToString());
             * Console.WriteLine("Carryin= " + PlayerInfo.CarryingCapacity.ToString());
             * =======
             *
             *
             * //Bypass upgrade
             * if (PlayerInfo.Position == PlayerInfo.HouseLocation && !alreadyTriedToBuy)
             * {
             *  Console.WriteLine("Buying a Carrying Capacity");
             *  alreadyTriedToBuy = true;
             *  return AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity);
             * }
             * if (PlayerInfo.Position != PlayerInfo.HouseLocation)
             * {
             *  alreadyTriedToBuy = false;
             * }
             *
             *
             *
             * //update map of the world
             * worldMap.UpdateMap(map.GetVisibleTiles());
             * //worldMap.UpdateOtherPLayerMap(gameInfo.OtherPlayers);
             * StrategyManager.PickStrategy();
             * return StrategyManager.currentStrategy.GetNextMove(PlayerInfo, visiblePlayers, worldMap);
             *
             * /*string action = null;
             *
             * string action = null;
             * while (action == null)
             * {
             *  if (currentAction == null)
             *  {
             *      currentAction = strategy.NextAction(worldMap, PlayerInfo);
             *      if (currentAction == null)
             *      {
             *          break;
             *      }
             *      //log(currentAction.ToString());
             *  }
             *  action = currentAction.NextAction(worldMap, PlayerInfo);
             *  if (action == null)
             *  {
             *      currentAction = null;
             *  }
             * }
             *
             * return action;*/
        }
示例#12
0
 public override void Update(GameTime gameTime)
 {
     AIHelper.SmallAttackingShipAI(this, gameTime);
     base.Update(gameTime);
 }
示例#13
0
 private void chooseStrategyRandomly()
 {
     currentStrategy      = AIHelper.getRandomAIStrategyType();
     currentRandomDelay   = Random.Range(0, gameConfig.shootMaximumDelay);
     isCompletingStrategy = false;
 }
        // Iterate the ammoModePairs on the weapon to find the highest direct damage, heat damage, and stab damage
        private static (WeaponAttackEval damage, WeaponAttackEval heat, WeaponAttackEval stab) OptimizeAmmoPairForAttack(Weapon weapon, AttackDetails details)
        {
            WeaponAttackEval damage = new WeaponAttackEval()
            {
                Weapon = weapon
            };
            WeaponAttackEval heat = new WeaponAttackEval()
            {
                Weapon = weapon
            };
            WeaponAttackEval stab = new WeaponAttackEval()
            {
                Weapon = weapon
            };

            BehaviorTree bTree = details.Attacker.BehaviorTree;

            try
            {
                float attackTypeWeight = AIHelper.GetCachedBehaviorVariableValue(bTree, BehaviorVariableName.Float_ShootingDamageMultiplier).FloatVal;;

                // Damage prediction assumes an attack quality of Solid. It doesn't apply targetMultis either
                Dictionary <AmmoModePair, WeaponFirePredictedEffect> damagePredictions = CleverGirlHelper.gatherDamagePrediction(weapon, details.AttackPosition, details.Target);
                foreach (KeyValuePair <AmmoModePair, WeaponFirePredictedEffect> kvp in damagePredictions)
                {
                    AmmoModePair ammoModePair = kvp.Key;
                    WeaponFirePredictedEffect weaponFirePredictedEffect = kvp.Value;
                    Mod.Log.Debug?.Write($" - Evaluating ammoId: {ammoModePair.ammoId} with modeId: {ammoModePair.modeId}");

                    WeaponAttackEval wae = new WeaponAttackEval()
                    {
                        Weapon = weapon, AmmoMode = ammoModePair
                    };
                    foreach (DamagePredictionRecord dpr in weaponFirePredictedEffect.predictDamage)
                    {
                        Hostility targetHostility = SharedState.Combat.HostilityMatrix.GetHostility(details.Attacker.team, dpr.Target.team);
                        if (targetHostility == Hostility.FRIENDLY)
                        {
                            // Friendly and self damage weights directly into a self damage, and doesn't contribute to any attacks
                            float damageMulti;
                            if (details.Attacker.GUID == dpr.Target.GUID)
                            {
                                damageMulti = Mod.Config.Weights.DamageMultis.Self;
                            }
                            else
                            {
                                damageMulti = Mod.Config.Weights.DamageMultis.Friendly;
                            }

                            wae.EVFriendlyDmg += dpr.ToHit * dpr.Normal * damageMulti;
                            wae.EVFriendlyDmg += dpr.ToHit * dpr.AP * damageMulti;
                            wae.EVFriendlyDmg += dpr.ToHit * dpr.Heat * damageMulti;
                            wae.EVFriendlyDmg += dpr.ToHit * dpr.Instability * damageMulti;
                        }
                        else if (targetHostility == Hostility.NEUTRAL)
                        {
                            // Neutrals are weighted lower, to emphasize attacking enemies more directly
                            wae.EVDirectDmg += dpr.ToHit * dpr.Normal * Mod.Config.Weights.DamageMultis.Neutral;
                            wae.EVStructDam += dpr.ToHit * dpr.AP * Mod.Config.Weights.DamageMultis.Neutral;
                            wae.EVHeat      += dpr.ToHit * dpr.Heat * Mod.Config.Weights.DamageMultis.Neutral;
                            wae.EVStab      += dpr.ToHit * dpr.Instability * Mod.Config.Weights.DamageMultis.Neutral;
                        }
                        else
                        {
                            wae.EVDirectDmg += dpr.ToHit * dpr.Normal;
                            wae.EVStructDam += dpr.ToHit * dpr.AP;
                            wae.EVHeat      += dpr.ToHit * dpr.Heat;
                            wae.EVStab      += dpr.ToHit * dpr.Instability;
                        }
                        if (!dpr.isAoE && dpr.ToHit > wae.ToHit)
                        {
                            wae.ToHit = dpr.ToHit;
                        }
                    }

                    if ((wae.EVDirectDmg + wae.EVStructDam) >= (damage.EVDirectDmg + damage.EVStructDam))
                    {
                        damage = wae;
                    }
                    if (wae.EVHeat >= heat.EVHeat)
                    {
                        heat = wae;
                    }
                    if (wae.EVStructDam >= stab.EVStructDam)
                    {
                        stab = wae;
                    }
                }
            }
            catch (Exception e)
            {
                Mod.Log.Error?.Write(e, "Failed to calculate weapon damageEV!");
            }

            return(damage, heat, stab);
        }
示例#15
0
        /// <summary>
        /// Implement your bot here.
        /// </summary>
        /// <param name="map">The gamemap.</param>
        /// <param name="visiblePlayers">Players that are visible to your bot.</param>
        /// <returns>The action you wish to execute.</returns>
        internal string ExecuteTurn(Map map, IEnumerable <IPlayer> visiblePlayers)
        {
            getInterestingObjects(map, PlayerInfo.Position);
            objects.Sort((x, y) => x.priority.CompareTo(y.priority));
            Point nextMove;

            if (PlayerInfo.Position == PlayerInfo.HouseLocation)
            {
                nextMove = new Point();
                if (PlayerInfo.GetUpgradeLevel(UpgradeType.Defence) == 0 && PlayerInfo.TotalResources >= upgrades[0])
                {
                    return(AIHelper.CreateUpgradeAction(UpgradeType.Defence));
                }
                if (PlayerInfo.GetUpgradeLevel(UpgradeType.CarryingCapacity) == 0 && PlayerInfo.TotalResources >= upgrades[0])
                {
                    return(AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity));
                }
                if (PlayerInfo.GetUpgradeLevel(UpgradeType.AttackPower) == 0 && PlayerInfo.TotalResources >= upgrades[0])
                {
                    return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
                }
                if (PlayerInfo.GetUpgradeLevel(UpgradeType.CarryingCapacity) == 1 && PlayerInfo.TotalResources >= upgrades[1])
                {
                    return(AIHelper.CreateUpgradeAction(UpgradeType.CarryingCapacity));
                }
                if (PlayerInfo.GetUpgradeLevel(UpgradeType.CollectingSpeed) == 0 && PlayerInfo.TotalResources >= upgrades[0])
                {
                    return(AIHelper.CreateUpgradeAction(UpgradeType.CollectingSpeed));
                }
            }

            if (PlayerInfo.TotalResources >= 30000 && !PlayerInfo.CarriedItems.Contains(PurchasableItem.Backpack))
            {
                Point shopLocation = map.GetVisibleTiles().FirstOrDefault(x => x.TileType == TileContent.Shop)?.Position;

                if (shopLocation == null)
                {
                    TileContent tileToTheLeft = map.GetTileAt(PlayerInfo.Position.X - 1, PlayerInfo.Position.Y);
                    nextMove = tileToTheLeft != TileContent.Resource && tileToTheLeft != TileContent.Lava ? new Point(-1, 0) : new Point(0, 1);
                }
                else
                {
                    nextMove = new PathFinder(map, PlayerInfo.Position, shopLocation).FindNextMove();
                }

                if (Point.DistanceSquared(PlayerInfo.Position, shopLocation) == 1)
                {
                    return(AIHelper.CreatePurchaseAction(PurchasableItem.Backpack));
                }
            }
            else if (PlayerInfo.CarriedResources == PlayerInfo.CarryingCapacity || objects.Count == 0)
            {
                nextMove = new PathFinder(map, PlayerInfo.Position, PlayerInfo.HouseLocation).FindNextMove();
            }
            else
            {
                nextMove = new PathFinder(map, PlayerInfo.Position, objects[0].position).FindNextMove();
            }
            Point shouldIStayOrShouldIGoNow = PlayerInfo.Position + nextMove;

            TileContent content = map.GetTileAt(shouldIStayOrShouldIGoNow.X, shouldIStayOrShouldIGoNow.Y);

            switch (content)
            {
            case TileContent.Empty:
            case TileContent.House:
                return(AIHelper.CreateMoveAction(nextMove));

            case TileContent.Resource:
                return(AIHelper.CreateCollectAction(nextMove));

            case TileContent.Wall:
                return(AIHelper.CreateMeleeAttackAction(nextMove));

            case TileContent.Player:
                return(AIHelper.CreateMeleeAttackAction(nextMove));

            default:
                return(AIHelper.CreateEmptyAction());
            }
        }
示例#16
0
 private void EnemyMove()
 {
     //Todo: анимацию для хода противника
     AIHelper.MakeMove(enemyInfo);
 }
示例#17
0
文件: Bot.cs 项目: LHGames-2018/ASE
        internal string ExecuteTurn(Map map, IEnumerable <IPlayer> visiblePlayers)
        {
            // TODO: Implement your AI here.
            string instruction = "";

            map.VisibleDistance = 20;
            List <Tile> visibleTiles = map.GetVisibleTiles().ToList();

            ressourceTiles = visibleTiles.Where(t => t.TileType == TileContent.Resource).ToList();
            enemiesTiles   = visibleTiles.Where(t => t.TileType == TileContent.Player).ToList();

            DistanceFromTiles dist = new DistanceFromTiles(TrouverDistanceEntreDeuxPoints);

            Point destination = PlayerInfo.HouseLocation;



            Tuple <Point, TileContent> nextMove = null;

            switch (listTitlePriority[0])
            {
            case TileContent.House:
                nextMove = checkNextTile(map, destination);
                break;

            case TileContent.Lava:
                break;

            case TileContent.Player:
                if (enemiesTiles.Count != 0)
                {
                    enemiesTiles = enemiesTiles.OrderBy(p => dist(p.Position, PlayerInfo.Position)).ToList();
                }
                nextMove = checkNextTile(map, enemiesTiles[1].Position);
                break;

            case TileContent.Resource:
                if (ressourceTiles.Count != 0)
                {
                    ressourceTiles = ressourceTiles.OrderBy(t => dist(t.Position, PlayerInfo.Position)).ToList();
                    destination    = ressourceTiles[0].Position;
                }
                nextMove = checkNextTile(map, destination);
                break;

            case TileContent.Shop:
                break;

            case TileContent.Wall:
                break;
            }



            switch (nextMove.Item2)
            {
            case TileContent.Empty:
                instruction = AIHelper.CreateMoveAction(nextMove.Item1 - this.PlayerInfo.Position);
                break;

            case TileContent.House:
                instruction = AIHelper.CreateMoveAction(nextMove.Item1 - this.PlayerInfo.Position);
                //nextMove = checkNextTile(map, closestResource.Position);
                break;

            case TileContent.Lava:
                break;

            case TileContent.Resource:
                instruction = AIHelper.CreateCollectAction(nextMove.Item1 - this.PlayerInfo.Position);
                break;

            case TileContent.Shop:
                break;

            case TileContent.Player:
                instruction = AIHelper.CreateMeleeAttackAction(nextMove.Item1 - this.PlayerInfo.Position);
                break;

            case TileContent.Wall:
                instruction = AIHelper.CreateMeleeAttackAction(nextMove.Item1 - this.PlayerInfo.Position);
                break;
            }

            if (vertical < 20)
            {
                vertical++;
                instruction = AIHelper.CreateMoveAction(PlayerInfo.HouseLocation - this.PlayerInfo.Position);
            }

            var data = StorageHelper.Read <TestClass>("Test");

            Console.WriteLine(data?.Test);
            return(instruction);//AIHelper.CreateCollectAction(new Point(1, 0));
            //return AIHelper.CreateMoveAction(new Point(-1, 0));
        }
示例#18
0
    public override Actor GetDefaultTargetActor()
    {
        Monster monster = mRunningProperty.SelfActor as Monster;

        if (monster == null)
        {
            return(null);
        }

        //if (monster is Pet)
        //{
        //    if (!SceneHelp.Instance.IsInSingleInstance())
        //    {
        //        return null;
        //    }
        //}

        Actor targetActor = null;
        float shortest    = float.MaxValue;
        Actor localPlayer = Game.GetInstance().GetLocalPlayer();

        // 有没有强制目标
        //Spartan.MonsterGroupInfo monsterGroupInfo = monster.SpartanMonsterGroupInfo;

        //if(monsterGroupInfo != null)
        //{
        //    targetActor = NpcManager.Instance.GetNpcByNpcId((uint)monsterGroupInfo.TargetNpcId);

        //    if(targetActor != null && !targetActor.IsActorInvisiable)
        //    {
        //        return targetActor;
        //    }
        //}

        float viewRange = mRunningProperty.ViewRange * mRunningProperty.ViewRange;

        if (InstanceManager.Instance.IsPlayerVSPlayerType)
        {
            if (mRunningProperty.SelfActor.ParentActor == null)
            {
                return(null);
            }

            foreach (var item in ActorManager.Instance.PlayerSet)
            {
                Actor oppositeActor = null;

                if (item.Value.UID != mRunningProperty.SelfActor.ParentActor.UID)
                {
                    oppositeActor = item.Value;
                    float distanceSquare = AIHelper.DistanceSquare(mRunningProperty.SelfActorPos, item.Value.transform.position);
                    shortest = distanceSquare;

                    foreach (var son in oppositeActor.SonActors)
                    {
                        if (son == null || son.IsDead() || son.IsActorInvisiable)
                        {
                            continue;
                        }

                        distanceSquare = AIHelper.DistanceSquare(mRunningProperty.SelfActorPos, son.transform.position);

                        if (distanceSquare < shortest)
                        {
                            shortest      = distanceSquare;
                            oppositeActor = son;
                        }
                    }

                    return(oppositeActor);
                }
            }
        }
        //else if (InstanceManager.Instance.InstanceType == GameConst.WAR_TYPE_ARENA)
        //{
        //    if (mRunningProperty.SelfActor.ParentActor == null)
        //    {
        //        return null;
        //    }

        //    foreach (var item in ActorManager.Instance.ActorSet)
        //    {
        //        if(item.Value.IsActorInvisiable)
        //        {
        //            continue;
        //        }

        //        if (item.Value.UID != mRunningProperty.SelfActor.ParentActor.UID)
        //        {
        //            return item.Value;
        //        }
        //    }
        //}

        // 是玩家队友
        if (localPlayer != null && monster.Camp == localPlayer.Camp)
        {
            Dictionary <UnitID, Actor> monsters = ActorManager.Instance.MonsterSet;

            // 计算出最短距离
            foreach (var item in monsters)
            {
                if (item.Value == null)
                {
                    continue;
                }

                if (item.Value.IsDead() || (item.Value.gameObject.activeSelf == false))
                {
                    continue;
                }

                if (item.Value == mRunningProperty.SelfActor.ParentActor || item.Value.IsActorInvisiable)
                {
                    continue;
                }

                if (item.Value == mRunningProperty.SelfActor)
                {
                    continue;
                }

                if (item.Value.Camp == monster.Camp)
                {
                    continue;
                }

                if (mRunningProperty.SelfActor.ParentActor != null)
                {
                    if (item.Value.ParentActor == mRunningProperty.SelfActor.ParentActor)
                    {
                        continue;
                    }
                }

                float distanceSquare = AIHelper.DistanceSquare(mRunningProperty.SelfActorPos, item.Value.transform.position);
                if (distanceSquare < shortest)
                {
                    shortest    = distanceSquare;
                    targetActor = item.Value;
                }
            }

            if (InstanceManager.Instance.InstanceType == GameConst.WAR_TYPE_WILD)
            {
                if (localPlayer != null && localPlayer.WildState == Actor.EWildState.Kill)
                {
                    Dictionary <UnitID, Actor> players = ActorManager.Instance.PlayerSet;

                    // Linq
                    //monsters = monsters.Concat(players).ToDictionary(k => k.Key, v => v.Value);

                    // 计算出最短距离
                    foreach (var item in players)
                    {
                        if (item.Value == null)
                        {
                            continue;
                        }

                        if (item.Value.IsDead() || (item.Value.gameObject.activeSelf == false))
                        {
                            continue;
                        }

                        if (item.Value == mRunningProperty.SelfActor.ParentActor || item.Value.IsActorInvisiable)
                        {
                            continue;
                        }

                        if (mRunningProperty.SelfActor.ParentActor != null)
                        {
                            if (!mRunningProperty.SelfActor.ParentActor.CheckCanAttackOtherPlayer(item.Value))
                            {
                                continue;
                            }
                        }

                        float distanceSquare = AIHelper.DistanceSquare(mRunningProperty.SelfActorPos, item.Value.transform.position);
                        if (distanceSquare < shortest)
                        {
                            shortest    = distanceSquare;
                            targetActor = item.Value;
                        }
                    }
                }

                if (shortest > viewRange)
                {
                    targetActor = null;
                }
            }

            return(targetActor);
        }

        // 先检测当前目标有没有脱离视野范围
        if (mRunningProperty.TargetActor != null && !mRunningProperty.TargetActor.IsActorInvisiable)
        {
            float distance = AIHelper.DistanceSquare(mRunningProperty.TargetActor.transform.position, mRunningProperty.SelfActorPos);

            if (distance <= viewRange && !mRunningProperty.TargetActor.IsActorInvisiable)
            {
                return(mRunningProperty.TargetActor);
            }
        }

        targetActor = Game.GetInstance().GetLocalPlayer();

        if (targetActor != null)
        {
            shortest = AIHelper.DistanceSquare(targetActor.transform.position, mRunningProperty.SelfActorPos);
        }
        else
        {
            shortest = float.MaxValue;
        }

        // 检测召唤出来的怪物
        Dictionary <UnitID, Actor> summonMonsters = ActorManager.Instance.SummonMonsterSet;

        foreach (var item in summonMonsters)
        {
            Monster monster2 = item.Value as Monster;

            if (monster2 == null)
            {
                continue;
            }

            if (monster2.BeSummonedType == Monster.BeSummonType.BE_SUMMON_BY_MONSTER)
            {
                continue;
            }

            if (monster2.IsActorInvisiable)
            {
                continue;
            }

            float distance = AIHelper.DistanceSquare(item.Value.transform.position, mRunningProperty.SelfActorPos);

            if (distance > viewRange || distance > shortest)
            {
                continue;
            }

            shortest    = distance;
            targetActor = item.Value;
        }

        // 检测场景内的NPC
        var allNpc = NpcManager.Instance.AllNpc;

        foreach (var item in allNpc)
        {
            NpcPlayer npc = item.Value.BindActor as NpcPlayer;
            if (npc.NpcData.Relationship != Neptune.Relationship.FRIENDLY)
            {
                continue;
            }

            float distance = AIHelper.DistanceSquare(npc.transform.position, mRunningProperty.SelfActorPos);

            if (distance > viewRange || distance > shortest)
            {
                continue;
            }

            if (npc.IsActorInvisiable)
            {
                continue;
            }

            shortest    = distance;
            targetActor = npc;
        }

        if (shortest > viewRange)
        {
            targetActor = null;
        }

        return(targetActor);
    }
示例#19
0
        internal string ExecuteTurn(Map map, IEnumerable <IPlayer> visiblePlayers)
        {
            //portion pathfinding pour les Mines debut
            PathNoeud           playerPosition = new PathNoeud(PlayerInfo.Position.X, PlayerInfo.Position.Y, 0, 0, null);
            List <PathNoeud>    minePosition   = new List <PathNoeud>();
            List <ResourceTile> minePosition_  = new List <ResourceTile>();

            minePosition_ = GetVisibleResourceTiles(map);
            foreach (ResourceTile rt in minePosition_)
            {
                minePosition.Add(new PathNoeud(rt.Position.X, rt.Position.Y, 0, 0, null));
            }
            List <PathNoeud> paths = new List <PathNoeud>();

            //List<PathNoeud> finalPath = new List<PathNoeud>();

            if (PlayerInfo.Position.X == PlayerInfo.HouseLocation.X)
            {
                if (PlayerInfo.Position.Y == PlayerInfo.HouseLocation.Y)
                {
                    if (CanBuy_Amelioration(PlayerInfo))
                    {
                        return(WhatToBuy_Amelioration(PlayerInfo));
                    }
                }
            }



            if (finalPath.Count() == 0)
            {
                if (MustReturnToHouse() || minePosition.Count == 0)
                {
                    int       x         = PlayerInfo.HouseLocation.X;
                    int       y         = PlayerInfo.HouseLocation.Y;
                    PathNoeud housePath = new PathNoeud(x, y, 0, 0, null);
                    PathNoeud path      = trouverPathMine(playerPosition, housePath, map, PlayerInfo);
                    paths.Add(path);
                }
                else
                {
                    foreach (PathNoeud n in minePosition)
                    {
                        PathNoeud path = trouverPathMine(playerPosition, n, map, PlayerInfo);
                        if (path != null)
                        {
                            paths.Add(path);
                        }
                    }
                }
                if (paths.Count > 0)
                {
                    PathNoeud currentPath = paths[0];
                    foreach (PathNoeud n in paths)
                    {
                        if (currentPath.getGCost() > n.getGCost())
                        {
                            currentPath = n;
                        }
                    }
                    //fin portion pathfinding
                    finalPath = new List <PathNoeud>();
                    while (currentPath != null)
                    {
                        finalPath.Add(currentPath);
                        currentPath = currentPath.getParent();
                    }
                }
            }

            // miner si a coter dune mine
            if (PlayerInfo.CarriedResources != PlayerInfo.CarryingCapacity && mineAutour(map, PlayerInfo))
            {
                int x = 0;
                int y = 0;
                for (int i = -1; i <= 1; i += 2)
                {
                    if (TileContent.Resource == map.GetTileAt(PlayerInfo.Position.X + i, PlayerInfo.Position.Y))
                    {
                        x = PlayerInfo.Position.X + i;
                        y = PlayerInfo.Position.Y;
                        return(AIHelper.CreateCollectAction(new Point(x - PlayerInfo.Position.X, y - PlayerInfo.Position.Y)));
                    }
                }
                for (int i = -1; i <= 1; i += 2)
                {
                    if (TileContent.Resource == map.GetTileAt(PlayerInfo.Position.X, PlayerInfo.Position.Y + i))
                    {
                        x = PlayerInfo.Position.X;
                        y = PlayerInfo.Position.Y + i;
                        return(AIHelper.CreateCollectAction(new Point(x - PlayerInfo.Position.X, y - PlayerInfo.Position.Y)));
                    }
                }
            }

            // se deplacer
            if (finalPath.Count > 0)
            {
                PathNoeud prochainMove = finalPath[finalPath.Count - 1];
                if (map.GetTileAt(prochainMove.getX(), prochainMove.getY()) == TileContent.Wall)
                {
                    return(AIHelper.CreateMeleeAttackAction(new Point(prochainMove.getX() - PlayerInfo.Position.X, prochainMove.getY() - PlayerInfo.Position.Y)));
                }
                else
                {
                    finalPath.Remove(prochainMove);
                    return(AIHelper.CreateMoveAction(new Point(prochainMove.getX() - PlayerInfo.Position.X, prochainMove.getY() - PlayerInfo.Position.Y)));
                }
            }



            var data = StorageHelper.Read <TestClass>("Test");

            Console.WriteLine(data?.Test);
            return(AIHelper.CreateMoveAction(new Point(_currentDirection, 0)));

            return(null);
        }
示例#20
0
        internal string MoveRandomly(Map map)
        {
            if (!moving)
            {
                Random rnd = new Random();
                randomDirection = rnd.Next(1, 5);
                randomDistance  = rnd.Next(1, MAX_RANDOM_DISTANCE);
                moving          = true;

                while (randomDirection == previousDirection)
                {
                    randomDirection = rnd.Next(1, 5);
                }
            }

            if (distanceTravelled >= randomDistance)
            {
                moving            = false;
                distanceTravelled = 0;
            }

            if (moving)
            {
                switch (randomDirection)
                {
                case 1:
                    if (MeleeTargetExists(map, 1, 0))
                    {
                        return(AIHelper.CreateMeleeAttackAction(new Point(1, 0)));
                    }
                    return(AIHelper.CreateMoveAction(new Point(1, 0)));

                case 2:
                    if (MeleeTargetExists(map, -1, 0))
                    {
                        return(AIHelper.CreateMeleeAttackAction(new Point(-1, 0)));
                    }
                    return(AIHelper.CreateMoveAction(new Point(-1, 0)));

                case 3:
                    if (MeleeTargetExists(map, 0, 1))
                    {
                        return(AIHelper.CreateMeleeAttackAction(new Point(0, 1)));
                    }
                    return(AIHelper.CreateMoveAction(new Point(0, 1)));

                case 4:
                    if (MeleeTargetExists(map, 0, -1))
                    {
                        return(AIHelper.CreateMeleeAttackAction(new Point(0, -1)));
                    }
                    return(AIHelper.CreateMoveAction(new Point(0, -1)));
                }

                distanceTravelled++;
            }

            if (distanceTravelled >= randomDistance)
            {
                moving            = false;
                distanceTravelled = 0;
            }

            var data = StorageHelper.Read <TestClass>("Test");

            return(AIHelper.CreateEmptyAction());
        }
示例#21
0
        // WARNING: Replaces the existing logic
        // isStationary here represents the attacker, not the target
        public static bool Prefix(AbstractActor unit, bool isStationary, ref BehaviorTreeResults __result)
        {
            // If there is no unit, exit immediately
            if (unit == null)
            {
                __result = new BehaviorTreeResults(BehaviorNodeState.Failure);
                return(false);
            }

            // If there are no enemies, exit immediately
            if (unit.BehaviorTree.enemyUnits.Count == 0)
            {
                Mod.Log.Info?.Write("No important enemy units, skipping decision making.");
                __result = new BehaviorTreeResults(BehaviorNodeState.Failure);
                return(false);
            }

            // Initialize decision data caches
            AEHelper.InitializeAttackOrderDecisionData(unit);

            Mod.Log.Debug?.Write($" == Evaluating attack from unit: {CombatantUtils.Label(unit)} at pos: {unit.CurrentPosition} against {unit.BehaviorTree.enemyUnits.Count} enemies.");
            BehaviorTreeResults behaviorTreeResults = null;
            AbstractActor       designatedTarget    = AEHelper.FilterEnemyUnitsToDesignatedTarget(unit.team as AITeam, unit.lance, unit.BehaviorTree.enemyUnits);

            float desTargDamage             = 0f;
            float desTargFirepowerReduction = 0f;

            if (designatedTarget != null)
            {
                desTargDamage             = AOHelper.MakeAttackOrderForTarget(unit, designatedTarget, isStationary, out behaviorTreeResults);
                desTargFirepowerReduction = AIAttackEvaluator.EvaluateFirepowerReductionFromAttack(unit, unit.CurrentPosition, designatedTarget, designatedTarget.CurrentPosition, designatedTarget.CurrentRotation, unit.Weapons, MeleeAttackType.NotSet);
                Mod.Log.Debug?.Write($"  DesignatedTarget: {CombatantUtils.Label(designatedTarget)} will suffer: {desTargDamage} damage and lose: {desTargFirepowerReduction} firepower from attack.");
            }
            else
            {
                Mod.Log.Debug?.Write("  No designated target identified.");
            }

            float behavior1 = AIHelper.GetBehaviorVariableValue(unit.BehaviorTree, BehaviorVariableName.Float_OpportunityFireExceedsDesignatedTargetByPercentage).FloatVal;
            float opportunityFireThreshold = 1f + (behavior1 / 100f);

            float behavior2 = AIHelper.GetBehaviorVariableValue(unit.BehaviorTree, BehaviorVariableName.Float_OpportunityFireExceedsDesignatedTargetFirepowerTakeawayByPercentage).FloatVal;
            float opportunityFireTakeawayThreshold = 1f + (behavior2 / 100f);

            Mod.Log.Info?.Write($"  Opportunity Fire damageThreshold: {opportunityFireThreshold}  takeawayThreshold: {opportunityFireTakeawayThreshold}");

            // Walk through every alive enemy, and see if a better shot presents itself.
            for (int j = 0; j < unit.BehaviorTree.enemyUnits.Count; j++)
            {
                ICombatant combatant = unit.BehaviorTree.enemyUnits[j];
                if (combatant == designatedTarget || combatant.IsDead)
                {
                    continue;
                }

                Mod.Log.Debug?.Write($"  Checking opportunity fire against target: {CombatantUtils.Label(combatant)}");

                AbstractActor       opportunityFireTarget = combatant as AbstractActor;
                BehaviorTreeResults oppTargAttackOrder;
                // Should MAOFT take a param for opportunity attacks to simplify?
                float oppTargDamage             = AOHelper.MakeAttackOrderForTarget(unit, combatant, isStationary, out oppTargAttackOrder);
                float oppTargFirepowerReduction = AIAttackEvaluator.EvaluateFirepowerReductionFromAttack(unit, unit.CurrentPosition, combatant, combatant.CurrentPosition, combatant.CurrentRotation, unit.Weapons, MeleeAttackType.NotSet);
                Mod.Log.Debug?.Write($"  Target will suffer: {oppTargDamage} with firepower reduction: {oppTargFirepowerReduction}");

                // TODO: Was where opportunity cost from evasion strip was added to target damage.
                //  Reintroduce utility damage to this calculation

                bool exceedsOpportunityFireThreshold = oppTargDamage > desTargDamage * opportunityFireThreshold;
                Mod.Log.Debug?.Write($"  Comparing damage - opportunity: {oppTargDamage} > designated: {designatedTarget} * threshold: {opportunityFireThreshold}");
                bool exceedsFirepowerReductionThreshold = oppTargFirepowerReduction > desTargFirepowerReduction * opportunityFireTakeawayThreshold;
                Mod.Log.Debug?.Write($"  Comparing firepower reduction - opportunity: {oppTargFirepowerReduction} vs. designated: {desTargFirepowerReduction} * threshold: {1f + opportunityFireTakeawayThreshold}");

                // TODO: Short circuit here - takes the first result, instead of the best result. Should we fix this?
                if (oppTargAttackOrder != null && oppTargAttackOrder.orderInfo != null &&
                    (exceedsOpportunityFireThreshold || exceedsFirepowerReductionThreshold))
                {
                    Mod.Log.Debug?.Write(" Taking opportunity fire attack, instead of attacking designated target.");
                    __result = oppTargAttackOrder;
                    return(false);
                }
            }

            if (behaviorTreeResults != null && behaviorTreeResults.orderInfo != null)
            {
                Mod.Log.Debug?.Write("Successfuly calculated attack order");
                unit.BehaviorTree.AddMessageToDebugContext(AIDebugContext.Shoot, "attacking designated target. Success");
                __result = behaviorTreeResults;
                return(false);
            }

            Mod.Log.Debug?.Write("Could not calculate reasonable attacks. Skipping node.");
            __result = new BehaviorTreeResults(BehaviorNodeState.Failure);

            return(false);
        }
示例#22
0
文件: Bot.cs 项目: LHGames-2018/LHoes
        private string GoTo(Point location, Map map, bool moveHorizontally)
        {
            Point direction = null;

            if (_temporaryTarget != null && PlayerInfo.Position != _temporaryTarget)
            {
                location = _temporaryTarget;
            }
            else if (PlayerInfo.Position == _temporaryTarget)
            {
                _temporaryTarget = null;
            }

            if (moveHorizontally)
            {
                if (PlayerInfo.Position.X != location.X)
                {
                    direction = new Point(MathF.Sign(location.X - PlayerInfo.Position.X), 0);
                }
                else
                {
                    return(GoTo(location, map, false));
                }

                TileContent content = map.GetTileAt(PlayerInfo.Position.X + direction.X, PlayerInfo.Position.Y + direction.Y);
                if (content != TileContent.Empty && content != TileContent.House)
                {
                    if (content == TileContent.Wall)
                    {
                        return(AIHelper.CreateMeleeAttackAction(direction));
                    }
                    else if (PlayerInfo.Position.Y == location.Y)
                    {
                        _temporaryTarget = FindTemporaryTarget(PlayerInfo.Position, location, true, map);
                    }
                    return(GoTo(location, map, false));
                }
                else
                {
                    return(AIHelper.CreateMoveAction(direction));
                }
            }
            else
            {
                if (PlayerInfo.Position.Y != location.Y)
                {
                    direction = new Point(0, MathF.Sign(location.Y - PlayerInfo.Position.Y));
                }
                else
                {
                    return(GoTo(location, map, true));
                }

                TileContent content = map.GetTileAt(PlayerInfo.Position.X + direction.X, PlayerInfo.Position.Y + direction.Y);
                if (content != TileContent.Empty && content != TileContent.House)
                {
                    if (content == TileContent.Wall)
                    {
                        return(AIHelper.CreateMeleeAttackAction(direction));
                    }
                    else if (PlayerInfo.Position.X == location.X)
                    {
                        _temporaryTarget = FindTemporaryTarget(PlayerInfo.Position, location, false, map);
                    }
                    return(GoTo(location, map, true));
                }
                else
                {
                    return(AIHelper.CreateMoveAction(direction));
                }
            }
        }
示例#23
0
 public override void Update(GameTime gameTime)
 {
     AIHelper.BigWarshipAI(this, gameTime);
     base.Update(gameTime);
 }
示例#24
0
        public override void Update(IGameTimeService gameTime)
        {
            if (IsLocalSim)
            {
                Simulate(gameTime);
                return;
            }



            if (IsDead)
            {
                return;
            }
            Weapon.Update(gameTime);
            DelayTime += gameTime.ElapsedMilliseconds; // Used for Loading.


            #region Logic

            //0 = No target(s) in range, laser at rest
            //1 = Target(s) on planet, find one
            //2 = Turn head to aim or Fire if within aim tolerance
            //3 = Fire

            switch (logicState)
            //Just FYI in case you're confused, a locally simulated turret doesn't run this code, it runs .Simulate() instead.
            {
            case LogicStates.Resting:
                if (PotentialTargets.Count > 0)
                {
                    logicState = LogicStates.SearchingForTarget;
                }

                break;

            case LogicStates.SearchingForTarget:
                FindTarget();
                if (CurrentTarget != null)
                {
                    logicState = LogicStates.TurningTowardTarget;
                }
                break;

            case LogicStates.TurningTowardTarget:
                if (CurrentTarget == null)
                {
                    logicState = LogicStates.Resting;
                    break;
                }
                else if (CurrentTarget != null && !CurrentTarget.IsBodyValid)
                {
                    PotentialTargets.Remove(CurrentTarget.Id);
                    CurrentTarget = null;
                    logicState    = LogicStates.Resting;
                    break;
                }
                else if (gameTime.TotalMilliseconds - _lastTargetCheckTime > 200)
                //Retargets closest item 5 times per second
                //Retargeting is expensive, if turrets lag this needs to be rethought
                {
                    _lastTargetCheckTime = (float)gameTime.TotalMilliseconds;
                    CurrentTarget        = null;
                    logicState           = LogicStates.Resting;
                    break;
                }
                else if (Vector2.Distance(CurrentTarget.Position, Position) > turretRange)
                {
                    CurrentTarget = null;
                    logicState    = LogicStates.Resting;
                    break;
                }


                Rotation = AIHelper.TurnTowardPosition(
                    Rotation, rotationSpeed,
                    Position, CurrentTarget.Position,
                    gameTime.ElapsedMilliseconds, AimTolerance
                    ).Rotation;



                break;
            }

            #endregion

            OldTime += gameTime.ElapsedMilliseconds; // Updates Time since Last Action
        }
示例#25
0
    public static Actor GetNearestActor(AIRunningProperty runningProperty, Dictionary <UnitID, Actor> actors, Vector3 targetPos)
    {
        if (actors == null || runningProperty == null)
        {
            return(null);
        }

        Actor targetActor = null;

        float shortest  = float.MaxValue;
        float viewRange = runningProperty.ViewRange * runningProperty.ViewRange;

        bool show_tips = false;

        // 计算出最短距离

        foreach (var item in actors)
        {
            if (item.Value == null)
            {
                continue;
            }

            if (item.Value.transform == null)
            {
                continue;
            }

            if (!TargetPositionHeightIsAbnormal(item.Value.transform.position))
            {
                continue;
            }

            if (runningProperty.SelfActor is LocalPlayer || runningProperty.SelfActor.ParentActor is LocalPlayer)
            {
                show_tips = false;
                if (PKModeManagerEx.Instance.IsLocalPlayerCanAttackActor(item.Value, ref show_tips) == false)
                {
                    continue;
                }
            }

            if (item.Value.IsDead() || (item.Value.gameObject.activeSelf == false))
            {
                continue;
            }

            if (item.Value.IsActorInvisiable)
            {
                continue;
            }

            if (item.Value is Pet)
            {
                continue;
            }

            if (item.Value.Camp == runningProperty.SelfActor.Camp)
            {
                continue;
            }

            float distanceSquare = AIHelper.DistanceSquare(targetPos, item.Value.transform.position);
            if (distanceSquare < shortest)
            {
                shortest    = distanceSquare;
                targetActor = item.Value;
            }
        }

        if (shortest > viewRange)
        {
            targetActor = null;
        }

        return(targetActor);
    }
示例#26
0
    public override string GetNextMove(IPlayer player, IEnumerable <IPlayer> visiblePlayers, LegacyMap map)
    {
        Point direction = new Point(ennemy.Position.X - player.Position.X, ennemy.Position.Y - player.Position.Y);

        return(AIHelper.CreateMeleeAttackAction(direction));
    }
示例#27
0
 public float GetAngleToTarget(Vector2 target)
 {
     return(AIHelper.GetAngleToTarget(Position, Rotation, target));
 }
示例#28
0
    protected virtual BehaviourTree.BehaviourReturnCode RunActionImplement(string action, object[] parameters)
    {
        if (action == "ActionFireEvent")
        {
            int eventId = (int)parameters[0];
            return(mFunction.ActionFireEvent(eventId));
        }
        else if (action == "ActionTestRun")
        {
            return(mFunction.ActionTestRun());
        }
        else if (action == "ActionReturnCode")
        {
            int returnCode = 0;
            if (parameters.Length >= 1)
            {
                returnCode = (int)parameters[0];
            }

            return(mFunction.ActionReturnCode(returnCode));
        }
        else if (action == "ActionChaseTarget")
        {
            return(mFunction.ActionChaseTarget());
        }
        else if (action == "ActionAttack")
        {
            return(mFunction.ActionAttack());
        }
        else if (action == "ActionTryAttack")
        {
            return(mFunction.ActionTryAttack());
        }
        else if (action == "ActionStand")
        {
            return(mFunction.ActionStand());
        }
        else if (action == "ActionSetMostHateActorToTarget")
        {
            return(mFunction.ActionSetMostHateActorToTarget());
        }
        else if (action == "ActionSetPlayerToTarget")
        {
            return(mFunction.ActionSetPlayerToTarget());
        }
        else if (action == "ActionSetMonsterToTarget")
        {
            return(mFunction.ActionSetMonsterToTarget());
        }
        else if (action == "ActionDoNothing")
        {
            return(mFunction.ActionDoNothing());
        }
        else if (action == "ActionSetDefaultActorToTarget")
        {
            return(mFunction.ActionSetDefaultActorToTarget());
        }
        else if (action == "ActionSetNeedCounterattackPlayerToTarget")
        {
            return(mFunction.ActionSetNeedCounterattackPlayerToTarget());
        }
        else if (action == "ActionSetPlayerOrMonsterToTarget")
        {
            return(mFunction.ActionSetPlayerOrMonsterToTarget());
        }
        else if (action == "ActionCleanCanNotAttackTarget")
        {
            return(mFunction.ActionCleanCanNotAttackTarget());
        }
        else if (action == "ActionSuicide")
        {
            return(mFunction.ActionSuicide());
        }
        else if (action == "ActionPatrol")
        {
            bool setCenterPos = false;
            if (parameters.Length >= 1)
            {
                setCenterPos = (bool)parameters[0];
            }

            return(mFunction.ActionPatrol(setCenterPos));
        }
        else if (action == "ActionSetAILevelHpBeacons")
        {
            float beacon1 = (float)parameters[0];
            float beacon2 = 0.0f;

            // 是不是有三级AI还是有二级AI
            if (parameters.Length > 1)
            {
                beacon2 = (float)parameters[1];
            }

            int beaconType = 0;

            if (parameters.Length > 2)
            {
                beaconType = (int)parameters[2];
            }

            return(mFunction.ActionSetAILevelHpBeacons(beacon1, beacon2, beaconType));
        }
        else if (action == "ActionFollowPlayer")
        {
            return(mFunction.ActionFollowPlayer());
        }
        else if (action == "ActionSelectSkillAttack")
        {
            int skillId = (int)parameters[0];
            return(mFunction.ActionSelectSkillAttack(skillId));
        }
        else if (action == "ActionSetLastSkillAndTargetToCurrent")
        {
            return(mFunction.ActionSetLastSkillAndTargetToCurrent());
        }
        else if (action == "ActionWalkToOriginalPos")
        {
            return(mFunction.ActionWalkToOriginalPos());
        }
        else if (action == "ActionTeleportToParentActorRangeRandomPosition")
        {
            float nearRadius = 0;
            float farRadius  = 0;

            if (parameters.Length >= 1)
            {
                nearRadius = (float)parameters[0];
            }
            if (parameters.Length >= 2)
            {
                farRadius = (float)parameters[1];
            }

            return(mFunction.ActionTeleportToParentActorRangeRandomPosition(nearRadius, farRadius));
        }
        else if (action == "ActionWalkToParentActorRangeRandomPosition")
        {
            float nearRadius = 0;
            float farRadius  = 0;

            if (parameters.Length >= 1)
            {
                nearRadius = (float)parameters[0];
            }
            if (parameters.Length >= 2)
            {
                farRadius = (float)parameters[1];
            }

            return(mFunction.ActionWalkToParentActorRangeRandomPosition(nearRadius, farRadius));
        }
        else
        {
            AIHelper.WriteErrorLog("BehaviourAI.RunActionImplement can not find action:" + action, this);
        }

        return(BehaviourTree.BehaviourReturnCode.Success);
    }
示例#29
0
        public override void Simulate(IGameTimeService gameTime)
        {
            if (!IsBodyValid)
            {
                return;
            }
            Weapon.Update(gameTime);
            DelayTime += gameTime.ElapsedMilliseconds; // Used for Loading.

            #region Logic


            if (logicState != LogicStates.Resting && (CurrentTarget == null || !CurrentTarget.IsBodyValid))
            {
                CurrentTarget = null;
                logicState    = LogicStates.SearchingForTarget;
            }
            switch (logicState)
            {
            case LogicStates.Resting:
                if (PotentialTargets.Count > 0)
                {
                    logicState = LogicStates.SearchingForTarget;
                }

                break;

            case LogicStates.SearchingForTarget:
                FindTarget();
                if (CurrentTarget != null)
                {
                    logicState = LogicStates.TurningTowardTarget;
                }
                break;

            case LogicStates.TurningTowardTarget:
                if (!CurrentTarget.IsBodyValid)
                {
                    PotentialTargets.Remove(CurrentTarget.Id);
                    CurrentTarget = null;
                    logicState    = LogicStates.Resting;
                    break;
                }

                if (gameTime.TotalMilliseconds - _lastTargetCheckTime > 200)    //Retargets closest item 5 times per second
                //Retargeting is expensive, if turrets lag this needs to be rethought
                {
                    _lastTargetCheckTime = (float)gameTime.TotalMilliseconds;
                    CurrentTarget        = null;
                    logicState           = LogicStates.Resting;
                    break;
                }


                if (Vector2.Distance(CurrentTarget.Position, Position) > turretRange)
                {
                    CurrentTarget = null;
                    logicState    = LogicStates.Resting;
                    break;
                }


                var result = AIHelper.TurnTowardPosition(Rotation, rotationSpeed, Position, CurrentTarget.Position, gameTime.ElapsedMilliseconds, AimTolerance);

                Rotation = result.Rotation;

                if (!result.Rotated)
                {
                    if (Weapon.CanFire())
                    {
                        Weapon.TimeOfWaitStart = gameTime.TotalMilliseconds;
                        Weapon.Fire_LocalOrigin(Rotation, 0, true);
                        Weapon.WaitingForFireResponse = true;
                    }
                }
                break;
            }

            #endregion

            OldTime += gameTime.ElapsedMilliseconds; // Updates Time since Last Action
        }
示例#30
0
        /// <summary>
        /// Implement your bot here.
        /// </summary>
        /// <param name="map">The gamemap.</param>
        /// <param name="visiblePlayers">Players that are visible to your bot.</param>
        /// <returns>The action you wish to execute.</returns>
        internal string ExecuteTurn(Map map, IEnumerable <IPlayer> visiblePlayers)
        {
            worldMap = WorldMap.ReadMap();
            if (worldMap == null || worldMap.HomePosition != PlayerInfo.HouseLocation)
            {
                worldMap = new WorldMap();
            }
            worldMap.UpdateWorldMap(map);
            worldMap.HomePosition = PlayerInfo.HouseLocation;
            WorldMap.WriteMap(worldMap);
            this.astarService     = new AStarAlgo(worldMap);
            this.ressourcePlaner  = new RessourcePlaner(worldMap, PlayerInfo, astarService);
            this.navigationHelper = new NavigationHelper(PlayerInfo, astarService);
            this.manathan         = new Manathan();
            this.placePlaner      = new PlacePlaner(map, PlayerInfo, astarService);

            Console.WriteLine("Cash : " + PlayerInfo.TotalResources);

            try
            {
                var best_ressource = ressourcePlaner.GetBestRessourcePath();
                //var best_place_for_shop = placePlaner.GetBestPlacePath(TileContent.Shop);
                //	10000	15000	25000	50000	100000
                if (PlayerInfo.Position == PlayerInfo.HouseLocation)
                {
                    bool upgrade = false;
                    switch (PlayerInfo.GetUpgradeLevel(UpgradeType.AttackPower))
                    {
                    case 0:
                        if (PlayerInfo.TotalResources >= 10000)
                        {
                            upgrade = true;
                        }
                        break;

                    case 1:
                        if (PlayerInfo.TotalResources >= 15000)
                        {
                            upgrade = true;
                        }
                        break;

                    case 2:
                        if (PlayerInfo.TotalResources >= 25000)
                        {
                            upgrade = true;
                        }
                        break;

                    case 3:
                        if (PlayerInfo.TotalResources >= 50000)
                        {
                            upgrade = true;
                        }
                        break;

                    case 4:
                        if (PlayerInfo.TotalResources >= 100000)
                        {
                            upgrade = true;
                        }
                        break;
                    }
                    if (upgrade)
                    {
                        return(AIHelper.CreateUpgradeAction(UpgradeType.AttackPower));
                    }
                }

                if (PlayerInfo.CarriedResources < PlayerInfo.CarryingCapacity && best_ressource != null)
                {
                    if (best_ressource.Path.Count == 2)
                    {
                        // On est adjacent à la meilleure ressource
                        var direction = astarService.DirectionToward(PlayerInfo.Position, best_ressource.Tile.Position);
                        return(AIHelper.CreateCollectAction(direction));
                    }
                    else if (best_ressource.Path.Count == 1)
                    {
                        // on est dessus
                        var tileToGo = map.GetTile(PlayerInfo.Position.X - 1, PlayerInfo.Position.Y);
                        var action   = navigationHelper.NavigateToNextPosition(tileToGo);
                        return(action);
                    }
                    else
                    {
                        // On est pas rendu
                        return(navigationHelper.NavigateToNextPosition(best_ressource.Path[1]));
                    }
                }
                else
                {
                    // on doit aller à la base
                    var home_tile    = worldMap.GetTile(PlayerInfo.HouseLocation.X, PlayerInfo.HouseLocation.Y);
                    var current_tile = worldMap.GetTile(PlayerInfo.Position.X, PlayerInfo.Position.Y);
                    if (home_tile == null)
                    {
                        var path = manathan.GetManathanPath(current_tile.Position, PlayerInfo.HouseLocation);
                        return(navigationHelper.NavigateToNextPosition(worldMap.GetTile(path[0].X, path[0].Y)));
                    }
                    else
                    {
                        var best_path_to_home = astarService.Run(current_tile, home_tile);

                        if (best_path_to_home == null)
                        {
                            var path = manathan.GetManathanPath(current_tile.Position, PlayerInfo.HouseLocation);
                            return(navigationHelper.NavigateToNextPosition(worldMap.GetTile(path[0].X, path[0].Y)));
                        }
                        // On est pas rendu
                        return(navigationHelper.NavigateToNextPosition(best_path_to_home[1]));
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("*** Reset the map! ***");
                Console.WriteLine(e.Message);
                Console.WriteLine(e.StackTrace);
                Console.WriteLine(e.InnerException);
                Console.WriteLine("*** inner exception ***");
                Console.WriteLine(e);
                Console.WriteLine("*** exception ***");

                worldMap = new WorldMap();
                worldMap.UpdateWorldMap(map);
                worldMap.HomePosition = PlayerInfo.HouseLocation;
                WorldMap.WriteMap(worldMap);

                return("");
            }

            /*
             *             AStarAlgo astar = new AStarAlgo(map);
             * var result = astar.Run(PlayerInfo.Position, new Point(-4, 21));
             *
             *
             * var data = StorageHelper.Read<TestClass>("Test");
             * Console.WriteLine(data?.Test);
             * //return AIHelper.CreateMoveAction(new Point(_currentDirection, 0)); astar.DirectionToward(PlayerInfo.Position, result[0].Position);
             * return AIHelper.CreateMoveAction(astar.DirectionToward(PlayerInfo.Position, result[0].Position));*/
        }