protected void CaravanAmbushHumansNoTreasure(Caravan caravan) { LongEventHandler.QueueLongEvent(delegate { IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan); //make sure a minimum point threshold is hit if (incidentParms.points < MinimumPointThreshold) { incidentParms.points = MinimumPointThreshold; } incidentParms.faction = Find.FactionManager.RandomEnemyFaction(); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true); defaultPawnGroupMakerParms.generateFightersOnly = true; List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); Map map = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, false); if (list.Any <Pawn>()) { LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(incidentParms.faction, true, true, false, false, true), map, list); } Find.TickManager.CurTimeSpeed = TimeSpeed.Paused; GlobalTargetInfo lookTarget = (!list.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(list[0].Position, map, false); Find.LetterStack.ReceiveLetter("LetterLabelIMAmbushLGE".Translate(), "LetterIMAmbushLGE".Translate(), LetterDefOf.ThreatBig, lookTarget, null); }, "GeneratingMapForNewEncounter", false, null); }
// Token: 0x060069B7 RID: 27063 RVA: 0x0024FA38 File Offset: 0x0024DC38 public override void Resolve(ResolveParams rp) { Map map = BaseGen.globalSettings.map; PawnGroupMakerParms pawnGroupMakerParms = rp.pawnGroupMakerParams; if (pawnGroupMakerParms == null) { pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.faction = Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined); pawnGroupMakerParms.points = 250f; } pawnGroupMakerParms.groupKind = (rp.pawnGroupKindDef ?? RimWorld.PawnGroupKindDefOf.Combat); List <PawnKindDef> list = new List <PawnKindDef>(); foreach (Pawn pawn in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, true)) { list.Add(pawn.kindDef); // Log.Message("generating "+ pawn); ResolveParams resolveParams = rp; resolveParams.singlePawnToSpawn = pawn; BaseGen.symbolStack.Push("ExtraHives_Pawn", resolveParams, null); } }
public override void PostMapGenerate(Map map) { base.PostMapGenerate(map); PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = Faction, points = Mathf.Clamp(Rand.Range(300, 500) * (int)Faction.def.techLevel, 450, 1600), generateFightersOnly = true, groupKind = PawnGroupKindDefOf.Combat, raidStrategy = RaidStrategyDefOf.ImmediateAttack }; List <Pawn> rebels = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); IntVec3 spot; MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out spot, out IntVec3 second); foreach (var rebel in rebels) { if (CellFinder.TryFindRandomCellNear(spot, map, 6, (IntVec3 x) => x.Standable(map) && !x.Fogged(map), out IntVec3 loc)) { GenSpawn.Spawn(rebel, loc, map, Rot4.Random); rebel.SetFaction(Faction.OfAncientsHostile); } } LordJob lordJob = new LordJob_AssaultColony(Faction.OfPlayer, canKidnap: false, canTimeoutOrFlee: false, canSteal: false); LordMaker.MakeNewLord(Faction.OfAncientsHostile, lordJob, map, rebels); supress = true; UnlimitedTime = true; ShowInfo(); }
public static IEnumerable <Pawn> MountAnimals(PawnGroupMakerParms groupParms, bool warnOnZeroResults, IncidentParms parms) { List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(groupParms, true).ToList(); if (list.Count == 0) { return(list); } parms.raidArrivalMode.Worker.Arrive(list, parms); if (!(parms.raidArrivalMode == null || parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn) || (parms.raidStrategy != null && parms.raidStrategy.workerClass == typeof(RaidStrategyWorker_Siege))) { return(list); } NPCMountUtility.generateMounts(ref list, parms, Base.inBiomeWeight, Base.outBiomeWeight, Base.nonWildWeight, Base.enemyMountChance, Base.enemyMountChanceTribal); foreach (Pawn pawn in list) { if (pawn.equipment == null) { pawn.equipment = new Pawn_EquipmentTracker(pawn); } } return(list); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; if (!TryFindSpawnSpot(map, out IntVec3 spawnSpot)) { return(false); } if (!TryFindEnemyFaction(out Faction enemyFac)) { return(false); } int @int = Rand.Int; IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map); raidParms.forced = true; raidParms.faction = enemyFac; raidParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack; raidParms.raidArrivalMode = PawnsArrivalModeDefOf.EdgeWalkIn; raidParms.spawnCenter = spawnSpot; raidParms.points = Mathf.Max(raidParms.points * RaidPointsFactorRange.RandomInRange, enemyFac.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat)); raidParms.pawnGroupMakerSeed = @int; PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms); defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat); IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms); PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: false, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence: false, colonistRelationChanceFactor: 20f); Pawn refugee = PawnGenerator.GeneratePawn(request); refugee.relations.everSeenByPlayer = true; string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, enemyFac.def.pawnsPlural, enemyFac.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, useAnd: true), refugee.Named("PAWN")); text = text.AdjustedFor(refugee); TaggedString temp = new TaggedString(text); PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref temp, refugee); DiaNode diaNode = new DiaNode(text); DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate()); diaOption.action = delegate { GenSpawn.Spawn(refugee, spawnSpot, map); refugee.SetFaction(Faction.OfPlayer); CameraJumper.TryJump(refugee); QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange); Find.Storyteller.incidentQueue.Add(qi); }; diaOption.resolveTree = true; diaNode.options.Add(diaOption); string text2 = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee); 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 { Find.WorldPawns.PassToWorld(refugee); }; diaOption3.link = diaNode2; diaNode.options.Add(diaOption3); string title = "RefugeeChasedTitle".Translate(map.Parent.Label); Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, enemyFac, delayInteractivity: true, radioMode: true, title: title)); Find.Archive.Add(new ArchivedDialog(diaNode.text, title, enemyFac)); return(true); }
// RimWorld.PawnGroupKindWorker_Normal public static void GeneratePawns_PostFix(PawnGroupMakerParms parms, PawnGroupMaker groupMaker, bool errorOnZeroResults, ref List <Pawn> __result) { //Anyone special? if (__result.Any() && __result.FindAll(x => x.TryGetComp <CompAbilityUser>() is CompAbilityUser cu && cu.CombatPoints() > 0) is List <Pawn> specialPawns) { //Log.Message("Special Pawns Detected"); //Log.Message("------------------"); //Points var previousPoints = parms.points; //Log.Message("Points: " + previousPoints); //Log.Message("Average Characters"); //Log.Message("------------------"); //Anyone average? int avgPawns = 0; var avgCombatPoints = new Dictionary <Pawn, float>(); if (__result.FindAll(x => x.TryGetComp <CompAbilityUser>() == null) is List <Pawn> averagePawns) { avgPawns = averagePawns.Count; averagePawns.ForEach(x => { avgCombatPoints.Add(x, x.kindDef.combatPower); //Log.Message(x.LabelShort + " : " + x.kindDef.combatPower); }); } //Log.Message("------------------"); //Log.Message("Special Characters"); //Log.Message("------------------"); //What's your powers? var specCombatPoints = new Dictionary <Pawn, float>(); specialPawns.ForEach(x => { var combatValue = x.kindDef.combatPower; foreach (var thingComp in x.AllComps.FindAll(y => y is CompAbilityUser)) { //var compAbilityUser = (CompAbilityUser) thingComp; var val = Traverse.Create(thingComp).Method("CombatPoints").GetValue <float>(); combatValue += val; //compAbilityUser.CombatPoints(); } specCombatPoints.Add(x, combatValue); //Log.Message(x.LabelShort + " : " + combatValue); }); //Special case -- single raider/character should not be special to avoid problems (e.g. Werewolf raid destroys everyone). if (avgPawns == 0 && specCombatPoints.Sum(x => x.Value) > 0 && specialPawns.Count == 1) { //Log.Message("Special case called: Single character"); specialPawns.First().TryGetComp <CompAbilityUser>().DisableAbilityUser(); return; } //Should we rebalance? int tryLimit = avgPawns + specialPawns.Count + 1; int initTryLimit = tryLimit; var tempAvgCombatPoints = new Dictionary <Pawn, float>(avgCombatPoints); var tempSpecCombatPoints = new Dictionary <Pawn, float>(specCombatPoints); var removedCharacters = new List <Pawn>(); while (previousPoints < tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value)) { //Log.Message("------------------"); //Log.Message("Rebalance Attempt # " + (initTryLimit - tryLimit + 1)); //Log.Message("------------------"); //Log.Message("Scenario Points: " + previousPoints + ". Total Points: " + tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value)); //In-case some stupid stuff occurs --tryLimit; if (tryLimit < 0) { break; } //If special characters outnumber the avg characters, try removing some of the special characters instead. if (tempSpecCombatPoints.Count >= tempAvgCombatPoints.Count) { var toRemove = tempSpecCombatPoints.Keys.RandomElement(); //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]); removedCharacters.Add(toRemove); tempSpecCombatPoints.Remove(toRemove); } //If average characters outnumber special characters, then check if the combat value of avg is greater. else if (tempSpecCombatPoints.Count < tempAvgCombatPoints.Count) { //Remove a random average character if the average characters have more combat points for a score if (tempAvgCombatPoints.Sum(x => x.Value) > tempSpecCombatPoints.Sum(x => x.Value)) { var toRemove = tempAvgCombatPoints.Keys.RandomElement(); //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]); removedCharacters.Add(toRemove); tempAvgCombatPoints.Remove(toRemove); } else { var toRemove = tempSpecCombatPoints.Keys.RandomElement(); //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]); removedCharacters.Add(toRemove); tempSpecCombatPoints.Remove(toRemove); } } } avgCombatPoints = tempAvgCombatPoints; specCombatPoints = tempSpecCombatPoints; // Log.Message("------------"); // Log.Message("Final Report"); // Log.Message("------------"); // Log.Message("Scenario Points: " + previousPoints + ". Total Points: " + tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value)); // Log.Message("------------"); // Log.Message("Characters"); // Log.Message("------------------"); __result.ForEach(x => { var combatValue = x.kindDef.combatPower + x?.TryGetComp <CompAbilityUser>()?.CombatPoints() ?? 0f; //Log.Message(x.LabelShort + " : " + combatValue); }); foreach (var x in removedCharacters) { if (x.TryGetComp <CompAbilityUser>() is CompAbilityUser cu && cu.CombatPoints() > 0) { cu.DisableAbilityUser(); }
public static void Listener(PawnGroupMakerParms parms, bool warnOnZeroResults, ref IEnumerable <Pawn> __result) { try { //If active solar flare then no surrogates are generated to prevent ridiculous spawn of dawned surrogates if (!Settings.otherFactionsCanUseSurrogate || Utils.ExceptionBlacklistedFactionNoSurrogate.Contains(parms.faction.def.defName) || Utils.getRandomMapOfPlayer().gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare) || (Settings.androidsAreRare && Rand.Chance(0.95f))) { return; } int nbHumanoids = 0; foreach (var e in __result) { //Si humanoide if (e.def.race != null && e.def.race.Humanlike) { //Si pas commercant if (e.trader == null && e.TraderKind == null) { nbHumanoids++; } //Si android T1/T2 suppression traits ==> Je suis bete cest a cause des surrogates que j'ai crus qu'il avais des traits /*if(e.def.defName == Utils.T1 || e.def.defName == Utils.T2) * { * Utils.removeAllTraits(e); * }*/ } } //Faction de niveau industriel et plus ET nb pawn généré supérieur ou égal à 5 if (parms.faction.def.techLevel >= TechLevel.Industrial && nbHumanoids >= 5) { List <Pawn> other = new List <Pawn>(); List <Pawn> ret = new List <Pawn>(); List <Pawn> tmp = __result.ToList(); //On supprime les non humains ET trader //int nba = tmp.RemoveAll((Pawn x) => (x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null)); foreach (var x in tmp) { if (x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null) { other.Add(x); } } //Purge dans list de travail foreach (var e in other) { tmp.Remove(e); } //Log.Message(other.Count + " animaux et traders virés"); //Calcul nb pawn a recreer en mode surrogate int nb = (int)(tmp.Count() * Rand.Range(Settings.percentageOfSurrogateInAnotherFactionGroupMin, Settings.percentageOfSurrogateInAnotherFactionGroup)); if (nb <= 0) { if (Settings.percentageOfSurrogateInAnotherFactionGroupMin == 0.0f) { return; } else { nb = 1; } } //On va supprimer aleatoirement N pawns pour arriver a nb while (tmp.Count > nb) { Pawn p = tmp.RandomElement(); other.Add(p); tmp.Remove(p); } //Log.Message("HERE"); //On va se servir des nb pawn pregénéré par la fonction patché comme controller for (int i = 0; i != nb; i++) { //PawnGenerationRequest request = new PawnGenerationRequest(Utils.AndroidsPKD[3], parms.faction, PawnGenerationContext.NonPlayer, parms.tile, false, false, false, false, true, false, 1f, false, true, true, false, false, false, false, null, null, null, null, null, null, null, null); //Pawn surrogate = PawnGenerator.GeneratePawn(request); PawnKindDef rpkd = null; if (parms.groupKind == PawnGroupKindDefOf.Peaceful || parms.groupKind == PawnGroupKindDefOf.Trader) { if (Rand.Chance(0.10f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[3]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[3]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[3]; } } else if (Rand.Chance(0.35f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[2]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[2]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[2]; } } else if (Rand.Chance(0.55f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f)) { rpkd = Utils.AndroidsPKDNeutral[1]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[1]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[1]; } } else { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[0]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[0]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[0]; } } } else { if (Rand.Chance(0.10f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[3]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[3]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[3]; } } else if (Rand.Chance(0.35f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[2]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[2]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[2]; } } else if (Rand.Chance(0.55f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f)) { rpkd = Utils.AndroidsPKDHostile[1]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[1]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[1]; } } else { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[0]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[0]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[0]; } } } //Utils.AndroidsPKD.RandomElement(); Pawn surrogate = Utils.generateSurrogate(parms.faction, rpkd, IntVec3.Invalid, null, false, true, parms.tile, true, parms.inhabitants); //Si en mode rare alors override de la creation d'androides en ancient, on squeeze l'init du pawn if (!surrogate.IsAndroidTier()) { surrogate.Destroy(); ret.Add(tmp[i]); continue; } //Log.Message("--Surrogate generated pour "+tmp[i].def.defName); //On vire les equipements/inventaires/vetements du surrogate if (surrogate.inventory != null && surrogate.inventory.innerContainer != null) { surrogate.inventory.innerContainer.Clear(); } surrogate.apparel.DestroyAll(); surrogate.equipment.DestroyAllEquipment(); CompAndroidState cas = surrogate.ATCompState; if (cas != null) { cas.externalController = tmp[i]; CompSurrogateOwner cso = tmp[i].ATCompSurrogateOwner; if (cso != null) { cso.setControlledSurrogate(surrogate, true); } } //Transfere equipement //Log.Message("--Traitement des equipements"); if (tmp[i].equipment != null && surrogate.equipment != null) { /*Pawn_EquipmentTracker pet = tmp[i].equipment; * pet.pawn = surrogate; * tmp[i].equipment = surrogate.equipment; * tmp[i].equipment.pawn = tmp[i]; * surrogate.equipment = pet;*/ surrogate.equipment.DestroyAllEquipment(); foreach (var e in tmp[i].equipment.AllEquipmentListForReading.ToList()) { try { tmp[i].equipment.Remove(e); if (!(e.def.equipmentType == EquipmentType.Primary && surrogate.equipment.Primary != null)) { surrogate.equipment.AddEquipment(e); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertEquipment " + ex.Message + " " + ex.StackTrace); } } foreach (var e in surrogate.equipment.AllEquipmentListForReading) { try { if (Utils.CELOADED && e != null && e.def.IsRangedWeapon) { ThingComp ammoUser = Utils.TryGetCompByTypeName(e, "CompAmmoUser", "CombatExtended"); if (ammoUser != null) { var props = Traverse.Create(ammoUser).Property("Props").GetValue(); int magazineSize = Traverse.Create(props).Field("magazineSize").GetValue <int>(); ThingDef def = Traverse.Create(ammoUser).Field("selectedAmmo").GetValue <ThingDef>(); if (def != null) { Traverse.Create(ammoUser).Method("ResetAmmoCount", new object[] { def }).GetValue(); } } } } catch (Exception) { } } } /*foreach(var e in tmp[i].equipment.AllEquipmentListForReading.ToList()) * { * e. * surrogate.equipment.AddEquipment(e); * }*/ //Transfert vetements if (tmp[i].apparel != null) { try { //Log.Message("--Traitement des vetements"); foreach (var e in tmp[i].apparel.WornApparel.ToList()) { //Check si vetement peut etre porté par le surrogate string path = ""; if (e.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { path = e.def.apparel.wornGraphicPath; } else { path = e.def.apparel.wornGraphicPath + "_" + surrogate.story.bodyType.defName + "_south"; } Texture2D appFoundTex = null; Texture2D appTex = null; //CHeck dans les mods de la texture for (int j = LoadedModManager.RunningModsListForReading.Count - 1; j >= 0; j--) { appTex = LoadedModManager.RunningModsListForReading[j].GetContentHolder <Texture2D>().Get(path); if (appTex != null) { appFoundTex = appTex; break; } } //Check RW mods de la texture if (appFoundTex == null) { path = GenFilePaths.ContentPath <Texture2D>() + path; appFoundTex = (Texture2D)((object)Resources.Load <Texture2D>(path)); } //SI pb avec texture on ne l'ajoute pas if (appFoundTex != null) { tmp[i].apparel.Remove(e); surrogate.apparel.Wear(e); } } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.TransfertApparel " + ex.Message + " " + ex.StackTrace); } } //Log.Message((tmp[i].inventory == null)+" "+(tmp[i].inventory.innerContainer == null)+" "+(surrogate.inventory == null)+" "+(surrogate.inventory.innerContainer== null)); //Inventaire if (tmp[i].inventory != null && tmp[i].inventory.innerContainer != null && surrogate.inventory != null && surrogate.inventory.innerContainer != null) { //foreach (var e in tmp[i].inventory.innerContainer.ToList()) //{ //Log.Message("Items transfered " + tmp[i].inventory.innerContainer.Count); try { tmp[i].inventory.innerContainer.TryTransferAllToContainer(surrogate.inventory.innerContainer); //Suppression des drogues foreach (var el in surrogate.inventory.innerContainer.ToList()) { if (el.def.IsDrug) { surrogate.inventory.innerContainer.Remove(el); } } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertInventory " + ex.Message + " " + ex.StackTrace); } //} } ret.Add(surrogate); } //On remet dans le ret les autres pawns non "surogatisés" __result = other.Concat(ret); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns " + ex.Message + " " + ex.StackTrace); } }
public override void Resolve(ResolveParams rp) { Map map = BaseGen.globalSettings.map; Faction faction = rp.faction ?? Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined); int num = 0; int? edgeDefenseWidth = rp.edgeDefenseWidth; if (edgeDefenseWidth.HasValue) { num = rp.edgeDefenseWidth.Value; } else if (rp.rect.Width >= 20 && rp.rect.Height >= 20 && (faction.def.techLevel >= TechLevel.Industrial || Rand.Bool)) { num = ((!Rand.Bool) ? 4 : 2); } float num2 = (float)rp.rect.Area / 144f * 0.17f; BaseGen.globalSettings.minEmptyNodes = ((num2 >= 1f) ? GenMath.RoundRandom(num2) : 0); Lord singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendBase(faction, rp.rect.CenterCell), map, null); TraverseParms traverseParms = TraverseParms.For(TraverseMode.PassDoors, Danger.Deadly, false); ResolveParams resolveParams = rp; resolveParams.rect = rp.rect; resolveParams.faction = faction; resolveParams.singlePawnLord = singlePawnLord; resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement); resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms))); if (resolveParams.pawnGroupMakerParams == null) { resolveParams.pawnGroupMakerParams = new PawnGroupMakerParms(); resolveParams.pawnGroupMakerParams.tile = map.Tile; resolveParams.pawnGroupMakerParams.faction = faction; PawnGroupMakerParms arg_209_0 = resolveParams.pawnGroupMakerParams; float?settlementPawnGroupPoints = rp.settlementPawnGroupPoints; arg_209_0.points = ((!settlementPawnGroupPoints.HasValue) ? SymbolResolver_Settlement.DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value); resolveParams.pawnGroupMakerParams.inhabitants = true; resolveParams.pawnGroupMakerParams.seed = rp.settlementPawnGroupSeed; } BaseGen.symbolStack.Push("pawnGroup", resolveParams); BaseGen.symbolStack.Push("outdoorLighting", rp); if (faction.def.techLevel >= TechLevel.Industrial) { int num3 = (!Rand.Chance(0.75f)) ? 0 : GenMath.RoundRandom((float)rp.rect.Area / 400f); for (int i = 0; i < num3; i++) { ResolveParams resolveParams2 = rp; resolveParams2.faction = faction; BaseGen.symbolStack.Push("firefoamPopper", resolveParams2); } } if (num > 0) { ResolveParams resolveParams3 = rp; resolveParams3.faction = faction; resolveParams3.edgeDefenseWidth = new int?(num); BaseGen.symbolStack.Push("edgeDefense", resolveParams3); } ResolveParams resolveParams4 = rp; resolveParams4.rect = rp.rect.ContractedBy(num); resolveParams4.faction = faction; BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams4); ResolveParams resolveParams5 = rp; resolveParams5.rect = rp.rect.ContractedBy(num); resolveParams5.faction = faction; BaseGen.symbolStack.Push("basePart_outdoors", resolveParams5); }
private static void RebalanceGeneratedPawns(PawnGroupMakerParms parms, List <Pawn> pawns) { // PawnGroupKindWorker does not guaranteed that the sum of pawn points (pawn.kindDef.combatPower) <= parms.points. // Chattel pawns (slaves and animals) are not included in parms.points yet are in __result. // Also, PawnGroupKindWorker_Trader decrements parms.points for trader pawns, effectively likewise excluding them. var targetPoints = parms.points; // parms.points + special trader points (see below) var targetCount = 0; // debug only, represents the pawns contributing to targetPoints var origCount = 0; // debug only, represents the pawns contributing to parms.points // Partition into special and normal pawns, calculating combat points for each. // Note: entry lists are allocated only if necessary. var specials = new PawnAbilityPointsEntries(); var normals = new PawnAbilityPointsEntries(); var excluded = new PawnAbilityPointsEntries(); // debug only foreach (var pawn in pawns) { var entry = PawnAbilityPointsEntry.For(pawn); // parms.points is not used for slaves and animals, so exclude them. // Using GetTraderCaravanRole() for this, since Humanoid Alien Races patches this method to account for alienslavekinds. var traderCaravanRole = pawn.GetTraderCaravanRole(); if (traderCaravanRole == TraderCaravanRole.Chattel || traderCaravanRole == TraderCaravanRole.Carrier) { DebugAdd(ref excluded, entry); } // Not using TraderCaravanRole.Trader for determining traders - non-null pawn.traders is the authoritative source. else if (pawn.trader == null) { if (entry.IsSpecial) { specials.Add(entry); } else { normals.Add(entry); } DebugAdd(ref origCount, 1); DebugAdd(ref targetCount, 1); } else { // PawnGroupKindWorker_Trader reduces parms.points by trader's cost, so exclude them as well. if (entry.IsSpecial) { // Not excluding 'special' traders yet, to allow them to be disabled into normal traders in below rebalancing loop. specials.Add(entry); // Since they're not excluded yet, include them in targetPoints (and targetCount); // this will be "undone" if disabled in below rebalancing loop. DebugAdd(ref targetCount, 1); targetPoints += entry.basePoints; } else { DebugAdd(ref excluded, entry, isDebugLog); } } } if (specials.count > 0) { DebugMessage(rgpMsgPrefix + "Target: " + (targetCount != origCount ? $"#pawns = {origCount} orig + {targetCount - origCount} special trader = {targetCount}, " + $"points = {parms.points} orig + {targetPoints - parms.points} special trader = {targetPoints}" : $"#pawns = {targetCount}, points = {targetPoints}")); DebugMessage(rgpMsgPrefix + "Special: " + specials); DebugMessage(rgpMsgPrefix + "Normal: " + normals); DebugMessage(rgpMsgPrefix + "Excluded: " + excluded); // Rebalancing loop: // Until # special pawns = 0 or # pawns <= 1 or special pawn + normal pawn points <= target points: // If # special pawns > # normal pawns or special pawn points > normal pawn points: // Try to disable a random special pawn into a normal pawn. // If this fails, remove the special pawn instead. // Except if the special pawn being disabled is a trader, just exclude them like normal traders even if disabling fails. // Else: // Remove a random normal pawn. var iterCount = 0; // debug only var destroyed = new PawnAbilityPointsEntries(); // debug only while (true) { var condition = specials.count > 0 && specials.count + normals.count > 1 && specials.points + normals.points > targetPoints; DebugMessage(rgpMsgPrefix + (condition ? $"Rebalance iteration {++iterCount}" : "Final")); DebugMessage(rgpMsgPrefix + "#pawns: " + (targetCount != origCount ? $"{origCount} orig + {targetCount - origCount} special trader = {targetCount}" : $"{targetCount} orig") + $", {specials.count} special + {normals.count} normal = {specials.count + normals.count}, " + $"{excluded.count} excluded, {destroyed.count} destroyed"); DebugMessage(rgpMsgPrefix + "points: " + (targetPoints != parms.points ? $"{parms.points} orig + {targetPoints - parms.points} special trader = {targetPoints}" : $"{targetPoints} orig") + $", {specials.points} special + {normals.points} normal = {specials.points + normals.points}, " + $"{excluded.points} excluded, {destroyed.points} destroyed"); if (!condition) { break; } if (specials.count >= normals.count || specials.points >= normals.points) { var entry = specials.list.RandomElement(); var pawn = entry.pawn; specials.Remove(entry); var newEntry = entry.DisableAbilityUser(); if (pawn.trader != null) { if (newEntry.IsSpecial) { Log.Warning(rgpMsgPrefix + "DisableAbilityUser on 'special' trader pawn {entry} into " + $"'normal' trader pawn {newEntry} may not have worked, but keeping this pawn due to trader status"); // Even if disabling didn't work, exclude them like normal trader pawns from more rebalancing, but do NOT // "undo" their inclusion in targetPoints, so that rebalancing still has to account for their base points. } else { DebugMessage(rgpMsgPrefix + "Disabled special trader pawn {entry} into normal trader pawn {newEntry}"); // Once disabled, exclude them like normal trader pawns from more rebalancing, // and "undo" their inclusion in targetPoints (and targetCount). targetPoints -= newEntry.basePoints; DebugAdd(ref targetCount, -1); } DebugAdd(ref excluded, newEntry, addToList: false); } else { if (newEntry.IsSpecial) { Log.Warning(rgpMsgPrefix + "DisableAbilityUser on 'special' pawn {entry} into 'normal' pawn {newEntry} " + "may not have worked, so destroying this pawn"); pawn.DestroyOrPassToWorld(); pawns.Remove(pawn); DebugAdd(ref destroyed, newEntry, addToList: false); } else { DebugMessage(rgpMsgPrefix + "Disabled special non-trader pawn {entry} into normal non-trader pawn {newEntry}"); normals.Add(newEntry); } } } else { // Note: Since specCount < avgCount, there's at least one normal pawn. var entry = normals.list.RandomElement(); var pawn = entry.pawn; DebugMessage(rgpMsgPrefix + "Destroyed normal non-trader pawn {entry}"); normals.Remove(entry); pawn.DestroyOrPassToWorld(); pawns.Remove(pawn); DebugAdd(ref destroyed, entry, addToList: false); } } DebugMessage(rgpMsgPrefix + "Result: #pawns = {pawns.Count}" + pawns.Join(pawn => $"\n\t{PawnAbilityPointsEntry.For(pawn)}", "")); } }
protected override bool TryExecuteWorker(IncidentParms parms) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; ResolveRaidStrategy(parms, combat); ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } parms.points = AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } GenerateAnimals(parms.faction, list, (Map)parms.target, parms.points); parms.raidArrivalMode.Worker.Arrive(list, parms); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Points = " + parms.points.ToString("F0")); foreach (Pawn item in list) { string str = (item.equipment == null || item.equipment.Primary == null) ? "unarmed" : item.equipment.Primary.LabelCap; stringBuilder.AppendLine(item.KindLabel + " - " + str); } TaggedString letterLabel = GetLetterLabel(parms); TaggedString letterText = GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: true); List <TargetInfo> list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups); List <Pawn> list4 = list3.MaxBy((List <Pawn> x) => x.Count); if (list4.Any()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4 && list3[i].Any()) { list2.Add(list3[i][0]); } } } else if (list.Any()) { list2.Add(list[0]); } SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2); parms.raidStrategy.Worker.MakeLords(parms, list); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int j = 0; j < list.Count; j++) { Pawn pawn = list[j]; if (pawn.RaceProps.Humanlike && pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { this.ResolveRaidPoints(parms); if (this.disableEvent) { return(false); } if (!this.TryResolveRaidFaction(parms)) { return(false); } PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; this.ResolveRaidStrategy(parms, combat); this.ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); List <string> viewernames = Viewers.ParseViewersFromJsonAndFindActiveViewers(); if (list.Count > 0 && viewernames != null) { int count = 0; int totalviewers = viewernames.Count(); foreach (Pawn pawn in list) { if (count == list.Count() || viewernames.NullOrEmpty() || pawn.RaceProps.IsMechanoid) { continue; } int thisviewer = Verse.Rand.Range(0, viewernames.Count()); NameTriple name = pawn.Name as NameTriple; NameTriple newname = new NameTriple(name.First, viewernames[thisviewer], name.Last); if (!newname.UsedThisGame || ToolkitSettings.RepeatViewerNames) { pawn.Name = newname; } viewernames.RemoveAt(thisviewer); count++; } } if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms, false); return(false); } parms.raidArrivalMode.Worker.Arrive(list, parms); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Points = " + parms.points.ToString("F0")); foreach (Pawn current in list) { string str = (current.equipment == null || current.equipment.Primary == null) ? "unarmed" : current.equipment.Primary.LabelCap; stringBuilder.AppendLine(current.KindLabel + " - " + str); } string letterLabel = this.GetLetterLabel(parms); string letterText = this.GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true, true); List <TargetInfo> list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups); List <Pawn> list4 = list3.MaxBy((List <Pawn> x) => x.Count); if (list4.Any <Pawn>()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4) { if (list3[i].Any <Pawn>()) { list2.Add(list3[i][0]); } } } } else if (list.Any <Pawn>()) { list2.Add(list[0]); } Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), list2, parms.faction, stringBuilder.ToString()); parms.raidStrategy.Worker.MakeLords(parms, list); return(true); }
static void Postfix(ref IEnumerable <Pawn> __result, PawnGroupMakerParms parms, bool warnOnZeroResults = true) { Faction faction = parms.faction; if (faction == null) { // if (Prefs.DevMode) Log.Message("Faction null"); return; } if (__result.EnumerableNullOrEmpty()) { // if (Prefs.DevMode) Log.Message("no pawns"); return; } List <Pawn> resultingPawns = __result.ToList(); int pawnsInRaid = resultingPawns.Count; for (int i = 0; i < pawnsInRaid; i++) { Pawn trainer = resultingPawns[i]; SpawnWithAnimalsExtension ext = null; if (trainer.kindDef.HasModExtension <SpawnWithAnimalsExtension>()) { ext = trainer.kindDef.GetModExtensionFast <SpawnWithAnimalsExtension>(); } if (ext != null) { if (ext.kindDefs.NullOrEmpty()) { continue; } int animalPoints; int amountToAdd; PawnKindDef kindDef; if (ext.animalPoints > 0) { if (ext.kindDefs.Any(x => x.Cost < ext.animalPoints)) { animalPoints = (int)ext.animalPoints; } else { animalPoints = (int)(parms.points * ext.animalPoints); } } else { animalPoints = (int)(parms.points / pawnsInRaid); } kindDef = ext.kindDefs.RandomElementByWeight(x => x.selectionWeight).kind; amountToAdd = (int)Mathf.Clamp(animalPoints / kindDef.combatPower, ext.animalCount.min, ext.animalCount.max); if (amountToAdd == 0) { //if (Prefs.DevMode) Log.Message("[AnimalHusbandryRaids] Too few pawns to add animals to, ignoring."); return; } if (Prefs.DevMode) { Log.Message($"[AnimalHusbandryRaids] Adding {amountToAdd} animals to raid from {faction.Name}, {faction.def.defName}."); } for (int i2 = 0; i2 < amountToAdd; i2++) { Pawn foundPawn = PawnGenerator.GeneratePawn(ext.kindDefs.RandomElementByWeight(x => x.selectionWeight).kind, faction); if (foundPawn == null) { return; } foundPawn.SetFaction(faction); foundPawn.training.Train(TrainableDefOf.Obedience, null, true); foundPawn.training.SetWantedRecursive(TrainableDefOf.Obedience, true); trainer.relations.AddDirectRelation(PawnRelationDefOf.Bond, foundPawn); foundPawn.playerSettings.Master = trainer; resultingPawns.Add(foundPawn); } } } __result = resultingPawns; }
public static List <Pawn> GeneratePawnsForBoats(IncidentParms parms, PawnGroupKindDef group) { PawnGroupMakerParms pawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(group, parms, true); return(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, false).ToList <Pawn>()); }
// Token: 0x0600007E RID: 126 RVA: 0x00004D24 File Offset: 0x00002F24 public override void Resolve(ResolveParams rp) { Map map = BaseGen.globalSettings.map; Faction faction = rp.faction ?? Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined); int num = 0; int? edgeDefenseWidth = rp.edgeDefenseWidth; if (edgeDefenseWidth != null) { num = rp.edgeDefenseWidth.Value; } else if (rp.rect.Width >= 40 && rp.rect.Height >= 20 && (faction.def.techLevel >= TechLevel.Animal || Rand.Bool)) { num = ((!Rand.Bool) ? 4 : 2); } float num2 = (float)rp.rect.Area / 144f * 0.17f; BaseGen.globalSettings.minEmptyNodes = ((num2 >= 1f) ? GenMath.RoundRandom(num2) : 0); Lord singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendBase(faction, rp.rect.CenterCell), map, null); TraverseParms traverseParms = TraverseParms.For(TraverseMode.PassDoors, Danger.Deadly, false); ResolveParams resolveParams = rp; resolveParams.rect = rp.rect; resolveParams.faction = faction; resolveParams.singlePawnLord = singlePawnLord; resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement); resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms))); if (resolveParams.pawnGroupMakerParams == null) { resolveParams.pawnGroupMakerParams = new PawnGroupMakerParms(); resolveParams.pawnGroupMakerParams.tile = map.Tile; resolveParams.pawnGroupMakerParams.faction = faction; PawnGroupMakerParms pawnGroupMakerParams = resolveParams.pawnGroupMakerParams; float?settlementPawnGroupPoints = rp.settlementPawnGroupPoints; pawnGroupMakerParams.points = ((settlementPawnGroupPoints == null) ? SymbolResolver_AdvancedGeneration.DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value); resolveParams.pawnGroupMakerParams.inhabitants = true; resolveParams.pawnGroupMakerParams.seed = rp.settlementPawnGroupSeed; } BaseGen.symbolStack.Push("hives", resolveParams); BaseGen.symbolStack.Push("hives", rp); if (faction.def.techLevel >= TechLevel.Animal) { int num3 = Rand.Chance(1f) ? GenMath.RoundRandom((float)rp.rect.Area / 400f) : 0; for (int i = 0; i < num3; i++) { ResolveParams resolveParams2 = rp; resolveParams2.faction = faction; BaseGen.symbolStack.Push("hives", resolveParams2); } ResolveParams resolveParams3 = rp; resolveParams3.hivesCount = new int?(Rand.RangeInclusive(4, 5)); BaseGen.symbolStack.Push("hives", resolveParams3); } if (num > 0) { ResolveParams resolveParams4 = rp; resolveParams4.faction = faction; resolveParams4.edgeDefenseWidth = new int?(num); BaseGen.symbolStack.Push("edgeDefense", resolveParams4); } ResolveParams resolveParams5 = rp; resolveParams5.rect = rp.rect.ContractedBy(num); resolveParams5.faction = faction; BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams5); ResolveParams resolveParams6 = rp; resolveParams6.rect = rp.rect.ContractedBy(num); resolveParams6.faction = faction; BaseGen.symbolStack.Push("basePart_outdoors", resolveParams6); ResolveParams resolveParams7 = rp; resolveParams7.floorDef = TerrainDefOf.Bridge; bool?floorOnlyIfTerrainSupports = rp.floorOnlyIfTerrainSupports; resolveParams7.floorOnlyIfTerrainSupports = new bool?(floorOnlyIfTerrainSupports == null || floorOnlyIfTerrainSupports.Value); BaseGen.symbolStack.Push("floor", resolveParams7); }
private void DrawFactionButtons(Rect inRect, int buttonSize) //Used to draw a list of buttons from the 'buttons' list { Text.Anchor = TextAnchor.MiddleCenter; Text.Font = GameFont.Small; for (int i = 0; i < buttons.Count; i++) { if (Widgets.ButtonText(new Rect(140, 110 + ((buttonSize + 5) * i), 170, buttonSize), buttons[i])) { if (buttons[i] == "FCOverview".Translate()) { //if click trade policy button //Log.Message(buttons[i]); Log.Message("Success"); Find.WindowStack.Add(new FCWindow_Overview()); } if (buttons[i] == "Military".Translate()) { if (FactionColonies.getPlayerColonyFaction() == null) { Messages.Message(new Message("NoFactionForMilitary".Translate(), MessageTypeDefOf.RejectInput)); } else { Find.WindowStack.Add(new militaryCustomizationWindowFC()); } } if (buttons[i] == "Actions".Translate()) { List <FloatMenuOption> list = new List <FloatMenuOption>(); list.Add(new FloatMenuOption("TaxDeliveryMap".Translate(), delegate { List <FloatMenuOption> list2 = new List <FloatMenuOption>(); list2.Add(new FloatMenuOption("SetMap".Translate(), delegate { List <FloatMenuOption> settlementList = new List <FloatMenuOption>(); foreach (Map map in Find.Maps) { if (map.IsPlayerHome) { settlementList.Add(new FloatMenuOption(map.Parent.LabelCap, delegate { faction.taxMap = map; Find.LetterStack.ReceiveLetter("Map Set!", "The tax delivery map has been set to the player colony of " + map.Parent.LabelCap + ".\n All taxes and other goods will be delivered there", LetterDefOf.NeutralEvent); } )); } } if (settlementList.Count == 0) { settlementList.Add(new FloatMenuOption("No valid settlements to use.", null)); } FloatMenu floatMenu2 = new FloatMenu(settlementList); floatMenu2.vanishIfMouseDistant = true; Find.WindowStack.Add(floatMenu2); })); FloatMenu floatMenu = new FloatMenu(list2); floatMenu.vanishIfMouseDistant = true; Find.WindowStack.Add(floatMenu); })); list.Add(new FloatMenuOption("SetCapital".Translate(), delegate { faction.setCapital(); })); list.Add(new FloatMenuOption("ActivateResearch".Translate(), delegate { faction.updateDailyResearch(); })); list.Add(new FloatMenuOption("ResearchLevel".Translate(), delegate { Messages.Message("CurrentResearchLevel".Translate(faction.techLevel.ToString(), faction.returnNextTechToLevel()), MessageTypeDefOf.NeutralEvent); })); if (faction.hasPolicy(FCPolicyDefOf.technocratic)) { list.Add(new FloatMenuOption("FCSendResearchItems".Translate(), delegate { if (Find.ColonistBar.GetColonistsInOrder().Count > 0) { Pawn playerNegotiator = Find.ColonistBar.GetColonistsInOrder()[0]; //Log.Message(playerNegotiator.Name + " Negotiator"); FCTrader_Research trader = new FCTrader_Research(); Find.WindowStack.Add(new Dialog_Trade(playerNegotiator, trader)); } else { Log.Message("Where are all the colonists?"); } })); } if (faction.hasPolicy(FCPolicyDefOf.feudal)) { list.Add(new FloatMenuOption("FCRequestMercenary".Translate(), delegate { if (faction.traitFeudalBoolCanUseMercenary) { faction.traitFeudalBoolCanUseMercenary = false; faction.traitFeudalTickLastUsedMercenary = Find.TickManager.TicksGame; List <PawnKindDef> listKindDef = new List <PawnKindDef>(); foreach (ThingDef def in Find.World.GetComponent <FactionFC>().raceFilter.AllowedThingDefs) { listKindDef.Add(def.race.AnyPawnKind); } PawnGroupMaker groupMaker = FactionColonies.getPlayerColonyFaction().def.pawnGroupMakers.RandomElement(); PawnGroupMakerParms group = new PawnGroupMakerParms(); group.groupKind = groupMaker.kindDef; group.faction = FactionColonies.getPlayerColonyFaction(); group.dontUseSingleUseRocketLaunchers = true; group.generateFightersOnly = true; group.points = 2000; group.raidStrategy = RaidStrategyDefOf.ImmediateAttackFriendly; PawnKindDef pawnkind = new PawnKindDef(); PawnKindDef kind = groupMaker.GeneratePawns(group).RandomElement().kindDef; pawnkind = listKindDef.RandomElement(); pawnkind.techHediffsTags = kind.techHediffsTags; pawnkind.apparelTags = kind.apparelTags; pawnkind.isFighter = kind.isFighter; pawnkind.combatPower = kind.combatPower; pawnkind.gearHealthRange = kind.gearHealthRange; pawnkind.weaponTags = kind.weaponTags; pawnkind.apparelMoney = kind.apparelMoney; pawnkind.weaponMoney = kind.weaponMoney; pawnkind.apparelAllowHeadgearChance = kind.apparelAllowHeadgearChance; pawnkind.techHediffsMoney = kind.techHediffsMoney; pawnkind.label = kind.label; Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnkind, Find.FactionManager.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 20f)); IncidentParms parms = new IncidentParms(); parms.target = Find.CurrentMap; parms.faction = FactionColonies.getPlayerColonyFaction(); parms.points = 999; parms.raidArrivalModeForQuickMilitaryAid = true; parms.raidNeverFleeIndividual = true; parms.raidForceOneIncap = true; parms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop; parms.raidStrategy = RaidStrategyDefOf.ImmediateAttackFriendly; parms.raidArrivalModeForQuickMilitaryAid = true; PawnsArrivalModeWorker_EdgeWalkIn worker = new PawnsArrivalModeWorker_EdgeWalkIn(); worker.TryResolveRaidSpawnCenter(parms); worker.Arrive(new List <Pawn> { pawn }, parms); Find.LetterStack.ReceiveLetter("FCMercenaryJoined".Translate(), "FCMercenaryJoinedText".Translate(pawn.NameFullColored), LetterDefOf.PositiveEvent, new LookTargets(pawn)); } else { Messages.Message("FCActionMercenaryOnCooldown".Translate(((faction.traitFeudalTickLastUsedMercenary + GenDate.TicksPerSeason) - Find.TickManager.TicksGame).ToStringTicksToDays()), MessageTypeDefOf.RejectInput); } })); } FloatMenu menu = new FloatMenu(list); Find.WindowStack.Add(menu); } } } }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; IEnumerable <Building> source = map.listerBuildings.AllBuildingsColonistOfDef(ThingDef.Named("RD_Stargate")); bool result; if (source.Count <Building>() == 0) { result = false; } else { Building building = source.FirstOrDefault <Building>(); this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { result = false; } else { this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat); this.ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { result = false; } else { PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, true); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); result = false; } else { TargetInfo target = TargetInfo.Invalid; foreach (Pawn pawn in list) { IntVec3 position = building.Position; GenSpawn.Spawn(pawn, position, map, parms.spawnRotation, WipeMode.Vanish, false); target = pawn; } // TODO: Check if these parameters are correct in this raid Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, false, false, true), map, list); // not sure what to write here instead, while commented out //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 pawn2 = list[i]; if (pawn2.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } base.SendStandardLetter(parms, target, new NamedArgument[] { parms.faction.Name }); Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; result = true; } } } } return(result); }
private static bool Prefix(PawnGroupMakerParms parms, PawnGroupMaker groupMaker, Pawn trader, List <Thing> wares, List <Pawn> outPawns) { Func <Thing, float> massTotaler = t => t.stackCount * t.GetStatValue(StatDefOf.Mass, true); List <Thing> list = wares.Where(t => !(t is Pawn)).ToList(); list.SortByDescending(massTotaler); float ttlMassThings = list.Sum(massTotaler); float ttlCapacity = 0f; float ttlBodySize = 0f; int numCarriers = 0; IEnumerable <PawnGenOption> carrierKinds = groupMaker.carriers.Where(p => { if (parms.tile != -1) { return(Find.WorldGrid[parms.tile].biome.IsPackAnimalAllowed(p.kind.race)); } return(true); }); PawnKindDef kind = carrierKinds.RandomElementByWeight(x => x.selectionWeight).kind; // No slow or small juveniles Predicate <Pawn> validator = (p => p.ageTracker.CurLifeStage.bodySizeFactor >= 1 && p.GetStatValue(StatDefOf.MoveSpeed, true) >= p.kindDef.race.GetStatValueAbstract(StatDefOf.MoveSpeed) ); // 50/50 chance of uniform carriers (like vanilla) or mixed carriers bool mixedCarriers = Rand.RangeInclusive(0, 1) == 1; // Generate all of the carrier pawns (empty). Either we spawn as many pawns as we need to cover // 120% of the weight of the items, or enough pawns before it seems "unreasonable" based on body // size. for (; ttlCapacity < ttlMassThings * 1.2 && ttlBodySize < 20; numCarriers++) { PawnGenerationRequest request = new PawnGenerationRequest( kind: kind, faction: parms.faction, tile: parms.tile, inhabitant: parms.inhabitants, validatorPreGear: validator ); Pawn pawn = PawnGenerator.GeneratePawn(request); outPawns.Add(pawn); ttlCapacity += MassUtility.Capacity(pawn); // Still can't have 100 chickenmuffalos. That might slow down some PCs. ttlBodySize += Mathf.Max(pawn.BodySize, 0.5f); if (mixedCarriers) { kind = carrierKinds.RandomElementByWeight(x => x.selectionWeight).kind; } } // Add items (in descending order of weight) to randomly chosen pack animals. This isn't the most // efficient routine, as we're trying to be a bit random. If I was trying to be efficient, I would // use something like SortByDescending(p.Capacity) against the existing thing list. foreach (Thing thing in list) { List <Pawn> validPawns = outPawns.FindAll(p => !MassUtility.WillBeOverEncumberedAfterPickingUp(p, thing, thing.stackCount)); if (validPawns.Count() != 0) { validPawns.RandomElement().inventory.innerContainer.TryAdd(thing, true); } else if (thing.stackCount > 1) { // No carrier can handle the full stack; split it up int countLeft = thing.stackCount; int c = 0; // safety counter (while loops can be dangerous) while (countLeft > 0) { validPawns = outPawns.FindAll(p => MassUtility.CountToPickUpUntilOverEncumbered(p, thing) >= 1); if (validPawns.Count() != 0 && c < thing.stackCount) { Pawn pawn = validPawns.RandomElement(); int countToAdd = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(pawn, thing), countLeft); countLeft -= pawn.inventory.innerContainer.TryAdd(thing, countToAdd, true); } else { // Either no carrier can handle a single item, or we're just in some bad while loop breakout. In // any case, force it in, evenly split among all carriers. int splitCount = Mathf.FloorToInt(countLeft / outPawns.Count()); if (splitCount > 0) { outPawns.ForEach(p => p.inventory.innerContainer.TryAdd(thing, splitCount, true)); countLeft -= splitCount * outPawns.Count(); } // Give the remainer to the ones with space (one at a time) while (countLeft > 0) { validPawns = new List <Pawn>(outPawns); validPawns.SortByDescending(p => MassUtility.FreeSpace(p)); validPawns.First().inventory.innerContainer.TryAdd(thing, 1, true); countLeft--; } break; } c++; } } else { // No way to split it; force it in validPawns = new List <Pawn>(outPawns); validPawns.SortByDescending(p => MassUtility.FreeSpace(p)); validPawns.First().inventory.innerContainer.TryAdd(thing, true); } } // Always skip the original method return(false); }
public override void Resolve(ResolveParams rp) { REDataCache.TyrantEncounterGenerated = false; REDataCache.ZombieDogEncounterGenerated = false; REDataCache.GEncounterGenerated = false; Map map = BaseGen.globalSettings.map; Faction faction = rp.faction ?? Find.FactionManager.RandomEnemyFaction(); rp.wallStuff = ThingDefOf.Steel; rp.floorDef = TerrainDef.Named("BrokenAsphalt"); int num = 0; int?edgeDefenseWidth = rp.edgeDefenseWidth; if (edgeDefenseWidth.HasValue) { num = rp.edgeDefenseWidth.Value; } else if (rp.rect.Width >= 20 && rp.rect.Height >= 20 && ((int)faction.def.techLevel >= 4 || Rand.Bool)) { num = ((!Rand.Bool) ? 4 : 2); } float num2 = (float)rp.rect.Area / 144f * 0.17f; BaseGen.globalSettings.minEmptyNodes = ((!(num2 < 1f)) ? GenMath.RoundRandom(num2) : 0); Lord singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendZombieBase(faction, map.Center), map); TraverseParms traverseParms = TraverseParms.For(TraverseMode.PassDoors); ResolveParams resolveParams = rp; resolveParams.rect = rp.rect; resolveParams.faction = faction; resolveParams.singlePawnLord = singlePawnLord; resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement); resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((Predicate <IntVec3>)((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms)))); if (resolveParams.pawnGroupMakerParams == null) { resolveParams.pawnGroupMakerParams = new PawnGroupMakerParms(); resolveParams.pawnGroupMakerParams.tile = map.Tile; resolveParams.pawnGroupMakerParams.faction = faction; PawnGroupMakerParms pawnGroupMakerParams = resolveParams.pawnGroupMakerParams; float?settlementPawnGroupPoints = rp.settlementPawnGroupPoints; pawnGroupMakerParams.points = ((!settlementPawnGroupPoints.HasValue) ? DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value); resolveParams.pawnGroupMakerParams.inhabitants = true; resolveParams.pawnGroupMakerParams.seed = rp.settlementPawnGroupSeed; } BaseGen.symbolStack.Push("pawnGroup", resolveParams); BaseGen.symbolStack.Push("outdoorLighting", rp); ResolveParams resolveParams4 = rp; resolveParams4.rect = rp.rect.ContractedBy(num); resolveParams4.faction = faction; BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams4); if (Find.Scenario.name == "Resident Evil - Umbrella Corp") { ResolveParams umbrellaCorp = rp; umbrellaCorp.rect = new CellRect(map.Center.x - 12, map.Center.z - 12, 24, 24); umbrellaCorp.wallStuff = ThingDefOf.Plasteel; umbrellaCorp.floorDef = TerrainDef.Named("SterileTile"); umbrellaCorp.faction = Faction.OfPlayer; BaseGen.symbolStack.Push("emptyRoom", umbrellaCorp); BaseGen.symbolStack.Push("floor", umbrellaCorp); BaseGen.symbolStack.Push("clear", umbrellaCorp); } ResolveParams resolveParams5 = rp; resolveParams5.rect = rp.rect.ContractedBy(num); resolveParams5.faction = faction; BaseGen.symbolStack.Push("zombieBasePart_outdoors", resolveParams5); ResolveParams resolveParams6 = rp; //resolveParams6.rect = rp.rect.ExpandedBy(3); //resolveParams6.floorDef = TerrainDef.Named("BrokenAsphalt"); //bool? floorOnlyIfTerrainSupports = rp.floorOnlyIfTerrainSupports; //resolveParams6.floorOnlyIfTerrainSupports = false; //BaseGen.symbolStack.Push("floor", resolveParams6); //Clear the land... ResolveParams clearParams = rp; clearParams.rect = rp.rect; BaseGen.symbolStack.Push("clear", clearParams); }
private void CheckAnswer(string answer) { if (answer == "конец") { return; } HelpCount--; int techLevel = (int)interaction.Faction.def.techLevel; bool useCaravan = techLevel < (int)TechLevel.Industrial; string caravanText = useCaravan ? "UsingCaravan".Translate() : "UsingCapsules".Translate(); if (answer == "resources") { ThingSetMaker_MarketValue maker = new ThingSetMaker_MarketValue(); ThingSetMakerParams parms2 = default; parms2.totalMarketValueRange = new FloatRange(1000, 2000); parms2.filter = GetFilter(); parms2.techLevel = interaction.Faction.def.techLevel; maker.fixedParams = parms2; if (useCaravan) { AssistCaravanWithFixedInventoryComp assistComp = new AssistCaravanWithFixedInventoryComp(maker.Generate(), Rand.Range(1, 3) * 60000, interaction.Faction, speaker.Map); assistComp.id = QuestsManager.Communications.UniqueIdManager.GetNextComponentID(); QuestsManager.Communications.RegisterComponent(assistComp); } else { SendCapsules(maker.Generate()); } Find.LetterStack.ReceiveLetter("Help_AskResoucesTitle".Translate(), "Help_AskResouces".Translate(interaction.Faction, caravanText), LetterDefOf.PositiveEvent); } if (answer == "power") { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = interaction.Faction, points = DiplomacyTuning.RequestedMilitaryAidPointsRange.RandomInRange, generateFightersOnly = true, groupKind = PawnGroupKindDefOf.Combat, raidStrategy = RaidStrategyDefOf.ImmediateAttack, forceOneIncap = true }; IncidentParms incidentParms = new IncidentParms(); incidentParms.target = speaker.Map; incidentParms.faction = interaction.Faction; incidentParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop; incidentParms.points = DiplomacyTuning.RequestedMilitaryAidPointsRange.RandomInRange; interaction.Faction.lastMilitaryAidRequestTick = Find.TickManager.TicksGame; if (useCaravan) { incidentParms.raidArrivalMode = PawnsArrivalModeDefOf.EdgeWalkIn; Find.Storyteller.incidentQueue.Add(IncidentDefOf.RaidFriendly, Find.TickManager.TicksGame + 11000, incidentParms); } else { IncidentDefOf.RaidFriendly.Worker.TryExecute(incidentParms); } Find.LetterStack.ReceiveLetter("Help_AskPowerTitle".Translate(), "Help_AskPower".Translate(interaction.Faction, caravanText), LetterDefOf.PositiveEvent); } }
protected override bool TryExecuteWorker(IncidentParms parms) { parms.raidArrivalMode = ForcedArriveMode; ResolveRaidPoints(parms: parms); if (!TryResolveRaidFaction(parms: parms)) { Log.Message(text: "Failed solar raid: no faction found."); return(false); } PawnGroupKindDef combat = Defs_Rimworld.CombatGroup; ResolveRaidStrategy(parms: parms, groupKind: combat); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms: parms)) { return(false); } parms.points = AdjustedRaidPoints( points: parms.points, raidArrivalMode: parms.raidArrivalMode, raidStrategy: parms.raidStrategy, faction: parms.faction, groupKind: combat ); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms( groupKind: combat, parms: parms, ensureCanGenerateAtLeastOnePawn: false ); SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: defaultPawnGroupMakerParms, pawnGroupMaker: out PawnGroupMaker pawnGroupMaker); List <Pawn> list = SolarRaid_PawnGenerator.GeneratePawns(parms: defaultPawnGroupMakerParms, groupMaker: pawnGroupMaker).ToList(); if (list.Count == 0) { return(false); } parms.raidArrivalMode.Worker.Arrive(pawns: list, parms: parms); var stringBuilder = new StringBuilder(); stringBuilder.AppendLine(value: "Points = " + parms.points.ToString(format: "F0")); foreach (Pawn pawn in list) { string str = pawn.equipment?.Primary == null ? "unarmed" : pawn.equipment.Primary.LabelCap; stringBuilder.AppendLine(value: pawn.KindLabel + " - " + str); } #if RW10 string letterLabel = GetLetterLabel(parms: parms); string letterText = GetLetterText(parms: parms, pawns: list); #else TaggedString letterLabel = GetLetterLabel(parms: parms); TaggedString letterText = GetLetterText(parms: parms, pawns: list); #endif PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter( seenPawns: list, letterLabel: ref letterLabel, letterText: ref letterText, relationsInfoHeader: GetRelatedPawnsInfoLetterText(parms: parms), informEvenIfSeenBefore: true, writeSeenPawnsNames: true ); var list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(pawns: list, groups: parms.pawnGroups); List <Pawn> list4 = list3.MaxBy(selector: x => x.Count); if (list4.Any()) { list2.Add(item: list4[index: 0]); } for (var i = 0; i < list3.Count; i++) { if (list3[index: i] != list4) { if (list3[index: i].Any()) { list2.Add(item: list3[index: i][index: 0]); } } } } else if (list.Any()) { list2.Add(item: list[index: 0]); } Find.LetterStack.ReceiveLetter( label: letterLabel, text: letterText, textLetterDef: GetLetterDef(), lookTargets: list2, relatedFaction: parms.faction, debugInfo: stringBuilder.ToString() ); parms.raidStrategy.Worker.MakeLords(parms: parms, pawns: list); LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.EquippingWeapons, opp: OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(conc: ConceptDefOf.ShieldBelts)) { for (var j = 0; j < list.Count; j++) { Pawn pawn2 = list[index : j]; if (pawn2.apparel.WornApparel.Any(predicate: ap => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.ShieldBelts, opp: OpportunityType.Critical); break; } } } Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; return(true); }
public static void Listener(PawnGroupMakerParms parms, bool warnOnZeroResults, ref IEnumerable <Pawn> __result) { try { if (!Settings.otherFactionsCanUseSurrogate || Utils.ExceptionBlacklistedFactionNoSurrogate.Contains(parms.faction.def.defName) || Utils.getRandomMapOfPlayer().gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare) || Settings.androidsAreRare && Rand.Chance(0.95f)) { return; } IEnumerable <Pawn> pawn = __result as Pawn[] ?? __result.ToArray(); var nbHumanoids = pawn.Where(e => e.def.race != null && e.def.race.Humanlike).Count(e => e.trader == null && e.TraderKind == null); /*if(e.def.defName == Utils.T1 || e.def.defName == Utils.T2) * { * Utils.removeAllTraits(e); * }*/ if (parms.faction.def.techLevel < TechLevel.Industrial || nbHumanoids < 5) { return; } { var ret = new List <Pawn>(); var tmp = pawn.ToList(); var other = tmp.Where(x => x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null).ToList(); foreach (var e in other) { tmp.Remove(e); } var nb = (int)(tmp.Count() * Rand.Range(Settings.percentageOfSurrogateInAnotherFactionGroupMin, Settings.percentageOfSurrogateInAnotherFactionGroup)); if (nb <= 0) { if (Settings.percentageOfSurrogateInAnotherFactionGroupMin == 0.0f) { return; } nb = 1; } while (tmp.Count > nb) { var p = tmp.RandomElement(); other.Add(p); tmp.Remove(p); } for (var i = 0; i != nb; i++) { PawnKindDef rpkd = null; if (parms.groupKind == PawnGroupKindDefOf.Peaceful || parms.groupKind == PawnGroupKindDefOf.Trader) { if (Rand.Chance(0.10f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[3]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[3]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[3]; } } else if (Rand.Chance(0.35f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[2]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[2]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[2]; } } else if (Rand.Chance(0.55f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f)) { rpkd = Utils.AndroidsPKDNeutral[1]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[1]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[1]; } } else { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDNeutral[0]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDNeutral[0]; } else { rpkd = Utils.AndroidsXSeriePKDNeutral[0]; } } } else { if (Rand.Chance(0.10f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[3]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[3]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[3]; } } else if (Rand.Chance(0.35f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[2]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[2]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[2]; } } else if (Rand.Chance(0.55f)) { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f)) { rpkd = Utils.AndroidsPKDHostile[1]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[1]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[1]; } } else { if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f)) { rpkd = Utils.AndroidsPKDHostile[0]; } else if (Rand.Chance(0.75f)) { rpkd = Utils.AndroidsXISeriePKDHostile[0]; } else { rpkd = Utils.AndroidsXSeriePKDHostile[0]; } } } var surrogate = Utils.generateSurrogate(parms.faction, rpkd, IntVec3.Invalid, null, false, true, parms.tile, true, parms.inhabitants); if (!surrogate.IsAndroidTier()) { surrogate.Destroy(); ret.Add(tmp[i]); continue; } if (surrogate.inventory != null && surrogate.inventory.innerContainer != null) { surrogate.inventory.innerContainer.Clear(); } surrogate.apparel.DestroyAll(); surrogate.equipment.DestroyAllEquipment(); var cas = surrogate.TryGetComp <CompAndroidState>(); if (cas != null) { cas.externalController = tmp[i]; var cso = tmp[i].TryGetComp <CompSurrogateOwner>(); cso?.setControlledSurrogate(surrogate, true); } if (tmp[i].equipment != null && surrogate.equipment != null) { /*Pawn_EquipmentTracker pet = tmp[i].equipment; * pet.pawn = surrogate; * tmp[i].equipment = surrogate.equipment; * tmp[i].equipment.pawn = tmp[i]; * surrogate.equipment = pet;*/ surrogate.equipment.DestroyAllEquipment(); foreach (var e in tmp[i].equipment.AllEquipmentListForReading.ToList()) { try { tmp[i].equipment.Remove(e); if (!(e.def.equipmentType == EquipmentType.Primary && surrogate.equipment.Primary != null)) { surrogate.equipment.AddEquipment(e); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertEquipment " + ex.Message + " " + ex.StackTrace); } } foreach (var e in surrogate.equipment.AllEquipmentListForReading) { try { if (!Utils.CELOADED || e == null || !e.def.IsRangedWeapon) { continue; } var ammoUser = Utils.TryGetCompByTypeName(e, "CompAmmoUser", "CombatExtended"); if (ammoUser == null) { continue; } var props = Traverse.Create(ammoUser).Property("Props").GetValue(); var magazineSize = Traverse.Create(props).Field("magazineSize").GetValue <int>(); var def = Traverse.Create(ammoUser).Field("selectedAmmo").GetValue <ThingDef>(); if (def != null) { Traverse.Create(ammoUser).Method("ResetAmmoCount", def).GetValue(); } } catch (Exception) { } } } /*foreach(var e in tmp[i].equipment.AllEquipmentListForReading.ToList()) * { * e. * surrogate.equipment.AddEquipment(e); * }*/ if (tmp[i].apparel != null) { try { foreach (var e in tmp[i].apparel.WornApparel.ToList()) { var path = ""; if (e.def.apparel.LastLayer == ApparelLayerDefOf.Overhead) { path = e.def.apparel.wornGraphicPath; } else { path = e.def.apparel.wornGraphicPath + "_" + surrogate.story.bodyType.defName + "_south"; } Texture2D appFoundTex = null; for (var j = LoadedModManager.RunningModsListForReading.Count - 1; j >= 0; j--) { var appTex = LoadedModManager.RunningModsListForReading[j].GetContentHolder <Texture2D>().Get(path); if (appTex == null) { continue; } appFoundTex = appTex; break; } if (appFoundTex == null) { path = GenFilePaths.ContentPath <Texture2D>() + path; appFoundTex = Resources.Load <Texture2D>(path); } if (appFoundTex == null) { continue; } tmp[i].apparel.Remove(e); surrogate.apparel.Wear(e); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.TransfertApparel " + ex.Message + " " + ex.StackTrace); } } if (tmp[i].inventory != null && tmp[i].inventory.innerContainer != null && surrogate.inventory != null && surrogate.inventory.innerContainer != null) { try { tmp[i].inventory.innerContainer.TryTransferAllToContainer(surrogate.inventory.innerContainer); foreach (var el in surrogate.inventory.innerContainer.ToList().Where(el => el.def.IsDrug)) { surrogate.inventory.innerContainer.Remove(el); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertInventory " + ex.Message + " " + ex.StackTrace); } } ret.Add(surrogate); } __result = other.Concat(ret); } } catch (Exception ex) { Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns " + ex.Message + " " + ex.StackTrace); } }
public override bool TryExecute(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } 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 = TargetInfo.Invalid; List <ShipBase> ships = DropShipUtility.CreateDropShips(list, parms.faction); DropShipUtility.DropShipGroups(parms.spawnCenter, 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.GetLetterType(), target, stringBuilder.ToString()); if (this.GetLetterType() == LetterType.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); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.PersonalShields)) { for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is PersonalShield)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, 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 override void PassingParameters(ResolveParams rp) { string defChair = "DiningChair"; string defLamp = "Jecrell_GasLamp"; ThingDef lampDef = Cthulhu.Utility.IsIndustrialAgeLoaded() ? ThingDef.Named(defLamp) : ThingDefOf.TorchLamp; ThingDef lampStuffDef = Cthulhu.Utility.IsIndustrialAgeLoaded() ? ThingDefOf.Steel : null; Map map = BaseGen.globalSettings.map; bool @bool = Rand.Bool; bool hasLamp = false; ThingDef thingDef = ThingDefOf.SleepingSpot; ThingDef chairDef = ThingDef.Named(defChair); foreach (IntVec3 current in rp.rect) { if (@bool) { if (current.x % 3 != 0 || current.z % 3 != 0) { continue; } } else if (current.x % 3 != 0 || current.z % 3 != 0) { continue; } Rot4 rot = (!@bool) ? Rot4.South : Rot4.West; if (!GenSpawn.WouldWipeAnythingWith(current, rot, thingDef, map, (Thing x) => x.def.category == ThingCategory.Building)) { bool flag = false; foreach (IntVec3 current2 in GenAdj.CellsOccupiedBy(current, rot, thingDef.Size)) { if (BaseGenUtility.AnyDoorAdjacentCardinalTo(current2, map)) { flag = true; break; } } if (!flag) { ///Bed ThingDef stuff = null; if (thingDef.MadeFromStuff) { stuff = ThingDefOf.WoodLog; } Thing thing = ThingMaker.MakeThing(thingDef, stuff); thing.SetFaction(rp.faction, null); GenSpawn.Spawn(thing, current, map, rot); if (thing != null) { if (thing.Spawned && thing.Position.InBounds(map)) { CellRect thingRect = thing.OccupiedRect(); if (thingRect != null) { thingRect = thingRect.ExpandedBy(1); List <IntVec3> possibleCells = new List <IntVec3>(); possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.North)); possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.South)); possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.East)); possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.West)); possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 0)); possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 1)); possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 2)); possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 3)); IntVec3 spawnPos = IntVec3.Invalid; spawnPos = possibleCells.InRandomOrder <IntVec3>().FirstOrDefault((IntVec3 x) => x.InBounds(map) && x.Walkable(map)); if (spawnPos != null) { possibleCells.Remove(spawnPos); Thing thing2 = ThingMaker.MakeThing(chairDef, ThingDefOf.WoodLog); thing2.SetFaction(rp.faction, null); GenSpawn.Spawn(thing2, spawnPos, map, rot.Opposite); } if (!hasLamp) { hasLamp = true; spawnPos = possibleCells.FirstOrDefault((IntVec3 x) => x.InBounds(map) && x.Walkable(map)); if (spawnPos != null) { possibleCells.Remove(spawnPos); Thing thing3 = ThingMaker.MakeThing(lampDef, lampStuffDef); thing3.SetFaction(rp.faction, null); GenSpawn.Spawn(thing3, spawnPos, map, rot.Opposite); } } } } } } } } //if (!Cthulhu.Utility.IsCosmicHorrorsLoaded()) //{ PawnGroupKindDef groupKind = rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Combat; PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms() { faction = (from x in Find.FactionManager.AllFactions where x.HostileTo(rp.faction) && x.def.pawnGroupMakers != null && x.def.pawnGroupMakers.Count > 0 && x.def.humanlikeFaction && IsCosmicHorrorFaction(x) == false && (x.def.pawnGroupMakers.FirstOrDefault((PawnGroupMaker y) => y.kindDef == PawnGroupKindDefOf.Combat) != null) select x).RandomElement <Faction>(), tile = map.Tile, points = 5000, generateFightersOnly = false, }; int num = 0; foreach (Pawn current in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, true)) { num++; ResolveParams resolveParams = rp; resolveParams.singlePawnToSpawn = current; BaseGen.symbolStack.Push("pawn", resolveParams); if (num == 3) { break; } } //} //else //{ // Faction tempFaction = Find.FactionManager.AllFactions.InRandomOrder<Faction>().FirstOrDefault((Faction z) => IsCosmicHorrorFaction(z)); // PawnGroupKindDef groupKind = rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Combat; // PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms() // { // faction = tempFaction, // map = map, // points = 5000, // generateFightersOnly = false, // generateMeleeOnly = false // }; // int num = 0; // foreach (Pawn current in PawnGroupMakerUtility.GeneratePawns(groupKind, pawnGroupMakerParms, true)) // { // num++; // ResolveParams resolveParams = rp; // resolveParams.singlePawnToSpawn = current; // resolveParams.singlePawnLord = null; // BaseGen.symbolStack.Push("pawn", resolveParams); // if (num == 3) break; // } //} //List<int> corners = new List<int>() { 0, 1, 2, 3 }; //foreach (int corner in corners.InRandomOrder<int>()) //{ // IntVec3 loc = Cthulhu.Utility.GetCornerPos(rp.rect.ContractedBy(1), corner); // if (!GenSpawn.WouldWipeAnythingWith(loc, Rot4.South, lampDef, map, (Thing x) => x.def.category == ThingCategory.Building)) // { // ThingDef singleThingDef3 = (Cthulhu.Utility.IsIndustrialAgeLoaded()) ? lampDef : ThingDefOf.TorchLamp; // Thing thing3 = ThingMaker.MakeThing(singleThingDef3, ThingDefOf.Steel); // GenSpawn.Spawn(thing3, loc, map); // break; // } //} }
protected override bool TryExecuteWorker(IncidentParms parms) { if (!settings.Active) { return(false); } if (tribalFaction == null) { return(false); } if (tribalFaction.PlayerRelationKind != FactionRelationKind.Hostile) { return(false); } Map map = (Map)parms.target; parms.points = StorytellerUtility.DefaultThreatPointsNow(map) * 1.2f; PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = tribalFaction, points = parms.points, generateFightersOnly = true, groupKind = PawnGroupKindDefOf.Combat, raidStrategy = RaidStrategyDefOf.ImmediateAttack, forceOneIncap = true }; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); if (pawns.Count == 0) { return(false); } LordJob lordJob = new LordJob_AssaultColony(tribalFaction, canKidnap: true, canTimeoutOrFlee: false); Lord lord = LordMaker.MakeNewLord(tribalFaction, lordJob, map); lord.numPawnsLostViolently = int.MaxValue; foreach (var pawn in pawns) { if (CellFinder.TryFindRandomEdgeCellWith((IntVec3 c) => !c.Roofed(map) && c.Walkable(map) && c.Standable(map), map, 0f, out IntVec3 pos)) { GenSpawn.Spawn(pawn, pos, map); pawn.health.AddHediff(HediffDefOfLocal.ThirstHumanMeat); if (!pawn.story.traits.HasTrait(TraitDefOf.Cannibal)) { Trait t = new Trait(TraitDefOf.Cannibal); pawn.story.traits.GainTrait(t); } lord.AddPawn(pawn); } } SendStandardLetter(parms, null); Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; return(true); }
private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map, int countCap) { PawnGroupKindDef groupKind; if (faction.def.pawnGroupMakers.Where((PawnGroupMaker gm) => gm.kindDef == PawnGroupKindDefOf.Settlement).Count() > 0) { groupKind = PawnGroupKindDefOf.Settlement; } else { groupKind = faction.def.pawnGroupMakers.RandomElement().kindDef; } PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = groupKind; pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.points = points; pawnGroupMakerParms.faction = faction; pawnGroupMakerParms.generateFightersOnly = false; pawnGroupMakerParms.forceOneIncap = false; pawnGroupMakerParms.seed = Rand.Int; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); CellRect rect = locationRect; if (pawns == null) { Debug.Warning(Debug.ForceGen, "Generating starting party: Pawns list is null"); } else { Debug.Log(Debug.ForceGen, "Pawns list contains {0} records", pawns.Count); } while (pawns.Count > countCap) { pawns.Remove(pawns.RandomElement()); } foreach (Pawn p in pawns) { bool result = CellFinder.TryFindRandomCellInsideWith(locationRect, (IntVec3 x) => x.Standable(map), out IntVec3 location); if (result) { GenSpawn.Spawn(p, location, map, Rot4.Random); } else { Debug.Warning(Debug.ForceGen, "Can't find spawning location for defender pawn!"); } } LordJob lordJob = null; lordJob = new LordJob_DefendBase(faction, rect.CenterCell); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
private void SpawnEnemies(float threatPoints, Faction faction, Verse.Map map) { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms { faction = faction, points = threatPoints * 0.4f, generateFightersOnly = true, groupKind = PawnGroupKindDefOf.Combat, raidStrategy = RaidStrategyDefOf.ImmediateAttack, forceOneIncap = true }; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); List <int> groups = new List <int>() { pawns.Count }; int totalPawns = pawns.Count - 1; if (pawns.Count > 5) { groups.Clear(); if (pawns.Count < maxPawnsInGroup) { maxPawnsInGroup = pawns.Count; } while (groups.Count < maxGroups) { if (totalPawns <= 0) { break; } int pawnsGroupCount = Rand.Range(1, maxPawnsInGroup); if (pawnsGroupCount > totalPawns) { pawnsGroupCount = totalPawns; } groups.Add(pawnsGroupCount); totalPawns -= pawnsGroupCount; } } int total = 0; for (int i = 0; i < groups.Count; i++) { MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 playerStartingSpot, out IntVec3 second); for (int i2 = 0; i2 < groups[i]; i2++) { IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(second, map); GenSpawn.Spawn(pawns[total], loc, map); total++; } } LordJob lordJob = new LordJob_AssaultColony(faction, canKidnap: true, canTimeoutOrFlee: false); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
protected override bool TryExecuteWorker(IncidentParms parms) { parms.points *= IncidentPointsFactorRange.RandomInRange; Caravan caravan = (Caravan)parms.target; bool factionCanFight = WorldUtility.FactionCanFight((int)parms.points, parms.faction); //if (!PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(parms.points, out parms.faction)) //{ // return false; //} List <ThingCount> demands = GenerateDemands(caravan); if (demands.NullOrEmpty() && parms.faction.HostileTo(caravan.Faction)) { return(false); } PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms); defaultPawnGroupMakerParms.generateFightersOnly = true; defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true; List <Pawn> attackers = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms).ToList(); if (attackers.Count == 0) { Log.Error("Caravan demand incident couldn't generate any enemies even though min points have been checked. faction=" + defaultPawnGroupMakerParms.faction + "(" + ((defaultPawnGroupMakerParms.faction != null) ? defaultPawnGroupMakerParms.faction.def.ToString() : "null") + ") parms=" + parms); return(false); } CameraJumper.TryJumpAndSelect(caravan); DiaNode diaNode = new DiaNode(GenerateMessageText(parms.faction, attackers.Count, demands, caravan)); DiaOption diaOption = new DiaOption("CaravanDemand_Give".Translate()); diaOption.action = delegate { ActionGive(caravan, demands, attackers); wo.interactable = false; }; if (!wo.Faction.HostileTo(caravan.Faction)) { string str = "RW_CaravanDemand_GiveDisabled".Translate(wo.GetInspectString()); diaOption.SetText(str); diaOption.Disable(""); } diaOption.resolveTree = true; diaNode.options.Add(diaOption); string fightString = "CaravanDemand_Fight".Translate(); if (!wo.Faction.HostileTo(caravan.Faction)) { fightString = "RW_Attack_Verbatum".Translate(); } DiaOption diaOption2 = new DiaOption(fightString); diaOption2.action = delegate { ActionFight(caravan, attackers); wo.Destroy(); }; diaOption2.resolveTree = true; diaNode.options.Add(diaOption2); DiaOption diaOption3 = new DiaOption("CaravanMeeting_MoveOn".Translate()); diaOption3.action = delegate { ActionMoveOn(caravan, attackers); }; if (wo.Faction.HostileTo(caravan.Faction)) { diaOption3.Disable("CaravanMeeting_MoveOn".Translate()); } diaOption3.resolveTree = true; diaNode.options.Add(diaOption3); TaggedString taggedString = "CaravanDemandTitle".Translate(parms.faction.Name); Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, parms.faction, true, false, taggedString)); Find.Archive.Add(new ArchivedDialog(diaNode.text, taggedString, parms.faction)); return(true); }
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 = FactionInteractionDiplomacyTuningsBlatantlyCopiedFromPeaceTalks .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); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Trying execution"); this.ResolveRaidPoints(parms); bool result = false; if (!this.TryResolveRaidFaction(parms)) { Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction"); result = false; } else { PawnGroupKindDef combat = PawnGroupKindDefOf.Combat; this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat); this.ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { result = false; } else { parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms); List <Pawn> list = PawnGroupMakerUtility .GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count == 0) { Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms); result = false; } parms.raidArrivalMode.Worker.Arrive(list, parms); 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); TaggedString letterLabelS = letterLabel; TaggedString letterTextS = letterText; //string lalalal = this.GetRelatedPawnsInfoLetterText(parms); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabelS, ref letterTextS, this.GetRelatedPawnsInfoLetterText(parms), true, true); List <TargetInfo> list2 = new List <TargetInfo>(); if (parms.pawnGroups != null) { List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups); List <Pawn> list4 = list3.MaxBy((List <Pawn> x) => x.Count); if (list4.Any <Pawn>()) { list2.Add(list4[0]); } for (int i = 0; i < list3.Count; i++) { if (list3[i] != list4) { if (list3[i].Any <Pawn>()) { list2.Add(list3[i][0]); } } } } else if (list.Any <Pawn>()) { list2.Add(list[0]); } Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), list2, parms.faction); if (this.GetLetterDef() == LetterDefOf.ThreatBig) { //TaleRecorder.RecordTale(TaleDefOf. RaidArrived, new object[0]); } parms.raidStrategy.Worker.MakeLords(parms, list); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int j = 0; j < list.Count; j++) { Pawn pawn2 = list[j]; if (pawn2.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } result = true; } } return(result); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat); parms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop; this.ResolveRaidPoints(parms); //IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = new TargetInfo(parms.spawnCenter, map, false); Thing portal = GenSpawn.Spawn(new ThingDef(), target.Cell, map); MoteMaker.ThrowHeatGlow(target.Cell, map, 5f); MoteMaker.ThrowHeatGlow(target.Cell, map, 5f); MoteMaker.ThrowFireGlow(target.Cell, map, 5f); MoteMaker.ThrowFireGlow(target.Cell, map, 5f); MoteMaker.ThrowMetaPuffs(target); MoteMaker.ThrowMetaPuffs(target); foreach (Pawn current in list) { GenSpawn.Spawn(current, target.Cell, map); target = current; } 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); } TaggedString letterLabel = this.GetLetterLabel(parms); TaggedString letterText = this.GetLetterText(parms, list); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true); //Find.LetterStack.ReceiveLetter(letterLabel, letterText, LetterDefOf.BadUrgent, target, stringBuilder.ToString()); //if (this.GetLetterType() == LetterType.BadUrgent) /*{ * TaleRecorder.RecordTale(TaleDefOf., new object[0]); * }*/ parms.raidStrategy.Worker.MakeLords(parms, list); //Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(parms, map), 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, * ")" * })); * }*/ Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; return(true); }