Esempio n. 1
0
 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);
         }
     }
 }
Esempio n. 2
0
        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));
        }
Esempio n. 4
0
        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);
        }
Esempio n. 7
0
        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");
            });
        }
Esempio n. 8
0
        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);
            });
        }
Esempio n. 11
0
        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;
            }
        }
Esempio n. 12
0
        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));
        }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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();
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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);
                }
            }
        }
Esempio n. 18
0
 public static BuildingAltar chosenAltar(Pawn preacher)
 {
     return(SermonUtility.allAltars(preacher).Find(x => x.preacher == preacher));
 }