Exemple #1
0
    /// <summary>
    /// Orders an attack on the specified object
    /// </summary>
    /// <param name="attackableObject">Object to be attacked</param>
    public void OrderAttack(GameObject attackableObject)
    {
        if (Vector2.Distance(this.transform.position, attackableObject.rigidbody.transform.position) > GetMinimumRangeOfGroup() * 2)
        {
            Vector2 closerPosition = Vector2.MoveTowards(attackableObject.rigidbody.transform.position, this.transform.position, GetMinimumRangeOfGroup() * 2);
            OrderMove(closerPosition);
        }

        AIOrder <EnemyGroup> order = new AIOrder <EnemyGroup> {
            Orderee = this, ObjectOfInterest = attackableObject
        };

        order.AttachAction(delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            group.RotateTowards(pointOfInterest);

            group.SetBehaviour(GroupBehaviour.Attack);
            foreach (List <EnemyScript> tier in group.Children)
            {
                foreach (EnemyScript ship in tier)
                {
                    ship.SetTarget(attackableObject);
                    ship.ResetShipSpeed();
                }
            }
        });

        order.AttachCondition(delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            return((objectOfInterest == null) || (Vector2.Distance(objectOfInterest.transform.position, group.transform.position) > 50));
        });

        AddOrder(order);
    }
 public AIControlledDivision(int teamId = -1, DivisionController controller = null, bool enableAI = true)
     : base(teamId, controller)
 {
     _enableAI = enableAI;
     if (_enableAI)
     {
         //ReceiveOrder(new AIOrder(this, DivisionId));
         OrderSystem = new AIOrder(this, DivisionId);
         this.OrderSystem.OngoingOrder = new EmptyOrder();
     }
 }
Exemple #3
0
        public static void BuildTrain(TileIndex depot, StationID[] stations, Action <TileIndex, string> sign = null)
        {
            var list = new AIEngineList(AIVehicle.VT_RAIL);

            list.Valuate(AIEngine.GetMaxSpeed);
            EngineID passangerWagon = null;
            EngineID mailWagon      = null;

            foreach (var(a, b) in list)
            {
                if (AIEngine.IsBuildable(a) && !AIEngine.IsWagon(a))
                {
                    //AILog.Info(a + ": " + AIEngine.GetName(a) + " | " + AIEngine.GetMaxSpeed(a) + " | " + AIEngine.GetReliability(a) + " | " + AIEngine.GetMaxTractiveEffort(a));
                }
                else if (AIEngine.IsBuildable(a) && AIEngine.IsWagon(a))
                {
                    //AILog.Info(a + ": " + AIEngine.GetName(a) + " | " + AIEngine.GetCargoType(a));
                    if (AICargo.HasCargoClass(AIEngine.GetCargoType(a), AICargo.CC_PASSENGERS))
                    {
                        passangerWagon = a;
                        //AILog.Info("passanger");
                    }
                    else if (AICargo.HasCargoClass(AIEngine.GetCargoType(a), AICargo.CC_MAIL))
                    {
                        mailWagon = a;
                        //AILog.Info("mail");
                    }
                }
            }

            var engineType = list.Begin();
            //AILog.Info("Engine id: " + engineType);
            //AILog.Info("Building: " + AIEngine.GetName(engineType));
            var train          = AIVehicle.BuildVehicle(depot, engineType);
            var firstPassanger = AIVehicle.BuildVehicle(depot, passangerWagon);

            AIVehicle.BuildVehicle(depot, passangerWagon);
            AIVehicle.BuildVehicle(depot, passangerWagon);
            var firstMail = AIVehicle.BuildVehicle(depot, mailWagon);

            AIVehicle.MoveWagonChain(firstMail, 0, train, 0);
            AIVehicle.MoveWagonChain(firstPassanger, 0, train, 0);

            for (var i = 0; i < stations.Length; i++)
            {
                AIOrder.AppendOrder(train, AIStation.GetLocation(stations[i]), AIOrder.OF_NONE);
            }

            AIVehicle.StartStopVehicle(train);
        }
Exemple #4
0
    /// <summary>
    /// Orders a move to position
    /// </summary>
    /// <param name="position">Position to move to</param>
    public void OrderMove(Vector2 position)
    {
        float radiusOfFormation = GetRadius();

        Vector2    fromPosition = transform.position;
        GameObject collidedObject;
        bool       pathFound = CheckCanMoveTo(fromPosition, position, out collidedObject);

        List <Vector2> moveOrderPositions = new List <Vector2>();

        int count = 0;

        while (!pathFound)
        {
            fromPosition = GetPositionForAvoidance(collidedObject, position, fromPosition, 10.0f, radiusOfFormation);

            moveOrderPositions.Add(fromPosition);
            pathFound = CheckCanMoveTo(fromPosition, position, out collidedObject);

            count++;
            if (count > 20)
            {
                break;
            }
        }

        moveOrderPositions.Add(position);

        // uncomment to show movement paths
        //Debug.DrawLine(transform.position, moveOrderPositions[0], Color.red, 999);

        //for (int i = 0; i < moveOrderPositions.Count - 1; ++i)
        //{
        //    Debug.DrawLine(moveOrderPositions[i], moveOrderPositions[i + 1], Color.red, 999);
        //}

        foreach (Vector2 orderPositions in moveOrderPositions)
        {
            AIOrder <EnemyGroup> order = new AIOrder <EnemyGroup> {
                Orderee = this, PositionOfInterest = orderPositions
            };
            order.AttachAction(delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
            {
                group.RotateTowards(pointOfInterest);

                group.SetBehaviour(GroupBehaviour.StayWithSlowest);
                foreach (List <EnemyScript> tier in group.Children)
                {
                    foreach (EnemyScript ship in tier)
                    {
                        //int indexOfShip = group.Children[(int)ship.ShipSize].IndexOf(ship);

                        ship.SetMoveTarget((Vector2)pointOfInterest + ship.GetLocalFormationPosition());
                    }
                }
            });

            order.AttachCondition(delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
            {
                return(Vector2.Distance((Vector2)group.transform.position, (Vector2)pointOfInterest) < 0.8f);
            });

            AddOrder(order);
        }
    }
