public override void DoWindowContents(Rect inRect) { //grab before anchor/font GameFont fontBefore = Text.Font; TextAnchor anchorBefore = Text.Anchor; //top label Text.Font = GameFont.Small; Text.Anchor = TextAnchor.MiddleCenter; Text.Anchor = TextAnchor.MiddleLeft; int i = 0; foreach (FCPrisoner prisoner in prisoners) { Rect Box; Rect PawnIcon; Rect PawnName; Rect PawnHealth; Rect PawnUnrest; Rect PawnWorkload; Rect ButtonInfo; Rect ButtonAction; Box = optionBox; PawnIcon = optionPawnIcon; PawnName = optionPawnName; PawnHealth = optionPawnHealth; PawnUnrest = optionPawnUnrest; PawnWorkload = optionPawnWorkload; ButtonInfo = optionButtonInfo; ButtonAction = optionButtonAction; Box.y += scroll + optionHeight * i; PawnIcon.y += scroll + optionHeight * i; PawnName.y += scroll + optionHeight * i; PawnHealth.y += scroll + optionHeight * i; PawnUnrest.y += scroll + optionHeight * i; PawnWorkload.y += scroll + optionHeight * i; ButtonInfo.y += scroll + optionHeight * i; ButtonAction.y += scroll + optionHeight * i; //display stuff now Widgets.DrawMenuSection(Box); //on every other box if (i % 2 == 0) { Widgets.DrawHighlight(Box); } //show pawn; Widgets.ThingIcon(PawnIcon, prisoner.prisoner); //Pawn Name Widgets.Label(PawnName, prisoner.prisoner.Name.ToString()); //Pawn Health Widgets.Label(PawnHealth, "Health".Translate().CapitalizeFirst() + " " + prisoner.health); //Pawn Unrest //Widgets.Label(PawnUnrest, "Unrest".Translate().CapitalizeFirst() + " " + prisoner.unrest); //Pawn Workload string workload; switch (prisoner.workload) { case FCWorkLoad.Heavy: workload = "FCHeavy".Translate().CapitalizeFirst(); break; case FCWorkLoad.Medium: workload = "FCMedium".Translate().CapitalizeFirst(); break; case FCWorkLoad.Light: workload = "FCLight".Translate().CapitalizeFirst(); break; default: workload = "null"; break; } if (Widgets.ButtonText(PawnWorkload, "FCWorkload".Translate().CapitalizeFirst() + ": " + workload)) { List <FloatMenuOption> list = new List <FloatMenuOption>(); list.Add(new FloatMenuOption("FCHeavy".Translate().CapitalizeFirst() + " - " + "FCHeavyExplanation".Translate(), delegate { prisoner.workload = FCWorkLoad.Heavy; })); list.Add(new FloatMenuOption("FCMedium".Translate().CapitalizeFirst() + " - " + "FCMediumExplanation".Translate(), delegate { prisoner.workload = FCWorkLoad.Medium; })); list.Add(new FloatMenuOption("FCLight".Translate().CapitalizeFirst() + " - " + "FCLightExplanation".Translate(), delegate { prisoner.workload = FCWorkLoad.Light; })); FloatMenu menu = new FloatMenu(list); Find.WindowStack.Add(menu); } //Info Button if (Widgets.ButtonTextSubtle(ButtonInfo, "ViewInfo".Translate())) { Pawn pawn = new Pawn(); pawn = prisoner.prisoner; if (prisoner.healthTracker != null) { prisoner.prisoner.health = prisoner.healthTracker; } else { prisoner.prisoner.health = new Pawn_HealthTracker(prisoner.prisoner); prisoner.healthTracker = new Pawn_HealthTracker(prisoner.prisoner); } pawn.health = prisoner.healthTracker; Find.WindowStack.Add(new Dialog_InfoCard(pawn)); } //Action button if (Widgets.ButtonTextSubtle(ButtonAction, "Actions".Translate())) { List <FloatMenuOption> list = new List <FloatMenuOption>(); list.Add(new FloatMenuOption("SellPawn".Translate() + " $" + prisoner.prisoner.MarketValue + " " + "SellPawnInfo".Translate(), delegate { settlement.addSilverIncome(prisoner.prisoner.MarketValue); //reset window prisoners.Remove(prisoner); WindowUpdate(); return; })); list.Add(new FloatMenuOption("ReturnToPlayer".Translate(), delegate { if (prisoner.healthTracker != null) { prisoner.prisoner.health = prisoner.healthTracker; } else { prisoner.prisoner.health = new Pawn_HealthTracker(prisoner.prisoner); prisoner.healthTracker = new Pawn_HealthTracker(prisoner.prisoner); } HealthUtility.DamageUntilDowned(prisoner.prisoner, false); if (prisoner.prisoner.guest == null) { prisoner.prisoner.guest = new Pawn_GuestTracker(); } prisoner.prisoner.guest.isPrisonerInt = true; FieldInfo hostFaction = typeof(Pawn_GuestTracker).GetField("hostFactionInt", BindingFlags.NonPublic | BindingFlags.Instance); hostFaction.SetValue(prisoner.prisoner.guest, Find.FactionManager.OfPlayer); List <Thing> things = new List <Thing>(); things.Add(prisoner.prisoner); Map map = faction.returnCapitalMap(); if (map != null) { DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(map), Find.CurrentMap, things); } //reset window prisoners.Remove(prisoner); WindowUpdate(); return; })); FloatMenu menu = new FloatMenu(list); Find.WindowStack.Add(menu); } //increment i i++; } Text.Font = fontBefore; Text.Anchor = anchorBefore; if (Event.current.type == EventType.ScrollWheel) { scrollWindow(Event.current.delta.y); } }
protected override bool TryExecuteWorker(IncidentParms parms) { if (!DropCellFinder.TryFindRaidDropCenterClose(spot: out IntVec3 dropSpot, map: (Map)parms.target)) { return(false); } if (!FindAlliedWarringFaction(faction: out Faction faction)) { return(false); } if (faction == null) { return(false); } bool bamboozle = false; string arrivalText = string.Empty; int factionGoodWillLoss = MFI_DiplomacyTunings .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2; IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(incCat: IncidentCategoryDefOf.ThreatBig, target: (Map)parms.target); raidParms.forced = true; raidParms.faction = faction.EnemyInFactionWar(); raidParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack; raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop; raidParms.spawnCenter = dropSpot; if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial && faction.EnemyInFactionWar().RelationKindWith(other: Faction.OfPlayer) == FactionRelationKind.Hostile) { bamboozle = Rand.Chance(chance: 0.25f); } if (bamboozle) { arrivalText = string.Format(format: raidParms.raidArrivalMode.textEnemy, arg0: raidParms.faction.def.pawnsPlural, arg1: raidParms.faction.Name); } //get combat-pawns to spawn. PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(groupKind: PawnGroupKindDefOf.Combat, parms: raidParms); defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points: defaultPawnGroupMakerParms.points, raidArrivalMode: raidParms.raidArrivalMode, raidStrategy: raidParms.raidStrategy, faction: defaultPawnGroupMakerParms.faction, groupKind: PawnGroupKindDefOf.Combat); IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(parms: defaultPawnGroupMakerParms).ToList(); List <Thing> pawnlist = new List <Thing>(); for (int i = 0; i < this.pawnstoSpawn.RandomInRange; i++) { PawnGenerationRequest request = new PawnGenerationRequest(kind: pawnKinds.RandomElement(), faction: faction, allowDowned: true, allowDead: true, mustBeCapableOfViolence: true); Pawn woundedCombatant = PawnGenerator.GeneratePawn(request: request); woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true; ThingDef weapon = Rand.Bool ? DefDatabase <ThingDef> .AllDefsListForReading.Where(predicate : x => x.IsWeaponUsingProjectiles).RandomElement() : null; ThingDef usedWeaponDef = weapon; DamageDef damageDef = usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile?.damageDef; //null? check? All? THE? THINGS!!!!? if (usedWeaponDef != null && damageDef == null) { usedWeaponDef = null; } CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(p: woundedCombatant, allowBleedingWounds: true, damageDef: damageDef, weapon: usedWeaponDef); //todo: maybe add some storylogging. pawnlist.Add(item: woundedCombatant); } string initialMessage = "MFI_WoundedCombatant".Translate(faction.Name); DiaNode diaNode = new DiaNode(text: initialMessage); DiaOption diaOptionOk = new DiaOption(text: "OK".Translate()) { resolveTree = true }; DiaOption diaOptionAccept = new DiaOption(text: "RansomDemand_Accept".Translate()) { action = () => { if (bamboozle) { Find.TickManager.slower.SignalForceNormalSpeedShort(); IncidentDefOf.RaidEnemy.Worker.TryExecute(parms: raidParms); } else { IntVec3 intVec = IntVec3.Invalid; List <Building> allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist.Where(predicate: x => x.def.thingClass == typeof(Building_Bed)).ToList(); for (int i = 0; i < allBuildingsColonist.Count; i++) { if (DropCellFinder.TryFindDropSpotNear(center: allBuildingsColonist[index: i].Position, map: (Map)parms.target, result: out intVec, allowFogged: false, canRoofPunch: false)) { break; } } if (intVec == IntVec3.Invalid) { intVec = DropCellFinder.RandomDropSpot(map: (Map)parms.target); } DropPodUtility.DropThingsNear(dropCenter: intVec, map: (Map)parms.target, things: pawnlist, openDelay: 180, leaveSlag: true, canRoofPunch: false); Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction); } } }; string bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText); string commanderGreatful = "MFI_WoundedCombatantGratitude".Translate(); DiaNode acceptDiaNode = new DiaNode(text: bamboozle ? bamboozledAndAmbushed : commanderGreatful); diaOptionAccept.link = acceptDiaNode; diaNode.options.Add(item: diaOptionAccept); acceptDiaNode.options.Add(item: diaOptionOk); DiaOption diaOptionRejection = new DiaOption(text: "RansomDemand_Reject".Translate()) { action = () => { if (bamboozle) { Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction); } else { faction.TryAffectGoodwillWith(other: Faction.OfPlayer, goodwillChange: factionGoodWillLoss, canSendMessage: false); } } }; string rejectionResponse = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss); string bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate(); DiaNode rejectionDiaNode = new DiaNode(text: bamboozle ? bamboozlingTheBamboozler : rejectionResponse); diaOptionRejection.link = rejectionDiaNode; diaNode.options.Add(item: diaOptionRejection); rejectionDiaNode.options.Add(item: diaOptionOk); string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label); Find.WindowStack.Add(window: new Dialog_NodeTreeWithFactionInfo(nodeRoot: diaNode, faction: faction, delayInteractivity: true, radioMode: true, title: title)); Find.Archive.Add(archivable: new ArchivedDialog(text: diaNode.text, title: title, relatedFaction: faction)); return(true); }
public override void GenerateIntoMap(Map map) { if (Find.GameInitData == null) { return; } List <List <Thing> > list = new List <List <Thing> >(); foreach (Pawn item in Find.GameInitData.startingAndOptionalPawns) { list.Add(new List <Thing> { item }); } List <Thing> list2 = new List <Thing>(); foreach (ScenPart scenPart in Find.Scenario.AllParts) { list2.AddRange(scenPart.PlayerStartingThings()); } int num = 0; for (int i = 0; i < list2.Count; i++) { Thing thing = list2[i]; if (thing.def.CanHaveFaction) { thing.SetFactionDirect(Faction.OfPlayer); } list[num].Add(thing); num++; if (num >= list.Count) { num = 0; } } PlayerPawnsArriveMethod method = (PlayerPawnsArriveMethod)AccessTools.Field(typeof(ScenPart_PlayerPawnsArriveMethod), "method").GetValue(this); Log.Message("method = " + method.ToStringHuman() + " dropship: " + (DropshipDef != null)); if (DropshipDef != null && method == PlayerPawnsArriveMethod.DropPods) { Thing ship = ThingMaker.MakeThing(this.DropshipDef); CompDropship dropship = ship.TryGetCompFast <CompDropship>(); if (dropship != null) { foreach (List <Thing> item in list) { if (item.Contains(ship)) { item.Remove(ship); } dropship.Transporter.innerContainer.TryAddRangeOrTransfer(item); } dropship.autodustoff = AutoDustoff; if (DropCellFinder.TryFindDropSpotNear(MapGenerator.PlayerStartSpot, map, out IntVec3 spot, false, false, false, ship.def.Size)) { GenPlace.TryPlaceThing(SkyfallerMaker.MakeSkyfaller(ThingDef.Named(ship.def.defName + "_Incoming"), ship), spot, map, ThingPlaceMode.Near, null, null, default(Rot4)); } else { GenPlace.TryPlaceThing(SkyfallerMaker.MakeSkyfaller(ThingDef.Named(ship.def.defName + "_Incoming"), ship), MapGenerator.PlayerStartSpot, map, ThingPlaceMode.Near, null, null, default(Rot4)); } return; } }
public static void DropThingGroupsNear_NewTmp(IntVec3 dropCenter, Map map, List <List <Thing> > thingsGroups, int openDelay = 110, bool instaDrop = false, bool leaveSlag = false, bool canRoofPunch = true, bool forbid = true, bool allowFogged = true) { foreach (List <Thing> thingsGroup in thingsGroups) { if (!DropCellFinder.TryFindDropSpotNear(dropCenter, map, out IntVec3 result, allowFogged, canRoofPunch) && (canRoofPunch || !DropCellFinder.TryFindDropSpotNear(dropCenter, map, out result, allowFogged, canRoofPunch: true))) { Log.Warning("DropThingsNear failed to find a place to drop " + thingsGroup.FirstOrDefault() + " near " + dropCenter + ". Dropping on random square instead."); result = CellFinderLoose.RandomCellWith((IntVec3 c) => c.Walkable(map), map); } if (forbid) { for (int i = 0; i < thingsGroup.Count; i++) { thingsGroup[i].SetForbidden(value: true, warnOnFail: false); } } if (instaDrop) { foreach (Thing item in thingsGroup) { GenPlace.TryPlaceThing(item, result, map, ThingPlaceMode.Near); } } else { ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo(); foreach (Thing item2 in thingsGroup) { activeDropPodInfo.innerContainer.TryAdd(item2); } activeDropPodInfo.openDelay = openDelay; activeDropPodInfo.leaveSlag = leaveSlag; MakeDropPodAt(result, map, activeDropPodInfo); } } }
public static void DropThingGroupsNear(IntVec3 dropCenter, Map map, List <List <Thing> > thingsGroups, int openDelay = 110, bool instaDrop = false, bool leaveSlag = false, bool canRoofPunch = true, DeepStrikeType strikeType = DeepStrikeType.DropPod, bool scatters = true) { foreach (List <Thing> list in thingsGroups) { List <Thing> list2 = list.Where(x => x.def.thingClass == typeof(Pawn) && (x.Faction != null && x.Faction.def.HasModExtension <FactionDefExtension>())).ToList(); FactionDefExtension extension = list2.NullOrEmpty() ? null : list2.RandomElement().Faction.def.GetModExtensionFast <FactionDefExtension>(); if (!DropCellFinder.TryFindDropSpotNear(dropCenter, map, out IntVec3 intVec, true, canRoofPunch) || !scatters) { if (scatters) { Log.Warning(string.Concat(new object[] { "DropThingsNear failed to find a place to drop ", list.FirstOrDefault <Thing>(), " near ", dropCenter, ". Dropping on random square instead." }), false); } intVec = CellFinderLoose.RandomCellWith((IntVec3 c) => c.Walkable(map) && (c.Roofed(map) && c.GetRoof(map) != RoofDefOf.RoofRockThick), map, 1000); } for (int i = 0; i < list.Count; i++) { list[i].SetForbidden(true, false); } if (instaDrop) { foreach (Thing thing in list) { GenPlace.TryPlaceThing(thing, intVec, map, ThingPlaceMode.Near, null, null); } } else { ActiveDropPodInfo activeDropPodInfo = new ActiveDropPodInfo(); foreach (Thing item in list) { activeDropPodInfo.innerContainer.TryAddOrTransfer(item, true); } activeDropPodInfo.openDelay = openDelay; activeDropPodInfo.leaveSlag = leaveSlag; switch (strikeType) { /* * case DeepStrikeType.DropPara: * DeepStrikeUtility.MakeDropParaAt(intVec, map, activeDropPodInfo, extension); * break; * case DeepStrikeType.DropShip: * DeepStrikeUtility.MakeDropShipLandAt(intVec, map, activeDropPodInfo, extension); * break; */ case DeepStrikeType.Fly: DeepStrikeUtility.MakeFlyerLandAt(intVec, map, activeDropPodInfo, extension); break; case DeepStrikeType.Teleport: DeepStrikeUtility.MakeTeleportAt(intVec, map, activeDropPodInfo, extension); break; case DeepStrikeType.Tunnel: DeepStrikeUtility.MakeTunnelAt(intVec, map, activeDropPodInfo, extension); break; default: DeepStrikeUtility.MakeDropPodAt(intVec, map, activeDropPodInfo, extension); break; } } } }
public static bool TryFindShipDropSpotNear(ShipBase ship, IntVec3 center, Map map, out IntVec3 result, bool allowFogged, bool canRoofPunch) { if (DebugViewSettings.drawDestSearch) { map.debugDrawer.FlashCell(center, 1f, "center"); } Predicate <IntVec3> validatingExistingShips = (IntVec3 c) => { Vector2 drawSize = ship.def.graphicData.drawSize; List <Thing> ships = map.listerThings.AllThings.FindAll(x => x is ShipBase_Traveling || x.GetType().IsAssignableFrom(typeof(ShipBase))); for (int i = 0; i < ships.Count; i++) { if (GenAdj.OccupiedRect(ships[i]).Overlaps(GenAdj.OccupiedRect(ship).ExpandedBy(1))) { return(false); } } return(true); }; Predicate <IntVec3> validator = (IntVec3 c) => validatingExistingShips(c) && DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) && map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly) && GenAdj.OccupiedRect(c, ship.Rotation, ship.def.Size).InBounds(map); int num = 5; while (!CellFinder.TryFindRandomCellNear(center, map, num, validator, out result)) { num += 3; if (num > 29) { result = center; Log.Error("NoDropPoint found"); return(false); } } return(true); }
public override bool TryExecute(IncidentParms parms) { Map map = (Map)parms.target; IntVec3 spawnSpot; if (!CellFinder.TryFindRandomEdgeCellWith(c => map.reachability.CanReachColony(c), map, out spawnSpot)) { return(false); } #region CHANGED Func <Pawn, bool> selector = other => other.RaceProps.Humanlike && other.Faction != null && other.Faction.HostileTo(Faction.OfPlayer) && HasGroupMakers(other.Faction); Pawn refugee = GenericUtility.GetAnyRelatedWorldPawn(selector, 100); if (refugee == null) { // Just ANYONE Find.WorldPawns.AllPawnsAlive.Where(selector).TryRandomElement(out refugee); } if (refugee == null) { return(false); } refugee.relations.everSeenByPlayer = true; Faction enemyFac = refugee.Faction; string text = "RefugeeChasedInitial".Translate(new object[] { refugee.Name.ToStringFull, refugee.GetTitle().ToLower(), enemyFac.def.pawnsPlural, enemyFac.Name, refugee.ageTracker.AgeBiologicalYears }); text = text.AdjustedFor(refugee); PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, refugee); DiaNode diaNode = new DiaNode(text); DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate()); diaOption.action = delegate { if (refugee == enemyFac.leader) { enemyFac.GenerateNewLeader(); } Find.WorldPawns.RemovePawn(refugee); var canDrop = enemyFac.def.techLevel >= TechLevel.Spacer; if (canDrop) { spawnSpot = DropCellFinder.TradeDropSpot(map); TradeUtility.SpawnDropPod(spawnSpot, map, refugee); } else { GenSpawn.Spawn(refugee, spawnSpot, map); } refugee.SetFaction(Faction.OfPlayer); Find.CameraDriver.JumpTo(spawnSpot); IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentCategory.ThreatBig, map); incidentParms.forced = true; incidentParms.faction = enemyFac; incidentParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack; incidentParms.raidArrivalMode = canDrop ? PawnsArriveMode.CenterDrop : PawnsArriveMode.EdgeWalkIn; incidentParms.spawnCenter = spawnSpot; incidentParms.points *= RaidPointsFactor; QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, incidentParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange); Find.Storyteller.incidentQueue.Add(qi); }; diaOption.resolveTree = true; diaNode.options.Add(diaOption); string text2 = "RefugeeChasedRejected".Translate(new object[] { refugee.NameStringShort }); DiaNode diaNode2 = new DiaNode(text2); DiaOption diaOption2 = new DiaOption("OK".Translate()); diaOption2.resolveTree = true; diaNode2.options.Add(diaOption2); DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate()); diaOption3.action = delegate { HealthUtility.GiveInjuriesToKill(refugee); //Log.Message(refugee.Name + " dead? " + refugee.Dead); //Find.WorldPawns.PassToWorld(refugee,PawnDiscardDecideMode.Discard); }; #endregion diaOption3.link = diaNode2; diaNode.options.Add(diaOption3); Find.WindowStack.Add(new Dialog_NodeTree(diaNode, true, true)); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map target = (Map)parms.target; if (!TryFindFactions(out Faction faction) || !TryFindStravingPawns(out IEnumerable <Pawn> enumerableFood, target) || !TryFindInjuredPawns(out IEnumerable <Pawn> enumerableInjured, target)) { return(false); } List <Thing> thingList = GenerateRewards(faction, enumerableFood.Count(), enumerableInjured.Count(), parms); DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(target), target, thingList, 110, false, true, true); Find.LetterStack.ReceiveLetter("FFE_LetterLabelAid".Translate(), "FFE_Aid".Translate(faction.leader, faction.def.leaderTitle, faction, GenLabel.ThingsLabel(thingList, string.Empty)) , LetterDefOf.PositiveEvent, new TargetInfo(DropCellFinder.TradeDropSpot(target), target, false), faction, null); return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; List <TargetInfo> list = new List <TargetInfo>(); List <Thing> list3 = ThingSetMakerDefOf.Meteorite.root.Generate(); ThingDef shipPartDef = def?.mechClusterBuilding; IntVec3 intVec = FindDropPodLocation(map, (IntVec3 spot) => CanPlaceAt(spot)); if (intVec == IntVec3.Invalid) { return(false); } float points = Mathf.Max(parms.points * 0.9f, 300f); List <Pawn> list2 = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms { groupKind = PawnGroupKindDefOf.Combat, tile = map.Tile, faction = Faction.OfMechanoids, points = points }).ToList(); Thing thing = ThingMaker.MakeThing(shipPartDef); thing.SetFaction(Faction.OfMechanoids); LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_SleepThenMechanoidsDefend(new List <Thing> { thing }, Faction.OfMechanoids, 28f, intVec, canAssaultColony: false, isMechCluster: false), map, list2); DropPodUtility.DropThingsNear(intVec, map, list2.Cast <Thing>()); foreach (Pawn item in list2) { item.TryGetComp <CompCanBeDormant>()?.ToSleep(); } list.AddRange(list2.Select((Pawn p) => new TargetInfo(p))); GenSpawn.Spawn(SkyfallerMaker.MakeSkyfaller(ThingDefOf.MeteoriteIncoming, thing), intVec, map); list.Add(new TargetInfo(intVec, map)); SendStandardLetter(parms, list); return(true); bool CanPlaceAt(IntVec3 loc) { CellRect cellRect = GenAdj.OccupiedRect(loc, Rot4.North, shipPartDef.Size); if (loc.Fogged(map) || !cellRect.InBounds(map)) { return(false); } if (!DropCellFinder.SkyfallerCanLandAt(loc, map, shipPartDef.Size)) { return(false); } foreach (IntVec3 item2 in cellRect) { RoofDef roof = item2.GetRoof(map); if (roof != null && roof.isNatural) { return(false); } } return(GenConstruct.CanBuildOnTerrain(shipPartDef, loc, map, Rot4.North)); } }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; if ((from x in DefDatabase <TraderKindDef> .AllDefs where x.orbital select x).TryRandomElement(out TraderKindDef def)) { TradeShip tradeShip = new TradeShip(def); List <Thing> list = new List <Thing>(); ThingSetMakerParams Trader = default(ThingSetMakerParams); Trader.traderDef = tradeShip.def; Trader.tile = map.Tile; list = ThingSetMakerDefOf.TraderStock.root.Generate(Trader); List <Thing> tempList = new List <Thing>(); for (int i = list.Count - 1; i >= 0; i--) { bool flag = true; if (list[i] is Pawn pawn) { if (Rand.Chance(0.6f)) { list.Remove(list[i]); flag = false; } else { HealthUtility.DamageUntilDowned(pawn); } } else { if (list[i].stackCount == 1) { if (Rand.Chance(0.6f)) { list.Remove(list[i]); //list[i].Destroy(); flag = false; } } else { list[i].stackCount = Mathf.RoundToInt(list[i].stackCount * 0.3f); if (list[i].stackCount < 1) { list.Remove(list[i]); //list[i].Destroy(); flag = false; } } } if (flag) { for (int j = list[i].stackCount; j > list[i].def.stackLimit; j -= list[i].def.stackLimit) { list[i].stackCount -= list[i].def.stackLimit; Thing tempThing = ThingMaker.MakeThing(list[i].def); tempThing.stackCount = list[i].def.stackLimit; if (tempThing is MinifiedThing && (tempThing as MinifiedThing).InnerThing == null) { continue; } tempList.Add(tempThing); } } } /*foreach (Thing thing in list) * { * if (thing is Pawn pawn) * HealthUtility.DamageUntilDowned(pawn); * for (int i = thing.stackCount; i > thing.def.stackLimit; i -= thing.def.stackLimit) * { * thing.stackCount -= thing.def.stackLimit; * Thing tempThing = ThingMaker.MakeThing(thing.def); * tempThing.stackCount = thing.def.stackLimit; * if (tempThing is MinifiedThing && (tempThing as MinifiedThing).InnerThing == null) continue; * tempList.Add(tempThing); * * } * }*/ list.AddRange(tempList); IntVec3 intVec = DropCellFinder.RandomDropSpot(map); DropPodUtility.DropThingsNear(intVec, map, list, 110, false, true, true); Find.LetterStack.ReceiveLetter(tradeShip.def.LabelCap + " " + "PolarisTitleTradeShipPodCrash".Translate(), "PolarisTradeShipPodCrash".Translate(tradeShip.name, tradeShip.def.label), LetterDefOf.PositiveEvent, new TargetInfo(intVec, map, false), null); return(true); } throw new InvalidOperationException(); }
public static bool IsGoodDropSpot(IntVec3 c, Map map, bool allowFogged, bool canRoofPunch) { return(DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) && !Mod.ShieldManager.ImpactShield(map, Common.ToVector2(c))); }
protected override bool TryExecuteWorker(IncidentParms parms) { var map = parms.target as Map; float chance = Rand.Range(1, 100); var container = new List <Thing>(); string label = "LetterLabelRefugeePodCrash".Translate(); string text = "RefugeePodCrash".Translate(); //Get a random cell. var intVec = DropCellFinder.RandomDropSpot(map); //Set the faction of the dude. var faction = Find.FactionManager.FirstFactionOfDef(FactionDefOf.Ancients ); ////Chance of generating soldiers //for (int i = 0; i < (int)Rand.Range(0, 2); i++) //{ // PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceSoldier, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, true, 20f, false, true, true, null, null, null, null, null, null); // Pawn pawn = PawnGenerator.GeneratePawn(request); // Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f); // container.TryAdd(pawn); //} ////Chance of generating survivors. One is required to start the pod! //for (int i = 0; i < (int)Rand.Range(1, 2); i++) //{ // PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null); // Pawn pawn = PawnGenerator.GeneratePawn(request); // Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f); // container.TryAdd(pawn); //} //Chance of generating downed survivors. //for (int i = 0; i < (int)Rand.Range(0, 2); i++) //{ // PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, map, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null); // Pawn pawn = PawnGenerator.GeneratePawn(request); // Cthulhu.Utility.ApplySanityLoss(pawn, 1.0f); // HealthUtility.GiveInjuriesToForceDowned(pawn); // container.TryAdd(pawn); //} //Chance of generating dead bodies //for (int i = 0; i < (int)Rand.Range(0, 3); i++) //{ // PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null); // Pawn pawn = PawnGenerator.GeneratePawn(request); // HealthUtility.GiveInjuriesToKill(pawn); // container.TryAdd(pawn); // } //What kind of trade ship was it? //Combat Supplier if (chance > 66) { label = "LetterLabelForcedCrashCombatSuplier".Translate(); text = "ForcedCrashCombatSuplier".Translate(); container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(40, 60))); //Orig 4000-6000 container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-1, 10))); //Original -1~10 container.AddRange(ThingsToAdd(ThingDefOf.Shell_HighExplosive, Rand.Range(5, 10))); //Original 30-60 container.AddRange(ThingsToAdd(ThingDefOf.MedicineUltratech, Rand.Range(1, 3))); //Original 30-50 AddThingsToContainerByTag(container, "BodyPartOrImplant", Rand.Range(-8, 2)); //Original 0~5 AddThingsToContainerByTag(container, "Drugs", Rand.Range(-2, 2)); //Original 0~5 var randomInRange = Rand.Range(3, 6); //Orig 4~8 guns //Weapons Ranged for (var i = 0; i < randomInRange; i++) { if (!(from t in DefDatabase <ThingDef> .AllDefs where t.IsRangedWeapon && t.tradeability != Tradeability.None && t.techLevel <= TechLevel.Archotech && t.BaseMarketValue <= 500 select t).TryRandomElement(out var def)) { break; } ThingDef stuff = null; if (def.MadeFromStuff) { stuff = (from st in DefDatabase <ThingDef> .AllDefs where st.IsStuff && st.stuffProps.CanMake(def) select st).RandomElementByWeight(st => st.stuffProps.commonality); } var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff); container.Add(thingWithComps); } //Weapons Melee randomInRange = Rand.Range(1, 3); //Orig 3~5 guns for (var i = 0; i < randomInRange; i++) { if (!(from t in DefDatabase <ThingDef> .AllDefs where t.IsRangedWeapon && t.tradeability != Tradeability.None && t.techLevel <= TechLevel.Archotech select t).TryRandomElement(out var def)) { break; } ThingDef stuff = null; if (def.MadeFromStuff) { stuff = (from st in DefDatabase <ThingDef> .AllDefs where st.IsStuff && st.stuffProps.CanMake(def) select st).RandomElementByWeight(st => st.stuffProps.commonality); } var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff); container.Add(thingWithComps); } //Armor randomInRange = Rand.Range(1, 2); //Orig 2~4 armor for (var i = 0; i < randomInRange; i++) { if (!(from t in DefDatabase <ThingDef> .AllDefs where t.IsApparel && t.tradeability != Tradeability.None && t.techLevel <= TechLevel.Archotech && (t.GetStatValueAbstract(StatDefOf.ArmorRating_Blunt) > 0.15f || t.GetStatValueAbstract(StatDefOf.ArmorRating_Sharp) > 0.15f) select t).TryRandomElement(out var def)) { break; } ThingDef stuff = null; if (def.MadeFromStuff) { stuff = (from st in DefDatabase <ThingDef> .AllDefs where st.IsStuff && st.stuffProps.CanMake(def) select st).RandomElementByWeight(st => st.stuffProps.commonality); } var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff); container.Add(thingWithComps); } //Clothes randomInRange = Rand.Range(1, 2); //Orig 4~8 clothes for (var i = 0; i < randomInRange; i++) { if (!(from t in DefDatabase <ThingDef> .AllDefs where t.IsApparel && t.tradeability != Tradeability.None && t.techLevel <= TechLevel.Archotech select t).TryRandomElement(out var def)) { break; } ThingDef stuff = null; if (def.MadeFromStuff) { stuff = (from st in DefDatabase <ThingDef> .AllDefs where st.IsStuff && st.stuffProps.CanMake(def) select st).RandomElementByWeight(st => st.stuffProps.commonality); } var thingWithComps = (ThingWithComps)ThingMaker.MakeThing(def, stuff); container.Add(thingWithComps); } } else if (chance > 33 && chance <= 66) { label = "LetterLabelForcedCrashBulkGoods".Translate(); text = "ForcedCrashBulkGoods".Translate(); //Basic Stuff container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(20, 100))); //Original 4000-6000 container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(5, 15))); //Original 5-30 container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-5, 5))); //Original 5-30 container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100))); //Original 800-1500 //Luxury Goods container.AddRange(ThingsToAdd(ThingDefOf.Gold, Rand.Range(5, 50))); //Original 500-2000 container.AddRange(ThingsToAdd(CultsDefOf.Neutroamine, Rand.Range(5, 15))); //Original 400-800 container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(5, 15))); //Original 300-700 container.AddRange(ThingsToAdd(ThingDefOf.Beer, Rand.Range(-70, 30))); //Original -700-2000 container.AddRange(ThingsToAdd(ThingDefOf.Chocolate, Rand.Range(-70, 30))); //Original -700-2000 AddThingsToContainerByTag(container, "Furniture", Rand.Range(0, 1)); //(0-3 kinds) Furniture -1~2 //Sensitive Materials container.AddRange(ThingsToAdd(ThingDefOf.Cloth, Rand.Range(-20, 50))); //Original -200-600 container.AddRange(ThingsToAdd(ThingDefOf.MedicineIndustrial, Rand.Range(1, 5))); //Original 10-30 container.AddRange(ThingsToAdd(ThingDefOf.MedicineUltratech, Rand.Range(-10, 5))); //Original 10-30 AddThingsToContainerByTag(container, "Apparel", Rand.Range(4, 8)); //Original 10-20 container.AddRange(ThingsToAdd(ThingDefOf.WoodLog, Rand.Range(10, 60))); //Original 800-1500 //Foodstuffs container.AddRange(ThingsToAdd(ThingDef.Named("Pemmican"), Rand.Range(-20, 40))); //NA container.AddRange(ThingsToAdd(ThingDef.Named("Kibble"), Rand.Range(-20, 40))); //NA //Food meals 2-4 //AddThingsToContainerByTag(container, "", Rand.Range(0, 1)); //ResourcesRaw 1500 - 3000 //AddThingsToContainerByTag(container, "", Rand.Range(0, 1)); //(2-8 kinds) FoodRaw 1600 - 5000 //Animals Original - 2-4 types, 10-20 number, max wildness 0.70 AddThingsToContainerByTag(container, "Drugs", Rand.Range(2, 4)); //Original 2-4 types, max price of 8000 //Textiles - Original 2200 - 4000. //New Range - 270 - 1100 container.AddRange(ThingsToAdd(CultsDefOf.BlocksSlate, Rand.Range(-100, 200))); container.AddRange(ThingsToAdd(CultsDefOf.BlocksLimestone, Rand.Range(-100, 200))); container.AddRange(ThingsToAdd(CultsDefOf.BlocksMarble, Rand.Range(-100, 200))); container.AddRange(ThingsToAdd(ThingDef.Named("BlocksGranite"), Rand.Range(-100, 200))); container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(-20, 20))); container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(-100, 200))); } //Exotic else { label = "LetterLabelForcedCrashExotic".Translate(); text = "ForcedCrashExotic".Translate(); container.AddRange(ThingsToAdd(ThingDefOf.Silver, Rand.Range(50, 100))); //Original 1500-3000 container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(6, 20))); //Original 6-20 container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-20, 5))); //Original 6-20 container.AddRange(ThingsToAdd(ThingDefOf.Plasteel, Rand.Range(10, 30))); //Original 50-150 container.AddRange(ThingsToAdd(ThingDefOf.Gold, Rand.Range(10, 20))); //Original 100-300 container.AddRange(ThingsToAdd(CultsDefOf.Neutroamine, Rand.Range(5, 20))); //Original 25-100 container.AddRange(ThingsToAdd(CultsDefOf.Penoxycyline, Rand.Range(-25, 25))); //Original (0) container.AddRange(ThingsToAdd(ThingDef.Named("Telescope"), Rand.Range(-3, 2))); //Original -2 - 2 //AddThingsToContainerByTag(container, "Television", Rand.Range(-2, 2)); //Original -2~2 AddThingsToContainerByTag(container, "BodyPartOrImplant", Rand.Range(1, 2)); //Original 2~4 //AddThingsToContainerByTag(container, "StandardAnimal", Rand.Range(1, 2)); //Animals - Original 1-3 kinds, 2-6 number. Wildness 0.6 AddThingsToContainerByTag(container, "Furniture", Rand.Range(0, 3)); //Furniture - Original 0-3 kinds, -1-3 number AddThingsToContainerByTag(container, "Apparel", Rand.Range(1, 2)); //Original 1-2, 3-4 duplicates AddThingsToContainerByTag(container, "Artifact", Rand.Range(-2, 1)); //Original 1-1 AddThingsToContainerByTag(container, "Drugs", Rand.Range(2, 4)); //Original 2-4 AddThingsToContainerByTag(container, "Exotic", Rand.Range(1, 2)); //Original 2-4 kinds, 1-2 //Art not included, due to crash. } //Misc ship crash pieces. container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100))); container.AddRange(ThingsToAdd(ThingDefOf.ComponentIndustrial, Rand.Range(10, 20))); container.AddRange(ThingsToAdd(ThingDefOf.ComponentSpacer, Rand.Range(-20, 5))); container.AddRange(ThingsToAdd(ThingDefOf.Steel, Rand.Range(20, 100))); //PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, ref label, pawn); Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.PositiveEvent, new TargetInfo(intVec, map)); var adpInfo = new ActiveDropPodInfo(); foreach (var thing in container) { adpInfo.innerContainer.TryAdd(thing); } DropPodUtility.MakeDropPodAt(intVec, map, adpInfo); Utility.ApplyTaleDef("Cults_SpellOrbitalInsanityWave", map); return(true); }
public static bool TryFindShipDropSpotNear(ShipBase ship, IntVec3 center, Map map, out IntVec3 result, bool allowFogged, bool canRoofPunch) { if (DebugViewSettings.drawDestSearch) { map.debugDrawer.FlashCell(center, 1f, "center"); } Predicate <IntVec3> validatingExistingShips = (IntVec3 c) => { Vector3 drawSize = ship.def.graphicData.drawSize; List <Thing> ships = map.listerThings.AllThings.FindAll(x => x is ShipBase_Traveling || x is ShipBase); for (int i = 0; i < ships.Count; i++) { if (ships[i].Position.InHorDistOf(c, Math.Max(drawSize.x, drawSize.z))) { return(false); } } return(true); }; Predicate <IntVec3> validator = (IntVec3 c) => validatingExistingShips(c) && DropCellFinder.IsGoodDropSpot(c, map, allowFogged, canRoofPunch) && map.reachability.CanReach(center, c, PathEndMode.OnCell, TraverseMode.PassDoors, Danger.Deadly); int num = 5; while (!CellFinder.TryFindRandomCellNear(center, map, num, validator, out result)) { num += 3; if (num > 29) { result = center; Log.Error("NoDropPoint found"); return(false); } } return(true); }
public override bool TryExecute(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } IntVec3 dropCenter; dropCenter = DropCellFinder.FindRaidDropCenterDistant(map); this.ResolveRaidStrategy(parms); this.ResolveRaidArriveMode(parms); this.ResolveRaidSpawnCenter(parms); IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = new TargetInfo(dropCenter, map); List <ShipBase> ships = DropShipUtility.CreateDropShips(list, parms.faction); DropShipUtility.DropShipGroups(dropCenter, map, ships, TravelingShipArrivalAction.EnterMapAssault); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Points = " + parms.points.ToString("F0")); foreach (Pawn current2 in list) { string str = (current2.equipment == null || current2.equipment.Primary == null) ? "unarmed" : current2.equipment.Primary.LabelCap; stringBuilder.AppendLine(current2.KindLabel + " - " + str); } string letterLabel = this.GetLetterLabel(parms); string letterText = this.GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.BadUrgent) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } this.ResolveRaidParmOptions(parms); Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list); //Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, true, true, true), map, list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat(new object[] { "Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", map.wealthWatcher.WealthTotal, ")" })); } return(true); }
public bool SendPawnBackToMap(Pawn pawn, Map map) { IntVec3 dropSpot = IntVec3.Invalid; bool dropSpotIsValid = false; // Check orbital relay is powered on. Building_OrbitalRelay orbitalRelay = Util_OrbitalRelay.GetOrbitalRelay(map); if (orbitalRelay == null) { return(false); } if (orbitalRelay.powerComp.PowerOn == false) { return(false); } // Look for an available landing pad. Building_LandingPad landingPad = Util_LandingPad.GetBestAvailableLandingPad(map); if (landingPad == null) { return(false); } // Get a nearby drop spot. dropSpotIsValid = DropCellFinder.TryFindDropSpotNear(landingPad.Position, map, out dropSpot, false, false); if (dropSpot.IsValid) { string hisHerIts = GenderUtility.GetPossessive(pawn.gender); string heSheIt = GenderUtility.GetPronoun(pawn.gender); string himHerIt = GenderUtility.GetObjective(pawn.gender); // Restore needs level. pawn.needs.SetInitialLevels(); pawn.needs.roomsize.CurLevel = 0f; // Droppod is quite cramped. ActiveDropPodInfo dropPodInfo = new ActiveDropPodInfo(); bool healingSuccessful = (Rand.Value < 0.98f); if (healingSuccessful) { string orbitalHealingSuccessfulText = "-- Comlink with MiningCo. --\n\n" + "\"Healing of " + pawn.Name.ToStringShort + " is now finished. Everything went fine during the treatment.\n" + "We just launched " + hisHerIts + " drop pod toward your colony.\n\n" + "I hope you are satisfied of our services.\n\n" + "MiningCo. medibay officer out.\"\n\n" + "-- End of transmission --"; Find.LetterStack.ReceiveLetter("Orbital healing finished", orbitalHealingSuccessfulText, LetterDefOf.PositiveEvent, new TargetInfo(dropSpot, map)); } else { // Dying pawn with heart attack. string orbitalHealingFailedText = "-- Comlink with MiningCo. --\n\n" + "\"Though we did our best to heal " + pawn.Name.ToStringShort + ", it seems " + hisHerIts + " metabolism was disturbed by the last injection.\n\n" + "I am affraid that we need to immediately send " + himHerIt + " back to you as our rules strictly forbid civilian bodies storage.\n\n" + "Please accept those silvers as a compensation.\n\n" + "MiningCo. medibay officer out.\"\n\n" + "-- End of transmission --"; Find.LetterStack.ReceiveLetter("Orbital healing interrupted", orbitalHealingFailedText, LetterDefOf.NegativeEvent, new TargetInfo(dropSpot, map)); pawn.health.AddHediff(HediffDef.Named("HeartAttack")); pawn.health.AddHediff(HediffDefOf.Anesthetic); Thing compensation = ThingMaker.MakeThing(ThingDefOf.Silver); compensation.stackCount = Mathf.RoundToInt(0.5f * Util_Spaceship.orbitalHealingCost); dropPodInfo.innerContainer.TryAdd(compensation); } dropPodInfo.innerContainer.TryAdd(pawn); dropPodInfo.leaveSlag = true; DropPodUtility.MakeDropPodAt(dropSpot, map, dropPodInfo); return(true); } return(false); }
protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Reserve.Reserve(terraformerIndex)); yield return(Toils_Goto.GotoCell(terraformerIndex, PathEndMode.InteractionCell).FailOnDestroyed(terraformerIndex)); yield return(Toils_General.Wait(240).FailOnDestroyed(terraformerIndex)); Toil scytherScoutsArrivalToil = new Toil() { initAction = () => { IntVec3 spawningCell; List <Pawn> scytherScoutsList = new List <Pawn>(); for (int scytherIndex = 0; scytherIndex < 4; scytherIndex++) { bool validDropPodCellIsFound = DropCellFinder.TryFindDropSpotNear(this.TargetThingA.InteractionCell, out spawningCell, true, true); if (validDropPodCellIsFound) { Faction faction = Faction.OfMechanoids; Pawn scytherScout = PawnGenerator.GeneratePawn(PawnKindDef.Named("Scyther"), faction); scytherScoutsList.Add(scytherScout); DropPodUtility.MakeDropPodAt(spawningCell, new DropPodInfo { SingleContainedThing = scytherScout, openDelay = 600, leaveSlag = false }); } } StateGraph stateGraph = GraphMaker.MechanoidsDefendShipGraph(this.TargetThingA, defensiveRadiusAroundTerraformer); BrainMaker.MakeNewBrain(Faction.OfMechanoids, stateGraph, scytherScoutsList); }, defaultCompleteMode = ToilCompleteMode.Instant }; yield return(scytherScoutsArrivalToil); Toil pawnEscapingToil = new Toil() { initAction = () => { (this.TargetThingA as Building_MechanoidTerraformer).reverseEngineeringState = Building_MechanoidTerraformer.ReverseEngineeringState.BuildingNotSecured; ThingRequest thingRequest = new ThingRequest(); thingRequest.singleDef = ThingDefOf.CommsConsole; Thing commsConsole = GenClosest.ClosestThingReachable(pawn.Position, thingRequest, PathEndMode.InteractionCell, TraverseParms.For(pawn)); if (commsConsole != null) { pawn.pather.StartPath(commsConsole, PathEndMode.InteractionCell); } else { // The player has no comms console. He should move his colonist manually... and fast! pawn.pather.StartPath(pawn.Position, PathEndMode.OnCell); } string herHimOrIt = "it"; string sheHeOrIt = "it"; if (pawn.gender == Gender.Female) { herHimOrIt = "her"; sheHeOrIt = "she"; } else if (pawn.gender == Gender.Male) { herHimOrIt = "him"; sheHeOrIt = "he"; } string eventText = " " + pawn.Name.ToStringShort + " is just arriving near the strange building when " + sheHeOrIt + " hears the loud noise of incoming drop pods.\n\n" + "You should better take " + herHimOrIt + " to safety... and fast!\n"; Find.LetterStack.ReceiveLetter("Drop pods", eventText, LetterType.BadUrgent, this.pawn.Position); }, defaultCompleteMode = ToilCompleteMode.PatherArrival }; yield return(pawnEscapingToil); yield return(Toils_Reserve.Release(terraformerIndex)); }
private void Arrived() { if (this.arrived) { return; } this.arrived = true; if (this.arrivalAction == null || !this.arrivalAction.StillValid(this.pods.Cast <IThingHolder>(), this.destinationTile)) { this.arrivalAction = null; List <Map> maps = Find.Maps; for (int i = 0; i < maps.Count; i++) { if (maps[i].Tile == this.destinationTile) { this.arrivalAction = new TransportPodsArrivalAction_LandInSpecificCell(maps[i].Parent, DropCellFinder.RandomDropSpot(maps[i])); break; } } if (this.arrivalAction == null) { if (TransportPodsArrivalAction_FormCaravan.CanFormCaravanAt(this.pods.Cast <IThingHolder>(), this.destinationTile)) { this.arrivalAction = new TransportPodsArrivalAction_FormCaravan(); } else { List <Caravan> caravans = Find.WorldObjects.Caravans; for (int j = 0; j < caravans.Count; j++) { if (caravans[j].Tile == this.destinationTile && TransportPodsArrivalAction_GiveToCaravan.CanGiveTo(this.pods.Cast <IThingHolder>(), caravans[j])) { this.arrivalAction = new TransportPodsArrivalAction_GiveToCaravan(caravans[j]); break; } } } } } if (this.arrivalAction != null && this.arrivalAction.ShouldUseLongEvent(this.pods, this.destinationTile)) { LongEventHandler.QueueLongEvent(delegate { this.DoArrivalAction(); }, "GeneratingMapForNewEncounter", false, null); } else { this.DoArrivalAction(); } }
public static void RequestVassalOptions(Faction faction, DiaNode diaNode1) { DiaNode vassalInfo = new DiaNode("FactionVasalageInfo".Translate(faction)); vassalInfo.options.Add(new DiaOption("Disconnect".Translate()) { resolveTree = true }); DiaNode tributaryInfo = new DiaNode("FactionTributaryInfo".Translate(faction)); tributaryInfo.options.Add(new DiaOption("\"" + "Disconnect".Translate() + "\"") { resolveTree = true }); if (Utilities.FactionsWar().GetByFaction(faction).vassalage == 0) { DiaOption vassalage = new DiaOption("FactionVassalage".Translate()) { link = vassalInfo, action = new Action(() => { Utilities.FactionsWar().GetByFaction(faction).vassalage = 2; faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Ally); }) }; if (!Prefs.DevMode || faction.def.permanentEnemy || (Utilities.FactionsWar().GetByFaction(faction).resources < 2000 && Utilities.FactionsWar().GetByFaction(faction).resources >= Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal || Utilities.FactionsWar().GetByFaction(faction).resources / Math.Min(Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal, 10000) > 0.25f - Utilities.FactionsWar().GetByFaction(faction).disposition / 100)) { DiaOption vassalagediaOption = new DiaOption("FactionVassalage".Translate()); if (faction.def.permanentEnemy) { vassalagediaOption.Disable("FactionVassalageDisabledEnemy".Translate()); } else { vassalagediaOption.Disable("FactionVassalageDisabled".Translate()); } diaNode1.options.Add(vassalagediaOption); } else { diaNode1.options.Add(vassalage); } DiaOption tribute = new DiaOption("FactionTributary".Translate()) { link = tributaryInfo, action = new Action(() => { Utilities.FactionsWar().GetByFaction(faction).vassalage = 1; faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Neutral); }) }; if (!Prefs.DevMode || faction.def.permanentEnemy || (Utilities.FactionsWar().GetByFaction(faction).resources < 3000 && Utilities.FactionsWar().GetByFaction(faction).resources >= Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal || Utilities.FactionsWar().GetByFaction(faction).resources / Math.Min(Find.AnyPlayerHomeMap.wealthWatcher.WealthTotal, 10000) > 0.5f - Utilities.FactionsWar().GetByFaction(faction).disposition / 100)) { DiaOption tributarydiaOption = new DiaOption("FactionTributary".Translate()); if (faction.def.permanentEnemy) { tributarydiaOption.Disable("FactionTributaryDisabledEnemy".Translate()); } else { tributarydiaOption.Disable("FactionTributaryDisabled".Translate()); } diaNode1.options.Add(tributarydiaOption); } else { diaNode1.options.Add(tribute); } } else if (Utilities.FactionsWar().GetByFaction(faction).vassalage == 2) { if (Find.TickManager.TicksGame > Utilities.FactionsWar().GetByFaction(faction).vassalageResourseCooldown) { DiaOption vassalage = new DiaOption("FactionVassalDemandResources".Translate()) { resolveTree = true, action = new Action(() => { if (!DefDatabase <ThingDef> .AllDefs.Where(x => x.CountAsResource && x.IsStuff && x.BaseMarketValue >= 5 && x.PlayerAcquirable && !x.CanHaveFaction).TryRandomElement(out ThingDef def)) { Log.Error("No def found"); return; } Thing thing = ThingMaker.MakeThing(def); thing.stackCount = new IntRange(75, 100).RandomInRange; DropPodUtility.DropThingsNear(DropCellFinder.TradeDropSpot(Find.AnyPlayerHomeMap), Find.AnyPlayerHomeMap, new List <Thing>() { thing }, 110, false, false, false); Utilities.FactionsWar().GetByFaction(faction).vassalageResourseCooldown = Find.TickManager.TicksGame + Global.DayInTicks * 3; }) }; diaNode1.options.Add(vassalage); } else { DiaOption vassalage = new DiaOption("FactionVassalDemandResources".Translate()); vassalage.Disable("FactionVassalDemandResourcesDisabled".Translate()); diaNode1.options.Add(vassalage); } if (faction.def.techLevel < TechLevel.Industrial) { return; } RequestInvestmentsNode(faction, diaNode1); } }