Ejemplo n.º 1
0
        public void SetPlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize)
        {
            MapSize = mapSize;

            this.caravanAI = caravanAI;
            aiFaction      = caravanAI.Faction;
            aiTarget       = caravanAI.pather.Destination;
            aiAction       = caravanAI.pather.ArrivalAction;

            this.playerCaravan = playerCaravan;
            List <Pawn> aiPawns = new List <Pawn>(caravanAI.pawns);

            caravanAI.Tile     = Tile;
            playerCaravan.Tile = Tile;

            Map map = GetOrGenerateMap(Tile, MapSize, null);

            Find.TickManager.Notify_GeneratedPotentiallyHostileMap();

            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 first, out IntVec3 second);

            CaravanEnterMapUtility.Enter(caravanAI, map, x => CellFinder.RandomSpawnCellForPawnNear(first, map), CaravanDropInventoryMode.DoNotDrop);
            CaravanEnterMapUtility.Enter(playerCaravan, map, x => CellFinder.RandomSpawnCellForPawnNear(second, map), CaravanDropInventoryMode.DoNotDrop);

            LordJob lordJob = new LordJob_AssaultColony(caravanAI.Faction, canKidnap: true, canTimeoutOrFlee: false);

            LordMaker.MakeNewLord(caravanAI.Faction, lordJob, map, aiPawns);

            winner = CaravanBattleWinner.None;

            Find.LetterStack.ReceiveLetter("CaravanBattlePlacePlace_BattleStarted".Translate(), "CaravanBattlePlacePlace_BattleDescription".Translate(playerCaravan.Name, caravanAI.Name), LetterDefOf.ThreatBig);
        }
