public void FindArmyInAreaListener(FindArmyInArea findArmyInArea)
        {
            Point middle = findArmyInArea.Location;

            foreach (var entity in _armies)
            {
                GeoEntity geoEntity = entity.GetComponent <GeoEntity>();
                float     distance  = Point.Distance(middle, geoEntity.Position);
                if (distance <= findArmyInArea.MaxDistance)
                {
                    findArmyInArea.Results.Add(entity);
                }
            }
        }
        public void MoveInListener(MoveInEvent moveInEvent)
        {
            FindArmyInArea findArmyInArea = new FindArmyInArea(moveInEvent.Current, 1);

            FindArmyInAreaListener(findArmyInArea);

            if (findArmyInArea.Results.Count < 2)
            {
                return;
            }

            Army attacker = findArmyInArea.Results[0].GetComponent <Army>();
            Army defender = findArmyInArea.Results[1].GetComponent <Army>();

            Debug.WriteLine($"BATTLE ENCOUNTER {attacker} VS {defender}");
            BattleEncounterEvent battleEncounterEvent = new BattleEncounterEvent(findArmyInArea.Results[0],
                                                                                 findArmyInArea.Results[1], moveInEvent.Current);

            _eventBus.Post(battleEncounterEvent);
        }
예제 #3
0
        public void Think(Entity thinker, JEventBus eventBus)
        {
            _eventBus = eventBus;
            GeoEntity geoEntity = thinker.GetComponent <GeoEntity>();
            ArmyAi    armyAi    = thinker.GetComponent <ArmyAi>();
            Army      army      = thinker.GetComponent <Army>();

            FindArmyInArea findStructureInArea = new FindArmyInArea(geoEntity.Position, armyAi.SearchRadius * 3);

            JEventBus.GetDefault().Post(findStructureInArea);

            Entity nearestEnemyArmy = null;

            foreach (var structureEntity in findStructureInArea.Results)
            {
                Army encounteredArmy = structureEntity.GetComponent <Army>();
                if (encounteredArmy.Fraction == army.Fraction)
                {
                    continue;
                }
                nearestEnemyArmy = structureEntity;
                break;
            }

            if (nearestEnemyArmy == null)
            {
                Debug.WriteLine(army + " Skip to FindStructure");
                armyAi.ArmyStateMachine.Fire(ArmyTrigger.FindStructure);
                return;
            }

            GeoEntity armyPosition = nearestEnemyArmy.GetComponent <GeoEntity>();

            GoToEvent goToEvent = new GoToEvent(thinker, armyPosition.Position);

            Debug.WriteLine(army + " Go For Battle!: " + goToEvent.Goal);
            JEventBus.GetDefault().Post(goToEvent);

            armyAi.ArmyStateMachine.Fire(ArmyTrigger.FinishAction);
        }