From 444d16d1500516aa4696d227c7027777bdc8f55d Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Tue, 29 Sep 2026 21:01:38 -0400 Subject: [PATCH 01/11] UPDATE Guides Part 1 * Incorporate Pulsar into the Installation Guides. --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2acf2604..c2ff42ff 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ To begin, we'll go over how to install BepInEx, the framework all Inscryption mo **FOR LINUX AND STEAMDECK:** Ensure that the game is set to run using `Proton` in he game settings on steam. Should be a setting like this: `Change launch behaviour` -> `Proton`. ### Installing with a Mod Manager -1. Download and install [Thunderstore Mod Manager](https://www.overwolf.com/app/Thunderstore-Thunderstore_Mod_Manager), [Gale](https://thunderstore.io/c/inscryption/p/Kesomannen/GaleModManager/) or [r2modman](https://thunderstore.io/c/inscryption/p/ebkr/r2modman/). +1. Download and install [Thunderstore Mod Manager](https://www.overwolf.com/app/Thunderstore-Thunderstore_Mod_Manager), [Gale](https://thunderstore.io/c/inscryption/p/Kesomannen/GaleModManager/), [Pulsar](https://pulsarmods.com/) or [r2modman](https://thunderstore.io/c/inscryption/p/ebkr/r2modman/). 2. Click the **Install with Mod Manager** button on the top of [BepInEx's](https://thunderstore.io/c/inscryption/p/BepInEx/BepInExPack_Inscryption/) page. 3. Run the game via the mod manager. @@ -268,4 +268,4 @@ Contributors and builders of API 2.0: - Keks307 - Creator/Chaosyr/SaxbyMod/The Stoat Lord/ThinCreator3483 - stillrinny -- R3b00t3d-kawaii \ No newline at end of file +- R3b00t3d-kawaii From e4fd1fbb6378252d1946c2afff0c902d8137e94f Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Tue, 29 Sep 2026 21:03:01 -0400 Subject: [PATCH 02/11] UPDATE Guides Part 2 * Incorporate Pulsar into the Installation Guides. --- docs/wiki/getting_started.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/wiki/getting_started.md b/docs/wiki/getting_started.md index f647ae54..b6a02088 100644 --- a/docs/wiki/getting_started.md +++ b/docs/wiki/getting_started.md @@ -5,7 +5,7 @@ To begin, we'll go over how to install BepInEx, the framework all Inscryption mo **FOR LINUX AND STEAMDECK:** Ensure that the game is set to run using `Proton` in he game settings on steam. Should be a setting like this: `Change launch behaviour` -> `Proton`. ### Installing with a Mod Manager -1. Download and install [Thunderstore Mod Manager](https://www.overwolf.com/app/Thunderstore-Thunderstore_Mod_Manager), [Gale](https://thunderstore.io/c/inscryption/p/Kesomannen/GaleModManager/) or [r2modman](https://thunderstore.io/c/inscryption/p/ebkr/r2modman/). +1. Download and install [Thunderstore Mod Manager](https://www.overwolf.com/app/Thunderstore-Thunderstore_Mod_Manager), [Gale](https://thunderstore.io/c/inscryption/p/Kesomannen/GaleModManager/), [Pulsar](https://pulsarmods.com/) or [r2modman](https://thunderstore.io/c/inscryption/p/ebkr/r2modman/). 2. Click the **Install with Mod Manager** button on the top of [BepInEx's](https://thunderstore.io/c/inscryption/p/BepInEx/BepInExPack_Inscryption/) page. 3. Run the game via the mod manager. From a58736cff3b3a16d5664e654d44f59282e4e5e04 Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Wed, 30 Sep 2026 22:11:12 -0400 Subject: [PATCH 03/11] Null Checks and Custom Appearances * Added more null checks into the following patches `GainGemsForOpponents`, `LoseGemsForOpponents`, `GainTripleGemsForOpponents`, `LoseTripleGemsForOpponents`. * Removed `_specialSequencer` from `SpecialSequenceManager` as it was unused. * Removed `FontReplacementDataInitialized` from `LocalizationManager` as it was unused. * Added new Support for Custom Appearances. - Image Handling is to be handled by the mods using the API. - We now provide a storage of Base Game Decals that mods can reference without needing to instantiate their own. - This comes with 5 new Dictionaries `BaseGameCustomAppearances` (Internal), `BaseGameCustomAppearancesPublic`, `ModdedCustomAppearancesDictionary` (Internal), `ModdedCustomAppearancesDictionaryPublic`, `CombinedCustomAppearancesDictionaryPublic`. - This system is stored under the `TextureHelper` class. --- APIPatcher/APIPatcher.csproj | 36 +++++-- CHANGELOG.md | 12 +++ .../Assets/BaseGameDecals/decal_blood_1.png | Bin 0 -> 22707 bytes .../Assets/BaseGameDecals/decal_blood_2.png | Bin 0 -> 13213 bytes .../Assets/BaseGameDecals/decal_blood_3.png | Bin 0 -> 13098 bytes .../Assets/BaseGameDecals/decal_blood_4.png | Bin 0 -> 15085 bytes .../Assets/BaseGameDecals/decal_child.png | Bin 0 -> 6525 bytes .../Assets/BaseGameDecals/decal_fungus.png | Bin 0 -> 53101 bytes .../Assets/BaseGameDecals/decal_smoke.png | Bin 0 -> 48541 bytes .../decal_smoke_abilityhole.png | Bin 0 -> 51671 bytes .../Assets/BaseGameDecals/decal_snelk_1.png | Bin 0 -> 1188 bytes .../Assets/BaseGameDecals/decal_snelk_2.png | Bin 0 -> 1097 bytes .../Assets/BaseGameDecals/decal_snelk_3.png | Bin 0 -> 1330 bytes .../Assets/BaseGameDecals/decal_snelk_4.png | Bin 0 -> 1372 bytes .../Assets/BaseGameDecals/decal_snelk_5.png | Bin 0 -> 678 bytes .../Assets/BaseGameDecals/decal_snelk_6.png | Bin 0 -> 927 bytes .../BaseGameDecals/decal_snelk_main.png | Bin 0 -> 3335 bytes .../Assets/BaseGameDecals/decal_stitches.png | Bin 0 -> 16124 bytes InscryptionAPI/Card/CardExtensions.cs | 1 + InscryptionAPI/Card/OpponentGemsPatches.cs | 20 ++-- .../Encounters/SpecialSequenceManager.cs | 1 - InscryptionAPI/Helpers/TextureHelper.cs | 101 ++++++++++++++++++ InscryptionAPI/InscryptionAPI.csproj | 73 +++++++++++-- InscryptionAPI/InscryptionAPIPlugin.cs | 2 + .../Localizing/LocalizationManager.cs | 1 - .../InscryptionCommunityPatch.csproj | 37 +++++-- 26 files changed, 247 insertions(+), 37 deletions(-) create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_blood_1.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_blood_2.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_blood_3.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_blood_4.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_child.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_fungus.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_smoke.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_smoke_abilityhole.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_1.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_2.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_3.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_4.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_5.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_6.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_snelk_main.png create mode 100644 InscryptionAPI/Assets/BaseGameDecals/decal_stitches.png diff --git a/APIPatcher/APIPatcher.csproj b/APIPatcher/APIPatcher.csproj index 296ee20b..2cb804d3 100644 --- a/APIPatcher/APIPatcher.csproj +++ b/APIPatcher/APIPatcher.csproj @@ -1,16 +1,26 @@ - netframework4.7.2 + netframework4.7.2 + win-x64;win-x86;win-arm64;linux-x64;linux-arm;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64 + Assembly-CSharp.APIPatcher.mm + The MonoMod Patcher for the Inscryption API. + 2.24.2 + Cyantist, IngoH, WhistleWind, Chaosyr and Contibutors + true + Latest + APIPatcher + full + $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 enable disable - latest + false + true + false + false + true false - Assembly-CSharp.APIPatcher.mm - - - - $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 + true @@ -22,4 +32,16 @@ + + + + + + + + + + + + diff --git a/CHANGELOG.md b/CHANGELOG.md index d4bddb22..a68919c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +# 2.24.2 +* Updated Installation Guides to Include Pulsar Mod Manager. +* Added more null checks into the following patches `GainGemsForOpponents`, `LoseGemsForOpponents`, `GainTripleGemsForOpponents`, `LoseTripleGemsForOpponents`. +* Removed `_specialSequencer` from `SpecialSequenceManager` as it was unused. +* Removed `FontReplacementDataInitialized` from `LocalizationManager` as it was unused. +* Added new Support for Custom Appearances. + - Image Handling is to be handled by the mods using the API. + - We now provide a storage of Base Game Decals that mods can reference without needing to instantiate their own. + - This comes with 5 new Dictionaries `BaseGameCustomAppearances` (Internal), `BaseGameCustomAppearancesPublic`, `ModdedCustomAppearancesDictionary` (Internal), `ModdedCustomAppearancesDictionaryPublic`, `CombinedCustomAppearancesDictionaryPublic`. + - This system is stored under the `TextureHelper` class. +* Improved In-Code Documentation via XML Comments. + # 2.24.1 * Added Extensions for setting the IconTexture of a Starter Deck. * Added 2 Alternate Constructors for making a StarterDeck with a Display Name different from its Internal Name. diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_blood_1.png b/InscryptionAPI/Assets/BaseGameDecals/decal_blood_1.png new file mode 100644 index 0000000000000000000000000000000000000000..8ecf3a094d124b236757cf3026c986410fbd66d9 GIT binary patch literal 22707 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

t}I~@i6s*lC{1V=^wQIp6aL=?7NIPtj>S$8&p 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 literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_blood_3.png b/InscryptionAPI/Assets/BaseGameDecals/decal_blood_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e172d394e8f7b95b4de37841f31733f951b6483e GIT binary patch literal 13098 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 literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_blood_4.png b/InscryptionAPI/Assets/BaseGameDecals/decal_blood_4.png new file mode 100644 index 0000000000000000000000000000000000000000..16c4c2e56ad13ca64c74a9c5fe68278b8d42bc0c GIT binary patch literal 15085 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 literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_child.png b/InscryptionAPI/Assets/BaseGameDecals/decal_child.png new file mode 100644 index 0000000000000000000000000000000000000000..1e5492ec022fe9ad4832e68540ebe942a4359b02 GIT binary patch literal 6525 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 J|NER@{vTw$8#Dj_ literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_fungus.png b/InscryptionAPI/Assets/BaseGameDecals/decal_fungus.png new file mode 100644 index 0000000000000000000000000000000000000000..257e67479004348541ebf597300a6fc9d297b44b GIT binary patch literal 53101 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

gro`gN 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�DiK1ZHL%9bmT`-A2w#ZDZRMu*s?5*B1(fF_nN8h)P6U8Qs{`aaO_lP@bH*Z%kZ(Tor`T@GZw!FzDzsvU=&dGook@p7=DH0ro%HoUpMFsoEL znKf@>$S~A$LvPfcQA&j0qaie;eTyX%aGvP!XH`%6sG0_#BzCYT1(1G9^ZjetI7nNC zRj_?~lI1!1+o>y%7)RkBkRm3tiIfBxoHYuCB<&xp`K%xq>kdAWcuXl1F(^x-`sowQ zlKoMvKZiOO+4zo0_~MgH&bfqnr=ny(kO|=lPyY^rW5KfOjA-?EN&Ta_EPoI$i*Z=@ zHYE=$L6DT9o2u?b%XIA)VIMk~_%@Kq7*B~j$qx63sDW@NyC?=mz z0|^R-C3Gpm;mOHC{=MgKh?4K3r$s=Wj?MnUrLGiu=Z8u^kkMhzs*hKZsMF``wS@tJ zPA$(#!97J;ytz)#E{{f&9cXA5?G<19Gj#RJ?2ElabFwnS@{QdKR_sVm9 zq{_Kk6GqBAX+k)2465R*xv)1(?RTG3G%bEIA@T&?5eEh_9?$3C_TCbivL$e_Z9JhEV!9dWQcyv2H-o-`VL zL0XHo7Oq5bmip+UCE3_{EGtB)kJ-;3r_y7J);YB2-r(OEV>> zF>?rcDlGkj<%kAEpJEpLUq>G774zEeT{+C7Ad++7GqW&5GMIDtt>od%)ZrI-AJtsX zu2r#jrlLkBKa5Q@p$l7OU$5>F-FL^jjD>Lm-~Y7v5F-4V2NLP_{(93TdUS&9rSbC- zG~cq1E?$itCj@GMo*uWNCtbL$c0`~IiseN-*lZ*PGzZm#$}I-ZS706Qtx*9FYRoA8_?N?T0g5WKigrvzL`Wxn9hzZV&l+a@z9p{bBVA3JNkP zvgx`g`U?6eviJk0Q3l3~IzNm#4I7La7I~&bAJ)@um_M{;TJGBKsrA^q+^p>MLOy|v zPmKLfqbzf)qqVbp`R)$_r*sC&xVB^Fn&05}_sNzZOvS+$L#l0yY4Ks$PhQS-8YMEK z#h7r;+!?~Cz>*GIm+sW^*Qd3G?ukQGx`@T5GrbvmT(HlRX4p;Q=P2xqfv+hO=cvCV z_VbeV;VbX&V1t>wfC9^tlF`v?1=o1_OhZufnEyzb!#!ijwFkd?QfawZ)ES4Hb+y)=3QFCD2&9)3f)gar(nqCw@EnR0g;V_V0=$1HSebxRy| zz}MF9iHSPaJt>uMBY!FKQep+QE$U|U4jP+`YHfT6q(iqeL>?s_r5#efTD-pS{|+Tf`L zKyy;oDRZdnlJ*l&&CT`04(@qX9bWHs0QfB=Glac~p~SpWGZauXlSfE!r(WRItmf?Q za3e0=j-}dg1Y-Z9DCI9{*NBASSHePyJCVGO*uQ+>RC~Fn+1S>Rz12!C zl}{k$w_Xe}+U@ZcQ&`v{1Q*3^chvKJr!}K;9f8}RIX7n`^amFv(`d}c_OzofH!d6x zsJWz?8+ENnnYF2dkkYsDNyBjJzQ4pE#CG%|bHO#3b#1Y_5JMTchO50Rpzzm8kre8| z(dh~Ke0c#L!A(Cf(BL)!NNT|zXy0hWvL~z28**w#F&%qy{cSaX1HhjFrSPy+WA=Pp z@IYI-l^B~TtmZ~CMwI`J_Jw|hM1~?pX$QL1E4FUgGL@(s68jqs?Mn$+0e)@9#wN)7921pXYS)eK`W}Z+f8<;`LIgPKPq zoMK#CW6F7Jp3Af$xRM|WuSJ((*a3|4blf*>$;-XHY4k1N7q0ZFloIOXc!-}~Nf8T& z-@VJ1YHKLw!P8_-1eYZLb_LUP_3RGX6=q7GaUOXcAq#rUPf8QeTW~pDcQ*OvWLPo+ zzKB%LQj?58h~%y8TGg!>8-xHmxz-lSO4}??rDC!oll;XwayFwBrI@~DhC1`@H6$Wi z)7UNQ$NJnhGAEU57{m^}xvSABN0E-KH|* zWEex!izR<36xpT*^mY51zv-cq@sIv-y`%;&=JynUC$8W9{OV%TL67gGo`CHfF=)!H z>qzJS;oxU3xhKKGosPTMjjqTOj`j39LpNymEt_cE-VRGt{up!Y#>DCR3So%xEy(Fu zRm?N^v&M79rKr??g_Se@-K(Ti2`p5op5F7GXf3Riu~j>&t|;^~j98A522o0tqPaTp z<}vv3c@vjI7UWP0$D_RtVthJaGl==U5T+zngpVsJceSM*lI2Ldc6)F;#2cfTRZ}sG zCHO~2KIXG{&gVK>cJ6_BsKrHhT?O`1)jm`wV|u2ifTvbI(eE+w5n3-S_#+u?xk~Ej z5?BYjc(iy^QQv-H*0JqdXBA3jLTdCdl%&bJaZRf80gv7;PsZ%H>kF|ZHj%&) z8i>z+PSd8go8fm2lUDcrgrcRMgAiHsPu|tw81ya;a@ykI?ZA;s-GG-3p7)4%CNR0C zD*c)HyuV^tW^TQl__01xn0;@yP$X2M0Koy{@0IX`2keH+sK%*V%mSo>+=9mQ zp7&O2UbxU)&Qj?v%aZ;yVmq=t!8vn9vi)&>bL52Epmu3ltklMoL<);sUbWt5k!K%h z|Lty$C{~W?Tx9lsWc0Es{C%MSSG#gJ5~m5*;XX9)XGB%q^R-4)g*MQ3fksNs%#O>D5(-xx5y~tep1`_gkJ_ntO zCU7Ur`>hYf8-1%~_(E+~L_i0)16Ayt1gA`rl!S-S<=rPFsDInXay_R~U@}Ao84y4( z5h4sTEW8Hrt)O9M>bkxEE8yenja)7JGx91$rYbc#gnX3uUwZ-_*heZ&%H7F;)Xy-5 z$ZwpkSW%k8ScNt?ohB5{aAL_PE^n8ZDIT5q$oB2jgQFO~0pWX9(VCjT)&&Xmli!Z@ zg&6At3fA79_XXrf-b6kHs zIWyz#mgSIHKB+PNzP3CNpbx<#2EbDL+x!IVkOmN7C(o52imVpP-2H~nZ{Oc7hw8R> zlE}RP3{aZ&xcJ5H$jA1fSRbSS>Rz+M()mR`Zez{Y-2qA5Ol|FBS`AkAy*wLegLk3i||32f^Z3|OQ0M93Y zL1{#37yV1B`qrh*M+-D^a$Qn-NnhU%x|k&Y>g4oHSf>^&zl0Op#PQeVxP>rXneJ^G z&_qOA7W7`tf#lydnsDcU1ZEcQ_rUa;=TvxFoZVP$ zfmfy^Gc0Ir~b-S%=3k=27Bn@2E4MXfYvCv^Nj>Ua4h} ze|UC+Q0%{e1Y>na1xlPR?%$(G2qn=k--<;#R_&{DM5~Xeq5987o<+EsQP&;4a&rZ( zH8m`AfysXUqw1SRfek6t12SvH|I}*bt$WC}&+Fw>dMZ1b(blF8FZYiCxd3NIkX!htR?b0uIlgg$Bm9J9 zUM|)Q>wRtRffxWtrGNC$*^oY#BC>gM3_7uY7o@20ZoM~dn^u}%&;42cj)u)e`#ko(yr23h+vL+@(Cs1f`dq}u{2_P_A744(X9x2&%uFo zHfvcoD!eM!>3_bVvO&mBu`MHzVXq^0p_VAR!$QCmA`zL3hd;61bWFRTGW#>tv)kGj z;f_|l#O)d3sRa%$YU0eKPBW82-7urvIry;>V>(Woc;O#ClY5Sr#U7PsQA9(BNn`!BqOKxuY{)tGb zwMk|57-&kVS{iSW2xy_m)dp2Is+4S=p<;9yhcz9vycHZ<(&U?a(ZvQX#P%4)LUlQ; z(f;e_Ks0oC^-cg2l&|#6z4V8Sd0eAO%Y^J^=2qS#pHX0{m)Dr574%JyIBWsuIRVMF zw&zKGElJQLx;0!_4VM(5yG6Z^ZccfDR*~}-b)3)L&gDN}TEFxZMFbRSA4&`DO_6%B z-w~y`F>V3QE!-B$`EpTOc~)YzN!PZ$&P4oN^7`db!HEIwbK{Hzp?}_g=!8WH0Br>P zU4auOY%{MVL_lhZ8$Jn`8HX&LGy4j>>}o`wB{~lb=no^js==}y^V(Xw^buxLg`xu& z&+j_X+a7!Xuq7esTa#bO1Qc8A*9=sRb5D7|y?)m7@2GWcir**)l~dhp;#WI=kVdBK zo_*-w%%`+E8iHWK6*q##>W~Hk5Z$4cZ{OjtmQ&RrIe1N3fl}VUmC(hAF>->WCOlAn zrucw`Te~9Mg9VibOR-D#kDjF{pP%iI?gnebGUAIgH^7s#qI$qG&!HJhgHJb37c*9N zDV~h$)luaiAKdiA;9Q6ft*60Lwcv=-m)(~~?i|K)A1-4~dq2=SXP~Nbyc^; zdSy9_eC!tV`@;XV*L7FDf<2KybK|+Iiix_#6Gnb*A1?IhE~_OvB;3}J2iH(;`WVJA z1Zh%SlvA&A9wImvK|FbPhf)22LvC_sxdXqhhIdBHvV!hOB|Jni*$fU@A0{mWgUes1 zy6zEf8f69r`Eq^s{H#jG+Ep@#6shE#^JC*f*3z0;CRlB25gH$gr~Q|{uujJ$0v?ok z!e7C3Uj2axe&(%A2et1n=U z9BlL=4}(M^+xeEV3W?CUMR2|ye$QV>TvAjPN&E7YiR(cK^!FQwzAuk@z!Bc}aYVs` zKW%8{P@cBa?@`HZMQIN}7W{6M*86ggoGNi8_2LM3&WcAud&I0{Mf+F$-5J==8BO3~ zE=~W{+|2)TwQ&|2n@uFP-oL%HRmv}rvRB~7MNMc~iW%)W*a2G3C1Cs5&~BgQLUxlN zg=}*7)L_Ihleg?E2Zji~*KJ078nF&T#ZG(9k0+$`F0zZ01iV*K!XhdwKt1%WJLA zm1$Fn(T`GX4(0;@C|afKojP&z-5kHm1p(#sA4lpL{CBZiX}ewP-)z1mpu^BvUAZ+6 z5W3NwU~MUGHf3(b(}!}*`7z0MZ2>`j#O&?^KM?0ky1e*qQx*so_w6QXoE8J%?h!N- z*NETvUiz{kL>5b>ojEGz&dTSUOI!7KFLF{N>75^Eb~E?;1Nv(LXR zh``l!=8&znb#*?{Q)BZX7un({$M|B0{oBMbaZbTBjAR^KN;-4ZqTd`XKHvtL#vESN zI*R<0?DND*MWINV5Gu)&3X<*Q_vn1G!HAjSL10PtTjJz5q+@q?VMKTDyBwT?VXB~u z!OL~Tna0eM=XA=>@a3dj?fAFdPwqCFHZYddqGLU$)N~B?O^e*Ov5Edy4sBi1*t|Qu z3`JX$vEcPJ<=sfXEHZqoEJQ~6DnY$wV>Tb1ywXfA>aVW5Q;}x&OnqY<4IW*Y97z18 z**!fljjhx7`LVFJ>g}R zW}*a$DPqCz1c&qY25wK{`(0z>8PKziDPwVoSEJ##-Fu@;Pl=g&?*{#mmVq%g5go{UN+PaRyQR=f4&;iCUVK$9#E>5?6*REZL zv%Tk;^ShJ%GT{As@DLiiW_;y;JqTxeNI&E;Y;W~I;BMj?Q1I$bbrgzSEG+au;wnop>{vt zF$U*bd^!5=BDszh5@zz^_P?|2sYM){vNeI1*UhBK6P}wgUJsv*2yqYTx=9gv>RS8r zmEFQLR^5}$&Lnz=C20=CG8vceq#izwCYbqBY{kA!v->7}Mu%fR*xY=Psl--{#-YscPY7+AV$(@B>7P9<#T1g1zpssU%)%5zlk51 zwbH&_7kwQF-ew=7-cX@)^! z!vbN}Hdn19=f zQzLb-pl8#j1!6mQLgQ@qosNW#l1jVhVp+d6M1wEwTa9U+hQaAq8`DksXbMk9--bN6 zM0OU|Ir+)ed+^I+@G2)>uLX4FE0vyvB#2lNk6V>#nD0dHo+GtR0;ESt;X84|(A0G3 z#j9bk>$f#bJY@5sO^6nYk!fE|{b6cI^HQnd530)EJzf<5mFGB3(h8XEi|P;-nlC@o z>9#lUeQ2s2$oWByYIU?BQbm0}oNt{p8{Ox-CrlvJ?13j20 zzcenexd#GIy4Gb+c&tmqak+q}sC!ANV#-8l zPYQgD8oD=7or~R#mT#ewb$XAv)Gwa^m8ieY!jHUg@P&I_M7?zBAa^`@B{@;&3PnkV zW;q3AjBP(?XX&1u5R=+&dB-O(x_j=dynNPN-^^#XFq-mQ)<(;s3p_jsP$a~IX*Eh0 zkvedI5kmC%PRXrVS9a=RJ7n;^s0!_)5m|P)6q8y( zxE;-M?X3!$^@O=p%crXf&p?8Eo>CDd;!M=Q!LJn)!(TiY3n&D%osJ6UaBXKMdsBj9 z!DlH~84?WZG?NfKJ|v%DuiAP&##`=XAu$q2?>>Uep=A*9shsP1^W;z%nv>_odp8Mw z9S{j5YFX}Z@|~#6_kpz>C2C&P&KD97xkuJhxnoFi@rN;F!+g8<=HB2 z{UzXnDKBR{$zY3SbN{bnd>6%x(AU_CCJsEPR>Jk%bsb}FY^gEPY{38jVY9ueh~EK&1Nrs#f;_qupqK&Q)% zz-}!c2fL1LbN|#QGv7$~(C6TYJzdQj4+=P$GAVt%cYg9IQrML{}h;M8dvHvZ zbBIxfqdGb14|5f!6ie64_s~8W-Z5E~f-sh!j7c&X>;2v zyE^QVwx0zV(iV+4%}VY?z`4Cl-MWuyXAr2v(8So*UaK5+(50N|CZSi)hztlBd_-sN zbH<{%X-qY!_XI)cUZDNxKp-*nczj7!ELgzCVyTuefW>U241ZnQk{BPX)@ZlM|3xe5 zO)mN5wn3PLp3+)!{%U{tJeE?Lwd78J_EZ|VXqOLX} z2uezODOL$h2oy`^Ub2r`jW%~^<3)YWI*?iS;5byf=0LU;8&MaJD1;XPFUqx6={_#Q zzA&5jTLgBUz8~7;BN^*mgbrZgam3D8*byKqB&Cd&(M4YwT#WZhKIXymr^Ir&)b_39 zzcbP+LPv?1te+`=J1qThLg{1N|E1+cGEz>z7-JHG}|q71a-t z+5U|YgSkoBvu;7H8pT`&4UE4(=a4NG{=9Y@Z&E%wL&umENzME1 zt%w0FNkUL<%oyV=rE?tO*M^ifX>{YP{Z^5ptv2~x%GoL8EiJ?Ao3~NVRs;oqTwbc< z-CAoooCNpyCVDftzoivoz|vwHbd7NFjRczRq^m`8$eI871BA{Czq#K|@)4wRD(eo1 zKsTthX79WbQSOFT^fg&l*XL3fkNFMvhfph;TN9PK+bD9lZPecPY0zK=*dPlruL2{Y- z-xF0Ml;qPVxvnOLxA(>`IhWZIe*TRA9#8*z+tb_UJvfwW_1sJX3$5k9L14vN3F($Y zmddD!d!<~B7ctBHOjQAET8! zpxC8stcF;r_4lf5Thy6VEJIwcPF0db&`3&aE{%%ob-DkI*ti~#ZPlt!WvXEf)dl-j zKkk*QaTm5+VGQAJreOZZGHJ&7Gt{|^qnBK3{(X-5rzXVXj0v|UThnhXL{p2GohIi! zat~nDd~KvcD9+BhRpI;DofGpD#TdG!Ucl7y&nQYy+Q`381t_!A3zd_Xm17MAk?&eL z1`A915PC`@eTpTPk+p|gc!U49tqdta?;ORV##3{pKH&oh^=7c7=vJs7+xKJwNfFzCKiK}Ax zRu&4)BlOnQ16xAXfh+$6uvOFH%(ruh2#+B{7R&%|W+b;#;ZYCVpoc3l(P7iQfB5}L zWoP8+gpm-6|UuUs7qD^?8`p!nT+Zv3SvsgwL4JW-NO1*%!>m zL1UGSO)Hz5dKa-B{XO*W8sqy|v}x+CJcG!SpOQ#9sNZ z@7u}(7N!sr+Ninx}*`CB=U8 zJ;&f2{s3d@+2s+w$1<%`emD>f%*k2W``{}xdmj3UtWUH+?6&|2%~wGF1B94P=>*mY zug0^ZFlU>jW10(}R(fdhjYWBgfu>~%~G9^*EA`WVb3*?CYr z+vEhgF;67j>YiUhsiZR_)Cv>kKx#aLc@@N0S7X?SNk=x7xGz>?A;yF!rrextFa50} zXG5$HxpLVluJC5g2pT_GVLY5X0H3`9z;p8s8KM!GKhJPXJ_tE}s6c_e8L16s`EMbu zh2vHH+ZKOeSf$<9z4K?)ySYlXqDjEg&38-2+fgd5iL-3PKe0^)0qaNHuD_urlXy3& z#+<3ZliY?H9xRo;pYSogf>0sqIcDTr%`Qs`Esgb`hUh_(hl1Loe+3jhXifxWQlC$r z<10s*BC(Nk!pH$=hn)R<8NeUq@MyVGuSa+hB%3ncnU9^_>8Etd1mGKYt@w~!o?yucOE ztI7pYr2DrQB<6V;l>jjHPjGgM!#h!RZ$7xO^bkg(Y<{l__3%mWbcRgn(c`I<_ z&yh0Li|-AWAZj#xar8%^6xOwS<>Ije@<|0l`R#dT8La6AU#s z!`nPAp_`o!{fVy?GClSMJt5o$>)VM>E_ z4t_sLnqq!P=P9Gei4H=TK%a;_e-?VWNoro!i;y8MEMW~NnDuG1KT};mdT2K$Mtso# zD%kjn&_w3t=H=1y3*N$s`>7C;bq`ZsO46^#xseXY@QAAs?G@QHqJB_Z2NhCzEvd{f?TvQD!Ngv`jsjE7`9}*Dp>UOi&O>*6BS0Ukjh@7f}6Q-@5Bmzwf_E z%uU(5ft9E;^+kNjgHLs)#-R7QjbnIL@snmr!`v_G_ji$q3lB3a&iI7-|ED|9JsO#_3b*Gi`+UGi5PMfo@eRSJT2u+?-p!7QgI=KbUyfW@U z&?!wMn!2NYgBUdyeM}@zbtf+u@5nXQH^Z`|uNc8MbBtZ$z_2LHpjXiIu(9M55KABu zwCTUn&b%Zj6_JI00Ou9V2M?CtE$RPjS&vyrDD}w`+V$?wlF97be_d9v68yDmvqym? zoD1pTTQ*xtKS^nih<0{5YJ*skwnEa;|5&Ugjuq9nr{c;?jh>GZGCJ5A{^tK%;?m_o zu}I677iBqCs(ICdCG%R|h<{7(i_b+a?~CTE?{2_s0maobN?cm-Kbaf6QE6jJy|Sfp zRX^Ve&pF%9cAB3=vNpayzUmefG6cMwc?k16SJ!d6hY&mYIKr<9wI%RIT<{T13cXRRA(T5tJ@djveTLKL4R5t(1KFKHe@q>>SPadAge&dX6@SNDXVI9|1 z>)*~+_R>*0EY);>djljWWAZvS%<0Jm8}D|#D@-_}kPwW9hg;qBSa0vo_;-TW{@}t{ z719*`b=g2s#pj`q)Oxe<GeL-&L79#qaIY>JeHkiThC-SH*8MYebu?^ zRK>twhhQRlL6Kp+^nvXq%DL{-P^~BMVB4YQLREA_eCH=58_eF5|!);*jfqhw9}Wjk<@cflQZ4wulwl7TE;A8$h{(g z1}jk;uNl>WLv5-1u~UV~g7A|1b354?WiFz`o^=o)p5`NGe6O>mVK;sL)(WgGS93Ik zgZS);boL*d+@{Wjq*MwHvY4Gx{&LBJ_S3bcnZrk-Fl8^blaCAj*8!)^`kxYTs~<-~ zKJy*;=yJS{sG504Mkw-Nei6~m7Z4cC9^)2~ej85cT?05glFgllzGn6DB7 z^4#06r2Doc+1h1MC>r3gUidnk=yyoi28^hRGvdo+fu26bv}#e`ONh#%OZOE?acWoB zOmnfc?pDKF69R%6W0c%ub-LSr+<*e^H^kt?YH4B zFP)awgx6NCah3`eKm>lMy%rPwQ}W9=x^>a}V6(d9KGZ@ZUsxahOVOxW$Y>QX0?jDh z1@hK`v)#{G>6TX# zG1C6w^=Q{VQ?Sk#@9~O>{91}!q!>&P5%1b&xSx`rE~;s>c^xqbu9AM(7pmk0iZPXZ zPaFbAHMvKGcBg*h9v(TVKRmiwqwnSfPf%}a_~s~Yn)X=at*e5^J`Zh?Lnp6_tvpW~ zij8i3oGwG?-u7EY)8#SbyxQL41kbMTqR!q|ndF}Sg-}B=8NbGl{df|V43xfxfR%k} zD@P!FzIvMn6C-TNrQ-D6IfHdS(DK$TIL?Xrec5C|(s8`|q&Zm)F)_|EtFv~Sslf73 zV)V-Qvr_yMitN-BC0!-Ct^QPwbySw?)@~;4FLxRU^fO`^v^)D|=pa`x%D=OEpyINn z-n+`z9zE)b9}F3VuE{GHp{uIsM2{!CF2})$29wG}*H;g#(YFK?UJ*}A!x-0qA z!qwAGVTa01KJ??>dB(6DUoS0)tZ=1TASU++3xhPs-&@n?R`j**icU{Rvx_n3US=~w zjq$JkJ{x@7p{|Ce@WBYtbaeI28zN>4^H!ma0v?yZ4OKkCfu}H|uLtL&)uJ0A#RunC z2$->t8JaO@`yhIJ(Wzb$$wZu3J%(1ggny~&dV$L=j^8bFF`I0Wb-3!hfoCi$Z0Ar% zT2`_KECZ=L8F+`(*Wt|3?CeBk!lmU#y7Abt@#X(9Nc~h83FKCTaNUy&7uPpqI$kB{f-|cTw%**M^ zWv?RxiS>7HWr)6Ib>oOU0c30!`RVpm5q(5(FfE3BoLtw_iRK&I&6WUeD{LEEmIn~TByb3vT>q%ZGj|sE1P`F85=oX{fPLojTI#gjkxyCnj zeM4sKV`1g>fqcXDUebz}QLn4;YfJ~p_+dw-n6!Vf@(4BWWjE?!1Ag6Itw<4G*(xQPvO+eWMPM{8wGY3^DAzGjxh1J)ceIWW|bs)kVYheM5VQ4p(h$iB^38{d#n54 zE5gM~muI^v!yHF;)2TjN-^=Uls*~<38=8(*n00AVuQbx@*S3NZT}eDeP0gKR@RE8W zvU$(jEPwmMTP^$(b~iw_!vrx4c}%(63I<5xJG4+K$BjVCxz=U5DXR?Q@hS$ns&Ll- zITj>c$t`(#Tk`hYiIt!ML9LPJ{_j2oRFU}0(I2z-=iIvDO9uTELWcbe?dh0UGEX5l z5t(+)S~SIiF-sQCmVjfjMAc$gzy2CT;M)fNn3;g(q~sgSV(*PI58l*b%3vqJQ^!tS zt2Q_$3BW{HFPn9E{9_p<6rNcPEW(mSJTe`brQ`ojEupr4?Svj|+T4!^UR`vdNy8Qv zOt1))b^XxcfP9|GByT^-pTosGG9YT`Y^#M`%ErOD=e=LLZOH-OUTamKQE=DvYik~e zhuvJ8(J5PoF}TeKFKMeS$Nt9A+@7*G%jnkyr{4N+r$EouhAzUw03K6zGb8q=MavDS zAmQ&FTi((%$%a=_`}hFwc5TCnKY8 zButUA4wqqQ8!oH0_+8?23iaYao>zt##vsqtI<^a*oGyhGggpgjNP3KXmBZ(6u%5v0 zCsQ{m@7u}syi&Igh^~3RHaev#AJmXl+}~od&XG{A=&*Hb^7yVM&YN$d2G?7c@NP-l zF`JSf3ydNN4hKF)aeSa^kpo@+er7;0HTK({;$1$faAN)>qZlzX07!RD%|79+5Kf&h zs^aZjIB7gytAgml_!BKXFRTYB0%WDy)R$H8i?W+MIprz_^*LAjHK2`lL4UUnic@XQ zye`(X7Aa*WV6c_)1R`S*ZMhBtXa-k4MI3n!8|~qEcOZey5jrJhK|Kmg6H!#)JYu7( zwzU!X=ROtwXAV6>RF|B}U~tg7k(RFUtqL?p8Fq}nZo*FUKP)@~4F6Q#7JsqQyIS4z zRE^Sb))G!Yf%ip$PuM2*2W=V7#^YTL;k2B4>xR7!sbA6PoW94ui=e1%W!PA>2UJS9 z(=h_>*r#R3vvQlwU%qWHcHHuH%jxA)2eEMZc+*;K@{-8GiJPF;e8uMiX*Hii)gxG` zyISWL?8Z)x!QdAU#6359m7>$BXKrj7(DF_^d?Pt8fTw%(PaQ|1EX&3xH2zZ+ZT9#B zZq)dOv~3*rx;Vgjy-?dPkM&zw+@0*@>WI%tG3eX3fK0@UAV~u4 zUm)ceey6ky9NUtk7eYs*iIMu|xdKssqW!vY%Ikcp$C+7qQTd;nXYX(;?D;W^@%}!F z|2W@U>&CI)!a20Vtoudn-+4<_&ok-6AAo?ohBe7}cChD<- zU@b{NofV8!nP`#=8#U!BmOX+Z=u`jh{DJZK>L4xdq0hR<`_rBcTQ-9cN-lZcS$UyI zAd?ZkuR}3?kqX2rq9Q-U=t8{`vrP`~&;97)Q3hbR3xhmg!S{oZutUy$XrWoin74_I9N=O%UjNuAn12 zr!Q)qs&v-ee~_2d6S&NCzd?6M%MJ%r3apJbz^0l%6n=zw``oaTV*>uUx&gX6yN4hF z%F1Np@t}(EIk1P`!rfP5QoTAB6E2N!NK$ZzlMRcMrKfK_cUOi=$C~k=tFi@Am9~8I zw~MkMRxmGcPG@O76hDzKXT#_+E-uop00AZ@!V2~b_ziV>a!uhwDL36K4uyPKCC6Mo zddE}bEFz)>tuWw@*+;`dL~gjAZC{#6&#r{~Wb+~TyBuO;i<%$_G~<0&BiKAQfy@nF+~uz$WhpKjnG{CD2`P1<>u%6D zhP_HR_Y%mrQmEEZP*H)%fp$KzmiJ2aEPO9mtwtuO6KEhl-p3*IRhljV$|GLSDn?Df zA>j)9!^$RegVV#=KY{rRkutz(v;!os3K2F*RUe#|*{Dk!)komx)Q0Qp?g?7~^FG(Q z&3hAH0w~c)`(2Ji?@#`&T8>wU0sanF$&`n|q-?9?MM^$ej!&u>Os+&28I>}na`^#U(t($)y7%oH zGR#uochP59Fhv#NAXQLMBol00O(FQ!D#rWfp})%j5YWMi8y$Ii>N-t1#(M(edOY|W zjlc_L>WCxPmERdSiOdQ3)d&80_5YhPcFp3}VcjL>L{w zP2=5^ECVeI<%`ueKnx3ilwKo?Kl^mZ)Ejzgb2c3^P9$7|$kMryOJK`MD2^6NRqvq~6VQ3=wmEIm6v%+i&Ru7mWc$zen> zG}06z3a^0Wcky%cjVVaaLwX6)UB4q;zq3ar-t6G$I@bjx;h+i9TUk5{2i3B8NGC`q zNPik?&(2RJR#%I(buFQVboI>A2+2H3CrFoiISU6p>CN$16!TG?vyZHOO_c2KR4zgK z2&8KtrE4HP3F!$)ua%{5K4cla0lmc0qm)h-=H6=1sfrWv!61-iGY_{9vh>=^<4Y|d zX6tTUM%UY|k~YofF`mOMmwQ}-%#MGq*Hid^T!Q)WVSzWHO;YT>Zy z=1RNec0dm|4-zaM(h1TD(h1V(|N5W*AFUncyG8=NF&FA_4}J!}yy%B`euLMIh6L$R zNcZ~9+8lbdG*icgKWFLC<|ik8?nq=XXx34Q*WdH*5j>STF-1j4ud9%5f%Fo}*AmZP zkGL^99M2g6MWYd>D>Xm=>f~%5EyhHN=~f9@dPQ!fsF1FK^cQa+w!CaXgi$CVTk%}{ zGwB5BsMD=fYae{s-_!FV?sDtPuUcz%qce^Gq_+nrjZp(KY~B)dv|pQt^f;uOL!(u6 z_uXz|pHVHXE8|@%#!#jummNMpj4Ygab9g~3%Nx4XLb89ow2shxKp+43AfwcEYx6vn ziVwu&UT^476%C!*yuQ0WW3|*}2D%iyiI9{ePDQ8;=|xB{LVAI>&f?d)8Qg5H{dub~ zv(p>_#5_t@$@0%nZ|UyhP7)53e4SsJVC(|}>Vn%`Ee%mNL>))3S~z>rs8NRU8#ms- zSKp{8g`&1`aeCAMXyYkqjt-y)VTfgJp6KrN|0WH^x|TiN-h(XthT1q^7@Q9 znKF+D{0+&q(-mS^{H|~lq^lvl3c@wAc&0)+on0@`{@x;nkP=e`=?X|^o@D=1>Dir> z^7Q6J70X0A9limN%hR_NnlK9gWQXvMHK2}0g2U5*(EIpcyC6avq~~YjFVo(T8W}Oh zbDnZM@k*TC7TWZvu3lIxGJ2|7pg#}4Gq?13?%fv!X z+@JAkX;X%Xw>mdE+O&`^E*JqpI&GcinKlS-V(Ba#C>N(m0iI+trIU%@AWNT{8>3Pt z$S5AKzbk#E+({>wS=v6Fp>%Fgl1`9LSDzjjbtvf>Hd|lrI8BPZ5sPXMkzj8WQn{yb zZ{%$+d1VUsa0jwiUbx6f9M_cVhe;D4W(~dP?Bqs9lUo+Lg@x^|^6Fs|gg40I{nJ)v zoHzHGMR@E(xivJ@G7pG(luk=KOH5CDPxE|tb5(&W1WvrTSMt*ts0Qb zbKyV@;fy4nh0CnINihavkD}y2!$K)5C4DAj`m0Fn0I~2p{JhQeGE1+8bmQUv2{ET% zAIa38z1?|r{_e2;_WSc{KrH;3bg7pwuZ&5scotqM{kd?Ugme|8D9e$_0sP2OlMpiO;RD>B}rdfjUr^-%c%LfyK~9Z@%7V(YZ?v@GJ&=i zv^U|y&oa|aTa&Wz?z>xJE-x+-E$(IM^zi3vMjhXr8nBPH$I2FS9Ve(gpY`3$KyITSl6hg#ip}J~VLNq)=Z+d*$7@8PLPm$FlU-b4m2x z`E(D2zj!Vl(h1Uug;z@7+t`%2Ji4U2^BY;ZLYB|`1L)xV*Dp$!h5s|@N=RqO zKR?7+dfGIL=snqCt15r`KK~jJq!Xmm0YAR{u+`*@4fqFoR7A5V`k?v@v{HXWoglDSexlQIS2>PqRd_($mk>0}vfWv0;6 z*DUSo^|pFN_Wd_ER7s`mN7R-7F3Vc#-=9nDrsS3)-J^(w}%P zy;Ary=}JgfK)Ql9R`(diTGW_ZL6D=U7LOM;YOfx;EK5fj0 zam!_+h4?tCxqO!!(hZQ_BTN7I^%Z5%pzMsOu%!ecfZ7h8OdrHkx&H zQM|LBg73e-Rs)ucL-I{rG8%;yB`d<+LM5XkT(_INW#xdaU zM)?^VrJ}Wk3Y~S7g!BnWuNiSR((y%+uFl^o0DApiEufhoNz$Xf8br>##QO*FCF$zq zOiIHG4k29<|9kwa(x1zgd6ceBr${yKCIu2or7Zok@COM0OjWyH+ul)&>ZXBuodLTJ zpnUj@EIqlClxfl%8U~PexrTJ)K<{v1thYPb$pYyEklq35stV~%4GrWO=q5L$4~~w# zv`z$7!#)eyk=I$;8k7b=Ol41J(rc0DG@D+MW2}#codYxk=s91KE%RJBGZk|pygF?N zBr~24nnFn!L9Y*>ae2_NY>;k%^qRG`5FPB!QZo9Arb8r4SN%ijkK$Rl*G`OL0ulH3 z_*bNVN%kWONLRY8r1S1%5pu+()UQR)f}QAfZ@ZA1N4 zt(^_jgj}Mr->7~8hSIGUB#eYe9M|brbF literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_smoke.png b/InscryptionAPI/Assets/BaseGameDecals/decal_smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..6bd48df878a99a95297ecb3ee146e13c6e25203e GIT binary patch literal 48541 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%0D=a=9kz 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 literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_3.png b/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_3.png new file mode 100644 index 0000000000000000000000000000000000000000..86b02813c2f2ec0da6385436d9dd7cbbd7b2c45a GIT binary patch literal 1330 zcmeAS@N?(olHy`uVBq!ia0vp^wLrX&gAGVZ{9&*MQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0V%NOPv^?Bf|3urOFzG5N{u_JvMWUS`Qr?oL*|`vtDA%dXB8 z_*fkip;Hj_rTNh62ZuHt+9q~SD7D%mQs=FhsQh(fJC1d?jADHZmrcRGg)rmhO#mwuF;$v=eGX4=B9x_jq8)xOWLqamVAJmlF$=>wB%EDAP7 zv`nA8Z0e2Q-+q5C`}_U*^Cx#~d)HMgvMAACa3x{|Bre+_E;!j&)2p<4Zpv!1_fTgr-! zENgcMUbNoBSaTqc=sSV(m7 z|2eLILhx zTcLpbw)kYmTeFXFf1CfcZkg)M$vOAuC#T!R$XCehdjGOcNOa!Rb^I=O-m|cuY>Vc- z`@JMhL{#p7?fOIFV*Sl2hu5~recw7yMQrz?g8m=2d=q#r-c@SunxB&VP*>>sjYzXQ zJD#h)s1vH+ntnbytVW@rA!ozh#N$R=_AUMH8~>B-0P7K>JqwKb?=j4KBI764{h{a* zFx-CstN(aw>u0wNpdXJetXAy3wm8J~74yPPThF1y!DH6nrq;JRQ>t$S%H)`3=qvi_ z*jR5?ym52V!e5d4sUGV;sOC3(_@0pN-6rLIVV870b54!$1D3)M8+q2McOFeoPh(N< zXkO3t@o%7+$hrq9p@RFC8{b`1@$|7uDC5<*nQwRv9+xxBNqP4nInjC3{I78p-|k#` z(WO4qxFL)J&PciexhP~86J>5F}54gu4%%SMj)={F-Pyr;Z<=n&Tuzn5dJ zd*H`H+sDlhR@KU!V1IW#qUoF4$ELr$57MJ1@i(RX{wKr!f${f+#}8`#zb^)+aO3+7 zaxxmy1*R4EFV9rGYJT^-xJW;9D)Txv`R`lhRAE6qiP!So${9w|-1!rC9An(Xc-&Sr z@L2rYo1dq(%5#AAe~IY0wjF4o_C1Cj9T6SV!Kpp@d4b?YfwiZ$p;i1&E>0x1&T+~=)?Z89CQAy*#k1z)78&qol`;+0C_QD761SM literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_4.png b/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_4.png new file mode 100644 index 0000000000000000000000000000000000000000..f424a824c30a822af0ff50fce2bdc0810266f5f0 GIT binary patch literal 1372 zcmZ`(dsNZ~6o!0-MkK{p_?$IUENwN#%_j(obu=}>QG}1qq-CWk7Ko2TMN5m*tc-0w zdrFDoN5DbNEVTj0|LPrOA3CK z?#2XSjL~>(B9r#U66l2jITYd;KmwvSBh;8hBdbISWgtWL+~ zY0D438k(lxttd&x<5UU}S0(iuU6HvySy;8JG2@Tn5y`q=Ck`i6C$UG9D2C$hcQ zP=u{VCfD*Eo!wz#AL+~nO8i|;NiM-u_iRO*>MXB>VZ&e_6kximl%T+eqiU^0-@NdW zt$vZSU48<|56bcrR25ygCb5%6Nn2X0J0qsE84ArK$vstg=koiRZMO_W^2gLDT4@Wd zRKFqKI9u3j*ONOxd>S@7MCD9-8aWoIitZt^!wL$DPPv$l6^yeC;w$f?Bb8J9Oc3ly zBJ{44XhQcSM1cvJj&!T=9FF%_9Wt#7 zS3E`-E&2T%nDvnaXonNiH)5uvO007LYAB|1k$-vG*YD0VUheM6cBIAfz3#Ecv|*47 z7#W>I7R9*=k#I&>bkaq89!VGKey+ja}U@*8&arDFOjUHw3pX1A>urU zu>K;tYb4{fu;7EV{9}f1I2*>_o!7eIg*fa%Z~om-Loh=*_&K6!xM;!DwyA5x%{r)= z`wvtx!$^lCe((EiF&|j<;Uek~W=hmDU!HjBXy&oCK+jhSz}gT$!Vru?Vd6i91dySa z2^K_HSYgj=&vRYc4clDbnZKP*BRh4!X|Br^dOFnn?`Q6ekxi2k` z#JpbLpS3KfGOiIjbWkAK3pgtcxDsWDw>?jV6MdiDMO5s7m+hSMXZ<49c(h|6my)ZI zm){GB%E5L!WCG$PLdX7buvT`QRF+H76eyDDhq0v7EZ#uT)-wxS%^6?7dRd_Hb52cD snAJd{CB*A8D+a({d_w=@xXI)37Qy;=G19cnhuoI}q6xA18@LqCzu)VDUjP6A literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_5.png b/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_5.png new file mode 100644 index 0000000000000000000000000000000000000000..93c2b6211bd0c3244c81cc4273aafd5b30b634be GIT binary patch literal 678 zcmeAS@N?(olHy`uVBq!ia0vp^wLrX&gAGVZ{9&*MQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`ISV`@iy0V%N)k%yhm5a|T{lYl ztGM_@@x3pe6%D&SZg%=qGf|tX|3kuNrB6EVBG0nUuaQd$JCI}M`k{ zon7C$clq!2=Ud%(u|KYFvnW!JHn$PKnkFLs{HNoJ<9}vPnQ(sR#I>{MobLRb>2`1; zZ|nI(%vY5@Rn5}omS4F`(tJwyiQ_RYYs5Pry{4lYdTcCV{zW$*E-WLKRb2E9mZCxzqR|d@_ZYCJAvCDZWhXN+-R5f z*7yDg)`aC*jytzx+WlslbI9*%Q&DE_H7@;n&Nm^t>Rdb<<5J#Ep8rqi#zGD4=-IxL z?-%6%`ggTx*QR@?=PuQ(X_;%ad`?Zi$ZiiU2sNn{1`ISV`@iy0V%N(r;B4qMcmt)-g&np1Xu&!*I$V~p)#4R zYQox-39TuNcmK9b30QNbTI}maiPtg@no>GXF3?-5@l6_NAf@1g(7(T>Pg;8}Devis z+4U&iBYY401J)~#ieLVm z`~SzLFP#1Sy5)-C#MPJn|9tIj9pBPyEh>7nFZqnyBgY$&HtgFq*N9cSKD1PvU(B#| zMRA@^jmnkmc{50krk11O_ zV*F-@KKyvnpzm>2>HGhZk4~_!@;=|nQ@Ho!niCp(*l3|9mp~B4gbaZ zU*?0#biMszWq#rBEY9Em_WHG^v&>J0>3TNeSJkFRoj!N6UQP8$vD}kOs?Uoa)y#@2 z`Llif?sCC-E5s(QU%qqWhl#6Ze{|T{QFF%i$XB(%x|sJrPR5zd{_Ifs@MnZ~$4#}J z4>a~@@15D2H!uD<1o=DGJ7D;DG( z+_V%b(=MkW@*%f{u1S9;lHF? zzU@PlTg?1TT7SC^xmz?ux#?xh`tjm@-0IACk56U^?wn)xe(&$kuOCP3ms!SB_=NfD z(&tWXJMN`~rPMGz(Qo|7pks8T@Wk^wk#SWKXP2FHeST!1wa>FVdQ&MBb@0L+)Jwg3PC literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_main.png b/InscryptionAPI/Assets/BaseGameDecals/decal_snelk_main.png new file mode 100644 index 0000000000000000000000000000000000000000..eceba729abc8957cb70b36c17d12ca02ada4b05b GIT binary patch literal 3335 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 Kr#YtrQ~n#q0gdbc literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Assets/BaseGameDecals/decal_stitches.png b/InscryptionAPI/Assets/BaseGameDecals/decal_stitches.png new file mode 100644 index 0000000000000000000000000000000000000000..4127675dc9d4eaa4eb65e169a71c6f0fc5f32257 GIT binary patch literal 16124 zcmXAwRa9GDw}yjLv=l2|q`14gI}~?sk)pwZLveR^D8=2~-5Xqs1$VcT?>`qi8T)39 zy?oC1eP+0-vJ5&3AqoHhK$nx1REPfiK%XvTMCkA57k~)#55`4ZMjTKzMSKW-f&VV1 zBnAM~#-hHMB0%3iILhj}005tW|2;4pR%9LkfN;E=q?m?>(W%d4CY5C}bMkYSl$GR} z{_dyN^YrBOMvGHh?em+l1v`3LWZJ+lC=_t8fjd?1YtmR&H~bV3a6AL>PX2ry%o)g< zTF$W(CjN$W-ytTW#0By@W%T|hIPFP6$b;Y7opYUi{>5Q#L-tsVLEA-uA1}QS8*PsvQrp+~7M^t6;uX%JrI3}pUL#d3C zD?Y+MRIrMZ1R=;sf3^%f8J)eb({3gGc3|m3DZ&bA;43s5-f?+Qo;mGvFAh~i>{Ow6 zy?93l)kE?qEA$#pTH_;rt|~?n(Ukx=s|aMjqGHx!*apYUkQb}-5jfYkS7nj-^!6{| z5o>+ZFHzgc_ot~zgazW3!nZN{eEi_}0m#Le9m9|}-K5auO34MFZgW%jpQgo)5M|u5 z*8ByT0vxZ&FD}H}mr)nywt$?xbHNr%vImq!QpxfJg@uuSWh0*dIgIAr%e}$gT$kx? zmU?Ps_wzgbD()K-%Ieo!;?{eg4bijTwBx&1BHCzn#%14xCr6CneS}@D4B%k9E8i1C6HO`TN-N_o0Z==||lI#07in5MG)!!4Bj%#IvtK8#Ju|pt|eV z$xQC(MTz4#BA@|&Cm;a5C#wi+&YAnDdtsWLXYTl3&F)=NKTMcUdxAKFq4+I1=2>7= zvYFuSy$Dk1=84SOMml^oh+yePihT1x3}ulSyj6nLXLS$}5Twq-kZ|D;|U znF;AvW_}|Fc8G7GTDj3B+ud+eY_qXNMT*MoEs?m<+3#{Z89zS#NxwN$?vz8qE>zpl z;kX@8?k=o?!@lHwl@VcOP?f`?n#Ukzs{}%zN0#Qvf|@r0@oFy zA^PP|T6nws>jLq7ozZ1E%b8~?eE%-a*}7S^b% zYcopth8FU!Sr2N+CH*;M$>IGZQiQ{hFDwc#?0fQC5X&1rIiX^sRv&R4Mcap-7V0$~ zktVBqrfhh9u!xx=TNX4}6)^nhtGrl6zD{`6(nJJY!RVYy4AE@|lL6aR6O!p&9*F90 zoU{BL`AAA z^UQI+PS3YO7dq`!1{Yh&x9+@5H2!+E>f6t`pu{?YTqeJbEdGFgjXyIXU4?Kogu-%*U z%S41AnKJ|jM{6@hxfTjzV4}*mz^J!);CPGfTO2~y3NP^50-H}j6y_l%E)^GoJo9}L zas4)H9c2Go5AqdmW0UI_WWG}IrQ{mi7q86kS(7d2Yg?D}R`{KQ0|NWI^PK{-FF1kTuTT zRywun$<1dDXVB{=AQ3<5+NHe$xUZD$k|+>Kd+`PjK$l@f1Wda zuN?Gv_#N@F(|39eVzhA{QaoPx(^gVTRArc=EIZPiHo0tnu#?X4BAq~GLkh?CNW z;GKq_d5ijCtz^YJY;{|!f9b)Kz>eUl>S`LwSi7G%ZAr}zG?)N|VF;lCCZ8!|kUjgtHDWE_343l|#Y(O93bk^PADj?jPTGsu z$rO%FB*@Jh>|vT($G zloYOBc=@U-NPZ9BHQhoahcl8y?2M&=!O)cQAvUPCvM$P?PDOLiqWWpuc*KO$9ZO+Y zKF}|c#!{>@jW<7BQXk%*NcXmdOt!*fEbD%#=gyu8QMO84PY;~Q9vNs?0Qc2r+n6%6 zdJ^1leJO`YHERVGCAcZ_prj@IQe*2iWmB2Onol;O5|UU@=5!^<~6>GA8J3tG7m1|r#3 zTDDP%`G$2p+H50`YDb=VIe>ROxU(tNX-V-AuFN&F|=E>`5d(-iXXM9zzGCA)|8fXU1(9xU3rK{ePHRl23C2Q66b>;4I ze>S?YFH%bQMykyXUH1_K)~C~`B%S@J@v{sPR+N`+2qws&g#}Sx6z{Uxa)za#LWi%^ z<{8M*k^fC1U8CKpgEZ%7ib?$EYiR_gA`N=mqT{gEO&z7H_iYzGqvp@(-O-ONG)=CA zG>h8TGNWbZUwYV5Vm@GS0EMMxCX8j)b7**Cxoy@k?}NX`i*=7U!$1DLW~E)h>>?Tbxam@oOKMj$LwY`ecc+W`6+mEII^>zwPPuxJRhBm}iFAgeqK) zNQCFzOWb7Zjy>Y5lW$UBwbFrPudrAmSp&LZ6jH^`gSLiK{I#1<&J{J8i#@Kr+jl3g z$epOrl;VLFA8yc!ZRWWXFQ3|aMARaK-+7b5Zs=kBs&}t*s^EQS#$Yz%3x<7I&$sWs zZEOVZ^EI`1X`L8xZ7wTp?)}8$7|GWNN&f#{6q(`L?|AfcsEvo?VWNBKmV+%E>2V_d z$d^ib4~=2-#M}A}95-~cWngWT4fKf=+vZYtf=$`hWj)`X^;!o`kBJ7)fWqsB75HQf zR0Y`vfzw=9ABqA1hD|rZ;qd$#;1L@1Tg5dEERWewrnkE=S@uIitXeKfYmI*;FNNio z&uBi~gShY>3+HWovvpoNse{hApU{TpzC*5e#HRS9A3eiKKccn#!X{^FvtpG(F_nO3 z4p-Wh**I0&9J3#pNTWzGVax=76BqV6VVZNTix@I>aDAKV>U3(@AgZ?Vlk|K>3a`lD z^x@ofBG;7g#mticlH&IHYTU;aDg+Ziudz`ZTkYQkzUy;8CL38b#B2~8O_CX+agriT z!){SZz&E9nm1E8m<6UC4Z&~W4E!ocQ6Lz}8OB3cDu@VvZ6u0q67wT`Z-emVME~z1! z{|hN~+86g`6c%qxv?hW%ZGj;=sYEd`yaR*+qQD-t{4|zTXrfxJMkC1 zw8d0(N{IFsn@ghO3aw3#vALBh$vdAyFPbFW8MSnV?)sOos(2L_7);a|-ty%%?xV)A zL!!SnV5E%Ek$WEQi0?OqlMaxTx~uHRqd!AGsfI*U9tHQSd$ardu!fbgr32Cl=yz^y z7@!L)Q8rIPv!b6`YcGX5guU=qkP&Yo#)DZIh+H$#nTa?~(}bou9cSwoT-7NVA%{6K z?Y=Z29o3#Hi#3f!O|0Aw#=CU-ou0B}M;FwExC=WY2hNsG&nC0AR5<+1Z^}ku&ANYY zu&OxR_4i}JW+qdSvi&hy4*As`7YOs~ay?G7h_e0bt6nq+JKOw)WKUbs-VqyOR_(<_ z0!No5W=u%|gDLtKoMnnNPEcQkd?)KV5VtS)?1y4c@@h%#YWelon(PX# z`mgcQU&d_GN$Pu|hKx=1jJwP);~le#gTBHU3NLm|Ny7ZPA2Fg25}s4bf=g)RmxXS8 z{;mzmVW@Qzof%HeF8ZUz2^js{;}5`up^9Uz)wD4&F~P>_hz(h<8vZ`sDxrq?EYRi~ zQzap`d!|vE#Pi8^Q=;_+u~SPxj*YaHzw5kuPyLH4z<^K&I_-tB%vz>AnE+la|f%@MUGQy$|XaW+dI9M;n43ab%O^tU=3fMVF{ak2{^mV8n z3I!D&F10E%dwLiaI@+y5w({5KDUlLj&WG$cd4mpBTXkp&?&=uh1w46O(MN4&U?SLh z*hm}YN3r$K)6mAmd5a#`um_zlayLpM8&Orf^ZmXy#2X@eUp>X}9 z>4yFDkO}R@_;|?*%fO5M%`iD!O~NV?#JQ|VdUrjKh@MXP#A#(GDaahgB)--5?~wq9 z_m=yq!N2bP@^tMKy*(oVmX}nqYM*rB>-2yC1$**y$KZa8r46}3(&br#7xHxpN1e&f zq0L9Ggw|+=PhNF5YRrI6DoJ8kEIv@Qy$)Iv8bfl#B>c%UvlbCW(Ud!Q5Qx^~=XQvsLU0;W<%^hOVZZ-K=o`BgK$?HVrns3a{E zBBO87`&mMU->u%L@NL48zbmy-zjv+HV@odB48ZV>_-l{5?O*yLTbo7#(6G`q#hAH zLSnhSM>qm<@l}?i0w#>>DJs8CJ<=eJS!I=2Fn~`GdRDu7u~=q&9nddxyW8?qsJK-B zVKOdrG}~BUo%TiHE8Zgwzh4|cq;md;@;3~>tSJYI&Lm(GDd1)(ymBh3YV_67R*|YF ze=bH5u%5aHR|#C|b{w3LZH|xdNm{zMADeY(NLRZ50j6&dfCJhc1f*fii2Onb;iLzr zsh7e-K8vKfTyxPf?3%%k-x>r$5~o zE{}P&WXD>cc=1J$^wK6txD>{|;95OG?6Yj|f$+CjM6dLka}n5z9oGg?V{Q)bkgF^G z@D`=G+roW}8Ewp(kvc?4SmL~%G4w%=2_B>AK+ni^_9CW;QGH6IyWhc}?Nn^f?F$ns zj{?G*T(My0AKaZJwK^$>x9RFVUS_;_!VNkM-oa~vDIXJmvyA3dW9g#vhNX<2yVWw9 zUt~u2~B%GFaX*7fm#=JFF^>__kuWTl+p*zV%^W2y)C>ci0xTv z&rH~R6Ww-1*2M05lg1^sKYXO&27`*4=WTB~Sga`CzLu;<%yONKx50u6;{uJYnhVaQ zbbs!pMND8Z$S7dzxX=Ds#8_sc#<9RdRxL7JRA0FZZa2TYSH*Ce)AuFUC^Z zWP8<>@YXe02QqsIdK)GpD#qt)KV1cq{G6_ii}ahc<9rG6e@D(XS9_PM7Yp@uznA3- z{WsB`No|3@DFcK2C)k{wT!-85v8~izX!m%b!`?}*=Fs`BgpzN2wJ>-$QQ=lR^=3vx zns-5Y_`Yerwm(_tVN#FrW;nRlZ2GijUFIGD`7`u^(fmHtn^+LJFBHBFzJt*x!99p{ zb;(+g*GN%l1MA^C3`i!-bzE45XPW=M*l;3%bBC9ab;7ClkT<(#)hJ@6qO)Us`MAi; z!3AUWJA_mKjeioJ1pC{mvr|Qm3#uvET6Q`PYzs?kZ4`OUeD#sKtLd9_)NJpuy+LiGA1Iv%=V|jfU1C{Zyx3D#-xGXa{rt zW*;sbNUr+_Wack^~ngw9|Ki#5Y2M&%icn9+;AgjT8v)@ z(?AzbT7-{FL(-dD3Z@Sw5xTG6;@VO?Q-9+()abs_vYu|f1eMp;?1zInL$B2 z4x(xdFT>;M^KR;&i}{Bd^&!e%3;8z9&}YPs-i|OIjpptPDwLN^;vx3Ee(ITw-$`wx z16h)M);8DzHnq_oFp|7C`oVec9w{!_qmETBAModQP8W=pY|aLMF6?bPZaqwmE<}ds zA-ODh#Ex%=BMAKi9;9o{YRFwOSe!joa?B`f9RJrJ=2njZLjVpd0q{|fY;9$V`ka`q zh}3YiN>HNBFW-olJtaJsI0`Z4nzTv#px*(XGJuDJe6!l4`MO=M`#HW;?+ul-ghZ10 z#F9W|U^u^5o#>{;f}&X(UZl(7)QrQzXiE(=IA@v`uU=r_(~%VBty8FOSg2JhY&CaG zno0ZpO)wrCl&!w6#AE)>)2VgMH3k-ua(dM(ReU;{$g#Ow0ZN8oFWunX|W(M?{p9);3Bk6nlLUE@!UJJB;M{cq`!m zm{c$>-+!4tU>lZ!MyhO&oM&nt4iGs!0;^tQ4f}fa<)E#51gX3Gr}u@Wzw%;nWg9bz z1K2*@M!RXxOpF{KlbonW$aTS8D>X&T7|uB$Inm4&`R^8tR#B_KB0mz3mIa^*KGB(j+S3Dms}p(rcw&~bYDr2iVa0|{G@41(|=vNpd0PK!k_Re`T-Cy2L&bj{= z5k+fWxvOq;T2iqHvTMl-&B_nIA2>#cXk0ndxRBcOP4R*XM?GS@yfSC=R?WGO4h{pv zhS6*usX+kXz`+D_yQalC7_BI)OZOHE6kAJH&PvL|s$=A|E3xS^JLz)gU0-`ecv+Edu0T&oh)tz6i} zF~Dw|GeUD;$30F&U#zYta)wuEiA_mE4zbqmoix-n93yqGy)%=r>(2%-Tf+1)#} z;6CAhxiG2J;Vx39vbQVC@vBJ*6HLPN=pL(|@*8P0e7EHsy}yd@A+v#fKT+j=W7&P` zCN&|bJyWJ%Sd+U{H3aY`0klW*?q#TEupCU2sp||vud}W)9l;9`EZ72>4uK zB%+7Tc`fHwkr5E-o&XM&jof{sIi-ff;{N)Z*))Xy?t8y|6eLB;PtXJ4(Q7mFF5axj zy{%c)%>cIv^|iF2&W0;xs=wC)xQ>l^cQ4KtW~6A|DxLnHNwBjxE8d-2`fnc(p`Bwd*7 zf2~7yGn7qm9_uHv{WOvB+1lJO_nZcSBg@TM@i!s77LMcs{<xhE8|9~<`K2}%^5c<_>DHVVvTyPara(TPCAMlq^X^xn4n+Y?Ef(B>C=DxtjKZ4L)g%e8;+(-<}`b=S!7WllZ5waQ=3_>w3?-7F-$|o`PR{xp_Dg` z-sl+>eXUiPuhjZX)#`@U1I)KccE&dBpHlP$MYlR~myiCCm4bc9@omX+o@`XukdJ5v z*MH!!#qUQl==x8&h4(RSDZ6ja21p3$P4oSdok`daqJSjT2TcS_YQyl8@FXOYeUZlG ziRBd$cOs=DniC9N{=quispvu(ls_sh%&Iq4Q>-Crmt=?k?F*=`_+Gat4MTIXaWL97 zPV2DHx0#aU(#wY#Nh?D96bB*AI>@LyvEnIDy_EOQqIL5u*WY!8sQ!$ygSoU?n>NTVy*#=}@yIdf7zK?Sa@iy!6fa-eG^NLe zW&+VAfBs72TS$WQ#2zIM@D1zhgY9J2=I}1h3Wo!lvk}xzHOY%n*xQ9*u6U4r&#_MZ zNbUFzMl<@)592?s`G?F3K>6Gh%}9Kx$4YP!{iK7$|H5_^Vum)yS!DM-Qb~5vmUf#| z*NgfK_41>ZH#Z?rj}0y^X@oSUrK!!4GH3&-H@55FMxn6ssk07D%#v`iRw-<0P4m}Z z-U={Nt&?Vd`}^Dz3uxhHq-+0Tn~?VT}lwmPDsMO z&1J6-vb|ovGwh~_N%ocaJntCdj{sQ`^DJNfldDFHs2YMW&LdD^6;GrJYJz>LYK>p; zV2VUSAqZ65eWC>z!e`;wum2qxnneyk2tbIKXM*+I9vht6Hst6ZE;-u!PAelKLGRX^ z@YTEk&Omrc;AscYM!swA3dI(9FA~BLZp5nfdD0Zpej`SnBmO5?BKvv(Fvf9qJW?=W z1%cBV$QN{xvo-yuY#SY3HV|I(MnU-rl6t*?mL6}r6a?=&=`G5P; z^s?`cezPkj8Gg7xf`>@j1Y4xpK+S^Y$=Js|>Y%FanuyGE#)LC=2(a0ZTfkWy8T1}M zRVy&hPA#B{#(U6^AtH+jn?X^WuZd&)_gLEIZrSZnd}g!u2FzyIbQj6^PQdzMi@HyvkmU$1N?S!$46k2!r z&Za9Xv=|YrQe-%hUN`Mkg%x{OHtSf88+$VrK67B;cC6JXAO5=fMh{V-)SRC4+|rj4 zBXsyrzLw4FZ!FXe%%v?6sZo`6r}^dK&WU%_L>b^y82-?kF8(y4VZ_UutdKnlFX+cg z1pFucSh0S$oR-^f^_ccM%2JB&AIug~3rmGAye~;WmvskeS&?V_T6Q<|f*5i;Zg7(o1hut&d{FYc;%JZRx zWuWBCw4M?or&^DTY)?d9D*Q%^Y>z~&2(T~$+GJ!)^-IQ8&RIVQ7CHlFDoYQIv1UeP*Va|T3H54QpiUV3ENUZtED-RB?S zfUkZP48_w8&ZRsgc=bO{fv+4m;|}WdxI}Wb>CAe0PApJtqYB98Hv5l;&{GiYXp)2E zW?@{iN+pntNQA#)ju`V%HL16u$cBA)bzPoDxYNh(A{81(Tf^RwU%_ssvlON905dw# z3xkA;#bIX1{{GQuR$FmP{+B(7T13E{5SiMexo<|U(_v#>5UeQnAEXn2;TTmKM%L&S z6^AR0dbnD`A?{9}xyF+oLzXo{9iwQGNF!4au%{%^n3^hmBvf~!Jv!Mfr8S?xcC#5?%%1J2$U)&NS2P`qvdq@#{^`>+-Zfp+{Azje!(!-|XfN_X7Cyrp_SuwuVjuu$gZPgi;~gKiqU!B-S4zBO|$$lNAYKn__|PrdA7 zUY&ttyf1KeF33K0+_Ks17kc7HRK#qziF2zNMkm}unc@0TeCqLZk#F99dxGI!;W3!j z;IdV3=I2|)Y%9fl)q(KGpkjqHpGL08HtUY??&hZqMtofW3M1y10RQkt_tbUv6U*#l zh&P<>OEmo1Fh9Yzwhn8YzfXFVxzW>3k?cVgrJ>4z@<|rCg1fZ$$&pn!7*MUH`$Ppm zu>XAa86J)30$jDqxs3k2u0Ps&o@eW2N4>M&U%FIpgnz9RY_>(LTh9v-2hnVlAerXW zrmxzUFj+OH5ldc(E>O)#Z84NW+Q|U_wFi4id^-BY#L4-x(w0XN_!Dm)5f(qsSOT;P z6uuQ7*?Ga!cC=soI7#bKH^Y&h7X0GZtQTD z*;On?SYxU}=VjNAg_A01Lk5PGHqvaihjniyI$i!P0KHM%y({5)RI&A9LWk{kN1Ffc zZ%rI8oBmYploYJr$ghs~cr*{c=2}A$%3t2@E0fd>qULbIZhw*zp0-R5$BLEFQ&<9x z-l1XP=A$YPC9Twu9PWzMLJHVmt z6PoDz$HRr1;l|oHWTm<&u<>{aK#-KG#pBkX++vk;*6~3{n#%1!6S3oehlwJ6@~6Ch zbn_X6OM=LcifR?zS#$M7JR0@GE^6=Cz|(rd#wX%p`|%srJOmIC8wl9{TVb@Or@P)g zvMNjOFhQ*uHBfM*P8#Yw(Mg#joBW-G0S*0`kD0+DVH5apqtCxQz=9IrgZW{Lgd0{O)K4RTSbJv3Mr2cdG1DMvj2Yt&uBhE)U zQ)LHNycEJ-?V7Sqb)!NSAuq%Me#}RfY7w34C7RRUjzXrNLn6dIKsElMNcXsgf~7it z_^SU)7@*5Xg4on$W#Y|@@h|b%01MMsiq*IfHmz~e_Q9~|3lXp~&HKG1|8nGWi(jmV zLHGDC?|0#Z{rAR%Fz@&dcv6fDfC!@f0=o9ES`ePk&AZ49G)05nrMRn;h(6G~afNq?Oe@j798QOiQkG;DP1SJ!W)f+EPB&j#D>5!kP*~8&>N*^K< z`L+ivs6Crb?r#ta1B?VneZ8n~&nNM|v1li5pR3Bd2aj73IO!<;NbN(;6dn&{OjYKd z^$lLf*S5KY&UY7dzM0$H6V=YI+m|aw^H>fZwtna7SJat0|BEiVUzr&4OPfIH47O@5 z0sk>JXWU=BC7c|WFNP)BH|LJxZODi~G&%j#eY_C+w{It!c&S4cA`9gz(Y(pvMcO2H zC!*Gm!r=u?Hmt`cLj{$e3l=RmB>;uhulDkXU99m+SvicB8-$-fdnDiBM$5ZSS+RRZ zq`fGYOrlUADabI&SZgnqTBO}lf>qVRWDki**$Ezm$82V536ofMU4vT9hitH}=c?B^ z8*@dwQ>IKOV;h2(0uIgEzRw-MMf(r^SmmqK3&yjK8Zr$ctKbRhCGxMxbx7_!4k^#q zk> z`6ArhW|tv@N)lWqI0yNTq5I?02Vjdq;-s0|s-pB;+2hp4ZKD~_bnQCY@mj7EAEw%r zZ_?G(H>vJ>yM^O3%Qb`QPZ#&p9N`>0p4-~}%e&e-?XKD2A0r7`}DIv^^EO)n8It436(v?A{Z}9CxAz74Iqa2gyK#?_r3~fbWD}=NFY+j}q3P z3-VgG<*{eRPY?i1UJnXWl1lr?SiF_#iqqI}-E=}@r0p~<4jhf#v}(rPBL$hajY7Ng zm}PwdI*8IU0E_IPuZ`nJl!4qblxfQ;p3Pvuz1`_esO*@A#(=@NN4!HZ8mRD!Ck5ou z1i%cj%w>Rrboup%2&jtRa`K(TSl@U&7Y{aPdX7&k@Jv;Qb}vCtE4>cNKU~ZJJWee- zw=UXHP^(hf;f4R|(@$vlMx2Z4q0)$`8CMl-t7Plr4Mi`>9J;s)O_*D_K#I7M!Z(ZZf-ot)B$Hj;f^}1X$rtza8XPQw7 z&GeF-St!e^!7!=^V=NMI6K|ZABJfaZb&-4AqE-Uf8ZYm{&v~jH|_)i zFHY>pUCYQNbAS9cGv4=Edxi)B=Y|vxb!>bql219c@L>MaZlOy?Q+`F zf*nFc|CJ*3Q{1W{_c(6qqrtfQ2E^;Y{dmU#+v;9o5R0TBOuli;uZ|Cws5#4MAS8fntWK3k-FD}p= z7_lq14i@zHJj4s1MrdhbXh4##{d=k2!>9*yt6$j{;w+}(*r@$aB9uID*U;@FF}Cby zK4asnA1Sr521OlK1ohrs`_5aT%YKTF@i+ZC(q#M=qAWu1+W+`JSQ0JTnDRwuIvgE< zPQsFhL^U|(nDZ!_y7SB?S>BVwu-nVTWD84O(Tx}Xwx&C?djDR!;{=YhMuo^v81>#whEW#s0~%iHB+%XpIJMl z=LhQkWqU$(G`wqD<;cg`FT-mxn=;IpGp2`2R6YHCrvMToNn0ow(E;BEy;>|0fa)aX zT&wk$AJYUFap|-Z*M#=V&WDPS_yc?4Zc-T$Um27$9~Jt8Ct~URLh*Z6&Rr}{gKm8F zD%FEewd%cEjL;B;vUta&>7jUxBrFLtY3-tpoD|zQ0yC*6Xx@t5j-sc!Z{v`@_!A$W z^KHFy=3e>gFrrFR-6#z%99-I>8$oAx(q7PNNyZ}s_cWT}p=tIu4%rQJO!LLZ?KgIa zttb^ht0KF{!iG+m3==f7y&|6D`{;czVCho$9r?ww&Sv+BMXlofrD({ z$%GxUtmygdx=OP`!;J}6j>T7ZSj3JO!KCi%Bo8pQmkgx&7WJx{;wrp|{G2mgJJl&5 zjbyyU2YwS{$Tdh3rI9j7W%5BEMS(oIFWAa-orQyzho&y~yFfGDJQmGw^@b&0>qWCK z3kBegsdnOby$??@%{%efr#g@kNor4%Z|!yN4RO95J)u><8-CJ4+)_B{aewpYBgSrP z@%^r5gF%+>R1Ufs`&X0Uy}N&{A7ZQ0_%EIX+xqz<7U#(vFyaPn@R4N#JtcRQZ&t9j zR9CRZwB<_WTTrkJI%pjP@=G)Gj{he><|xpAt4K^~Ke7lNg){&>fFgmfeQ=;mbLs93ehzcaYgi8E%{t;Rceitm(k1z1S}=;_{Ab>@qPlP_0y^se%GHo%0gSO+ zm@J2(#mr(HbUeS>(hR2Y_Yf5#nGnH5AiT!XLl0mG@|MWI@98Q^xZgzB4_!Zl2I;?< z;|$m4iRF-f-hCz|8?O;xI^Y%AhVhetHA;cHNN^{Fcpu!Ouy~4oN)$P+YJYq4(J0o) zONX_8!-JYV<3Fe$naClX;Zp~4Fre{a{*dX|O3GW8-xR*uO#ML&6;-|CP1yCKc;*&DUMjQAkX<_gD`0!AN1-S4 z%?@UwgOJ$aKuqAR%VvwM#W2|(%BKD~Y-r6z+S+rmbSK_Il#kY66J3x|D4pj7zlWt6lUa4`$xb&}(8AiRj)+C}I6NcJDiM?mUfXAJ#;O zqh;EoYy8gtV;#a$^&L6xi_e~JM;@S3X$bfj7E?2k~)wah^XjNAlL_|3F3dK}A|AQR0EZU2oQIkGXnh~-MN%kMoq46UC}i~hw^w!1L-$t%fa>3o_;39b2(j}4;^VhBAJ_J3(u_t! zUf!3L2j4jV!xZQ*9GJNyhMO@KRZeoq1hS$LyHlfsyM*=R{cKrrpRM%6d>mLw-aSTk z^a{>XA-*Fhtbg0u@SwJj<(9VtzdBv#Xr4<(G-AsReSq6-)8+oC+ekNYv+h)IrIl0m z(yz$Fui1($!>!6-@qj|h+%os+U3+j#;nOz)ALT9R>243(D`!q6(} z+#01TxiiuJ@n2Y{uGjGzje1j_nRkEQ&Qh@o>@xljNjUa?IPC~MkG3d@zi zW%{FDT9(vaU83U)7vH90%X#Fo6jA?etb-2sH$b28r_=ljzRi)iKbbMc@wj{#Y^h5L%Zjr*r+F)m zl46bS!3*rmYY8M^;rR?CtPlx0R2m0M-q4T^-2psdYFuu{(6KJ~I<flosG$zs$YjISpLyI_qB#%^61{Vw$A+9T4w9x{Q9YSOue0fIr&M6g!y_*PN zjj4WC^k=Xhx%z@UI&6~Xs=$BtdQ-TV8F~^6ERG6wjPfZ#+f~#;(s?Y^4yj(2!Z+D* znNlRA4B~}>q1mLL;DNtfbWBf8PLQ$uCRZ$V;V1%_U}7F3&vfEy5L@jlxPyzOm22FN z9lVvFZSC9lOgp8c<)T*U7N$SO6LCTsrLJHJhHQrH$8|C>dJ6YryhazGU4b*Z#*}`o?Ff_OCEBeReJ)EC(=6m3U)qatxb8EKo@vW zG;*&0AO?irUuG=COa3dg7AcapJRn5_K1<`YLEjapA1lZ-n>O1_a|C^0%OP*4G@tif zE6d5GetjQATK6YAZj)GDOc88ofdYg#{Cc8%~>^k$9mmnee-{O!ewhNSxj&)X-sfe`_GQ>G2$!V(ZTUNV@X|@XG8kE zef}Yvx^EcFOe~1pU4Q2PY|2-qu{mzgjm(rUpoy$d@#q_#k7s;eLmy?9B0SmCh3dkphQ&6WKp6D3dVD9 zTE83T)RJ;Y#e&FV^ia;GnXiCFV+U@%ZY=dl6TW`_R({6f>x(My#k6_x#ClSB5S$4! zF`^x;d~sl*SKxqLYnwrGd)O6JZEm$j45I&}kMxBaHtaBo1N+p@+l3sflO5uATALZ& z%>Q#g_mhhV{$0R^CUy`3HS1|*&)lHlK2fW=gH%}5oGp%JTvh)3EnD3`W3{d~D9?)S;cf#ys>Eux z)t(q;n)T9AM-$*d=p*HxfU*seGpMM;KJmZh@R);qu`IbDX2jjVvcY8a4h=duUc@?8 z9qO_lVv(b988U9}QBj%W4T#Aw!yvNg}gtO!() zMkfRf%pC6yu_@;ej#4p4Kk+L5lqMg>x@*ghHh?`$uhLXZpJsV~x` VkBh58pcU%?IVokyDshv*{{uJK@I?Rs literal 0 HcmV?d00001 diff --git a/InscryptionAPI/Card/CardExtensions.cs b/InscryptionAPI/Card/CardExtensions.cs index bdbcf3f5..dd8dcebf 100644 --- a/InscryptionAPI/Card/CardExtensions.cs +++ b/InscryptionAPI/Card/CardExtensions.cs @@ -412,4 +412,5 @@ public static CardInfo RemoveCardMetaCategories(this CardInfo info, params CardM public static bool ModPrefixIs(this CardInfo info, string prefixToMatch) => info.GetExtendedProperty("ModPrefix") == prefixToMatch; #endregion + } diff --git a/InscryptionAPI/Card/OpponentGemsPatches.cs b/InscryptionAPI/Card/OpponentGemsPatches.cs index c20af144..a65a3117 100644 --- a/InscryptionAPI/Card/OpponentGemsPatches.cs +++ b/InscryptionAPI/Card/OpponentGemsPatches.cs @@ -39,30 +39,34 @@ private static IEnumerator UpdateGemsOnHookGrab(IEnumerator enumerator) private static IEnumerator GainGemsForOpponents(IEnumerator enumerator, GainGem __instance) { yield return enumerator; - if (__instance.Card.OpponentCard && Singleton.Instance != null) - Singleton.Instance.AddGem(__instance.Gem); + if (__instance != null && __instance.Card != null) + if (__instance.Card.OpponentCard && Singleton.Instance != null) + Singleton.Instance.AddGem(__instance.Gem); } [HarmonyPostfix, HarmonyPatch(typeof(GainGem), nameof(GainGem.OnDie))] private static IEnumerator LoseGemsForOpponents(IEnumerator enumerator, GainGem __instance) { yield return enumerator; - if (__instance.Card.OpponentCard && Singleton.Instance != null) - Singleton.Instance.LoseGem(__instance.Gem); + if (__instance != null && __instance.Card != null) + if (__instance.Card.OpponentCard && Singleton.Instance != null) + Singleton.Instance.LoseGem(__instance.Gem); } [HarmonyPostfix, HarmonyPatch(typeof(GainGemTriple), nameof(GainGemTriple.OnResolveOnBoard))] private static IEnumerator GainTripleGemsForOpponents(IEnumerator enumerator, GainGemTriple __instance) { yield return enumerator; - if (__instance.Card.OpponentCard && Singleton.Instance) - Singleton.Instance.AddGems(GemType.Green, GemType.Orange, GemType.Blue); + if (__instance != null && __instance.Card != null) + if (__instance.Card.OpponentCard && Singleton.Instance) + Singleton.Instance.AddGems(GemType.Green, GemType.Orange, GemType.Blue); } [HarmonyPostfix, HarmonyPatch(typeof(GainGemTriple), nameof(GainGemTriple.OnDie))] private static IEnumerator LoseTripleGemsForOpponents(IEnumerator enumerator, GainGemTriple __instance) { yield return enumerator; - if (__instance.Card.OpponentCard && Singleton.Instance != null) - Singleton.Instance.LoseGems(GemType.Green, GemType.Orange, GemType.Blue); + if (__instance != null && __instance.Card != null) + if (__instance.Card.OpponentCard && Singleton.Instance != null) + Singleton.Instance.LoseGems(GemType.Green, GemType.Orange, GemType.Blue); } [HarmonyTranspiler, HarmonyPatch(typeof(DiskRenderStatsLayer), nameof(DiskRenderStatsLayer.RenderCard))] diff --git a/InscryptionAPI/Encounters/SpecialSequenceManager.cs b/InscryptionAPI/Encounters/SpecialSequenceManager.cs index e1396663..a42ba506 100644 --- a/InscryptionAPI/Encounters/SpecialSequenceManager.cs +++ b/InscryptionAPI/Encounters/SpecialSequenceManager.cs @@ -11,7 +11,6 @@ public class FullSpecialSequencer { public readonly string Id; - private Type _specialSequencer; public Type SpecialSequencer { get; private set; } public FullSpecialSequencer(string id, Type specialSequencer) diff --git a/InscryptionAPI/Helpers/TextureHelper.cs b/InscryptionAPI/Helpers/TextureHelper.cs index 742e1e45..0502a611 100644 --- a/InscryptionAPI/Helpers/TextureHelper.cs +++ b/InscryptionAPI/Helpers/TextureHelper.cs @@ -1,3 +1,4 @@ +using System.Collections.ObjectModel; using BepInEx; using DiskCardGame; using HarmonyLib; @@ -424,4 +425,104 @@ public static Texture2D DuplicateTexture(Texture2D texture) return myTexture2D; } + + #region CustomAppearences + + ///

+ /// All Base Game Custom Appearance Items, these are handled by mods themselves, not by us. + /// + internal static Dictionary BaseGameCustomAppearances = new Dictionary(); + /// + /// All Base Game Custom Appearance Items, these are handled by mods themselves, not by us. This version is exposed publicly. + /// + public static ReadOnlyCollection> BaseGameCustomAppearancesPublic => new ReadOnlyCollection>(BaseGameCustomAppearances.ToList()); + /// + /// All Modded Custom Appearance Items, these are handled by mods themselves, not by us. + /// + internal static Dictionary ModdedCustomAppearancesDictionary = new Dictionary(); + /// + /// All Modded Custom Appearance Items, these are handled by mods themselves, not by us. This version is exposed publicly. + /// + public static ReadOnlyCollection> ModdedCustomAppearancesDictionaryPublic => new ReadOnlyCollection>(ModdedCustomAppearancesDictionary.ToList()); + /// + /// All Custom Appearance Items, these are handled by mods themselves, not by us. This version is exposed publicly. + /// + public static ReadOnlyCollection> CombinedCustomAppearancesDictionaryPublic => new ReadOnlyCollection>(BaseGameCustomAppearancesPublic.Concat(ModdedCustomAppearancesDictionary).ToList()); + + /// + /// Initializes the Base Game Custom Appearances List + /// + internal static void InstantiateBaseGameCustomAppearances() + { + BaseGameCustomAppearances.Add("CardDecal_Blood1", GetImageAsTexture("decal_blood_1.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Blood2", GetImageAsTexture("decal_blood_2.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Blood3", GetImageAsTexture("decal_blood_3.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Blood4", GetImageAsTexture("decal_blood_4.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Child", GetImageAsTexture("decal_child.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Fungus", GetImageAsTexture("decal_fungus.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Smoke", GetImageAsTexture("decal_smoke.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_SmokeAbilityHole", GetImageAsTexture("decal_smoke_abilityhole.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk1", GetImageAsTexture("decal_snelk_1.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk2", GetImageAsTexture("decal_snelk_2.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk3", GetImageAsTexture("decal_snelk_3.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk4", GetImageAsTexture("decal_snelk_4.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk5", GetImageAsTexture("decal_snelk_5.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Snelk6", GetImageAsTexture("decal_snelk_6.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_SnelkMain", GetImageAsTexture("decal_snelk_main.png", InscryptionAPIPlugin.APIAssembly)); + BaseGameCustomAppearances.Add("CardDecal_Stitches", GetImageAsTexture("decal_stitches.png", InscryptionAPIPlugin.APIAssembly)); + } + + /// + /// Utilize this function to add your Custom Appearance Into the Public Dictionaries. + /// + /// + /// The GUID representing the mod in which the Appearance Came from. + /// A tuple representing the Appearence we want to add to the Dictionary. + /// We error if any of the passed in fields are Null, and for strings if they are Whitespace as well. + public static void AddCustomAppearanceToDictionary(string type, string GUID, (string name, Texture2D texture2D)[] appearancesToAdd) + { + foreach ((string name, Texture2D texture2D) in appearancesToAdd) + { + if (texture2D != null && (!name.IsNullOrWhiteSpace() && !type.IsNullOrWhiteSpace() && !GUID.IsNullOrWhiteSpace())) + { + ModdedCustomAppearancesDictionary.Add(type + "_" + GUID + "_" + name, texture2D); + } + else + { + InscryptionAPIPlugin.Logger.LogError($"Failed to add KVP {type + "_" + GUID + "_" + name} to dictionary."); + if (texture2D == null) + { + InscryptionAPIPlugin.Logger.LogError($"Texture2D associated with {type + "_" + GUID + "_" + name} was null."); + InscryptionAPIPlugin.Logger.LogError($"Ensure you are passing a non-null Texture2D."); + } + if (name.IsNullOrWhiteSpace()) + { + InscryptionAPIPlugin.Logger.LogError($"Name ({name}) associated with {type + "_" + GUID + "_" + name} was null."); + InscryptionAPIPlugin.Logger.LogError($"Ensure you are passing a non-null or empty name."); + } + if (type.IsNullOrWhiteSpace()) + { + InscryptionAPIPlugin.Logger.LogError($"Type ({type}) associated with {type + "_" + GUID + "_" + name} was null."); + InscryptionAPIPlugin.Logger.LogError($"Ensure you are passing a non-null or empty type."); + } + if (GUID.IsNullOrWhiteSpace()) + { + InscryptionAPIPlugin.Logger.LogError($"GUID ({GUID}) associated with {type + "_" + GUID + "_" + name} was null."); + InscryptionAPIPlugin.Logger.LogError($"Ensure you are passing a non-null or empty GUID."); + } + } + } + } + + /// + /// A function that gets a Dictionary of all Custom Appearances associated with the passed in Type. + /// + /// A unique identifier in which you want to get a list of textures that are instantiated with. For example CardDecal for a Card's Decal. + /// The results of with the check of x.Key.StartsWith(type). We return in the form of a new containing KVPs from . + public static Dictionary GetCustomAppearanceTypeFromDictionary(string type) + { + return CombinedCustomAppearancesDictionaryPublic.Where(x => x.Key.StartsWith(type)).ToDictionary(x => x.Key, x => x.Value); + } + + #endregion } diff --git a/InscryptionAPI/InscryptionAPI.csproj b/InscryptionAPI/InscryptionAPI.csproj index 27de0776..84e11198 100644 --- a/InscryptionAPI/InscryptionAPI.csproj +++ b/InscryptionAPI/InscryptionAPI.csproj @@ -1,25 +1,62 @@ - - netframework4.7.2 + netframework4.7.2 + win-x64;win-x86;win-arm64;linux-x64;linux-arm;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64 + InscryptionAPI + The Core API for the game Inscryption. + 2.24.2 + Cyantist, IngoH, WhistleWind, Chaosyr and Contibutors + true + Latest + InscryptionAPI + full + $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 enable disable false - latest - true - full + true + false + false + true false true - 2.24.1 - - - - $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -40,4 +77,20 @@ + + + + + + + + + + + + + + + + diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index fc46d62d..db70334a 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -18,6 +18,7 @@ using InscryptionAPI.Totems; using System.Reflection; using System.Runtime.CompilerServices; +using InscryptionAPI.Helpers; [assembly: InternalsVisibleTo("Assembly-CSharp")] [assembly: InternalsVisibleTo("Assembly-CSharp.APIPatcher.mm")] @@ -69,6 +70,7 @@ private void OnEnable() { Logger = base.Logger; Directory = Path.GetDirectoryName(Info.Location); + TextureHelper.InstantiateBaseGameCustomAppearances(); HarmonyInstance.PatchAll(InscryptionAPIPlugin.APIAssembly); } diff --git a/InscryptionAPI/Localizing/LocalizationManager.cs b/InscryptionAPI/Localizing/LocalizationManager.cs index 269104ad..3e61d3c1 100644 --- a/InscryptionAPI/Localizing/LocalizationManager.cs +++ b/InscryptionAPI/Localizing/LocalizationManager.cs @@ -50,7 +50,6 @@ public enum FontReplacementType public static Action OnLanguageLoaded = null; private static List AlreadyLoadedLanguages = new(); - private static bool FontReplacementDataInitialized = false; private static List TemporaryFontReplacements = new(); static LocalizationManager() diff --git a/InscryptionCommunityPatch/InscryptionCommunityPatch.csproj b/InscryptionCommunityPatch/InscryptionCommunityPatch.csproj index 611bf61a..64344fb5 100644 --- a/InscryptionCommunityPatch/InscryptionCommunityPatch.csproj +++ b/InscryptionCommunityPatch/InscryptionCommunityPatch.csproj @@ -1,19 +1,25 @@ - - netframework4.7.2 + netframework4.7.2 + win-x64;win-x86;win-arm64;linux-x64;linux-arm;linux-arm64;linux-musl-x64;linux-musl-arm64;osx-x64;osx-arm64 + InscryptionCommunityPatch + The Community Patches For Inscryption which fixes a ton of bugs with the underlying game and adds some new functionality to it. + 2.24.2 + Cyantist, IngoH, WhistleWind, Chaosyr and Contibutors + true + Latest + InscryptionCommunityPatch + full + $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 enable disable false - latest - true - full + true + false + false + true false - 2.24.0 - - - - $(NoWarn);AD0001;CS0612;CS8604;CS0252;CS0618;Harmony003;Publicizer001 + true @@ -35,4 +41,15 @@ + + + + + + + + + + + From 48a0835662196ceec18c0054ca28a38022e866e6 Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Wed, 30 Sep 2026 22:21:21 -0400 Subject: [PATCH 04/11] Update thunderstore.toml * Copy over PDB and XML associated with out DLLs to the Output. * Update BepInEx dependency. --- thunderstore.toml | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/thunderstore.toml b/thunderstore.toml index 7daa74f9..4c6e9042 100644 --- a/thunderstore.toml +++ b/thunderstore.toml @@ -4,13 +4,13 @@ schemaVersion = "0.0.1" [package] namespace = "API_dev" name = "API" -versionNumber = "2.15.2" +versionNumber = "2.24.2" description = "The de-facto standard core API for all Inscryption mods. This lets you create new cards, abilities, challenges, map nodes, starter decks, and more." websiteUrl = "https://github.com/InscryptionModding/InscryptionAPI/" containsNsfwContent = false [package.dependencies] -BepInEx-BepInExPack_Inscryption = "5.4.1902" +BepInEx-BepInExPack_Inscryption = "5.4.2305" BepInEx-MonoMod_Loader_Inscryption = "1.0.0" [build] @@ -22,14 +22,38 @@ outdir = "./build" source = "InscryptionAPI/bin/Release/InscryptionAPI.dll" target = "plugins/InscryptionAPI.dll" +[[build.copy]] +source = "InscryptionAPI/bin/Release/InscryptionAPI.pdb" +target = "plugins/InscryptionAPI.pdb" + +[[build.copy]] +source = "InscryptionAPI/bin/Release/InscryptionAPI.xml" +target = "plugins/InscryptionAPI.xml" + [[build.copy]] source = "APIPatcher/bin/Release/Assembly-CSharp.APIPatcher.mm.dll" target = "monomod/Assembly-CSharp.APIPatcher.mm.dll" +[[build.copy]] +source = "APIPatcher/bin/Release/Assembly-CSharp.APIPatcher.mm.pdb" +target = "monomod/Assembly-CSharp.APIPatcher.mm.pdb" + +[[build.copy]] +source = "APIPatcher/bin/Release/Assembly-CSharp.APIPatcher.mm.xml" +target = "monomod/Assembly-CSharp.APIPatcher.mm.xml" + [[build.copy]] source = "InscryptionCommunityPatch/bin/Release/InscryptionCommunityPatch.dll" target = "plugins/InscryptionCommunityPatch.dll" +[[build.copy]] +source = "InscryptionCommunityPatch/bin/Release/InscryptionCommunityPatch.pdb" +target = "plugins/InscryptionCommunityPatch.pdb" + +[[build.copy]] +source = "InscryptionCommunityPatch/bin/Release/InscryptionCommunityPatch.xml" +target = "plugins/InscryptionCommunityPatch.xml" + [publish] repository = "https://inscryption.thunderstore.io" communities = ["inscryption"] From ce8e0b9c0bae049f2b665d1b97126d82fb8e523a Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Wed, 30 Sep 2026 22:29:58 -0400 Subject: [PATCH 05/11] Update Thunderstore.toml * Copy over License and Changelog in Builds. * Renamed LICENSE to LICENSE.md --- LICENSE => LICENSE.md | 0 thunderstore.toml | 8 ++++++++ 2 files changed, 8 insertions(+) rename LICENSE => LICENSE.md (100%) diff --git a/LICENSE b/LICENSE.md similarity index 100% rename from LICENSE rename to LICENSE.md diff --git a/thunderstore.toml b/thunderstore.toml index 4c6e9042..d3fa3b21 100644 --- a/thunderstore.toml +++ b/thunderstore.toml @@ -54,6 +54,14 @@ target = "plugins/InscryptionCommunityPatch.pdb" source = "InscryptionCommunityPatch/bin/Release/InscryptionCommunityPatch.xml" target = "plugins/InscryptionCommunityPatch.xml" +[[build.copy]] +source = "CHANGELOG.md" +target = "CHANGELOG.md" + +[[build.copy]] +source = "LICENSE.md" +target = "LICENSE.md" + [publish] repository = "https://inscryption.thunderstore.io" communities = ["inscryption"] From 0bd72f896cb4bb01413d612a9f12c42b001d5d73 Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Fri, 2 Oct 2026 20:31:59 -0400 Subject: [PATCH 06/11] XML Docs Part I, Rename Internal Config Keys * First batch of work on the XML Documentation. * Add a Saftey Check for Instantiating the Base Game Custom Appearences Dict. * Rename Internal Configuration Key Names, namely in Community Patch to reflect their functionality. * Updated Internal Code Versions to 2.24.2 --- APIPatcher/ScriptableObjectLoader.cs | 7 + APIPatcher/Singleton.cs | 13 ++ InscryptionAPI/Costs/CardCostManager.cs | 2 +- InscryptionAPI/InscryptionAPIPlugin.cs | 108 +++++++-- InscryptionAPI/Items/ConsumableItemManager.cs | 4 +- InscryptionAPI/Totems/TotemManager.cs | 8 +- .../Card/ActivatedAbilityHandler3D.cs | 2 +- .../Card/ActivatedAbilityIconFix.cs | 4 +- .../Card/ActivatedAbilityIconInteractable.cs | 2 +- InscryptionCommunityPatch/Card/ArtPatches.cs | 2 +- .../Card/CardCostRender.cs | 10 +- .../Card/MergedSigilOnBottom.cs | 10 +- .../Card/MissingSquirrelTribeIconFix.cs | 2 +- .../Card/Part1CostEmissionMaskRender.cs | 2 +- .../Card/Part2CardCostRender.cs | 2 +- .../Card/StackAbilityIcons.cs | 8 +- .../Act1LatchAbilityFix.cs | 4 +- .../Act2ShapeshifterPatches.cs | 4 +- .../SentryInteractionFixes.cs | 2 +- .../SentryPackMuleFixes.cs | 4 +- .../InscryptionCommunityPatchPlugin.cs | 207 +++++++++++++----- .../PixelTutor/PixelPlayableCardArray.cs | 2 +- .../ResourceManagers/ActOneEnergyDrone.cs | 12 +- .../Sequencers/BuyPeltsSmallTags.cs | 6 +- .../Sequencers/CardStatBoostSequencerPatch.cs | 2 +- .../Sequencers/LeshyResetRedEyes.cs | 2 +- .../Tests/TestCommunityPatches.cs | 2 +- 27 files changed, 305 insertions(+), 128 deletions(-) diff --git a/APIPatcher/ScriptableObjectLoader.cs b/APIPatcher/ScriptableObjectLoader.cs index 3c67a6dc..66c6beab 100644 --- a/APIPatcher/ScriptableObjectLoader.cs +++ b/APIPatcher/ScriptableObjectLoader.cs @@ -3,9 +3,16 @@ namespace APIPatcher; +/// +/// Uses MonoMod to patch Unity's ScriptableObjectLoader to also use our version of the ScriptableObjectLoader seen in the Inscryption API itself. +/// +/// [MonoModPatch("global::ScriptableObjectLoader`1")] internal class patch_ScriptableObjectLoader : ScriptableObjectLoader where T : UnityObject { + /// + /// A List of AllData used within the overarching system, e.g. a List of . + /// new public static List AllData { get diff --git a/APIPatcher/Singleton.cs b/APIPatcher/Singleton.cs index ce178f8a..1291c79f 100644 --- a/APIPatcher/Singleton.cs +++ b/APIPatcher/Singleton.cs @@ -4,9 +4,16 @@ namespace APIPatcher; +/// +/// Uses MonoMod to patch the Singleton for later usability by the Inscryption API. +/// +/// A ManagedBehaviour associated with the Singleton System. [MonoModPatch("global::Singleton`1")] internal class patch_Singleton : Singleton where T : ManagedBehaviour { + /// + /// A simple function used to Find a Specified UnityObject of the specified Type within the Active Scene, if it fails it tosses a Warning. + /// new protected static void FindInstance() { if (m_Instance == null) @@ -21,7 +28,13 @@ internal class patch_Singleton : Singleton where T : ManagedBehaviour } } +/// +/// A simple class object for singletons in correlation with the API. +/// internal static class Singleton { + /// + /// A ManualLogSource specifically for logging issues related to Singletons. + /// internal static readonly ManualLogSource SingletonLogSource = Logger.CreateLogSource("Singleton"); } diff --git a/InscryptionAPI/Costs/CardCostManager.cs b/InscryptionAPI/Costs/CardCostManager.cs index 7af707a3..743ca780 100644 --- a/InscryptionAPI/Costs/CardCostManager.cs +++ b/InscryptionAPI/Costs/CardCostManager.cs @@ -663,7 +663,7 @@ private static void GenerateCustomCostChoices(ref List __result, int while (list.Count > 3) list.RemoveAt(SeededRandom.Range(0, list.Count, randomSeed++)); - if (InscryptionAPIPlugin.configRandomChoiceOrder.Value) + if (InscryptionAPIPlugin.configRandomCostChoiceOrder.Value) list = list.Randomize().ToList(); __result = list; diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index db70334a..d3ea1adb 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -19,6 +19,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using InscryptionAPI.Helpers; +using Sirenix.Utilities; [assembly: InternalsVisibleTo("Assembly-CSharp")] [assembly: InternalsVisibleTo("Assembly-CSharp.APIPatcher.mm")] @@ -26,29 +27,65 @@ namespace InscryptionAPI; +/// +/// The Entry Point to the Inscryption API. +/// [BepInPlugin(ModGUID, ModName, ModVer)] [HarmonyPatch] public class InscryptionAPIPlugin : BaseUnityPlugin { + /// + /// The GUID for the Inscryption API, if you depend on this API you'll want to load after it in Awake() or, anywhere before Start(). + /// public const string ModGUID = "cyantist.inscryption.api"; - public const string ModName = "InscryptionAPI"; - public const string ModVer = "2.24.1"; - + /// + /// This is the Inscryption API's Internal Name, prefer identifying this API with the GUID. + /// + internal const string ModName = "InscryptionAPI"; + /// + /// This is the Version of the Inscryption API you are using. + /// + internal const string ModVer = "2.24.2"; + + /// + /// The Inscryption API's Location as a Directory. + /// public static string Directory = ""; + /// + /// The API's Assembly for Internal Reference. + /// internal static Assembly APIAssembly { get; private set; } = null; - internal static ConfigEntry configOverrideArrows; - internal static ConfigEntry configRandomChoiceOrder; - internal static ConfigEntry configHideAct1BossScenery; - internal static ConfigEntry configCustomTotemTopTypes; - internal static ConfigEntry configCustomItemTypes; - + /// + /// The Configuration for Overriding the Arrows within Kaycee's Mod Menu's. + /// + public static ConfigEntry configOverrideArrows; + /// + /// The Configuration for determining whether the Order of Costs in a Cost Choice Node should be Randomized. + /// + public static ConfigEntry configRandomCostChoiceOrder; + /// + /// The Configuration for determining whether the Boss Scenery of Act 1/KCM should be hidden. + /// + public static ConfigEntry configHideAct1BossScenery; + /// + /// This Configuration is used for determining what Totem Top Model should be used in game. + /// + internal static ConfigEntry configCustomTotemTopModelSelection; + /// + /// This Configuration is used for determining what Item Model should be used in game. + /// + internal static ConfigEntry configCustomItemModelSelection; + + /// + /// Prevents API 1.0.0 Versions from Loaing. + /// static InscryptionAPIPlugin() { AppDomain.CurrentDomain.AssemblyResolve += static (_, e) => { - if (e.Name.StartsWith("API, Version=1")) + if (e.Name.StartsWith("API, Version=1") || e.Name.StartsWith("Cardloader, Version=1")) { return APIAssembly ??= typeof(InscryptionAPIPlugin).Assembly; } @@ -56,30 +93,52 @@ static InscryptionAPIPlugin() }; } + /// + /// Our API's Internal Logger. + /// new internal static ManualLogSource Logger; - + /// + /// Our API's Internal Harmony Instance. + /// private readonly Harmony HarmonyInstance = new(ModGUID); + /// + /// An event of resembling the Scriptable Object Loader Load call. + /// public static event Action ScriptableObjectLoaderLoad; + /// + /// A simple internal function that invokes our previously typified Action for Loading the ScriptableObjectLoader. + /// + /// The Type in which to pass to the ScriptableObjectLoader. internal static void InvokeSOLEvent(Type type) { ScriptableObjectLoaderLoad?.Invoke(type); } + /// + /// The following runs when the API is enabled by Unity. + /// private void OnEnable() { Logger = base.Logger; Directory = Path.GetDirectoryName(Info.Location); - TextureHelper.InstantiateBaseGameCustomAppearances(); + if (TextureHelper.BaseGameCustomAppearancesPublic.IsNullOrEmpty()) + TextureHelper.InstantiateBaseGameCustomAppearances(); HarmonyInstance.PatchAll(InscryptionAPIPlugin.APIAssembly); } + /// + /// The following runs when the API is diabled by Unity. + /// private void OnDisable() { HarmonyInstance.UnpatchSelf(); } + /// + /// The following is used to Resync the API's many lists, e.g. , , , , , , , + /// internal static void ResyncAll() { CardManager.SyncCardList(); @@ -92,6 +151,9 @@ internal static void ResyncAll() RuleBookManager.SyncRuleBookList(); } + /// + /// A function we use to check when a plugin is using an Outdated version of the API, if they do we log them with a Warning about it. + /// internal static void CheckForOutdatedPlugins() { string outdatedPlugins = ""; @@ -111,16 +173,22 @@ internal static void CheckForOutdatedPlugins() + outdatedPlugins + "\nThese mods may not work correctly. If problems arise, please update or disable them!"); } + /// + /// This is our API's Initializer, we primarily use it to set the internal APIAssembly and create the Configurations to the Configuration File. + /// private void Awake() { APIAssembly ??= typeof(InscryptionAPIPlugin).Assembly; - configCustomTotemTopTypes = Config.Bind("Totems", "Top Types", TotemManager.TotemTopState.CustomTribes, "If Vanilla, don't change totem tops; if CustomTribes, added custom tribes will use custom totem tops; if AllTribes then all totem tops will use a custom top."); - configCustomItemTypes = Config.Bind("Items", "Types", ConsumableItemManager.ConsumableState.Custom, "If Vanilla, only vanilla items will be used; if Custom, added custom items will use custom models; if All then all items will use a custom model."); + configCustomTotemTopModelSelection = Config.Bind("Totems", "Top Types", TotemManager.TotemTopState.CustomTribes, "If Vanilla, don't change totem tops; if CustomTribes, added custom tribes will use custom totem tops; if AllTribes then all totem tops will use a custom top."); + configCustomItemModelSelection = Config.Bind("Items", "Types", ConsumableItemManager.ConsumableState.Custom, "If Vanilla, only vanilla items will be used; if Custom, added custom items will use custom models; if All then all items will use a custom model."); configOverrideArrows = Config.Bind("Menus", "Override Arrows", false, "When true, forces the challenge screen arrows to appear at the top of the screen instead of the sides."); - configRandomChoiceOrder = Config.Bind("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); + configRandomCostChoiceOrder = Config.Bind("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); configHideAct1BossScenery = Config.Bind("Optimization", "Hide Act 1 Scenery", false, "When true bosses will not spawn their scenery. (eg: Prospector's trees) This can improve performance on low-end machines."); } + /// + /// This is the API's second phase of Initialization, ran after all Awake() calls complete. If you need something both after Awake() and before Start() refer to JSONLoader3's Phase System. + /// private void Start() { CheckForOutdatedPlugins(); @@ -131,13 +199,12 @@ private void Start() CardManager.AuditCardList(); PixelCardManager.Initialise(); PeltManager.CreateDialogueEvents(); - //if (!DialogueManager.CustomDialogue.Exists(x => x.DialogueEvent.id == "Hint_NotEnoughSameColourGemsHint")) - //{ - - //} Logger.LogDebug($"Inserted {DialogueManager.CustomDialogue.Count} dialogue event(s)!"); } + /// + /// This patches the Kaycee's Mod Menu to resync all Cards and Abilities when entering the run itself before Kaycee's mod transitions you into the run itself.. + /// [HarmonyPatch(typeof(AscensionMenuScreens), nameof(AscensionMenuScreens.TransitionToGame))] [HarmonyPrefix] private static void SyncCardsAndAbilitiesWhenTransitioningToAscensionGame() @@ -145,6 +212,9 @@ private static void SyncCardsAndAbilitiesWhenTransitioningToAscensionGame() ResyncAll(); } + /// + /// This patches the Main Menu to resync all Cards and Abilities when entering any part of the base game, before the Menu handles the transition. + /// [HarmonyPatch(typeof(MenuController), nameof(MenuController.TransitionToGame))] [HarmonyPrefix] private static void SyncCardsAndAbilitiesWhenTransitioningToGame() diff --git a/InscryptionAPI/Items/ConsumableItemManager.cs b/InscryptionAPI/Items/ConsumableItemManager.cs index a54a17bb..9922bf71 100644 --- a/InscryptionAPI/Items/ConsumableItemManager.cs +++ b/InscryptionAPI/Items/ConsumableItemManager.cs @@ -238,7 +238,7 @@ internal static void Initialize() if (!allFullItemDatas.Exists(x => x.itemData == itemData)) allFullItemDatas.Add(new(itemData)); } - if (InscryptionAPIPlugin.configCustomItemTypes.Value == ConsumableState.Vanilla) + if (InscryptionAPIPlugin.configCustomItemModelSelection.Value == ConsumableState.Vanilla) { // Don't change any items! return; @@ -258,7 +258,7 @@ internal static void Initialize() } // Override vanilla items - if (InscryptionAPIPlugin.configCustomItemTypes.Value == ConsumableState.All) + if (InscryptionAPIPlugin.configCustomItemModelSelection.Value == ConsumableState.All) { // Change all base items to use the fallback model! foreach (ConsumableItemData data in baseConsumableItemsDatas) diff --git a/InscryptionAPI/Totems/TotemManager.cs b/InscryptionAPI/Totems/TotemManager.cs index 12693a05..9a2469c9 100644 --- a/InscryptionAPI/Totems/TotemManager.cs +++ b/InscryptionAPI/Totems/TotemManager.cs @@ -24,7 +24,7 @@ private class ItemsUtil_AllConsumables { public static IEnumerable Transpiler(IEnumerable instructions) { - if (InscryptionAPIPlugin.configCustomTotemTopTypes.Value == TotemTopState.Vanilla) + if (InscryptionAPIPlugin.configCustomTotemTopModelSelection.Value == TotemTopState.Vanilla) return instructions; // === We want to turn this @@ -114,7 +114,7 @@ private static bool Prefix(TotemTopData data, ref GameObject __result) __result = customTribeTotem?.Prefab ?? defaultTotemTop.Prefab; return false; } - else if (InscryptionAPIPlugin.configCustomTotemTopTypes.Value == TotemTopState.AllTribes) + else if (InscryptionAPIPlugin.configCustomTotemTopModelSelection.Value == TotemTopState.AllTribes) { __result = defaultTotemTop.Prefab; return false; @@ -148,7 +148,7 @@ private static bool Prefix(TotemTopData __instance, ref string __result) return false; } } - else if (InscryptionAPIPlugin.configCustomTotemTopTypes.Value == TotemTopState.AllTribes) + else if (InscryptionAPIPlugin.configCustomTotemTopModelSelection.Value == TotemTopState.AllTribes) { // All non-custom tribes will use the fallback model __result = CustomTotemTopID; @@ -308,7 +308,7 @@ private static void InitializeDefaultTotemTop() private static void Initialize() { // Don't change any totems! - if (InscryptionAPIPlugin.configCustomTotemTopTypes.Value == TotemTopState.Vanilla) + if (InscryptionAPIPlugin.configCustomTotemTopModelSelection.Value == TotemTopState.Vanilla) return; if (defaultTotemTop == null) diff --git a/InscryptionCommunityPatch/Card/ActivatedAbilityHandler3D.cs b/InscryptionCommunityPatch/Card/ActivatedAbilityHandler3D.cs index 71126799..54d0c31b 100644 --- a/InscryptionCommunityPatch/Card/ActivatedAbilityHandler3D.cs +++ b/InscryptionCommunityPatch/Card/ActivatedAbilityHandler3D.cs @@ -40,7 +40,7 @@ public void UpdateInteractableList(List controllerActiv } }); - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"[Handler3D] Updated interactable list: [{interactables.Join(interactable => $"GO [{interactable.gameObject}] Ability [{interactable.Ability}]")}]"); } diff --git a/InscryptionCommunityPatch/Card/ActivatedAbilityIconFix.cs b/InscryptionCommunityPatch/Card/ActivatedAbilityIconFix.cs index c6289e4f..37e43409 100644 --- a/InscryptionCommunityPatch/Card/ActivatedAbilityIconFix.cs +++ b/InscryptionCommunityPatch/Card/ActivatedAbilityIconFix.cs @@ -30,7 +30,7 @@ private static void FixActivatedAbilitiesOnAnyChange(ref PlayableCard __instance if (abilityHandler3D.SafeIsUnityNull()) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"[PlayableCard.OnStatsChanged] Adding activated ability handler to card [{__instance.Info.displayedName}]"); abilityHandler3D = __instance.gameObject.AddComponent(); @@ -38,7 +38,7 @@ private static void FixActivatedAbilitiesOnAnyChange(ref PlayableCard __instance if (!abilityHandler3D.SafeIsUnityNull() && __instance.AbilityIcons.abilityIcons != null) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"[PlayableCard.OnStatsChanged] -> Resetting icon list for [{__instance.Info.displayedName}]"); abilityHandler3D.UpdateInteractableList(__instance.AbilityIcons.abilityIcons); diff --git a/InscryptionCommunityPatch/Card/ActivatedAbilityIconInteractable.cs b/InscryptionCommunityPatch/Card/ActivatedAbilityIconInteractable.cs index ae6961bd..66c3b3a1 100644 --- a/InscryptionCommunityPatch/Card/ActivatedAbilityIconInteractable.cs +++ b/InscryptionCommunityPatch/Card/ActivatedAbilityIconInteractable.cs @@ -33,7 +33,7 @@ private void Start() public void AssignAbility(Ability ability) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"Icon was previously {Ability} - asking to change to a {ability}"); Ability = ability; _renderMaterial = GetComponent().material; diff --git a/InscryptionCommunityPatch/Card/ArtPatches.cs b/InscryptionCommunityPatch/Card/ArtPatches.cs index ec5a0482..0c680a75 100644 --- a/InscryptionCommunityPatch/Card/ArtPatches.cs +++ b/InscryptionCommunityPatch/Card/ArtPatches.cs @@ -95,7 +95,7 @@ internal static void PatchCommunityArt() foreach (string name in regularCardsToPatch) CardManager.BaseGameCards.CardByName(name).SetPixelPortrait(TextureHelper.GetImageAsTexture($"{name}_pixel.png", ass)); - if (PatchPlugin.undeadCatEmission.Value) + if (PatchPlugin.configEnforceUndeadCatToHaveARedEmission.Value) { CardManager.BaseGameCards.CardByName("CatUndead") .SetEmissivePortrait(TextureHelper.GetImageAsTexture("CatUndead_emission.png", ass)) diff --git a/InscryptionCommunityPatch/Card/CardCostRender.cs b/InscryptionCommunityPatch/Card/CardCostRender.cs index 1537c96c..2573628a 100644 --- a/InscryptionCommunityPatch/Card/CardCostRender.cs +++ b/InscryptionCommunityPatch/Card/CardCostRender.cs @@ -78,16 +78,16 @@ private static void CreateFullCostSprite(CardDisplayer __instance, CardRenderInf { __instance.costRenderer.sprite = FinalCostSprite(renderInfo.baseInfo, playableCard, TextureHelper.SpriteType.OversizedCostDecal, 28); } - else if (__instance is PixelCardDisplayer pixelDisplay && PatchPlugin.act2CostRender.Value) + else if (__instance is PixelCardDisplayer pixelDisplay && PatchPlugin.configUseAPIAct2CostRender.Value) { - if (PatchPlugin.act2VanillaStyle.Value) + if (PatchPlugin.configDisplayVanillaStyleAct2CostIcons.Value) { - __instance.costRenderer.sprite = Part2CardCostRender.FinalVanillaCostSprite(pixelDisplay, renderInfo.baseInfo, playableCard, !PatchPlugin.rightAct2Cost.Value); + __instance.costRenderer.sprite = Part2CardCostRender.FinalVanillaCostSprite(pixelDisplay, renderInfo.baseInfo, playableCard, !PatchPlugin.configDisplayAct2CostInTheTopRightCorner.Value); } else { __instance.costRenderer.sprite = FinalCostSprite(renderInfo.baseInfo, playableCard, - PatchPlugin.rightAct2Cost.Value ? TextureHelper.SpriteType.Act2CostDecalRight : TextureHelper.SpriteType.Act2CostDecalLeft, 8); + PatchPlugin.configDisplayAct2CostInTheTopRightCorner.Value ? TextureHelper.SpriteType.Act2CostDecalRight : TextureHelper.SpriteType.Act2CostDecalLeft, 8); } } } @@ -100,7 +100,7 @@ private static bool Part1CardCostDisplayerPatch(CardDisplayer __instance, ref Sp { return false; } - if (__instance is PixelCardDisplayer && PatchPlugin.act2CostRender.Value) + if (__instance is PixelCardDisplayer && PatchPlugin.configUseAPIAct2CostRender.Value) { return false; } diff --git a/InscryptionCommunityPatch/Card/MergedSigilOnBottom.cs b/InscryptionCommunityPatch/Card/MergedSigilOnBottom.cs index 31e30a69..e7710312 100644 --- a/InscryptionCommunityPatch/Card/MergedSigilOnBottom.cs +++ b/InscryptionCommunityPatch/Card/MergedSigilOnBottom.cs @@ -22,7 +22,7 @@ private static bool DontPlaceCardModIcons_IfShowOnBottom(CardAbilityIcons __inst { // If we are showing card modifications sigils on the bottom, we don't allow the // AppyAbilitiesToIcons method to do anything - if (PatchPlugin.configMergeOnBottom.Value && PatchPlugin.configRemovePatches.Value && iconMat == __instance.emissiveIconMat) + if (PatchPlugin.configMergeSigilsOnBottom.Value && PatchPlugin.configRemoveSigilPatchesFromCards.Value && iconMat == __instance.emissiveIconMat) { foreach (AbilityIconInteractable icon in icons) { icon.gameObject.SetActive(false); @@ -40,9 +40,9 @@ private static void MoveMergeIconsToDefaultGroup_IfShowOnBottom(List de // This is the first time that the default abilities list is used once it has been built // What we want to do is take all of the abilities from the merge group and move them to the default group // if the "show merged icons on bottom" setting is active. - if (PatchPlugin.configMergeOnBottom.Value) { + if (PatchPlugin.configMergeSigilsOnBottom.Value) { defaultAbilities.AddRange(mergeAbilities); - if (PatchPlugin.configRemovePatches.Value) { + if (PatchPlugin.configRemoveSigilPatchesFromCards.Value) { mergeAbilities.Clear(); } } @@ -53,14 +53,14 @@ private static void MoveMergeIconsToDefaultGroup_IfShowOnBottom(List de [HarmonyPostfix] private static void RepositionAndRetextureMergedIcons_IfShowOnBottom(ref CardInfo info, ref AbilityInfo ability, ref AbilityIconInteractable __instance) { - if (PatchPlugin.configMergeOnBottom.Value && info != null && info.Mods.Count > 0) { + if (PatchPlugin.configMergeSigilsOnBottom.Value && info != null && info.Mods.Count > 0) { List MergeSigils = info.Mods.FindAll(x => x.fromCardMerge); if (MergeSigils.Count > 0) { foreach (CardModificationInfo mod in MergeSigils) { // if ability whose icon we're loading came from a card merge mod if (mod.abilities.Contains(ability.ability) && (__instance.name == "AbilityIcon" || __instance.name == "DefaultIcons_1Ability")) { - if (PatchPlugin.configRemovePatches.Value) { + if (PatchPlugin.configRemoveSigilPatchesFromCards.Value) { __instance.SetMaterial(Singleton.Instance.totemIconMat); if (__instance.GetComponentInParent() != null) __instance.GetComponentInParent().enabled = true; diff --git a/InscryptionCommunityPatch/Card/MissingSquirrelTribeIconFix.cs b/InscryptionCommunityPatch/Card/MissingSquirrelTribeIconFix.cs index f267a6d6..6b18f521 100644 --- a/InscryptionCommunityPatch/Card/MissingSquirrelTribeIconFix.cs +++ b/InscryptionCommunityPatch/Card/MissingSquirrelTribeIconFix.cs @@ -80,7 +80,7 @@ private static bool ShowTribeOnCard(CardInfo info, Tribe tribe) } if (tribe == Tribe.Squirrel) { - return PatchPlugin.configShowSquirrelTribeOnCards.Value; + return PatchPlugin.configCustomSquirrelTribeIconToShowOnCards.Value; } return true; diff --git a/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs b/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs index a1e6d639..a1378ed4 100644 --- a/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs +++ b/InscryptionCommunityPatch/Card/Part1CostEmissionMaskRender.cs @@ -29,7 +29,7 @@ public static SpriteRenderer Verify3DCostEmissionMaskRenderer(CardDisplayer3D ca } else { // disable if config is false ; otherwise toggle based on appearance of emissive portrait - result.gameObject.SetActive(PatchPlugin.configCostMask.Value && emissionEnabled); + result.gameObject.SetActive(PatchPlugin.configDisplayEmissionsUnderCostIcons.Value && emissionEnabled); } return result; diff --git a/InscryptionCommunityPatch/Card/Part2CardCostRender.cs b/InscryptionCommunityPatch/Card/Part2CardCostRender.cs index 5330d53e..403c2b81 100644 --- a/InscryptionCommunityPatch/Card/Part2CardCostRender.cs +++ b/InscryptionCommunityPatch/Card/Part2CardCostRender.cs @@ -27,7 +27,7 @@ public static class Part2CardCostRender public static event Action> UpdateVanillaPlayableCardCost; - public static bool RightAct2Cost => PatchPlugin.rightAct2Cost.Value; + public static bool RightAct2Cost => PatchPlugin.configDisplayAct2CostInTheTopRightCorner.Value; public static Sprite FinalVanillaCostSprite( PixelCardDisplayer display, diff --git a/InscryptionCommunityPatch/Card/StackAbilityIcons.cs b/InscryptionCommunityPatch/Card/StackAbilityIcons.cs index 684847d3..119c2403 100644 --- a/InscryptionCommunityPatch/Card/StackAbilityIcons.cs +++ b/InscryptionCommunityPatch/Card/StackAbilityIcons.cs @@ -54,7 +54,7 @@ public static class StackAbilityIcons private static Sprite GetGBCNumberSprite(int number) { string stackGBC = "stack_gbc.png"; - if (!PatchPlugin.act2StackIconType.Value) + if (!PatchPlugin.configAct2StackIconNumberStyle.Value) stackGBC = "stack_gbc_alt.png"; Texture2D texture = TextureHelper.GetImageAsTexture(stackGBC, typeof(StackAbilityIcons).Assembly); @@ -297,7 +297,7 @@ private static void ClearStackableIcons(ref List __result, CardInfo inf { int preDistinctCount = __result.Count; __result = __result.Distinct().ToList(); - if (PatchPlugin.doubleStackSplit.Value && __result.Count == 1 && preDistinctCount == 2 && AbilitiesUtil.GetInfo(__result[0]).canStack) + if (PatchPlugin.configDisplayStackableSigilsSeparately.Value && __result.Count == 1 && preDistinctCount == 2 && AbilitiesUtil.GetInfo(__result[0]).canStack) { __result.Add(__result[0]); } @@ -340,7 +340,7 @@ private static void AddIconNumber(Ability ability, CardInfo info, PlayableCard c if (count > 1) // we have a stack and need to add an override { - if (PatchPlugin.doubleStackSplit.Value && count == 2 && count == baseAbilities.Count) + if (PatchPlugin.configDisplayStackableSigilsSeparately.Value && count == 2 && count == baseAbilities.Count) __instance.SetIcon(__instance.LoadIcon(info, ai, card != null && card.OpponentCard)); else __instance.SetIcon(PatchTexture(ability, (int)count)); @@ -374,7 +374,7 @@ public static bool RenderPixelAbilityStacks(PixelCardAbilityIcons __instance, Li if (grps.Count > 0 && grps.Count - 1 < abilityIconGroups.Count) // if there are displayable sigils and there are enough icon groups { // if there is only 1 ability and there are two stacks of it, render it twice - if (PatchPlugin.doubleStackSplit.Value && grps.Count == 1 && grps[0].Item2 == 2/* && AbilitiesUtil.GetInfo(grps[0].Item1).canStack*/) + if (PatchPlugin.configDisplayStackableSigilsSeparately.Value && grps.Count == 1 && grps[0].Item2 == 2/* && AbilitiesUtil.GetInfo(grps[0].Item1).canStack*/) { //PatchPlugin.Logger.LogDebug($"Displaying {grps[0].Item1} twice"); grps[0] = new Tuple(grps[0].Item1, 1); diff --git a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act1LatchAbilityFix.cs b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act1LatchAbilityFix.cs index 625325b3..bad566ca 100644 --- a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act1LatchAbilityFix.cs +++ b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act1LatchAbilityFix.cs @@ -78,7 +78,7 @@ private static IEnumerator Postfix(IEnumerator enumerator, Latch __state, bool w List validTargets = BoardManager.Instance.AllSlotsCopy; validTargets.RemoveAll(slot => slot.Card == null || slot.Card.Dead || __state.CardHasLatchMod(slot.Card) || slot.Card == __state.Card); - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) { PatchPlugin.Logger.LogDebug($"[LatchFix] Started death, latch name: [{__state.name}]"); PatchPlugin.Logger.LogDebug("[LatchFix] Count of Valid Targets : " + validTargets.Count); @@ -174,7 +174,7 @@ private static IEnumerator Postfix(IEnumerator enumerator, Latch __state, bool w }; mod.SetExtendedProperty("LatchMod", true); - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"[LatchFix] Selected card name [{selectedSlot.Card.name}]"); selectedSlot.Card.AddTemporaryMod(mod); diff --git a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act2ShapeshifterPatches.cs b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act2ShapeshifterPatches.cs index 2d5cf5ab..8b797f7d 100644 --- a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act2ShapeshifterPatches.cs +++ b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/Act2ShapeshifterPatches.cs @@ -54,13 +54,13 @@ public static List GetIjiraqDisguises() { if (SaveManager.SaveFile.IsPart2) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"GetIjiraqDisguises: Act2:{SaveData.Data.collection.CardInfos.Count}"); return new(SaveData.Data.collection.CardInfos); } - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"GetIjiraqDisguises: DeckCount:{RunState.Run.playerDeck.Cards.Count}"); return new(RunState.Run.playerDeck.Cards); diff --git a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryInteractionFixes.cs b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryInteractionFixes.cs index 0c47c001..b7e80421 100644 --- a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryInteractionFixes.cs +++ b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryInteractionFixes.cs @@ -63,7 +63,7 @@ public static IEnumerator NewFireAtOpposingSlot(Sentry instance, PlayableCard ot // Check if the animation is paused then unpause it if (instance.Card.Anim.Anim.speed == 0f) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"{instance.Card} is frozen, unpausing animation."); midCombat = true; // indicates that we need to restart the attack animation at the end of the sequence diff --git a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryPackMuleFixes.cs b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryPackMuleFixes.cs index ce02a3c3..9658b7ab 100644 --- a/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryPackMuleFixes.cs +++ b/InscryptionCommunityPatch/Card/Vanilla Ability Patches/SentryPackMuleFixes.cs @@ -28,7 +28,7 @@ private static IEnumerator FixPackNotExisting(IEnumerator enumerator, PackMule _ { if (__instance.pack == null) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"{__instance.PlayableCard.name} died before fully resolving on board, instantiating pack."); // Instantiates the pack object if it's null @@ -44,7 +44,7 @@ private static IEnumerator FixPackNotExisting(IEnumerator enumerator, PackMule _ yield return new WaitUntil(() => !Tween.activeTweens.Exists((TweenBase t) => t.targetInstanceID == __instance.PlayableCard.transform.GetInstanceID())); __instance.pack.SetParent(__instance.PlayableCard.transform); - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"Pack has been instantiated. Reality has been saved."); } yield return enumerator; diff --git a/InscryptionCommunityPatch/InscryptionCommunityPatchPlugin.cs b/InscryptionCommunityPatch/InscryptionCommunityPatchPlugin.cs index 2ddf4520..60c134d0 100644 --- a/InscryptionCommunityPatch/InscryptionCommunityPatchPlugin.cs +++ b/InscryptionCommunityPatch/InscryptionCommunityPatchPlugin.cs @@ -14,55 +14,132 @@ namespace InscryptionCommunityPatch; +/// +/// The Entry Point for the Community Patch. +/// [BepInPlugin(ModGUID, ModName, ModVer)] [BepInDependency("cyantist.inscryption.api")] public class PatchPlugin : BaseUnityPlugin { + /// + /// The GUID for the Inscryption Community Patch, if you depend on this set of Patches and their associated code, you'll want to load after it in Awake(). + /// public const string ModGUID = "community.inscryption.patch"; + /// + /// This is the Inscryption Community Patch's Internal Name, prefer identifying the Community Patch with the GUID. + /// public const string ModName = "InscryptionCommunityPatch"; - public const string ModVer = "2.24.0"; - + /// + /// This is the Version of the Inscryption Community Patch you are using. + /// + public const string ModVer = "2.24.2"; + + /// + /// This is the Plugin Instance associated with the Inscryption Community Patch. + /// internal static PatchPlugin Instance; - internal static ConfigEntry configEnergy; - internal static ConfigEntry configDrone; - internal static ConfigEntry configMox; - internal static ConfigEntry configDroneMox; - internal static ConfigEntry configShowSquirrelTribeOnCards; + /// + /// Configure whether Energy should refresh or not. Refresh meaning the per-match removal of the Energy you have acquired. + /// + internal static ConfigEntry configEnergyPerMatchCleanUp; + /// + /// Configure whether the Energy Drone should be enabled or not. + /// + internal static ConfigEntry configEnergyDrone; + /// + /// Configure whether Mox should refresh or not. Refresh meaning the per-match removal of the Mox you have acquired. + /// + internal static ConfigEntry configMoxPerMatchCleanup; + /// + /// Configure whether the Mox Drone should be enabled or not. + /// + internal static ConfigEntry configMoxDrone; + /// + /// Configure whether the Act 3 Drone or Scale Drone should be used within Act 1. + /// + internal static ConfigEntry configUtilizeDefaultDrone; + /// + /// Configure whether the Bones Display is active in Act 3 or not. + /// internal static ConfigEntry configAct3Bones; - - internal static ConfigEntry configCostMask; - internal static ConfigEntry configResetEyes; - internal static ConfigEntry undeadCatEmission; - - internal static ConfigEntry rightAct2Cost; - internal static ConfigEntry act2CostRender; - internal static ConfigEntry act2VanillaStyle; - - internal static ConfigEntry doubleStackSplit; - - internal static ConfigEntry act2StackIconType; - - internal static ConfigEntry configMergeOnBottom; - - internal static ConfigEntry configRemovePatches; - - internal static ConfigEntry configSmallPricetags; - internal static ConfigEntry configMovePricetags; - - internal static ConfigEntry configTestState; - - internal static ConfigEntry configFullDebug; - - internal static ConfigEntry configDefaultDrone; - - internal static ConfigEntry act2TutorCenterRows; - - + /// + /// Configure whether the Custom Squirrel Tribe Icon should be shown on cards. + /// + internal static ConfigEntry configCustomSquirrelTribeIconToShowOnCards; + /// + /// Configure whether to use API's custom Act 2 Cost Rendering system or not for Custom and Hybrid Costs. + /// + internal static ConfigEntry configUseAPIAct2CostRender; + /// + /// Configure whether the Act 2 Cost should be in the Top Left or Top Right corner of the card. + /// + internal static ConfigEntry configDisplayAct2CostInTheTopRightCorner; + /// + /// Configure whether Cost Icons should use the Vanilla Style icons or the Custom Ones. + /// + internal static ConfigEntry configDisplayVanillaStyleAct2CostIcons; + /// + /// Configure the rendering of the Act 2 Stack Icon Number Renders, e.g. Black Outline or Cream Outline. + /// + internal static ConfigEntry configAct2StackIconNumberStyle; + /// + /// Configure whether sigils should be merged on the bottom of a card or not. + /// + internal static ConfigEntry configMergeSigilsOnBottom; + /// + /// Configure whether the actual patch the sigil is fused with is shown or not. If not the sigil icon shows up orange. Requires to be true. + /// + internal static ConfigEntry configRemoveSigilPatchesFromCards; + /// + /// Configure whether the Stackable Sigils should be displayed as seperate icons or not. + /// + internal static ConfigEntry configDisplayStackableSigilsSeparately; + /// + /// Configure whether the Price Tags should be smaller on the cards. + /// + internal static ConfigEntry configDisplaySmallerPriceTags; + /// + /// Configure whether the Price Tags should be displayed on the Right of a card. + /// + internal static ConfigEntry configDisplayPriceTagsOnTheRight; + /// + /// Configure whether card selection rows in the Act 2 Tutor Screen should be centered or not. + /// + internal static ConfigEntry configCenterAct2TutorSelectionRows; + /// + /// Configure whether Emissions should show over or under Cost Icons. + /// + internal static ConfigEntry configDisplayEmissionsUnderCostIcons; + /// + /// Configure whether Leshy's Eye Color should reset after the 8 Bears Fight. + /// + internal static ConfigEntry configResetEyesToNormalAfter8BearsFights; + /// + /// Configure whether Undead Cat's Emission should be forced Red or not. + /// + internal static ConfigEntry configEnforceUndeadCatToHaveARedEmission; + /// + /// Configure whether the Community Patch should display complete Debug Logs or not. + /// + internal static ConfigEntry configDisplayCompleteDebugLogsInConsole; + /// + /// Configure whether the Community Patch should be in Testing Mode or not. + /// + internal static ConfigEntry configCommunityPatchTestingMode; + + /// + /// Our Community Patch's Internal Logger. + /// new internal static ManualLogSource Logger; - + /// + /// Our Community Patch's Internal Harmony Instance. + /// private readonly Harmony HarmonyInstance = new(ModGUID); + /// + /// The following runs when the Community Patch is enabled by Unity. + /// private void OnEnable() { Logger = base.Logger; @@ -70,7 +147,7 @@ private void OnEnable() HarmonyInstance.PatchAll(typeof(PatchPlugin).Assembly); SceneManager.sceneLoaded += this.OnSceneLoaded; - if (configTestState.Value) + if (configCommunityPatchTestingMode.Value) { ExecuteCommunityPatchTests.PrepareForTests(); TestCost.Init(); @@ -80,39 +157,49 @@ private void OnEnable() CommunityArtPatches.PatchCommunityArt(); } + /// + /// The following runs when the Community Patch is diabled by Unity. + /// private void OnDisable() { HarmonyInstance.UnpatchSelf(); } + /// + /// This is our Community Patch's Initializer, we primarily use it to set the internal Instance of the Community Patcher and create the Configurations to the Configuration File. + /// private void Awake() { Instance = this; - configEnergy = Config.Bind("Energy", "Energy Refresh", true, "Max energy increases and energy refreshes at end of turn"); - configDrone = Config.Bind("Energy", "Energy Drone", false, "Drone is visible to display energy (requires Energy Refresh)"); - configDefaultDrone = Config.Bind("Energy", "Default Drone", false, "Drone uses the vanilla model instead of being attached to the scales (requires Energy Drone)"); - configMox = Config.Bind("Mox", "Mox Refresh", true, "Mox refreshes at end of battle"); - configDroneMox = Config.Bind("Mox", "Mox Drone", false, "Drone displays mox (requires Energy Drone and Mox Refresh)"); + configEnergyPerMatchCleanUp = Config.Bind("Energy", "Energy Refresh", true, "Max energy increases and energy refreshes at end of turn"); + configEnergyDrone = Config.Bind("Energy", "Energy Drone", false, "Drone is visible to display energy (requires Energy Refresh)"); + configUtilizeDefaultDrone = Config.Bind("Energy", "Default Drone", false, "Drone uses the vanilla model instead of being attached to the scales (requires Energy Drone)"); + configMoxPerMatchCleanup = Config.Bind("Mox", "Mox Refresh", true, "Mox refreshes at end of battle"); + configMoxDrone = Config.Bind("Mox", "Mox Drone", false, "Drone displays mox (requires Energy Drone and Mox Refresh)"); configAct3Bones = Config.Bind("Bones", "Act 3 Bones", false, "Force bones displayer to be active in Act 3"); - configShowSquirrelTribeOnCards = Config.Bind("Tribes", "Show Squirrel Tribe", false, "Shows the Squirrel tribe icon on cards"); - act2CostRender = Config.Bind("Card Costs", "GBC Cost render", true, "GBC Cards are able to display custom costs and hybrid costs through the API."); - rightAct2Cost = Config.Bind("Card Costs", "GBC Cost On Right", true, "GBC Cards display their costs on the top-right corner. If false, display on the top-left corner"); - act2VanillaStyle = Config.Bind("Card Costs", "GBC Vanilla Render", false, "GBC cards use vanilla sprites when rendering multiple and custom costs."); - configMergeOnBottom = Config.Bind("Sigil Display", "Merge_On_Botom", false, "Makes it so if enabled, merged sigils will display on the bottom of the card instead of on the artwork. In extreme cases, this can cause some visual bugs."); - configRemovePatches = Config.Bind("Sigil Display", "Remove_Patches", false, "Makes it so if enabled, merged sigils will not have a patch behind them anymore and will instead be glowing yellow (only works with Merge_On_Bottom)."); - doubleStackSplit = Config.Bind("Sigil Display", "Vanilla Stacking", false, "If enabled, cards with only two visible sigils will display each separately even if they can stack."); - - configSmallPricetags = Config.Bind("Act 1", "Smaller Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be scaled down."); - configMovePricetags = Config.Bind("Act 1", "Move Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be moved to the right."); - act2StackIconType = Config.Bind("Sigil Display", "Act 2 Sigil icon type", true, "If true, stacking icons are a cream outline with a black center. If false, stacking icons are a black outline with a cream center. Act 2"); - act2TutorCenterRows = Config.Bind("Act 2", "Centred Hoarder UI", true, "If true, centres displayed cards in each row during the Hoarder selection sequence."); - configFullDebug = Config.Bind("General", "Full Debug", true, "If true, displays all debug logs in the console."); - configTestState = Config.Bind("General", "Test Mode", false, "Puts the game into test mode. This will cause (among potentially other things) a new run to spawn a number of cards into your opening deck that will demonstrate card behaviors."); - configResetEyes = Config.Bind("Act 1", "Reset Red Eyes", false, "Resets Leshy's eyes to normal if they were turned red due to a boss fight's grizzly bear sequence."); - configCostMask = Config.Bind("Act 1", "Render Costs Above Emission", true, "Applies a mask to card emissions that prevents them from covering play costs when rendering in-game."); - undeadCatEmission = Config.Bind("General", "Undead Cat Emission", false, "If true, Undead Cat will have a forced red emission."); + configCustomSquirrelTribeIconToShowOnCards = Config.Bind("Tribes", "Show Squirrel Tribe", false, "Shows the Squirrel tribe icon on cards"); + configUseAPIAct2CostRender = Config.Bind("Card Costs", "GBC Cost render", true, "GBC Cards are able to display custom costs and hybrid costs through the API."); + configDisplayAct2CostInTheTopRightCorner = Config.Bind("Card Costs", "GBC Cost On Right", true, "GBC Cards display their costs on the top-right corner. If false, display on the top-left corner"); + configDisplayVanillaStyleAct2CostIcons = Config.Bind("Card Costs", "GBC Vanilla Render", false, "GBC cards use vanilla sprites when rendering multiple and custom costs."); + configAct2StackIconNumberStyle = Config.Bind("Sigil Display", "GBC Stack Icon Number Rendering", true, "If true, stacking icons are a cream outline with a black center. If false, stacking icons are a black outline with a cream center. Act 2"); + configMergeSigilsOnBottom = Config.Bind("Sigil Display", "Merge_On_Bottom", false, "Makes it so if enabled, merged sigils will display on the bottom of the card instead of on the artwork. In extreme cases, this can cause some visual bugs."); + configRemoveSigilPatchesFromCards = Config.Bind("Sigil Display", "Remove_Patches", false, "Makes it so if enabled, merged sigils will not have a patch behind them anymore and will instead be glowing yellow (only works with Merge_On_Bottom)."); + configDisplayStackableSigilsSeparately = Config.Bind("Sigil Display", "Vanilla Stacking", false, "If enabled, cards with only two visible sigils will display each separately even if they can stack."); + configDisplaySmallerPriceTags = Config.Bind("Act 1", "Smaller Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be scaled down."); + configDisplayPriceTagsOnTheRight = Config.Bind("Act 1", "Move Pricetags", false, "If enabled, the price tags placed on cards while buying from the Trapper will be moved to the right."); + configCenterAct2TutorSelectionRows = Config.Bind("Act 2", "Centred Hoarder UI", true, "If true, centers displayed cards in each row during the Hoarder selection sequence."); + configResetEyesToNormalAfter8BearsFights = Config.Bind("Act 1", "Reset Red Eyes", false, "Resets Leshy's eyes to normal if they were turned red due to a boss fight's grizzly bear sequence."); + configDisplayEmissionsUnderCostIcons = Config.Bind("Act 1", "Render Costs Above Emission", true, "Applies a mask to card emissions that prevents them from covering play costs when rendering in-game."); + configEnforceUndeadCatToHaveARedEmission = Config.Bind("General", "Undead Cat Emission", false, "If true, Undead Cat will have a forced red emission."); + configDisplayCompleteDebugLogsInConsole = Config.Bind("General", "Full Debug", true, "If true, displays all debug logs in the console."); + configCommunityPatchTestingMode = Config.Bind("General", "Test Mode", false, "Puts the game into test mode. This will cause (among potentially other things) a new run to spawn a number of cards into your opening deck that will demonstrate card behaviors."); } + /// + /// A simple function that runs when a Scene has Loaded in Unity. + /// + /// The Scene in which we are trying to Load things during. + /// The Mode in which to Load the Scene with. private void OnSceneLoaded(Scene scene, LoadSceneMode mode) { EnergyDrone.TryEnableEnergy(scene.name); diff --git a/InscryptionCommunityPatch/PixelTutor/PixelPlayableCardArray.cs b/InscryptionCommunityPatch/PixelTutor/PixelPlayableCardArray.cs index 9a3bc244..55b8669b 100644 --- a/InscryptionCommunityPatch/PixelTutor/PixelPlayableCardArray.cs +++ b/InscryptionCommunityPatch/PixelTutor/PixelPlayableCardArray.cs @@ -205,7 +205,7 @@ private float GetXPos(int cardIndex, int cardRowIndex, int cardsToPlace, int car float multiplier = cardIndex - positionInRow; // when there are <7 cards, we need to centre them - if (PatchPlugin.act2TutorCenterRows.Value && cardsLeftToPlace > 0 && cardsLeftToPlace < cardsPerRow) + if (PatchPlugin.configCenterAct2TutorSelectionRows.Value && cardsLeftToPlace > 0 && cardsLeftToPlace < cardsPerRow) { anchor = centreAnchor; multiplier = cardIndex - positionInRow - (cardsLeftToPlace - 1) / 2f; diff --git a/InscryptionCommunityPatch/ResourceManagers/ActOneEnergyDrone.cs b/InscryptionCommunityPatch/ResourceManagers/ActOneEnergyDrone.cs index 0f7fe52f..c5d604b2 100644 --- a/InscryptionCommunityPatch/ResourceManagers/ActOneEnergyDrone.cs +++ b/InscryptionCommunityPatch/ResourceManagers/ActOneEnergyDrone.cs @@ -16,11 +16,11 @@ public static class EnergyDrone /// public class EnergyConfigInfo { - public bool ConfigEnergy { get; set; } = PoolHasEnergy || PatchPlugin.configEnergy.Value; - public bool ConfigShowDrone { get; set; } = PoolHasEnergy || PatchPlugin.configDrone.Value; - public bool ConfigDroneMox { get; set; } = PoolHasGems || PatchPlugin.configDroneMox.Value; - public bool ConfigMox { get; set; } = PoolHasGems || PatchPlugin.configMox.Value; - public bool ConfigDefaultDrone { get; set; } = PatchPlugin.configDefaultDrone.Value; + public bool ConfigEnergy { get; set; } = PoolHasEnergy || PatchPlugin.configEnergyPerMatchCleanUp.Value; + public bool ConfigShowDrone { get; set; } = PoolHasEnergy || PatchPlugin.configEnergyDrone.Value; + public bool ConfigDroneMox { get; set; } = PoolHasGems || PatchPlugin.configMoxDrone.Value; + public bool ConfigMox { get; set; } = PoolHasGems || PatchPlugin.configMoxPerMatchCleanup.Value; + public bool ConfigDefaultDrone { get; set; } = PatchPlugin.configUtilizeDefaultDrone.Value; /// /// Controls whether or not the Drone will appear. By default, will appear if there are obtainable Energy or Mox cards in the card pool (or the corresponding config value has been set). @@ -119,7 +119,7 @@ internal static void TryEnableEnergy(string sceneName) private static IEnumerator AwakeDrone() { // pretty sure the drone can't be null in this method, but we'll check just in case - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug($"Awaking ResourceDrone, instance exists? {ResourceDrone.Instance != null}."); yield return new WaitForSeconds(1f); diff --git a/InscryptionCommunityPatch/Sequencers/BuyPeltsSmallTags.cs b/InscryptionCommunityPatch/Sequencers/BuyPeltsSmallTags.cs index b74bab35..22c9e533 100644 --- a/InscryptionCommunityPatch/Sequencers/BuyPeltsSmallTags.cs +++ b/InscryptionCommunityPatch/Sequencers/BuyPeltsSmallTags.cs @@ -10,17 +10,17 @@ internal class BuyPeltsSmallTags [HarmonyPostfix, HarmonyPatch(typeof(BuyPeltsSequencer), nameof(BuyPeltsSequencer.AddPricetagToCard))] private static void ReducePricetagSize(SelectableCard card) { - if (PatchPlugin.configSmallPricetags.Value || PatchPlugin.configMovePricetags.Value) + if (PatchPlugin.configDisplaySmallerPriceTags.Value || PatchPlugin.configDisplayPriceTagsOnTheRight.Value) { Transform t = card.transform.Find("pricetag"); if (t == null) return; - if (PatchPlugin.configSmallPricetags.Value) + if (PatchPlugin.configDisplaySmallerPriceTags.Value) { t.localScale = new(0.75f, 1f, 0.75f); } - if (PatchPlugin.configMovePricetags.Value) + if (PatchPlugin.configDisplayPriceTagsOnTheRight.Value) { t.localPosition = new(t.localPosition.x * -1, t.localPosition.y, t.localPosition.z); } diff --git a/InscryptionCommunityPatch/Sequencers/CardStatBoostSequencerPatch.cs b/InscryptionCommunityPatch/Sequencers/CardStatBoostSequencerPatch.cs index ce4eeae2..d12e9021 100644 --- a/InscryptionCommunityPatch/Sequencers/CardStatBoostSequencerPatch.cs +++ b/InscryptionCommunityPatch/Sequencers/CardStatBoostSequencerPatch.cs @@ -127,7 +127,7 @@ private static IEnumerator NewStatBoostSequence(CardStatBoostSequencer instance, // if there aren't any valid cards, exit the sequence if (instance.GetValidCards(forAttackMod: attackMod).Count == 0) { - if (PatchPlugin.configFullDebug.Value) + if (PatchPlugin.configDisplayCompleteDebugLogsInConsole.Value) PatchPlugin.Logger.LogDebug("Player has no cards that can be boosted at the campfire."); yield return new WaitForSeconds(0.5f); yield return Singleton.Instance.ShowUntilInput("You have no creatures to warm."); diff --git a/InscryptionCommunityPatch/Sequencers/LeshyResetRedEyes.cs b/InscryptionCommunityPatch/Sequencers/LeshyResetRedEyes.cs index 0e9f940b..613032c2 100644 --- a/InscryptionCommunityPatch/Sequencers/LeshyResetRedEyes.cs +++ b/InscryptionCommunityPatch/Sequencers/LeshyResetRedEyes.cs @@ -10,7 +10,7 @@ internal class LeshyResetRedEyes [HarmonyPostfix, HarmonyPatch(typeof(TurnManager), nameof(TurnManager.CleanupPhase))] private static IEnumerator ResetLeshyEyes(IEnumerator enumerator, TurnManager __instance) { - if (!PatchPlugin.configResetEyes.Value || !SaveManager.SaveFile.IsPart1 || __instance.opponent == null) + if (!PatchPlugin.configResetEyesToNormalAfter8BearsFights.Value || !SaveManager.SaveFile.IsPart1 || __instance.opponent == null) { yield return enumerator; yield break; diff --git a/InscryptionCommunityPatch/Tests/TestCommunityPatches.cs b/InscryptionCommunityPatch/Tests/TestCommunityPatches.cs index 4745fadf..817bb5c1 100644 --- a/InscryptionCommunityPatch/Tests/TestCommunityPatches.cs +++ b/InscryptionCommunityPatch/Tests/TestCommunityPatches.cs @@ -27,7 +27,7 @@ public static void PrepareForTests() [HarmonyPostfix] private static void StartRunInTestMode(ref AscensionSaveData __instance) { - if (PatchPlugin.configTestState.Value) + if (PatchPlugin.configCommunityPatchTestingMode.Value) { List testAbilityList = new() { Ability.Sharp, Ability.DebuffEnemy, Ability.CreateDams, Ability.DrawRabbits, Ability.Strafe, Ability.Deathtouch, Ability.DoubleStrike, Ability.Reach, Ability.BeesOnHit }; From 45431da2352d426ace26843484ec7446ee37ead1 Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Fri, 2 Oct 2026 20:33:19 -0400 Subject: [PATCH 07/11] ReInternalize 3 ConfigEntry's --- InscryptionAPI/InscryptionAPIPlugin.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index d3ea1adb..91bdd9b1 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -60,15 +60,15 @@ public class InscryptionAPIPlugin : BaseUnityPlugin /// /// The Configuration for Overriding the Arrows within Kaycee's Mod Menu's. /// - public static ConfigEntry configOverrideArrows; + internal static ConfigEntry configOverrideArrows; /// /// The Configuration for determining whether the Order of Costs in a Cost Choice Node should be Randomized. /// - public static ConfigEntry configRandomCostChoiceOrder; + internal static ConfigEntry configRandomCostChoiceOrder; /// /// The Configuration for determining whether the Boss Scenery of Act 1/KCM should be hidden. /// - public static ConfigEntry configHideAct1BossScenery; + internal static ConfigEntry configHideAct1BossScenery; /// /// This Configuration is used for determining what Totem Top Model should be used in game. /// From 8d07b076883bf1702df7f475b99a3543a34e025b Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Sat, 3 Oct 2026 14:57:32 -0400 Subject: [PATCH 08/11] XML Docs Part II, and some Cleanup * Moved `ResourceLookup.cs` to `InscryptionAPI.Helpers`, it was perviously listed there but not actually in the perscribed namespace. E.G. it was `InscryptionAPI.Items` instead. * Changed the `BoardManagerExtensions` to be One-line functions rather than Multi-line. Did similar in `CardSlotExtensions` but with the function params. * Renamed `objectFields` to `ObjectFields` within `CustomFields` under `InscryptionAPI.Helpers` * Add Bool Overrides to the `Metalic`, `Smoothness` and `Height` fields in `MaterialOverride.cs`, along with functions for overriding each of these respective components. * Fixed some XML Docs within `TextureHelper.cs`. * Fixed the `TranspilerHelpers.cs`'s function to use `LogCodeInstructions` rather than the typoed `LogCodeInscryptions`. * Completed Documentation related to the `InscryptionAPI.Helpers` classes. Signed-off-by: Chaosyr --- InscryptionAPI/Helpers/AssetBundleHelper.cs | 42 +++-- InscryptionAPI/Helpers/CustomFields.cs | 34 ++-- .../Extensions/BoardManagerExtensions.cs | 53 ++----- .../Helpers/Extensions/CardSlotExtensions.cs | 30 +--- .../Extensions/GameObjectExtensions.cs | 9 ++ .../Helpers/Extensions/ListExtensions.cs | 34 ++++ InscryptionAPI/Helpers/MaterialOverride.cs | 149 ++++++++++++++++-- InscryptionAPI/Helpers/ResourceLookup.cs | 68 ++++++-- .../Helpers/ResourcesManagerHelpers.cs | 49 +++++- InscryptionAPI/Helpers/TextureHelper.cs | 105 ++++++------ InscryptionAPI/Helpers/TranspilerHelpers.cs | 10 +- InscryptionAPI/Items/ConsumableItemManager.cs | 1 - .../Items/ConsumableItemResource.cs | 1 + InscryptionAPI/Masks/MaskBehaviour.cs | 1 - InscryptionAPI/Masks/MaskManager.cs | 2 +- InscryptionAPI/Masks/Patches.cs | 1 + 16 files changed, 406 insertions(+), 183 deletions(-) diff --git a/InscryptionAPI/Helpers/AssetBundleHelper.cs b/InscryptionAPI/Helpers/AssetBundleHelper.cs index 481daecd..b91a0ff2 100644 --- a/InscryptionAPI/Helpers/AssetBundleHelper.cs +++ b/InscryptionAPI/Helpers/AssetBundleHelper.cs @@ -2,8 +2,19 @@ namespace InscryptionAPI.Helpers; +/// +/// A Helper Set related to the . +/// public static class AssetBundleHelper { + /// + /// A function that attempts to get a Prefab of Type T from the given . + /// + /// The we want to get a Prefab out of. + /// The Name of the specific Prefab we are after. + /// The Fetched Prefab from the , if it fails we return Default(T), e.g. the Null associated with the given Type. + /// The Type in which is associated with the Prefab itself. + /// False if we fail, true if we successfully returned a Prefab associated with Type T. public static bool TryGet(AssetBundle bundle, string prefabName, out T prefab) where T : UnityObject { if (bundle == null) @@ -13,11 +24,8 @@ public static bool TryGet(AssetBundle bundle, string prefabName, out T prefab return false; } - // Get object from bundle prefab = bundle.LoadAsset(prefabName); - - // Unload bundle but don't unload the assets - bundle.Unload(false); + bundle.Unload(false); // Does not unload assets, just the Bundle. if (prefab == null) { @@ -28,6 +36,14 @@ public static bool TryGet(AssetBundle bundle, string prefabName, out T prefab return true; } + /// + /// A function that attempts to get a Prefab of Type T from the given path to the . + /// + /// The path to the + /// The Name of the specific Prefab we are after. + /// The Fetched Prefab from the , if it fails we return Default(T), e.g. the Null associated with the given Type. + /// The Type in which is associated with the Prefab itself. + /// False if we fail, true if we successfully returned a Prefab associated with Type T. public static bool TryGet(string pathToAssetBundle, string prefabName, out T prefab) where T : UnityObject { AssetBundle bundle = AssetBundle.LoadFromFile(pathToAssetBundle); @@ -38,11 +54,8 @@ public static bool TryGet(string pathToAssetBundle, string prefabName, out T return false; } - // Get object from bundle prefab = bundle.LoadAsset(prefabName); - - // Unload bundle but don't unload the assets - bundle.Unload(false); + bundle.Unload(false); // Does not unload assets, just the Bundle. if (prefab == null) { @@ -53,6 +66,14 @@ public static bool TryGet(string pathToAssetBundle, string prefabName, out T return true; } + /// + /// A function that attempts to get a Prefab of Type T from the given Memory associated with the . + /// + /// A array in the form of byte[] representing the Memory associated with a . + /// The Name of the specific Prefab we are after. + /// The Fetched Prefab from the , if it fails we return Default(T), e.g. the Null associated with the given Type. + /// The Type in which is associated with the Prefab itself. + /// False if we fail, true if we successfully returned a Prefab associated with Type T. public static bool TryGet(byte[] resources, string prefabName, out T prefab) where T : UnityObject { AssetBundle bundle = AssetBundle.LoadFromMemory(resources); @@ -63,11 +84,8 @@ public static bool TryGet(byte[] resources, string prefabName, out T prefab) return false; } - // Get object from bundle prefab = bundle.LoadAsset(prefabName); - - // Unload bundle but don't unload the assets - bundle.Unload(false); + bundle.Unload(false); // Does not unload assets, just the Bundle. if (prefab == null) { diff --git a/InscryptionAPI/Helpers/CustomFields.cs b/InscryptionAPI/Helpers/CustomFields.cs index 4091247e..71ac90d5 100644 --- a/InscryptionAPI/Helpers/CustomFields.cs +++ b/InscryptionAPI/Helpers/CustomFields.cs @@ -3,11 +3,15 @@ namespace InscryptionAPI.Helpers; /// -/// Allows for an easy way to add custom fields to an object, or to an entire class. +/// A Helper Object for Custom Fields. /// +/// Allows for an easy way to add custom fields to an object, or to an entire class. public static class CustomFields { - static ConditionalWeakTable> objectFields = new ConditionalWeakTable>(); + /// + /// A ConditionalWeakTable representing our CustomFields System. + /// + static readonly ConditionalWeakTable> ObjectFields = new ConditionalWeakTable>(); /// /// Returns a custom field. @@ -20,7 +24,7 @@ public static T Get(object obj, string field) { if (!HasField(obj, field)) Set(obj, field, default(T)); - objectFields.TryGetValue(obj, out Dictionary fields); + ObjectFields.TryGetValue(obj, out Dictionary fields); return (T)fields[field]; } @@ -31,8 +35,7 @@ public static T Get(object obj, string field) /// The class the static field is stored on. /// The name of the custom field. /// A custom field of type T. If the field is not found, default(T) is returned. - public static T GetStatic(string field) - => Get(typeof(C), field); + public static T GetStatic(string field) => Get(typeof(C), field); /// /// Returns a static custom field. @@ -41,8 +44,7 @@ public static T GetStatic(string field) /// The name of the custom field. /// The type of the class the static field is stored on. /// A custom field of type T. If the field is not found, default(T) is returned. - public static T GetStatic(string field, Type classType) - => Get(classType, field); + public static T GetStatic(string field, Type classType) => Get(classType, field); /// /// Set a custom field. @@ -52,10 +54,10 @@ public static T GetStatic(string field, Type classType) /// The value of the custom field. public static void Set(object obj, string field, object value) { - if (!objectFields.TryGetValue(obj, out Dictionary fields)) + if (!ObjectFields.TryGetValue(obj, out Dictionary fields)) { fields = new Dictionary(); - objectFields.Add(obj, fields); + ObjectFields.Add(obj, fields); } fields[field] = value; @@ -67,8 +69,7 @@ public static void Set(object obj, string field, object value) /// The class which you want to store the static field is stored on. /// The name of the custom field. /// The value of the custom field. - public static void SetStatic(string field, object value) - => Set(typeof(C), field, value); + public static void SetStatic(string field, object value) => Set(typeof(C), field, value); /// /// Set a static custom field. @@ -76,8 +77,7 @@ public static void SetStatic(string field, object value) /// The name of the custom field. /// The value of the custom field. /// The type of the class which you want to store the static field is stored on. - public static void SetStatic(string field, object value, Type classType) - => Set(classType, field, value); + public static void SetStatic(string field, object value, Type classType) => Set(classType, field, value); /// /// Check if an object currently stores a custom field. @@ -87,7 +87,7 @@ public static void SetStatic(string field, object value, Type classType) /// True if the object is storing the custom field. public static bool HasField(object obj, string field) { - if (!objectFields.TryGetValue(obj, out Dictionary fields)) return false; + if (!ObjectFields.TryGetValue(obj, out Dictionary fields)) return false; return fields.ContainsKey(field); } @@ -97,8 +97,7 @@ public static bool HasField(object obj, string field) /// The class which you want to check. /// The name of the static custom field to check for. /// True if the class is storing the static custom field. - public static bool HasStaticField(string field) - => HasField(typeof(C), field); + public static bool HasStaticField(string field) => HasField(typeof(C), field); /// /// Check if a class currently stores a static custom field. @@ -106,6 +105,5 @@ public static bool HasStaticField(string field) /// The name of the static custom field to check for. /// The type of the class which you want to check. /// True if the class is storing the static custom field. - public static bool HasStaticField(string field, Type classType) - => HasField(classType, field); + public static bool HasStaticField(string field, Type classType) => HasField(classType, field); } \ No newline at end of file diff --git a/InscryptionAPI/Helpers/Extensions/BoardManagerExtensions.cs b/InscryptionAPI/Helpers/Extensions/BoardManagerExtensions.cs index 19e94781..45d8ea4f 100644 --- a/InscryptionAPI/Helpers/Extensions/BoardManagerExtensions.cs +++ b/InscryptionAPI/Helpers/Extensions/BoardManagerExtensions.cs @@ -2,6 +2,9 @@ namespace InscryptionAPI.Helpers.Extensions; +/// +/// An extensions class for the Board Manager. +/// public static class BoardManagerExtensions { /// @@ -10,10 +13,7 @@ public static class BoardManagerExtensions /// Manager instance to access. /// The predicate to filter on each card. /// The list of player cards on the board. - public static List GetPlayerCards( - this BoardManager manager, - Predicate filterOnPredicate = null - ) => manager.PlayerSlotsCopy.SelectCards(filterOnPredicate).ToList(); + public static List GetPlayerCards(this BoardManager manager, Predicate filterOnPredicate = null) => manager.PlayerSlotsCopy.SelectCards(filterOnPredicate).ToList(); /// /// Retrieve all opponent cards on the board. @@ -21,10 +21,7 @@ public static List GetPlayerCards( /// Manager instance to access. /// The predicate to filter on each card. /// The list of opponent cards on the board. - public static List GetOpponentCards( - this BoardManager manager, - Predicate filterOnPredicate = null - ) => manager.OpponentSlotsCopy.SelectCards(filterOnPredicate).ToList(); + public static List GetOpponentCards(this BoardManager manager, Predicate filterOnPredicate = null) => manager.OpponentSlotsCopy.SelectCards(filterOnPredicate).ToList(); /// /// Retrieve all player or opponent cards on the board. @@ -33,11 +30,7 @@ public static List GetOpponentCards( /// Whether to retrieve player cards. /// The predicate to filter on each card. /// The list of relevant cards on the board. - public static List GetCards( - this BoardManager manager, - bool getPlayerCards, - Predicate filterOnPredicate = null - ) => manager.GetSlotsCopy(getPlayerCards).SelectCards(filterOnPredicate).ToList(); + public static List GetCards(this BoardManager manager, bool getPlayerCards, Predicate filterOnPredicate = null) => manager.GetSlotsCopy(getPlayerCards).SelectCards(filterOnPredicate).ToList(); /// /// Retrieve all cards on the board that match the predicate, if given. @@ -45,8 +38,7 @@ public static List GetCards( /// Manager instance to access. /// The predicate to filter on each card. /// The list of relevant cards on the board. - public static List GetCards(this BoardManager manager, Predicate filterOnPredicate = null) - => manager.AllSlotsCopy.SelectCards(filterOnPredicate).ToList(); + public static List GetCards(this BoardManager manager, Predicate filterOnPredicate = null) => manager.AllSlotsCopy.SelectCards(filterOnPredicate).ToList(); /// @@ -55,10 +47,7 @@ public static List GetCards(this BoardManager manager, Predicate

Manager instance to access. /// The predicate to filter on each slot. /// The list of player slots with no cards. - public static List GetPlayerOpenSlots( - this BoardManager manager, - Predicate filterOnPredicate = null - ) => manager.PlayerSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); + public static List GetPlayerOpenSlots(this BoardManager manager, Predicate filterOnPredicate = null) => manager.PlayerSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); ///

/// Retrieve all opponent slots that are not occupied by a card. @@ -66,10 +55,7 @@ public static List GetPlayerOpenSlots( /// Manager instance to access. /// The predicate to filter on each slot. /// The list of opponent slots with no cards. - public static List GetOpponentOpenSlots( - this BoardManager manager, - Predicate filterOnPredicate = null - ) => manager.OpponentSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); + public static List GetOpponentOpenSlots(this BoardManager manager, Predicate filterOnPredicate = null) => manager.OpponentSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); /// /// Retrieve all slots on the player or opponent's side of the board that are not occupied by a card. @@ -78,11 +64,7 @@ public static List GetOpponentOpenSlots( /// Whether to retrieve player slots. /// The predicate to filter on each slot. /// The list of relevant card slots with no cards. - public static List GetOpenSlots( - this BoardManager manager, - bool getPlayerSlots, - Predicate filterOnPredicate = null - ) => manager.GetSlotsCopy(getPlayerSlots).SelectOpenSlots(filterOnPredicate).ToList(); + public static List GetOpenSlots(this BoardManager manager, bool getPlayerSlots, Predicate filterOnPredicate = null) => manager.GetSlotsCopy(getPlayerSlots).SelectOpenSlots(filterOnPredicate).ToList(); /// /// Retrieve all slots on the board that are not occupied by a card. @@ -90,20 +72,15 @@ public static List GetOpenSlots( /// Manager instance to access. /// The predicate to filter on each slot. /// The list of relevant card slots with no cards. - public static List GetOpenSlots( - this BoardManager manager, - Predicate filterOnPredicate = null - ) => manager.AllSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); + public static List GetOpenSlots(this BoardManager manager, Predicate filterOnPredicate = null) => manager.AllSlotsCopy.SelectOpenSlots(filterOnPredicate).ToList(); /// /// Retrieve a copy of the board slots for the player or opponent's side of the board. /// /// Manager instance to access. /// Whether to retrieve PlayerSlotsCopy or OpponentSlotsCopy. - /// The predicate to filter on each slot. /// The list corresponding to the player or opponent's side of the board. - public static List GetSlotsCopy(this BoardManager manager, bool getPlayerSlotsCopy) - => getPlayerSlotsCopy ? manager.PlayerSlotsCopy : manager.OpponentSlotsCopy; + public static List GetSlotsCopy(this BoardManager manager, bool getPlayerSlotsCopy) => getPlayerSlotsCopy ? manager.PlayerSlotsCopy : manager.OpponentSlotsCopy; /// /// Retrieve all player or opponent card slots on the board. @@ -112,9 +89,5 @@ public static List GetSlotsCopy(this BoardManager manager, bool getPla /// Whether to retrieve player card slots. /// The predicate to filter on each card slot. /// The list of relevant card slots on the board. - public static List GetCardSlots( - this BoardManager manager, - bool getPlayerCards, - Predicate filterOnPredicate = null - ) => manager.GetSlotsCopy(getPlayerCards).FindAll(filterOnPredicate); + public static List GetCardSlots(this BoardManager manager, bool getPlayerCards, Predicate filterOnPredicate = null) => manager.GetSlotsCopy(getPlayerCards).FindAll(filterOnPredicate); } \ No newline at end of file diff --git a/InscryptionAPI/Helpers/Extensions/CardSlotExtensions.cs b/InscryptionAPI/Helpers/Extensions/CardSlotExtensions.cs index 3f9996b9..832fb8ba 100644 --- a/InscryptionAPI/Helpers/Extensions/CardSlotExtensions.cs +++ b/InscryptionAPI/Helpers/Extensions/CardSlotExtensions.cs @@ -3,6 +3,9 @@ namespace InscryptionAPI.Helpers.Extensions; +/// +/// An extensions class for the Card Slot. +/// public static class CardSlotExtensions { /// @@ -35,12 +38,7 @@ public static bool HasCard(this CardSlot cardSlot, string cardName) /// Time to transition the card to the slot. The longer the time, the longer it will take to be placed at the slot. /// Whether or not to activate these triggers, in order: cards on board OtherCardAssignedToSlot, this card ResolveOnBoard, cards on board OtherCardResolve. /// The enumeration of the card being placed in the slot. - public static IEnumerator CreateCardInSlot( - this CardSlot slotToSpawnIn, - CardInfo cardInfo, - float transitionLength = 0.1f, - bool resolveTriggers = true - ) + public static IEnumerator CreateCardInSlot(this CardSlot slotToSpawnIn, CardInfo cardInfo, float transitionLength = 0.1f, bool resolveTriggers = true) { yield return BoardManager.Instance.CreateCardInSlot(cardInfo, slotToSpawnIn, transitionLength, resolveTriggers); } @@ -54,13 +52,7 @@ public static IEnumerator CreateCardInSlot( /// An action to do after the assignment has completed. /// Whether or not to activate the 'Trigger.OtherCardAssignedToSlot' for the cards on board. /// The enumeration of the card being placed in the slot. - public static IEnumerator AssignCardToSlot( - this CardSlot slotToSpawnIn, - PlayableCard playableCard, - float transitionDuration = 0.1f, - Action tweenCompleteCallback = null, - bool resolveTriggers = true - ) + public static IEnumerator AssignCardToSlot(this CardSlot slotToSpawnIn, PlayableCard playableCard, float transitionDuration = 0.1f, Action tweenCompleteCallback = null, bool resolveTriggers = true) { yield return BoardManager.Instance.AssignCardToSlot(playableCard, slotToSpawnIn, transitionDuration, tweenCompleteCallback, resolveTriggers); } @@ -74,13 +66,7 @@ public static IEnumerator AssignCardToSlot( /// An action to do after the assignment has completed, but before 'ResolveOnBoard' triggers. /// Whether or not to activate these triggers, in order: cards on board OtherCardAssignedToSlot, this card ResolveOnBoard, cards on board OtherCardResolve. /// The enumeration of the card being placed in the slot. - public static IEnumerator ResolveCardOnBoard( - this CardSlot slotToSpawnIn, - PlayableCard playableCard, - float tweenLength = 0.1f, - Action landOnBoardCallback = null, - bool resolveTriggers = true - ) + public static IEnumerator ResolveCardOnBoard(this CardSlot slotToSpawnIn, PlayableCard playableCard, float tweenLength = 0.1f, Action landOnBoardCallback = null, bool resolveTriggers = true) { yield return BoardManager.Instance.ResolveCardOnBoard(playableCard, slotToSpawnIn, tweenLength, landOnBoardCallback, resolveTriggers); } @@ -128,9 +114,7 @@ public static CardSlot GetAdjacent(this CardSlot cardSlot, bool adjacentOnLeft) /// An IEnumerable of PlayableCard from the CardSlots sequence. public static IEnumerable SelectCards(this IEnumerable slots, Predicate filterOnPredicate = null) { - return slots - .Where(slot => slot.Card && (filterOnPredicate == null || filterOnPredicate.Invoke(slot.Card))) - .Select(slot => slot.Card); + return slots.Where(slot => slot.Card && (filterOnPredicate == null || filterOnPredicate.Invoke(slot.Card))).Select(slot => slot.Card); } /// diff --git a/InscryptionAPI/Helpers/Extensions/GameObjectExtensions.cs b/InscryptionAPI/Helpers/Extensions/GameObjectExtensions.cs index be1629b4..af5eb9c6 100644 --- a/InscryptionAPI/Helpers/Extensions/GameObjectExtensions.cs +++ b/InscryptionAPI/Helpers/Extensions/GameObjectExtensions.cs @@ -2,8 +2,17 @@ namespace InscryptionAPI.Helpers.Extensions; +/// +/// An Extensions Class for the +/// public static class GameObjectExtensions { + /// + /// Finds the Children of a Given + /// + /// The we want to find the children of. + /// The name of the child we are looking for within the children. + /// A with the name being looked for. public static GameObject FindChild(this GameObject parent, string name) { if (parent.name == name) diff --git a/InscryptionAPI/Helpers/Extensions/ListExtensions.cs b/InscryptionAPI/Helpers/Extensions/ListExtensions.cs index f6195781..58810bf5 100644 --- a/InscryptionAPI/Helpers/Extensions/ListExtensions.cs +++ b/InscryptionAPI/Helpers/Extensions/ListExtensions.cs @@ -2,8 +2,17 @@ namespace InscryptionAPI.Helpers.Extensions; +/// +/// An Extensions Class for the . +/// public static class ListExtensions { + /// + /// Removes the First element of the passed . + /// + /// The in which we want to remove the First item of. + /// The type of we are operating on, for example where T is would result in the Type being . + /// Returns the First item of after removing it from the . public static T PopFirst(this List list) { T t = list[0]; @@ -11,6 +20,12 @@ public static T PopFirst(this List list) return t; } + /// + /// Removes the Last element of the passed . + /// + /// The in which we want to remove the Last item of. + /// The type of we are operating on, for example where T is would result in the Type being . + /// Returns the Last item of after removing it from the . public static T PopLast(this List list) { T t = list[list.Count - 1]; @@ -18,6 +33,13 @@ public static T PopLast(this List list) return t; } + /// + /// Repeatedly adds the specified item to a X times. + /// + /// The Item in which we want to repeat. + /// The amount of times we want to repeat it. + /// The type of we are operating on, for example where T is would result in the Type being . + /// A new of the item specified by repeated for the amount of times specified by the parameter. public static List Repeat(this T toRepeat, int times) { List repeated = new(); @@ -31,12 +53,24 @@ public static List Repeat(this T toRepeat, int times) return repeated; } + /// + /// A function used to get a Random item from the . + /// + /// The we are using to get a Random Item from. + /// The type of we are operating on, for example where T is would result in the Type being . + /// A Random element from the passed using public static T GetRandom(this List list) { int index = UnityEngine.Random.Range(0, list.Count); return list[index]; } + /// + /// A function used to get a Seeded Random item from the . + /// + /// The we are using to get a Seeded Random Item from. + /// The type of we are operating on, for example where T is would result in the Type being . + /// A Seeded Random element from the passed using public static T GetSeededRandom(this List list, int seed) { int index = SeededRandom.Range(0, list.Count, seed); diff --git a/InscryptionAPI/Helpers/MaterialOverride.cs b/InscryptionAPI/Helpers/MaterialOverride.cs index 4ad0696d..434984c9 100644 --- a/InscryptionAPI/Helpers/MaterialOverride.cs +++ b/InscryptionAPI/Helpers/MaterialOverride.cs @@ -2,79 +2,200 @@ namespace InscryptionAPI.Helpers; +/// +/// A Helper Object for Materials on an Object. +/// public class MaterialOverride { + /// + /// The Main Texture as a . + /// public Texture2D MainTexture = null; + /// + /// Whether the Main Texture should be Overwritten or not. + /// public bool OverrideMainTexture = false; - + /// + /// The Emission Texture as a . + /// public Texture2D Emission = null; + /// + /// Whether the Emission Texture should be Overwritten or not. + /// public bool OverrideEmission = false; - + /// + /// The Normal Map as a . + /// public Texture2D NormalMap = null; + /// + /// Whether the Normal Map should be Overwritten or not. + /// public bool OverrideNormalMap = false; - + /// + /// The Height Map as a . + /// public Texture2D HeightMap = null; + /// + /// Whether the Height Map should be Overwritten or not. + /// public bool OverrideHeightMap = false; - + /// + /// The Metallic Map as a . + /// public Texture2D MetallicMap = null; + /// + /// Whether the Metallic Map should be Overwritten or not. + /// public bool OverrideMetallicMap = false; - + /// + /// The Occlusion Map as a . + /// public Texture2D OcclusionMap = null; + /// + /// Whether the Occlusion Map should be Overwritten or not. + /// public bool OverrideOcclusionMap = false; - + /// + /// The Detail Mask as a . + /// public Texture2D DetailMask = null; + /// + /// Whether the Detail Mask should be Overwritten or not. + /// public bool OverrideDetailMask = false; - + /// + /// The Metallic Surface Property. How Metallic should the Material be? + /// public float? Metallic = null; + /// + /// Whether the Metallic Value should be Overwritten or not. + /// + public bool OverrideMetallic = false; + /// + /// The Surface Smoothness Property. How Smooth should the Material be? + /// public float? Smoothness = null; + /// + /// Whether the Smoothness Value should be Overwritten or not. + /// + public bool OverrideSmoothness = false; + /// + /// The Displacement Height Property. How displaced should the Material be compared to the Model it is applied to? + /// public float? Height = null; - + /// + /// Whether the Height Value should be Overwritten or not. + /// + public bool OverrideHeight = false; + + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeMainTexture(Texture2D tex) { MainTexture = tex; OverrideMainTexture = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeEmission(Texture2D tex) { Emission = tex; OverrideEmission = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeNormalMap(Texture2D tex) { NormalMap = tex; OverrideNormalMap = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeHeightMap(Texture2D tex) { HeightMap = tex; OverrideHeightMap = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeMetallicMap(Texture2D tex) { MetallicMap = tex; OverrideMetallicMap = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeOcclusionMap(Texture2D tex) { OcclusionMap = tex; OverrideOcclusionMap = true; return this; } - + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. public MaterialOverride ChangeDetailMask(Texture2D tex) { DetailMask = tex; OverrideMainTexture = true; return this; } + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. + public MaterialOverride ChangeMetallic(float metallic) + { + Metallic = metallic; + OverrideMetallic = true; + return this; + } + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. + public MaterialOverride ChangeSmoothness(float smoothness) + { + Smoothness = smoothness; + OverrideSmoothness = true; + return this; + } + /// + /// A function for changing the of a . + /// + /// The in which to use to replace . + /// An Overwritten and set to true. + public MaterialOverride ChangeHeight(float height) + { + Height = height; + OverrideHeight = true; + return this; + } } diff --git a/InscryptionAPI/Helpers/ResourceLookup.cs b/InscryptionAPI/Helpers/ResourceLookup.cs index d7422530..65da8c8d 100644 --- a/InscryptionAPI/Helpers/ResourceLookup.cs +++ b/InscryptionAPI/Helpers/ResourceLookup.cs @@ -1,17 +1,31 @@ -using InscryptionAPI.Helpers; -using UnityEngine; +using UnityEngine; -namespace InscryptionAPI.Items; +namespace InscryptionAPI.Helpers; /// -/// Define how an asset should be retrieved so we can fetch it at any time. +/// A Helper Object for ResourceLookup. /// +/// Define how an asset should be retrieved so we can fetch it at any time. public class ResourceLookup : ICloneable { + /// + /// The Path to the Resource. + /// public string ResourcePath { get; private set; } + /// + /// The Resources BankID. + /// public string ResourceBankID { get; private set; } + /// + /// The Prefab associated with the Lookup. + /// public GameObject Prefab { get; private set; } + /// + /// Gets a Prefab from the passed Path and Prefab Name. + /// + /// The Path to the in which to search for the Prefab. + /// The Name of the Prefab we are searching for in the . public void FromAssetBundle(string assetBundlePath, string assetBundlePrefabName) { if (AssetBundleHelper.TryGet(assetBundlePath, assetBundlePrefabName, out GameObject go)) @@ -19,7 +33,11 @@ public void FromAssetBundle(string assetBundlePath, string assetBundlePrefabName Prefab = go; } } - + /// + /// Gets a Prefab from the passed and Prefab Name. + /// + /// The in which to search for the Prefab. + /// The Name of the Prefab we are searching for in the . public void FromAssetBundle(AssetBundle assetBundle, string assetBundlePrefabName) { if (AssetBundleHelper.TryGet(assetBundle, assetBundlePrefabName, out GameObject go)) @@ -27,7 +45,12 @@ public void FromAssetBundle(AssetBundle assetBundle, string assetBundlePrefabNam Prefab = go; } } - + /// + /// Gets a Prefab from the passed DLL based Path and Prefab Name. + /// + /// The Path to the Asset Bundle within the DLL Assembly. + /// The Name of the Prefab we are searching for in the . + /// public void FromAssetBundleInAssembly(string assetBundlePath, string assetBundlePrefabName) { byte[] resourceBytes = TextureHelper.GetResourceBytes(assetBundlePath, typeof(T).Assembly); @@ -36,22 +59,37 @@ public void FromAssetBundleInAssembly(string assetBundlePath, string assetBun Prefab = go; } } - + + /// + /// Sets the to the ResourcePath passed in. + /// + /// The Path to the Resource. public void FromResources(string resourcePath) { this.ResourcePath = resourcePath; } - + /// + /// Sets the to the ResourceBankID passed in. + /// + /// The ResourceBankID. public void FromResourceBank(string resourceBankID) { this.ResourceBankID = resourceBankID; } - + /// + /// Sets the to the Prefab passed in. + /// + /// The Prefab itself. public void FromPrefab(GameObject prefab) { this.Prefab = prefab; } + /// + /// Gets the UnityObject Representative of the Prefab. + /// + /// A representative of the Prefab. + /// A if successful, a Null if we failed to get the Type from the Prefab, and a Default(T) if the ResourceLookup failed. public virtual T Get() where T : UnityObject { if (!string.IsNullOrEmpty(ResourcePath)) @@ -83,14 +121,22 @@ public virtual T Get() where T : UnityObject return default(T); } + /// + /// Turns the ResourceLookup Object into a String. + /// + /// A String of the ResourceLookup Object. public override string ToString() { return $"ResourceLookup(ResourcePath:{ResourcePath}, ResourceBankID:{ResourceBankID}, Prefab:{Prefab})"; } + /// + /// Clones the Object into a Shallow Copy of the current ResourceLookup. + /// + /// A Cloned Object representing the ResourceLookup. public object Clone() { - ResourceLookup cardInfo = (ResourceLookup)base.MemberwiseClone(); - return cardInfo; + ResourceLookup resourceLookup = (ResourceLookup)base.MemberwiseClone(); + return resourceLookup; } } \ No newline at end of file diff --git a/InscryptionAPI/Helpers/ResourcesManagerHelpers.cs b/InscryptionAPI/Helpers/ResourcesManagerHelpers.cs index c872e039..4a2be356 100644 --- a/InscryptionAPI/Helpers/ResourcesManagerHelpers.cs +++ b/InscryptionAPI/Helpers/ResourcesManagerHelpers.cs @@ -7,13 +7,16 @@ namespace InscryptionAPI.Helpers; +/// +/// A Helper Set related to the . +/// public static class ResourcesManagerHelpers { /// /// Removes a given amount of energy cells, which determines how much energy a player has available at the start of a turn. /// Affected by 'ResourcesManager.preventNextEnergyLoss'. /// - /// The ResourcesManager Instance. + /// The current . /// How many energy cells to close. Gets capped to the current number of open energy cells. public static IEnumerator RemoveMaxEnergy(this ResourcesManager instance, int amount) { @@ -24,7 +27,7 @@ public static IEnumerator RemoveMaxEnergy(this ResourcesManager instance, int am /// A variant of RemoveMaxEnergy that can bypass ResourcesManager.PreventNextEnergyLoss. /// Affected by 'ResourcesManager.preventNextEnergyLoss'. /// - /// The ResourcesManager Instance. + /// The current . /// How many energy cells to close. Gets capped to the current number of open energy cells. public static IEnumerator RemoveMaxEnergy(this ResourcesManager instance, int amount, bool preventable) { @@ -44,6 +47,12 @@ public static IEnumerator RemoveMaxEnergy(this ResourcesManager instance, int am yield return instance.ShowRemoveMaxEnergy(numToClose); } + /// + /// A used to show removal of Max Energy. + /// + /// The current . + /// The amount of lost Max Energy. + /// The Depleted Energy Counter from removing the specified amount of max energy. public static IEnumerator ShowRemoveMaxEnergy(this ResourcesManager instance, int amount) { PixelResourcesManager pixelManager = instance as PixelResourcesManager; @@ -64,6 +73,13 @@ public static IEnumerator ShowRemoveMaxEnergy(this ResourcesManager instance, in yield return new WaitForSeconds(0.05f); } } + + /// + /// Gets the Amount of Gems of the passed . + /// + /// The current . + /// The we want to get the count of. + /// The Count of Gems associated with the passed . public static int GemsOfType(this ResourcesManager instance, GemType gem) { return instance.gems.Count(x => x == gem); @@ -82,6 +98,13 @@ public static int GemCount(bool playerGems, GemType gemToCheck) else return OpponentGemsManager.Instance.GemsOfType(gemToCheck); } + + /// + /// A bool used to determine whether the Owner has Gems of the specified 's. + /// + /// Whether the Check should be based on the Opponent or Player. + /// The 's in which to check if the Opponent has. + /// The result of if the Check is for the Player, otherwise the result of . public static bool OwnerHasGems(bool playerGems, params GemType[] gems) { if (playerGems) @@ -89,6 +112,12 @@ public static bool OwnerHasGems(bool playerGems, params GemType[] gems) else return OpponentHasGems(gems); } + + /// + /// A bool used to determine whether the Opponent has Gems of the specified 's. + /// + /// The 's in which to check if the Opponent has. + /// A true if the Opponent has all specified 's, a false if not. public static bool OpponentHasGems(params GemType[] gems) { if (OpponentGemsManager.Instance == null) @@ -101,6 +130,12 @@ public static bool OpponentHasGems(params GemType[] gems) } return true; } + + /// + /// A bool used to determine whether the Player has Gems of the specified 's. + /// + /// The 's in which to check if the Player has. + /// A true if the Player has all specified 's, a false if not. public static bool PlayerHasGems(params GemType[] gems) { foreach (GemType gem in gems) @@ -112,11 +147,21 @@ public static bool PlayerHasGems(params GemType[] gems) } } +/// +/// A Patch Class used to Get the Empty Battery Sprite in the GBC section. +/// [HarmonyPatch(typeof(PixelResourcesManager), nameof(PixelResourcesManager.Start))] public static class GetEmptyBatterySprite { + /// + /// The Empty Battery Sprite. + /// public static Sprite emptyBatterySprite = null; + /// + /// A function used to Get and set the . + /// + /// The Instance of the Object, in this case . [HarmonyPostfix] private static void GetSprite(PixelResourcesManager __instance) { diff --git a/InscryptionAPI/Helpers/TextureHelper.cs b/InscryptionAPI/Helpers/TextureHelper.cs index 0502a611..383bd1fc 100644 --- a/InscryptionAPI/Helpers/TextureHelper.cs +++ b/InscryptionAPI/Helpers/TextureHelper.cs @@ -8,13 +8,14 @@ namespace InscryptionAPI.Helpers; /// -/// This class contains a number of helper methods for managing textures. +/// A Helper Set related to the and . /// +/// This class contains a number of helper methods for managing textures. [HarmonyPatch] public static class TextureHelper { /// - /// Thie is used to indicate what type of sprite you wish to create so that the appropriate size and pivot point can be determined. + /// This is used to indicate what type of sprite you wish to create so that the appropriate size and pivot point can be determined. /// public enum SpriteType : int { @@ -22,76 +23,74 @@ public enum SpriteType : int /// A card's portrait art in Act 1 or Act 3. /// CardPortrait = 0, - /// /// A card's portrait art in Act 2. /// PixelPortrait = 1, - /// /// An ability icon (sigil) in Act 2. /// PixelAbilityIcon = 2, - /// /// A special stat icon in Act 2. /// PixelStatIcon = 3, - /// /// A challenge skull displayed on the challenge UI during the setup of a Kaycee's Mod run. /// ChallengeIcon = 4, - /// /// The texture that displays the card's cost in Act 1. /// CostDecal = 5, - /// /// The large decal used to display multiple/hybrid card costs in Act 1. /// OversizedCostDecal = 6, - /// /// The decal used to display card costs in Act 2, on the top-left of the card. /// Act2CostDecalLeft = 7, - /// /// The decal used to display card costs in Act 2, on the top-right of the card. /// Act2CostDecalRight = 8, - /// /// The starter deck icon displayed on the challenge UI during the setup on a Kaycee's Mod run. /// StarterDeckIcon = 9, - /// /// The decal used by the API in Act 2, comprising the entire card's dimensions. /// PixelDecal = 10, - /// /// An activated ability icon (sigil) in Act 2. /// PixelActivatedAbilityIcon = 11, - /// /// The texture for a button in Act 2 (same kind of button used for the hammer and activated sigils). /// PixelStandardButton = 12, - + /// + /// The texture for the Act 2 cost when it's on the Left. + /// Act2CostVanillaLeft = 13, - + /// + /// The texture for a Act 2 cost when it's on the right. + /// Act2CostVanillaRight = 14 }; - + /// + /// The Default Pivot to use across most Sprites. + /// private static Vector2 DEFAULT_PIVOT = new(0.5f, 0.5f); - + /// + /// A Dictionary of , representing an Emission Mapping. + /// private static readonly Dictionary emissionMap = new(); - + /// + /// A Dictionary of , used to define the Rectangular Area for a given Sprite Type. + /// private static readonly Dictionary SPRITE_RECTS = new() { { SpriteType.CardPortrait, new Rect(0f, 0f, 114f, 94f) }, @@ -107,10 +106,12 @@ public enum SpriteType : int { SpriteType.PixelDecal, new Rect(0f, 0f, 42f, 56f) }, { SpriteType.PixelActivatedAbilityIcon, new Rect(0f, 0f, 22f, 10f) }, { SpriteType.PixelStandardButton, new Rect(0f, 0f, 26f, 17f) }, - { SpriteType.Act2CostVanillaLeft, new Rect(0f, 0f, 48f, 28f) }, // vanilla costs should have a creme border on the left and right so we don't need padding + { SpriteType.Act2CostVanillaLeft, new Rect(0f, 0f, 48f, 28f) }, { SpriteType.Act2CostVanillaRight, new Rect(0f, 0f, 48f, 28f) } }; - + /// + /// A Dictionary of , used to define the Pivot Point for a given Sprite Type. + /// private static readonly Dictionary SPRITE_PIVOTS = new() { { SpriteType.CardPortrait, DEFAULT_PIVOT }, @@ -252,6 +253,11 @@ public static void RegisterEmissionForSprite(this Sprite regularSprite, Sprite e emissionMap[regularSprite] = emissionSprite; } + /// + /// A Function used to Get the Emission from the Card Portrait at first through the , and if that fails, from the . + /// + /// The Card Portrait . + /// An Emission associated with the passed Card Portrait public static Sprite GetEmissionSprite(this Sprite sprite) { if (sprite == null) @@ -260,7 +266,6 @@ public static Sprite GetEmissionSprite(this Sprite sprite) if (emissionMap.TryGetValue(sprite, out Sprite emission)) return emission; - string text = sprite.name + "_emission"; emission = ResourceBank.Get("Art/Cards/Portraits/" + text); if (emission != null) @@ -315,6 +320,12 @@ public static void TryReuseEmission(CardInfo info, Sprite alternatePortrait) emissionMap[alternatePortrait] = emissionMap[info.portraitTex]; } + /// + /// A patch to to allow for usage of Custom Emissions instead. + /// + /// The Card Portrait . + /// The returned result in this case the Emission associated with the Card Portrait within , if not found it lets vanilla handle it normally. + /// A false if the contains an Emission correlated with the Card Portrait , otherwise false to let the game handle it. [HarmonyPatch(typeof(CardDisplayer3D), nameof(CardDisplayer3D.GetEmissivePortrait))] [HarmonyPrefix] private static bool GetCustomEmission(Sprite mainPortrait, ref Sprite __result) @@ -330,9 +341,9 @@ private static bool GetCustomEmission(Sprite mainPortrait, ref Sprite __result) /// /// Reads the contents of an image file in an assembly and returns it as a byte array. /// - /// The name of the art file stored as a resource in the assembly. + /// The name of the art file stored as a resource in the assembly. /// The assembly to pull the art from. - /// The contents of the file in pathCardArt as a byte array. + /// The contents of the file in filename as a byte array. public static byte[] GetResourceBytes(string filename, Assembly target) { string lowerKey = $".{filename.ToLowerInvariant()}"; @@ -354,14 +365,6 @@ public static byte[] GetResourceBytes(string filename, Assembly target) /// /// Combines multiple textures into one, using a tiled approach. /// - /// - /// This helper has a very specific purpose. The pixels in baseTexture will be iteratively replaced with the pixels - /// in the pieces array. The X position for the i-th texture will be - /// xOffset + xStep * i. The Y position for the i-th texture will be - /// yOffset + yStep * (pieces.Count - i - 1). - /// - /// **Note**: baseTexture will be modified in-place! - /// /// The individual textures to combine into the base texture. /// The background texture for the combined texture. /// Used to set the position for individual textures. @@ -369,6 +372,14 @@ public static byte[] GetResourceBytes(string filename, Assembly target) /// Used to set the position for individual textures. /// Used to set the position for individual textures. /// The modified texture (the same Texture references as baseTexture). + /// + /// This helper has a very specific purpose. The pixels in will be iteratively replaced with the pixels + /// in the array. The X position for the i-th texture will be + /// + * i. The Y position for the i-th texture will be + /// + * (.Count - i - 1). + /// + /// Note: will be modified in-place! + /// public static Texture2D CombineTextures(List pieces, Texture2D baseTexture, int xStep = 0, int yStep = 0, int xOffset = 0, int yOffset = 0) { if (pieces != null) @@ -387,42 +398,18 @@ public static Texture2D CombineTextures(List pieces, Texture2D baseTe /// Creates an identical copy of a given texture /// /// The texture to copy. + /// This code originates from public static Texture2D DuplicateTexture(Texture2D texture) { - // https://support.unity.com/hc/en-us/articles/206486626-How-can-I-get-pixels-from-unreadable-textures- - // Create a temporary RenderTexture of the same size as the texture - - RenderTexture tmp = RenderTexture.GetTemporary( - texture.width, - texture.height, - 0, - RenderTextureFormat.Default, - RenderTextureReadWrite.Linear); - - - // Blit the pixels on texture to the RenderTexture + RenderTexture tmp = RenderTexture.GetTemporary(texture.width, texture.height, 0, RenderTextureFormat.Default, RenderTextureReadWrite.Linear); Graphics.Blit(texture, tmp); - - // Backup the currently set RenderTexture RenderTexture previous = RenderTexture.active; - - // Set the current RenderTexture to the temporary one we created RenderTexture.active = tmp; - - // Create a new readable Texture2D to copy the pixels to it - Texture2D myTexture2D = new(texture.width, texture.height); - - // Copy the pixels from the RenderTexture to the new Texture myTexture2D.ReadPixels(new Rect(0, 0, tmp.width, tmp.height), 0, 0); myTexture2D.Apply(); - - // Reset the active RenderTexture RenderTexture.active = previous; - - // Release the temporary RenderTexture RenderTexture.ReleaseTemporary(tmp); - return myTexture2D; } @@ -525,4 +512,4 @@ public static Dictionary GetCustomAppearanceTypeFromDictionar } #endregion -} +} \ No newline at end of file diff --git a/InscryptionAPI/Helpers/TranspilerHelpers.cs b/InscryptionAPI/Helpers/TranspilerHelpers.cs index 10a1f563..cf0b1b05 100644 --- a/InscryptionAPI/Helpers/TranspilerHelpers.cs +++ b/InscryptionAPI/Helpers/TranspilerHelpers.cs @@ -2,9 +2,17 @@ namespace InscryptionAPI.Helpers; +/// +/// A Helper Set related to the Transpiler. +/// public static class TranspilerHelpers { - public static void LogCodeInscryptions(this List codes, string prefix = null) + /// + /// A function used to log OpCode Intructions. + /// + /// The List of OpCodes to Log. + /// An Optional Prefix to help indicate where the Logs Originate, or what the OpCodes relate to. + public static void LogCodeInstructions(this List codes, string prefix = null) { string p = prefix ?? ""; for (int i = 0; i < codes.Count; i++) diff --git a/InscryptionAPI/Items/ConsumableItemManager.cs b/InscryptionAPI/Items/ConsumableItemManager.cs index 9922bf71..83bd5b16 100644 --- a/InscryptionAPI/Items/ConsumableItemManager.cs +++ b/InscryptionAPI/Items/ConsumableItemManager.cs @@ -10,7 +10,6 @@ namespace InscryptionAPI.Items; - public static class ConsumableItemManager { public class FullConsumableItemData diff --git a/InscryptionAPI/Items/ConsumableItemResource.cs b/InscryptionAPI/Items/ConsumableItemResource.cs index 56f58bfa..14489c10 100644 --- a/InscryptionAPI/Items/ConsumableItemResource.cs +++ b/InscryptionAPI/Items/ConsumableItemResource.cs @@ -1,4 +1,5 @@ using DiskCardGame; +using InscryptionAPI.Helpers; using UnityEngine; namespace InscryptionAPI.Items; diff --git a/InscryptionAPI/Masks/MaskBehaviour.cs b/InscryptionAPI/Masks/MaskBehaviour.cs index ce8fe5db..38f9a072 100644 --- a/InscryptionAPI/Masks/MaskBehaviour.cs +++ b/InscryptionAPI/Masks/MaskBehaviour.cs @@ -101,7 +101,6 @@ protected virtual void OverrideSmoothnessValue(MaterialOverride materialOverride protected virtual void OverrideMetallic(MaterialOverride materialOverride, Material material) { - material.SetFloat("_Metallic", materialOverride.Metallic.Value); } diff --git a/InscryptionAPI/Masks/MaskManager.cs b/InscryptionAPI/Masks/MaskManager.cs index 285d344b..d9700b66 100644 --- a/InscryptionAPI/Masks/MaskManager.cs +++ b/InscryptionAPI/Masks/MaskManager.cs @@ -83,7 +83,7 @@ public static CustomMask Override(string guid, string name, LeshyAnimationContro /// /// GUID of your mod. /// Name of the mask. - /// The mask we want to add so we cna tell leshy to put on that specific mask. + /// The mask we want to add so we can tell leshy to put on that specific mask. /// The model the mask will use. /// . /// . diff --git a/InscryptionAPI/Masks/Patches.cs b/InscryptionAPI/Masks/Patches.cs index bb419dc1..82087a8f 100644 --- a/InscryptionAPI/Masks/Patches.cs +++ b/InscryptionAPI/Masks/Patches.cs @@ -1,5 +1,6 @@ using DiskCardGame; using HarmonyLib; +using InscryptionAPI.Helpers; using InscryptionAPI.Items; using UnityEngine; From d2f115b67b42e37804443b9f19e3e977cc81d5bc Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Sat, 3 Oct 2026 21:14:52 -0400 Subject: [PATCH 09/11] Add Debug Logging related to `GenerateTradeCardsWithCostTier`. * Puts `SteelTrapDeathPatch.cs` under the `InscryptionAPI.Card.Patches` Namespace. * Adds a Patch that Injects Debug Logging related to `GenerateTradeCardsWithCostTier` issues. * Adds a Configuration for enabling the Logging. * Adds Debug Logging for the Entiere `CardLoader.LearnedCards` List. Signed-off-by: Chaosyr --- ...rdsWithCostTierWithOptionalDebugLogging.cs | 206 ++++++++++++++ .../Card/Patches/SteelTrapDeathPatch.cs | 2 +- InscryptionAPI/InscryptionAPIPlugin.cs | 267 ++++++++++++++++++ 3 files changed, 474 insertions(+), 1 deletion(-) create mode 100644 InscryptionAPI/Card/Patches/PatchGenerateTradeCardsWithCostTierWithOptionalDebugLogging.cs diff --git a/InscryptionAPI/Card/Patches/PatchGenerateTradeCardsWithCostTierWithOptionalDebugLogging.cs b/InscryptionAPI/Card/Patches/PatchGenerateTradeCardsWithCostTierWithOptionalDebugLogging.cs new file mode 100644 index 00000000..c26a2734 --- /dev/null +++ b/InscryptionAPI/Card/Patches/PatchGenerateTradeCardsWithCostTierWithOptionalDebugLogging.cs @@ -0,0 +1,206 @@ +using DiskCardGame; +using HarmonyLib; +using InscryptionAPI.Guid; +using UnityEngine; + +namespace InscryptionAPI.Card.Patches; + +/// +/// A Patch in which injects Loggers and Validation Check Logging into 'GenerateTradeCardsWithCostTier' before it runs to try and debug errors related to it. +/// +[HarmonyPatch(typeof(TradeCardsForPelts), "GenerateTradeCardsWithCostTier")] +internal static class PatchGenerateTradeCardsWithCostTierWithOptionalDebugLogging +{ + /// + /// Makes our system Log 'GenerateTradeCardsWithCostTier' related issues. + /// + /// The Number Of Cards to Generate. + /// The Tier of Cards that should be Generated. + /// The RandomSeed associated with the Generation. + [HarmonyPrefix] + private static void Prefix(int numCards, int tier, int randomSeed) + { + try + { + LogGenerateTradeCardsWithCostTierState(numCards, tier, randomSeed); + } + catch (Exception ex) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] Prefix logging failed. " + $"The original GenerateTradeCardsWithCostTier method will still run. " + $"Exception: {ex}"); + } + } + } + + /// + /// A function use to Log relevant info and checks for 'GenerateTradeCardsWithCostTier'. + /// + /// The Number Of Cards to Generate. + /// The Tier of Cards that should be Generated. + /// The RandomSeed associated with the Generation. + private static void LogGenerateTradeCardsWithCostTierState(int numCards, int requestedTier, int randomSeed) + { + bool flag = requestedTier > 0; + int effectiveTier = Mathf.Max(1, requestedTier); + + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug($"===== GenerateTradeCardsWithCostTier pre-run ===== " + $"numCards={numCards}, " + $"requestedTier={requestedTier}, " + $"effectiveTier={effectiveTier}, " + $"randomSeed={randomSeed}, " + $"flag={flag}"); + } + List learnedCards = CardLoader.LearnedCards; + + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug($"[TradeCardsForPelts Debug] LearnedCards count before vanilla filtering: {learnedCards.Count}"); + } + for (int index = 0; index < learnedCards.Count; index++) + { + CardInfo card = learnedCards[index]; + + if (card == null) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] NULL CardInfo in CardLoader.LearnedCards " + $"at index={index}."); + } + continue; + } + + CardTemple temple; + int costTier; + + try + { + temple = card.temple; + costTier = card.CostTier; + } + catch (Exception ex) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] Failed while evaluating vanilla outer predicate | " + $"index={index} | " + $"card={GetCardName(card)} | " + $"exception={ex}"); + } + continue; + } + + if (temple != CardTemple.Nature || costTier != effectiveTier) + continue; + + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug($"[TradeCardsForPelts Debug] Vanilla ability-filter candidate | " + $"index={index} | " + $"card={GetCardName(card)} | " + $"temple={temple} | " + $"costTier={costTier} | " + $"baseAbilities=[{FormatAbilities(card.abilities)}] | " + $"mods={card.mods?.Count ?? 0}"); + } + List effectiveAbilities; + + try + { + effectiveAbilities = card.Abilities; + } + catch (Exception ex) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] card.Abilities threw while evaluating the " + $"same property vanilla will use | " + $"index={index} | " + $"card={GetCardName(card)} | " + $"exception={ex}"); + } + continue; + } + + if (effectiveAbilities == null) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] NULL effective CardInfo.Abilities list | " + $"index={index} | " + $"card={GetCardName(card)} | " + $"tier={effectiveTier} | " + $"mods={card.mods?.Count ?? 0}"); + } + continue; + } + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug($"[TradeCardsForPelts Debug] Effective abilities | " + $"index={index} | " + $"card={GetCardName(card)} | " + $"abilities=[{FormatAbilities(effectiveAbilities)}]"); + } + for (int abilityIndex = 0; abilityIndex < effectiveAbilities.Count; abilityIndex++) + { + Ability ability = effectiveAbilities[abilityIndex]; + string abilityName = GetGuidAndKey(ability); + + AbilityInfo abilityInfo; + + try + { + abilityInfo = AbilitiesUtil.GetInfo(ability); + } + catch (Exception ex) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] AbilitiesUtil.GetInfo threw | " + $"card={GetCardName(card)} | " + $"tier={effectiveTier} | " + $"abilityIndex={abilityIndex} | " + $"ability={abilityName} | " + $"rawValue={(int)ability} | " + $"exception={ex}"); + } + continue; + } + + if (abilityInfo == null) + { + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogError($"[TradeCardsForPelts Debug] VANILLA NRE CANDIDATE: " + $"AbilitiesUtil.GetInfo returned null | " + $"card={GetCardName(card)} | " + $"tier={effectiveTier} | " + $"abilityIndex={abilityIndex} | " + $"ability={abilityName} | " + $"rawValue={(int)ability} | " + $"baseAbilities=[{FormatAbilities(card.abilities)}] | " + $"effectiveAbilities=[{FormatAbilities(effectiveAbilities)}] | " + $"mods={card.mods?.Count ?? 0} | " + $"vanillaExpression=!AbilitiesUtil.GetInfo(a).opponentUsable"); + } + continue; + } + + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug($"[TradeCardsForPelts Debug] Ability lookup OK | " + $"card={GetCardName(card)} | " + $"tier={effectiveTier} | " + + $"abilityIndex={abilityIndex} | " + $"ability={abilityName} | " + $"rawValue={(int)ability} | " + $"opponentUsable={abilityInfo.opponentUsable}"); + } + } + } + if (InscryptionAPI.InscryptionAPIPlugin.configEnableTraderCostTierBugDebugLogging.Value) + { + InscryptionAPI.InscryptionAPIPlugin.Logger.LogDebug("===== End GenerateTradeCardsWithCostTier pre-run ====="); + } + } + + /// + /// Formats the Passed Abilities as a String. + /// + /// The Abilities to cast into the String. + /// A Formatted Abilities String. + private static string FormatAbilities(IEnumerable abilities) + { + if (abilities == null) + return "null"; + + return string.Join(", ", abilities.Select(GetGuidAndKey)); + } + + /// + /// Gets a GUID and Key associated with a Ability from the passed in Ability Value. + /// + /// The Ability we want to get the String Name of. + /// A String representing the Ability either via the GUID system or the Enum System. + private static string GetGuidAndKey(Ability ability) + { + if (GuidManager.TryGetGuidAndKeyEnumValue(ability, out string guid, out string key)) + return $"{guid}_{key}"; + + return ability.ToString(); + } + + /// + /// Gets the Card Name and DisplayName of the passed in Card. + /// + /// The Card to get the Name of. + /// A string of the Card's Name and DisplayName. + private static string GetCardName(CardInfo card) + { + if (card == null) + return "null"; + + string internalName = string.IsNullOrEmpty(card.name) ? "null" : card.name; + string displayedName = string.IsNullOrEmpty(card.DisplayedNameEnglish) + ? "null" + : card.DisplayedNameEnglish; + + return $"{internalName} ({displayedName})"; + } +} \ No newline at end of file diff --git a/InscryptionAPI/Card/Patches/SteelTrapDeathPatch.cs b/InscryptionAPI/Card/Patches/SteelTrapDeathPatch.cs index db541bb5..0bdb1f1f 100644 --- a/InscryptionAPI/Card/Patches/SteelTrapDeathPatch.cs +++ b/InscryptionAPI/Card/Patches/SteelTrapDeathPatch.cs @@ -5,7 +5,7 @@ using MonoMod.Cil; using UnityEngine; -namespace InscryptionAPI.Card; +namespace InscryptionAPI.Card.Patches; /// /// Patches the Steal Trap Death system to drop a differed pelt on the case the opposing card has the "SteelTrapPelt" extended property. diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index 91bdd9b1..18d645f7 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -18,6 +18,7 @@ using InscryptionAPI.Totems; using System.Reflection; using System.Runtime.CompilerServices; +using InscryptionAPI.Guid; using InscryptionAPI.Helpers; using Sirenix.Utilities; @@ -77,6 +78,10 @@ public class InscryptionAPIPlugin : BaseUnityPlugin /// This Configuration is used for determining what Item Model should be used in game. /// internal static ConfigEntry configCustomItemModelSelection; + /// + /// This Configuration is used for determining whether we should Log Debugging for the TraderCostTier Bug. + /// + internal static ConfigEntry configEnableTraderCostTierBugDebugLogging; /// /// Prevents API 1.0.0 Versions from Loaing. @@ -184,6 +189,7 @@ private void Awake() configOverrideArrows = Config.Bind("Menus", "Override Arrows", false, "When true, forces the challenge screen arrows to appear at the top of the screen instead of the sides."); configRandomCostChoiceOrder = Config.Bind("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); configHideAct1BossScenery = Config.Bind("Optimization", "Hide Act 1 Scenery", false, "When true bosses will not spawn their scenery. (eg: Prospector's trees) This can improve performance on low-end machines."); + configEnableTraderCostTierBugDebugLogging = Config.Bind("Zebugging", "Enable Logging for Info related to the 'GenerateTradeCardsWithCostTier' method", false, "May be of use for debugging issues related to 'GenerateTradeCardsWithCostTier', by how much no clue. Set this to True to enable the Logging."); } /// @@ -200,6 +206,267 @@ private void Start() PixelCardManager.Initialise(); PeltManager.CreateDialogueEvents(); Logger.LogDebug($"Inserted {DialogueManager.CustomDialogue.Count} dialogue event(s)!"); + DebugLoggingForGenerateTradeCardsWithCostTier(); + } + + /// + /// A Function in which Logs some Debug related to 'GenerateTradeCardsWithCostTier'. There is more related Logging, this is just the Start of it. + /// + private void DebugLoggingForGenerateTradeCardsWithCostTier() + { + foreach (CardInfo info in CardLoader.LearnedCards) + { + if (configEnableTraderCostTierBugDebugLogging.Value) + { + if (info == null) + { + Logger.LogError("CardLoader.LearnedCards contains a null CardInfo."); + continue; + } + + Logger.LogDebug($"===== CardInfo: {info.displayedName ?? info.name ?? "null"} ====="); + + Logger.LogDebug($"name: {info.name ?? "null"}"); + Logger.LogDebug($"displayedName: {info.displayedName ?? "null"}"); + Logger.LogDebug($"displayedNameLocId: {info.displayedNameLocId}"); + Logger.LogDebug($"description: {info.description ?? "null"}"); + + Logger.LogDebug($"baseAttack: {info.baseAttack}"); + Logger.LogDebug($"baseHealth: {info.baseHealth}"); + + Logger.LogDebug($"cost: {info.cost}"); + Logger.LogDebug($"bonesCost: {info.bonesCost}"); + Logger.LogDebug($"energyCost: {info.energyCost}"); + Logger.LogDebug($"gemsCost: {string.Join(", ", info.gemsCost?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + + Logger.LogDebug($"cardComplexity: {info.cardComplexity}"); + Logger.LogDebug($"temple: {info.temple}"); + Logger.LogDebug($"onePerDeck: {info.onePerDeck}"); + Logger.LogDebug($"hideAttackAndHealth: {info.hideAttackAndHealth}"); + + Logger.LogDebug($"metaCategories: {string.Join(", ", info.metaCategories?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + Logger.LogDebug($"tribes: {string.Join(", ", info.tribes?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + Logger.LogDebug($"traits: {string.Join(", ", info.traits?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + + Logger.LogDebug($"abilities: {string.Join(", ", info.abilities?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + Logger.LogDebug($"ascensionAbilities: {string.Join(", ", info.ascensionAbilities?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + Logger.LogDebug($"specialAbilities: {string.Join(", ", info.specialAbilities?.Select(x => GetGuidAndKey(x)) ?? Enumerable.Empty())}"); + + LogAbilityInfos(info, "abilities", info.abilities); + LogAbilityInfos(info, "ascensionAbilities", info.ascensionAbilities); + + Logger.LogDebug($"evolveParams: {GetEvolveParams(info.evolveParams)}"); + Logger.LogDebug($"defaultEvolutionName: {info.defaultEvolutionName ?? "null"}"); + + Logger.LogDebug($"tailParams: {GetTailParams(info.tailParams)}"); + Logger.LogDebug($"iceCubeParams: {GetIceCubeParams(info.iceCubeParams)}"); + + Logger.LogDebug($"flipPortraitForStrafe: {info.flipPortraitForStrafe}"); + + Logger.LogDebug($"specialStatIcon: {info.specialStatIcon}"); + Logger.LogDebug($"boon: {info.boon}"); + + Logger.LogDebug($"mods: {info.mods?.Count ?? 0}"); + Logger.LogDebug($"temporaryDecals: {info.temporaryDecals?.Count ?? 0}"); + Logger.LogDebug($"get_decals: {info.get_decals?.Count ?? 0}"); + + Logger.LogDebug($"Calculated Attack: {info.Attack}"); + Logger.LogDebug($"Calculated Health: {info.Health}"); + Logger.LogDebug($"Calculated BloodCost: {info.BloodCost}"); + Logger.LogDebug($"Calculated BonesCost: {info.BonesCost}"); + Logger.LogDebug($"Calculated EnergyCost: {info.EnergyCost}"); + Logger.LogDebug($"Calculated Gemified: {info.Gemified}"); + Logger.LogDebug($"Calculated CostTier: {info.CostTier}"); + Logger.LogDebug($"Calculated Sacrificable: {info.Sacrificable}"); + Logger.LogDebug($"Calculated PowerLevel: {info.PowerLevel}"); + Logger.LogDebug($"Calculated NumAbilities: {info.NumAbilities}"); + + Logger.LogDebug($"===== End CardInfo: {info.displayedName ?? info.name ?? "null"} ====="); + } + } + LogTradeCardAbilityInfoIssues(); + } + + /// + /// Gets a GUID and Key associated with a Type of Enum from the passed in Enum Value. + /// + /// The Enum we want to get the String Name of. + /// The Enum Type. + /// A String representing the Enum either via the GUID system or the Enum System. + private string GetGuidAndKey(T value) where T : System.Enum + { + if (GuidManager.TryGetGuidAndKeyEnumValue(value, out string guid, out string key)) + return $"{guid}_{key}"; + + return value.ToString(); + } + + /// + /// Gets the String Name and DisplayName from a CardInfo. + /// + /// The Card we want to get the DisplayName of. + /// The Card Name and DisplayName of the passed in Card as a String. + private string GetCardName(CardInfo card) + { + if (card == null) + return "null"; + + return $"{card.name} ({card.DisplayedNameEnglish})"; + } + + /// + /// Gets the String version of the . + /// + /// The we want to turn into a String. + /// The in the form of a String. + private string GetEvolveParams(EvolveParams evolveParams) + { + if (evolveParams == null) + return "null"; + + return $"turnsToEvolve={evolveParams.turnsToEvolve}, evolution={GetCardName(evolveParams.evolution)}"; + } + + /// + /// Gets the String version of the . + /// + /// The we want to turn into a String. + /// The in the form of a String. + private string GetTailParams(TailParams tailParams) + { + if (tailParams == null) + return "null"; + + return $"tail={GetCardName(tailParams.tail)}, tailLostPortrait={(tailParams.tailLostPortrait != null ? tailParams.tailLostPortrait.name : "null")}"; + } + + /// + /// Gets the String version of the . + /// + /// The we want to turn into a String. + /// The in the form of a String. + private string GetIceCubeParams(IceCubeParams iceCubeParams) + { + if (iceCubeParams == null) + return "null"; + + return $"creatureWithin={GetCardName(iceCubeParams.creatureWithin)}"; + } + + /// + /// A function that allows us to Log Ability Infos. + /// + /// The Card in which bears the AbilityInfos. + /// The Source of the AbilityInfos. + /// The List of Abilities in which we want to Log. + private void LogAbilityInfos(CardInfo card, string source, IEnumerable abilities) + { + if (abilities == null) + { + Logger.LogDebug($"{source} AbilityInfo validation: null"); + return; + } + + foreach (Ability ability in abilities) + { + AbilityInfo abilityInfo = AbilitiesUtil.GetInfo(ability); + string abilityId = GetGuidAndKey(ability); + + if (abilityInfo == null) + { + Logger.LogError($"MISSING AbilityInfo | " + $"card={GetCardName(card)} | " + $"source={source} | " + $"ability={abilityId} | " + $"rawValue={(int)ability}"); + continue; + } + + Logger.LogDebug($"AbilityInfo | " + $"card={GetCardName(card)} | " + $"source={source} | " + $"ability={abilityId} | " + $"rawValue={(int)ability} | " + $"opponentUsable={abilityInfo.opponentUsable} | " + $"passive={abilityInfo.passive} | " + $"activated={abilityInfo.activated} | " + $"powerLevel={abilityInfo.powerLevel} | " + $"canStack={abilityInfo.canStack} | " + $"conduit={abilityInfo.conduit} | " + $"conduitCell={abilityInfo.conduitCell} | " + $"keywordAbility={abilityInfo.keywordAbility} | " + $"rulebookName={abilityInfo.rulebookName ?? "null"}"); + } + } + + /// + /// A function we can run at Startup to try and Validate any Trade Issues that may arise from 'GenerateTradeCardsWithCostTier'. Logging is enabled via 'configEnableTraderCostTierBugDebugLogging'. + /// + private void LogTradeCardAbilityInfoIssues() + { + List learnedCards = CardLoader.LearnedCards; + + if (configEnableTraderCostTierBugDebugLogging.Value) + { + Logger.LogDebug($"Learned card count: {learnedCards.Count}"); + } + + foreach (CardInfo card in learnedCards) + { + if (card.temple != CardTemple.Nature) + continue; + + int costTier; + + try + { + costTier = card.CostTier; + } + catch (Exception ex) + { + if (configEnableTraderCostTierBugDebugLogging.Value) + { + Logger.LogError($"Could not calculate CostTier | " + $"card={GetCardName(card)} | " + $"exception={ex}"); + } + continue; + } + + if (configEnableTraderCostTierBugDebugLogging.Value) + { + Logger.LogDebug($"Trade candidate | " + $"card={GetCardName(card)} | " + $"tier={costTier} | " + $"bloodCost={card.BloodCost} | " + $"bonesCost={card.BonesCost} | " + $"energyCost={card.EnergyCost} | " + $"abilitiesNull={card.abilities == null}"); + } + + if (card.abilities == null) + { + if (configEnableTraderCostTierBugDebugLogging.Value) + { + Logger.LogError($"NULL abilities list | " + $"card={GetCardName(card)} | " + $"tier={costTier}"); + } + continue; + } + + if (card.abilities.Count == 0) + { + if (configEnableTraderCostTierBugDebugLogging.Value) + { + Logger.LogDebug($"Trade candidate has no abilities | " + $"card={GetCardName(card)} | " + $"tier={costTier}"); + } + continue; + } + + foreach (Ability ability in card.abilities) + { + if (configEnableTraderCostTierBugDebugLogging.Value) + { + string abilityId = GetGuidAndKey(ability); + AbilityInfo abilityInfo; + + try + { + abilityInfo = AbilitiesUtil.GetInfo(ability); + } + catch (Exception ex) + { + Logger.LogError($"AbilitiesUtil.GetInfo threw | " + $"card={GetCardName(card)} | " + $"tier={costTier} | " + $"ability={abilityId} | " + $"rawValue={(int)ability} | " + + $"exception={ex}"); + continue; + } + + if (abilityInfo == null) + { + Logger.LogError($"TRADE CRASH CANDIDATE: Missing AbilityInfo | " + $"card={GetCardName(card)} | " + $"tier={costTier} | " + $"ability={abilityId} | " + + $"rawValue={(int)ability} | " + $"reason=AbilitiesUtil.GetInfo returned null; " + $"vanilla code will dereference .opponentUsable"); + continue; + } + + Logger.LogDebug($"Trade ability OK | " + $"card={GetCardName(card)} | " + $"tier={costTier} | " + $"ability={abilityId} | " + $"rawValue={(int)ability} | " + + $"opponentUsable={abilityInfo.opponentUsable}"); + } + } + } } /// From ce2a6b1589e7d9c28a7a4769ee157dafa751fd80 Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Sat, 3 Oct 2026 21:24:45 -0400 Subject: [PATCH 10/11] Attempt to fix the Description of configEnableTraderCostTierBugDebugLogging --- InscryptionAPI/InscryptionAPIPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index 18d645f7..125419dc 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -189,7 +189,7 @@ private void Awake() configOverrideArrows = Config.Bind("Menus", "Override Arrows", false, "When true, forces the challenge screen arrows to appear at the top of the screen instead of the sides."); configRandomCostChoiceOrder = Config.Bind("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); configHideAct1BossScenery = Config.Bind("Optimization", "Hide Act 1 Scenery", false, "When true bosses will not spawn their scenery. (eg: Prospector's trees) This can improve performance on low-end machines."); - configEnableTraderCostTierBugDebugLogging = Config.Bind("Zebugging", "Enable Logging for Info related to the 'GenerateTradeCardsWithCostTier' method", false, "May be of use for debugging issues related to 'GenerateTradeCardsWithCostTier', by how much no clue. Set this to True to enable the Logging."); + configEnableTraderCostTierBugDebugLogging = Config.Bind("Zebugging", "Enable Logging for Info related to the \'GenerateTradeCardsWithCostTier\' method", false, "May be of use for debugging issues related to 'GenerateTradeCardsWithCostTier', by how much no clue. Set this to True to enable the Logging."); } /// From d8d11607e55082dd059ce309d1f7b91a5ba0d59a Mon Sep 17 00:00:00 2001 From: Chaosyr Date: Sat, 3 Oct 2026 21:29:21 -0400 Subject: [PATCH 11/11] Correctly Fix Key. --- InscryptionAPI/InscryptionAPIPlugin.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/InscryptionAPI/InscryptionAPIPlugin.cs b/InscryptionAPI/InscryptionAPIPlugin.cs index 125419dc..cfb540b3 100644 --- a/InscryptionAPI/InscryptionAPIPlugin.cs +++ b/InscryptionAPI/InscryptionAPIPlugin.cs @@ -189,7 +189,7 @@ private void Awake() configOverrideArrows = Config.Bind("Menus", "Override Arrows", false, "When true, forces the challenge screen arrows to appear at the top of the screen instead of the sides."); configRandomCostChoiceOrder = Config.Bind("Miscellaneous", "Randomise Cost Choice Order", false, "When true, randomises the order card cost choices are presented in Act 1."); configHideAct1BossScenery = Config.Bind("Optimization", "Hide Act 1 Scenery", false, "When true bosses will not spawn their scenery. (eg: Prospector's trees) This can improve performance on low-end machines."); - configEnableTraderCostTierBugDebugLogging = Config.Bind("Zebugging", "Enable Logging for Info related to the \'GenerateTradeCardsWithCostTier\' method", false, "May be of use for debugging issues related to 'GenerateTradeCardsWithCostTier', by how much no clue. Set this to True to enable the Logging."); + configEnableTraderCostTierBugDebugLogging = Config.Bind("Zebugging", "Enable Logging for Info related to the GenerateTradeCardsWithCostTier method", false, "May be of use for debugging issues related to 'GenerateTradeCardsWithCostTier', by how much no clue. Set this to True to enable the Logging."); } ///