Ejemplo n.º 2
0
        public static CaravanToil GotoObject(TargetIndex ind, CaravanArrivalAction arrivalAction = null)
        {
            int         tileInt = -1;
            CaravanToil toil    = new CaravanToil();

            toil.initAction = delegate
            {
                //Log.Message("GoToObject1");
                tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile;
                //Log.Message("GoToObject2");
                toil.actor.pather.StartPath(tileInt, arrivalAction, true);
                //Log.Message("GoToObject3");
            };
            toil.tickAction = delegate
            {
                if (tileInt < 0)
                {
                    tileInt = CurJob(toil.actor).GetTarget(ind).WorldObject.Tile;
                }
                if (toil.actor.Tile == tileInt)
                {
                    //Log.Message("GoToObject4a");
                    CurTracker(toil.actor).curDriver.Notify_PatherArrived();
                }
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            //toil.FailOnDespawnedOrNull(ind);
            return(toil);
        }
Ejemplo n.º 3
0
 /// <summary>
 /// Catch-All for Caravan_PathFollower.StartPath, redirect to VehicleCaravan_PathFollower
 /// </summary>
 /// <param name="destTile"></param>
 /// <param name="arrivalAction"></param>
 /// <param name="___caravan"></param>
 /// <param name="repathImmediately"></param>
 /// <param name="resetPauseStatus"></param>
 /// <returns></returns>
 public static bool StartVehicleCaravanPath(int destTile, CaravanArrivalAction arrivalAction, Caravan ___caravan, bool repathImmediately = false, bool resetPauseStatus = true)
 {
     if (___caravan is VehicleCaravan vehicleCaravan && vehicleCaravan.HasVehicle())
     {
         vehicleCaravan.vPather.StartPath(destTile, arrivalAction, repathImmediately, resetPauseStatus);
     }
     return(true);
 }
Ejemplo n.º 4
0
        public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null)
        {
            CaravanToil toil = new CaravanToil();

            toil.initAction = delegate
            {
                Caravan actor = toil.actor;
                actor.pather.StartPath(Find.World.GetComponent <CaravanJobGiver>().CurJob(actor).GetTarget(ind).Tile, arrivalAction);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            //toil.FailOnDespawnedOrNull(ind);
            return(toil);
        }
 public bool StartPath(int destTile, CaravanArrivalAction arrivalAction, bool repathImmediately = false, bool resetPauseStatus = true)
 {
     caravan.autoJoinable = false;
     if (resetPauseStatus)
     {
         paused = false;
     }
     if (arrivalAction != null && !arrivalAction.StillValid(caravan, destTile))
     {
         return(false);
     }
     if (!IsPassable(caravan.Tile) && !TryRecoverFromUnwalkablePosition())
     {
         return(false);
     }
     if (moving && curPath != null && this.destTile == destTile)
     {
         this.arrivalAction = arrivalAction;
         return(true);
     }
     if (!WorldVehicleReachability.Instance.CanReach(caravan, destTile))
     {
         PatherFailed();
         return(false);
     }
     this.destTile      = destTile;
     this.arrivalAction = arrivalAction;
     caravan.Notify_DestinationOrPauseStatusChanged();
     if (nextTile < 0 || !IsNextTilePassable())
     {
         nextTile         = caravan.Tile;
         nextTileCostLeft = 0f;
         previousTileForDrawingIfInDoubt = -1;
     }
     if (AtDestinationPosition())
     {
         PatherArrived();
         return(true);
     }
     if (curPath != null)
     {
         curPath.ReleaseToPool();
     }
     curPath = null;
     moving  = true;
     if (repathImmediately && TrySetNewPath() && nextTileCostLeft <= 0f && moving)
     {
         TryEnterNextPathTile();
     }
     return(true);
 }
Ejemplo n.º 6
0
        public static CaravanToil GotoTile(TargetIndex ind, CaravanArrivalAction arrivalAction = null)
        {
            var toil = new CaravanToil();

            toil.initAction = () =>
            {
                var actor = toil.actor;
                actor.pather.StartPath(CaravanJobsUtility.GetCaravanJobGiver().CurJob(actor).GetTarget(ind).Tile,
                                       arrivalAction);
            };
            toil.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            //toil.FailOnDespawnedOrNull(ind);
            return(toil);
        }
        private void PatherArrived()
        {
            CaravanArrivalAction caravanArrivalAction = arrivalAction;

            StopDead();
            if (caravanArrivalAction != null && caravanArrivalAction.StillValid(caravan, caravan.Tile))
            {
                caravanArrivalAction.Arrived(caravan);
                return;
            }
            if (caravan.IsPlayerControlled && !caravan.VisibleToCameraNow())
            {
                Messages.Message("MessageCaravanArrivedAtDestination".Translate(caravan.Label), caravan, MessageTypeDefOf.TaskCompletion, true);
            }
        }
 public void StopDead()
 {
     if (curPath != null)
     {
         curPath.ReleaseToPool();
     }
     curPath  = null;
     moving   = false;
     paused   = false;
     nextTile = caravan.Tile;
     previousTileForDrawingIfInDoubt = -1;
     arrivalAction    = null;
     nextTileCostLeft = 0f;
     caravan.Notify_DestinationOrPauseStatusChanged();
 }
Ejemplo n.º 9
0
 private void Set(Caravan caravan)
 {
     caravan.StoryState.CopyTo(map.StoryState);
     shouldPassStoryState = true;
     if (caravan.pather.Moving)
     {
         nextTile            = caravan.pather.nextTile;
         nextTileCostLeftPct = caravan.pather.nextTileCostLeft / caravan.pather.nextTileCostTotal;
         paused          = caravan.pather.Paused;
         destinationTile = caravan.pather.Destination;
         arrivalAction   = caravan.pather.ArrivalAction;
     }
     else
     {
         nextTile            = -1;
         nextTileCostLeftPct = 0f;
         paused          = false;
         destinationTile = -1;
         arrivalAction   = null;
     }
 }
Ejemplo n.º 10
0
 public void Notify_CaravanFormed(Caravan caravan)
 {
     if (shouldPassStoryState)
     {
         shouldPassStoryState = false;
         map.StoryState.CopyTo(caravan.StoryState);
     }
     if (nextTile != -1 && nextTile != caravan.Tile && caravan.CanReach(nextTile))
     {
         caravan.pather.StartPath(nextTile, null, repathImmediately: true);
         caravan.pather.nextTileCostLeft = caravan.pather.nextTileCostTotal * nextTileCostLeftPct;
         caravan.pather.Paused           = paused;
         caravan.tweener.ResetTweenedPosToRoot();
     }
     if (HasDestinationTile && destinationTile != caravan.Tile)
     {
         caravan.pather.StartPath(destinationTile, arrivalAction, repathImmediately: true);
         destinationTile = -1;
         arrivalAction   = null;
     }
 }
 public void Notify_CaravanFormed(Caravan caravan)
 {
     if (this.shouldPassStoryState)
     {
         this.shouldPassStoryState = false;
         this.map.StoryState.CopyTo(caravan.StoryState);
     }
     if (this.nextTile != -1 && this.nextTile != caravan.Tile && caravan.CanReach(this.nextTile))
     {
         caravan.pather.StartPath(this.nextTile, null, true, true);
         caravan.pather.nextTileCostLeft = caravan.pather.nextTileCostTotal * this.nextTileCostLeftPct;
         caravan.pather.Paused           = this.paused;
         caravan.tweener.ResetTweenedPosToRoot();
     }
     if (this.HasDestinationTile && this.destinationTile != caravan.Tile)
     {
         caravan.pather.StartPath(this.destinationTile, this.arrivalAction, true, true);
         this.destinationTile = -1;
         this.arrivalAction   = null;
     }
 }
Ejemplo n.º 12
0
 public static CaravanToil Goto(TargetIndex ind, CaravanArrivalAction arrivalAction = null)
 {
     return(CaravanToils_Goto.GotoTile(ind, arrivalAction));
 }
Ejemplo n.º 13
0
 public void AddQueueAction(CaravanArrivalAction action, int destinationTile)
 {
     queueActions.Add(new CaravanAI_QueueAction(action, destinationTile));
 }
Ejemplo n.º 14
0
 public CaravanAI_QueueAction(CaravanArrivalAction action, int tile)
 {
     CaravanArrivalAction = action;
     DestinationTile      = tile;
 }
Ejemplo n.º 15
0
 public static void Pather_StartPath_WarObjects(Caravan_PathFollower __instance, Caravan ___caravan, int destTile, CaravanArrivalAction arrivalAction, ref bool __result, bool repathImmediately = false, bool resetPauseStatus = true)
 {
     if (__result == true)
     {
         if (arrivalAction is RimWar.Planet.CaravanArrivalAction_AttackWarObject)
         {
             //Log.Message("assigning war object action: attack");
             CaravanArrivalAction_AttackWarObject woAction = arrivalAction as CaravanArrivalAction_AttackWarObject;
             woAction.wo.interactable = true;
             RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(___caravan, woAction.wo);
         }
         else if (arrivalAction is RimWar.Planet.CaravanArrivalAction_EngageWarObject)
         {
             //Log.Message("assigning war object action: engage");
             CaravanArrivalAction_EngageWarObject woAction = arrivalAction as CaravanArrivalAction_EngageWarObject;
             woAction.wo.interactable = true;
             RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(___caravan, woAction.wo);
         }
         else
         {
             WorldUtility.Get_WCPT().RemoveCaravanTarget(___caravan);
         }
     }
 }
Ejemplo n.º 16
0
 public static void Pather_StartPath_WarObjects(Caravan_PathFollower __instance, int destTile, CaravanArrivalAction arrivalAction, ref bool __result, bool repathImmediately = false, bool resetPauseStatus = true)
 {
     if (__result == true)
     {
         if (arrivalAction is RimWar.Planet.CaravanArrivalAction_AttackWarObject)
         {
             //Log.Message("assigning war object action: attack");
             Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>();
             CaravanArrivalAction_AttackWarObject woAction = arrivalAction as CaravanArrivalAction_AttackWarObject;
             RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(caravan, woAction.wo);
         }
         else if (arrivalAction is RimWar.Planet.CaravanArrivalAction_EngageWarObject)
         {
             //Log.Message("assigning war object action: engage");
             Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>();
             CaravanArrivalAction_EngageWarObject woAction = arrivalAction as CaravanArrivalAction_EngageWarObject;
             RimWar.Planet.WorldUtility.Get_WCPT().AssignCaravanTargets(caravan, woAction.wo);
         }
         else
         {
             Caravan caravan = Traverse.Create(root: __instance).Field(name: "caravan").GetValue <Caravan>();
             List <CaravanTargetData> ctdList = RimWar.Planet.WorldUtility.Get_WCPT().caravanTargetData;
             for (int i = 0; i < ctdList.Count; i++)
             {
                 if (ctdList[i].caravan == caravan)
                 {
                     ctdList.Remove(ctdList[i]);
                 }
             }
         }
     }
 }