/// <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(); } }
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); }
/// <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); } }
public void AddDefaultOrder(AIOrder <EnemyGroup> order) { defaultOrders.Add(order); }
public void AddOrder(AIOrder <EnemyGroup> order) { orderQueue.Add(order); }
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() }); }
public EncounterAIOrderBox(AIOrder order) { this.CargoVTwo = order; }