public static bool AnyBlockingHostileLord(Map map, Faction forFaction) { Faction faction = map.ParentFaction ?? Faction.OfPlayer; List <Lord> lords = map.lordManager.lords; for (int i = 0; i < lords.Count; i++) { if (lords[i].faction != null && lords[i].faction != forFaction && lords[i].faction != faction) { if (lords[i].AnyActivePawn) { LordJob lordJob = lords[i].LordJob; if (lordJob == null || lordJob.CanBlockHostileVisitors) { if (!(lordJob is LordJob_VoluntarilyJoinable)) { if (lords[i].faction.HostileTo(forFaction)) { if (!lords[i].faction.HostileTo(faction)) { return(true); } } } } } } } return(false); }
public static void VampiresGuestTracker(Faction faction, LordJob lordJob, Map map, IEnumerable <Pawn> startingPawns, ref Lord __result) { //Only a few lords will have vampires with these issues. if (!(lordJob is LordJob_VisitColony) && !(lordJob is LordJob_AssistColony) && !(lordJob is LordJob_TravelAndExit)) { return; } if (startingPawns == null || !startingPawns.Any()) { return; } foreach (var startingPawn in startingPawns) { if (startingPawn.IsVampire()) { if (HarmonyPatches.VampGuestCache.ContainsKey(startingPawn)) { HarmonyPatches.VampGuestCache.Remove(startingPawn); } int curTicks = Find.TickManager.TicksGame; HarmonyPatches.VampGuestCache.Add(startingPawn, curTicks); //////Log.Message("Vampire tracking: " + startingPawn.Label + " " + curTicks); } } }
public bool TryExecute(Pawn organizer, Pawn target) { if (organizer == null || !TryFindGatherSpot(organizer, out IntVec3 spot)) { return(false); } var alter = spot.GetFirstThing <Building_SkavenAlter>(organizer.Map); //skaven alter must have a chair if (alter?.HasChair != true) { return(false); } LordJob lordJob1 = CreateLordJob(spot, organizer, target); Faction faction = organizer.Faction; LordJob lordJob2 = lordJob1; Map map1 = organizer.Map; Pawn[] pawnArray; if (!lordJob1.OrganizerIsStartingPawn) { pawnArray = null; } else { pawnArray = new Pawn[1] { organizer } }; LordMaker.MakeNewLord(faction, lordJob2, map1, pawnArray); SendLetter(spot, organizer, target); return(true); }
// Token: 0x06000042 RID: 66 RVA: 0x00003515 File Offset: 0x00001715 protected override IEnumerable <Toil> MakeNewToils() { LordJob lj = Actor.GetLord().LordJob; yield return(new Toil { defaultCompleteMode = ToilCompleteMode.Delay, initAction = delegate() { ticksLeftThisToil = 500; }, tickAction = delegate() { if (lj is LordJob_PerformComedySet) { if (lj is LordJob_PerformComedySet lordJob_PerformComedySet && lordJob_PerformComedySet.Lead != null) { var num = 1f * (float)lordJob_PerformComedySet.Lead.skills.GetSkill(SkillDefOf.Social).Level; if (lordJob_PerformComedySet.punchline && Rand.Value < num * 0.001f) { MoteMaker.ThrowMetaIcon(Actor.Position, Actor.Map, ThingDefOf_RazzleDazzle.Mote_Comedy); } } } } });
public override void Resolve(ResolveParams rp) { int? mechanoidsCount = rp.mechanoidsCount; int num = (!mechanoidsCount.HasValue) ? SymbolResolver_RandomMechanoidGroup.DefaultMechanoidCountRange.RandomInRange : mechanoidsCount.Value; Lord lord = rp.singlePawnLord; if (lord == null && num > 0) { Map map = BaseGen.globalSettings.map; IntVec3 point = default(IntVec3); LordJob lordJob = (!Rand.Bool || !(from x in rp.rect.Cells where !x.Impassable(map) select x).TryRandomElement <IntVec3>(out point)) ? ((LordJob) new LordJob_AssaultColony(Faction.OfMechanoids, false, false, false, false, false)) : ((LordJob) new LordJob_DefendPoint(point)); lord = LordMaker.MakeNewLord(Faction.OfMechanoids, lordJob, map, null); } for (int i = 0; i < num; i++) { PawnKindDef pawnKindDef = rp.singlePawnKindDef; if (pawnKindDef == null) { pawnKindDef = (from kind in DefDatabase <PawnKindDef> .AllDefsListForReading where kind.RaceProps.IsMechanoid select kind).RandomElementByWeight((PawnKindDef kind) => (float)(1.0 / kind.combatPower)); } ResolveParams resolveParams = rp; resolveParams.singlePawnKindDef = pawnKindDef; resolveParams.singlePawnLord = lord; resolveParams.faction = Faction.OfMechanoids; BaseGen.symbolStack.Push("pawn", resolveParams); } }
private bool DoExecute(IncidentParms parms, List<Pawn> generatedEnemies, IntVec3 existingMapEdgeCell) { Map map = parms.target as Map; bool flag = false; if (map == null) { map = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, generatedEnemies, false); flag = true; } else { for (int i = 0; i < generatedEnemies.Count; i++) { IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(existingMapEdgeCell, map, 4); GenSpawn.Spawn(generatedEnemies[i], loc, map, Rot4.Random, WipeMode.Vanish, false); } } this.PostProcessGeneratedPawnsAfterSpawning(generatedEnemies); LordJob lordJob = this.CreateLordJob(generatedEnemies, parms); if (lordJob != null) { LordMaker.MakeNewLord(parms.faction, lordJob, map, generatedEnemies); } string letterLabel = this.GetLetterLabel(generatedEnemies[0], parms); string letterText = this.GetLetterText(generatedEnemies[0], parms); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(generatedEnemies, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true, true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(generatedEnemies[0], parms), generatedEnemies[0], parms.faction, null); if (flag) { Find.TickManager.CurTimeSpeed = TimeSpeed.Paused; } return true; }
public static bool IsGuest(Pawn pawn) { bool result = false; if (HospitalityEnabled) { try { result = ((Func <bool>) delegate { if (!pawn.IsValidGuestPawn()) { return(false); } LordJob lordJob = ((((ThingWithComps)pawn)?.GetComp <CompGuest>())?.lord)?.LordJob; return(lordJob is Hospitality.LordJob_VisitColony); })(); } catch (TypeLoadException ex) { Log.Warning("Failed to check whether ped is a guest. " + ex.Message); } } return(result); }
public LordJob CreateJobForLord(IntVec3 point) { LordJob job = null; if (lordJob.GetConstructors().Any(constructor => constructor.GetParameters() is ParameterInfo[] args && args.Count() > 0 && args[0].ParameterType == typeof(IntVec3))) { job = (LordJob)Activator.CreateInstance(lordJob, new object[] { point }); }
public static Pawn SpawnInhabitant(IntVec3 pos, Map map, LordJob job = null, bool friendlyJob = false, bool randomWorkSpot = false) { if (job == null || (!friendlyJob && !map.ParentFaction.HostileTo(Faction.OfPlayer))) { var workPos = randomWorkSpot ? CellRect.WholeMap(map).RandomCell : pos; job = new LordJob_LiveInCity(FindPawnSpot(workPos, map)); } return(SpawnInhabitant(pos, map, job != null ? LordMaker.MakeNewLord(map.ParentFaction, job, map) : null)); }
private bool CheckVisitor(LordJob lordJob) { if (hasHospitality || !Settings.VisitorsGoToTradeSpot) { return(false); } if (lordJob is LordJob_VisitColony) { return(true); } return(false); }
public static bool AnyLordJobPreventsNewGatherings(Map map) { List <Lord> lords = map.lordManager.lords; for (int i = 0; i < lords.Count; i++) { LordJob lordJob = lords[i].LordJob; if (!lordJob.AllowStartNewGatherings) { return(true); } } return(false); }
public static Pawn SpawnInhabitant(IntVec3 pos, Map map, LordJob job = null, bool friendlyJob = false, bool randomWorkSpot = false, PawnKindDef kind = null) { if (job == null || (!friendlyJob && !map.ParentFaction.HostileTo(Faction.OfPlayer))) { var workPos = randomWorkSpot ? CellRect.WholeMap(map).RandomCell : pos; workPos = FindPawnSpot(workPos, map); job = map.Parent is Citadel ? new LordJob_LiveInCitadel() : map.Parent is City city && city.Abandoned ? (LordJob) new LordJob_LiveInAbandonedCity(workPos) : new LordJob_LiveInCity(workPos); } return(SpawnInhabitant(pos, map, LordMaker.MakeNewLord(map.ParentFaction, job, map))); }
private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map) { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Combat; 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("Pawns list is null"); } else { Debug.Log("Pawns list contains {0} records", pawns.Count); } 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("Can't find location!"); } } LordJob lordJob = null; lordJob = new LordJob_DefendBase(faction, rect.CenterCell); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
public Lord GetLord(Pawn forPawn) { Lord lord = null; Faction faction = forPawn.Faction; if (forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction).Any((Pawn p) => p != forPawn)) { Pawn p2 = (Pawn)GenClosest.ClosestThing_Global(forPawn.Position, forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction), SpawnerProps.lordJoinRadius, (Thing p) => p != forPawn && ((Pawn)p).GetLord() != null, null); lord = p2.GetLord(); } if (lord == null) { LordJob lordJob = SpawnerProps.CreateJobForLord(forPawn.Position); lord = LordMaker.MakeNewLord(faction, lordJob, Map, null); } return(lord); }
private bool DoExecute(IncidentParms parms) { Map map = parms.target as Map; IntVec3 invalid = IntVec3.Invalid; if (map != null && !CellFinder.TryFindRandomEdgeCellWith((Predicate <IntVec3>)((IntVec3 x) => x.Standable(map) && map.reachability.CanReachColony(x)), map, CellFinder.EdgeRoadChance_Hostile, out invalid)) { return(false); } List <Pawn> list = this.GeneratePawns(parms); if (!list.Any()) { return(false); } bool flag = false; if (map == null) { map = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, list); flag = true; } else { for (int i = 0; i < list.Count; i++) { IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(invalid, map, 4); GenSpawn.Spawn(list[i], loc, map, Rot4.Random, false); } } this.PostProcessGeneratedPawnsAfterSpawning(list); LordJob lordJob = this.CreateLordJob(list, parms); if (lordJob != null) { LordMaker.MakeNewLord(parms.faction, lordJob, map, list); } this.SendAmbushLetter(list[0], parms); if (flag) { Find.TickManager.CurTimeSpeed = TimeSpeed.Paused; } return(true); }
public static Lord CreateNewLord(this Pawn pawn, IntVec3 loc, LordJob lordJob) { IntVec3 c = loc; if (pawn.GetLord() != null && pawn.GetLord() is Lord l) { if (l.ownedPawns.Count > 0) { l.ownedPawns.Remove(pawn); } if (l.ownedPawns.Count == 0) { l.lordManager.RemoveLord(l); } } Lord lord = LordMaker.MakeNewLord(pawn.Faction, lordJob, pawn.Map, null); lord.AddPawn(pawn); return(lord); }
private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map) { PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms(); pawnGroupMakerParms.groupKind = PawnGroupKindDefOf.Combat; pawnGroupMakerParms.tile = map.Tile; pawnGroupMakerParms.points = points; pawnGroupMakerParms.faction = faction; pawnGroupMakerParms.generateFightersOnly = true; pawnGroupMakerParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack; pawnGroupMakerParms.forceOneIncap = false; pawnGroupMakerParms.seed = Rand.Int; List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList(); CellRect rect = locationRect; if (pawns == null) { Debug.Warning(Debug.ForceGen, "Pawns list is null"); } foreach (Pawn p in pawns) { bool result = CellFinder.TryFindRandomSpawnCellForPawnNear(locationRect.RandomCell, map, out IntVec3 location); if (result) { GenSpawn.Spawn(p, location, map, Rot4.Random); } } LordJob lordJob = null; lordJob = new LordJob_AssaultColony(faction, canKidnap: false, canTimeoutOrFlee: Rand.Chance(0.5f)); if (lordJob != null) { LordMaker.MakeNewLord(faction, lordJob, map, pawns); } }
private bool TryStartParty(string reason, bool wholeDay, Pawn starter, List <Pawn> invitedPawns) { Map currentMap = Find.CurrentMap; if (currentMap == null) { return(false); } if (starter == null) { starter = PartyUtil.FindRandomPartyOrganizer(Faction.OfPlayer, currentMap); if (starter == null) { Messages.Message("DM.Error.NoStarter".Translate(), MessageTypeDefOf.NegativeEvent); return(false); } } IntVec3 intVec; if (!PartyUtil.TryFindPartySpot(starter, out intVec)) { Messages.Message("DM.Error.NoSpot".Translate(), MessageTypeDefOf.NegativeEvent); return(false); } List <Pawn> invited = null; if (_privateAnniversaries.Value && invitedPawns.Count > 0) { invited = invitedPawns; } LordJob partyJob = wholeDay ? new LongJoinableParty(intVec, invited, starter) : new JoinableParty(intVec, invited, starter); LordMaker.MakeNewLord(starter.Faction, partyJob, currentMap); Find.LetterStack.ReceiveLetter("DM.Letter.PartyTitle".Translate(), "DM.Letter.Party".Translate(reason), LetterDefOf.PositiveEvent, new TargetInfo(intVec, currentMap)); return(true); }
// Token: 0x060000CA RID: 202 RVA: 0x00007AC0 File Offset: 0x00005CC0 protected override void Impact(Thing hitThing) { SoundDef soundExplode = this.def.projectile.soundExplode; bool flag = soundExplode != null; if (flag) { soundExplode.PlayOneShot(new TargetInfo(base.Position, base.Map, false)); } bool joinSameLordFromProjectile = this.SpawnerProps.joinSameLordFromProjectile; if (joinSameLordFromProjectile) { LordJob lordJob = this.SpawnerProps.CreateJobForLord(base.Position); this.lord = LordMaker.MakeNewLord(base.Faction, lordJob, Find.VisibleMap, null); } for (int i = 0; i < this.SpawnerProps.amount; i++) { this.DoSpawn(hitThing); } this.Destroy(DestroyMode.Vanish); }
protected override void Impact(Thing hitThing) { SoundDef soundExplode = def.projectile.soundExplode; if (soundExplode != null) { soundExplode.PlayOneShot(new TargetInfo(base.Position, base.Map, false)); } if (SpawnerProps.joinSameLordFromProjectile) { LordJob lordJob = SpawnerProps.CreateJobForLord(Position); lord = LordMaker.MakeNewLord(Faction, lordJob, Map, null); } //Spawn on impact point. for (int i = 0; i < SpawnerProps.amount; i++) { DoSpawn(hitThing); } Destroy(DestroyMode.Vanish); }
public virtual bool TryExecute(Map map, Pawn organizer = null) { if (organizer == null) { organizer = FindOrganizer(map); } if (organizer == null) { return(false); } if (!TryFindGatherSpot(organizer, out var spot)) { return(false); } LordJob lordJob = CreateLordJob(spot, organizer); LordMaker.MakeNewLord(organizer.Faction, lordJob, organizer.Map, (!lordJob.OrganizerIsStartingPawn) ? null : new Pawn[1] { organizer }); SendLetter(spot, organizer); return(true); }
protected virtual void ReinforcementsArrived() { if (!CellFinder.TryFindRandomEdgeCellWith((IntVec3 x) => x.Standable(Map) && Map.reachability.CanReachColony(x), Map, CellFinder.EdgeRoadChance_Hostile, out IntVec3 edgeCell)) { return; } IncidentParms parms = new IncidentParms() { target = Map, points = StorytellerUtility.DefaultThreatPointsNow(Find.CurrentMap), faction = reinforcementsFrom.Faction }; PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, false); defaultPawnGroupMakerParms.generateFightersOnly = true; defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true; List <Pawn> enemies = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList(); for (int i = 0; i < enemies.Count; i++) { IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(edgeCell, Map, 4); GenSpawn.Spawn(enemies[i], loc, Map, Rot4.Random, WipeMode.Vanish, false); } LordJob lordJob = CreateLordJob(enemies, parms); if (lordJob != null) { LordMaker.MakeNewLord(parms.faction, lordJob, Map, enemies); } var letter = LetterMaker.MakeLetter("ReinforcementsArrivedLabel".Translate(), "ReinforcementsArrived".Translate(reinforcementsFrom.Label), LetterDefOf.ThreatBig, reinforcementsFrom.Faction); Find.LetterStack.ReceiveLetter(letter); ticksTillReinforcements = Mathf.RoundToInt(pathToSite.TotalCost * scaleFactor.RandomInRange); }
private bool DoExecute(IncidentParms parms, List <Pawn> generatedEnemies, IntVec3 existingMapEdgeCell) { Map map = parms.target as Map; bool flag = false; if (map == null) { map = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, generatedEnemies, sendLetterIfRelatedPawns: false); flag = true; } else { for (int i = 0; i < generatedEnemies.Count; i++) { IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(existingMapEdgeCell, map); GenSpawn.Spawn(generatedEnemies[i], loc, map, Rot4.Random); } } PostProcessGeneratedPawnsAfterSpawning(generatedEnemies); LordJob lordJob = CreateLordJob(generatedEnemies, parms); if (lordJob != null) { LordMaker.MakeNewLord(parms.faction, lordJob, map, generatedEnemies); } TaggedString letterLabel = GetLetterLabel(generatedEnemies[0], parms); TaggedString letterText = GetLetterText(generatedEnemies[0], parms); PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(generatedEnemies, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: true); SendStandardLetter(letterLabel, letterText, GetLetterDef(generatedEnemies[0], parms), parms, generatedEnemies[0]); if (flag) { Find.TickManager.Notify_GeneratedPotentiallyHostileMap(); } return(true); }
private static void FleeTrigger_PostFix(ref LordJob lordJob) { float randomRetreatvalue = Rand.Range(MeMiMoSettings.retreatDefeatRange.min, MeMiMoSettings.retreatDefeatRange.max); if (lordJob.lord.faction != null && lordJob.lord.faction.def.autoFlee && MeMiMoSettings.variableRaidRetreat) { for (int j = 0; j < lordJob.lord.Graph.transitions.Count; j++) { if (lordJob.lord.Graph.transitions[j].target is LordToil_PanicFlee) { for (int i = 0; i < lordJob.lord.Graph.transitions[j].triggers.Count; i++) { if (lordJob.lord.Graph.transitions[j].triggers[i] is Trigger_FractionPawnsLost) { if (MeMiMoSettings.variableRaidRetreat) { lordJob.lord.Graph.transitions[j].triggers[i] = new Trigger_FractionPawnsLost(randomRetreatvalue); } } } } } } }
protected override void Impact(Thing hitThing) { Map map = base.Map; base.Impact(hitThing); ThingDef def = this.def; if (!initialized && this.age < this.duration && hitThing != null) { caster = this.launcher as Pawn; hitPawn = hitThing as Pawn; this.oldPosition = caster.Position; MightPowerSkill pwr = caster.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Possess.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Possess_pwr"); MightPowerSkill ver = caster.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Possess.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Possess_ver"); ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef(); pwrVal = pwr.level; verVal = ver.level; if (settingsRef.AIHardMode && !caster.IsColonist) { pwrVal = 3; verVal = 3; } this.duration += pwrVal * 300; if (hitPawn != null && hitPawn.Faction != null && hitPawn.RaceProps.Humanlike) { possessedFlag = hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_I) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_II) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_III) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_I) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_II) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_III); if (!hitPawn.Downed && !hitPawn.Dead && !possessedFlag && !hitPawn.IsPrisoner) { this.pFaction = hitPawn.Faction; this.prisoner = hitPawn.IsPrisoner; if (!caster.IsColonist && hitPawn.IsColonist) { IEnumerable <WorkTypeDef> allWorkTypes = WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder; this.hitPawnWorkSetting = new List <int>(); foreach (var workType in allWorkTypes) { hitPawnWorkSetting.Add(hitPawn.workSettings.GetPriority(workType)); } } if (this.pFaction != caster.Faction) { if (Rand.Chance(TM_Calc.GetSpellSuccessChance(caster, hitPawn, true))) { //possess enemy or neutral int weaponCount = 0; if (hitPawn.equipment.PrimaryEq != null) { weaponCount = 1; } this.inventoryCount = hitPawn.inventory.innerContainer.Count + hitPawn.apparel.WornApparelCount + weaponCount; if (ModCheck.Validate.GiddyUp.Core_IsInitialized()) { ModCheck.GiddyUp.ForceDismount(caster); ModCheck.GiddyUp.ForceDismount(hitPawn); } hitPawn.SetFaction(caster.Faction, null); HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_DisguiseHD_II, 20f + (5f * pwrVal)); switch (verVal) { case 0: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD, 20f + (5f * pwrVal)); break; case 1: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_I, 20f + (5f * pwrVal)); break; case 2: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_II, 20f + (5f * pwrVal)); break; case 3: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_III, 20f + (5f * pwrVal)); break; } initialized = true; MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1f); MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1.2f); MoteMaker.ThrowHeatGlow(caster.Position, caster.Map, .8f); if (!caster.IsColonist) { Lord lord = caster.GetLord(); LordJob lordJob = caster.GetLord().LordJob; try { PawnDuty duty = caster.mindState.duty; hitPawn.mindState.duty = duty; lord.AddPawn(hitPawn); } catch { Log.Message("error attempting to assign a duty to pawn during possession"); } } //loadPawn = caster; //loadPawn.ThingID += Rand.Range(0, 214).ToString(); if (caster.IsColonist) { // ModOptions.Constants.SetPawnInFlight(true); // } if (hitPawn.IsColonist && !caster.IsColonist) { TM_Action.SpellAffectedPlayerWarning(hitPawn); } caster.DeSpawn(); } else { MoteMaker.ThrowText(hitThing.DrawPos, hitThing.Map, "TM_ResistedSpell".Translate(), -1); this.age = this.duration; this.Destroy(DestroyMode.Vanish); } } else { //possess friendly if (ModCheck.Validate.GiddyUp.Core_IsInitialized()) { ModCheck.GiddyUp.ForceDismount(caster); } HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_DisguiseHD_II, 20f + (5f * pwrVal)); switch (verVal) { case 0: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD, 20f + (5f * pwrVal)); break; case 1: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_I, 20f + (5f * pwrVal)); break; case 2: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_II, 20f + (5f * pwrVal)); break; case 3: HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_III, 20f + (5f * pwrVal)); break; } initialized = true; MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1f); MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1.2f); MoteMaker.ThrowHeatGlow(caster.Position, caster.Map, .8f); caster.DeSpawn(); } } else { Messages.Message("TM_CannotPossessNow".Translate( caster.LabelShort, hitPawn.LabelShort ), MessageTypeDefOf.RejectInput); this.age = this.duration; this.Destroy(DestroyMode.Vanish); } } else { Messages.Message("TM_CannotPossess".Translate( caster.LabelShort, hitThing.LabelShort ), MessageTypeDefOf.RejectInput); this.age = this.duration; this.Destroy(DestroyMode.Vanish); } } else { if (!this.initialized) { this.age = this.duration; Destroy(DestroyMode.Vanish); } } if (hitPawn != null && (hitPawn.Downed || hitPawn.Dead)) { this.age = this.duration; } }
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); } }
public static bool Prefix(IncidentParms parms, Map map, List <Pawn> pawns, int raidSeed, ref LordJob __result) { // Conditionally detour the method var faction = parms.faction; var factionDefExtension = FactionDefExtension.Get(faction.def); if (factionDefExtension.siegeParameterSetDef != null) { var entrySpot = (!parms.spawnCenter.IsValid) ? pawns[0].PositionHeld : parms.spawnCenter; var siegeSpot = RCellFinder.FindSiegePositionFrom(entrySpot, map); float blueprintPoints = Mathf.Max(parms.points * Rand.Range(0.2f, 0.3f), factionDefExtension.siegeParameterSetDef.lowestArtilleryBlueprintPoints); __result = new LordJob_SiegeCustom(faction, siegeSpot, blueprintPoints); return(false); } return(true); }
public void XenoLordTick() { if (map != null) { IntVec3 c = IntVec3.Invalid; Lord lord = null; List <Lord> Hivelords = new List <Lord>(); Lord Hivelord = null; LordJob Hivejob = null; Pawn Hivequeen = null; IEnumerable <Lord> lords = pawn.Map.lordManager.lords.Where(x => x.faction == pawn.Faction); bool isDefendPoint = pawn.GetLord() != null?pawn.GetLord().LordJob is LordJob_DefendPoint : false; bool isAssaultColony = pawn.GetLord() != null?pawn.GetLord().LordJob is LordJob_AssaultColony : false; bool hostsPresent = map.mapPawns.AllPawnsSpawned.Any(x => x.isPotentialHost() && !x.isCocooned() && IsAcceptablePreyFor(pawn, x, true)); bool LordReplaceable = (isDefendPoint || (isAssaultColony && !hostsPresent)); // Log.Message(string.Format("LordReplaceable: {0}, isDefendPoint: {1}, isAssaultColony: {2}, hostsPresent: {3}", LordReplaceable, isDefendPoint, isAssaultColony, !hostsPresent)); if (lords.Count() != 0 && ((pawn.GetLord() != null && LordReplaceable) || pawn.GetLord() == null)) { foreach (var l in lords) { if (l != null) { if (XenomorphUtil.HivelikesPresent(map)) { if (l.LordJob is LordJob_DefendAndExpandHiveLike j) { Hivelord = l; Hivejob = j; if (l.ownedPawns.Any(x => x.kindDef == QueenDef)) { Hivequeen = l.ownedPawns.Find(x => x.kindDef == QueenDef); } if (pawn.kindDef != XenomorphDefOf.RRY_Xenomorph_Queen || (pawn.kindDef == XenomorphDefOf.RRY_Xenomorph_Queen && Hivequeen != null)) { Hivelords.Add(l); } } } else if (XenomorphUtil.HiveSlimePresent(map)) { if (l.LordJob is LordJob_DefendHiveLoc j) { Hivelord = l; Hivejob = j; if (l.ownedPawns.Any(x => x.kindDef == QueenDef)) { Hivequeen = l.ownedPawns.Find(x => x.kindDef == QueenDef); } if (pawn.kindDef != XenomorphDefOf.RRY_Xenomorph_Queen || (pawn.kindDef == XenomorphDefOf.RRY_Xenomorph_Queen && Hivequeen != null)) { Hivelords.Add(l); } } } } else { /* * lord = l; * lord.AddPawn(pawn); * pawn.mindState.duty = lord.ownedPawns.FindAll(x => x.mindState.duty != null && x != pawn).RandomElement().mindState.duty; * break; */ } } } if (pawn.GetLord() != null && LordReplaceable) { lord = pawn.GetLord(); if (lord.ownedPawns.Count == 0) { Log.Message(string.Format("got no pawns, wtf?")); } if (lord.ownedPawns.Count == 1) { } if (c == IntVec3.Invalid && XenomorphUtil.HivelikesPresent(map)) { c = !XenomorphUtil.ClosestReachableHivelike(pawn).DestroyedOrNull() ? XenomorphUtil.ClosestReachableHivelike(pawn).Position : IntVec3.Invalid; } if (c == IntVec3.Invalid && XenomorphUtil.EggsPresent(map)) { c = !XenomorphUtil.ClosestReachableEgg(pawn).DestroyedOrNull() ? XenomorphUtil.ClosestReachableEgg(pawn).Position : IntVec3.Invalid; } if (c == IntVec3.Invalid && XenomorphUtil.CocoonsPresent(map, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon)) { c = !XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon).DestroyedOrNull() ? XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon).Position : IntVec3.Invalid; } if (c == IntVec3.Invalid && XenomorphUtil.CocoonsPresent(map, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon)) { c = !XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon).DestroyedOrNull() ? XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon).Position : IntVec3.Invalid; } if (c == IntVec3.Invalid) { if (InfestationLikeCellFinder.TryFindCell(out c, pawn.Map, false)) { if (Prefs.DevMode) { ThingDef td = XenomorphDefOf.RRY_Filth_Slime; GenSpawn.Spawn(td, c, pawn.Map); Find.LetterStack.ReceiveLetter(string.Format("Lord Created"), string.Format("@: {0} ", c), LetterDefOf.NegativeEvent, c.GetFirstThing(pawn.Map, td), null, null); } } if (pawn.CanReach(c, PathEndMode.OnCell, Danger.Deadly, true)) { c = RCellFinder.RandomWanderDestFor(pawn, c, 3f, null, Danger.Some); } else { c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 3f, null, Danger.Some); } } if (c != IntVec3.Invalid) { LordJob newJob; if (XenomorphUtil.HivelikesPresent(map)) { newJob = new LordJob_DefendAndExpandHiveLike(false); } else { newJob = new LordJob_DefendHiveLoc(parent.Faction, c); } if (LordReplaceable) { if (!Hivelords.NullOrEmpty()) { Hivelord = Hivelords.RandomElement(); SwitchToLord(Hivelord); CreateNewLord(pawn, c, newJob); } else { CreateNewLord(pawn, c, newJob); } if (HiveLoc == IntVec3.Invalid) { HiveLoc = c; } } } } else if (c == IntVec3.Invalid && (pawn.GetLord() != null && pawn.GetLord().LordJob is LordJob LordJob)) { lord = pawn.GetLord(); c = LordJob.lord.Graph.StartingToil.FlagLoc; if (c == IntVec3.Invalid) { c = LordJob.lord.CurLordToil.FlagLoc; } } else if (pawn.GetLord() == null) { if (!Hivelords.NullOrEmpty()) { Hivelord = Hivelords.RandomElement(); SwitchToLord(Hivelord); } } if (pawn.GetLord() != null) { List <Pawn> list = pawn.GetLord().ownedPawns.Where(x => x.mindState.duty != null).ToList(); if (pawn.GetLord() != null && pawn.mindState.duty == null && !list.NullOrEmpty()) { pawn.mindState.duty = list.RandomElement().mindState.duty; } } } }
public static bool HasRightLordJob(LordJob lordJob) { return(lordJob is LordJob_VoluntarilyJoinable || lordJob is LordJob_SearchAndDestroy || lordJob is LordJob_ControlMechanoid); }