public static void DrawColonistsMenu(ref Rect inRect, float margin, List <Pawn> colonists, Action <Pawn> set) { const int perRow = 3; var gap = (int)margin; inRect.width += gap; Log.Message("Open " + colonists.Count); UITools.DrawBoxGridView(out _, out _, ref inRect, ref _scrollPosition, perRow, gap, (i, boxRect) => { var colonist = colonists[i]; Widgets.DrawAltRect(boxRect); Widgets.DrawHighlightIfMouseover(boxRect); var portraitSize = new Vector2(boxRect.width / 2, boxRect.height); var portraitRect = new Rect(boxRect.x + boxRect.width * 0.5f - portraitSize.x / 2, boxRect.y, portraitSize.x, portraitSize.y); Texture pawnTexture = PortraitsCache.Get(colonist, portraitSize); GUI.DrawTexture(portraitRect, pawnTexture); TooltipHandler.TipRegion(portraitRect, colonist.Name.ToStringFull); if (Widgets.ButtonInvisible(boxRect)) { set(colonist); } return(true); }, colonists.Count); }
protected override bool CanDoNext() { bool flag; if (NewGameRules.floCurItemPoints < 0f || NewGameRules.floCurPawnPoints < 0f) { Messages.Message("You do not have enough points to continue.", MessageSound.RejectInput); flag = false; return(flag); } if (!base.CanDoNext()) { return(false); } List <Pawn> .Enumerator enumerator = Find.GameInitData.startingPawns.GetEnumerator(); try { while (enumerator.MoveNext()) { if (enumerator.Current.Name.IsValid) { continue; } Messages.Message("EveryoneNeedsValidName".Translate(), MessageSound.RejectInput); flag = false; return(flag); } PortraitsCache.Clear(); return(true); } finally { ((IDisposable)(object)enumerator).Dispose(); } }
public virtual void Update() { try { ResolutionUtility.Update(); RealTime.Update(); LongEventHandler.LongEventsUpdate(out var sceneChanged); if (sceneChanged) { destroyed = true; } else if (!LongEventHandler.ShouldWaitForEvent) { Rand.EnsureStateStackEmpty(); Widgets.EnsureMousePositionStackEmpty(); SteamManager.Update(); PortraitsCache.PortraitsCacheUpdate(); AttackTargetsCache.AttackTargetsCacheStaticUpdate(); Pawn_MeleeVerbs.PawnMeleeVerbsStaticUpdate(); Storyteller.StorytellerStaticUpdate(); CaravanInventoryUtility.CaravanInventoryUtilityStaticUpdate(); uiRoot.UIRootUpdate(); if (Time.frameCount > 3 && !prefsApplied) { prefsApplied = true; Prefs.Apply(); } soundRoot.Update(); } } catch (Exception arg) { Log.Error("Root level exception in Update(): " + arg); } }
public void DrawColonistMouseAttachment(int index, Vector2 dragStartPos, int entryGroup) { Pawn pawn = null; Vector2 vector = default(Vector2); int num = 0; for (int i = 0; i < cachedEntries.Count; i++) { if (cachedEntries[i].group == entryGroup && cachedEntries[i].pawn != null) { if (num == index) { pawn = cachedEntries[i].pawn; vector = new Vector2(cachedDrawLocs[i].x, cachedDrawLocs[i].y); break; } num++; } } if (pawn != null) { RenderTexture iconTex = PortraitsCache.Get(pawn, ColonistBarColonistDrawer.PawnTextureSize, ColonistBarColonistDrawer.PawnTextureCameraOffset, 1.28205f); Rect rect = new Rect(vector.x, vector.y, Size.x, Size.y); Rect pawnTextureRect = drawer.GetPawnTextureRect(rect.position); pawnTextureRect.position += Event.current.mousePosition - dragStartPos; GenUI.DrawMouseAttachment(iconTex, "", 0f, default(Vector2), pawnTextureRect); } }
public static void Androidify(Pawn pawn) { ThingDef_AlienRace alien = ThingDefOf.ChjAndroid as ThingDef_AlienRace; pawn.story.hairColor = alien.alienRace.generalSettings.alienPartGenerator.colorChannels.FirstOrDefault(channel => channel.name == "hair").first.NewRandomizedColor(); AlienComp alienComp = pawn.TryGetComp <AlienComp>(); if (alienComp != null) { alienComp.ColorChannels["skin"].first = alien.alienRace.generalSettings.alienPartGenerator.colorChannels.FirstOrDefault(channel => channel.name == "skin").first.NewRandomizedColor(); } PortraitsCache.SetDirty(pawn); PortraitsCache.PortraitsCacheUpdate(); //Add Android Hediff. pawn.health.AddHediff(HediffDefOf.ChjAndroidLike); //Remove old wounds and bad birthday related ones. List <Hediff> hediffs = pawn.health.hediffSet.hediffs.ToList(); foreach (Hediff hediff in hediffs) { if (hediff is Hediff_Injury injury && injury.IsPermanent()) { pawn.health.hediffSet.hediffs.Remove(injury); injury.PostRemoved(); pawn.health.Notify_HediffChanged(null); }
public static bool CanDoNext(ref Page original) { bool result; if (!CheckColonistStats()) { Find.WindowStack.Add(new Page_VerifyStartConfiguration(original)); result = false; } else { foreach (Pawn current in Find.GameInitData.startingPawns) { if (!current.Name.IsValid) { Messages.Message(Translator.Translate("EveryoneNeedsValidName"), MessageSound.RejectInput); result = false; return(result); } } PortraitsCache.Clear(); result = true; } return(result); }
public static void DrawPawnCard(Pawn pawn, Rect rect) { Text.Font = GameFont.Small; GUI.DrawTexture(new Rect(rect.x, rect.y, 100, 140), PortraitsCache.Get(pawn, new Vector2(100, 140))); Rect rect2 = rect; rect2.x += 100; rect2.width = 210; rect2.height = 30; Widgets.Label(rect2, pawn.Name.ToStringFull); rect2.y += 20; Widgets.DrawLineHorizontal(rect2.x, rect2.y, 210); Text.Font = GameFont.Tiny; Rect skillsRect = rect2; skillsRect.y += 10; skillsRect.width = 210; skillsRect.height = 24; GeoscapeWindow.DrawSkill(pawn.skills.GetSkill(SkillDefOf.Social), skillsRect); skillsRect.y += 30; GeoscapeWindow.DrawSkill(pawn.skills.GetSkill(SkillDefOf.Intellectual), skillsRect); skillsRect.y += 35; Widgets.Label(skillsRect, pawn.Faction.Name); if (pawn.Faction != Faction.OfPlayer) { skillsRect.y += 20; Widgets.Label(skillsRect, $"{pawn.Faction.PlayerRelationKind.GetLabel()}: {pawn.Faction.PlayerGoodwill.ToStringWithSign()}"); } }
public static bool DrawQueue_Prefix(object __instance, Rect canvas) { if (AltRPal) { canvas.xMax += 130f + 2 * Margin; //keep an eye on his MainTabWindow_ResearchTree.DrawTopBar method for changes to this number canvas = canvas.ExpandedBy(Margin); } float padding = 12f; float spacing = Find.ColonistBar.SpaceBetweenColonistsHorizontal; float height = canvas.height; float startPos = canvas.xMax - height - padding; Vector2 size = new Vector2(height + spacing, height - padding); Vector2 innerSize = new Vector2(height - padding, height - padding); IEnumerable <object> expertiseDisplay = new object[] { }; bool displayActive = false; using (IEnumerator <Pawn> enumerator = Find.ColonistBar.GetColonistsInOrder().Where(x => x.TechBound()).AsEnumerable().Reverse().GetEnumerator()) { while (enumerator.MoveNext()) { Vector2 position = new Vector2(startPos, canvas.y); Rect box = new Rect(position, size); Rect innerBox = new Rect(position.x + spacing, position.y, size.x - spacing - 2 * padding, size.y); Pawn pawn = enumerator.Current; GUI.DrawTexture(box, PortraitsCache.Get(pawn, size, default, 1.4f));
public override void CompTickRare() { Pawn pawn = base.parent as Pawn; Map map = pawn?.Map; if (Settings.OnlyApplyToColonists && pawn.Faction?.IsPlayer == false) { return; } if (map != null && Settings.Indoors != Indoors.ShowHats && pawn.RaceProps?.Humanlike == true && !pawn.Dead) { if (this.isIndoors == null) { this.isIndoors = DetermineIsIndoors(pawn, map); PortraitsCache.SetDirty(pawn); GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(pawn); return; } bool orig = this.isIndoors.Value; this.isIndoors = this.DetermineIsIndoors(pawn, map); if (orig != this.isIndoors.Value) { PortraitsCache.SetDirty(pawn); GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(pawn); } } }
public static bool ResolveAllGraphicsWereWolf(PawnGraphicSet __instance) { if (Current.ProgramState != ProgramState.Playing) { return(true); } var pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!pawn.Spawned) { return(true); } var compWerewolf = pawn.GetComp <CompWerewolf>(); if (compWerewolf == null || !compWerewolf.IsTransformed) { return(true); } compWerewolf.CurrentWerewolfForm.bodyGraphicData = compWerewolf.CurrentWerewolfForm.def.graphicData; __instance.nakedGraphic = compWerewolf.CurrentWerewolfForm.bodyGraphicData.Graphic; __instance.ResolveApparelGraphics(); PortraitsCache.SetDirty(pawn); return(false); }
// ReSharper disable once MissingXmlDoc public override void WriteSettings() { settings?.Write(); SetMainButtons(); if (Current.ProgramState != ProgramState.Playing) { return; } { } List <Pawn> allPawns = PawnsFinder.AllMapsWorldAndTemporary_AliveOrDead.ToList(); for (int i = 0; i < allPawns.Count; i++) { Pawn pawn = allPawns[i]; if (!pawn.HasCompFace()) { continue; } pawn.Drawer.renderer.graphics.nakedGraphic = null; PortraitsCache.SetDirty(pawn); } // Bug: Not working when called or retrieved inside a mod // if (Find.ColonistBar != null) // { // Find.ColonistBar.MarkColonistsDirty(); // } }
public static void DirtyCache_Postfix(HediffSet __instance) { if (Current.ProgramState != ProgramState.Playing) { return; } Pawn pawn = __instance.pawn; // Traverse.Create(__instance).Field("pawn").GetValue<Pawn>(); if (pawn == null || !pawn.Spawned || pawn.Map == null) { return; } if (!pawn.GetCompFace(out CompFace compFace)) { return; } if (!compFace.Deactivated && pawn.CheckForAddedOrMissingParts()) { pawn.Drawer.renderer.graphics.nakedGraphic = null; PortraitsCache.SetDirty(pawn); } pawn.GetCompAnim()?.PawnBodyGraphic?.Initialize(); }
private void MakeUndowned() { if (!this.Downed) { Log.Error(this.pawn + " tried to do MakeUndowned when already undowned.", false); } else { this.healthState = PawnHealthState.Mobile; if (PawnUtility.ShouldSendNotificationAbout(this.pawn)) { Messages.Message("MessageNoLongerDowned".Translate(new object[] { this.pawn.LabelCap }), this.pawn, MessageTypeDefOf.PositiveEvent, true); } if (this.pawn.Spawned && !this.pawn.InBed()) { this.pawn.jobs.EndCurrentJob(JobCondition.Incompletable, true); } PortraitsCache.SetDirty(this.pawn); if (this.pawn.guest != null) { this.pawn.guest.Notify_PawnUndowned(); } } }
static void Postfix(Pawn pawn) { if (!pawn.Spawned) { return; // Should never be the case here but copied from previous logic anyway just in case } if (!(RimbrellasMod.settings.showUmbrellasInRain || RimbrellasMod.settings.showUmbrellasInSnow)) { return; } if ((!RimbrellasMod.settings.showUmbrellas) || (!(ShowFoldablesNow(pawn.Map)) || (pawn.Map.roofGrid.Roofed(pawn.Position) && !RimbrellasMod.settings.showUmbrellasWhenInside))) { List <ApparelGraphicRecord> remove = new List <ApparelGraphicRecord>(); foreach (ApparelGraphicRecord rec in pawn.Drawer.renderer.graphics.apparelGraphics) { if (UmbrellaDefMethods.HideableUmbrellaDefs.Contains(rec.sourceApparel.def) || (UmbrellaDefMethods.UmbrellaDefs.Contains(rec.sourceApparel.def) && !RimbrellasMod.settings.showUmbrellas)) { remove.Add(rec); } } foreach (ApparelGraphicRecord rec in remove) { pawn.Drawer.renderer.graphics.apparelGraphics.Remove(rec); } PortraitsCache.SetDirty(pawn); // this gets called twice (once in the patched method) which is a bit unfortunate but makes the portraits correct at least } }
private void UpdatePortrate() { this.Pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.Clear(); PortraitsCache.PortraitsCacheUpdate(); this.PortraitNeedUpdate = false; }
static void Postfix(ref PawnGraphicSet __instance) { if (!__instance.pawn.Spawned) { return; } if (!(RimbrellasMod.settings.showUmbrellasInRain || RimbrellasMod.settings.showUmbrellasInSnow)) { return; } if ((!RimbrellasMod.settings.showUmbrellas) || (!(ShowFoldablesNow(__instance.pawn.Map)) || (__instance.pawn.Map.roofGrid.Roofed(__instance.pawn.Position) && !RimbrellasMod.settings.showUmbrellasWhenInside))) { List <ApparelGraphicRecord> remove = new List <ApparelGraphicRecord>(); foreach (ApparelGraphicRecord rec in __instance.apparelGraphics) { if (UmbrellaDefMethods.HideableUmbrellaDefs.Contains(rec.sourceApparel.def) || (UmbrellaDefMethods.UmbrellaDefs.Contains(rec.sourceApparel.def) && !RimbrellasMod.settings.showUmbrellas)) { remove.Add(rec); } } foreach (ApparelGraphicRecord rec in remove) { __instance.apparelGraphics.Remove(rec); } PortraitsCache.SetDirty(__instance.pawn); // NOTE: this is not necessarily required for when the weather changes and could be moved to only call when checking for roof above } }
public virtual void Update() { try { RealTime.Update(); bool flag; LongEventHandler.LongEventsUpdate(out flag); if (flag) { this.destroyed = true; } else if (!LongEventHandler.ShouldWaitForEvent) { Rand.EnsureStateStackEmpty(); SteamManager.Update(); PortraitsCache.PortraitsCacheUpdate(); this.uiRoot.UIRootUpdate(); if (Time.frameCount > 3 && !Root.prefsApplied) { Root.prefsApplied = true; Prefs.Apply(); } this.soundRoot.Update(); MemoryTracker.Update(); } } catch (Exception e) { Log.Notify_Exception(e); throw; } }
public override void DoWindowContents(Rect inRect) { // Draw the childhood stories Widgets.BeginScrollView(rectChildStoriesOut, ref vecChildScrollPosition, rectChildStoriesIn); GUI.BeginGroup(rectChildStoriesIn); ChildStoriesIn(); GUI.EndGroup(); Widgets.EndScrollView(); // Draw the childhood equip button if (Widgets.ButtonText(rectChildEquip, "Apply Childhood", true, true) && intCurSelectedChildStory != 0) { pawn.story.childhood = tempStoryViewerBS; } // Draw the adulthood stories Widgets.BeginScrollView(rectAdultStoriesOut, ref vecAdultScrollPosition, rectAdultStoriesIn); GUI.BeginGroup(rectAdultStoriesIn); AdultStoriesIn(); GUI.EndGroup(); Widgets.EndScrollView(); // Draw the adulthood equip button if (Widgets.ButtonText(rectAdultEquip, "Apply Adulthood", true, true) && intCurSelectedAdultStory != 0 && pawn.ageTracker.AgeBiologicalYearsFloat >= 20f) { pawn.story.adulthood = tempStoryViewerBS; } // Draw the story viewer Widgets.BeginScrollView(rectStoryViewerOut, ref vecViewerScrollPosition, rectStoryViewerIn); GUI.BeginGroup(rectStoryViewerIn); StoryViewerIn(); GUI.EndGroup(); Widgets.EndScrollView(); // Draw pawn name Text.Font = GameFont.Medium; Widgets.Label(rectNameLabel, strName); Text.Font = GameFont.Small; // Draw the portrait Vector3 vector3 = new Vector3(); GUI.DrawTexture(rectPortrait, PortraitsCache.Get(pawn, PawnPortraitSize, vector3, 1f)); // Draw the equipped childhood label Widgets.Label(rectChildLabel, strChildhoodLabel); // Draw the equipped childhood Widgets.Label(rectEquippedChildLabel, pawn.story.childhood.Title); if (pawn.story.adulthood != null) { // Draw the equipped adulthood label Widgets.Label(rectAdultLabel, strAdulthoodLabel); // Draw the equipped adulthood Widgets.Label(rectEquippedAdultLabel, pawn.story.adulthood.Title); } }
public override void PostClose() { base.PostClose(); Prefs.HatsOnlyOnMap = this.originalHatsHideSetting; this.dresserDto.Pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.SetDirty(this.dresserDto.Pawn); }
public static Rect AddPortraitWidget(float left, float top, DresserDTO dresserDto) { // Portrait Rect rect = new Rect(left, top, PortraitSize.x, PortraitSize.y); // Draw the pawn's portrait GUI.BeginGroup(rect); Vector2 size = new Vector2(128f, 180f); Rect position = new Rect(rect.width * 0.5f - size.x * 0.5f, 10f + rect.height * 0.5f - size.y * 0.5f, size.x, size.y); RenderTexture image = PortraitsCache.Get(dresserDto.Pawn, size, new Vector3(0f, 0f, 0f), 1f); GUI.DrawTexture(position, image); GUI.EndGroup(); GUI.color = Color.white; Widgets.DrawBox(rect, 1); for (int x = 0; x < ColorPreset.width; ++x) { for (int y = 0; y < ColorPreset.height; ++y) { ColorPreset.SetPixel(x, y, Color.white); } } return(rect); }
protected override IEnumerable <Toil> MakeNewToils() { // Go to hairdressing table var gotoToil = Toils_Goto.GotoThing(TableIndex, PathEndMode.InteractionCell); yield return(gotoToil); // Bring up interface yield return(new Toil() { initAction = () => { Find.WindowStack.Add(new Dialog_ChangeHairstyle(this)); }, defaultCompleteMode = ToilCompleteMode.Never }); // Change hairstyle var hairdressToil = new Toil { tickAction = () => { // Work on changing hairstyle restyleTicksDone += pawn.GetStatValue(RimWorld.StatDefOf.GeneralLaborSpeed); if (restyleTicksDone >= ticksToRestyle) { if (AnyChanges) { FilthMaker.TryMakeFilth(pawn.Position, pawn.Map, ThingDefOf.VHE_Filth_Hair, 3); } if (newHairDef != null) { pawn.story.hairDef = newHairDef; } if (newHairColour.HasValue) { pawn.story.hairColor = newHairColour.Value; } if (newBeardDef != null) { this.pawn.style.beardDef = newBeardDef; } pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.SetDirty(pawn); GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(pawn); pawn.jobs.EndCurrentJob(JobCondition.Succeeded); } }, defaultCompleteMode = ToilCompleteMode.Never }; hairdressToil.WithProgressBar(TableIndex, () => restyleTicksDone / ticksToRestyle, true); hairdressToil.FailOnCannotTouch(TableIndex, PathEndMode.Touch); hairdressToil.PlaySustainerOrSound(SoundDefOf.Recipe_Tailor); yield return(hairdressToil); }
public SamplePawnDrawer() { var factionDef = AutomataRaceSettingCache.Get(AutomataRaceDefOf.Paniel_Race).defaultFaction; var faction = factionDef != null?Find.FactionManager.FirstFactionOfDef(factionDef) : null; _pawn = PawnGenerator.GeneratePawn(AutomataRaceDefOf.Paniel_Randombox_Normal, faction: faction); Texture = PortraitsCache.Get(_pawn, new Vector2(92f, 128f)); }
private static void ApparelChanged(this Pawn_ApparelTracker _this) { LongEventHandler.ExecuteWhenFinished(delegate { _this.pawn.Drawer.renderer.graphics.ResolveApparelGraphics(); PortraitsCache.SetDirty(_this.pawn); }); }
//fixes issue of portraits of pawns with gradient hairs having blank portraits on pawn selection screen public static void PreloadCacheBugfix() { for (int i = 0; i < Find.GameInitData.startingAndOptionalPawns.Count; i++) { Pawn pawn = Find.GameInitData.startingAndOptionalPawns[i]; PortraitsCache.Get(pawn, new Vector2(70f, 110f)); PortraitsCache.Clear(); } }
public override void DoWindowContents(Rect inRect) { Rect mainRect = new Rect(0, 0, inRect.width, inRect.height).ContractedBy(WindowGap); Rect imageRect = new Rect(0, 0, 100, mainRect.height - 30); Rect textRect = new Rect(100, 0, mainRect.width - 100, mainRect.height - 30); GUI.BeginGroup(mainRect); GUI.BeginGroup(imageRect); var texture = PortraitsCache.Get(pawn, ColonistBarColonistDrawer.PawnTextureSize); float scalledWidth = imageRect.height / ColonistBarColonistDrawer.PawnTextureSize.y * ColonistBarColonistDrawer.PawnTextureSize.x; var scalledRect = new Rect(imageRect.width - scalledWidth, 0, scalledWidth, imageRect.height); GUI.DrawTexture(new Rect(18, 0, imageRect.width - 36, imageRect.height), texture); GUI.EndGroup(); var listing = new Listing_Standard(GameFont.Small); listing.Begin(textRect); string message = ""; switch (type) { case AlterType.Bad: message = "BadPeople_TurnBadMessage"; break; case AlterType.Good: message = "BadPeople_TurnGoodMessage"; break; case AlterType.Cannibal: message = "BadPeople_TurnCannibalMessage"; break; case AlterType.KinSlayer: message = "BadPeople_TurnKinSlayer"; break; } listing.Label(message.Translate(pawn.Name.ToStringShort)); listing.End(); if (type == AlterType.Bad || type == AlterType.Good) { if (Widgets.ButtonText(new Rect(0, mainRect.height - 30, 200, 30), "BadPeople_Button_Details".Translate())) { Find.WindowStack.Add(new Dialog_ActionList(actionList)); } } if (Widgets.ButtonText(new Rect(mainRect.width - 200, mainRect.height - 30, 200, 30), "OK".Translate())) { Close(); } GUI.EndGroup(); }
private void DrawPawnPortrait() { // Shape the portrait Rect rect = new Rect(rectCard.x + (rectCard.width * .85f), rectCard.y + (rectCard.height * .05f), PawnPortraitSize.x, PawnPortraitSize.y); Vector3 vector3 = new Vector3(); // Draw the portrait GUI.DrawTexture(rect, PortraitsCache.Get(pawn, PawnPortraitSize, vector3, 1f)); }
protected void rerenderPawn(Pawn pawn) { // Tell the pawn's Drawer that the Person has had a hair-change makeover. // This code is from https://github.com/KiameV/rimworld-changedresser/blob/f0b8fcf9073cd1c232fcd26b0b083cb3137924a3/Source/UI/DresserUI.cs // Copyright (c) 2017 Travis Offtermatt // MIT License pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.SetDirty(pawn); }
public static void Notify_EquipmentChanged(this Pawn_EquipmentTracker tracker) { LongEventHandler.ExecuteWhenFinished(delegate { tracker.pawn.Drawer.renderer.graphics.SetApparelGraphicsDirty(); PortraitsCache.SetDirty(tracker.pawn); GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(tracker.pawn); }); }
static void Postfix(Pawn_DraftController __instance) { var p = __instance.pawn; if (p.IsColonist && !p.Dead && p.def.race.Humanlike) { PortraitsCache.SetDirty(p); GlobalTextureAtlasManager.TryMarkPawnFrameSetDirty(p); } }
private void UpdatePawnInfo() { if (Current.ProgramState == ProgramState.Playing && MutationUtilities.AllMutationsWithGraphics.Contains(def) && pawn.IsColonist) { pawn.Drawer.renderer.graphics.ResolveAllGraphics(); PortraitsCache.SetDirty(pawn); } pawn.GetMutationTracker()?.NotifyMutationAdded(this); }