private void PodOpen() { for (int i = 0; i < this.info.containedThings.Count; i++) { Thing thing = this.info.containedThings[i]; GenPlace.TryPlaceThing(thing, base.Position, ThingPlaceMode.Near); Pawn pawn = thing as Pawn; if (pawn != null && pawn.RaceProps.Humanlike) { TaleRecorder.RecordTale(TaleDef.Named("LandedInPod"), new object[] { pawn }); } } this.info.containedThings.Clear(); if (this.info.leaveSlag) { for (int j = 0; j < 1; j++) { Thing thing2 = ThingMaker.MakeThing(ThingDefOf.ChunkSlagSteel, null); GenPlace.TryPlaceThing(thing2, base.Position, ThingPlaceMode.Near); } } SoundDef.Named("DropPodOpen").PlayOneShot(base.Position); }
private void ShipOpen() { // loop over all contents for (int i = 0; i < this.info.containedThings.Count; i++) { // Setup a new thing Thing thing = this.info.containedThings[i]; // Place thing in world GenPlace.TryPlaceThing(thing, GenAdj.RandomAdjacentCell8Way(this.Position), ThingPlaceMode.Near); // If its a pawn Pawn pawn = thing as Pawn; // if its a humanlike pawn if (pawn != null && pawn.RaceProps.Humanlike) { // Record a tale TaleRecorder.RecordTale(TaleDef.Named("LandedInPod"), new object[] { pawn }); } } // All contents dealt with, clear list this.info.containedThings.Clear(); // Play open sound DropPodCrashed.OpenSound.PlayOneShot(base.Position); }
public static void ApplyTaleDef(string defName, Map map) { var randomPawn = map.mapPawns.FreeColonists.RandomElement(); var taleToAdd = TaleDef.Named(defName); TaleRecorder.RecordTale(taleToAdd, randomPawn); }
public Recipe_Treatment(TraitDef treatedTrait, HediffDef treatedHediff, string treatedTraitName, float treatedDifficulty, TaleDef treatedTale, int treatedDegree = 0) : base() { traitDef = treatedTrait; traitDegree = treatedDegree; hediffDef = treatedHediff; traitName = treatedTraitName; difficultyFactor = treatedDifficulty; taleDef = treatedTale; }
public static void ApplyTaleDef(string defName, Pawn pawn) { var taleToAdd = TaleDef.Named(defName); if ((pawn.IsColonist || pawn.IsSlaveOfColony || pawn.HostFaction == Faction.OfPlayer) && taleToAdd != null) { TaleRecorder.RecordTale(taleToAdd, pawn); } }
private static void LogSpecificTale(TaleDef def, int count) { List <Tale> list = new List <Tale>(); for (int i = 0; i < count; i++) { list.Add(TaleFactory.MakeRandomTestTale(def)); } LogTales(list); }
public static void ApplyTaleDef(string defName, Map map) { Pawn randomPawn = map.mapPawns.FreeColonists.RandomElement <Pawn>(); TaleDef taleToAdd = TaleDef.Named(defName); TaleRecorder.RecordTale(taleToAdd, new object[] { randomPawn, }); }
private static void Postfix(Tale __result, TaleDef def, params object[] args) { if (__result != null) { Log.Message($"{def.defName} Recording new tale: {__result}"); } else { Log.Message("Couldn't create new tale: " + def + " - " + args); } }
public static void ApplyTaleDef(string defName, Pawn pawn) { TaleDef taleToAdd = TaleDef.Named(defName); if ((pawn.IsColonist || pawn.HostFaction == Faction.OfPlayer) && taleToAdd != null) { TaleRecorder.RecordTale(taleToAdd, new object[] { pawn, }); } }
public static void ArtDescsSpecificTale() { List <FloatMenuOption> list = new List <FloatMenuOption>(); foreach (TaleDef item2 in DefDatabase <TaleDef> .AllDefs.OrderBy((TaleDef def) => def.defName)) { TaleDef localDef = item2; FloatMenuOption item = new FloatMenuOption(localDef.defName, delegate { LogSpecificTale(localDef, 40); }); list.Add(item); } Find.WindowStack.Add(new FloatMenu(list)); }
public override void SpawnSetup() { base.SpawnSetup(); var thingDef = (ThingSpawnPawnDef)def; var newPawn = (PawnConverted)PawnGenerator.GeneratePawn(thingDef.spawnPawnDef, Faction.OfColony); IntVec3 pos = CellFinder.RandomClosewalkCellNear(Position, 2); newPawn.workTypes = thingDef.workTypes; GenSpawn.Spawn(newPawn, pos); TaleRecorder.RecordTale(TaleDef.Named("CreatedMechanoid"), new object[] { newPawn }); Destroy(); }
public static bool Listener(TaleDef def, params object[] args) { Pawn p1 = null; Pawn p2 = null; var nba = args.Count(); if (nba >= 2) { p1 = args[0] as Pawn; p2 = args[1] as Pawn; } else if (nba == 1) { p1 = args[0] as Pawn; } else { return(true); } if (def == TaleDefOf.KilledColonist) { if (p2 != null && (Utils.ExceptionAndroidListBasic.Contains(p2.def.defName) || p2.TryGetComp <CompAndroidState>() != null && p2.TryGetComp <CompAndroidState>().isSurrogate)) { return(false); } } else if (def == TaleDefOf.ButcheredHumanlikeCorpse) { if (Utils.lastButcheredPawnIsAndroid) { return(false); } } else if (def == TaleDefOf.AteRawHumanlikeMeat) { if (p1 != null && Utils.ExceptionAndroidList.Contains(p1.def.defName)) { return(false); } } return(true); }
public void StartPlaying(Pawn musician, Thing instrument, Thing venue, bool isWork) { var venueHash = venue.GetHashCode(); foreach (var otherVenueHash in Performances.Keys) { if (!RadiusAndRoomCheck(Performances[otherVenueHash].Venue, venue)) { continue; } venueHash = otherVenueHash; break; } if (!Performances.ContainsKey(venueHash)) { Performances[venueHash] = new Performance(venue); } var musicianHash = musician.GetHashCode(); if (Performances[venueHash].Performers.ContainsKey(musicianHash)) { return; } Performances[venueHash].Performers[musicianHash] = new Performer { Musician = musician, Instrument = instrument }; Performances[venueHash].CalculateQuality(); if (Performances[venueHash].Quality >= 2f) { TaleRecorder.RecordTale(TaleDef.Named("PlayedMusic"), musician, instrument.def); } if (isWork) { WorkPerformanceTimestamps[musician.GetHashCode()] = Find.TickManager.TicksGame; } #if DEBUG Verse.Log.Message(string.Format("Musicians: {0}", string.Join(", ", Performances[venueHash].Performers.Select(x => LogMusician(x.Value.Musician, x.Value.Instrument)).ToArray()))); Verse.Log.Message(string.Format("Quality: {0}", Performances[venueHash].Quality)); #endif }
public static bool Listener(TaleDef def, params object[] args) { Pawn p2 = null; int nba = args.Length; Pawn p1; if (nba >= 2) { p1 = args[0] as Pawn; p2 = args[1] as Pawn; } else if (nba == 1) { p1 = args[0] as Pawn; } else { return(true); } //Si colon tué est un T1/T2 OU un surrogate on s'en fou if (def == TaleDefOf.KilledColonist) { if (p2 != null && (Utils.ExceptionAndroidListBasic.Contains(p2.def.defName) || (p2.TryGetComp <CompAndroidState>() != null && p2.TryGetComp <CompAndroidState>().isSurrogate))) { return(false); } } //Si androide butcherisé else if (def == TaleDefOf.ButcheredHumanlikeCorpse) { if (Utils.lastButcheredPawnIsAndroid) { return(false); } } //SI viande humaine mangée par androide else if (def == TaleDefOf.AteRawHumanlikeMeat) { if (p1 != null && Utils.ExceptionAndroidList.Contains(p1.def.defName)) { return(false); } } return(true); }
private static void RecruitingSuccess(Pawn guest) { PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDef.Named("RecruitGuest"), KnowledgeAmount.Total); Find.LetterStack.ReceiveLetter(labelRecruitSuccess, String.Format(txtRecruitSuccess, guest), LetterType.Good, guest); if (guest.Faction != Faction.OfPlayer) { if (guest.Faction != null) { guest.Faction.AffectGoodwillWith(Faction.OfPlayer, -guest.RecruitPenalty()); if (guest.RecruitPenalty() >= 1) { //Log.Message("txtRecruitFactionAnger"); string message; if (guest.Faction.leader != null) { message = String.Format(txtRecruitFactionAnger, guest.Faction.leader.Name, guest.Faction.Name, guest.NameStringShort, (-guest.RecruitPenalty()).ToStringByStyle(ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionChiefAnger, message, LetterType.BadNonUrgent); } else { message = String.Format(txtRecruitFactionAngerLeaderless, guest.Faction.Name, guest.NameStringShort, (-guest.RecruitPenalty()).ToStringByStyle(ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionAnger, message, LetterType.BadNonUrgent); } } else if (guest.RecruitPenalty() <= -1) { //Log.Message("txtRecruitFactionPlease"); string message; if (guest.Faction.leader != null) { message = String.Format(txtRecruitFactionPlease, guest.Faction.leader.Name, guest.Faction.Name, guest.NameStringShort, (-guest.RecruitPenalty()).ToStringByStyle(ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionChiefPlease, message, LetterType.Good); } else { message = String.Format(txtRecruitFactionPleaseLeaderless, guest.Faction.Name, guest.NameStringShort, (-guest.RecruitPenalty()).ToStringByStyle(ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionPlease, message, LetterType.Good); } } } guest.Adopt(); } var taleParams = new object[] { guest.MapHeld.mapPawns.FreeColonistsSpawned.RandomElement(), guest }; TaleRecorder.RecordTale(TaleDef.Named("Recruited"), taleParams); }
public static Tale GetLatestTale(TaleDef def, Predicate <Tale> predicate) { Tale tale = null; int num = 0; var tales = Find.TaleManager.AllTalesListForReading; for (int i = 0; i < tales.Count; i++) { if (tales[i].def == def && predicate(tales[i]) && (tale == null || tales[i].AgeTicks < num)) { tale = tales[i]; num = tales[i].AgeTicks; } } return(tale); }
public static Tale_DoublePawn GetLatestDoublePawnTale(TaleDef def, Predicate <Tale_DoublePawn> predicate) { Tale_DoublePawn tale = null; int num = 0; for (int i = 0; i < Find.TaleManager.AllTalesListForReading.Count; i++) { var latestTale = Find.TaleManager.AllTalesListForReading[i]; if (latestTale.def == def && latestTale is Tale_DoublePawn tale_doublePawn && predicate(tale_doublePawn) && (tale == null || latestTale.AgeTicks < num)) { tale = tale_doublePawn; num = latestTale.AgeTicks; } } return(tale); }
private static void RecruitingSuccess(Pawn guest, int recruitPenalty) { if (guest.Faction != Faction.OfPlayer) { if (guest.Faction != null) { guest.Faction.TryAffectGoodwillWith(Faction.OfPlayer, -recruitPenalty, false, true, null, guest); if (recruitPenalty >= 1) { // TODO: Use Translate instead of Format string message; if (guest.Faction.leader != null) { message = Format(txtRecruitFactionAnger, guest.Faction.leader.Name, guest.Faction.Name, guest.Name.ToStringShort, GenText.ToStringByStyle(-recruitPenalty, ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionChiefAnger, message, LetterDefOf.NegativeEvent, GlobalTargetInfo.Invalid, guest.Faction); } else { message = Format(txtRecruitFactionAngerLeaderless, guest.Faction.Name, guest.Name.ToStringShort, GenText.ToStringByStyle(-recruitPenalty, ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionAnger, message, LetterDefOf.NegativeEvent, GlobalTargetInfo.Invalid, guest.Faction); } } else if (recruitPenalty <= -1) { // TODO: Use Translate instead of Format string message; if (guest.Faction.leader != null) { message = Format(txtRecruitFactionPlease, guest.Faction.leader.Name, guest.Faction.Name, guest.Name.ToStringShort, GenText.ToStringByStyle(-recruitPenalty, ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionChiefPlease, message, LetterDefOf.PositiveEvent, GlobalTargetInfo.Invalid, guest.Faction); } else { message = Format(txtRecruitFactionPleaseLeaderless, guest.Faction.Name, guest.Name.ToStringShort, GenText.ToStringByStyle(-recruitPenalty, ToStringStyle.Integer, ToStringNumberSense.Offset)); Find.LetterStack.ReceiveLetter(labelRecruitFactionPlease, message, LetterDefOf.PositiveEvent, GlobalTargetInfo.Invalid, guest.Faction); } } } guest.Adopt(); } var taleParams = new object[] { guest.MapHeld.mapPawns.FreeColonistsSpawned.RandomElement(), guest }; TaleRecorder.RecordTale(TaleDef.Named("Recruited"), taleParams); }
public void InitializeCult(Pawn newFounder) { Map map = newFounder.Map; founder = newFounder; leader = newFounder; foundingFaction = newFounder.Faction; foundingCity = Find.WorldObjects.SettlementAt(newFounder.Map.Tile); influences = new List <CultInfluence>(); foreach (Settlement set in Find.WorldObjects.Settlements) { if (set == foundingCity) { influences.Add(new CultInfluence(set, 1.0f)); } else { influences.Add(new CultInfluence(set, 0.0f)); } } active = true; Find.World.GetComponent <WorldComponent_GlobalCultTracker>().worldCults.Add(this); if (foundingFaction == Faction.OfPlayerSilentFail) { SendCultLetterFounded(newFounder); //It's a day to remember TaleDef taleToAdd = TaleDef.Named("FoundedCult"); if ((newFounder.IsColonist || newFounder.HostFaction == Faction.OfPlayer) && taleToAdd != null) { TaleRecorder.RecordTale(taleToAdd, new object[] { newFounder, }); } //The founder will remember that, too. newFounder.needs.mood.thoughts.memories.TryGainMemory(CultsDefOf.Cults_FoundedCult); map.GetComponent <MapComponent_LocalCultTracker>().ResolveTerribleCultFounder(newFounder); } }
protected override IEnumerable <Toil> MakeNewToils() { //Commence fail checks! this.FailOnDestroyedOrNull(TargetIndex.A); this.FailOnDestroyedOrNull(TargetIndex.B); this.FailOnAggroMentalState(TargetIndex.A); yield return(Toils_Reserve.Reserve(TakeeIndex)); yield return(Toils_Reserve.Reserve(AltarIndex, Building_SacrificialAltar.LyingSlotsCount)); yield return(new Toil { initAction = delegate { DropAltar.ChangeState(Building_SacrificialAltar.State.sacrificing, Building_SacrificialAltar.SacrificeState.gathering); } }); //Toil 1: Go to prisoner. yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch) .FailOnDespawnedNullOrForbidden(TargetIndex.A).FailOnDespawnedNullOrForbidden(TargetIndex.B) .FailOn(() => job.def == JobDefOf.Arrest && !Takee.CanBeArrestedBy(pawn)) .FailOn(() => !pawn.CanReach(DropAltar, PathEndMode.OnCell, Danger.Deadly)) .FailOnSomeonePhysicallyInteracting(TargetIndex.A)); yield return(new Toil { initAction = delegate { if (!job.def.makeTargetPrisoner) { return; } var targetAThing = (Pawn)job.targetA.Thing; var lord = targetAThing.GetLord(); lord?.Notify_PawnAttemptArrested(targetAThing); GenClamor.DoClamor(targetAThing, 10f, ClamorDefOf.Harm); if (job.def == JobDefOf.Arrest && !targetAThing.CheckAcceptArrest(pawn)) { pawn.jobs.EndCurrentJob(JobCondition.Incompletable); } } }); //Toil 2: Carry prisoner. yield return(Toils_Haul.StartCarryThing(TargetIndex.A)); //Toil 3: Go to the altar. yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.InteractionCell)); //Toil 4: Release the prisoner. yield return(Toils_Reserve.Release(TargetIndex.B)); //Toil 5: Restrain the prisoner. yield return(new Toil { initAction = delegate { //In-case this fails... var position = DropAltar.Position; pawn.carryTracker.TryDropCarriedThing(position, ThingPlaceMode.Direct, out _); if (DropAltar.Destroyed || !DropAltar.AnyUnoccupiedLyingSlot) { return; } Takee.Position = DropAltar.GetLyingSlotPos(); Takee.Notify_Teleported(false); Takee.stances.CancelBusyStanceHard(); var newJob = new Job(CultsDefOf.Cults_WaitTiedDown, DropAltar); Takee.jobs.StartJob(newJob); }, defaultCompleteMode = ToilCompleteMode.Instant }); //Toil 6: Time to chant ominously var chantingTime = new Toil { defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = CultUtility.ritualDuration }; chantingTime.WithProgressBarToilDelay(TargetIndex.A); chantingTime.PlaySustainerOrSound(CultsDefOf.RitualChanting); var deitySymbol = ((CosmicEntityDef)DropAltar.SacrificeData.Entity.def).Symbol; chantingTime.initAction = delegate { if (deitySymbol != null) { MoteMaker.MakeInteractionBubble(pawn, null, ThingDefOf.Mote_Speech, deitySymbol); } //STATE - SACRIFICING DropAltar.ChangeState(Building_SacrificialAltar.State.sacrificing, Building_SacrificialAltar.SacrificeState.sacrificing); }; yield return(chantingTime); //Toil 8: Execution of Prisoner yield return(new Toil { initAction = delegate { //BodyPartDamageInfo value = new BodyPartDamageInfo(this.Takee.health.hediffSet.GetBrain(), false, quiet); Takee.TakeDamage(new DamageInfo(DamageDefOf.ExecutionCut, 99999, 0f, -1f, pawn, Utility.GetHeart(Takee.health.hediffSet))); if (!Takee.Dead) { Takee.Kill(null); } //ThoughtUtility.GiveThoughtsForPawnExecuted(this.Takee, PawnExecutionKind.GenericHumane); TaleRecorder.RecordTale(TaleDefOf.ExecutedPrisoner, pawn, Takee); CultUtility.SacrificeExecutionComplete(DropAltar); }, defaultCompleteMode = ToilCompleteMode.Instant }); AddFinishAction(() => { //It's a day to remember var taleToAdd = TaleDef.Named("HeldSermon"); if ((pawn.IsColonist || pawn.IsSlaveOfColony || pawn.HostFaction == Faction.OfPlayer) && taleToAdd != null) { TaleRecorder.RecordTale(taleToAdd, pawn); } //When the ritual is finished -- then let's give the thoughts /* * if (DropAltar.currentSacrificeState == Building_SacrificialAltar.SacrificeState.finished) * { * if (this.pawn == null) return; * if (DropAltar.sacrifice != null) * { * CultUtility.AttendSacrificeTickCheckEnd(this.pawn, DropAltar.sacrifice, true); * } * else * { * CultUtility.AttendSacrificeTickCheckEnd(this.pawn, null); * } * } */ }); }
static bool Prefix(TaleDef def, params object[] args) { //Prevent the recording of birth if both parents are animals to prevent unnecessary tales that keep global pawns from being garbage collected if they are used as art. return(!QOLMod.preventAnimalFamilies() || def != TaleDefOf.GaveBirth || args == null || args.Length < 1 || !IsAnimal(args[0] as Pawn) || args.Length < 2 || !IsAnimal(args[1] as Pawn)); }
protected override bool TryExecuteWorker(IncidentParms parms) { if (parms.target.PlayerWealthForStoryteller < 90000) { return(false); } Map map = (Map)parms.target; this.ResolveRaidPoints(parms); if (!this.TryResolveRaidFaction(parms)) { return(false); } IntVec3 dropCenter; dropCenter = DropCellFinder.FindRaidDropCenterDistant(map); var combat = PawnGroupKindDefOf.Combat; this.ResolveRaidStrategy(parms, combat); this.ResolveRaidArriveMode(parms); if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms)) { return(false); } PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(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); return(false); } TargetInfo target = new TargetInfo(dropCenter, map); List <ShipBase> ships = DropShipUtility.CreateDropShips(list, parms.faction); DropShipUtility.DropShipGroups(dropCenter, map, ships, ShipArrivalAction.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_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true); Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, parms.faction, stringBuilder.ToString()); if (this.GetLetterDef() == LetterDefOf.ThreatBig) { TaleDef raidTale = DefDatabase <TaleDef> .GetNamed("Raid", true); TaleRecorder.RecordTale(raidTale, new object[0]); } this.ResolveRaidParmOptions(parms); Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list); //Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, true, true, true), map, list); //AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map); LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical); if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts)) { for (int i = 0; i < list.Count; i++) { Pawn pawn = list[i]; if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt)) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical); break; } } } if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer)) { Log.Message(string.Concat(new object[] { "Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", map.wealthWatcher.WealthTotal, ")" })); } return(true); }