From cce9f99cdebc3173700300f34dd8150f1322de35 Mon Sep 17 00:00:00 2001 From: a4plane Date: Wed, 28 May 2025 14:09:32 +0900 Subject: [PATCH] =?UTF-8?q?=EB=90=A8=3F=20=3D>=20=EC=95=88=EB=90=A8=20vpe?= =?UTF-8?q?=20=ED=98=B8=ED=99=98=20=3D>=20=EB=A9=94=EC=84=9C=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=B0=BE=EC=A7=80=EB=A5=BC=20=EB=AA=BB=ED=95=A8=20?= =?UTF-8?q?=ED=83=80=EC=9E=85=20=ED=95=9C=EB=B2=88=20=EB=B4=90=EC=95=BC?= =?UTF-8?q?=ED=95=A0=EB=93=AF=20=EB=B0=94=EB=8B=90=EB=9D=BC=20=3D>=20?= =?UTF-8?q?=EB=A7=9D=EA=B0=80=EC=A7=90=20=EC=9C=84=EC=99=80=20=EB=B9=84?= =?UTF-8?q?=EC=8A=B7=ED=95=9C=20=EC=9D=B4=EC=9C=A0=EC=9D=BC=EB=93=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.idea/.gitignore | 13 + .../.idea/indexLayout.xml | 8 + .../.idea/vcs.xml | 6 + psyThingsGizmo.cs | 333 ++++++++++++++++++ psycastDontNeedPsyfocus/HarmonyPatch.cs | 80 +++-- 5 files changed, 416 insertions(+), 24 deletions(-) create mode 100644 .idea/.idea.psycastDontNeedPsyfocus/.idea/.gitignore create mode 100644 .idea/.idea.psycastDontNeedPsyfocus/.idea/indexLayout.xml create mode 100644 .idea/.idea.psycastDontNeedPsyfocus/.idea/vcs.xml create mode 100644 psyThingsGizmo.cs diff --git a/.idea/.idea.psycastDontNeedPsyfocus/.idea/.gitignore b/.idea/.idea.psycastDontNeedPsyfocus/.idea/.gitignore new file mode 100644 index 0000000..08fd53b --- /dev/null +++ b/.idea/.idea.psycastDontNeedPsyfocus/.idea/.gitignore @@ -0,0 +1,13 @@ +# 디폴트 무시된 파일 +/shelf/ +/workspace.xml +# Rider에서 무시된 파일 +/modules.xml +/.idea.psycastDontNeedPsyfocus.iml +/contentModel.xml +/projectSettingsUpdater.xml +# 에디터 기반 HTTP 클라이언트 요청 +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.psycastDontNeedPsyfocus/.idea/indexLayout.xml b/.idea/.idea.psycastDontNeedPsyfocus/.idea/indexLayout.xml new file mode 100644 index 0000000..7b08163 --- /dev/null +++ b/.idea/.idea.psycastDontNeedPsyfocus/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.psycastDontNeedPsyfocus/.idea/vcs.xml b/.idea/.idea.psycastDontNeedPsyfocus/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/.idea.psycastDontNeedPsyfocus/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/psyThingsGizmo.cs b/psyThingsGizmo.cs new file mode 100644 index 0000000..ebe7de7 --- /dev/null +++ b/psyThingsGizmo.cs @@ -0,0 +1,333 @@ +using System; +using System.Collections.Generic; +using LudeonTK; +using UnityEngine; +using Verse; +using Verse.Sound; + +namespace RimWorld +{ + // Token: 0x0200136E RID: 4974 + [StaticConstructorOnStartup] + public class PsychicEntropyGizmo : Gizmo + { + // Token: 0x060076A0 RID: 30368 RVA: 0x0028CB38 File Offset: 0x0028AD38 + public PsychicEntropyGizmo(Pawn_PsychicEntropyTracker tracker) + { + this.tracker = tracker; + this.Order = -100f; + this.targetValue = tracker.TargetPsyfocus; + this.LimitedTex = ContentFinder.Get("UI/Icons/EntropyLimit/Limited", true); + this.UnlimitedTex = ContentFinder.Get("UI/Icons/EntropyLimit/Unlimited", true); + } + + // Token: 0x060076A1 RID: 30369 RVA: 0x0028CB98 File Offset: 0x0028AD98 + private void DrawThreshold(Rect rect, float percent, float entropyValue) + { + Rect position = new Rect + { + x = rect.x + 3f + (rect.width - 8f) * percent, + y = rect.y + rect.height - 9f, + width = 2f, + height = 6f + }; + if (entropyValue < percent) + { + GUI.DrawTexture(position, BaseContent.GreyTex); + return; + } + GUI.DrawTexture(position, BaseContent.BlackTex); + } + + // Token: 0x060076A2 RID: 30370 RVA: 0x0028CC24 File Offset: 0x0028AE24 + private void DrawPsyfocusTarget(Rect rect, float percent) + { + float num = Mathf.Round((rect.width - 8f) * percent); + GUI.DrawTexture(new Rect + { + x = rect.x + 3f + num, + y = rect.y, + width = 2f, + height = rect.height + }, PsychicEntropyGizmo.PsyfocusTargetTex); + float num2 = UIScaling.AdjustCoordToUIScalingFloor(rect.x + 2f + num); + float xMax = UIScaling.AdjustCoordToUIScalingCeil(num2 + 4f); + Rect rect2 = new Rect + { + y = rect.y - 3f, + height = 5f, + xMin = num2, + xMax = xMax + }; + GUI.DrawTexture(rect2, PsychicEntropyGizmo.PsyfocusTargetTex); + Rect position = rect2; + position.y = rect.yMax - 2f; + GUI.DrawTexture(position, PsychicEntropyGizmo.PsyfocusTargetTex); + } + + // Token: 0x060076A3 RID: 30371 RVA: 0x0028CD20 File Offset: 0x0028AF20 + public override GizmoResult GizmoOnGUI(Vector2 topLeft, float maxWidth, GizmoRenderParms parms) + { + Rect rect = new Rect(topLeft.x, topLeft.y, this.GetWidth(maxWidth), 75f); + Rect rect2 = rect.ContractedBy(6f); + MainTabWindow_Inspect mainTabWindow_Inspect = (MainTabWindow_Inspect)MainButtonDefOf.Inspect.TabWindow; + Command_Psycast command_Psycast = ((mainTabWindow_Inspect != null) ? mainTabWindow_Inspect.LastMouseoverGizmo : null) as Command_Psycast; + float num = Mathf.Repeat(Time.time, 0.85f); + float num2 = 1f; + if (num < 0.1f) + { + num2 = num / 0.1f; + } + else if (num >= 0.25f) + { + num2 = 1f - (num - 0.25f) / 0.6f; + } + Widgets.DrawWindowBackground(rect); + Text.Font = GameFont.Small; + Rect rect3 = rect2; + rect3.y += 6f; + rect3.height = Text.LineHeight; + Widgets.Label(rect3, "PsychicEntropyShort".Translate()); + Rect rect4 = rect2; + rect4.y += 38f; + rect4.height = Text.LineHeight; + Widgets.Label(rect4, "PsyfocusLabelGizmo".Translate()); + Rect rect5 = rect2; + rect5.x += 63f; + rect5.y += 6f; + rect5.width = 100f; + rect5.height = 22f; + float entropyRelativeValue = this.tracker.EntropyRelativeValue; + Widgets.FillableBar(rect5, Mathf.Min(entropyRelativeValue, 1f), PsychicEntropyGizmo.EntropyBarTex, PsychicEntropyGizmo.EmptyBarTex, true); + if (this.tracker.EntropyValue > this.tracker.MaxEntropy) + { + Widgets.FillableBar(rect5, Mathf.Min(entropyRelativeValue - 1f, 1f), PsychicEntropyGizmo.OverLimitBarTex, PsychicEntropyGizmo.EntropyBarTex, true); + } + if (command_Psycast != null) + { + Ability ability = command_Psycast.Ability; + if (ability.def.EntropyGain > 1E-45f) + { + Rect rect6 = rect5.ContractedBy(3f); + float width = rect6.width; + float num3 = this.tracker.EntropyToRelativeValue(this.tracker.EntropyValue + ability.def.EntropyGain); + float num4 = entropyRelativeValue; + if (num4 > 1f) + { + num4 -= 1f; + num3 -= 1f; + } + rect6.xMin = UIScaling.AdjustCoordToUIScalingFloor(rect6.xMin + num4 * width); + rect6.width = UIScaling.AdjustCoordToUIScalingFloor(Mathf.Max(Mathf.Min(num3, 1f) - num4, 0f) * width); + GUI.color = new Color(1f, 1f, 1f, num2 * 0.7f); + GenUI.DrawTextureWithMaterial(rect6, PsychicEntropyGizmo.EntropyBarTexAdd, null, default(Rect)); + GUI.color = Color.white; + } + } + if (this.tracker.EntropyValue > this.tracker.MaxEntropy) + { + foreach (KeyValuePair keyValuePair in Pawn_PsychicEntropyTracker.EntropyThresholds) + { + if (keyValuePair.Value > 1f && keyValuePair.Value < 2f) + { + this.DrawThreshold(rect5, keyValuePair.Value - 1f, entropyRelativeValue); + } + } + } + string label = this.tracker.EntropyValue.ToString("F0") + " / " + this.tracker.MaxEntropy.ToString("F0"); + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.MiddleCenter; + Widgets.Label(rect5, label); + Text.Anchor = TextAnchor.UpperLeft; + Text.Font = GameFont.Tiny; + GUI.color = Color.white; + Rect rect7 = rect2; + rect7.width = 175f; + rect7.height = 38f; + TooltipHandler.TipRegion(rect7, delegate() + { + float f = this.tracker.EntropyValue / this.tracker.RecoveryRate; + TaggedString t = string.Concat(new object[] + { + ("PsychicEntropy".Translate() + ": ").Colorize(ColoredText.TipSectionTitleColor), + Mathf.Round(this.tracker.EntropyValue), + " / ", + Mathf.Round(this.tracker.MaxEntropy) + }); + t += "\n" + "PawnTooltipPsychicEntropyStats".Translate(this.tracker.RecoveryRate.ToString("0.#"), Mathf.Round(f)); + return (t + ("\n\n" + "PawnTooltipPsychicEntropyDesc".Translate())).Resolve(); + }, Gen.HashCombineInt(this.tracker.GetHashCode(), 133858)); + Rect rect8 = rect2; + rect8.x += 63f; + rect8.y += 38f; + rect8.width = 100f; + rect8.height = 22f; + this.lastTargetValue = this.targetValue; + if (this.tracker.Pawn.IsColonistPlayerControlled) + { + Widgets.DraggableBar(rect8, PsychicEntropyGizmo.PsyfocusBarTex, PsychicEntropyGizmo.PsyfocusBarHighlightTex, PsychicEntropyGizmo.EmptyBarTex, PsychicEntropyGizmo.PsyfocusTargetTex, ref PsychicEntropyGizmo.draggingBar, this.tracker.CurrentPsyfocus, ref this.targetValue, Pawn_PsychicEntropyTracker.PsyfocusBandPercentages, 16, 0f, 1f); + if (this.lastTargetValue != this.targetValue) + { + this.tracker.SetPsyfocusTarget(this.targetValue); + PlayerKnowledgeDatabase.KnowledgeDemonstrated(ConceptDefOf.MeditationDesiredPsyfocus, KnowledgeAmount.Total); + } + } + else + { + Widgets.FillableBar(rect8, this.tracker.CurrentPsyfocus, PsychicEntropyGizmo.PsyfocusBarTex, PsychicEntropyGizmo.EmptyBarTex, true); + } + UIHighlighter.HighlightOpportunity(rect8, "PsyfocusBar"); + if (command_Psycast != null) + { + float min = command_Psycast.Ability.def.PsyfocusCostRange.min; + if (min > 1E-45f) + { + Rect rect9 = rect8.ContractedBy(3f); + float num5 = Mathf.Max(this.tracker.CurrentPsyfocus - min, 0f); + float width2 = rect9.width; + rect9.xMin = UIScaling.AdjustCoordToUIScalingFloor(rect9.xMin + num5 * width2); + rect9.width = UIScaling.AdjustCoordToUIScalingCeil((this.tracker.CurrentPsyfocus - num5) * width2); + GUI.color = new Color(1f, 1f, 1f, num2); + GenUI.DrawTextureWithMaterial(rect9, PsychicEntropyGizmo.PsyfocusBarTexReduce, null, default(Rect)); + GUI.color = Color.white; + } + } + Rect rect10 = rect2; + rect10.y += 38f; + rect10.width = 175f; + rect10.height = 38f; + TooltipHandler.TipRegion(rect10, () => this.tracker.PsyfocusTipString(this.selectedPsyfocusTarget), Gen.HashCombineInt(this.tracker.GetHashCode(), 133873)); + if (this.tracker.Pawn.IsColonistPlayerControlled) + { + float num6 = 32f; + float num7 = 4f; + float num8 = rect2.height / 2f - num6 + num7; + float num9 = rect2.width - num6; + Rect rect11 = new Rect(rect2.x + num9, rect2.y + num8, num6, num6); + if (Widgets.ButtonImage(rect11, this.tracker.limitEntropyAmount ? this.LimitedTex : this.UnlimitedTex, true, null)) + { + this.tracker.limitEntropyAmount = !this.tracker.limitEntropyAmount; + if (this.tracker.limitEntropyAmount) + { + SoundDefOf.Tick_Low.PlayOneShotOnCamera(null); + } + else + { + SoundDefOf.Tick_High.PlayOneShotOnCamera(null); + } + } + TooltipHandler.TipRegionByKey(rect11, "PawnTooltipPsychicEntropyLimit"); + } + float num10; + if (this.TryGetPainMultiplier(this.tracker.Pawn, out num10)) + { + Text.Font = GameFont.Small; + Text.Anchor = TextAnchor.MiddleCenter; + string recoveryBonus = (num10 - 1f).ToStringPercent("F0"); + string recoveryBonus2 = recoveryBonus; + float widthCached = recoveryBonus2.GetWidthCached(); + Rect rect12 = rect2; + rect12.x += rect2.width - widthCached / 2f - 16f; + rect12.y += 38f; + rect12.width = widthCached; + rect12.height = Text.LineHeight; + GUI.color = PsychicEntropyGizmo.PainBoostColor; + Widgets.Label(rect12, recoveryBonus2); + GUI.color = Color.white; + Text.Font = GameFont.Tiny; + Text.Anchor = TextAnchor.UpperLeft; + TooltipHandler.TipRegion(rect12.ContractedBy(-1f), () => "PawnTooltipPsychicEntropyPainFocus".Translate(this.tracker.Pawn.health.hediffSet.PainTotal.ToStringPercent("F0"), recoveryBonus), Gen.HashCombineInt(this.tracker.GetHashCode(), 133878)); + } + return new GizmoResult(GizmoState.Clear); + } + + // Token: 0x060076A4 RID: 30372 RVA: 0x0028D508 File Offset: 0x0028B708 + private bool TryGetPainMultiplier(Pawn pawn, out float painMultiplier) + { + List parts = StatDefOf.PsychicEntropyRecoveryRate.parts; + for (int i = 0; i < parts.Count; i++) + { + StatPart_Pain statPart_Pain; + if ((statPart_Pain = (parts[i] as StatPart_Pain)) != null) + { + painMultiplier = statPart_Pain.PainFactor(this.tracker.Pawn); + return true; + } + } + painMultiplier = 0f; + return false; + } + + // Token: 0x060076A5 RID: 30373 RVA: 0x0028D55E File Offset: 0x0028B75E + public override float GetWidth(float maxWidth) + { + return 212f; + } + + // Token: 0x04004692 RID: 18066 + private Pawn_PsychicEntropyTracker tracker; + + // Token: 0x04004693 RID: 18067 + private float selectedPsyfocusTarget = -1f; + + // Token: 0x04004694 RID: 18068 + private static bool draggingBar; + + // Token: 0x04004695 RID: 18069 + private float lastTargetValue; + + // Token: 0x04004696 RID: 18070 + private float targetValue; + + // Token: 0x04004697 RID: 18071 + private Texture2D LimitedTex; + + // Token: 0x04004698 RID: 18072 + private Texture2D UnlimitedTex; + + // Token: 0x04004699 RID: 18073 + private const string LimitedIconPath = "UI/Icons/EntropyLimit/Limited"; + + // Token: 0x0400469A RID: 18074 + private const string UnlimitedIconPath = "UI/Icons/EntropyLimit/Unlimited"; + + // Token: 0x0400469B RID: 18075 + public const float CostPreviewFadeIn = 0.1f; + + // Token: 0x0400469C RID: 18076 + public const float CostPreviewSolid = 0.15f; + + // Token: 0x0400469D RID: 18077 + public const float CostPreviewFadeInSolid = 0.25f; + + // Token: 0x0400469E RID: 18078 + public const float CostPreviewFadeOut = 0.6f; + + // Token: 0x0400469F RID: 18079 + private static readonly Color PainBoostColor = new Color(0.2f, 0.65f, 0.35f); + + // Token: 0x040046A0 RID: 18080 + private static readonly Texture2D EntropyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.46f, 0.34f, 0.35f)); + + // Token: 0x040046A1 RID: 18081 + private static readonly Texture2D EntropyBarTexAdd = SolidColorMaterials.NewSolidColorTexture(new Color(0.78f, 0.72f, 0.66f)); + + // Token: 0x040046A2 RID: 18082 + private static readonly Texture2D OverLimitBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.75f, 0.2f, 0.15f)); + + // Token: 0x040046A3 RID: 18083 + private static readonly Texture2D PsyfocusBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.34f, 0.42f, 0.43f)); + + // Token: 0x040046A4 RID: 18084 + private static readonly Texture2D PsyfocusBarTexReduce = SolidColorMaterials.NewSolidColorTexture(new Color(0.65f, 0.83f, 0.83f)); + + // Token: 0x040046A5 RID: 18085 + private static readonly Texture2D PsyfocusBarHighlightTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.43f, 0.54f, 0.55f)); + + // Token: 0x040046A6 RID: 18086 + private static readonly Texture2D EmptyBarTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.03f, 0.035f, 0.05f)); + + // Token: 0x040046A7 RID: 18087 + private static readonly Texture2D PsyfocusTargetTex = SolidColorMaterials.NewSolidColorTexture(new Color(0.74f, 0.97f, 0.8f)); + } +} diff --git a/psycastDontNeedPsyfocus/HarmonyPatch.cs b/psycastDontNeedPsyfocus/HarmonyPatch.cs index a109427..ac15c1a 100644 --- a/psycastDontNeedPsyfocus/HarmonyPatch.cs +++ b/psycastDontNeedPsyfocus/HarmonyPatch.cs @@ -11,32 +11,64 @@ namespace psycastDontNeedPsyfocus static HarmonyPatches() { var harmony = new Harmony("com.a4plane.psycastDontNeedPsyfocus"); - harmony.PatchAll(Assembly.GetExecutingAssembly()); + //harmony.PatchAll(Assembly.GetExecutingAssembly()); + + var VPEMod = AccessTools.TypeByName("VanillaPsycastsExpanded.AbilityExtension"); + if (VPEMod != null) + { + Log.Message("find VPE"); + var method = AccessTools.Method(VPEMod, "GetPsyfocusUsedByPawn"); + if (method != null) + { + harmony.Patch(method, postfix: new HarmonyMethod(typeof(HarmonyPatches), nameof(Postfix_VPE))); + } + } + else + { + Log.Message("Cant find vpe"); + } + + var Vmethod = typeof(AbilityDef).GetProperty(nameof(AbilityDef.PsyfocusCost)).GetGetMethod(); + harmony.Patch(Vmethod, postfix: new HarmonyMethod(typeof(HarmonyPatch), nameof(Postfix_V))); + if (Vmethod != null) + { + Log.Message("find v method"); + } + } + + public static void Postfix_VPE(ref float __result) + { + Log.Message("qweqwwqe"); + __result = 0; + } + + public static void Postfix_V(ref float __result) + { + Log.Message("eweqw"); + __result = 0; } } - //def에서 초집중 값 읽어오는 부분 패치해서 됨 //todo ui에서 초집중 요소 날리기 - [HarmonyPatch] - class Patcher - { - public static MethodBase TargetMethod() - { - return typeof(AbilityDef).GetProperty(nameof(AbilityDef.PsyfocusCost)).GetGetMethod(); - } - - public static void Postfix(ref float __result) - { - //Log.Message("qewqwe"); - __result = 0f; - } - //public static class ValidateTarget_ValidateTarget_Patch - //{ - // static void postfix(ref bool __result/*,ref Ability ability*/) - // { - // Log.Message("aaa"); - // __result = true; - // } - //} - } + //[HarmonyPatch] + //class Patcher + //{ + // public static MethodBase TargetMethod() + // { + // return typeof(AbilityDef).GetProperty(nameof(AbilityDef.PsyfocusCost)).GetGetMethod(); + // } + // public static void Postfix(ref float __result) + // { + // //Log.Message("qewqwe"); + // __result = 0f; + // } + // //public static class ValidateTarget_ValidateTarget_Patch + // //{ + // // static void postfix(ref bool __result/*,ref Ability ability*/) + // // { + // // Log.Message("aaa"); + // // __result = true; + // // } + // //} + //} }