public static void GiveAttendSermonJob(BuildingAltar altar, Pawn attendee) { if (!SermonUtility.IsPreacher(attendee)) { IntVec3 result; Building chair; if (!WatchBuildingUtility.TryFindBestWatchCell(altar, attendee, true, out result, out chair)) { if (!WatchBuildingUtility.TryFindBestWatchCell(altar as Thing, attendee, false, out result, out chair)) { return; } } if (chair != null) { Job J = new Job(C_JobDefOf.AttendSermon, altar.preacher, altar, chair); attendee.QueueJob(J); attendee.jobs.EndCurrentJob(JobCondition.InterruptForced); } else { Job J = new Job(C_JobDefOf.AttendSermon, altar.preacher, altar, result); attendee.QueueJob(J); attendee.jobs.EndCurrentJob(JobCondition.InterruptForced); } } }
public override void Tick() { base.Tick(); if (this.OptionMorning) { if (Rand.RangeInclusive(6, 10) == GenLocalDate.HourInt(this.Map)) { if (!HeldSermon) { // Log.Message("starting morning sermon"); SermonUtility.ForceSermon(this); this.HeldSermon = true; } } } if (this.OptionEvening) { if (Rand.RangeInclusive(18, 22) == GenLocalDate.HourInt(this.Map)) { if (!HeldSermon) { SermonUtility.ForceSermon(this); this.HeldSermon = true; } } } if (GenLocalDate.HourInt(this.Map) == 1 || GenLocalDate.HourInt(this.Map) == 12) { this.HeldSermon = false; } }
public static void OpenPreacherSelectMenu(BuildingAltar altar) { List <FloatMenuOption> list = new List <FloatMenuOption>(); list.Add(new FloatMenuOption("(" + "NoneLower".Translate() + ")", delegate { altar.preacher = null; }, MenuOptionPriority.Default, null, null, 0f, null)); foreach (Pawn current in altar.Map.mapPawns.FreeColonistsSpawned) { if (!SermonUtility.IsPreacher(current)) { Need_Soul nsoul = current.needs.TryGetNeed <Need_Soul>(); if (nsoul == null) { nsoul = new Need_Soul(current); } SoulTrait strait = nsoul.DevotionTrait; string text1 = current.NameStringShort + " (" + strait.SoulCurrentData.label + ")"; Action action; Pawn localCol = current; action = delegate { altar.preacher = localCol; }; list.Add(new FloatMenuOption(text1, action, MenuOptionPriority.Default, null, null, 0f, null)); } } Find.WindowStack.Add(new FloatMenu(list)); }
public static List <Pawn> GetSermonFlock(BuildingAltar altar) { List <Pawn> tmp = new List <Pawn>(); Room room = altar.GetRoom(); if (room.Role != RoomRoleDefOf.PrisonBarracks && room.Role != RoomRoleDefOf.PrisonCell) { List <Pawn> listeners = altar.Map.mapPawns.AllPawnsSpawned.FindAll(x => x.RaceProps.intelligence == Intelligence.Humanlike); bool[] flag = new bool[listeners.Count]; for (int i = 0; i < listeners.Count; i++) { if (!flag[i] && SermonUtility.ShouldAttendSermon(listeners[i], altar.preacher)) { tmp.Add(listeners[i]); flag[i] = true; } } } else { List <Pawn> prisoners = altar.Map.mapPawns.PrisonersOfColonySpawned.FindAll(x => x.RaceProps.intelligence == Intelligence.Humanlike); bool[] flag2 = new bool[prisoners.Count]; for (int i = 0; i < prisoners.Count; i++) { if (!flag2[i] && SermonUtility.ShouldAttendSermon(prisoners[i], altar.preacher)) { tmp.Add(prisoners[i]); flag2[i] = true; } } } return(tmp); }
private static void ForceListenersTest(BuildingAltar altar) { IntVec3 result; Building chair; foreach (Pawn p in altar.Map.mapPawns.AllPawnsSpawned.FindAll(x => x.RaceProps.intelligence == Intelligence.Humanlike)) { if (!SermonUtility.IsPreacher(p)) { if (!WatchBuildingUtility.TryFindBestWatchCell(altar, p, true, out result, out chair)) { if (!WatchBuildingUtility.TryFindBestWatchCell(altar as Thing, p, false, out result, out chair)) { return; } } if (chair != null) { Job J = new Job(C_JobDefOf.AttendSermon, altar.preacher, altar, chair); p.QueueJob(J); p.jobs.EndCurrentJob(JobCondition.InterruptForced); } else { Job J = new Job(C_JobDefOf.AttendSermon, altar.preacher, altar, result); p.QueueJob(J); p.jobs.EndCurrentJob(JobCondition.InterruptForced); } } } }
protected override IntVec3 GetExactWanderDest(Pawn pawn) { IntVec3 result; if (!SermonUtility.TryFindRandomCellInSermonArea(preacher, pawn, out result)) { return(IntVec3.Invalid); } return(result); }
protected override IEnumerable <Toil> MakeNewToils() { this.EndOnDespawnedOrNull(AltarIndex, JobCondition.Incompletable); yield return(Toils_Reserve.Reserve(AltarIndex, 1)); yield return(Toils_Reserve.Reserve(AltarInteractionCell, 1)); Toil gotoAltarToil; gotoAltarToil = Toils_Goto.GotoThing(AltarInteractionCell, PathEndMode.OnCell); yield return(gotoAltarToil); // Log.Message("A"); // if (this.CurJob == null) Log.Message("NOJob?"); var altarToil = new Toil(); altarToil.defaultCompleteMode = ToilCompleteMode.Delay; altarToil.defaultDuration = this.CurJob.def.joyDuration; altarToil.AddPreTickAction(() => { // if (this.pawn == null) Log.Message("No Pawn??"); // if (this.TargetA == null) Log.Message("NoTargetA"); this.pawn.Drawer.rotator.FaceCell(this.TargetA.Cell); this.pawn.GainComfortFromCellIfPossible(); ThrowPreacherMote(this.pawn); }); yield return(altarToil); // Log.Message("B"); // if (this.pawn.jobs.curDriver == null) Log.Message("NoDriver"); // if (this.pawn.jobs.curJob == null) Log.Message("NoJob"); this.AddFinishAction(() => { if (this.TargetA.HasThing) { this.Map.reservationManager.Release(this.CurJob.targetA.Thing, pawn); } else { this.Map.reservationManager.Release(this.CurJob.targetA.Cell, this.pawn); } BuildingAltar altar = this.TargetA.Thing as BuildingAltar; altar.CalledInFlock = false; SermonUtility.HoldSermonTickCheckEnd(this.pawn, altar); // Log.Message("C"); }); }
public static void ForceSermon(BuildingAltar altar, bool isMorningPrayer = true) { IntVec3 b = altar.def.interactionCellOffset.RotatedBy(altar.Rotation) + altar.Position; altar.activeSermon = true; List <Pawn> list = new List <Pawn>(); if (!list.Contains(altar.preacher)) { list.Add(altar.preacher); } list.AddRange(SermonUtility.GetSermonFlock(altar)); Lord lord = LordMaker.MakeNewLord(altar.Faction, new LordJob_Sermon(altar, isMorningPrayer), altar.Map, list); }
protected override IEnumerable <Toil> MakeNewToils() { this.EndOnDespawnedOrNull(Spot, JobCondition.Incompletable); yield return(Toils_Reserve.Reserve(Spot, this.CurJob.def.joyMaxParticipants)); Toil gotoPreacher; if (this.TargetC.HasThing) { gotoPreacher = Toils_Goto.GotoThing(Spot, PathEndMode.OnCell); } else { gotoPreacher = Toils_Goto.GotoCell(Spot, PathEndMode.OnCell); } yield return(gotoPreacher); var altarToil = new Toil(); altarToil.defaultCompleteMode = ToilCompleteMode.Delay; altarToil.defaultDuration = this.CurJob.def.joyDuration; altarToil.AddPreTickAction(() => { this.pawn.Drawer.rotator.FaceCell(this.TargetB.Cell); this.pawn.GainComfortFromCellIfPossible(); }); yield return(altarToil); this.AddFinishAction(() => { SermonUtility.AttendSermonTickCheckEnd(this.pawn, this.TargetA.Thing as Pawn); if (this.TargetC.HasThing) { this.Map.reservationManager.Release(this.CurJob.targetC.Thing, pawn); } else { this.Map.reservationManager.Release(this.CurJob.targetC.Cell, this.pawn); } }); }
protected override IEnumerable <Toil> MakeNewToils() { this.EndOnDespawnedOrNull(AltarIndex, JobCondition.Incompletable); yield return(Toils_Reserve.Reserve(AltarIndex, 1)); yield return(Toils_Reserve.Reserve(AltarInteractionCell, 1)); Toil gotoAltarToil; gotoAltarToil = Toils_Goto.GotoThing(AltarInteractionCell, PathEndMode.OnCell); yield return(gotoAltarToil); List <Pawn> Listeners = Find.MapPawns.AllPawnsSpawned.FindAll(x => x.CurJob.def == CorruptionDefOfs.AttendSermon); var altarToil = new Toil(); altarToil.defaultCompleteMode = ToilCompleteMode.Delay; altarToil.defaultDuration = this.CurJob.def.joyDuration; altarToil.AddPreTickAction(() => { this.pawn.Drawer.rotator.FaceCell(this.TargetA.Cell); this.pawn.GainComfortFromCellIfPossible(); }); yield return(altarToil); this.AddFinishAction(() => { if (this.TargetA.HasThing) { Find.Reservations.Release(this.CurJob.targetA.Thing, pawn); } else { Find.Reservations.Release(this.CurJob.targetA.Cell, this.pawn); } SermonUtility.HoldSermonTickCheckEnd(this.pawn, this.TargetA.Thing as BuildingAltar); }); }
public override void Tick() { base.Tick(); if (this.OptionMorning) { if (Rand.RangeInclusive(6, 10) == GenDate.HourInt) { if (!HeldSermon) { SermonUtility.ForceSermon(this); this.HeldSermon = true; } } } if (this.OptionMorning) { if (Rand.RangeInclusive(18, 22) == GenDate.HourInt) { if (!HeldSermon) { SermonUtility.ForceSermon(this); this.HeldSermon = true; } } } if (this.preacher.CurJob.def == CorruptionDefOfs.HoldSermon) { GetSermonFlock(this); } if (GenDate.HourInt == 1 || GenDate.HourInt == 12) { this.HeldSermon = false; } }
public static void AttendSermonTickCheckEnd(Pawn pawn, Pawn preacher) { var soul = pawn.needs.TryGetNeed <Need_Soul>(); if (soul == null) { return; } float num = 0f; if (movingSermon(preacher)) { num += 0.01f; } else { num += 0.005f; } soul.GainNeed(num); pawn.needs.mood.thoughts.memories.TryGainMemoryThought(SermonUtility.GetSermonThoughts(preacher, pawn)); }
public static bool GetBestPreacher(Pawn p, out Pawn bestPreacher, out BuildingAltar altar) { List <Pawn> opposingDevotees = p.needs.TryGetNeed <Need_Soul>().OpposingDevotees; if (opposingDevotees == null) { opposingDevotees = new List <Pawn>(); } List <Pawn> availablePreachers = p.Map.mapPawns.FreeColonistsSpawned.ToList <Pawn>().FindAll(s => s.CurJob.def == C_JobDefOf.HoldSermon); //Select best preacher of colony bestPreacher = availablePreachers.Aggregate((i1, i2) => i1.skills.GetSkill(SkillDefOf.Social).Level > i2.skills.GetSkill(SkillDefOf.Social).Level ? i1 : i2); altar = SermonUtility.chosenAltar(bestPreacher); //Check if pawn has listened to this preacher before and if he is of an opposing faith. If so, another preacher will be chosen while (opposingDevotees.Contains(bestPreacher)) { if (availablePreachers.Count > 1) { availablePreachers.Remove(bestPreacher); bestPreacher = availablePreachers.Aggregate((i1, i2) => i1.skills.GetSkill(SkillDefOf.Social).Level > i2.skills.GetSkill(SkillDefOf.Social).Level ? i1 : i2); altar = chosenAltar(bestPreacher); } else { bestPreacher = null; altar = null; } } if (bestPreacher != null && altar != null) { return(true); } return(false); }
public static bool IsBestPreacher(Pawn p, Pawn preacher) { List <Pawn> opposingDevotees = p.needs.TryGetNeed <Need_Soul>().OpposingDevotees; if (opposingDevotees == null) { opposingDevotees = new List <Pawn>(); } List <Pawn> availablePreachers = p.Map.mapPawns.AllPawnsSpawned.ToList <Pawn>().FindAll(x => SermonUtility.IsPreacher(x)); Pawn bestcurrentPreacher; if (availablePreachers != null) { bestcurrentPreacher = availablePreachers.Aggregate((i1, i2) => i1.skills.GetSkill(SkillDefOf.Social).Level > i2.skills.GetSkill(SkillDefOf.Social).Level ? i1 : i2); if (bestcurrentPreacher == preacher && !opposingDevotees.Contains(preacher)) { return(true); } } return(false); }
public static void DrawTempleCard(Rect rect, BuildingAltar altar) { GUI.BeginGroup(rect); Rect rect2 = new Rect(rect.x, rect.y + 20f, 250f, 55f); Text.Font = GameFont.Medium; Widgets.Label(rect2, altar.RoomName); Text.Font = GameFont.Small; Rect rect3 = rect2; rect3.y = rect2.yMax + 30f; rect3.width = 200f; rect3.height = 25f; Widgets.Label(rect3, "Preacher".Translate() + ": "); rect3.xMin = rect3.center.x + 10f; string label2 = PreacherLabel(altar); if (Widgets.ButtonText(rect3, label2, true, false, true)) { TempleCardUtility.OpenPreacherSelectMenu(altar); } Rect rect4 = rect3; rect4.y += 35f; rect4.width = 200f; if (Widgets.ButtonText(rect4, "RenameTemple".Translate(), true, false, true)) { Find.WindowStack.Add(new Dialog_RenameTemple(altar)); } Rect rectDebug1 = rect4; rectDebug1.y += 25f; if (DebugSettings.godMode) { if (Widgets.ButtonText(rectDebug1, "ForceSermonDebug".Translate(), true, false, true)) { SermonUtility.ForceSermon(altar); } Rect rectDebug2 = rectDebug1; rectDebug2.y += 25f; if (Widgets.ButtonText(rectDebug2, "ForceListenersDebug".Translate(), true, false, true)) { TempleCardUtility.ForceListenersTest(altar); } } Rect rect5 = rect4; rect5.x = rect4.xMax + 5f; rect5.width = 200f; rect5.y -= 20f; Widgets.CheckboxLabeled(rect5, "MorningSermons".Translate(), ref altar.OptionMorning, false); Rect rect6 = rect5; rect6.y += 20f; Widgets.CheckboxLabeled(rect6, "EveningSermons".Translate(), ref altar.OptionEvening, false); GUI.EndGroup(); }
public static bool ShouldAttendSermon(Pawn p, Pawn preacher) { if (!p.HostileTo(Faction.OfPlayer) && p != preacher) { if (!p.Drafted) { int num = 0; Need_Soul soul = p.needs.TryGetNeed <Need_Soul>(); switch (soul.DevotionTrait.SDegree) { case -2: { num = 0; break; } case -1: { num = 5; break; } case 0: { num = 10; break; } case 1: { num = 15; break; } case 2: { num = 20; break; } } if (p.CurJob.playerForced) { num = 0; if (soul.DevotionTrait.SDegree == 2) { num = 10; } } if (p.CurJob.def == C_JobDefOf.AttendSermon) { num = 0; } if (!SermonUtility.IsBestPreacher(p, preacher)) { num = 0; } if ((Rand.RangeInclusive(0, 15) + num) >= 20) { return(true); } } } return(false); }
public static ThoughtDef GetSermonThoughts(Pawn preacher, Pawn listener) { Need_Soul s1 = preacher.needs.TryGetNeed <Need_Soul>(); Need_Soul s2 = listener.needs.TryGetNeed <Need_Soul>(); bool flag1 = s1.NoPatron; bool flag2 = s2.NoPatron; if (flag1) { if (flag2) { if (s2.DevotionTrait.SDegree == -2) { if (listener.IsPrisonerOfColony) { return(SermonThoughtDefOf.AttendedSermonPureAtheistForced); } return(SermonThoughtDefOf.AttendedSermonPureAtheist); } else if (s1.DevotionTrait.SDegree == -1) { if (SermonUtility.movingSermon(preacher)) { return(SermonThoughtDefOf.AttendedSermonPureMoving); } return(SermonThoughtDefOf.AttendedSermonPureAgnostic); } else { if (movingSermon(preacher)) { return(SermonThoughtDefOf.AttendedSermonPureMoving); } return(SermonThoughtDefOf.AttendedSermonPureNice); } } else { if (listener.IsPrisonerOfColony) { return(SermonThoughtDefOf.AttendedSermonDarkPureForced); } s2.OpposingDevotees.Add(preacher); return(SermonThoughtDefOf.AttendedSermonDarkPure); } } else { if (flag2) { if (listener.IsPrisonerOfColony) { return(SermonThoughtDefOf.AttendedSermonPureHereticalForced); } if (movingSermon(preacher)) { s2.OpposingDevotees.Add(preacher); return(SermonThoughtDefOf.AttendedSermonPureHeretical); } s2.OpposingDevotees.Add(preacher); return(SermonThoughtDefOf.AttendedSermonPureUnholy); } else { if (movingSermon(preacher)) { return(SermonThoughtDefOf.AttendedSermonDarkGlorious); } return(SermonThoughtDefOf.AttendedSermonDarkGood); } } }
public static BuildingAltar chosenAltar(Pawn preacher) { return(SermonUtility.allAltars(preacher).Find(x => x.preacher == preacher)); }