From e52d10e49a9f8e8e7a9981d32a2271a2d34b8d5e Mon Sep 17 00:00:00 2001 From: Tobias Berger Date: Thu, 4 Apr 2024 23:05:34 +0200 Subject: [PATCH] feat: improve template some more --- .vscode/mod.csproj | 2 +- .vscode/settings.json | 68 +++++++---- .vscode/setup.sh | 3 +- .vscode/tasks.json | 183 +++++++++++++--------------- 1.4/Assemblies/Template.dll | Bin 4608 -> 7168 bytes 1.4/Languages/English/Data.xml | 4 +- README.md | 19 --- Source/Mod.cs | 92 ++++++++++++++ Source/Settings/SettingsWindow.cs | 30 +++++ Source/Settings/TemplateSettings.cs | 44 +++++++ Source/Startup.cs | 14 --- Source/TemplateDefOf.cs | 2 +- Source/TemplateMapComponent.cs | 4 +- flake.nix | 1 - 14 files changed, 301 insertions(+), 165 deletions(-) delete mode 100644 README.md create mode 100644 Source/Mod.cs create mode 100644 Source/Settings/SettingsWindow.cs create mode 100644 Source/Settings/TemplateSettings.cs delete mode 100644 Source/Startup.cs diff --git a/.vscode/mod.csproj b/.vscode/mod.csproj index fff177f..8aca5ea 100644 --- a/.vscode/mod.csproj +++ b/.vscode/mod.csproj @@ -57,7 +57,7 @@ - YJ*Cm(u}bRshF```nj*U)o2Ebya21LBUm z|FnZ%X@6_mYwFlr+wyacpQ?Lq*|Vytf>o=zL2A}cc?-3aQ%jAW$fc@o(ax-2AHOFu zJvByDyrR+d*Z%AK&DnlT+f!?`EYT)#*s*3y3DQv9F|MtMP3Cbsk01ElbUOc7YbA$; z1<(~DsV3dxtS}fmOcZcnZqr^lK=iTO$bKevis-Byba1eXcVJYwgcHfB(c4X?nkkEv~&kiyzjGNuXR6x z=%^i=^xwV+lSbd6h_ByFVvVb%2)WVskcTmKE!_!=Y3x@#onYG=vKoCVazfM7N$|Y8 zp!ha6UrWRJczPp%ix9?LY*vPWa=)W6@PRKi<$1b^AbX6^z~>B=`%h? zn(1~H_2@i1RCs=~Z#yQv6XW{+#XAL?8!ut^y_*Fsa-*99 z4O?w&YeUu~-ft{4;ctT=Nu89&CdAS8hTT2rz-bJfy|f1Q(mOzFpTlAevpc;L#ExV* z1RW1S*BtUWpOxKRtmLK{-3`zXGkw7NGM>$0fibhs?CaBXV^bQw?17LrWOX_c#re{` z(C!}S)~5Du(7j)4g%WWvHRGhFcc-y~dqiz>Qw?<_ig=`k=%zC~E&7jhZ}yFQORBZU zIP16Y`aguXk9jnl`_!cR%&pL&m+nixf&0`VSJ)H_^pXIU8yq&lkJfa`zVQN^8g6b66so2(-jeOWZzk+e!Krx#H)lEC8 zGuEYclBaJ3Y&W`9g3i&MY7;FQJ-~a7?SOZiJJrd?3+6dGn&MSl+59Y`sA#H1?N*BB zT2uzqQj22Ql@`SjcuJ@*(W2T9*&noId$DS58=*bj_VL(3rBl05SKIE7Jpd{p)DL*OMz$7^U^JB-GRNnDGu| z%MtYjP#yHeh#CjgNl!%7gP^+TT15S!{thMRxrq8My+eGS6@3%OQPF1vqA&vgA*#Eg zJSR?sGhd^B0Mw~hbgo0E$w8o?`L0;IJ#43E4FwN)&$j@^X*XaO^$R>Ga7f^Uz>@;c z3bX)CS_Zs>o)g>=_yhX8*j@A!WWYB156YOk=rZ_wNvVIQ0ZOPpG4BW5s>W!GiWv{m z59s~aNqU@m=nU;vd3BEd2>R!#Ulq*~4XN+aJe^c;>q}y78(Hd*agNTaIpZQZiha0B z*UTpXUl#bP&iJ#&ReD%8%x7p>eW1Sp_yz3WvPwYbVda@$#YuWkf0-UvZ_&5t8Q^cw zo3h7m$|_z`yo)cXtJtBJ-~;byir%MP)JNabGN@DwDuXk33GgoZGGH&g2)KuS3^+hP z1^fkC3(XPQ4EUh%bATiCOO)3}Q2+8;LGVI^7wD{ZSva4MAnSad3e?b^7tZsd`8+tk zuYC*k?YQ=y!1ocOyhe&G8!8EYO7LFAI=$e0M=Jatn=%Lj-qzbkTLVI zx(cC&N}>y2holqd&1gUYoRwAufwXM3cS#D4MBi%c=ITJSC%72aBS z!&l5*(eT~q&(Q0L!RxT=@c5&aKbNzE^Zj(%E(ET(kM5sziwhO|0m@U^4rV}2+JQA{ z1s086sJp%`Xw@&cUd5TE+_E3o)y#-nslb5a*8I#7yJmY%f$oRlfS=qC%+JgWTZMVx z0^Pz#)@onNloM`5I5(-AvhYTR?H5$9CR36{rdWv6Ci zAs(AW1X%I7Rkdlz_wDLzWm$+-x^&vAEQsZmDBx~Z$4cSBMDdurWP2l)ZzHxIU~^@Z z_pF-FYoxL2tX(YH#i0OqoY@6%M%-%Mso0(b5h|-hEu~Yu!WKoN_UuBrY|U0y@s2N4 zDmQYPtH?XSYQ?ly! zJkeV*GHsV~R>=;Qrx9&`g&&4Ml&9^AbwRLI@}_4~9`>matPE@}8uRfx*@~b!f-PIM zvuC2fA=BxM<<+>)TjjD{3~#>8V-RliF}ExSbIB{4``$&U^(jvmhVl0G)L)XY(C=_r!XDSkva9LxX=X$M^ z0W`zq2vEAH%8WWzx#prK6#SN_;rYh74bM%^_7)vjk4^<*$+f|6?it2O37L`o^l#W* zpPC88o8+%VtXan-QY`|3nQ0N2q=h%nd5bY^L$^guI*6q2mIC-(w1;qTmVKw?*Q!EF zXPhF=rcbSm3=gX>+uFoO-KOO;D4*_9lny>BNv&W7G%g2}oEr8ZpcAvd%$?+MRQttR z6UTfrBMaV9+bPclt-X&(w>~q0;_MV0n04T|^N2lx+S!T}wx9RGt=YAJ3VaIDhbgmY zk1aBVIv-}zX~$j)6L1xM<5DEv7vNuc%Ck$(1)-N|-d^U~+{`g*4jMtZEW6$^Ki9V8 z3C{qkgmzEU0@d*6;8&&;orcsSAG8ZjiXNpbT|`fv(~wl~vmmuW z=PKN~b&N4MpG1^5dsA>z?oWmxiXr{gQW1I-ldF2GU+*eu4BL~eufF=8e#pEQX5~0|(5_&93pPT(e~$C+ z&BO96R=!JCee)iqqFqSQUU;FfO;24Pe%k);YvV8fap9jIy7pTe$w(>Hrb8G5l1MPw zA?U#vX&oIMc*#p#WZ03o$o%A38>wXDa-#8=Addr&r6}2WLf};y^)bPp(o8XxJZG56 z#+TQUp*oU{7l3NGC}2Ph3o%>M+)*#01<}w+6g*Xsn%>=t@|L2~GT&;CF?! zUCK~hJ=D=dnh{q$_`H*7yxG~Mbk%i7vI<5=qVd-TVG(VwKJuB1HyG-znWpSem(x0~2FMw#Hz-qXXB!WEx>n&`J>ph!=p5ym4_xTuiR^D|F9j z!>~3b-$96a_|-G7Z93yw_2X`B>_Wko0-vAr+$CQ@kMFfa6N>K493RWKZVmTFkB?u( z_niA+qGMxAH0t=c&dJ>=$zxJ2Nea5_F?F+C60K9T22XsOuS`N@GyV8JgilNd6lEh~ zPj=uyY4E_l?Eb;Q*}((-2TKL3SePBm7PCcrUorcM{R4#oJ3Bat?@9780k396I~D!v zJipiFwe>@lin}z4XS!3zEibRNPt@jcVZ~jG)sEpqF2VtVu;=t$XAhC=aOxt`9j^ z@31nnoapPu1sGNEDS%d3!EUvLw>aozTYvjel@J4b<7)?h1XYTk4Lrv(R%C%f#-ZI@ zv6y#A#x&;`l^R=+x$8Ih_F-eQI9aN-(i@*NY&(l;-H#vl?B5~zQpFJoYjq92RaSX; z^Bfseael6FOCukVzVNRsqj;5dtdFBq##4j8S*P$DmN`yDe2yT`(Oe%>VKhE!t}u>M zu)$ANekum5y!`MuUcpN7MeK$#H%H{gcB9&qd4@Yw%P?SBBqqfc7^ delta 1850 zcmZ8hZERCj7=F&ZUD-P9x^8U4F)2)N3?2LEwpRI&l@C$MU>yt*m9F=0RNCF9_YSPe zIwT=#gs|KY5+D#VNeuBHKSX09#Dw?*4aS6+7$S&2@FN5hVxke_bI#@xJnebT^E~f+ z&OIOZ-0{fx<451AIr{puM=)LPVPU9TYXxRcoIdGk2Ije!YnQtPQCH?;N{Dr~dqOM~ ze)o##@!p|vwaoQvD~c6>ulW_NNw!+;;Tk|Js?ksF7l5bv>1kj8ztkR%>Qc7k*(cW& zkOMB%^rlKl?&jChtR4$e)HYQSo2m)QZJGl#_{Kc!{3f64lX^;4TeYOka4&ck6%CHw zI0jr}`2V5}3lvoXJF+A+834S9iwBw)7ZvWuFIoi}I5jUmMIHS! z!Xnlv{1%emQHN<$up49~UE|PpX_f3gs3y>!V01+Q;QI?6#+yL(>uwh)C8v`mE5TS4v7av zN=TYo50-I-)LA85ErBM{vHzQ^6(2SCEKBm+}-EGaHIy(~!QJq)n3f|Mb zay@h=v@+b_AyyK-Jlz}I#U;c5+7w0=u2#4~;g+ImUR0PQdQl+G!2!i56s8q^f(59@ zS@IAr<0E}BzM<2MTZn04{Ejg_ia&8cTZNx-N$bHAj9nEiD2I&}RN*aRJx&rE@d0ru z?h=a~_?yi$C}V1jFI5X(P=N$7hL_MMVm#+Qky1Q0%~Kc<2bFVBIR}x#n3z<~q;e+d zoD*MQ5BuK4LTnVbIgvi$8Ru4Uucixc2$r$RtMOln!{^>AuUc_z>RL#9dE7EaGv-QU z?Ua?zqzBQL&JK_nSeG6#5I1c*Ic#E^nYT^!o7voj&mZ|v%$@f83psO*In+C(LYbsv zy2mS4cJ?QShfQPZ!egT~jA7Gxb))GxW|mzwR4lPOna_bkIO$Z(8nK=HXv(qjy(6^p&Zv7nFyH+lu)T59 zXeN^!%$VykNq%tR=~Ujbts$o+W*O${kz}S|r`C>VU?2pC7d(p`GDs>OBD2U1`Z8`~lqZs+viTdL%J5gJ9Zp3_Sg9r;5m{Rf_q5T$yN?|lhbWu?@9MWY@})8JO!8#K${5&mE{Xlgvu;Aja% zWx=m`{l1Wgtg;Y{`%6E5W9PQH;hXR3-i8v*%YP|*#^snLa?FMje(gl5P#;U+F?kdF zwVHvvyR+t0Q#4{G!) - \ No newline at end of file + + Template Mod + \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index a82555f..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# RimWorld Mod Template - -This template is created for creating RimWorld mods in [VSCodium/Visual Studio Code](https://vscodium.com/) - -## Setup - -1. Ensure the extension `ms-dotnettools.csharp` (a.k.a. [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp)) is installed -1. Run the task `link mod directory`. - - This should symlink the mod directory to RimWorld's mod folder. - - The script won't work if you have installed RimWorld anywhere else than the default steam install. -1. Run the task `build mod` to compile assemblies and About.xml -1. Run the task `run game` to launch the game - - The script won't work if you have installed RimWorld anywhere else than the default steam install. - -## Additional notes - -- All attributes for `About.xml` are kept in `.vscode/mod.csproj`, `About.xml` will get overriden each build. -- You can run `nix fmt` to format all code in the repository. -- While this template is designed for VSCodium, it works just as well with any other editor, simply launch the scripts manually diff --git a/Source/Mod.cs b/Source/Mod.cs new file mode 100644 index 0000000..2e93d94 --- /dev/null +++ b/Source/Mod.cs @@ -0,0 +1,92 @@ +using System.Reflection; +// using HarmonyLib; +using Verse; + +namespace Template; + +using Settings; +using UnityEngine; + +public class TemplateMod : Mod +{ + internal static string Translate(string key) + { + const string TranslationKey = nameof(TemplateMod); + return (TranslationKey + "." + key).Translate(); + } + + public TemplateMod(ModContentPack content) + : base(content) + { +#if DEBUG + const string build = "Debug"; +#else + const string build = "Release"; +#endif + Log.Message( + $"Running Version {Assembly.GetAssembly(typeof(TemplateMod)).GetName().Version} " + + build + ); + + Log.Message(content.ModMetaData.packageIdLowerCase); + + // Harmony harmony = new(content.ModMetaData.packageIdLowerCase); + } + +#nullable disable // Set in constructor. + + public static TemplateSettings Settings { get; private set; } + +#nullable enable + + public void ResetSettings() + { + Settings = new(); + } + + public override void DoSettingsWindowContents(Rect inRect) => + SettingsWindow.DoSettingsWindowContents(inRect); + + public override string SettingsCategory() => SettingsWindow.SettingsCategory(); + + public static class Log + { + const string LogPrefix = "Toby's Template Mod - "; + + public static void DebugError(string message) + { +#if DEBUG + Error(message); +#endif + } + + public static void Error(string message) + { + Verse.Log.Error(LogPrefix + message); + } + + public static void DebugWarn(string message) + { +#if DEBUG + Warn(message); +#endif + } + + public static void Warn(string message) + { + Verse.Log.Warning(LogPrefix + message); + } + + public static void DebugLog(string message) + { +#if DEBUG + Message(message); +#endif + } + + public static void Message(string message) + { + Verse.Log.Message(LogPrefix + message); + } + } +} diff --git a/Source/Settings/SettingsWindow.cs b/Source/Settings/SettingsWindow.cs new file mode 100644 index 0000000..23a0a35 --- /dev/null +++ b/Source/Settings/SettingsWindow.cs @@ -0,0 +1,30 @@ +using UnityEngine; +using Verse; + +namespace Template.Settings; + +public static class SettingsWindow +{ + private static Vector2 settingsScrollPosition = new(); + + private static float settingsHeight; + + private static TemplateSettings Settings => TemplateMod.Settings; + + public static void DoSettingsWindowContents(Rect inRect) + { + Listing_Standard listing = new(); + Rect viewRect = new(inRect.x, inRect.y, inRect.width - 16f, settingsHeight); + Widgets.BeginScrollView(inRect, ref settingsScrollPosition, viewRect); + listing.Begin(new Rect(viewRect.x, viewRect.y, viewRect.width, float.PositiveInfinity)); + + listing.End(); + settingsHeight = listing.CurHeight; + Widgets.EndScrollView(); + } + + public static string SettingsCategory() + { + return TemplateMod.Translate("SettingsCategory"); + } +} diff --git a/Source/Settings/TemplateSettings.cs b/Source/Settings/TemplateSettings.cs new file mode 100644 index 0000000..edcaad1 --- /dev/null +++ b/Source/Settings/TemplateSettings.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using Verse; + +namespace Template.Settings; + +public class TemplateSettings : ModSettings +{ + #region Scribe Helpers + private static void LookField(ref T value, string label, T defaultValue) + where T : struct + { + Scribe_Values.Look(ref value, label, defaultValue); + } + + private static void LookHashSet( + ref HashSet valueHashSet, + string label, + HashSet defaultValues + ) + where T : notnull + { + if (Scribe.mode == LoadSaveMode.Saving && valueHashSet is null) + { + TemplateMod.Log.Warn( + label + " is null before saving. Reinitializing with default values." + ); + valueHashSet = defaultValues; + } + Scribe_Collections.Look(ref valueHashSet, label, lookMode: LookMode.Value); + if (Scribe.mode == LoadSaveMode.LoadingVars && valueHashSet is null) + { + TemplateMod.Log.Warn( + label + " is null after loading. Reinitializing with default values." + ); + valueHashSet = defaultValues; + } + } + #endregion + + public override void ExposeData() + { + base.ExposeData(); + } +} diff --git a/Source/Startup.cs b/Source/Startup.cs deleted file mode 100644 index 6173f34..0000000 --- a/Source/Startup.cs +++ /dev/null @@ -1,14 +0,0 @@ -using Verse; - -// using HarmonyLib; - -namespace Template; - -[StaticConstructorOnStartup] -public static class Startup -{ - static Startup() - { - Log.Message("Mod template loaded successfully!"); - } -} diff --git a/Source/TemplateDefOf.cs b/Source/TemplateDefOf.cs index a4f2cf2..0611801 100644 --- a/Source/TemplateDefOf.cs +++ b/Source/TemplateDefOf.cs @@ -6,7 +6,7 @@ using Verse; namespace Template; [DefOf] -public static class TemplateDefOf +public static class StinkyTweaksDefOf { public static LetterDef success_letter; } diff --git a/Source/TemplateMapComponent.cs b/Source/TemplateMapComponent.cs index f559e08..b8af6c6 100644 --- a/Source/TemplateMapComponent.cs +++ b/Source/TemplateMapComponent.cs @@ -12,8 +12,8 @@ public class TemplateMapComponent(Map map) : MapComponent(map) Messages.Message("Success", null, MessageTypeDefOf.PositiveEvent); Find.LetterStack.ReceiveLetter( "Success", - TemplateDefOf.success_letter.description, - TemplateDefOf.success_letter, + StinkyTweaksDefOf.success_letter.description, + StinkyTweaksDefOf.success_letter, null ); } diff --git a/flake.nix b/flake.nix index b5304c8..e56e5a4 100644 --- a/flake.nix +++ b/flake.nix @@ -28,7 +28,6 @@ programs = { nixpkgs-fmt.enable = true; csharpier.enable = true; - prettier.enable = true; }; }; };