private void MoveCaravan(Layer layer, Caravan caravan) { var d = layer.Sections[1].gameObject.transform.position.x * -1; Vector3 normal; float y; layer.Sections[1].GetAt(d, out normal, out y); caravan.Followers[0].SetPosition(new Vector3(0, layer.Sections[1].gameObject.transform.position.y + y, 0)); caravan.Followers[0].SetRotation(new Vector3(0, 0, (float)(Mathf.Rad2Deg * Math.Atan2(normal.y, normal.x)) - 90)); for (int i = 1; i < caravan.Followers.Count; i++) { var del = (layer.Sections[1].gameObject.transform.position.x * -1) - i * 1.5f; if (del >= 0) { d = del; layer.Sections[1].GetAt(d, out normal, out y); caravan.Followers[i].SetPosition(new Vector3(0 - i * 1.5f, layer.Sections[1].gameObject.transform.position.y + y, 0)); caravan.Followers[i].SetRotation(new Vector3(0, 0, (float) (Mathf.Rad2Deg*Math.Atan2(normal.y, normal.x)) - 90)); } else { d = layer.SectionLength + del; layer.Sections[0].GetAt(d, out normal, out y); caravan.Followers[i].SetPosition(new Vector3(0 - i * 1.5f, layer.Sections[0].gameObject.transform.position.y + y, 0)); caravan.Followers[i].SetRotation(new Vector3(0, 0, (float) (Mathf.Rad2Deg*Math.Atan2(normal.y, normal.x)) - 90)); } } }
void Start() { Random = new System.Random(); Caravan = new Caravan(); Layers = new List<Layer>(); Layers.Add(new Layer(100, 200, 40, 20, 20, 0, Color.green, new Vector3(-0.2f, 0, 0))); Layers.Add(new Layer(50, 200, 20, 5, 25, 3, Color.yellow, new Vector3(-0.1f, 0, 0))); Layers.Add(new Layer(50, 200, 15, 15, 25, 5, Color.magenta, new Vector3(-0.05f, 0, 0))); Layers.Add(new Layer(25, 200, 50, 5, 7, 7, Color.gray, new Vector3(-0.005f, 0, 0))); }
public static IEnumerable <FloatMenuOption> GetFloatMenuOptions(Caravan caravan, MapParent mapParent) { return(CaravanArrivalActionUtility.GetFloatMenuOptions(() => CanEnter(caravan, mapParent), () => new CaravanArrivalAction_VisitRealRuinsPOI(mapParent), "EnterMap".Translate(mapParent.Label), caravan, mapParent.Tile, mapParent)); }
/* * Purpose: Interact with caravan (Add and Remove Parts). * Effects: Effects from AddToCaravan() and RemoveFromCaravan(). * Input/Output: Keyboard input "E" to add & "R" to remove. Output N/A. * Global Variables Used: caravan_tf, part_slot_tf, caravan, char_control (Class InteractWithCaravan), * transform, parts_tf (Class Caravan), transform (Class Part), has_object (Class CharacterControl). */ void OnTriggerStay(Collider c) { if (c.gameObject.tag == "Caravan") { canInteract = true; caravan_tf = c.gameObject.transform; caravan = caravan_tf.GetComponentInParent <Caravan>(); health = caravan.GetComponent <Health>(); if (Input.GetButtonDown(interact_botton_str) && gameObject.tag == "Player" && p_inv.CaravanPart != 0) { if (char_control.has_part) { AddToCaravan(); } } else if (Input.GetKeyDown(KeyCode.R)) { if (gameObject.name == "Player_2") //if (!char_control.has_part) { RemoveFromCaravan(); } } /* * Purpose: Temporary shop code * Effects: Allows Player to buy equipment and bandages from the shop * Input/Output: Keyboard input "T" to deposit wood, "Y" to buy a trap, "U" to buy bandages * Global Variables Used: Player_Inventory.wood, Caravan_Inventory.wood, Player_Inventory.GP, Player_Inventory.Trap1 & Trap2, * Player_Inventory.Bandage, Caravan_Inventory.bandages */ else if (Input.GetButtonDown(char_control.interact_botton_str) && p_inv.wood > 0) { if (p_inv.wood > 0) { c_inv.wood += p_inv.wood; p_inv.Score += 3 * p_inv.wood; p_inv.wood = 0; } } else if (Input.GetKeyDown(KeyCode.Alpha2)) { if (p_inv.GP > 4 && c_inv.traps > 0) { if (p_inv.Trap1 < 1) { p_inv.GP = p_inv.GP - 5; p_inv.Trap1 = 1; } else if (p_inv.Trap1 > 0 && p_inv.Trap2 < 1) { p_inv.GP = p_inv.GP - 5; p_inv.Trap2 = 1; } else if (p_inv.Trap1 > 0 && p_inv.Trap2 > 0) { Debug.Log("I'm sorry friend, but you're carrying too much right now"); } } else if (p_inv.GP < 5) { Debug.Log("I'm sorry friend, but it looks like you're a little light on coin"); } else if (c_inv.traps < 1) { Debug.Log("I'm sorry friend, but it looks like I'm fresh out of stock"); } } else if (Input.GetKeyDown(KeyCode.Alpha3)) { if (p_inv.GP > 0 && c_inv.bandages > 0) { p_inv.GP -= 1; p_inv.Bandage += 1; c_inv.bandages -= 1; } } } }
private static CaravanJob CurJob(Caravan c) { return(Find.World.GetComponent <CaravanJobGiver>().CurJob(c)); }
public static Show CaravanChoice(Caravan unit, City city) => new Show(new CaravanChoice(unit, city));
public static bool HasFuel(this Caravan caravan) { return(caravan.AllThings.Any((Thing thing) => thing.def == ThingDefOf.Chemfuel && thing.stackCount > 0)); }
public CaravanJob CurJob(Caravan caravan) { NullHandler(caravan); //Log.Message("JecsTools :: CaravanJobGiver :: CurJob Called"); return(jobTrackers.FirstOrDefault(x => x.Caravan == caravan).curJob); }
public static float ApproxDaysWorthOfWater(Caravan caravan) { return(DaysWorthOfWaterCalculator.ApproxDaysWorthOfWater(caravan.PawnsListForReading, null, IgnorePawnsInventoryMode.DontIgnore)); }
public static void CheckVision(Pawn pawn) { // Basically a copy of the function in PawnObserver if (!pawn.health.capacities.CapableOf(PawnCapacityDefOf.Sight) || pawn.needs.mood == null) { return; } // caravans have some different management Caravan caravan = pawn.GetCaravan(); if (caravan != null) { // inside caravan // see other foreach (Pawn potentialOther in caravan.PawnsListForReading) { Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther); } // see dead foreach (Thing thing in CaravanInventoryUtility.AllInventoryItems(caravan)) { Corpse potentialCorpse = thing as Corpse; if (potentialCorpse != null) { Pawn deadPawn = potentialCorpse.InnerPawn; Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn); } } return; } Map map = pawn.Map; if (map == null) { return; } MapPawns pawns = pawn.Map.mapPawns; IntVec3 selfPosition = pawn.Position; // seen alive foreach (Pawn potentialOther in pawns.AllPawnsSpawned) { if (GenSight.LineOfSight(selfPosition, potentialOther.Position, map, skipFirstCell: true)) { // can see! float distanceSq = selfPosition.DistanceToSquared(potentialOther.Position); if (distanceSq > 25) { // distance radius > 5, excluded continue; } Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOccured(pawn, potentialOther); } } // seen corpse for (int i = 0; (float)i < 100f; i++) { IntVec3 intVec = pawn.Position + GenRadial.RadialPattern[i]; if (!intVec.InBounds(map) || !GenSight.LineOfSight(intVec, pawn.Position, map, skipFirstCell: true)) { continue; } List <Thing> thingList = intVec.GetThingList(map); for (int j = 0; j < thingList.Count; j++) { Corpse potentialCorpse = thingList[j] as Corpse; if (potentialCorpse != null) { Pawn deadPawn = potentialCorpse.InnerPawn; Find.World.GetComponent <FriendshipMemoryGlobalTracker>().Notify_PhysicalSightOfCorpseOccured(pawn, deadPawn); } } } // tick the stuff Find.World.GetComponent <FriendshipMemoryGlobalTracker>().GetFriendshipMemoryTrackerForSubject(pawn)?.Notify_TickOnce(TickIntervalVision); }
public CaravanBattlePlacePlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize) { this.caravanAI = caravanAI; this.playerCaravan = playerCaravan; MapSize = mapSize; }
protected override string GetLetterText(Pawn anyPawn, IncidentParms parms) { Caravan caravan = parms.target as Caravan; return(string.Format(this.def.letterText, (caravan == null) ? "yourCaravan".Translate() : caravan.Name, parms.faction.def.pawnsPlural, parms.faction.Name).CapitalizeFirst()); }
/* * Based on the Caravan's resources, Pawns & the road's cost (modified by terrain) : * - Determine the amount of work done in a tick * - Consume the caravan's resources * - Return whether or not the Caravan must now stop because it ran out of resources * - NOTE : Does this need to be here ? Maybe better in Mod.cs * Returns TRUE if work finished * CALLED FROM : CompTick() of WorldObjectComp_Caravan */ public static bool DoSomeWork(Caravan caravan, RoadConstructionSite site, out bool noMoreResources) { var caravanComp = caravan.GetComponent <WorldObjectComp_Caravan>(); var siteComp = site.GetComponent <WorldObjectComp_ConstructionSite>(); _ = site.roadDef.GetModExtension <DefModExtension_RotR_RoadDef>(); noMoreResources = false; var useISR2G = caravanComp.UseISR2G(); var available = new Dictionary <string, int>(); var needed = new Dictionary <string, int>(); var ratio = new Dictionary <string, float>(); float ratio_final = 1; //RoadsOfTheRim.DebugLog("[RotR] DEBUG ========== doSomeWork() =========="); //RoadsOfTheRim.DebugLog("[RotR] DEBUG ISR2G set to "+useISR2G); if (DebugSettings.godMode) { return(siteComp.FinishWork(caravan)); } if (caravanComp.CaravanCurrentState() != CaravanState.ReadyToWork) { DebugLog("[RotR] DEBUG : doSomeWork() failed because the caravan can't work."); return(false); } // Percentage of total work that can be done in this batch, might be 0 if no pawn was found with enough skill var amountOfWork = caravanComp.AmountOfWork(true); // Work was 0 (not enough skill) if (Math.Abs(amountOfWork) < double.Epsilon) { Messages.Message("RoadsOfTheRim_CaravanNoWork".Translate(caravan.Name, site.roadDef.label), MessageTypeDefOf.RejectInput); caravanComp.StopWorking(); return(false); } // calculate material present in the caravan foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { available[resourceName] = 0; } foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan)) { foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { if (IsThis(aThing.def, resourceName)) { available[resourceName] += aThing.stackCount; } } } // What percentage of work will remain after amountOfWork is done ? var percentOfWorkLeftToDoAfter = (siteComp.GetLeft("Work") - amountOfWork) / siteComp.GetCost("Work"); // The amount of each resource left to spend in total is : percentOfWorkLeftToDoAfter * {this resource cost} // Materials that would be needed to do that much work foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { needed[resourceName] = (int)Math.Round(siteComp.GetLeft(resourceName) - (percentOfWorkLeftToDoAfter * siteComp.GetCost(resourceName))); // Check if there's enough material to go through this batch. Materials with a cost of 0 are always OK // Don't check when ISR2G is in use for this resource, don't check for work if (DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G) || resourceName == "Work") { continue; } ratio[resourceName] = needed[resourceName] == 0 ? 1f : Math.Min(available[resourceName] / (float)needed[resourceName], 1f); if (ratio[resourceName] < ratio_final) { ratio_final = ratio[resourceName]; } } // The caravan didn't have enough resources for a full batch of work. Use as much as we can then stop working if (ratio_final < 1f) { Messages.Message("RoadsOfTheRim_CaravanNoResource".Translate(caravan.Name, site.roadDef.label), MessageTypeDefOf.RejectInput); foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { needed[resourceName] = (int)(needed[resourceName] * ratio_final); } caravanComp.StopWorking(); } //RoadsOfTheRim.DebugLog("[RotR] ISR2G DEBUG ratio final = " + ratio_final); // Consume resources from the caravan _ = site.roadDef.defName == "DirtPathBuilt"; // Always consider resources have been consumed when the road is a dirt path foreach (var aThing in CaravanInventoryUtility.AllInventoryItems(caravan)) { foreach (var resourceName in DefModExtension_RotR_RoadDef.allResources) { if (!DefModExtension_RotR_RoadDef.GetInSituModifier(resourceName, useISR2G)) { if (needed[resourceName] <= 0 || !IsThis(aThing.def, resourceName)) { continue; //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty consumed = " + amountUsed); } var amountUsed = aThing.stackCount > needed[resourceName] ? needed[resourceName] : aThing.stackCount; aThing.stackCount -= amountUsed; // Reduce how much of this resource is needed needed[resourceName] -= amountUsed; siteComp.ReduceLeft(resourceName, amountUsed); } else { if (needed[resourceName] <= 0) { continue; } //RoadsOfTheRim.DebugLog("[RotR] ISR2G consumption DEBUG =" + resourceName + " Qty freely awarded = " + needed[resourceName]); siteComp.ReduceLeft(resourceName, needed[resourceName]); needed[resourceName] = 0; } } if (aThing.stackCount == 0) { aThing.Destroy(); } } caravanComp.TeachPawns(ratio_final); // Pawns learn some construction // HARDCODED : ISR2G divides work done by 4 , AISR2G by 2 for all roads except dirt path if (useISR2G > 0 && site.roadDef.defName != "DirtPathBuilt") { amountOfWork = amountOfWork * 0.25f * useISR2G; } // Update amountOfWork based on the actual ratio worked & finally reducing the work & resources left amountOfWork = ratio_final * amountOfWork; return(siteComp.UpdateProgress(amountOfWork, caravan)); }
protected override bool TryExecuteWorker(IncidentParms parms) { parms.points *= 1.5f; Caravan caravan = (Caravan)parms.target; bool result; if (!PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(parms.points, out parms.faction, null, false, false, false, true)) { result = false; } else { PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, false); defaultPawnGroupMakerParms.generateFightersOnly = true; defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true; List <Pawn> attackers = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (attackers.Count == 0) { Log.Error(string.Concat(new object[] { "Caravan demand incident couldn't generate any enemies even though min points have been checked. faction=", defaultPawnGroupMakerParms.faction, "(", (defaultPawnGroupMakerParms.faction == null) ? "null" : defaultPawnGroupMakerParms.faction.def.ToString(), ") parms=", parms }), false); result = false; } else { List <Thing> demands = this.GenerateDemands(caravan); if (demands.Count == 0) { result = false; } else { CameraJumper.TryJumpAndSelect(caravan); DiaNode diaNode = new DiaNode(this.GenerateMessageText(parms.faction, attackers.Count, demands, caravan)); DiaOption diaOption = new DiaOption("CaravanDemand_Give".Translate()); diaOption.action = delegate() { this.ActionGive(caravan, demands, attackers); }; diaOption.resolveTree = true; diaNode.options.Add(diaOption); DiaOption diaOption2 = new DiaOption("CaravanDemand_Fight".Translate()); diaOption2.action = delegate() { this.ActionFight(caravan, attackers); }; diaOption2.resolveTree = true; diaNode.options.Add(diaOption2); string text = "CaravanDemandTitle".Translate(new object[] { parms.faction.Name }); WindowStack windowStack = Find.WindowStack; DiaNode nodeRoot = diaNode; Faction faction = parms.faction; bool delayInteractivity = true; string title = text; windowStack.Add(new Dialog_NodeTreeWithFactionInfo(nodeRoot, faction, delayInteractivity, false, title)); Find.Archive.Add(new ArchivedDialog(diaNode.text, text, parms.faction)); result = true; } } } return(result); }
private string GenerateMessageText(Faction enemyFaction, int attackerCount, List <Thing> demands, Caravan caravan) { return("CaravanDemand".Translate(new object[] { caravan.Name, enemyFaction.Name, attackerCount, GenLabel.ThingsLabel(demands), enemyFaction.def.pawnsPlural }).CapitalizeFirst()); }
public override IEnumerable <Gizmo> GetCaravanGizmos(Caravan caravan) { return(base.GetCaravanGizmos(caravan: caravan)); }
public Order(int vicPoint, Caravan value) { victoryPoint = vicPoint; requiredGems = value; }
// Token: 0x06000048 RID: 72 RVA: 0x0000509D File Offset: 0x0000329D public static void PawnOnCaravanTakeDrug(Caravan caravan, Pawn pawn, Thing drug, Pawn owner) { caravan.needs.IngestDrug(pawn, drug, owner); }
internal static void CityProduction(City city) { if (city == null || city.Size == 0 || city.Tile == null) { return; } Player player = Game.GetPlayer(city.Owner); IProduction production = null; // Create 2 defensive units per city if (player.HasAdvance <LaborUnion>()) { if (city.Tile.Units.Count(x => x is MechInf) < 2) { production = new MechInf(); } } else if (player.HasAdvance <Conscription>()) { if (city.Tile.Units.Count(x => x is Riflemen) < 2) { production = new Riflemen(); } } else if (player.HasAdvance <Gunpowder>()) { if (city.Tile.Units.Count(x => x is Musketeers) < 2) { production = new Musketeers(); } } else if (player.HasAdvance <BronzeWorking>()) { if (city.Tile.Units.Count(x => x is BronzeWorking) < 2) { production = new Phalanx(); } } else { if (city.Tile.Units.Count(x => x is Militia) < 2) { production = new Militia(); } } // Create city improvements if (production == null) { if (!city.HasBuilding <Barracks>()) { production = new Barracks(); } else if (player.HasAdvance <Pottery>() && !city.HasBuilding <Granary>()) { production = new Granary(); } else if (player.HasAdvance <CeremonialBurial>() && !city.HasBuilding <Temple>()) { production = new Temple(); } else if (player.HasAdvance <Masonry>() && !city.HasBuilding <CityWalls>()) { production = new CityWalls(); } } // Create Settlers if (production == null) { if (city.Size > 4 && !city.Units.Any(x => x is Settlers) && player.Cities.Length < 10) { production = new Settlers(); } } // Create some other unit if (production == null) { if (city.Units.Length < 4) { if (player.Government is Republic || player.Government is Democratic) { if (player.HasAdvance <Writing>()) { production = new Diplomat(); } } else { if (player.HasAdvance <Automobile>()) { production = new Armor(); } else if (player.HasAdvance <Metallurgy>()) { production = new Cannon(); } else if (player.HasAdvance <Chivalry>()) { production = new Knights(); } else if (player.HasAdvance <TheWheel>()) { production = new Chariot(); } else if (player.HasAdvance <HorsebackRiding>()) { production = new Cavalry(); } else if (player.HasAdvance <IronWorking>()) { production = new Legion(); } } } else { if (player.HasAdvance <Trade>()) { production = new Caravan(); } } } // Set random production if (production == null) { IProduction[] items = city.AvailableProduction.ToArray(); production = items[Common.Random.Next(items.Length)]; } city.SetProduction(production); }
public static IEnumerable <FloatMenuOption> GetFloatMenuOptions <T>(Func <FloatMenuAcceptanceReport> acceptanceReportGetter, Func <T> arrivalActionGetter, string label, CompLaunchableSRTS representative, int destinationTile, Caravan car) where T : TransportPodsArrivalAction { FloatMenuAcceptanceReport rep = acceptanceReportGetter(); if (rep.Accepted || !rep.FailReason.NullOrEmpty() || !rep.FailMessage.NullOrEmpty()) { if (!rep.FailReason.NullOrEmpty()) { yield return(new FloatMenuOption(label + " (" + rep.FailReason + ")", null)); } else { yield return(new FloatMenuOption(label, (Action)(() => { FloatMenuAcceptanceReport acceptanceReport = acceptanceReportGetter(); if (acceptanceReport.Accepted) { representative.TryLaunch(destinationTile, (TransportPodsArrivalAction)arrivalActionGetter(), car); } else { if (acceptanceReport.FailMessage.NullOrEmpty()) { return; } Messages.Message(acceptanceReport.FailMessage, (LookTargets) new GlobalTargetInfo(destinationTile), MessageTypeDefOf.RejectInput, false); } }))); } } }
protected override bool TryCastShot() { bool result = false; CompAbilityUserMagic comp = this.CasterPawn.GetComp <CompAbilityUserMagic>(); Pawn soulPawn = comp.soulBondPawn; if (soulPawn != null && !soulPawn.Dead && !soulPawn.Destroyed) { if (ModCheck.Validate.GiddyUp.Core_IsInitialized()) { ModCheck.GiddyUp.ForceDismount(soulPawn); } bool drafted = soulPawn.Drafted; bool soulPawnSpawned = soulPawn.Spawned; Map map = soulPawn.Map; if (map == null) { Hediff bondHediff = soulPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("TM_SoulBondPhysicalHD"), false); if (bondHediff != null) { HediffComp_SoulBondHost compS = bondHediff.TryGetComp <HediffComp_SoulBondHost>(); if (compS != null && compS.polyHost != null && !compS.polyHost.DestroyedOrNull() && !compS.polyHost.Dead) { soulPawnSpawned = true; soulPawn = compS.polyHost; } } bondHediff = soulPawn.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("TM_SoulBondMentalHD"), false); if (bondHediff != null) { HediffComp_SoulBondHost compS = bondHediff.TryGetComp <HediffComp_SoulBondHost>(); if (compS != null && compS.polyHost != null && !compS.polyHost.DestroyedOrNull() && !compS.polyHost.Dead) { soulPawnSpawned = true; soulPawn = compS.polyHost; } } if (soulPawn.ParentHolder != null && soulPawn.ParentHolder is Caravan) { //Log.Message("caravan detected"); //p.DeSpawn(); Caravan van = soulPawn.ParentHolder as Caravan; van.RemovePawn(soulPawn); GenPlace.TryPlaceThing(soulPawn, this.CasterPawn.Position, this.CasterPawn.Map, ThingPlaceMode.Near); if (van.PawnsListForReading != null && van.PawnsListForReading.Count <= 0) { CaravanEnterMapUtility.Enter(van, this.CasterPawn.Map, CaravanEnterMode.Center, CaravanDropInventoryMode.DropInstantly, false); } //Messages.Message("" + p.LabelShort + " has shadow stepped to a caravan with " + soulPawn.LabelShort, MessageTypeDefOf.NeutralEvent); goto fin; } } IntVec3 casterCell = this.CasterPawn.Position; IntVec3 targetCell = soulPawn.Position; if (soulPawnSpawned) { try { soulPawn.DeSpawn(); GenSpawn.Spawn(soulPawn, casterCell, this.CasterPawn.Map); if (drafted) { soulPawn.drafter.Drafted = true; } } catch { Log.Message("Exception occured when trying to summon soul bound pawn - recovered pawn at original position"); GenSpawn.Spawn(soulPawn, targetCell, map); } } else { Messages.Message("TM_BondedPawnNotSpawned".Translate( soulPawn.LabelShort), MessageTypeDefOf.RejectInput); } //this.Ability.PostAbilityAttempt(); result = true; } else { Log.Warning("No soul bond found to shadow call."); } fin :; this.burstShotsLeft = 0; //this.ability.TicksUntilCasting = (int)base.UseAbilityProps.SecondsToRecharge * 60; return(result); }
public static IEnumerable <FloatMenuOption> GetATKFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car) { Func <FloatMenuAcceptanceReport> acceptanceReportGetter1 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement)); Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter1 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.EdgeDrop)); foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter1, arrivalActionGetter1, "AttackAndDropAtEdge".Translate(settlement.Label), representative, settlement.Tile, car)) { FloatMenuOption f = floatMenuOption; yield return(f); f = null; } Func <FloatMenuAcceptanceReport> acceptanceReportGetter2 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement)); Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter2 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.CenterDrop)); foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter2, arrivalActionGetter2, "AttackAndDropInCenter".Translate(settlement.Label), representative, settlement.Tile, car)) { FloatMenuOption f2 = floatMenuOption; yield return(f2); f2 = null; } }
private static Caravan_JobTracker CurTracker(Caravan c) { return(Find.World.GetComponent <CaravanJobGiver>().Tracker(c)); }
public static IEnumerable <FloatMenuOption> GetGIFTFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car) { if (settlement.Faction == Faction.OfPlayer) { return(Enumerable.Empty <FloatMenuOption>()); } return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_GiveGift>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_GiveGift.CanGiveGiftTo(pods, settlement)), (Func <TransportPodsArrivalAction_GiveGift>)(() => new TransportPodsArrivalAction_GiveGift(settlement)), "GiveGiftViaTransportPods".Translate(settlement.Faction.Name, FactionGiftUtility.GetGoodwillChange(pods, settlement).ToStringWithSign()), representative, settlement.Tile, car)); }
void Start() { char_control = GetComponent <Character_interaction>(); caravan = GameObject.FindGameObjectWithTag("Caravan").GetComponent <Caravan>(); p_inv = GetComponent <Player_Inventory>(); }
public static IEnumerable <FloatMenuOption> GetVisitFloatMenuOptions(CompLaunchableSRTS representative, IEnumerable <IThingHolder> pods, Settlement settlement, Caravan car) { return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_VisitSettlement>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_VisitSettlement.CanVisit(pods, settlement)), (Func <TransportPodsArrivalAction_VisitSettlement>)(() => new TransportPodsArrivalAction_VisitSettlement(settlement)), "VisitSettlement".Translate(settlement.Label), representative, settlement.Tile, car)); }
public static FloatMenuAcceptanceReport CanEnter(Caravan caravan, MapParent mapParent) { //worldObject.GetComponent<EnterCooldownComp>()?.DaysLeft ?? 0f add message return(!(mapParent.GetComponent <EnterCooldownComp>()?.BlocksEntering ?? false)); }
private static bool AnyPawnOutOfWater(Caravan c, out string worstDehydrationText) { // キャラバンの全所持品の水アイテムリスト作成 var tmpInvWater = CaravanInventoryUtility.AllInventoryItems(c).FindAll(t => t.CanGetWater()); var allFoundWaterItem = true; // キャラバン内の全ポーンをチェック foreach (var pawn in c.PawnsListForReading) { // 水分要求なし→水不要 if (pawn.needs.Water() == null) { continue; } // 心情ステータス無し、キャラバンの地形に水がある→アイテムがなくても水は飲める if (pawn.needs.mood == null && c.GetWaterTerrainType() != WaterTerrainType.NoWater) { continue; } // そのポーンが飲める水があるなら良し if (tmpInvWater.Exists(t => CanEverGetWater(t.def))) { continue; } // 適切な水アイテムを見つけられなかったポーンがいる allFoundWaterItem = false; break; } if (allFoundWaterItem) { // 全ポーンが水アイテムを見つけた // →脱水症状のテキストは不要 worstDehydrationText = null; return(false); } // 適切なアイテムを見つけられなかったポーンがいる // →全ポーンの脱水症状をチェックして最悪の状態を調査、そのテキストを取得 var maxHediffStageIndex = -1; string maxHediffText = null; foreach (var pawn in c.PawnsListForReading) { // 脱水症状の健康状態を持っているか var hediff = pawn.health.hediffSet.GetFirstHediffOfDef(MizuDef.Hediff_Dehydration); if (hediff == null) { continue; } if (maxHediffText != null && maxHediffStageIndex >= hediff.CurStageIndex) { continue; } // 最悪状態なら更新 maxHediffStageIndex = hediff.CurStageIndex; maxHediffText = hediff.LabelCap; } // 最悪の脱水症状テキストを返す worstDehydrationText = maxHediffText; return(true); }
public ShuttleSenderCaravan(int Tile, Caravan caravan, WorldSettlementFC settlementFC) : base(Tile, settlementFC) { this.caravan = caravan; }
private static bool HasPowerUsers(Caravan caravan) { return(caravan.pawns.Any <Pawn>(PartUtility.HasPoweredParts)); }
private static bool Prefix(Pawn_HealthTracker __instance, DamageInfo?dinfo, Hediff hediff, Caravan caravan) { Pawn value = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); bool flag = value.kindDef == MOARANDROIDS.PawnKindDefOf.MicroScyther; return(!flag); }
protected override bool TryExecuteWorker(IncidentParms parms) { bool result; if (parms.target is Map) { result = IncidentDefOf.TravelerGroup.Worker.TryExecute(parms); } else { Caravan caravan = (Caravan)parms.target; Faction faction; if (!this.TryFindFaction(out faction)) { result = false; } else { CameraJumper.TryJumpAndSelect(caravan); List <Pawn> pawns = this.GenerateCaravanPawns(faction); Caravan metCaravan = CaravanMaker.MakeCaravan(pawns, faction, -1, false); string text = "CaravanMeeting".Translate(new object[] { caravan.Name, faction.Name, PawnUtility.PawnKindsToCommaList(metCaravan.PawnsListForReading, true) }).CapitalizeFirst(); DiaNode diaNode = new DiaNode(text); Pawn bestPlayerNegotiator = BestCaravanPawnUtility.FindBestNegotiator(caravan); if (metCaravan.CanTradeNow) { DiaOption diaOption = new DiaOption("CaravanMeeting_Trade".Translate()); diaOption.action = delegate() { Find.WindowStack.Add(new Dialog_Trade(bestPlayerNegotiator, metCaravan, false)); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(metCaravan.Goods.OfType <Pawn>(), "LetterRelatedPawnsTradingWithOtherCaravan".Translate(new object[] { Faction.OfPlayer.def.pawnsPlural }), LetterDefOf.NeutralEvent, false, true); }; if (bestPlayerNegotiator == null) { diaOption.Disable("CaravanMeeting_TradeIncapable".Translate()); } diaNode.options.Add(diaOption); } DiaOption diaOption2 = new DiaOption("CaravanMeeting_Attack".Translate()); diaOption2.action = delegate() { LongEventHandler.QueueLongEvent(delegate() { Pawn t = caravan.PawnsListForReading[0]; Faction faction2 = faction; Faction ofPlayer = Faction.OfPlayer; FactionRelationKind kind = FactionRelationKind.Hostile; string reason = "GoodwillChangedReason_AttackedCaravan".Translate(); faction2.TrySetRelationKind(ofPlayer, kind, true, reason, new GlobalTargetInfo?(t)); Map map = CaravanIncidentUtility.GetOrGenerateMapForIncident(caravan, new IntVec3(100, 1, 100), WorldObjectDefOf.AttackedNonPlayerCaravan); IntVec3 playerSpot; IntVec3 enemySpot; MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out playerSpot, out enemySpot); CaravanEnterMapUtility.Enter(caravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(playerSpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, true); List <Pawn> list = metCaravan.PawnsListForReading.ToList <Pawn>(); CaravanEnterMapUtility.Enter(metCaravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(enemySpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, false); LordMaker.MakeNewLord(faction, new LordJob_DefendAttackedTraderCaravan(list[0].Position), map, list); Find.TickManager.CurTimeSpeed = TimeSpeed.Paused; CameraJumper.TryJumpAndSelect(t); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(list, "LetterRelatedPawnsGroupGeneric".Translate(new object[] { Faction.OfPlayer.def.pawnsPlural }), LetterDefOf.NeutralEvent, true, true); }, "GeneratingMapForNewEncounter", false, null); }; diaOption2.resolveTree = true; diaNode.options.Add(diaOption2); DiaOption diaOption3 = new DiaOption("CaravanMeeting_MoveOn".Translate()); diaOption3.action = delegate() { this.RemoveAllPawnsAndPassToWorld(metCaravan); }; diaOption3.resolveTree = true; diaNode.options.Add(diaOption3); string text2 = "CaravanMeetingTitle".Translate(new object[] { caravan.Label }); WindowStack windowStack = Find.WindowStack; DiaNode nodeRoot = diaNode; Faction faction3 = faction; bool delayInteractivity = true; string title = text2; windowStack.Add(new Dialog_NodeTreeWithFactionInfo(nodeRoot, faction3, delayInteractivity, false, title)); Find.Archive.Add(new ArchivedDialog(diaNode.text, text2, faction)); result = true; } } return(result); }