private void DrawInteractionRadioButton(Rect rect, Pawn pawn, PrisonerInteractionModeDef prisonerInteraction) { //inspired by RimWorld.AreaAllowedGUI.DoAreaSelector(Rect rect, Pawn p, Area area) Widgets.RadioButton(rect.x, rect.y, pawn.guest.interactionMode == prisonerInteraction); { if (Input.GetMouseButtonUp(0)) { dragging = false; } if (!Input.GetMouseButtonDown(0)) { dragging = false; } if (Mouse.IsOver(rect)) { if (Input.GetMouseButton(0)) { dragging = true; pawn.guest.interactionMode = prisonerInteraction; } if (dragging && pawn.guest.interactionMode != prisonerInteraction) { pawn.guest.interactionMode = prisonerInteraction; SoundDefOf.Designate_DragStandard_Changed.PlayOneShotOnCamera(); } if (ModsConfig.IdeologyActive && pawn.guest.interactionMode == PrisonerInteractionModeDefOf.Convert && pawn.guest.ideoForConversion == null) { pawn.guest.ideoForConversion = Faction.OfPlayer.ideos.PrimaryIdeo; } } } }
private void SetDefaults(PrisonerInteractionModeDef mode) { Map map = SelPawn.MapHeld; if (map == null) { return; } var oldMode = Hospitality_MapComponent.Instance(map).defaultInteractionMode; if (oldMode == mode) { return; } Hospitality_MapComponent.Instance(map).defaultInteractionMode = mode; var guests = GuestUtility.GetAllGuests(map); foreach (var guest in guests) { var comp = guest.GetComp <CompGuest>(); if (comp == null) { continue; } comp.chat = mode == PrisonerInteractionModeDefOf.Chat; } }
public void SetInteractionMode(Pawn pawn, PrisonerInteractionModeDef intertaction) { pawn.guest.interactionMode = intertaction; if (intertaction == PrisonerInteractionModeDefOf.Convert || intertaction == PL_DefOf.PrisonLabor_workAndConvertOption) { pawn.guest.ideoForConversion = Faction.OfPlayer.ideos.PrimaryIdeo; } }
public Hospitality_MapComponent(bool forReal, Map map) : base(map) { // Multi-Threading killed the elegant solution if (!forReal) { return; } map.components.Add(this); defaultAreaRestriction = map.areaManager.Home; defaultInteractionMode = PrisonerInteractionModeDefOf.NoInteraction; }
protected override bool isPawnAffected(Pawn p) { PrisonerInteractionModeDef pim = p.guest.interactionMode; if (pim == PrisonerInteractionModeDefOf.NoInteraction) { return(true); } else { return(false); } }
public static string getLabelWork(PrisonerInteractionModeDef def) { //TODO add translation to work and recruit if (def == DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workOption")) { return("PrisonLabor_PrisonerWork".Translate()); } else if (def == DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workAndRecruitOption")) { return("PrisonLabor_WorkAndRecruit".Translate()); } return(null); }
public static bool RecruitInLaborEnabled(Pawn pawn) { if (workDef == null || workAndRecruitDef == null) { workDef = DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workOption"); workAndRecruitDef = DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workAndRecruitOption"); } if (pawn.guest.interactionMode == workAndRecruitDef && pawn.guest.ScheduledForInteraction && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Talking)) { return(true); } return(false); }
public static bool LaborEnabled(Pawn pawn) { if (workDef == null || workAndRecruitDef == null) { workDef = DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workOption"); workAndRecruitDef = DefDatabase <PrisonerInteractionModeDef> .GetNamed("PrisonLabor_workAndRecruitOption"); } if (pawn.IsPrisoner && !PrisonLaborPrefs.DisableMod) { if (pawn.guest.interactionMode == workDef || pawn.guest.interactionMode == workAndRecruitDef) { return(true); } } return(false); }
protected override Job TryGiveJob(Pawn pawn) { if (ShouldSkip(pawn)) { return(null); } Predicate <Thing> predicate = (Thing x) => pawn.Map.mapPawns.SlavesAndPrisonersOfColonySpawned.Contains(x); Thing t = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn), 100f, predicate, PotentialWorkThingsGlobal(pawn)); if (t is null) { return(null); } if (!ShouldTakeCareOfPrisoner(pawn, t)) { return(null); } Pawn pawn2 = (Pawn)t; PrisonerInteractionModeDef interactionMode = pawn2.guest.interactionMode; if ((interactionMode == PrisonerInteractionModeDefOf.AttemptRecruit || interactionMode == PrisonerInteractionModeDefOf.ReduceResistance) && pawn2.guest.ScheduledForInteraction && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Talking) && (!pawn2.Downed || pawn2.InBed()) && pawn.CanReserve(t) && pawn2.Awake()) { if (interactionMode == PrisonerInteractionModeDefOf.ReduceResistance && pawn2.guest.Resistance <= 0f) { return(null); } return(JobMaker.MakeJob(InternalDefOf.GR_HumanoidHybridRecruit, t)); } return(null); }
public override Job JobOnThing(Pawn pawn, Thing target, bool forced = false) { if (!ShouldTakeCareOfPrisoner(pawn, target, forced)) { return(null); } Pawn pawn2 = (Pawn)target; PrisonerInteractionModeDef interactionMode = pawn2.guest.interactionMode; BeatingTracker beatingTracker = Current.Game.World.GetComponent <BeatingTracker>(); bool canGiveBeating = (beatingTracker?.CanGiveBeating(pawn) ?? true) && pawn.health.capacities.CapableOf(PawnCapacityDefOf.Manipulation); bool initiatorHealty = Mathf.Abs(1.0f - (pawn.health?.summaryHealth?.SummaryHealthPercent ?? 1.0f)) <= 0.01f; bool targetHealthy = Mathf.Abs(1.0f - (pawn2.health?.summaryHealth?.SummaryHealthPercent ?? 1.0f)) <= 0.01f; bool prisonerCanReceiveBeating = (interactionMode == PrisonerInteractionModeDefOf.ReduceResistance && !pawn2.Downed); if (canGiveBeating && prisonerCanReceiveBeating && initiatorHealty && (targetHealthy || beatingTracker.GetBeatingInProgress(pawn2) != null)) { Job breakJob = JobMaker.MakeJob(BeatPrisonersDefOf.CM_Beat_Prisoners_Job_Break_Resistance, target); breakJob.maxNumMeleeAttacks = Rand.RangeInclusive(3, 9); return(breakJob); } return(null); }
public void Draw(Rect rect, ThingWithComps ownerPawn) { Text.Font = GameFont.Small; string value = "-"; switch (oType) { case objectType.Stat: Text.Anchor = TextAnchor.MiddleCenter; StatDef stat = (StatDef)displayObject; stat.neverDisabled = true; string statValue = (stat.ValueToString(ownerPawn.GetStatValue((StatDef)displayObject, true))); Widgets.Label(rect, statValue); if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine(stat.LabelCap); stringBuilder.AppendLine(); stringBuilder.AppendLine(stat.description); TooltipHandler.TipRegion(rect, new TipSignal(stringBuilder.ToString(), rect.GetHashCode())); break; case objectType.Skill: if ((ownerPawn is Pawn) && (ownerPawn as Pawn).RaceProps.Humanlike) { DrawSkill(rect, ownerPawn as Pawn); } break; case objectType.Need: if (ownerPawn is Pawn) { DrawNeed(rect, ownerPawn as Pawn); } break; case objectType.Capacity: Text.Anchor = TextAnchor.MiddleCenter; if (ownerPawn is Pawn) { Pawn p = (Pawn)ownerPawn; PawnCapacityDef cap = (PawnCapacityDef)displayObject; Pair <string, Color> effLabel = HealthCardUtility.GetEfficiencyLabel(p, cap); string pawnCapTip = HealthCardUtility.GetPawnCapacityTip(p, cap); // I stole this one line from Fluffy's Medical Tab. THANKS FLUFFY! string capValue = (p.health.capacities.GetLevel(cap) * 100f).ToString("F0") + "%"; GUI.color = effLabel.Second; Widgets.Label(rect, capValue); GUI.color = Color.white; if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } StringBuilder stringBuilder2 = new StringBuilder(); stringBuilder2.AppendLine(cap.LabelCap); stringBuilder2.AppendLine(); stringBuilder2.AppendLine(cap.description); TooltipHandler.TipRegion(rect, new TipSignal(stringBuilder2.ToString(), rect.GetHashCode())); } break; case objectType.MentalState: Text.Font = GameFont.Tiny; Text.Anchor = TextAnchor.MiddleCenter; if (ownerPawn is Pawn && (ownerPawn as Pawn).MentalState != null) { string ms = ((ownerPawn as Pawn).MentalState.InspectLine); Widgets.Label(rect, ms); if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } } Text.Font = GameFont.Medium; break; case objectType.Age: Text.Anchor = TextAnchor.MiddleCenter; string ageValue = ((ownerPawn as Pawn).ageTracker.AgeBiologicalYears.ToString()); Widgets.Label(rect, ageValue); if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } break; case objectType.Gear: DrawGear(rect, ownerPawn); break; case objectType.ControlPrisonerGetsFood: if (ownerPawn is Pawn) { if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } bool getsFood = (ownerPawn as Pawn).guest.GetsFood; Widgets.CheckboxLabeled(new Rect(rect.x + 8f, rect.y + 3f, 27f, 27f), "", ref getsFood, false); (ownerPawn as Pawn).guest.GetsFood = getsFood; } break; case objectType.ControlPrisonerInteraction: if (ownerPawn is Pawn) { if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } float x = 8f; GUI.BeginGroup(rect); IEnumerator enumerator = Enum.GetValues(typeof(PrisonerInteractionModeDef)).GetEnumerator(); try { while (enumerator.MoveNext()) { PrisonerInteractionModeDef prisonerInteractionMode = (PrisonerInteractionModeDef)(enumerator.Current); if (Widgets.RadioButton(new Vector2(x, 3f), (ownerPawn as Pawn).guest.interactionMode == prisonerInteractionMode)) { (ownerPawn as Pawn).guest.interactionMode = prisonerInteractionMode; } TooltipHandler.TipRegion(new Rect(x, 0f, 30f, 30f), new TipSignal(prisonerInteractionMode.label)); x += 30f; } } finally { IDisposable disposable = enumerator as IDisposable; if (disposable != null) { disposable.Dispose(); } } GUI.EndGroup(); } break; case objectType.ControlMedicalCare: if (ownerPawn is Pawn) { MedicalCareSetter(rect, ref (ownerPawn as Pawn).playerSettings.medCare); } break; case objectType.AnimalMilkFullness: Text.Anchor = TextAnchor.MiddleCenter; if (ownerPawn is Pawn && ((Pawn)ownerPawn).ageTracker.CurLifeStage.milkable) { var comp = ((Pawn)ownerPawn).AllComps.Where <ThingComp>(x => x is CompMilkable).FirstOrDefault(); if (comp != null) { value = ((CompMilkable)comp).Fullness.ToStringPercent(); } } Widgets.Label(rect, value); break; case objectType.AnimalWoolGrowth: Text.Anchor = TextAnchor.MiddleCenter; if (ownerPawn is Pawn && ((Pawn)ownerPawn).ageTracker.CurLifeStage.shearable) { var comp = ((Pawn)ownerPawn).AllComps.Where <ThingComp>(x => x is CompShearable).FirstOrDefault(); if (comp != null) { value = ((CompShearable)comp).Fullness.ToStringPercent(); } } Widgets.Label(rect, value); break; case objectType.CurrentJob: if (ownerPawn is Pawn && ((Pawn)ownerPawn).jobs.curDriver != null) { string text = ((Pawn)ownerPawn).jobs.curDriver.GetReport(); Text.Anchor = TextAnchor.MiddleLeft; Rect tRect = new Rect(rect.xMin + 2, rect.yMin + 3, rect.width - 2, rect.height); GenText.SetTextSizeToFit(text, tRect); if (Text.Font == GameFont.Tiny) { Widgets.Label(tRect, text); } else { Rect sRect = new Rect(rect.xMin + 2, rect.yMin, rect.width - 2, rect.height); Widgets.Label(sRect, text); } if (Mouse.IsOver(rect)) { GUI.DrawTexture(rect, TexUI.HighlightTex); } } break; } }
public static bool IsConvert(PrisonerInteractionModeDef interaction) { return(interaction == PrisonerInteractionModeDefOf.Convert || interaction == PL_DefOf.PrisonLabor_workAndConvertOption); }