public static Pawn DetermineTeacher(Map map) { Pawn result = null; List <Pawn> pawns = IncidentWorker_LeaderElection.getAllColonists(); List <Pawn> tpawns = new List <Pawn>(); foreach (Pawn current in pawns) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); if (h1 != null || h2 != null || h3 != null || h4 != null) { if (current.Map == map) { tpawns.Add(current); } } } return(tpawns.RandomElement()); }
public override void Notify_PawnDied() { if (!isThisExpired()) { Messages.Message("LeaderDied".Translate(new object[] { this.def.label, this.pawn.Name.ToStringFull }), MessageSound.Negative); foreach (Pawn p in IncidentWorker_LeaderElection.getAllColonists()) { int num2 = p.relations.OpinionOf(this.pawn); if (num2 <= -20) { p.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderDiedRival"), this.pawn); } else { p.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderDied"), this.pawn); } } if (Utility.isDictatorship) { Find.WindowStack.Add(new Dialog_ChooseLeader()); } } this.pawn.health.RemoveHediff(this); }
protected virtual List <Pawn> getLeaders() { List <Pawn> pawns = new List <Pawn>(); pawns.AddRange(IncidentWorker_LeaderElection.getAllColonists()); List <Pawn> tpawns = new List <Pawn>(); foreach (Pawn current in pawns) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); if (h1 != null || h2 != null || h3 != null || h4 != null) { } else { tpawns.Add(current); } } foreach (Pawn current in tpawns) { pawns.Remove(current); } return(pawns); }
public static void listPawns(int index, Building_TeachingSpot spot) { List <FloatMenuOption> list = new List <FloatMenuOption>(); List <Pawn> tpawns = new List <Pawn>(); foreach (Pawn current in IncidentWorker_LeaderElection.getAllColonists()) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); if (h1 != null || h2 != null || h3 != null || h4 != null) { if (!spot.teachers.Contains(current)) { tpawns.Add(current); } } } list.Add(new FloatMenuOption("-None-", delegate { spot.teachers[index] = null; }, MenuOptionPriority.Default, null, null, 0f, null, null)); foreach (Pawn p in tpawns) { list.Add(new FloatMenuOption(p.Name.ToStringShort, delegate { String report = ""; String skills = ""; bool hasSkill = TeachingUtility.leaderHasAnySkill(p, out report, out skills); if (hasSkill) { spot.teachers[index] = p; if (report != "") { Messages.Message(report, TargetInfo.Invalid, MessageSound.Standard); } } else { spot.teachers[index] = null; Messages.Message(report, TargetInfo.Invalid, MessageSound.RejectInput); } }, MenuOptionPriority.Default, null, null, 0f, null, null)); } Find.WindowStack.Add(new FloatMenu(list)); }
public override void DoWindowContents(Rect inRect) { Text.Font = GameFont.Small; Listing_Standard listing_Standard = new Listing_Standard(); listing_Standard.Begin(inRect); listing_Standard.Label("ChooseGov".Translate()); String label = this.chosenLeadership.name; if (listing_Standard.ButtonText(label, null)) { List <FloatMenuOption> list = new List <FloatMenuOption>(); foreach (GovType gov in ColonyLeadership.govtypes) { list.Add(new FloatMenuOption(gov.name, delegate { this.chosenLeadership = gov; }, MenuOptionPriority.Default, delegate() { TooltipHandler.TipRegion(inRect, gov.desc); }, null, 0f, null, null)); } Find.WindowStack.Add(new FloatMenu(list)); } listing_Standard.Gap(24f); if (listing_Standard.ButtonText("OK".Translate(), null)) { GameComponent_ColonyLeadership comp = Utility.getCLComp(); if (comp != null) { comp.chosenLeadership = this.chosenLeadership; } if (comp != null) { comp.chosenGov = ColonyLeadership.govtypes.IndexOf(this.chosenLeadership); } Find.WindowStack.TryRemove(this, true); if (this.chosenLeadership.name == "Dictatorship".Translate()) { foreach (Pawn p in IncidentWorker_LeaderElection.getAllColonists()) { LeaderWindow.purgeLeadership(p); } Find.WindowStack.Add(new Dialog_ChooseLeader()); } } listing_Standard.End(); }
public static Pawn getMostHatedLeaderBy(Pawn pawn) { List <Pawn> pawns = IncidentWorker_LeaderElection.getAllColonists(); List <Pawn> tpawns2 = new List <Pawn>(); foreach (Pawn current in pawns) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); if (h1 != null || h2 != null || h3 != null || h4 != null) { tpawns2.Add(current); } } Pawn temp = null; float lastopinion = 100; foreach (Pawn p2 in tpawns2) { if (p2 != pawn) { float opinion = pawn.relations.OpinionOf(p2); if (opinion <= lastopinion) { lastopinion = opinion; temp = p2; } } } if (temp != null) { if (pawn.relations.OpinionOf(temp) > -60f) { temp = null; } } return(temp); }
public override bool TryExecute(IncidentParms parms) { Map map = (Map)parms.target; List <Pawn> pawns = IncidentWorker_LeaderElection.getAllColonists(); List <Pawn> tpawns2 = new List <Pawn>(); foreach (Pawn current in pawns) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); if (h1 == null && h2 == null && h3 == null && h4 == null && current.Map == map) { tpawns2.Add(current); } } Pawn pawn = tpawns2.RandomElement(); if (pawn != null && !pawn.Downed && !pawn.Dead) { if (pawn.CurJob != null && pawn.jobs.curDriver.layingDown != LayingDownState.NotLaying) { pawn.jobs.EndCurrentJob(JobCondition.InterruptForced, true); } pawn.mindState.mentalStateHandler.TryStartMentalState(DefDatabase <MentalStateDef> .GetNamed("Rebelling"), null, false, false, null); String s = "He"; if (pawn.gender == Gender.Female) { s = "She"; } Find.LetterStack.ReceiveLetter("RebelLetter".Translate(), "RebelLetterDesc".Translate(new object[] { pawn.Name.ToStringShort }), LetterDefOf.BadUrgent, pawn, null); return(true); } return(false); }
public Dialog_ChooseIgnored(Building_TeachingSpot spot) { this.forcePause = true; this.doCloseX = true; this.closeOnEscapeKey = true; this.absorbInputAroundWindow = true; this.closeOnClickedOutside = true; this.spot = spot; this.ignoreTemp = IncidentWorker_LeaderElection.getAllColonists(); foreach (Pawn p in this.ignoreTemp) { if (this.spot.ignored.Contains(p)) { tempPawnList.Add(new TempPawn(p, true)); } else { tempPawnList.Add(new TempPawn(p, false)); } } }
public float getSkillFactor(Pawn current) { HediffLeader h1 = (HediffLeader)current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); HediffLeader h2 = (HediffLeader)current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); HediffLeader h3 = (HediffLeader)current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); HediffLeader h4 = (HediffLeader)current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); float score = IncidentWorker_LeaderElection.getBotanistScore(current); if (h2 != null) { h1 = h2; score = IncidentWorker_LeaderElection.getWarriorScore(current); } if (h3 != null) { h1 = h3; score = IncidentWorker_LeaderElection.getCarpenterScore(current); } if (h4 != null) { h1 = h4; score = IncidentWorker_LeaderElection.getScientistScore(current); } return(((score / 20f) * 0.3f) + 1f); }
public override void TickRare() { base.TickRare(); if (Utility.isDemocracy) { if (allowedDays.Contains(GenLocalDate.DayOfSeason(Map))) { if (allowElection && (Find.TickManager.TicksGame > lastElectionTick + GenDate.TicksPerDay) && Rand.MTBEventOccurs(0.03f, 60000f, 150f) && AcceptableMapConditionsToStartElection(Map)) { List <Pawn> leaders = getLeaders(); List <Pawn> pawnCount = new List <Pawn>(); bool flag = false; pawnCount.AddRange(IncidentWorker_LeaderElection.getAllColonists()); if (leaders.NullOrEmpty()) { flag = true; } if (leaders.Count <= 1 && pawnCount.Count >= 5) { flag = true; } List <Pawn> canBeVoted = new List <Pawn>(); canBeVoted.AddRange(IncidentWorker_LeaderElection.getAllColonists()); List <Pawn> tpawns2 = new List <Pawn>(); foreach (Pawn current in canBeVoted) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); Hediff h5 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leaderExpired")); if (h1 != null || h2 != null || h3 != null || h4 != null || h5 != null) { tpawns2.Add(current); } if (current.story.WorkTagIsDisabled(WorkTags.Social)) { tpawns2.Add(current); } } foreach (Pawn current in tpawns2) { canBeVoted.Remove(current); } if (canBeVoted.NullOrEmpty()) { Messages.Message("ElectionFail_NoAbleLeader".Translate(), MessageSound.Negative); } else { if (flag) { TryStartGathering(Map); } } } } } }
protected override IEnumerable <Toil> MakeNewToils() { this.FailOnDestroyedOrNull(TargetIndex.A); this.FailOnDestroyedOrNull(TargetIndex.B); this.FailOnAggroMentalState(TargetIndex.A); if (base.CurJob.def == JobDefOf.Rescue) { this.FailOnNotDowned(TargetIndex.A); } this.FailOn(delegate { if (this.CurJob.def.makeTargetPrisoner) { if (!this.DropBed.ForPrisoners) { return(true); } } else if (this.DropBed.ForPrisoners != ((Pawn)((Thing)this.TargetA)).IsPrisoner) { return(true); } return(false); }); yield return(Toils_Reserve.Reserve(TargetIndex.A, 1)); yield return(Toils_Reserve.Reserve(TargetIndex.B, this.DropBed.SleepingSlotsCount)); yield return(Toils_Bed.ClaimBedIfNonMedical(TargetIndex.B, TargetIndex.A)); this.globalFinishActions.Add(delegate { if (this.CurJob.def.makeTargetPrisoner && this.Takee.ownership.OwnedBed == this.DropBed && this.Takee.Position != RestUtility.GetBedSleepingSlotPosFor(this.Takee, this.DropBed)) { this.Takee.ownership.UnclaimBed(); } }); yield return(Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A).FailOnDespawnedNullOrForbidden(TargetIndex.B).FailOnNonMedicalBedNotOwned(TargetIndex.B, TargetIndex.A).FailOn(() => this.CurJob.def == JobDefOf.Arrest && !this.Takee.CanBeArrested()).FailOn(() => !this.pawn.CanReach(this.DropBed, PathEndMode.OnCell, Danger.Deadly, false, TraverseMode.ByPawn)).FailOnSomeonePhysicallyInteracting(TargetIndex.A)); yield return(new Toil { initAction = delegate { if (this.CurJob.def.makeTargetPrisoner) { Pawn pawn = (Pawn)this.CurJob.targetA.Thing; Lord lord = pawn.GetLord(); if (lord != null) { lord.Notify_PawnAttemptArrested(pawn); } GenClamor.DoClamor(pawn, 10f, ClamorType.Harm); if (Rand.Value < 0.1f) { Messages.Message("MessageRefusedArrest".Translate(new object[] { pawn.LabelShort }), pawn, MessageSound.SeriousAlert); pawn.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Berserk, null, false, false, null); IncidentWorker_Rebellion.removeLeadership(pawn); pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderArrested")); this.pawn.mindState.mentalStateHandler.CurState.RecoverFromState(); Find.LetterStack.ReceiveLetter("LeaderEndLetter".Translate(), "LeaderEndLetterDesc".Translate(new object[] { pawn.Name.ToStringFull }), LetterDefOf.BadNonUrgent, pawn, null); this.pawn.jobs.EndCurrentJob(JobCondition.Incompletable, true); } } } }); yield return(Toils_Haul.StartCarryThing(TargetIndex.A, false, false)); yield return(Toils_Goto.GotoThing(TargetIndex.B, PathEndMode.Touch)); yield return(new Toil { initAction = delegate { if (this.CurJob.def.makeTargetPrisoner) { this.pawn.mindState.mentalStateHandler.CurState.RecoverFromState(); IncidentWorker_Rebellion.removeLeadership(this.Takee); this.Takee.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderArrested")); Find.LetterStack.ReceiveLetter("LeaderEndLetterArrested".Translate(), "LeaderEndLetterDescArrested".Translate(new object[] { Takee.Name.ToStringFull }), LetterDefOf.BadNonUrgent, this.pawn, null); foreach (Pawn p in IncidentWorker_LeaderElection.getAllColonists()) { if (p != this.Takee) { p.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderArrestedColonist"), null); } } if (this.Takee.guest.released) { this.Takee.guest.released = false; this.Takee.guest.interactionMode = PrisonerInteractionModeDefOf.NoInteraction; } if (!this.Takee.IsPrisonerOfColony) { if (this.Takee.Faction != null) { this.Takee.Faction.Notify_MemberCaptured(this.Takee, this.pawn.Faction); } this.Takee.guest.SetGuestStatus(Faction.OfPlayer, true); if (this.Takee.guest.IsPrisoner) { TaleRecorder.RecordTale(TaleDefOf.Captured, new object[] { this.pawn, this.Takee }); this.pawn.records.Increment(RecordDefOf.PeopleCaptured); } } } else if (this.Takee.Faction != Faction.OfPlayer && this.Takee.HostFaction != Faction.OfPlayer && this.Takee.guest != null) { this.Takee.guest.SetGuestStatus(Faction.OfPlayer, false); } if (this.Takee.playerSettings == null) { this.Takee.playerSettings = new Pawn_PlayerSettings(this.Takee); } } }); yield return(Toils_Reserve.Release(TargetIndex.B)); yield return(new Toil { initAction = delegate { IntVec3 position = this.DropBed.Position; Thing thing; this.pawn.carryTracker.TryDropCarriedThing(position, ThingPlaceMode.Direct, out thing, null); if (!this.DropBed.Destroyed && (this.DropBed.owners.Contains(this.Takee) || (this.DropBed.Medical && this.DropBed.AnyUnoccupiedSleepingSlot) || this.Takee.ownership == null)) { this.Takee.jobs.Notify_TuckedIntoBed(this.DropBed); if (this.Takee.RaceProps.Humanlike && this.CurJob.def != JobDefOf.Arrest && !this.Takee.IsPrisonerOfColony) { this.Takee.relations.Notify_RescuedBy(this.pawn); } } if (this.Takee.IsPrisonerOfColony) { LessonAutoActivator.TeachOpportunity(ConceptDefOf.PrisonerTab, this.Takee, OpportunityType.GoodToKnow); } }, defaultCompleteMode = ToilCompleteMode.Instant }); }
public override void DoWindowContents(Rect inRect) { Text.Font = GameFont.Small; bool flag = false; if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Return) { flag = true; Event.current.Use(); } Listing_Standard listing_Standard = new Listing_Standard(); listing_Standard.Begin(inRect); listing_Standard.Label("ChooseLeader".Translate()); String label = (this.chosenPawn == null ? "NoneL".Translate() : this.chosenPawn.Name.ToStringShort); if (listing_Standard.ButtonText(label, null)) { List <FloatMenuOption> list = new List <FloatMenuOption>(); List <Pawn> tpawns2 = new List <Pawn>(); list.Add(new FloatMenuOption("-" + "NoneL".Translate() + "-", delegate { this.chosenPawn = null; }, MenuOptionPriority.Default, null, null, 0f, null, null)); foreach (Pawn current in IncidentWorker_LeaderElection.getAllColonists()) { Hediff h1 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader1")); Hediff h2 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader2")); Hediff h3 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader3")); Hediff h4 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leader4")); Hediff h5 = current.health.hediffSet.GetFirstHediffOfDef(HediffDef.Named("leaderExpired")); if (h1 == null && h2 == null && h3 == null && h4 == null && h5 == null && !current.story.WorkTagIsDisabled(WorkTags.Social)) { tpawns2.Add(current); } } foreach (Pawn p in tpawns2) { list.Add(new FloatMenuOption(p.Name.ToStringShort, delegate { this.chosenPawn = p; }, MenuOptionPriority.Default, null, null, 0f, null, null)); } if (list.Count() == 1) { TooltipHandler.TipRegion(inRect, "ChooseLeader_NoAbleColonists".Translate()); } Find.WindowStack.Add(new FloatMenu(list)); } if (listing_Standard.ButtonText("OK".Translate(), null)) { if (this.chosenPawn != null) { String targetLeader = ""; Pawn most = this.chosenPawn; float maxValue = new float[] { IncidentWorker_LeaderElection.getBotanistScore(most), IncidentWorker_LeaderElection.getWarriorScore(most), IncidentWorker_LeaderElection.getCarpenterScore(most), IncidentWorker_LeaderElection.getScientistScore(most) }.Max(); if (maxValue == IncidentWorker_LeaderElection.getBotanistScore(most)) { targetLeader = "leader1"; } if (maxValue == IncidentWorker_LeaderElection.getWarriorScore(most)) { targetLeader = "leader2"; } if (maxValue == IncidentWorker_LeaderElection.getCarpenterScore(most)) { targetLeader = "leader3"; } if (maxValue == IncidentWorker_LeaderElection.getScientistScore(most)) { targetLeader = "leader4"; } Hediff hediff = HediffMaker.MakeHediff(HediffDef.Named(targetLeader), most, null); IncidentWorker_LeaderElection.doElect(most, hediff, true); } Find.WindowStack.TryRemove(this, true); } listing_Standard.End(); }
public override void NeedInterval() { if (ticks >= 5) { float totalOpinion = 0; int totalPawns = 0; foreach (Pawn p in IncidentWorker_LeaderElection.getAllColonists()) { if (p != this.pawn && !p.Dead) { totalOpinion += p.relations.OpinionOf(this.pawn); totalPawns++; } } float medium = (totalOpinion / totalPawns); this.opinion = medium; float newlevel = (Mathf.Clamp(medium, 0f, 100f) / 100f) * getSkillFactor(this.pawn); if (this.curLevelInt < newlevel) { this.lastGainTick = Find.TickManager.TicksGame; } else if (this.curLevelInt > newlevel) { this.lastLoseTick = Find.TickManager.TicksGame; } if (newlevel > 1f) { newlevel = 1f; } this.curLevelInt = newlevel;; if (totalPawns == 0) { this.curLevelInt = 0.5f * getSkillFactor(this.pawn); } ticks = 0; bool flag5 = false; if (!Utility.isDictatorship) { if (!this.chosenToStay && opinion < -40 && opinion > -80) { if (Rand.MTBEventOccurs(1.25f, 60000f, 150f)) { flag5 = true; StringBuilder str = new StringBuilder(); String s = "she"; if (this.pawn.gender == Gender.Male) { s = "he"; } String b = "her"; if (this.pawn.gender == Gender.Male) { b = "his"; } str.AppendLine("UnpopularM".Translate(new object[] { this.pawn.Name.ToStringFull })); str.AppendLine(""); str.AppendLine("ResignLetterText".Translate(new object[] { this.pawn.Name.ToStringFull })); str.AppendLine(""); str.AppendLine("OnlyOnce".Translate()); Action removeLeader = delegate { Find.LetterStack.ReceiveLetter("LeaderEndLetter".Translate(), "LeaderEndLetterDesc".Translate(new object[] { pawn.Name.ToStringFull }), LetterDefOf.BadNonUrgent, this.pawn, null); this.pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderEnd")); IncidentWorker_Rebellion.removeLeadership(this.pawn); }; Action keepLeader = delegate { this.chosenToStay = true; }; Dialog_MessageBox window = new Dialog_MessageBox(str.ToString(), "Resign".Translate(), removeLeader, "DontTesign".Translate(), keepLeader, "ResignationProposal".Translate(), false); Find.WindowStack.Add(window); } } if (!flag5 && opinion < -60) { float mtb = 0.50f; if (opinion < -70) { mtb = 0.35f; } if (opinion < -80) { mtb = 0.20f; } if (opinion < -90) { mtb = 0.10f; } if (Rand.MTBEventOccurs(mtb, 60000f, 150f)) { bool flag = false; foreach (Pawn pa in IncidentWorker_LeaderElection.getAllColonists()) { if (pa != null && pa.MentalState != null && pa.MentalState.def == DefDatabase <MentalStateDef> .GetNamed("Rebelling")) { flag = true; } } if (!flag) { IncidentParms parms = StorytellerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentDef.Named("RebellionL").category, (this.pawn.Map)); if (IncidentDef.Named("RebellionL").Worker.TryExecute(parms)) { String s = "her"; if (this.pawn.gender == Gender.Male) { s = "his"; } Find.LetterStack.ReceiveLetter("RebellionLetter".Translate(), "RebellionLetterDesc".Translate(new object[] { this.pawn.Name.ToStringFull }), LetterDefOf.BadNonUrgent, this.pawn, null); } } } } } } ticks++; }