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;
             }
         }
     }
 }
Esempio n. 2
0
        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);
 }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
 }