From 1b16e0e0cc877b1ea3168b65bb2c2885aee58a47 Mon Sep 17 00:00:00 2001 From: Tim Evans Date: Wed, 10 Jun 2026 22:19:18 +0100 Subject: [PATCH] =?UTF-8?q?v1.7.5:=20add=20healthHeal=20field=20=E2=80=94?= =?UTF-8?q?=20instant=20HP=20restore=20on=20drug=20activation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New healthHeal field: heals current HP immediately on activation, clamped at max - healthMod unchanged: still modifies derived max HP persistently (wears off with drug) - _activateDrug: apply healthHeal heal and notify with before/after/max values - _formatDrugStateSummary: show Heals Xhp for healthHeal, Max Health +X for healthMod - updateDrugModel: healthHeal added to numericPaths for validation - KickStart: healthMod 0, healthHeal 2 - KickStart Plus: healthMod 0, healthHeal 3 - KickStart Solo: healthMod 0, healthHeal 2 --- packs/sla-drugs/000015.ldb | Bin 0 -> 2401 bytes packs/sla-drugs/000016.log | Bin 0 -> 5719 bytes packs/sla-drugs/CURRENT | 2 +- packs/sla-drugs/LOG | 22 +++++++++++++--------- packs/sla-drugs/LOG.old | 16 +++++++++------- packs/sla-drugs/MANIFEST-000014 | Bin 0 -> 190 bytes system.json | 2 +- zero-engine.mjs | 23 +++++++++++++++++++++-- 8 files changed, 45 insertions(+), 20 deletions(-) create mode 100644 packs/sla-drugs/000015.ldb create mode 100644 packs/sla-drugs/000016.log create mode 100644 packs/sla-drugs/MANIFEST-000014 diff --git a/packs/sla-drugs/000015.ldb b/packs/sla-drugs/000015.ldb new file mode 100644 index 0000000000000000000000000000000000000000..5c18aeb266c372cdc6c5c512e8328b5d45ec057f GIT binary patch literal 2401 zcmaJ@Z)_CD6`w74-aS|^cg6;rnlQJrRU6+OceZhyBc!p*KLZ9A1F5JIGrpa>8@#)- z%sfAW*eAkIXOtKUE6wBP2(!$r z*&j!ZX2NudLzS<`dg@{BS3G52Gu;(1&!Mg|4>P9#nzAAlwqxmTDtMB*1?JMFL`v$* zrNbNgM*1RihE|H8AeXM8E)~S5*3vP!R4Omjr(~&MCTdsrn%QyFqB19#=QHjq`)}_e z!Xe*~nB}<3ayZYZZ6zIQu^h3n1@=;Sh?l9z2R6=eQV49~`Vvc@dziUC6)xzF+7wQ> z1l~ewIn9F9JRwoZ!_#ODFccHEeKxrin&_j#VpsD%mGb1{K%NN&TXAQfyeL36%c!9K^_qb@E-1~AxT z?oN;^y_%0ngglQW95ERmpD?q&2x!9G6+lp!Uoo?pgqh>gH?y6~5+(_6YBaNXVoMsEtFH_MNj@7I zaN;rw*}-iqXr!kFXRypc!rIN)Bh4GgD77Ke4YBTx+@}(z!w_hRGlv?NgAZ`I@`l%m z*AC&l;12c$2^^Bbo2eD#z)SAZc+=wngd9Gd*nS1uv_x&?YFnB4MN5z}vHN=7LQPGJ z&ep@lMV9aTP1E8Bh^j#U+&~ z{4GIBkaLN1B#;y*GY#!6kpDbkHiS(1!%&fe3&lYWDDO;|;61lXG(5LCoiL?O{Gr;3 zhWh$3X4`#sLp16Uz+Y>7`|&93GdJFWhT50Z4-^0mwDsc+(gy=_GhnJjMWvs+fi#tL zqX)s>DrxP7`jx~X1sZPB%GTPZpVotsvbDKq62W@-u@_M&nNix%aQ3CDU}*Kr)z`qr zS5TOt;q9j$2%mZtwJy}bU%9VO&vTKBoYNg@)5vTj+fRnCCaOS`4sjuFUL>aTQD)PI z)=K!(a8q+mKzJY=;o5pWDyb+rbxM0z!m*)W1~lf42V2% zF_hl3Z1LffD86at6cVSM=}x8YX2)lVY#gmis8Kuw;+c%PGozxUvVV7vidVTs z;^v^_8ZIKd?|LsTLO`fU0#`s8_$U63@NX}n#DNd@4QjwF=Ra*s=7CPQxZi>jH)n?k zzW+^K`pmgmj$p4J-SE>Zwe_`a6H1D|x`<=EpMke!Hp)Vx}7uq+Ol*4UY~5gyY|}8Z%w>^5_fb#ktc9R=E~TyIxT_Oxmg;}Kz5ZHO+l&Q z)0b{lkX-imBO@U*@!5hIOWkIv8n>tso4u-X?oS9Cm$h{xD(bp3f}Xg0@7vAIdE&DI zP_FS}1d73Ejof`>UnSfa8ssNFP%fk5u^TtHp{|~aIw_T|ncXUk{BBh_Iy0`q_}jP| z$|Ppqt0}!#1Iw4j)%XD<@3m<&6Y7_ve?qN4X+WLxE3fJ4E@j?h6DmMq98~QN(Rk-z#4goD>|7wJYT#}w`+}3pH1AO!&0|1d4P-o5Z+%zw$P&nejP<-naby1Jm_rf%e`M+y*_n4 Xmi|fIf~x5MKTrH;?+;soHCO)&D|#Qg literal 0 HcmV?d00001 diff --git a/packs/sla-drugs/000016.log b/packs/sla-drugs/000016.log new file mode 100644 index 0000000000000000000000000000000000000000..3c8333995ef1fe6a1f8c8248ab23fc1879e84e18 GIT binary patch literal 5719 zcmeI0yK)>w6oygcj0h;g;~@abyCbb6Uyvgi0an??YuLAbEd`{DJ+$wQSVJIQlXNhdL)k~}qAkD)NBc}PBLR9#6E zFr=yyBYxufiuG@#vt4OQW#qc>UIxG3zq|WzH~zWjn$oX-B8_w+$b9_>M|&0}^`jDJ z#Z!`<$4M@I=2RV&H7tT~m3Y^a%B)ct6-w&7TghByLQ{@IQ#!O`>54{EW<}X(VS*BNL`A+*P;__^1>RnZIk6`LH6qxY7K z9G6j#dC`=))_1?v0xe7E-d*n{@k-3TG<{PBfKB>AuXH z3^Ue9HcSII!CFFx328Z!npGRCFwC783%z?>{>8+S4iIyw3Xa>w^pd2D!I`uNO6OD$ zC%%ofsnHQZY;NW$r|I6!vIMFvdf}Ceu9a={Hl`_T9j;Uj2Bkt(j_~l(Hds4 zE~;+F$o0|2oYV`^Xr91^haB9kt76vQXACXj18*Zve2xQR0_vsL(`}4r2c+SWEqXmbT@oII(84{%1i;1;rCGHCGXq0N&g?>v3_ z+jp1N-aHwnwQl?zj~ko6FX41$3gWHeln${Q;}^x$E{kvmSU)mDVKOjft_5)lq#gONsbz_*ot8d42(Csnb_=9^@N14ytN|>=5@CH%RZHf$$lzoOLvX5ns~&$# z8rZz0V!@AxhQh%OBuar0#o{Rz9$?|(Fah9ZfF0*q4=^KNb7=y}M5z#CkTNACnii`! zskSwQ0J~YwkDbM>juD;HNFswHBhYwg$pGTW(?|pkgo+uHP#)m30KHQ>KoBlL7>byv z0ZJ^^h*e#nnTr<`BEW8IGn6-A`MJn^6%RBL^>i{%;fr88gS}U_z}OC5Scm>8|Zw|#QXc`9K+-;(M(d(0auml3Jwl{C zH#peIl^?FAmJ=W$I)BIQE$VY?O3<(do4b56_ZG2CKqEba`w2`uk`nzN!+tI(6^%jj z)}k@?QLRK#M?P~Iy!`;lQ5cY{q${P#Ch-RWIznI0M$p_Y;#Y^o`Tks_-986tmwI4U zyfx`eaV{hM%QV8vR_8JYWk~b~Q+(QEF1di)&6KWio4f$_<_fT5W85ly!AS1o=b;Et z1YNn(9z&P;%On2P3C;ZJ-7=n8>@!e>w;dBqdQpAwCX<_8_J1GDz3D&MTTXu__`eT+ I_50vI0pshdf&c&j literal 0 HcmV?d00001 diff --git a/packs/sla-drugs/CURRENT b/packs/sla-drugs/CURRENT index ef20c6d..23b73d9 100644 --- a/packs/sla-drugs/CURRENT +++ b/packs/sla-drugs/CURRENT @@ -1 +1 @@ -MANIFEST-000012 +MANIFEST-000014 diff --git a/packs/sla-drugs/LOG b/packs/sla-drugs/LOG index 148aa49..072fb3d 100644 --- a/packs/sla-drugs/LOG +++ b/packs/sla-drugs/LOG @@ -1,9 +1,13 @@ -2026/06/10-19:00:40.626229 ef3d6afdefa0 Recovering log #11 -2026/06/10-19:00:40.632846 ef3d6afdefa0 Delete type=0 #7 -2026/06/10-19:00:40.633093 ef3d6afdefa0 Delete type=0 #4 -2026/06/10-19:00:40.633425 ef3d6afdefa0 Delete type=0 #11 -2026/06/10-19:00:40.633539 ef3d6afdefa0 Delete type=3 #8 -2026/06/10-19:00:40.633698 ef3d6afdefa0 Delete type=3 #6 -2026/06/10-19:00:40.633835 ef3d6afdefa0 Delete type=3 #10 -2026/06/10-19:00:40.633940 ef3d6afdefa0 Delete type=3 #2 -2026/06/10-19:00:40.634055 ef3d6afdefa0 Delete type=0 #9 +2026/06/10-21:19:08.220245 eb1634f9efa0 Recovering log #13 +2026/06/10-21:19:08.220734 eb1634f9efa0 Level-0 table #15: started +2026/06/10-21:19:08.222419 eb1634f9efa0 Level-0 table #15: 2401 bytes OK +2026/06/10-21:19:08.224826 eb1634f9efa0 Delete type=0 #13 +2026/06/10-21:19:08.225002 eb1634f9efa0 Delete type=0 #7 +2026/06/10-21:19:08.225252 eb1634f9efa0 Delete type=0 #4 +2026/06/10-21:19:08.225418 eb1634f9efa0 Delete type=0 #11 +2026/06/10-21:19:08.225568 eb1634f9efa0 Delete type=3 #12 +2026/06/10-21:19:08.225685 eb1634f9efa0 Delete type=3 #8 +2026/06/10-21:19:08.225823 eb1634f9efa0 Delete type=3 #6 +2026/06/10-21:19:08.225963 eb1634f9efa0 Delete type=3 #10 +2026/06/10-21:19:08.226081 eb1634f9efa0 Delete type=3 #2 +2026/06/10-21:19:08.226189 eb1634f9efa0 Delete type=0 #9 diff --git a/packs/sla-drugs/LOG.old b/packs/sla-drugs/LOG.old index 5068fd9..148aa49 100644 --- a/packs/sla-drugs/LOG.old +++ b/packs/sla-drugs/LOG.old @@ -1,7 +1,9 @@ -2026/06/10-18:57:57.727392 f90bb1f9efa0 Recovering log #9 -2026/06/10-18:57:57.730975 f90bb1f9efa0 Delete type=0 #7 -2026/06/10-18:57:57.731180 f90bb1f9efa0 Delete type=0 #4 -2026/06/10-18:57:57.731359 f90bb1f9efa0 Delete type=3 #8 -2026/06/10-18:57:57.731591 f90bb1f9efa0 Delete type=3 #6 -2026/06/10-18:57:57.731898 f90bb1f9efa0 Delete type=3 #2 -2026/06/10-18:57:57.732147 f90bb1f9efa0 Delete type=0 #9 +2026/06/10-19:00:40.626229 ef3d6afdefa0 Recovering log #11 +2026/06/10-19:00:40.632846 ef3d6afdefa0 Delete type=0 #7 +2026/06/10-19:00:40.633093 ef3d6afdefa0 Delete type=0 #4 +2026/06/10-19:00:40.633425 ef3d6afdefa0 Delete type=0 #11 +2026/06/10-19:00:40.633539 ef3d6afdefa0 Delete type=3 #8 +2026/06/10-19:00:40.633698 ef3d6afdefa0 Delete type=3 #6 +2026/06/10-19:00:40.633835 ef3d6afdefa0 Delete type=3 #10 +2026/06/10-19:00:40.633940 ef3d6afdefa0 Delete type=3 #2 +2026/06/10-19:00:40.634055 ef3d6afdefa0 Delete type=0 #9 diff --git a/packs/sla-drugs/MANIFEST-000014 b/packs/sla-drugs/MANIFEST-000014 new file mode 100644 index 0000000000000000000000000000000000000000..249bdde272158e0281e09e61dad9c0a8d6626a44 GIT binary patch literal 190 zcmaEJ=EjCZ21Z7yoYb<^oRlOzr^=Gl^338?=ltA)#G=HK{33QH*5e`aikT&;xy6cx zL4}pR6-oYy5gr+?Az3+$ybNFflP@ 0 ? "+" : ""}${health}`); + if (healthHeal > 0) parts.push(`Heals ${healthHeal} HP`); + if (health !== 0) parts.push(`Max Health ${health > 0 ? "+" : ""}${health}`); if (resolve !== 0) parts.push(`Resolve ${resolve > 0 ? "+" : ""}${resolve}`); if (stat !== 0) parts.push(`Physical ${stat > 0 ? "+" : ""}${stat}`); if (skillAll !== 0) parts.push(`All Skills ${skillAll > 0 ? "+" : ""}${skillAll}`); @@ -958,6 +961,22 @@ class ZeroEngineActorSheet extends foundry.appv1.sheets.ActorSheet { } } + // ── Instant HP heal (healthHeal): restore current HP, clamped at max ──────── + const healthHeal = Math.max(0, Number(item.system?.healthHeal) || 0); + if (healthHeal > 0 && this.actor) { + const rawHp = this.actor.system?.derivedStats?.health; + const currentHp = Number((typeof rawHp === "object" ? rawHp?.value : rawHp) ?? 0); + const hpMax = Number(this.actor.system?.derivedStats?.health?.max ?? 0); + if (hpMax > 0) { + const newHp = Math.min(hpMax, currentHp + healthHeal); + const actual = newHp - currentHp; + if (actual > 0) { + await this.actor.update({ "system.derivedStats.health.value": newHp }); + ui.notifications.info(`${item.name}: healed ${actual} HP (${currentHp} → ${newHp} / ${hpMax})`); + } + } + } + await this._notifyDrugState(item, "is ACTIVE", String(item.system?.activeDuration || "")); } @@ -3960,7 +3979,7 @@ Hooks.once('ready', function() { if (data.withdrawalDuration === undefined || data.withdrawalDuration === null) updates["system.withdrawalDuration"] = ""; const numericPaths = [ - "healthMod", "resolveMod", "statPhysicalMod", "skillAllMod", "panicReduction", + "healthMod", "healthHeal", "resolveMod", "statPhysicalMod", "skillAllMod", "panicReduction", "injuryPenaltyIgnore", "stressRecoveryBonus", "postUseStaminaDamage", "wdHealthMod", "wdResolveMod", "wdStatPhysicalMod", "wdSkillAllMod", "wdPanicReduction", "wdInjuryPenaltyIgnore", "wdStressRecoveryBonus", "wdPostUseStaminaDamage"