internal static bool _CheckAcceptArrest(this Pawn _this, Pawn arrester) { if (_this.health.hediffSet.HasHediff(HediffDefOfPsychology.Saboteur)) { _this.health.hediffSet.hediffs.RemoveAll(h => h.def == HediffDefOfPsychology.Saboteur); Faction faction = Find.FactionManager.RandomEnemyFaction(); _this.SetFaction(faction); List <Pawn> thisPawn = new List <Pawn>(); thisPawn.Add(_this); IncidentParms parms = new IncidentParms(); parms.faction = faction; parms.spawnCenter = _this.Position; Lord lord = LordMaker.MakeNewLord(faction, RaidStrategyDefOf.ImmediateAttack.Worker.MakeLordJob(parms, _this.Map), _this.Map, thisPawn); AvoidGridMaker.RegenerateAvoidGridsFor(faction, _this.Map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (faction != null) { Find.LetterStack.ReceiveLetter("LetterLabelSabotage".Translate(), "SaboteurRevealedFaction".Translate(new object[] { _this.LabelShort, faction.Name }).AdjustedFor(_this), LetterType.BadUrgent, _this, null); } else { Find.LetterStack.ReceiveLetter("LetterLabelSabotage".Translate(), "SaboteurRevealed".Translate(new object[] { _this.LabelShort }).AdjustedFor(_this), LetterType.BadUrgent, _this, null); } } if (_this.health.Downed) { return(true); } if (_this.story != null && _this.story.WorkTagIsDisabled(WorkTags.Violent)) { return(true); } if (_this.Faction != null && _this.Faction != arrester.GetFactionInt()) { _this.Faction.Notify_MemberCaptured(_this, arrester.Faction); } if (Rand.Value < (arrester.GetStatValue(StatDefOfPsychology.ArrestPeacefullyChance) * (Mathf.InverseLerp(-100f, 100f, _this.relations.OpinionOf(arrester))) * (arrester.Faction == _this.Faction ? 1.5 : 1))) { return(true); } Messages.Message("MessageRefusedArrest".Translate(new object[] { _this.LabelShort }), _this, MessageSound.SeriousAlert); if (_this.Faction == null || !arrester.HostileTo(_this)) { _this.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Berserk, null, false, false, null); } return(false); }
private void TrySpawnMadSailors() { List <Pawn> lordList = new List <Pawn>(); Faction faction = Find.FactionManager.FirstFactionOfDef(CultsDefOf.Cults_Sailors); Cthulhu.Utility.DebugReport(faction.ToString()); LordJob_DefendPoint lordJob = new LordJob_DefendPoint(this.Position); if (this.pointsLeft <= 0f) { return; } if (this.lord == null) { this.lord = LordMaker.MakeNewLord(faction, lordJob, Map, lordList); } while (pointsLeft > 0f) { IntVec3 center; if ((from cell in GenAdj.CellsAdjacent8Way(this) where cell.Walkable(Map) select cell).TryRandomElement(out center)) { PawnGenerationRequest request = new PawnGenerationRequest(CultsDefOf.Cults_Sailor, faction, PawnGenerationContext.NonPlayer, Map.Tile, false, false, false, false, true, true, 20f, false, true, true, false, false, false, false, null, null, null, null); Pawn pawn = PawnGenerator.GeneratePawn(request); if (GenPlace.TryPlaceThing(pawn, center, Map, ThingPlaceMode.Near, null)) { if (LordUtility.GetLord(pawn) != null) { LordUtility.GetLord(pawn).Cleanup(); LordUtility.GetLord(pawn).CurLordToil.Cleanup(); LordUtility.GetLord(pawn).LordJob.Cleanup(); } this.lord.AddPawn(pawn); this.pointsLeft -= pawn.kindDef.combatPower; Cthulhu.Utility.ApplySanityLoss(pawn, 1f); continue; } //Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Discard); } } AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map); this.pointsLeft = 0f; SoundDefOf.PsychicPulseGlobal.PlayOneShotOnCamera(); return; }
public void AlertThief(Pawn pawn, Pawn observer) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced); List <Pawn> thisPawn = new List <Pawn>(); thisPawn.Add(pawn); IncidentParms parms = new IncidentParms(); parms.faction = pawn.Faction; parms.spawnCenter = pawn.Position; Lord lord = LordMaker.MakeNewLord(pawn.Faction, RaidStrategyDefOf.ImmediateAttack.Worker.MakeLordJob(parms, pawn.Map), pawn.Map, thisPawn); AvoidGridMaker.RegenerateAvoidGridsFor(pawn.Faction, pawn.Map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (observer != null) { Find.LetterStack.ReceiveLetter("LetterLabelThief".Translate(), "ThiefRevealed".Translate(new object[] { observer.LabelShort, pawn.Faction.Name }).AdjustedFor(pawn), LetterType.BadUrgent, pawn, null); } else { Find.LetterStack.ReceiveLetter("LetterLabelThief".Translate(), "ThiefInjured".Translate(new object[] { pawn.Faction.Name }).AdjustedFor(pawn), LetterType.BadNonUrgent, pawn, null); } }
public override void DeSpawn() { Map map = base.Map; base.DeSpawn(); if (this.def.IsEdifice()) { map.edificeGrid.DeRegister(this); } if (this.def.MakeFog) { map.fogGrid.Notify_FogBlockerRemoved(base.Position); } if (this.def.holdsRoof) { RoofCollapseCellsFinder.Notify_RoofHolderDespawned(this, map); } if (this.sustainerAmbient != null) { this.sustainerAmbient.End(); } CellRect cellRect = this.OccupiedRect(); for (int i = cellRect.minZ; i <= cellRect.maxZ; i++) { for (int j = cellRect.minX; j <= cellRect.maxX; j++) { IntVec3 loc = new IntVec3(j, 0, i); MapMeshFlag mapMeshFlag = MapMeshFlag.Buildings; if (this.def.coversFloor) { mapMeshFlag |= MapMeshFlag.Terrain; } if (this.def.Fillage == FillCategory.Full) { mapMeshFlag |= MapMeshFlag.Roofs; mapMeshFlag |= MapMeshFlag.Snow; } map.mapDrawer.MapMeshDirty(loc, mapMeshFlag); map.glowGrid.MarkGlowGridDirty(loc); } } map.listerBuildings.Remove(this); map.listerBuildingsRepairable.Notify_BuildingDeSpawned(this); if (this.def.leaveTerrain != null && Current.ProgramState == ProgramState.Playing) { CellRect.CellRectIterator iterator = this.OccupiedRect().GetIterator(); while (!iterator.Done()) { map.terrainGrid.SetTerrain(iterator.Current, this.def.leaveTerrain); iterator.MoveNext(); } } map.designationManager.Notify_BuildingDespawned(this); if (!this.CanBeSeenOver()) { map.exitMapGrid.Notify_LOSBlockerDespawned(); } if (this.def.building.hasFuelingPort) { IntVec3 fuelingPortCell = FuelingPortUtility.GetFuelingPortCell(base.Position, base.Rotation); CompLaunchable compLaunchable = FuelingPortUtility.LaunchableAt(fuelingPortCell, map); if (compLaunchable != null) { compLaunchable.Notify_FuelingPortSourceDeSpawned(); } } if (this.def.building.ai_combatDangerous) { AvoidGridMaker.Notify_CombatDangerousBuildingDespawned(this, map); } }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } this.ResolveRaidStrategy(parms); this.ResolveRaidArriveMode(parms); if (!this.ResolveRaidSpawnCenter(parms)) { return(false); } IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms); PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms, false); List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = TargetInfo.Invalid; if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true, false); target = new TargetInfo(parms.spawnCenter, map, false); } else { foreach (Pawn item in list) { IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null); GenSpawn.Spawn(item, loc, map, parms.spawnRotation, false); target = item; } } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine("Points = " + parms.points.ToString("F0")); foreach (Pawn item2 in list) { string str = (item2.equipment == null || item2.equipment.Primary == null) ? "unarmed" : item2.equipment.Primary.LabelCap; stringBuilder.AppendLine(item2.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); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.ThreatBig) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived); } 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("Market value threshold to start stealing: " + StealAIUtility.StartStealingMarketValueThreshold(lord) + " (colony wealth = " + map.wealthWatcher.WealthTotal + ")"); } return(true); }
protected override bool TryExecuteWorker(IncidentParms parms) { Map map = (Map)parms.target; this.ResolveRaidPoints(parms); 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>(); 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 pawn in list) { string str = (pawn.equipment == null || pawn.equipment.Primary == null) ? "unarmed" : pawn.equipment.Primary.LabelCap; stringBuilder.AppendLine(pawn.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); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); 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; } } } return(true); }
public override bool TryExecute(IncidentParms parms) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } ResolveRaidStrategy(parms); ResolveRaidArriveMode(parms); ResolveRaidSpawnCenter(parms); PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms); List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo letterLookTarget = TargetInfo.Invalid; if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { DropPodUtility.DropThingsNear(parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, true, true); letterLookTarget = parms.spawnCenter; } else { foreach (Pawn current in list) { float value = Rand.Value; IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, 8); GenSpawn.Spawn(current, intVec); letterLookTarget = current; if (parms.faction.def.techLevel >= TechLevel.Industrial && value >= 0.5f && current.RaceProps.fleshType != FleshType.Mechanoid) { CellFinder.RandomClosewalkCellNear(current.Position, 5); Thing thing = ThingMaker.MakeThing(ThingDef.Named("VehicleATV")); thing.SetFaction(parms.faction); GenSpawn.Spawn(thing, current.Position); Job job = new Job(HaulJobDefOf.Mount); Find.Reservations.ReleaseAllForTarget(thing); job.targetA = thing; current.jobs.StartJob(job, JobCondition.InterruptForced); } } } 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); } Find.LetterStack.ReceiveLetter(this.GetLetterLabel(parms), this.GetLetterText(parms, list), this.GetLetterType(), letterLookTarget, stringBuilder.ToString()); if (this.GetLetterType() == LetterType.BadUrgent) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } PawnRelationUtility.Notify_PawnsSeenByPlayer(list, GetRelatedPawnsInfoLetterText(parms), true); Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction); 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 = ", Find.StoryWatcher.watcherWealth.WealthTotal, ")" })); } return(true); }
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); }
private void DoRaiderAttack() { IntVec3 startPos; string str = txtArtefactActivatedRaiders.Translate(); // Find a valid spawn position if (!RCellFinder.TryFindRandomPawnEntryCell(out startPos, Map, CellFinder.EdgeRoadChance_Hostile, null)) { return; } int countPawns; IEnumerable <Faction> factions = Find.FactionManager.AllFactions.Where <Faction>(f => f.HostileTo(Faction.OfPlayer) && f != Faction.OfMechanoids && f != Faction.OfInsects); Faction faction; if (!factions.TryRandomElement(out faction)) { return; } List <Pawn> pawns = new List <Pawn>(); // Spawn raiders float rvalue = UnityEngine.Random.@value; countPawns = (int)UnityEngine.Random.Range(0.0f, 15.0f); // Random: max. count of pawns if (countPawns <= 0) { countPawns = 1; } // Create raider for (int i = 0; i < countPawns; i++) { IntVec3 spawnPos; if (i == 0) { spawnPos = startPos; } else { spawnPos = CellFinder.RandomClosewalkCellNear(startPos, Map, 8); } //pawnKindDefs = DefDatabase<PawnKindDef>.AllDefs.Where<PawnKindDef>(pk => pk.defaultFactionType.defName == "Spacer" || pk.defaultFactionType.defName == "Pirate").ToList(); Pawn pawn = PawnGenerator.GeneratePawn(pawnKindDefs.RandomElement(), faction); if (GenPlace.TryPlaceThing(pawn, spawnPos, Map, ThingPlaceMode.Near)) { pawns.Add(pawn); pointsToSpend -= pawn.kindDef.combatPower; //Log.Error("Points: " + pointsToSpend.ToString() + " // Costs: " + pawn.kindDef.pointsCost.ToString()); // TEST!!! if (pointsToSpend <= 0.0f) { break; } } } // Create Lord string empty = string.Empty; string empty2 = string.Empty; PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(pawns, ref empty, ref empty2, "LetterFamilyMembersRaidFriendly".Translate(), false); if (!empty2.NullOrEmpty()) { Find.LetterStack.ReceiveLetter(empty, empty2, LetterDefOf.PositiveEvent, new GlobalTargetInfo(pawns[0].Position, pawns[0].Map), null); } LordJob lordJob = new LordJob_AssaultColony(faction, false, false, false); Lord lord = LordMaker.MakeNewLord(faction, lordJob, Map, pawns); AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); string label = labelLetterArtefact.Translate(); // add game event Find.LetterStack.ReceiveLetter(label, str, LetterDefOf.ThreatSmall, pawns[0], null); // add raid to story watcher StatsRecord storyWatcher = Find.StoryWatcher.statsRecord; storyWatcher.numRaidsEnemy = storyWatcher.numRaidsEnemy + 1; }
private void DoMechanoidAttack() { IntVec3 startPos; string str = txtArtefactActivatedMechanoids.Translate(); // Find a valid spawn position startPos = CellFinderLoose.RandomCellWith((IntVec3 c) => { if (Map.fogGrid.IsFogged(c)) { return(false); } if (!Map.reachability.CanReachColony(c)) { return(false); } if (Map.roofGrid.Roofed(c)) { return(false); } return(true); }, Map); int countPawns; Faction faction = Faction.OfMechanoids; List <Pawn> pawns = new List <Pawn>(); PawnKindDef pawnKindDef; // Spawn mechanoids // Random: What type is spawned? float rvalue = UnityEngine.Random.@value; if (rvalue < 0.5f) { // Spawn Centipedes rvalue = UnityEngine.Random.@value; // Random: How many? if (rvalue < 0.30f) { countPawns = 1; } else if (rvalue < 0.65f) { countPawns = 2; } else { countPawns = 5; // max or when points to spend are done } pawnKindDef = PawnKindDef.Named(pawnKindDefNameCentipede); } else { // Spawn Scythers rvalue = UnityEngine.Random.@value; // Random: How many? if (rvalue < 0.30f) { countPawns = 1; } else if (rvalue < 0.55f) { countPawns = 2; } else { countPawns = 7; // max or when points to spend are done } pawnKindDef = PawnKindDef.Named(pawnKindDefNameScyther); } // Create mechanoids for (int i = 0; i < countPawns; i++) { IntVec3 spawnPos; if (i == 0) { spawnPos = startPos; } else { spawnPos = CellFinder.RandomClosewalkCellNear(startPos, Map, 15); } Pawn pawn = PawnGenerator.GeneratePawn(pawnKindDef, faction); if (GenPlace.TryPlaceThing(pawn, spawnPos, Map, ThingPlaceMode.Near)) { pawns.Add(pawn); pointsToSpend -= pawn.kindDef.combatPower; //Log.Error("Points: " + pointsToSpend.ToString() + " // Costs: " + pawn.kindDef.pointsCost.ToString()); // TEST!!! if (pointsToSpend <= 0.5f) { break; } } } // Create Lord string empty = string.Empty; string empty2 = string.Empty; PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(pawns, ref empty, ref empty2, "LetterFamilyMembersRaidFriendly".Translate(), false); if (!empty2.NullOrEmpty()) { Find.LetterStack.ReceiveLetter(empty, empty2, LetterDefOf.PositiveEvent, new GlobalTargetInfo(pawns[0].Position, pawns[0].Map), null); } LordJob lordJob = new LordJob_AssaultColony(faction, true, false, false); Lord lord = LordMaker.MakeNewLord(faction, lordJob, Map, pawns); AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); string label = labelLetterArtefact.Translate(); // add game event Find.LetterStack.ReceiveLetter(label, str, LetterDefOf.ThreatSmall, pawns[0], null); // add raid to story watcher StatsRecord storyWatcher = Find.StoryWatcher.statsRecord; storyWatcher.numRaidsEnemy = storyWatcher.numRaidsEnemy + 1; }
public override bool TryExecute(IncidentParms parms) { { this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } this.ResolveRaidStrategy(parms); this.ResolveRaidArriveMode(parms); this.ResolveRaidSpawnCenter(parms); PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms); List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms, true).ToList <Pawn>(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo letterLookTarget = TargetInfo.Invalid; Deepstriker_Utilities.UnloadThingsNear(parms.faction, parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true); 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); } Find.LetterStack.ReceiveLetter(this.GetLetterLabel(parms), this.GetLetterText(parms, list), this.GetLetterType(), letterLookTarget, stringBuilder.ToString()); if (this.GetLetterType() == LetterType.BadUrgent) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } PawnRelationUtility.Notify_PawnsSeenByPlayer(list, this.GetRelatedPawnsInfoLetterText(parms), true); Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction); 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 = ", Find.StoryWatcher.watcherWealth.WealthTotal, ")" })); } return(true); } }
public override bool TryExecute(IncidentParms parms) { // if (!base.TryExecute(parms)) { ResolveRaidPoints(parms); if (!TryResolveRaidFaction(parms)) { return(false); } ResolveRaidStrategy(parms); ResolveRaidArriveMode(parms); ResolveRaidSpawnCenter(parms); PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms); List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms).ToList(); if (list.Count == 0) { Log.Error("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo letterLookTarget = TargetInfo.Invalid; if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { DropPodUtility.DropThingsNear(parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, true, true); letterLookTarget = parms.spawnCenter; } else { foreach (Pawn current in list) { float value = Rand.Value; IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, 8); GenSpawn.Spawn(current, intVec); letterLookTarget = current; // Vehicles for raiders // lowered probability for shield users as they are overpowered bool isShieldUser = false; if (parms.faction.def.techLevel >= TechLevel.Industrial && current.RaceProps.fleshType != FleshType.Mechanoid && current.RaceProps.ToolUser) { List <Apparel> wornApparel = current.apparel.WornApparel; for (int i = 0; i < wornApparel.Count; i++) { if (wornApparel[i] is PersonalShield) { isShieldUser = true; break; } } if (value >= 0.66f && !isShieldUser || isShieldUser && value > 0.9f) { CellFinder.RandomClosewalkCellNear(current.Position, 5); Thing thing = ThingMaker.MakeThing(ThingDef.Named("VehicleATV")); if (value >= 0.9f && !isShieldUser) { thing = ThingMaker.MakeThing(ThingDef.Named("VehicleCombatATV")); } GenSpawn.Spawn(thing, current.Position); Job job = new Job(HaulJobDefOf.Mount); Find.Reservations.ReleaseAllForTarget(thing); job.targetA = thing; current.jobs.StartJob(job, JobCondition.InterruptForced, null, true); int num2 = Mathf.FloorToInt(Rand.Value * 0.2f * thing.MaxHitPoints); thing.TakeDamage(new DamageInfo(DamageDefOf.Deterioration, num2, null, null)); SoundInfo info = SoundInfo.InWorld(thing); thing.TryGetComp <CompMountable>().sustainerAmbient = thing.TryGetComp <CompVehicle>().compProps.soundAmbient.TrySpawnSustainer(info); } } } } 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); } Find.LetterStack.ReceiveLetter(GetLetterLabel(parms), GetLetterText(parms, list), GetLetterType(), letterLookTarget, stringBuilder.ToString()); if (GetLetterType() == LetterType.BadUrgent) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived); } PawnRelationUtility.Notify_PawnsSeenByPlayer(list, GetRelatedPawnsInfoLetterText(parms), true); Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list); AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction); 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(ap => ap is PersonalShield)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, OpportunityType.Critical); break; } } } if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat("Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", Find.StoryWatcher.watcherWealth.WealthTotal, ")")); } } Find.TickManager.slower.SignalForceNormalSpeedShort(); Find.StoryWatcher.statsRecord.numRaidsEnemy++; 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); if (!this.TryResolveRaidFaction(parms)) { Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction"); 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).ToList <Pawn>(); if (list.Count == 0) { Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms); return(false); } TargetInfo target = TargetInfo.Invalid; if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop) { DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true); target = new TargetInfo(parms.spawnCenter, map); } else { foreach (Pawn arg_B3_0 in list) { IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8); GenSpawn.Spawn(arg_B3_0, intVec, map); target = arg_B3_0; } } 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); string lalalal = this.GetRelatedPawnsInfoLetterText(parms); PawnRelationUtility.Notify_PawnsSeenByPlayer(list, out lalalal, true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.ThreatSmall) { TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]); } 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.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); }