Exemple #5
0
 public void AddDefaultOrder(AIOrder <EnemyGroup> order)
 {
     defaultOrders.Add(order);
 }
Exemple #6
0
 public void AddOrder(AIOrder <EnemyGroup> order)
 {
     orderQueue.Add(order);
 }
Exemple #7
0
        internal bool MakeRoute(TownNode fromTown, TownNode toTown)
        {
            AILog.Warning($"Building a route from {fromTown.Name} to {toTown.Name}.");
            RoadStationInfo fromStationTile = stations[fromTown.TownId];
            RoadStationInfo toStationTile   = stations[toTown.TownId];

            Edge <TownNode> foundEdge = null;

            foreach (var edge in this.Graph.Edges)
            {
                if (((edge.Node1 == fromTown) && (edge.Node2 == toTown)) || ((edge.Node2 == fromTown) && (edge.Node1 == toTown)))
                {
                    foundEdge = edge;
                }
            }

            if (foundEdge == null)
            {
                AILog.Warning($"No route found from {fromTown.Name} to {toTown.Name}.");
                return(false);
            }

            var list = new AIEngineList(AIVehicle.VT_ROAD);

            list.Valuate(AIEngine.GetMaxSpeed);
            VehicleID vehicleId = null;

            foreach (var(engineType, _) in list)
            {
                if (AICargo.HasCargoClass(AIEngine.GetCargoType(engineType), AICargo.CC_PASSENGERS))
                {
                    var price = AIEngine.GetPrice(engineType);
                    CsTestAi.EnsureMoney(price + 1000);
                    vehicleId = AIVehicle.BuildVehicle(depots[fromTown.TownId].tile, engineType);
                    break;
                }
            }

            if (vehicleId == null)
            {
                AILog.Error("No passnger vehicle found.");
            }

            if (AIVehicle.IsValidVehicle(vehicleId))
            {
                AIOrder.AppendOrder(vehicleId, fromStationTile.tile, AIOrder.OF_NONE);
                AIOrder.AppendOrder(vehicleId, toStationTile.tile, AIOrder.OF_NONE);
                AIVehicle.StartStopVehicle(vehicleId);
                if (!vehicles.ContainsKey(foundEdge))
                {
                    vehicles.Add(foundEdge, new List <VehicleID>());
                }

                var vehicleList = vehicles[foundEdge];
                vehicleList.Add(vehicleId);
                AILog.Info($"Route contains now {vehicleList.Count} vehicles.");
                return(true);
            }

            AILog.Error("Invalid vehicle.");
            return(false);
        }
    /// <summary>
    /// Used for tying a group to a wave
    /// </summary>
    /// <param name="info_"></param>
    /// <returns></returns>
    GroupedWaveInfo CreateGroupedWaveInfo(WaveInfo info_)
    {
        GameObject groupObject = new GameObject("EnemyGroup");

        groupObject.tag = "EnemyGroup";

        groupObject.transform.position = transform.position;

        EnemyGroup spawnedGroup = groupObject.AddComponent <EnemyGroup>();

        GameObject[] defaultTargets = GameObject.FindGameObjectsWithTag(info_.GetDefaultOrderTargetTag());
        float        closest        = 0;
        GameObject   closestTarget  = null;

        foreach (GameObject potentialTarget in defaultTargets)
        {
            if (closestTarget == null || Vector2.SqrMagnitude(transform.position - closestTarget.transform.position) < closest)
            {
                closestTarget = potentialTarget;
                closest       = Vector2.SqrMagnitude(transform.position - closestTarget.transform.position);
            }
        }

        if (closestTarget == null)
        {
            Debug.LogError("Default target is null");
        }

        /// attach order targetting closest target to group
        AIOrder <EnemyGroup> defaultOrder = new AIOrder <EnemyGroup> {
            Orderee = spawnedGroup, ObjectOfInterest = closestTarget
        };

        defaultOrder.AttachCondition(
            delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            return(objectOfInterest == null);
        });
        defaultOrder.AttachAction(
            delegate(EnemyGroup group, GameObject objectOfInterest, Vector3 pointOfInterest)
        {
            group.CancelCurrentOrder();
            group.OrderAttack(objectOfInterest);
        });
        spawnedGroup.AddDefaultOrder(defaultOrder);


        // set all the objects into an array
        List <GameObject> enemies = new List <GameObject>();

        foreach (WaveEnemyType enemyType in info_.m_enemiesOnWave)
        {
            for (int i = 0; i < enemyType.m_numEnemy; ++i)
            {
                enemies.Add(enemyType.m_enemyRef);
            }
        }

        return(new GroupedWaveInfo {
            group = spawnedGroup, wave = enemies.ToArray()
        });
    }
Exemple #9
0
 public EncounterAIOrderBox(AIOrder order)
 {
     this.CargoVTwo = order;
 }