From e4b3b5b8db2be246ad603e35f49adc766ac1f72c Mon Sep 17 00:00:00 2001 From: d1rknwh1te3 Date: Mon, 6 Nov 2023 01:49:29 +0300 Subject: [PATCH 1/2] Update to 1.4 - hardcoded RPC status strings have been removed - hardcoded lines were rewritten and entered into an XML file - a little code refactoring --- dist/1.3/Assemblies/RimRPC.dll | Bin 14336 -> 14848 bytes dist/1.4/Assemblies/RimRPC.dll | Bin 0 -> 14848 bytes dist/About/About.xml | 30 ++-- dist/About/LoadFolders.xml | 25 ++-- dist/Languages/English/Keyed/RimRPC.xml | 9 ++ dist/Languages/Russian/Keyed/RimRPC.xml | 26 ++++ src/DiscordRPC.cs | 78 ++++------ src/MapCompHandler.cs | 10 +- src/MapCompInjector.cs | 15 +- src/ModSettings.cs | 121 +++++++++------- src/RimRPC.cs | 39 ++--- src/RimRPC.csproj | 2 +- src/StateHandler.cs | 181 +++++++++++++----------- 13 files changed, 291 insertions(+), 245 deletions(-) create mode 100644 dist/1.4/Assemblies/RimRPC.dll create mode 100644 dist/Languages/Russian/Keyed/RimRPC.xml diff --git a/dist/1.3/Assemblies/RimRPC.dll b/dist/1.3/Assemblies/RimRPC.dll index 7d51a875b548ac5c1cb4d0f18b46a58abd9e0280..502546b697f7c16df9f0c0cde5ee35d7afb87f8c 100644 GIT binary patch delta 6868 zcma)A3v?9cb-w>UyR*Bq(n>1{34sKw7g{|*ATUqMvUsURSXh8fV=C{F7A#lV6{D3w zmc%S3evsl5lnMCwgcuwL69+q`B~Ig*y0wEjxOG}9hcw|FI|0`zb`#_JIBrcIPQUx_ zYPEpsW{z~{zVH3-f9K9W8}ELHKW~l{d0g>A1?5}90)@3RAfOmT%1B&sE1lq&8|(^4i^alG z=1QeEn#m}a#;9J8qUCUnf>>Nl+y_bZt!5Vtf)!l9Ijr=JflAyev}llTLDXNb2>Jn| zRbcF9qbPPp?N07Iot{D+Rc*~j*pbDa%;SvK08>7dkt%v#DXRj+o1$nKLz*WhqEBhV z+j67Lh0n3E93#AQHyVBNIYy2V-rE~(X3At~rc91^{{|b&T#+)mldBSx#!Bwd2shdFM%XvvJ>#d4FKHf}(#eDmZo=z*sLdQ^No}LTrTJpY$#G%b zu;gKG#)4=awmaFEKTYXRRUz;H8I&cdphBB+Z>&U%4s+WlgQ_RMteDVOEy=4w57r~8 z+S1@$+$!oEbMk7OL5w`3HcPRh4Zzh@sphI}<%$vc@f2Zx8s;i^99RJC&6_Z&f{o1E zc`ulGdBKGsj5o1yGQl6?=oo;;0CWwnp6ANTi!KH_$9#!JOMnJ*@suUD$U$?lMd*Hi z4t+L_XJ8KL!-ZU#&ve}MfeL%vRa`ZlQ9PG=a48(bP#`&qaq3`gOj6dyP}2wM>;iYO zjVL`)T zR)CzG8l#xM2?385J;*6m>(x)1O{@mzhWQe(EDBw2fY!R}J?Lx;Ob0*)xn%t45lSLr;x~I z+XKlM!PNlSlz4=A64c(5!1)QUg^S~Gu^Zczuu*S~NoO~@;0aXQz%G_MhLyieX}-ki zCIU$d4dVDLe-09euDLz|o|8-Vp+5GHi~{Rg%S2i{6>ICH`9n?%eUeOToFi1gomyjh zS`y__W%%$Kl}X!cmAQ(0)E1E-d#QI}wx;vT6p?~!;otPwmUl+y>@-d$6jW^W7^`*i zek3;h9_$Fp;J@L4uA4Pg4~zy7XmPoH*}GU2+kuQ3&ggnXwVN`QYqB=q9?mG*s2T!# z`echI8ba~dLBewl@)|8qkt>))iIURRYqGX4Wz_l56nY$E!ckqVMV)q0X6=e>OscZo zL?gJL$Fp445i@%t+Xo0&J07WS?04Cw4*D({A2Wf<)@*7;uhJRNdGzj^wEn79+iyuihLu-qT}8%DhP>lB%nq#6{3Wh>Q%ikh3GmXLvC{tjfg z1#VW5QIbu+L6|KxJ4wBcrHUfq^|_L;#><@qOSwY)7t?xeIwvp{Vu>KG!D7c z!*G>rIpAUiV=9&ZFqr?K!aq^?ABZ_^P6^nAgmhY{_{|DhbJXp;;FW!-R8J#QogQ)l z>bptG&2gXWZa~Y;utd9CE~3qJ4^}Lw8z&qbjp$II)7i(>PEt`9VWoQKdb z&nBrReW#p8FDU8|t@SdMUZ-hvI-xne(9N>{N!oo!9tPzICQ@q_|0SkTW0E?kvF4+S z8l!JIt)n2%B+32SQS9nsem`OrH+c@r0y?LtL$pIX1}Z%~4hy(6wP`IhL7f!~u$?$n zD%n}|)d@LCmCI8SAL~lSo84kzNF+!$d{N@vgi9kf{0FJFQ&DWFDxV6dDz9X0r&f@% zQ#q&XaBNpTRX}xyOGH>8v&q7tT?skh>ym%zNC-I~-nWWM7~(vxC{8pRKQc^EY=`3} zE>4^6a8y-P!fr*9V!Izpe& zf9*Q|sQ*OP|DWolW};3Er*iro-9x!m*rq4*SVy7!Mr_psE( zQ=(I309LqigkR)Z7^8m!N7?j>=#q29xHu-}idV!}MYAXYe=Vf{?7UrE5_z&)ye~eI z5%G~Y>3l$36(4(ciz?CR-49sj`3hjJ`;ZXwlI!b$$K(T|ReZ~JTzKT|?&qO@&iex3 zZ#^$5+gHUNI_b0?5Pr$-TEzzOh8U+2`MfBU_c?zoO5_*37etkO&hwV2rKgPN#S&SK zVY)6+#=P&68fCKcJ)*^=Cs7t}U z3O=pi4;B3P1Yhn&5&p^UH0pUyoI#xJw2L02%FBYJMt9;TLBd=44}7+lE}HJ) zyNBKueD~6@eXy`X%a@1oTknd8@bvMc?I2l-Hd9v!^97p8f5oC__}mDs$tzz@vomKb z%vnXJ@wxqv)Jp$EC-4&q&Z3)VoV815)?{rO2%D|lG?=)x+nZ)C6CL*0%rE(Sdj?|o zzUhdCBHbagn_BInqRZ1+KN9K-Q)gGSHyRmI_#ORS_RQk%Yiq)>Q$H$xS%`Lf|Lhm+ z%>lo?E08Hx*-r(E?SBdQ?Eefb3-ouj3=YJieYZwqfV3(y*hg@%VKCHf0`0U{m)s^g z?Xi-TvsXpBH}>>}2V$YVenKK=LvhfHd|KLk0fYf8WA?(bR~9c1FC zrHgzW;aDQz>Yi|Kx9u(Knzz&J?*f~bH$ZLC?i7v%q;McB!`niGy|E7at7VlA$X42? z%jP1tUzI)R@9Yi@4Nyxo(iMu)>ZsXg-(Maq>gW%5#X_-gN4U!j$EYn7>$*3I|C#-R z^3GY?!?Dhm=wKwqYi{8ZqRc6VJ-4E=WL?PI9&YUmZ4Yk@?}|}JU#PctlH_&oswlQ5 z%D6GwuhiJ_rdZed=uT=!p@!N*yJ$^xW3(;Q6KM-a20PoM1F>yAyEyL3&=7HjZr{dO zG{SH)>TThnw4hAg5$^9DB2&R++IGR5`KO+rlP~;PtI*jY>Z5+@r7%&IeY7&qzF0Xe z+h2{YOOu`Q2HzF-AFD2A7v4eb)Iy#3-Uwm#Mozt7y;4|$yaN;iC&qrVx&fK$fnR)O zXARRl8l?aYW3Z3nCxrk7fio|`slwNEfJUG}ndy8go`}{#_fnKhc-;cuAz<*EJ0YE& z#&oiC(%`ZmDROV=HH*IEAM{B4)*^R-{| zY5~IeOo*KL-`iGQ{mrlYK>7Uf*Y$u9{`ejbNf7w+c>+%1%a*>33_YOvd_FgB(&x*- zt3M|`j)ZdJKe4aW72bTwAOEEvzaqvT%ZXp|6$9`;{DI?Rx47p8oJ#&dPJAr&=Rh7l z``3;}i dfko#|`R0GDc_6@#$FytSDgUAm#n?R8{{jekVXOcE delta 6381 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 literal 0 HcmV?d00001 diff --git a/dist/About/About.xml b/dist/About/About.xml index abc0a8d..01aebe9 100644 --- a/dist/About/About.xml +++ b/dist/About/About.xml @@ -1,15 +1,19 @@ + - RimRPC - RichPresence - Weilbyte - -
  • 1.0
  • -
  • 1.1
  • -
  • 1.2
  • -
  • 1.3
  • -
    - Discord Rich Presence for RimWorld! - 1.2 support is here! - - weilbyte.rimrpc -
    + RimRPC - RichPresence + Weilbyte + +
  • 1.0
  • +
  • 1.1
  • +
  • 1.2
  • +
  • 1.3
  • +
  • 1.4
  • +
    + + Discord Rich Presence for RimWorld! + 1.4 support is here! + + https://github.com/Weilbyte/RWRichPresence + weilbyte.rimrpc + \ No newline at end of file diff --git a/dist/About/LoadFolders.xml b/dist/About/LoadFolders.xml index d745f7a..1cac042 100644 --- a/dist/About/LoadFolders.xml +++ b/dist/About/LoadFolders.xml @@ -1,11 +1,14 @@ - - -
  • 1.1
  • -
    - -
  • 1.2
  • -
    - -
  • 1.3
  • -
    -
    \ No newline at end of file + + +
  • 1.1
  • +
    + +
  • 1.2
  • +
    + +
  • 1.3
  • +
    + +
  • 1.4
  • +
    +
    \ No newline at end of file diff --git a/dist/Languages/English/Keyed/RimRPC.xml b/dist/Languages/English/Keyed/RimRPC.xml index cabd562..a5a8b34 100644 --- a/dist/Languages/English/Keyed/RimRPC.xml +++ b/dist/Languages/English/Keyed/RimRPC.xml @@ -10,8 +10,17 @@ Hour of current day Game session length (Requires restart) Manually update presence + Custom text (Top) Custom text (Bottom) Text Text + + Main Menu + Day + Colonists + h + Year + y + Playing! diff --git a/dist/Languages/Russian/Keyed/RimRPC.xml b/dist/Languages/Russian/Keyed/RimRPC.xml new file mode 100644 index 0000000..ef543c1 --- /dev/null +++ b/dist/Languages/Russian/Keyed/RimRPC.xml @@ -0,0 +1,26 @@ + + + RimRPC + Название колонии + Количество колонистов + Текущий год + Сокращенный текст года + Текущий квадрум + Текущий день + Час текущего дня + Длина игровой сессии (Требуется рестарт) + Принудительное обновление RPC + + Произвольный текст (Вверх) + Произвольный текст (Низ) + Текст + Текст + + В главном меню + День + колонистов + ч + Год + г + Играю! + diff --git a/src/DiscordRPC.cs b/src/DiscordRPC.cs index de2d6b0..7127352 100644 --- a/src/DiscordRPC.cs +++ b/src/DiscordRPC.cs @@ -5,7 +5,6 @@ namespace RimRPC { internal class DiscordRPC { - //DLL Imports here. Make sure the discord-rpc.dll is in the game's mono folder or else the game will crash. [UnmanagedFunctionPointer(CallingConvention.Cdecl)] public delegate void ReadyCallback(); @@ -22,65 +21,44 @@ internal class DiscordRPC public delegate void SpectateCallback(string secret); [UnmanagedFunctionPointer(CallingConvention.Cdecl)] - public delegate void RequestCallback(DiscordRPC.JoinRequest request); + public delegate void RequestCallback(JoinRequest request); public struct EventHandlers { - public DiscordRPC.ReadyCallback readyCallback; - - public DiscordRPC.DisconnectedCallback disconnectedCallback; - - public DiscordRPC.ErrorCallback errorCallback; - - public DiscordRPC.JoinCallback joinCallback; - - public DiscordRPC.SpectateCallback spectateCallback; - - public DiscordRPC.RequestCallback requestCallback; + public ReadyCallback ReadyCallback; + public DisconnectedCallback DisconnectedCallback; + public ErrorCallback ErrorCallback; + public JoinCallback JoinCallback; + public SpectateCallback SpectateCallback; + public RequestCallback RequestCallback; } [Serializable] public struct RichPresence { - public string state; - - public string details; - - public long startTimestamp; - - public long endTimestamp; - - public string largeImageKey; - - public string largeImageText; - - public string smallImageKey; - - public string smallImageText; - - public string partyId; - - public int partySize; - - public int partyMax; - - public string matchSecret; - - public string joinSecret; - - public string spectateSecret; - - public bool instance; + public string State; + public string Details; + public long StartTimestamp; + public long EndTimestamp; + public string LargeImageKey; + public string LargeImageText; + public string SmallImageKey; + public string SmallImageText; + public string PartyId; + public int PartySize; + public int PartyMax; + public string MatchSecret; + public string JoinSecret; + public string SpectateSecret; + public bool Instance; } [Serializable] public struct JoinRequest { - public string userId; - - public string username; - - public string avatar; + public string UserId; + public string Username; + public string Avatar; } public enum Reply @@ -91,7 +69,7 @@ public enum Reply } [DllImport("0discord-rpc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Discord_Initialize")] - public static extern void Initialize(string applicationId, ref DiscordRPC.EventHandlers handlers, bool autoRegister, string optionalSteamId); + public static extern void Initialize(string applicationId, ref EventHandlers handlers, bool autoRegister, string optionalSteamId); [DllImport("0discord-rpc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Discord_Shutdown")] public static extern void Shutdown(); @@ -100,9 +78,9 @@ public enum Reply public static extern void RunCallbacks(); [DllImport("0discord-rpc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Discord_UpdatePresence")] - public static extern void UpdatePresence(ref DiscordRPC.RichPresence presence); + public static extern void UpdatePresence(ref RichPresence presence); [DllImport("0discord-rpc", CallingConvention = CallingConvention.Cdecl, EntryPoint = "Discord_Respond")] - public static extern void Respond(string userId, DiscordRPC.Reply reply); + public static extern void Respond(string userId, Reply reply); } } \ No newline at end of file diff --git a/src/MapCompHandler.cs b/src/MapCompHandler.cs index 09ec352..0873fb2 100644 --- a/src/MapCompHandler.cs +++ b/src/MapCompHandler.cs @@ -4,7 +4,7 @@ namespace RimRPC { internal class MapCompHandler : MapComponent { - private int cooldown = 0; + private int _cooldown; public MapCompHandler(Map map) : base(map) { @@ -13,12 +13,14 @@ public MapCompHandler(Map map) : base(map) public override void MapComponentTick() { - cooldown = cooldown + 1; - if (cooldown > 1250) //Update is called every 1250 ticks (Twice an in-game hour, or every 20.5 seconds real-time) + _cooldown++; + + if (_cooldown > 1250) //Update is called every 1250 ticks (Twice an in-game hour, or every 20.5 seconds real-time) { StateHandler.PushState(map); - cooldown = 0; + _cooldown = 0; } + base.MapComponentTick(); } } diff --git a/src/MapCompInjector.cs b/src/MapCompInjector.cs index 72a7245..f981d4e 100644 --- a/src/MapCompInjector.cs +++ b/src/MapCompInjector.cs @@ -9,19 +9,14 @@ internal class MapCompInjector : MonoBehaviour public void FixedUpdate() { if (Current.ProgramState != ProgramState.Playing) - { return; - } - else - { - foreach (var map in Find.Maps.Where(m => m.GetComponent() == null)) - { - map.components.Add(new MapCompHandler(map)); - Log.Message("RichPresence :: Injected handler to existing map!"); - } - Destroy(this); + foreach (var map in Find.Maps.Where(m => m.GetComponent() == null)) + { + map.components.Add(new MapCompHandler(map)); } + + Destroy(this); } } } \ No newline at end of file diff --git a/src/ModSettings.cs b/src/ModSettings.cs index 3ee8638..54d69d5 100644 --- a/src/ModSettings.cs +++ b/src/ModSettings.cs @@ -3,86 +3,97 @@ namespace RimRPC { - class RWRPCSettings : ModSettings + class RwrpcSettings : ModSettings { #region variables - public bool RPC_Colony = true; - public bool RPC_ColonistCount = false; - public bool RPC_Year = false; - public bool RPC_YearShort = true; - public bool RPC_Quadrum = true; - public bool RPC_Day = true; - public bool RPC_Hour = true; - public bool RPC_Time = true; - public bool RPC_CustomTop = false; - public bool RPC_CustomBottom = false; - public string RPC_CustomTopText = "OwO"; - public string RPC_CustomBottomText = "*nuzzles u*"; + public bool RpcColony = true; + public bool RpcColonistCount; + public bool RpcYear; + public bool RpcYearShort = true; + public bool RpcQuadrum = true; + public bool RpcDay = true; + public bool RpcHour = true; + public bool RpcTime = true; + public bool RpcCustomTop; + public bool RpcCustomBottom; + public string RpcCustomTopText = "Example"; + public string RpcCustomBottomText = "Example"; #endregion public override void ExposeData() { base.ExposeData(); - Scribe_Values.Look(ref this.RPC_Colony, "RPC_Colony", true); - Scribe_Values.Look(ref this.RPC_ColonistCount, "RPC_ColonistCount", false); - Scribe_Values.Look(ref this.RPC_Year, "RPC_Year", false); - Scribe_Values.Look(ref this.RPC_YearShort, "RPC_YearShort", true); - Scribe_Values.Look(ref this.RPC_Quadrum, "RPC_Quadrum", true); - Scribe_Values.Look(ref this.RPC_Day, "RPC_Day", true); - Scribe_Values.Look(ref this.RPC_Hour, "RPC_Hour", true); - Scribe_Values.Look(ref this.RPC_Time, "RPC_Time", true); - Scribe_Values.Look(ref this.RPC_CustomTop, "RPC_CustomTop", false); - Scribe_Values.Look(ref this.RPC_CustomTop, "RPC_CustomBottom", false); - Scribe_Values.Look(ref this.RPC_CustomTopText, "RPC_CustomTopText", "OwO"); - Scribe_Values.Look(ref this.RPC_CustomTopText, "RPC_CustomBottomText", "*nuzzles u*"); + + Scribe_Values.Look(ref RpcColony, "RPC_Colony", true); + Scribe_Values.Look(ref RpcColonistCount, "RPC_ColonistCount"); + Scribe_Values.Look(ref RpcYear, "RPC_Year"); + Scribe_Values.Look(ref RpcYearShort, "RPC_YearShort", true); + Scribe_Values.Look(ref RpcQuadrum, "RPC_Quadrum", true); + Scribe_Values.Look(ref RpcDay, "RPC_Day", true); + Scribe_Values.Look(ref RpcHour, "RPC_Hour", true); + Scribe_Values.Look(ref RpcTime, "RPC_Time", true); + Scribe_Values.Look(ref RpcCustomTop, "RPC_CustomTop"); + Scribe_Values.Look(ref RpcCustomTop, "RPC_CustomBottom"); + Scribe_Values.Look(ref RpcCustomTopText, "RPC_CustomTopText", "Example"); + Scribe_Values.Look(ref RpcCustomTopText, "RPC_CustomBottomText", "*Example"); } } class RWRPCMod : Mod { - public static RWRPCSettings settings; + public static RwrpcSettings Settings; public RWRPCMod(ModContentPack content) : base(content) { - settings = GetSettings(); + Settings = GetSettings(); } public override string SettingsCategory() => "RPC_CategoryLabel".Translate(); public override void DoSettingsWindowContents(Rect inRect) { - Listing_Standard listing_Standard = new Listing_Standard(); - listing_Standard.Begin(inRect); + Listing_Standard listingStandard = new Listing_Standard(); + listingStandard.Begin(inRect); + //Default settings - listing_Standard.CheckboxLabeled("RPC_ColonyLabel".Translate() + " ", ref settings.RPC_Colony); - listing_Standard.CheckboxLabeled("RPC_ColonistCountLabel".Translate() + " ", ref settings.RPC_ColonistCount); - listing_Standard.CheckboxLabeled("RPC_YearLabel".Translate() + " ", ref settings.RPC_Year); - listing_Standard.CheckboxLabeled("RPC_YearShortLabel".Translate() + " ", ref settings.RPC_YearShort); - listing_Standard.CheckboxLabeled("RPC_QuadrumLabel".Translate() + " ", ref settings.RPC_Quadrum); - listing_Standard.CheckboxLabeled("RPC_DayLabel".Translate() + " ", ref settings.RPC_Day); - listing_Standard.CheckboxLabeled("RPC_HourLabel".Translate() + " ", ref settings.RPC_Hour); - listing_Standard.CheckboxLabeled("RPC_TimeLabel".Translate() + " ", ref settings.RPC_Time); + SetDefaultSettings(listingStandard); + //Custom field settings - listing_Standard.CheckboxLabeled("CustomTopCheckbox".Translate() + " ", ref settings.RPC_CustomTop); - if (RWRPCMod.settings.RPC_CustomTop) - { - settings.RPC_CustomTopText = listing_Standard.TextEntryLabeled("CustomTopLabel".Translate() + " ", settings.RPC_CustomTopText); - } - listing_Standard.CheckboxLabeled("CustomBottomCheckbox".Translate() + " ", ref settings.RPC_CustomBottom); - if (RWRPCMod.settings.RPC_CustomBottom) - { - settings.RPC_CustomBottomText = listing_Standard.TextEntryLabeled("CustomBottomLabel".Translate() + " ", settings.RPC_CustomBottomText); - } - if (listing_Standard.ButtonText("RPC_UpdateLabel".Translate())) + SetCustomFields(listingStandard); + + listingStandard.End(); + Settings.Write(); + } + + private static void SetDefaultSettings(Listing_Standard listingStandard) + { + listingStandard.CheckboxLabeled("RPC_ColonyLabel".Translate() + " ", ref Settings.RpcColony); + listingStandard.CheckboxLabeled("RPC_ColonistCountLabel".Translate() + " ", ref Settings.RpcColonistCount); + listingStandard.CheckboxLabeled("RPC_YearLabel".Translate() + " ", ref Settings.RpcYear); + listingStandard.CheckboxLabeled("RPC_YearShortLabel".Translate() + " ", ref Settings.RpcYearShort); + listingStandard.CheckboxLabeled("RPC_QuadrumLabel".Translate() + " ", ref Settings.RpcQuadrum); + listingStandard.CheckboxLabeled("RPC_DayLabel".Translate() + " ", ref Settings.RpcDay); + listingStandard.CheckboxLabeled("RPC_HourLabel".Translate() + " ", ref Settings.RpcHour); + listingStandard.CheckboxLabeled("RPC_TimeLabel".Translate() + " ", ref Settings.RpcTime); + } + + private static void SetCustomFields(Listing_Standard listingStandard) + { + listingStandard.CheckboxLabeled("CustomTopCheckbox".Translate() + " ", ref Settings.RpcCustomTop); + + if (Settings.RpcCustomTop) + Settings.RpcCustomTopText = listingStandard.TextEntryLabeled("CustomTopLabel".Translate() + " ", Settings.RpcCustomTopText); + + listingStandard.CheckboxLabeled("CustomBottomCheckbox".Translate() + " ", ref Settings.RpcCustomBottom); + + if (Settings.RpcCustomBottom) + Settings.RpcCustomBottomText = listingStandard.TextEntryLabeled("CustomBottomLabel".Translate() + " ", Settings.RpcCustomBottomText); + + + if (listingStandard.ButtonText("RPC_UpdateLabel".Translate())) { - Verse.Log.Message("UPDATED"); - var world = Current.Game != null ? Current.Game.World : null; + var world = Current.Game?.World; if (world != null) - { StateHandler.PushState(Current.Game.CurrentMap); - } - } - listing_Standard.End(); - settings.Write(); } } } diff --git a/src/RimRPC.cs b/src/RimRPC.cs index c443086..e0ba620 100644 --- a/src/RimRPC.cs +++ b/src/RimRPC.cs @@ -2,45 +2,52 @@ using System; using System.Reflection; using Verse; -using UnityEngine; namespace RimRPC { public class Mod : Verse.Mod { - public Mod(ModContentPack content) : base(content) + protected Mod(ModContentPack content) : base(content) { var femboyfoxes = new Harmony("weilbyte.rimworld.rimrpc"); - MethodInfo targetmethod = AccessTools.Method(typeof(Verse.GenScene), "GoToMainMenu"); + + MethodInfo targetmethod = AccessTools.Method(typeof(GenScene), "GoToMainMenu"); HarmonyMethod postfixmethod = new HarmonyMethod(typeof(RimRPC).GetMethod("GoToMainMenu_Postfix")); + femboyfoxes.Patch(targetmethod, null, postfixmethod); + Log.Message("RichPresence :: Patched"); + RimRPC.BootMeUp(); } } public class RimRPC { - internal static DiscordRPC.RichPresence prsnc; + internal static DiscordRPC.RichPresence Presence; internal static string Colony; internal static int onDay; - internal static long started = ((DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / TimeSpan.TicksPerSecond); + internal static long Started = (DateTime.UtcNow.Ticks - new DateTime(1970, 1, 1).Ticks) / TimeSpan.TicksPerSecond; public static void BootMeUp() { - DiscordRPC.EventHandlers eventHandlers = default(DiscordRPC.EventHandlers); - eventHandlers.readyCallback = (DiscordRPC.ReadyCallback)Delegate.Combine(eventHandlers.readyCallback, new DiscordRPC.ReadyCallback(ReadyCallback)); - eventHandlers.disconnectedCallback = (DiscordRPC.DisconnectedCallback)Delegate.Combine(eventHandlers.disconnectedCallback, new DiscordRPC.DisconnectedCallback(DisconnectedCallback)); - eventHandlers.errorCallback = (DiscordRPC.ErrorCallback)Delegate.Combine(eventHandlers.errorCallback, new DiscordRPC.ErrorCallback(ErrorCallback)); - eventHandlers.joinCallback = (DiscordRPC.JoinCallback)Delegate.Combine(eventHandlers.joinCallback, new DiscordRPC.JoinCallback(JoinCallback)); - eventHandlers.spectateCallback = (DiscordRPC.SpectateCallback)Delegate.Combine(eventHandlers.spectateCallback, new DiscordRPC.SpectateCallback(SpectateCallback)); - eventHandlers.requestCallback = (DiscordRPC.RequestCallback)Delegate.Combine(eventHandlers.requestCallback, new DiscordRPC.RequestCallback(RequestCallback)); + DiscordRPC.EventHandlers eventHandlers = default; + + eventHandlers.ReadyCallback = (DiscordRPC.ReadyCallback)Delegate.Combine(eventHandlers.ReadyCallback, new DiscordRPC.ReadyCallback(ReadyCallback)); + eventHandlers.DisconnectedCallback = (DiscordRPC.DisconnectedCallback)Delegate.Combine(eventHandlers.DisconnectedCallback, new DiscordRPC.DisconnectedCallback(DisconnectedCallback)); + eventHandlers.ErrorCallback = (DiscordRPC.ErrorCallback)Delegate.Combine(eventHandlers.ErrorCallback, new DiscordRPC.ErrorCallback(ErrorCallback)); + eventHandlers.JoinCallback = (DiscordRPC.JoinCallback)Delegate.Combine(eventHandlers.JoinCallback, new DiscordRPC.JoinCallback(JoinCallback)); + eventHandlers.SpectateCallback = (DiscordRPC.SpectateCallback)Delegate.Combine(eventHandlers.SpectateCallback, new DiscordRPC.SpectateCallback(SpectateCallback)); + eventHandlers.RequestCallback = (DiscordRPC.RequestCallback)Delegate.Combine(eventHandlers.RequestCallback, new DiscordRPC.RequestCallback(RequestCallback)); + DiscordRPC.Initialize("428272711702282252", ref eventHandlers, true, "0612"); - prsnc = default(DiscordRPC.RichPresence); - prsnc.largeImageKey = "logo"; - prsnc.state = "Main Menu"; - DiscordRPC.UpdatePresence(ref RimRPC.prsnc); + + Presence = default; + Presence.LargeImageKey = "logo"; + Presence.State = "RPC_MainMenu".Translate(); + + DiscordRPC.UpdatePresence(ref Presence); ReadyCallback(); } diff --git a/src/RimRPC.csproj b/src/RimRPC.csproj index c8e982f..2b315cf 100644 --- a/src/RimRPC.csproj +++ b/src/RimRPC.csproj @@ -43,7 +43,7 @@ - 1.3.3056-beta + 1.4.3901 2.0.2 diff --git a/src/StateHandler.cs b/src/StateHandler.cs index 93dd740..5650f7b 100644 --- a/src/StateHandler.cs +++ b/src/StateHandler.cs @@ -1,5 +1,4 @@ using RimWorld; -using System; using System.Linq; using Verse; @@ -7,14 +6,14 @@ namespace RimRPC { public class StateHandler { - internal static string colonyname; - internal static int years; - internal static int days; - internal static int dayhour; - internal static float colonistnumber; - internal static Quadrum quadrum; - - public static string GetColonyName() + private static string _colonyname; + private static int _years; + private static int _days; + private static int _dayhour; + private static float _colonistnumber; + private static Quadrum _quadrum; + + private static string GetColonyName() { return Faction.OfPlayer.Name; } @@ -23,115 +22,127 @@ public static int GetDaysSurvived() { long ticks = Find.TickManager.TicksAbs; int num = (int)(ticks / 60000L); + if (num < 0L) - { ticks--; - } + return num; } public static void MenuState() { - RimRPC.prsnc.details = "Main Menu"; - RimRPC.prsnc.state = null; - RimRPC.prsnc.smallImageKey = null; - RimRPC.prsnc.smallImageText = null; - DiscordRPC.UpdatePresence(ref RimRPC.prsnc); + RimRPC.Presence.Details = "RPC_MainMenu".Translate(); + RimRPC.Presence.State = null; + RimRPC.Presence.SmallImageKey = null; + RimRPC.Presence.SmallImageText = null; + DiscordRPC.UpdatePresence(ref RimRPC.Presence); } - - public static string BuildString(string which) + + private static string BuildString(string which) { + var state = ""; + if (which == "state") + return GetState(state); + + if (which == "details") + return GetDetails(); + + return null; + } + + private static string GetState(string state) + { + if (RWRPCMod.Settings.RpcCustomBottom) + return RWRPCMod.Settings.RpcCustomBottomText; + + if (RWRPCMod.Settings.RpcDay) + state += $"{"RPC_Day".Translate()} {_days}"; + + if (RWRPCMod.Settings.RpcDay && RWRPCMod.Settings.RpcHour) + state += $" ({_dayhour}{"RPC_Hour".Translate()})"; + + if (RWRPCMod.Settings.RpcQuadrum) { - string state = ""; - if (RWRPCMod.settings.RPC_CustomBottom) + if (RWRPCMod.Settings.RpcDay) { - return RWRPCMod.settings.RPC_CustomBottomText; + state += " | "; } - if (RWRPCMod.settings.RPC_Day) - { - state += "Day " + days; - } - if (RWRPCMod.settings.RPC_Day && RWRPCMod.settings.RPC_Hour) - { - state += " (" + dayhour + "h)"; - } - if (RWRPCMod.settings.RPC_Quadrum) - { - if (RWRPCMod.settings.RPC_Day) - { - state += " | "; - } - state += quadrum; - } - if (RWRPCMod.settings.RPC_Year) - { - if (RWRPCMod.settings.RPC_Quadrum || RWRPCMod.settings.RPC_Day) - { - state += " | "; - } - if (RWRPCMod.settings.RPC_YearShort) - { - state += "y" + years; - return state; - } - state += "Year " + years; - } - return state; - + state += _quadrum; } - if (which == "details") + + if (RWRPCMod.Settings.RpcYear) { - if (RWRPCMod.settings.RPC_CustomTop) - { - return RWRPCMod.settings.RPC_CustomTopText; - } - if (RWRPCMod.settings.RPC_Colony) + if (RWRPCMod.Settings.RpcQuadrum || RWRPCMod.Settings.RpcDay) + state += " | "; + + if (RWRPCMod.Settings.RpcYearShort) { - if (RWRPCMod.settings.RPC_ColonistCount) - { - return colonyname + " (" + colonistnumber + ")"; - } - return colonyname; + state += $"{_years}{"RPC_ShortYears".Translate()}"; + return state; } - if (RWRPCMod.settings.RPC_ColonistCount) + state += $"{"RPC_Years".Translate()} {_years}"; + } + + return state; + } + + private static string GetDetails() + { + if (RWRPCMod.Settings.RpcCustomTop) + return RWRPCMod.Settings.RpcCustomTopText; + + if (RWRPCMod.Settings.RpcColony) + { + if (RWRPCMod.Settings.RpcColonistCount) { - return colonistnumber + " Colonists"; + return _colonyname + " (" + _colonistnumber + ")"; } + return _colonyname; } + if (RWRPCMod.Settings.RpcColonistCount) + { + return _colonistnumber + " RPC_Colonists".Translate(); + } + return null; } public static void PushState(Map map) { - var world = Current.Game != null ? Current.Game.World : null; + var world = Current.Game?.World; + if (world == null) - { - RimRPC.prsnc.details = "Main Menu"; - } + RimRPC.Presence.Details = "RPC_MainMenu".Translate(); + else { float latitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).y; float longitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).x; - colonyname = GetColonyName(); - years = days / 60; - colonistnumber = (float)PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_FreeColonists.Count(); - days = GenDate.DaysPassed; - dayhour = GenDate.HourOfDay(Find.TickManager.TicksAbs, longitude); - quadrum = GenDate.Quadrum(Find.TickManager.TicksAbs, longitude); - - BiomeDef biome = Find.WorldGrid[map.uniqueID].biome; - RimRPC.prsnc.state = BuildString("state"); - RimRPC.prsnc.details = BuildString("details"); - RimRPC.prsnc.largeImageText = "RimWorld"; - RimRPC.prsnc.smallImageKey = "inmap"; - RimRPC.prsnc.smallImageText = "Playing!"; - if (RWRPCMod.settings.RPC_Time) + + _colonyname = GetColonyName(); + _years = _days / 60; + _colonistnumber = PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_FreeColonists.Count; + _days = GenDate.DaysPassed; + _dayhour = GenDate.HourOfDay(Find.TickManager.TicksAbs, longitude); + _quadrum = GenDate.Quadrum(Find.TickManager.TicksAbs, longitude); + + if (map != null) { - RimRPC.prsnc.startTimestamp = RimRPC.started; + BiomeDef biome = Find.WorldGrid[map.uniqueID].biome; } + + RimRPC.Presence.State = BuildString("state"); + RimRPC.Presence.Details = BuildString("details"); + RimRPC.Presence.LargeImageText = "RimWorld"; + RimRPC.Presence.SmallImageKey = "inmap"; + RimRPC.Presence.SmallImageText = "RPC_Playing".Translate(); + + if (RWRPCMod.Settings.RpcTime) + RimRPC.Presence.StartTimestamp = RimRPC.Started; } - DiscordRPC.UpdatePresence(ref RimRPC.prsnc); + + DiscordRPC.UpdatePresence(ref RimRPC.Presence); } } } \ No newline at end of file From c5776ce636341f7ec12d6cf793d4de5192b92514 Mon Sep 17 00:00:00 2001 From: d1rknwh1te3 Date: Mon, 6 Nov 2023 12:51:18 +0300 Subject: [PATCH 2/2] 0.4 - Fixed build dll path - Some refactoring code - Added biome state to RPC --- dist/1.3/Assemblies/RimRPC.dll | Bin 14848 -> 14336 bytes dist/1.4/Assemblies/RimRPC.dll | Bin 14848 -> 15360 bytes dist/Languages/English/Keyed/RimRPC.xml | 1 + dist/Languages/Russian/Keyed/RimRPC.xml | 16 ++-- src/Details.cs | 32 ++++++++ src/ModSettings.cs | 3 + src/RimRPC.cs | 2 - src/RimRPC.csproj | 5 +- src/StateHandler.cs | 98 ++++-------------------- src/States.cs | 69 +++++++++++++++++ 10 files changed, 134 insertions(+), 92 deletions(-) create mode 100644 src/Details.cs create mode 100644 src/States.cs diff --git a/dist/1.3/Assemblies/RimRPC.dll b/dist/1.3/Assemblies/RimRPC.dll index 502546b697f7c16df9f0c0cde5ee35d7afb87f8c..7d51a875b548ac5c1cb4d0f18b46a58abd9e0280 100644 GIT binary patch delta 6381 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 diff --git a/dist/1.4/Assemblies/RimRPC.dll b/dist/1.4/Assemblies/RimRPC.dll index 502546b697f7c16df9f0c0cde5ee35d7afb87f8c..f2d962da9cba54fb91e4fd34903c14ef75fec40b 100644 GIT binary patch literal 15360 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 literal 14848 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 diff --git a/dist/Languages/English/Keyed/RimRPC.xml b/dist/Languages/English/Keyed/RimRPC.xml index a5a8b34..2f95d2c 100644 --- a/dist/Languages/English/Keyed/RimRPC.xml +++ b/dist/Languages/English/Keyed/RimRPC.xml @@ -3,6 +3,7 @@ RimRPC Colony name Colonist count + Current biome Current year Shorten year text Current quadrum diff --git a/dist/Languages/Russian/Keyed/RimRPC.xml b/dist/Languages/Russian/Keyed/RimRPC.xml index ef543c1..f7dfa82 100644 --- a/dist/Languages/Russian/Keyed/RimRPC.xml +++ b/dist/Languages/Russian/Keyed/RimRPC.xml @@ -1,13 +1,14 @@ RimRPC - Название колонии - Количество колонистов - Текущий год - Сокращенный текст года - Текущий квадрум - Текущий день - Час текущего дня + Отображение названия колонии + Отоброжение количества колонистов + Отображение биома + Отображение года + Сокращать отображение года + Отображение квадрума + Отображение дня + Отображение часа Длина игровой сессии (Требуется рестарт) Принудительное обновление RPC @@ -18,6 +19,7 @@ В главном меню День + Биом колонистов ч Год diff --git a/src/Details.cs b/src/Details.cs new file mode 100644 index 0000000..c68aad1 --- /dev/null +++ b/src/Details.cs @@ -0,0 +1,32 @@ +using Verse; + +namespace RimRPC +{ + internal class Details + { + public static string GetDetails(string[] args) + { + var _colonyname = args[0]; + var _colonistnumber = args[1]; + + if (RWRPCMod.Settings.RpcCustomTop) + return RWRPCMod.Settings.RpcCustomTopText; + + if (RWRPCMod.Settings.RpcColony) + { + if (RWRPCMod.Settings.RpcColonistCount) + { + return _colonyname + " (" + _colonistnumber + ")"; + } + return _colonyname; + } + + if (RWRPCMod.Settings.RpcColonistCount) + { + return _colonistnumber + " RPC_Colonists".Translate(); + } + + return null; + } + } +} diff --git a/src/ModSettings.cs b/src/ModSettings.cs index 54d69d5..78209b6 100644 --- a/src/ModSettings.cs +++ b/src/ModSettings.cs @@ -14,6 +14,7 @@ class RwrpcSettings : ModSettings public bool RpcDay = true; public bool RpcHour = true; public bool RpcTime = true; + public bool RpcBiome; public bool RpcCustomTop; public bool RpcCustomBottom; public string RpcCustomTopText = "Example"; @@ -26,6 +27,7 @@ public override void ExposeData() Scribe_Values.Look(ref RpcColony, "RPC_Colony", true); Scribe_Values.Look(ref RpcColonistCount, "RPC_ColonistCount"); + Scribe_Values.Look(ref RpcBiome, "RPC_Biome"); Scribe_Values.Look(ref RpcYear, "RPC_Year"); Scribe_Values.Look(ref RpcYearShort, "RPC_YearShort", true); Scribe_Values.Look(ref RpcQuadrum, "RPC_Quadrum", true); @@ -67,6 +69,7 @@ private static void SetDefaultSettings(Listing_Standard listingStandard) { listingStandard.CheckboxLabeled("RPC_ColonyLabel".Translate() + " ", ref Settings.RpcColony); listingStandard.CheckboxLabeled("RPC_ColonistCountLabel".Translate() + " ", ref Settings.RpcColonistCount); + listingStandard.CheckboxLabeled("RPC_BiomeLabel".Translate() + " ", ref Settings.RpcBiome); listingStandard.CheckboxLabeled("RPC_YearLabel".Translate() + " ", ref Settings.RpcYear); listingStandard.CheckboxLabeled("RPC_YearShortLabel".Translate() + " ", ref Settings.RpcYearShort); listingStandard.CheckboxLabeled("RPC_QuadrumLabel".Translate() + " ", ref Settings.RpcQuadrum); diff --git a/src/RimRPC.cs b/src/RimRPC.cs index e0ba620..654a31d 100644 --- a/src/RimRPC.cs +++ b/src/RimRPC.cs @@ -16,8 +16,6 @@ protected Mod(ModContentPack content) : base(content) femboyfoxes.Patch(targetmethod, null, postfixmethod); - Log.Message("RichPresence :: Patched"); - RimRPC.BootMeUp(); } } diff --git a/src/RimRPC.csproj b/src/RimRPC.csproj index 2b315cf..3d23af7 100644 --- a/src/RimRPC.csproj +++ b/src/RimRPC.csproj @@ -16,7 +16,7 @@ none true - ..\dist\1.3\Assemblies\ + ..\dist\1.4\Assemblies\ prompt @@ -33,6 +33,7 @@ + @@ -40,6 +41,7 @@ + @@ -50,6 +52,7 @@ runtime + diff --git a/src/StateHandler.cs b/src/StateHandler.cs index 5650f7b..41e77c2 100644 --- a/src/StateHandler.cs +++ b/src/StateHandler.cs @@ -1,5 +1,4 @@ using RimWorld; -using System.Linq; using Verse; namespace RimRPC @@ -7,27 +6,14 @@ namespace RimRPC public class StateHandler { private static string _colonyname; + private static string _biome; private static int _years; private static int _days; private static int _dayhour; private static float _colonistnumber; private static Quadrum _quadrum; - private static string GetColonyName() - { - return Faction.OfPlayer.Name; - } - - public static int GetDaysSurvived() - { - long ticks = Find.TickManager.TicksAbs; - int num = (int)(ticks / 60000L); - - if (num < 0L) - ticks--; - - return num; - } + private static string GetColonyName() => Faction.OfPlayer.Name; public static void MenuState() { @@ -38,76 +24,19 @@ public static void MenuState() DiscordRPC.UpdatePresence(ref RimRPC.Presence); } - private static string BuildString(string which) + private static string BuildString(string which, string[] args) { var state = ""; if (which == "state") - return GetState(state); + return States.GetState(state, args); if (which == "details") - return GetDetails(); + return Details.GetDetails(args); return null; } - private static string GetState(string state) - { - if (RWRPCMod.Settings.RpcCustomBottom) - return RWRPCMod.Settings.RpcCustomBottomText; - - if (RWRPCMod.Settings.RpcDay) - state += $"{"RPC_Day".Translate()} {_days}"; - - if (RWRPCMod.Settings.RpcDay && RWRPCMod.Settings.RpcHour) - state += $" ({_dayhour}{"RPC_Hour".Translate()})"; - - if (RWRPCMod.Settings.RpcQuadrum) - { - if (RWRPCMod.Settings.RpcDay) - { - state += " | "; - } - state += _quadrum; - } - - if (RWRPCMod.Settings.RpcYear) - { - if (RWRPCMod.Settings.RpcQuadrum || RWRPCMod.Settings.RpcDay) - state += " | "; - - if (RWRPCMod.Settings.RpcYearShort) - { - state += $"{_years}{"RPC_ShortYears".Translate()}"; - return state; - } - state += $"{"RPC_Years".Translate()} {_years}"; - } - - return state; - } - - private static string GetDetails() - { - if (RWRPCMod.Settings.RpcCustomTop) - return RWRPCMod.Settings.RpcCustomTopText; - - if (RWRPCMod.Settings.RpcColony) - { - if (RWRPCMod.Settings.RpcColonistCount) - { - return _colonyname + " (" + _colonistnumber + ")"; - } - return _colonyname; - } - if (RWRPCMod.Settings.RpcColonistCount) - { - return _colonistnumber + " RPC_Colonists".Translate(); - } - - return null; - } - public static void PushState(Map map) { var world = Current.Game?.World; @@ -117,23 +46,28 @@ public static void PushState(Map map) else { - float latitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).y; - float longitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).x; - + var latitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).y; + var longitude = (map == null) ? 0f : Find.WorldGrid.LongLatOf(map.Tile).x; + _colonyname = GetColonyName(); _years = _days / 60; _colonistnumber = PawnsFinder.AllMapsCaravansAndTravelingTransportPods_Alive_FreeColonists.Count; _days = GenDate.DaysPassed; _dayhour = GenDate.HourOfDay(Find.TickManager.TicksAbs, longitude); _quadrum = GenDate.Quadrum(Find.TickManager.TicksAbs, longitude); + _biome = ""; if (map != null) { - BiomeDef biome = Find.WorldGrid[map.uniqueID].biome; + var biome = Find.WorldGrid[map.uniqueID].biome; + _biome = biome.LabelCap; } - RimRPC.Presence.State = BuildString("state"); - RimRPC.Presence.Details = BuildString("details"); + string[] stateArgs = { _years.ToString(), _days.ToString(), _dayhour.ToString(), _quadrum.Label(), _biome }; + string[] detailsArgs = { _colonyname, _colonistnumber.ToString()}; + + RimRPC.Presence.State = BuildString("state", stateArgs); + RimRPC.Presence.Details = BuildString("details", detailsArgs); RimRPC.Presence.LargeImageText = "RimWorld"; RimRPC.Presence.SmallImageKey = "inmap"; RimRPC.Presence.SmallImageText = "RPC_Playing".Translate(); diff --git a/src/States.cs b/src/States.cs new file mode 100644 index 0000000..6488693 --- /dev/null +++ b/src/States.cs @@ -0,0 +1,69 @@ +using Verse; + +namespace RimRPC +{ + internal class States + { + public static string GetState(string state, string[] args) + { + var years = args[0]; + var days = args[1]; + var dayhour = args[2]; + var quadrum = args[3]; + var biome = args[4]; + + if (RWRPCMod.Settings.RpcCustomBottom) + return RWRPCMod.Settings.RpcCustomBottomText; + + if (RWRPCMod.Settings.RpcDay) + state = GetRpcDay(state, days, dayhour); + + if (RWRPCMod.Settings.RpcQuadrum) + state = GetRpcQuadrum(state, quadrum); + + if (RWRPCMod.Settings.RpcYear) + state = GetRpcYear(state, years); + + if (RWRPCMod.Settings.RpcBiome) + state += biome; + + return state; + } + + private static string GetRpcDay(string state, string days, string dayhour) + { + state += $"{"RPC_Day".Translate()} {days}"; + + if (RWRPCMod.Settings.RpcDay && RWRPCMod.Settings.RpcHour) + state += $" ({dayhour}{"RPC_Hour".Translate()})"; + + return state; + } + + private static string GetRpcYear(string state, string years) + { + if (RWRPCMod.Settings.RpcQuadrum || RWRPCMod.Settings.RpcDay) + state += " | "; + + if (RWRPCMod.Settings.RpcYearShort) + { + state += $"{years}{"RPC_ShortYears".Translate()}"; + return state; + } + state += $"{"RPC_Years".Translate()} {years}"; + + return state; + } + + private static string GetRpcQuadrum(string state, string quadrum) + { + if (RWRPCMod.Settings.RpcDay) + { + state += " | "; + } + state += quadrum; + + return state; + } + } +}