t&uFS>#C-Y7
zdE=+}CgV$@{NK}@jL)l<8YxL^53g92ee?Rhl$X%G1>aj8uDiDr7EUvHeO|fjF$SEN
zOes}y)V}aO1Rb)-IA_GJ6(;_&D~}VJwJ;Ih>k+=}nn!G3y2APNc}mW$^G58g+k2Nk
zcU(-vG)8V#yB|V0@6$o3ql~E-G^j?w+r@mQ0!Pa?_bu!JtJ~N%LGTAUeMw!tq?WEH
zxl*t+UsA?oNDTDu4yWk1+hI&5LtkQR+*EwHf7F_cd?>Z#%wWdelmY$l4LvdB^twf1
z1uLqNHu6@OWM9zct^PDKu%Nss|L9d=m)+g+FPt|DjO!x)$|;gNlEixi_7id!KD|RZ
zn%z9zt=BE9Api2!2S+vdpO;E8ux3xH2);|to+KunZvH;M@RW)C(5bMc>r2F|@J;`$
z{Y@^lt?nNzij)E7RM%UuGk4kYZ^dYxHVTL&U#dK!TM*qP_eo;bis*Qz?0HNkXR@?e
z4lZbZ@XY%=PRU<93X#z>PT<|93M9Umrq}slWiWkYacE|Uy>*oSN
z=@(+ZnB^jUhMxF!_M%A}4JBu_))h-ld485Ucs^j1eqq}tu5-!wFAt6Sz_%lJ#)*La
z4BL-Zn4+@LL!SqS?oQ11zP)AWG$ary=utB5X;c2W)cGR%i$rGZ`?k`)z=RxcYz?WV
zfI=B5?W29vf}($J>V%znlF~r?uNn-WXVm9)Dp=QjgpG``~tto>*TnjE3BAJePXtmQUbH5uTFa
z`DRA>v4XINY+4SzW|P;9;{MVaI{RCk*6D7eSh>`(Ns~9)M@-)678tPxxsiEotWB1!S{8kEwO5;pWN`%eXx!1cAV#CKHZ1IzZgJ9R6HoT)Yx=I8Ro4)yfR&~46A+XpW*+6Ki0XZu`Qn@Z0=cA6}i-=YKE
zom=t9z$SJ1i*e?%3Gz;U4p=&w=vnE!`)7Qvr0+GxxO>b0w1!%V3oT~VNjA)!7D!;*
z<*m6mC}yM2wh*!ZisGxF@ghFph`^dkNdOJ@d&_0jc>f6Mlg#Yb?N23r8G{xZc{wsX
z&Sdm0`)`(Erh3$;VJ#0|e$v?-sjk&n`MvdZn){+i^lvkVZSqbMc=MwtmZKizpHk|_{3c`T-CA^I
zH@zH3>Dp6mPWnu1|Ao7qu@@#k-`z_L-2DN@ed{sKvf%uPxs}!Pl?eqFPstmB*fXZ)
z>Fzx4@oCw@k>|cxl*${LrwoT~83xoHLW?~mb+nB
z_0C@%s|spv#twF#5LZ}In+{vJL0ZkM<`Qj?`yd?b>UrJ#tZP+1eT+WxQBje&U}_he
zk_~+AC-(d)UfyeAVRu8R?Q{30s+KQ0xE^9Lo1ITn@>$ruwM6u?_NLLFxXZ?=FBGsU
zd-3AMR1C8s#lUq?s`yasm50p~p&L3nX|A_|Bj=sQ8UiJn%*h-a93e|-7FCM{#$qK_
zl|QAmED(0rt*kP^PzQ~TEoP@%{2D2MMXw;?!O{G?EWfgsJ#`2&H8*$fAqbJQOJmK7n}W#t1_th3{Jd8|DV>2_wjuyye*w57YFcQ>x@8k#^N&i@t&nqu)A}TK4_T%@dpCTP#qk^(C
z0Iwm@K}>d`cS5Nqa6Id8uSgMSERuGXFkN!lq+tuCR_-~e2(|9-tYQ~v^X&;x^iYAJ
zM^`X+tAp%)87)&lTh^QeDnTU;jg4t;GohI5vF30kPzN%V(ZP;Uuz#~w_v=?J7b_Ll
zZtY}Tv)Ij-PRa`D^@s3t1eu0QtiNQ$Byem9YnV6H!=rD9=F!jHjyRUVUa}<{%(8
z$P?lc5`graI?7Ex`cS1mRPiEfuE2IPyxYy&uKrmdSMla@T0)_u#OSNj$V
zTdm{^JnRnCn)*}EP|m|W?2Noxu=6zJS36)x!`36-OPa=NwZ^*G!WlA8JjfrS|FS7I
z^+=%bSx#E60qddX^tyfdSezLKzKx!eqOQQHt?QHMI-KjONiMl6+J#Qr;bDOB1I^^W
zkMQqvZeJT$2XqfBVp|66s=to)mO~a17c4WVLeqqnC17miruRE9X
zwJ2-qxio`ubTNu%7>+#GGPW7o=&hrp^VK_Q?VXSVV>0)HqsQ&d-m*FGzpt#|klT_+
zQ*Mt~HiE7ErX#J9DM{~DWfNcFZ*gYWBadFvP>lUjelM$8<*|s5aBe|w4=6BO^W2d$
z!$MF)AztfdKUE!+$SZOY;r&dwWi2cWp;RNMIYUHggm$O9-3!=7_{C~gPRDafH
zl~n9?^<39HhbViQ!#N|)&WPjrtP`aHchPEe^6iFbYk>?7s|b3bXrW>jml!!ttLs{4
zplym~@??I02$SH&JFaO&yiF*Dzx5#WxDB0aQkQ!v?`>NSv*XYFIUdj%1#1vL2vA*X
z8PZ8Ekx`+}cSED3Wo-F}Drl`cmqPwlQ1ztYJ21Gzr=JC~imLGgDXEl8;QjX=r|DPq
zY@%HFLuVn<)}MSl+2-esi&bl|*;9{BYA9u8A55gjeP`ZB-z_$O4qqWT`Ro*$Y&p~!*kCLOuv=}kDg#k)kw0#!e^kob8GHrFxLeaCldnqCRLNjKzdjEWdGT;Kn0tr
zKL(ulrn=qgNTje#qHPycsNnx2r;e!n%Rs1Hp5H+Mvbu7TQ%547BdO6N)va579HZI+
z<2QV+d%+PN5{XcSizShyfWl|jew4nouea$4IH}}e+JC)!fip=28-E{&+JJ)iQ%}c;=UIayG)(4Zf;M&6wN+;%#ga(AO+w0^y8RrXC-yX&vlrzjMI5S_8eo
z;^V35@i?F|NX>oT9f9dC0J>`_^mO`xy7Fv5_Vb?AKCNZOJbz>c5a4LS|E0dB`-5W+
zwpONwCBXnJ$X7YV*+!J-z0(HT?`W$#m2PNML&f{2mY18@w`^orgLT;!CP`$qXOR)EO
z8->Zm`NA@lsjsGjZw6ES=7Agy5eKxr(J)F5K_i-hIjYAiy7CJ1aq@`qM7cw~0U;ol
z2^>@w*UH3zV)&~THS#8ewhRwg;5yB3mLEP%j5|XEBLq^?4+p}8%L>@xD6*7Dg+Rde
z6>wZB*T>dQB>MnC&VeaoaiwivFnwccjg)DH-GzZd*s-28_-w29fxT6j?^i&4YP;t@
z5xsz(DIASBi6k${r18H{3tD@#Bczw$o0d{zS;7DW2bcO`q&T2(I#5Pb(P$(%ZB-@r
zVD!sp;B=4#5ScCFK7Dy01DtLt1A>!kX@RH?#7ks~n@~d9=;;HeFwlTAL2KHAY|+41
zuK;}>O=`OnOPb_VbA!S-67OrEw`XNzj$coP|$0)+=e7LY+oHG5Ar(h
zp5A-c`rom${2w_Cp1Vxju@q+!*7D^*A`G2K5~9h+yl*
zr=_>KJRRuXHv!!=_NJ0U+%->IOOGg^3`o(v)|mvfpH+%b=1p%E&KzKi>xZqeQgVzO->80lN2a
zGSCHBu2Atuqw(xz+6VGUptyj5dN*G8LWQLH_Xa+96^Bplb;FYxK!2!QELsHG0Ao1?
zWa#
zXv-8}x9<CsQ2*F9P*W>+HklyTu?7@WwHOR7Z@
zNa$Cd1EJ)e)pf1qyCLTi;coVOz8X<^Sp>fH30%|R+f}-L^rAl+lcR5+>ks94W6uAN
zOs7p-t^XSi!Nt=+ca0b}{~C5;-IFbX=2d*c^IVvk6Wx18wJ4e)BV_7n_cTeJy;@{S
z0Ind-)MrZ%t-jVa+qmd-Au`<7~FM|OJ~
zF5L1_7*
z1!o5q9c~R$V}LSOiiis8Ll
zb+x2y+{33?WEXRCd`5c`@(fQj;gcA$>&3yq=M9^(hGiye(4`O2*+3w?TV!2I4J`V~
z`ti#H1m%u3&j?r!7}gy?f?3^hAfP3SYXOhZX^F5@C%)8C58m$bRu|$Y;_rE8m+?-^
z`efiKqbYOS3y7cXHP~7wFwiW`o!I6`aKQ^Y`K_KE7P-QB)UF}gbJF{17N^-#_?;Bo
zq7AV}QqY9uIC*`vee9h*Ud=DPTnYJDO({x$8-4lDIJa92{$1AM;vwEL?Qbe{#W{yC
z;ZfPIWg(D>u{-*Y2?3qUV(c4#a$Un-6E;QtJER@}gIQ2cK26;9B^jL20dT
zY;P-A_1Vse;%#PD-V5ME9Wz)cwzoD8U%tTFD?;=C%tu>iwg27*BguiUK2nAXASh$F
zz3-LS<4jEmY)aEG!>-+$8TJfG&qy$unaijk0Y*Hxx<`R=`Mvrw(S-8{s?`(vuxs^mMC&AV*_(PqfIO?S*#RfNe{MO+4BNW{EkR5h
zcNI2rehK(YCnMiKywg8D?qcuFTp^PCPubpymqpFI^8LAoqDy)-{oZ*2_3samox=JG
z`|vvm5D8R5DEdy;Q)Y*PpKn$#hgvXp?l1xQL@j
zDANcYQOc#EPoe%0feU_1k=pBMrB#Ti7gYD5i?*?E1{9t2Y_zO-GaTCHhVEMJg+o>M{qVGBA;;fAq=={_S+{W9wBsI%~#72PhXhaRSX
ziLUe>TMR`zN2E9f|#~Ei%c-=x0Z3JVr~k
zm12%Oa{~!;|2~uTKO!mrqmAxWr5He}q3HXU)mPbk`gY#fJ3mna`_N|e=A9_Lgw0s$
zCBJOXxjnZxs$f+oxtH{f`G4lMCR#B&0CE=+m2}KNpDg*Ujaze72
z_HFzOQAK#bYmp?!Qp(N;cS-a4y-EoDfB=D%AFhPJG4$xc!tw-2RC0OkEtFCQXn;Sp
z7j%Q@E}5chSs~N3f7L}%mNc7zO~&HYWcUqTzmh-MEXWA>+of+xz|SqTV__dvotbo08wwNh<|*#8HZmisaQ
literal 15325
zcmc(`2UJtvw=TNrT|huoq=*Vi5e1|-5o{o!5I_-vSP+pS9SI4jbO8|ok)|kup!6aw
zL8VDa1f-YHLl2>a5R%-*@Bi*S?~Zfc8@G*f#~@+vowZlnbAIz%bA3C?!t4?s_hD`b
zg7~gnHo5^pOd;Uo$jJ__ls+%i1t(%pt!#aa?t9<$a`E(W@ou9ApvyY^s
zl3>bR8Kwoc?lSpd$NSEiH~RfZI;V}bzp27^tiQ=MOTF#*ly&r8looeW~@s_FVm|^qzH&1>a
zpTw6~S+~p~^9o9Jx^;5BXz-rX;%5t{;2h0&j9Pdj-Mp(w9er18&;{%dQf|T`nHJSt^c^y?(^mpt1X4E}K?mU|Vx#
z+i9PE3+9`gzV?659d(;}CKi1x_l2VB4O8{_t0FZ_b+E-6*35e>cFWB6e@tqE54%JU
zzYaK_YbK+lVRoe5)EfgRlqi`oC
zDQRV^^K4QQ=0l`_?$aBZm`GlKGxTyk>(^pMi5lhl#;GfI?lB8>2&zKWh5Kk7?8@0c
znshI^(;<}j@;E80;!PaNwU8lf)WAJl;VTFk*x6}2l|-IU|McMwKlC1>6!lW~K_I4W
z_cw(Wd}U)pCY?~}5o3rnGe+BJv-+dvq{!9pz3`(`m|#2MLqQ$fws&fC)tP!)Btt66
zA#Z)6HR(F^qCok0Mml#$zgbLiYNq_BqhYf+qu#Uz*KSzG{Qb{#i|a2(sEYdKrzRPiY(;bBGm%Yp8rvj50C|
zq?=kzvzU1AI@hxb$IE)lVJz%KQ`H1F$tN-hyISX7uQx3cK1%Du&Ft)Iol$vh!Xv?_
zhtAsJJ5qvtIqs2Rk6j-Qu#mS^RhLM_=&`XRuA__
zozx*Pb*kzWav8j%EVoW@ULrw*K^r{`Oq
zy?+003Fp?b?n6oKv25uFSa2A5A(r~>rEa*9^aS+F)^%Cg$ywWQ_4wBk54vjzN4n3G)=*NE|rg^iwqWbh9KhT`6+G=2Gt3?qD-K
z#a6*d@$(c4jY63@LnXG2`;V%?93hRr-|=hI@x=A@Z=OwlB9v#;!;He6(KhQk?=JAv
zz@g@_)kwtnc97l6siI?Lua=Q%Zo9s>xToN&L?(q~?z)3MzCN={Rag^fl3Jaf`lT(a
zeJkhXls{U$Rwm^KZ%FM3rf^?>5Ke
z6v9bLTikD^a8syLv5a(-ps7YT;_uesxxzTJ8Tt68*ZjAG%3{<*;*wHE!kd3_K&BYV
zmjb?fpPM{)MYJVtwOUX=fNMr3v(xW-{#WM|{vY?_|COQ-v6G}v;>ABJ>l7WsmIHKL
z2vlt(;nK(J+Kyq~=!G_pLR!me%x}c7l_%5c;m1YlVR8T`RNw?LDaWviW#a9*NAXye
zdW#x7i_D(u7JL)}D9|e8>1NMrFP>pRlMtp*w`@qISo6R%(jr5#
zH8q>BcEKN4!1?CDj_9LB>ACr90q*9!N%QpcqgLisBB0iRyVk0Q
zE0_kLSC@|~DE>HYGYpBlMYbgRfwGW+xyR4ACTZhAXC=_V1H{nEO1~VpME;GJx|I)i
z49=bHBIe^`gM;{;Y-sMzr@@oYBAhfE|fhsV@BXZFD}O
zAnXd|=ShIwu@U^!>155gyR7
z_oP*(Z#*}i$ovi1HZZfB?FoOz9YXEKJ=UjwtNwD%dH-twv)*Prz5+>AZ+)tMj53_g
zN@XQcG`V6XkCjf>4Gzt!UuQKo19J#!(+InKNzfBcNaC>opbo>oe?zs;jP$)0LhJY0K$+yN(Uf08wN08EL~l_;*sX~=(O0Y$?$u?)=s!R86~G~
zZYNV);-9@$(#QYoAtKbp*M|*7hMJ%0v#IuQ-;O|dY&eO(tl1hiLBaO}({la2zrO|q
zglvpbYT14w(L{?@wD2yVS)y$Ex5I7ZYa7SOH?~Q8Pz!+Z{?ge+iz%eZ>Bx{wF2f~n
z(5R|}UI;*_%g6UygL^=P&BMwYBGC^UuMpl;E4)8T?YYtL;|Pwbd#!
zbc@acT>X%$4V!2PLVnrlYeUR6hbPd}ora8DZ+j_HN>15Yj_lQ(4ENJ81;(K^-QUR0|m
zi(oC5zUEyHrP>CfBY^
z!3O|_xZn`N8)q#_e(Banr7y_+^tEaLj}&JaY_A^Dly8@gYzLhbjQLW3sJFLke%c*>
zz!%+L!myFm0U+f)lp`UYRhOV*?4WSqiHvTq+iFdnv>toF=Gv>a0GwLKmP(iD*Oir(
zXY^;^Nz=3EPURIJTnlw=GRq9{6-R(!4rOz;sW(7o(5GZ7jejnf_?xn4EH1SVTrXbQ#xYzx4mh!v0s#``>fB{BdT1c-iF;5iBJ>fyH{@0ONYe
zBLIkT7eD$na1#){N&EqfmOo9O3$7hO#bIiT>MOr=@Y_zf@W(NBhpa4^IR6dAIUN55
z;-2QbNTL4@#VbGh_Y(bNbgLz;oO!%HKl}v{;MUk%l~~Nay^l;hMuQGmo>n3f_$V;?
zN4oT&r$PYTp^)|9k~qdg)m!BxQJ$=@mnfH`9{^@7{Tnv#Ay-eDfwyJBx;F~mjRmOx
zfiKk+31YR`=i&mSI;dE#Go|eC;VlRPF$4JTCD2dcxqv&sVUOd06&%qXdzLw7WM=2{
z)@9chd{nmHt|89S0qc77aNw>|I7!s)dg>`j2Ds~?4nitdw(_-<`C;`~=XBj>7$
z3T>K{%x7DL?4?fGs`I8HYhpJxV%yXJm(K9mg-HagAc{yf8Itj`ZvOaam`zDD19*8m
ztq$)dkXZBwpVD!v0YF>>xX^++DwK|={Jfz<{}(593yfd_5dHtcTQw^ns}&9oT9$(DDj=ygBI#!mD{$&@1Y
zSFmZG7X2Syi|-sgP|fdC&p$&?8CK3BJN{4)oe>C(@D+yus!D`F>D=i>`c|X`@4$1P
zy8&_9GMy^gIb5y{|9lKzU;0{B_PxdwF>`L$A+#-~U~r`j(EPR2-MjygS3B0mn^AZQ
zWln2$q;AXgs9S0Yw6~~8cld5jt&bE_g+QQk{sGf~qgw?sjv}|T@z?reo5KR+%b$E`
zJV>CX?jGe%*P-B4nf(6=jy=^%vn?bdmiSNT(p)}@V?xf<){De_GaS~)RS5x5-smK_
zho7$avFDme=x^V|0h!)|cM#0&_NXR~(v+c8`5O+Kt*z!~E@5a{vjIyGxO>Jj&FVF|
zzd%tdlGa;|rvOH0b8W=6HATL%mUuD6959cW&?Tth)jGFN
zy$9&r<6tW>4ydxNLJ+qCx{dGFoUBT82GMxL^RW&B0!>6VNn0x%NKGz^u46uMzurt*am_w%%}a>mUG?^&n(&Q?N0Xnk=GFmwyie2(lulCFp}y{M-@(oh
zJ6jM`t6tmh@hIq3(T%)J4#4Mo+zpkcx3fy1NbUKs6)V8gci#rYWDsR!;H04%y{&VJ
zAh=`%_uh<*u4Yb=btuY$31%^gP7{5%o~Kt7ApNm9`vNQKEGB*H#w=BqiKZxA5kdsz
zQP?;bx4n^8E43hX;Ja7Q>~n@Nt6*o;$pFgAkGXC8SBR9sXkSa~lYPvNA7(d#Afsp7
zpJEZkF_uXEA_n#Zrr@IrLG-!LY`YOWkIwsD%6iwK|2vEvN>#YLy54cOgiu>mpVX4|
z&ziK3)#yJ1Bg+T)-tv=Cyx$h}Uwm!~oid+}2b5$RKL?+Rwy**}a{j2^1t1k0+V
zBQK=kbATJ*`}>U3iLjZVijTm04gBx`K5xlLcCjaLL0&;t6`@o5_2M$IjAQXSP8`qA
zLk*3MM%a6xeYrK3P-vx|>>xYUbxE>9CG}-DqR3C--sEP1qCurV)Ryp2vZhE#h)Ctk
zbKX|;U}Ktv-kH#)AM=Dqjq)fNB!Ooywn3gt0WoEaY)ejvN
z3NvUq6k0cl>rXb^3hqm5So!LK)W!`Y6ot!NVuLLL$cqNmk
zTd(Y1H~{h6e_9ndi>CY-SnGOgP7ja{wDvdC8c3MtMiOf7Lxh(M-b#*5N}JLu?0cY^uXGrPn1B|;c4x4W2tsgkkZbe|J?$2lnl_gMuR|6CNaYPyE>R9CDcA6%g
zUuQMsoT}=yDSBpR<~w1fcD0=tEcWcj`}N?!z-kpPem=g5P!5UJ`zMyLMfv$Zl`v$t
zy<(o@{$x!G3w2B)jtTYwsR+y|o#zvn#LK8`FF9~%NryRdJkX#g>==MBKDs+ShQRH5)*A=
z0FonhHzOFK$)mhvNHCKG!q~lcdikgTM))`v!H72o-z%W5WY1eyONV7XN
za{BvDTHkWQ&m@VyN3oq8I^KNV{bLsJD_H9`RhO%J-8oxYKdVWZuGO0OXt6(jV!H}8
zhrsV_-pxdr!RWsIAfK1`WF%lpQ6o?}Zn4m=KnK5A(ca!J2s~>*U9!bLYdb1`z(s;O
zI~A~$7Juv@Z+2ZBqFD|5ppUs2EHs@rXOQdFHae3OKn4ime+@g|5I;-9Wlo=O&3cx=
zZvZCgL$3P7?g${Ir=RC3_mldQ;B)IpI}q1;#>|ld97umj$kD_{cMG}p{MNd8=1Xm7
zal6XKbd^vi%610kSV(Ko~L2rqIrNYD)s*PtQ#;w`4O#JJYKx|9x8dj7hz7z);y8xqoVjt-bwa?8a{
zrKb9=ArovqRn$Gm2FrcBg1}go4skUepZ=|Z<-hG!S+Mcv0{`F|w;h7}>I%QOQC3j!
zWXovtpzv;5!(i=Pr#K4QjzA#<8LRP1
z%prXyk_KCrO0q%(0bU26q4!fg>MHY3cZ6#)^}-B`Ft|%{NnWQhlsi}q=S8CjLXzJQ
zxLS|qp>zG3>U!{?x>kbxVKIV1=>htArg6*GG?*qNBN?2Dhrw2aF|WeQ&z#
z&aiuJXEI}Cz9*MJ!~9k11Bm=GE=~@Y_DvCz8v0nO`26|vt)0!qrueOafwzf5`y!S-
zHFzNn|CRK51jP$KY_SAxN!Rw@2fdl?>`VUfN7r-T&*?uZM2IpHALYI-=p3r8uOlp~@O~d)5i$-Bzxc
zKTgC%FN=tXtOlKXrv!JP303$%{G0+Hb@lbuLF=THOd@0kYp71Fs4>l3(M;Mo&MCBS3ubMt
z#h*c6P{O!GUBQ4}#m2%*jp5&Mrd9%nIQES=tE(Y@AE4rgb|PVO)BGJDpzpGH=gdI%
zh6)g4$Q>%Ulc_J9+fp$3Z8&EiA5~dmZ#}#rPF&mSA~WQ-G!SY-MlyM2Mf&A|6+bRr
zlLZRco``s|y?Tc_5h2MArE7X${C#{W3AH+YzP!8~f^OZq5Q$p
zKi%ETT|_T!t3;(TE70Wv^CAL_fFlIzX9UxHdHMNSzFTwl72Yh+@n3#d@k*9HF>xn7
zn6?>+8T-mMzA@iped$t!3MKl=%3pDEc6K&%?#g#j13#zziJq4(aqQLzPhg9Ripaa(
zo12>e_O-OM{&aOs2un*1i=LP`<3Qa=u`-$sSnh!vUeQ?E(0-+e%(h3`p%K--lZ{-?
zYu^eBx6(rj3JNl=Y&S*;tuEepq0QJPP4&nOCnp~`qK~|N1w9-kBg>TTP!lT5?}F2*sZ%o)icD=;5vEWFKbpMGLh$DPQ6>F|
z3jZ#@UamsQlGMPwr)Bn>cz@2d&(=X`Y#z>F!To;N`R*KA0^x=3kG2^D$SP2zD3Lw>
zSceWXjg9>hxuJSaEj+dbvmk8jpSEjlW8?f=9#zC;t0$CKP_SOXm_a~2)^%$*xwX-~
z8?V(^k1Hpn7G29%D9Zn7pPI`ADK3`6)eAe^`|kw8M8YE?a&>)Xc<_O{Z!7#dZ$(m>
zvdw+IPxUR`Y+1{f`)Xfy0Q@vihbMZ|gX%otP`?8Lnp4GTmQxsHN^`(vcbXi>6
zPh&7G>#3EA;M>Duzh-kKe7#0fGOU&{;D!|OkrXMbYv{GbLO5pZCQU*o;0!_Qdp@G5
zzp$_{vrj^NI{1K_fYl0SHFL8eRo-AT`mx}4k#4?_Xce%4Mm30}{?|FUW|H;Yq$gJE
zz#|6?hm?7Mld|-*@Xso*=Er?SaN^f(N#yoKI+yLaC-c98x$+OD+=)(te+@n@FYk|z
z$1tfjg;rV`cnsF&>K19C^l$}M^~@T+#=+Px@(m0g^l(*w+IovY{bS_9bj3i}|M#l5^rbx0LE9H1`xj8!)nN%rBXc5I2K(hn
zxtaa_appGZ4OJKM%jF+SNG6pJTPUIHZ1($aSumYsrzEPcxHV1IFy5=0patOy4noC+
zi{sLlGB;wL@HzOcjA**Cc@oF!^9l=3x9P>l=bqtw&)0oVvIE)WD-<9wMi%p#jyVEp
zO6rRrIsEh31!BW?05{|26S}31TDAggpX13~NuyeBm?u-KI@6c$lsUgmnOr`pTs~>L
znKu8={h}0YzoiC%urReBl=7tQv1`7Pkylps=ArVpBtPs+VIg*5aWQS{x_-j9r!#59
zO=C3mX&v`uk2Ph@iX8g(MSbO>MaM2t2idVd>zAm!`&m+4eC`1smC8SAZ<3M-raMjy
z9=GScqoeko$Lf$1S2i0}EX91BYlj_gq5F@2otnLiR-426RsASO6u|?!&r%eVcXRGJ
z>?QQacD9Q`_y7BixBrb8_8)KO$$f`LzWWo)8Lt9AFC%N85FLgyW-6}vi$z~?4sxJ3
zn&HwB!?dlREq+5v2nF?a*R&Ni;Y93KUFo{HuJ@XoO#%_SHuSlcuc`diR>vZ5gDZ0;
zZn2|(hEFX03bDC9Xt`ZX?O}T*v8Elly#0jd4+igGB<7%v94RH%6r40R=$}?nfCsvD
z2Tk17UY?QPyiZ2l%cX6})+$O3vj_hkGZGu4->d3fPnZ;D8cn=oEVX3%v}kG9vQ}E4
zFPYYp!9S?(kHRu<5UWJH!qaN?ooPOV3v5-+4s23&Pd=)U!03v^$G$(&Q&RDOoj7r_
zdS2%CSTWNH_0bpkulKtR_D#jx8TkDap;^2%l=Au|rfw*Fyi2WDt*}mQ9<*AeYU?g|pnDt@WD4?AcOLl_EbER#r0C
zB^}0gkYZ4uaW)j9o*0!*WO7_>h)=5LGN!ksEegn$oJq&NR~9yS+SWW{v-5^fn}K?a
zp{8;>QvekIv$LdPd%)g&?iLv7#233wd<$=Zr3GgEb5+8M!;;@g_7hW)~K9C{=LD+krlo{a-a;$<4CuJ-`rDR_H
z80;{fp}6ahQeFkyjmwxiauZZ+%0WH0Vz!}DS69nAaD;Oto}94ViI^Z6i+UHaVujjC
zhX}Y=X2HQgQEc6a-2l&l%hT|KsXsRt4I5g8i@&mpj+uUZl)8hcx`rv)|NS)QCzZE{
ztNCoO468tTldh0$$(HWmSx&a%`5OYqqE+rEqF3=JztKt|#AO#u}ID=6u{+Y@OBfy&v
z_Bo}NEh{&d&$Lg|ia1}KeRrtmwLE<7*4&`YkM-U^t-{cIufdA;)4z^cV*PrwCyBHRC@5aa
zEAJT0%skT4c#r$nN7#0H^X``p;j7FihSo;u{ZzGV9jp2BiSBW>848}7^XPUJqN0rP
zW#i12()cE~9OTcx(s1qWA`|psW`>iMrPcJ_D+yC32&pI72v>N2*1J>b8|Mer+tD3H
z?4gcO;@!lzN3O}^{HePIy`1*gEfy$Ug7+j26XeP9Xsn~K&KS?Q{%z7C1q}Fw;oje;
z9v5CdzInF>>Eoh}Id5j}J1K{~HaG?P_qNUSj*~L%@0J3)*Lj5e{m#W`V;AGr)D7kz
z&{cUu&|?g8p(R^4`zhP6VFcMynXwwalBpW
zBu;X7J!^8B|Fm{$N=rn^1R0;JYPn4xe
z5S}MpXXRjeY;WMo-D(~mFJ1STt@&c1hJFE-F?H8@Nq@va>(aYv5
zK0AKDh#1`AM>JV6NJcsF){vC*wR;hW)1F>_SD`$6^0)6GTJW*ON8y|f#dL?jKx;D64^{_MN*6JrWJ
zM$NQPvN3v`+w`7H2!G+biddxPI=}1_J&QOm*6VTa%XGuIKAj0AnQ~WH__MF>=x6*4
z80UL)Eb@x!#I-k$`z=ozbKQ8`(A05%})L?AikWeb#
zf}ppG6v;Vy_PKY5ex%vxZ{=B%)%|W>j%NY1ueI7W{;!CXZk(ZY<~mk%@S~^~=5ygm
z9L{y)Su%~|)7gXd(}dS1ECKz9UI1UDUqeX2gZJcF2Xm=V;ar51
zFmr-knfnQ&^ZVT_6}^V#oF}<>b=)tx+vObVyAFeeFARxr7AYC~E^}MKl3dyy>}W1L
zt!Ce|C8Mu%8o5tb!UWi^lwSkucV*|v>ZxP?L-+6R>_|e)OgtY-1+JQy2+Hvs75Gy+
z423W#R(@-!g&=d=|L5kLHxKPKEB^wpRb7Jqk(~+sA*k4|rxR?yDPdl(>q4LOw;k?(
zJi2CMg%7cC5jghctb#oMFY5@Yn_o`t>xJTS
zVa98n*adzJyj?FQ%FJ~8cb0tzMIuDy(3g&)Liwrt)rEhxhsyB!o|Fo>UGHcJIlE^M*mg7qxUhoWRdNw-6{+F#XiC{%$+$87>3#&HEo#a9ZYk
z5;*zQG;#j1ZS~Ng-;)3V*t@m+>P2=$gnmWo{u3z?71L(lzIM3$dXsD=RXm|y{Gju&
zRC;IpW6ah_jpDC^2M-!N@VXI55BqQw(2A#yj}CI$O#YndFL5_X0zJ7_h1|zk#D2A#
z6R-1vM0zqq3FX5iWcaifgjjHnkRL2KAqyBRM-d-0$5X;>{cT}^lwt-5<8RPKXj(WFjM}+2Zg*|X3mOb!g7$_2
z%C49=g7o)EdHG*||NcxtuGa)9tE#@RIJx)dqhSj|kfs&k1H|{O=dbTWd4S
z2f4%2*&-JZRs5*!UuOD{fsIYdTF0;lM!eQ`Ep(t}$?-`i9lmh&0@`jt7U%fYOY`&9=a9Kl&xYlC7bN{+A@uev7`=KMDK@_XUP?f6PWqW_~7
zYu8D*Lot)1;Z%-n!nw1WQD4OEyxpPd;kjH4a@OP|KZhWvZShxENvX1BUgbk#UrM+}
zqGVx4=Iyw9k6EuWx0>Eh&w>$9bNay@^kD|=Q%@BJL5}T{)uUe#OJ*BTyLhSl>U!v7
zNh=+(XRW(fe@w<6aoCx!#jFb_+k^|28gjB1ioB2NVD0uh{QTG5Z3NYMuX^)gmp2@3
z32mSDs%KQ`!prpW^qaXJmo8rXT7=qO1VRL&dcmZi3`ghQQb{(VNM>)qAK6SS1u^evRWOHQ-Q8LijNt)6XxFXKKX98L?#Ps&YKD!mlZ
z;*E*>ltdt?Xz3K*XE3?&hHs8|CI_QwWqsqT2ie05$2a9!uy-BjqHTlaM;W*(RNwwV
zk9`hpl&8L%_JCPBe~8y_Oqi<^dR}iMOYZ^8$y*br{Lu6C
z;mo4{EA&7ls>=dnSoO`kI2f+Lve`5(5caz8h#>o~dH(`{+N^e+L*y&*AOprHKM
zJ}%8I;}YF4lRUiTc0E_$NHT903pRQ4bu2ZWZcqo-u!nIZJorAMyAzy40s18{&MF`u
zFhe~at?3;Dzs#gcn{QNON%274sCw8}!U3!f;H~RO9@~j@T7Lz!s#5lzc~8YgM}Jb`
zYMQ#@EWH4>1c9=qoId=<{(ciIoco^|KRT|5OUdAG;XY19RycV0-h)T6GWh`0-{`
zySA$*IKI`4`mFNDDHii~dp$#(a%BSpHm2xnLAO^t>{}R4Vhqs4I*?1kG6%t4ZDREw
zlG2<6^s1gq#=Wx1NzlZ!6>QAzNpC1$@>)}D^nldDjj~b+^lIbf=lj2W|4!$$
zZynx_ar{q`!v1?P)xU)DAol*7rK;PPP%#6PH!~~FqcjPiw0igMFhMY0wj!SD^t4Fv
zlcKf1KRKP@33N|)OCrzV38MJ}l!gkd9+)5(vkyMy1p_qr5~5*=@PP?sjZA&!JX_#461NT4Rf8{H`j+^Kn
z-O=38e@Q?=vu>n6Ns7)3dfRKuxmX&UcVwza8)G{Kv`WiBc?!g^8u8%&P&}r|XybXD
z9+2Huwys}rIg0w8s~)OI{Q4u=zi)inJ2xX^6xc6;V%w1wKGTlJF#7k5OjADidPtlE
z4c(2{GjuE(eqW!uRCblW`I}vpSx_R_txiga1Iitspg)hoZ>T>7k}fy5<*QVN2Yr_K
z06`nfB&WIVx^YcY8_dYo_L5tydt~wz(nWg**`a@wN7^QT8O@7C>Fzag!Ex2?f8=
zzK!!?Zzb87yu^swPcbHWoOQB-NMR~N@u+I4*+o$iqhv{tksM`#3P*RJz*+wKs$8CK
zPe}*kLtb~kSX~shfM(~M!_eh+@Yl%OEQ2E7-$F5G=_{3UM;K1a5pMNGt#ImdJmwHk7jkaI8YB`@4S4_Y)prfas*&x?pdsC=GDJX0Y
zS_#q(_MfqHy0_Oy&n7YV#H0_5a7gO$d_%j?&{TQ#8o$}4H2
zcY)H-$lSwlF}4WEBg!i(%+nA+Pz)N|(@y44CTFwyz1KPoMnOOOs8SWa2`=hRzOUj@
zQsnNeI5I{XZvB!X3smR838Bca@nyV4#-Z3TI$y~jpsp+%C!ha8{zod_6dM7YeNXn;
zx-TxSr^|^za20~wC^hQ`#7Li0S}+IYozCu?)C*a0ZO9&9KuETdb?GheU5Yck-Ghcz
zH?s4QU`*C%zp6jr@Nx>i!lPf&L*3z(_GSX2-E3)f2Tk^Ig|-OB!;--<7mb6O2JXwn+P&vf$P3;`Q`4
zM0QRy*h)CAI2FID%bhMDx;Zl!rGOs}(v8qh5T9!%*%?|Msukkh8hd-cpJRylpnnn|hwBGY#;
z*NljuT0F%|yK!2nbTS@&k1^imA_e{76zU
zZJ=Lb1MysUtAb;h0~0VXr;hif`Jcq2#1EB9A~fAS#=PX&PiMA#NyKRnbASWT{JnO0
zlBH}`3mC^h-HdhQmFqCHs0c+la7L*#
z5_p8W9&^`l{Mq?!X7@*E!Y2Tdr0`W7j9=ph$LsPy+xp+R%#Y0n6)rKxWx(b`R{uzGo69lJm~OQ{
z-PbLcG**{8J!QrVgy3KR534ORLty95*@ZykQw-hVI6QsC#&gvi6IsTR_>eYz1+vg%
zYAIgl2Vp$9@al*
zG$xp`i??6
zx8>@!@x>itvGLLGV6H1A_Ga3TSuf0_!u-%C7w;3z&lH9`6O@-8d4E#*_7nzlYeRLD
z`cV?q9cQFInZ?4urLNwSJvS-*VO%srS3F;FkVAIqs0Tct&K_6py)V(kyCoE0V?{
zKg%)NV3#hQQw>>T5I~0>pfF%8yQ8;yj5S_wBSwom;wpxkou3B
zUu5a0pa$=M-Zjj!S?1`wh&WHmT`)p1@@aAw4Dp*Z6F7(^_Q$2
za04EFANxsZE2{t{$BGhq%Wb`cipd?Im~eS8r^T{`v^pw452p0l&i_v-U-KCJh8k}I
Vze;|H2CwZxSB%Y!3Jo2f{TD67a(Dm$
From 5d32360280a20ac06f0110729ca24b80388735f9 Mon Sep 17 00:00:00 2001
From: generalthrax <139387950+generalthrax@users.noreply.github.com>
Date: Wed, 3 Sep 2025 04:15:25 -0700
Subject: [PATCH 02/52] lets headphones and earmuffs layer over hair when in
the ear slot (#5262)
## About The Pull Request
## Why It's Good For The Game
you cant put the headphone thingy under your hair thats not how it works
## Changelog
:cl:
fix: Earmuffs and headphones now layer over hair
/:cl:
(cherry picked from commit 55295c06cb17c0ffeee1b0fe07071556d0fb4602)
---
code/modules/clothing/ears/_ears.dm | 1 +
code/modules/instruments/items.dm | 1 +
2 files changed, 2 insertions(+)
diff --git a/code/modules/clothing/ears/_ears.dm b/code/modules/clothing/ears/_ears.dm
index 72d29ce55b5..a3c3e7e6e9d 100644
--- a/code/modules/clothing/ears/_ears.dm
+++ b/code/modules/clothing/ears/_ears.dm
@@ -20,6 +20,7 @@
equip_delay_other = 25
resistance_flags = FLAMMABLE
custom_price = 250
+ alternate_worn_layer = UNDER_HEAD_LAYER
/obj/item/clothing/ears/earmuffs/ComponentInitialize()
. = ..()
diff --git a/code/modules/instruments/items.dm b/code/modules/instruments/items.dm
index 8ba2d38a33b..a9f2bab5caf 100644
--- a/code/modules/instruments/items.dm
+++ b/code/modules/instruments/items.dm
@@ -80,6 +80,7 @@
slot_flags = ITEM_SLOT_EARS | ITEM_SLOT_HEAD
force = 0
w_class = WEIGHT_CLASS_SMALL
+ alternate_worn_layer = UNDER_HEAD_LAYER
custom_price = 125
instrument_range = 1
From 1514081dff80d2378fc1665b8cf8f6a538f7ea74 Mon Sep 17 00:00:00 2001
From: Erika Fox <94164348+Erikafox@users.noreply.github.com>
Date: Wed, 3 Sep 2025 14:01:37 -0400
Subject: [PATCH 03/52] Chem Cleanup 2025 (#5162) Rips out like 3 chem systems
of random healing chems. Adds new healing chems
Indomide
- Slow brute healing
- Increases bleed rate
- synergizes with eating food
- copper, 2 part acetone, phosphorus
Hadrakine
- Instant brute healing
- slow healing over time
- overdose causes extremely reduced bleeding
- 3 part alum, hydrogen, oxygen, sulferic acid
Silfrine
- High brute healing, scales off how hurt you are
- Can seal low-tier wounds when applied via injection
- slows you down on account of the pain and agony
- 3 part silver, phenol, carbon, sulpheric acid, 10u plasma catalyst and
450k heat
Alvitane
- low burn healing
- cools you off
- can heal very low-level burn wounds
-carbon, silicon, 2 part silver, cryptobiolin catalyst (5u), low temp
Quardexane
- moderate burn healing
- instant burn heal when applied via injection
- does some wound healing
- 3 part cryostylane, bromine, lye
Ysiltane
- High instant burn healing
- Fuckton of stam damage that's right you gotta wait it out
-ammonia, silver, sulfer, hydrogen, chlorine, 10u plasma catalyst
Charcoal
- it's charcoal, practically unchanged
Pancrazine
- It's basically seiver
-Nitrogen, silicon, potassium, 5u ammonia base
Gjalrazine
- Instant tox heals in exchange for disgust and other problems
-3 part pancrazine, 4 part carbon, 3 part diethylamine, 1u plasma
catalyst
Surviving oxygen chems
- Salbutamol
- Dexalin
Both are unchanged
Reflavored
-Omnizine
-Tric
We have way too many random chems that do the same thing. I wanna change
the focus away from station chem to our own thing.
:cl:
add: new chemicals, see pr 5162 on the git
del: remove hot potatoes
del: 3 eras of random chems, from libital to salicylic acid
/:cl:
---------
Signed-off-by: Erika Fox <94164348+Erikafox@users.noreply.github.com>
Co-authored-by: generalthrax <139387950+generalthrax@users.noreply.github.com>
Co-authored-by: Ical <86125936+Ical92@users.noreply.github.com>
Co-authored-by: ritorizo <41831966+ritorizo@users.noreply.github.com>
Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com>
(cherry picked from commit d97836149b98ed2f5396608c8b2bb022002ab19f)
---
.../BeachRuins/beach_pirate_crash.dmm | 4 +-
.../BeachRuins/beach_ancient_ruin.dmm | 8 +-
.../IceRuins/icemoon_tesla_lab.dmm | 2 +-
.../JungleRuins/jungle_cavecrew.dmm | 8 +-
.../JungleRuins/jungle_paradise.dmm | 2 +-
.../RockRuins/rockplanet_distillery.dmm | 4 +-
.../RockRuins/rockplanet_rustbase.dmm | 2 +-
_maps/RandomRuins/SpaceRuins/spacemall.dmm | 1 -
.../RandomRuins/SpaceRuins/vi_deepstorage.dmm | 4 +-
.../WasteRuins/wasteplanet_facility.dmm | 5 +-
_maps/map_files/generic/CentCom.dmm | 8 +-
_maps/shuttles/cybersun/cybersun_nimbus.dmm | 11 +-
.../independent/independent_atoll.dmm | 55 +-
.../independent/independent_mudskipper.dmm | 4 +-
.../independent/independent_rigger.dmm | 7 +-
.../independent/independent_shetland.dmm | 8 +-
.../shuttles/independent/independent_sola.dmm | 2 +-
.../shuttles/nanotrasen/nanotrasen_magpie.dmm | 2 +-
_maps/shuttles/solgov/solgov_paracelsus.dmm | 26 +-
.../shuttles/subshuttles/syndicate_runner.dmm | 24 +-
code/controllers/subsystem/traumas.dm | 2 +-
code/datums/components/embedded.dm | 4 +-
code/datums/components/tackle.dm | 2 +-
code/datums/diseases/advance/advance.dm | 2 +-
code/datums/diseases/decloning.dm | 59 -
code/datums/diseases/tuberculosis.dm | 2 +-
code/datums/dna.dm | 12 +-
.../mood_events/generic_negative_events.dm | 5 +
code/datums/wounds/_wounds.dm | 8 +
code/datums/wounds/bones.dm | 9 +-
code/datums/wounds/burns.dm | 13 +-
code/datums/wounds/muscle.dm | 3 +-
code/datums/wounds/pierce.dm | 14 +-
code/datums/wounds/slash.dm | 12 +
code/game/machinery/cloning.dm | 2 +-
code/game/machinery/computer/arcade.dm | 1 -
code/game/machinery/computer/cloning.dm | 4 -
code/game/machinery/medipen_refiller.dm | 4 +-
code/game/machinery/sleeper.dm | 6 +-
.../objects/effects/spawners/random/exotic.dm | 1 -
.../effects/spawners/random/salvaging.dm | 2 +-
code/game/objects/items/cigs_lighters.dm | 8 +-
code/game/objects/items/defib.dm | 5 +-
code/game/objects/items/food/donk.dm | 10 +-
code/game/objects/items/food/donut.dm | 2 +-
code/game/objects/items/food/meatslab.dm | 2 +-
code/game/objects/items/food/pastry.dm | 4 +-
code/game/objects/items/food/pie.dm | 2 +-
code/game/objects/items/food/pizza.dm | 2 +-
code/game/objects/items/food/salad.dm | 2 +-
code/game/objects/items/food/soup.dm | 4 +-
code/game/objects/items/food/sweets.dm | 2 +-
code/game/objects/items/hot_potato.dm | 175 --
.../objects/items/implants/implant_misc.dm | 2 +-
code/game/objects/items/melee/sword.dm | 3 +-
.../objects/items/robot/robot_upgrades.dm | 2 +-
code/game/objects/items/stacks/medical.dm | 2 +-
code/game/objects/items/storage/backpack.dm | 2 +-
code/game/objects/items/storage/belt.dm | 8 +-
code/game/objects/items/storage/boxes.dm | 22 +-
code/game/objects/items/storage/fancy.dm | 7 -
code/game/objects/items/storage/firstaid.dm | 45 +-
.../game/objects/items/storage/uplink_kits.dm | 3 +-
code/game/objects/structures/divine.dm | 2 +-
code/game/objects/structures/flora.dm | 4 +-
code/game/objects/structures/geyser.dm | 2 +-
code/game/objects/structures/morgue.dm | 2 +-
.../abductor/equipment/abduction_gear.dm | 45 -
code/modules/antagonists/borer/borer_chems.dm | 6 +-
.../awaymissions/mission_code/Academy.dm | 197 --
.../cargo/blackmarket/packs/consumables.dm | 14 +-
code/modules/cargo/packs/medical.dm | 35 +-
code/modules/clothing/factions/clip.dm | 8 +-
.../modules/clothing/factions/frontiersmen.dm | 8 +-
code/modules/clothing/factions/gezena.dm | 8 +-
.../clothing/outfits/ert/frontiersmen_ert.dm | 2 +-
.../food_and_drinks/drinks/drinks/bottle.dm | 4 -
.../food_and_drinks/recipes/drinks_recipes.dm | 2 +-
code/modules/hydroponics/grown/ambrosia.dm | 4 +-
code/modules/hydroponics/grown/berries.dm | 2 +-
code/modules/hydroponics/grown/cannabis.dm | 2 +-
.../hydroponics/grown/cocoa_vanilla.dm | 2 +-
code/modules/hydroponics/grown/flowers.dm | 2 +-
code/modules/hydroponics/grown/nettle.dm | 4 +-
code/modules/hydroponics/grown/replicapod.dm | 6 -
code/modules/mob/emote.dm | 13 +
code/modules/mob/living/carbon/carbon.dm | 2 +-
.../mob/living/carbon/human/examine.dm | 2 -
code/modules/mob/living/living_defines.dm | 2 -
.../hostile/mining_mobs/hivelord_outfits.dm | 8 +-
.../living/simple_animal/hostile/mushroom.dm | 2 +-
code/modules/mob/transform_procs.dm | 5 -
code/modules/movespeed/modifiers/reagent.dm | 6 +
.../chemistry/machinery/chem_synthesizer.dm | 2 +-
.../reagents/cat2_medicine_reagents.dm | 519 ----
.../medical_reagents/_medicine_reagents.dm | 8 +
.../medical_reagents/blood_reagents.dm | 129 +
.../medical_reagents/fauna_reagents.dm | 52 +
.../medical_reagents/flora_reagents.dm | 196 ++
.../reagents/medical_reagents/ipc_reagents.dm | 36 +
.../medical_reagents/medicine_reagents.dm | 842 ++++++
.../medical_reagents/misc_reagents.dm | 242 ++
.../medical_reagents/organ_reagents.dm | 175 ++
.../medical_reagents/pain_reagents.dm | 369 +++
.../medical_reagents/status_reagents.dm | 330 +++
.../medical_reagents/wound_reagents.dm | 27 +
.../chemistry/reagents/medicine_reagents.dm | 2562 -----------------
.../chemistry/reagents/other_reagents.dm | 97 +-
.../chemistry/reagents/toxin_reagents.dm | 19 -
.../chemistry/recipes/cat2_medicines.dm | 86 -
.../reagents/chemistry/recipes/drugs.dm | 1 +
.../chemistry/recipes/medical_consumables.dm | 11 +
.../reagents/chemistry/recipes/medicine.dm | 430 ++-
.../reagents/chemistry/recipes/others.dm | 12 +-
.../chemistry/recipes/pyrotechnics.dm | 8 +-
.../reagents/chemistry/recipes/toxins.dm | 7 +-
.../reagents/reagent_containers/borghydro.dm | 6 +-
.../reagents/reagent_containers/bottle.dm | 49 +-
.../reagents/reagent_containers/glass.dm | 12 +-
.../reagents/reagent_containers/hypospray.dm | 98 +-
.../reagents/reagent_containers/hypovial.dm | 60 +-
.../reagents/reagent_containers/medigel.dm | 16 +-
.../reagents/reagent_containers/patch.dm | 12 +-
.../reagents/reagent_containers/pill.dm | 46 +-
.../reagents/reagent_containers/syringes.dm | 45 +-
.../ruins/objects_and_mobs/sin_ruins.dm | 76 -
code/modules/ruins/rockplanet_ruin_code.dm | 2 +-
code/modules/surgery/bodyparts/bodyparts.dm | 2 +-
code/modules/surgery/revival.dm | 2 +-
code/modules/uplink/uplink_items.dm | 29 +-
code/modules/vending/medical.dm | 9 +-
code/modules/vending/medical_wall.dm | 6 +-
shiptest.dme | 17 +-
tools/UpdatePaths/Scripts/5162_chem_kill.txt | 12 +
134 files changed, 3089 insertions(+), 4639 deletions(-)
delete mode 100644 code/datums/diseases/decloning.dm
delete mode 100644 code/game/objects/items/hot_potato.dm
delete mode 100644 code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm
create mode 100644 code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm
delete mode 100644 code/modules/reagents/chemistry/reagents/medicine_reagents.dm
delete mode 100644 code/modules/reagents/chemistry/recipes/cat2_medicines.dm
create mode 100644 code/modules/reagents/chemistry/recipes/medical_consumables.dm
create mode 100644 tools/UpdatePaths/Scripts/5162_chem_kill.txt
diff --git a/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm b/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm
index d1d7d1bc8ab..74727a94110 100644
--- a/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm
+++ b/_maps/PentestMaps/BeachRuins/beach_pirate_crash.dmm
@@ -568,11 +568,11 @@
/obj/item/stack/medical/gauze/improvised,
/obj/item/stack/medical/gauze/improvised,
/obj/item/stack/medical/gauze/improvised,
-/obj/item/reagent_containers/pill/patch/silver_sulf{
+/obj/item/reagent_containers/pill/patch/alvitane{
pixel_x = 5;
pixel_y = 3
},
-/obj/item/reagent_containers/pill/patch/styptic,
+/obj/item/reagent_containers/pill/patch/indomide,
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood,
/area/ruin/beach/piratecrash)
diff --git a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
index b1362d35ca6..533c9ce581d 100644
--- a/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
+++ b/_maps/RandomRuins/BeachRuins/beach_ancient_ruin.dmm
@@ -486,11 +486,11 @@
/turf/open/floor/concrete/slab_1,
/area/ruin/beach/complex/wall)
"iB" = (
-/obj/item/reagent_containers/pill/patch/styptic{
+/obj/item/reagent_containers/pill/patch/indomide{
name = "industrial medicine";
pixel_y = 5
},
-/obj/item/reagent_containers/pill/patch/styptic{
+/obj/item/reagent_containers/pill/patch/indomide{
name = "industrial medicine"
},
/obj/structure/table,
@@ -1726,10 +1726,10 @@
/area/ruin/beach/complex)
"Cb" = (
/obj/structure/table,
-/obj/item/reagent_containers/pill/patch/silver_sulf{
+/obj/item/reagent_containers/pill/patch/alvitane{
name = "industrial medicine"
},
-/obj/item/reagent_containers/pill/patch/silver_sulf{
+/obj/item/reagent_containers/pill/patch/alvitane{
pixel_y = -5;
name = "industrial medicine"
},
diff --git a/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm b/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm
index 79b6c62f133..e7c68ba6241 100644
--- a/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm
+++ b/_maps/RandomRuins/IceRuins/icemoon_tesla_lab.dmm
@@ -5257,7 +5257,7 @@
pixel_y = 5;
pixel_x = -5
},
-/obj/item/reagent_containers/pill/trophazole{
+/obj/item/reagent_containers/pill/indomide{
pixel_x = 11;
pixel_y = -10
},
diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
index 534fcdd337c..6ab13da026d 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm
@@ -2568,10 +2568,6 @@
/turf/open/floor/plating,
/area/ruin/jungle/cavecrew/ship)
"IZ" = (
-/obj/item/reagent_containers/syringe/contraband/fentanyl{
- pixel_x = -3;
- pixel_y = 4
- },
/obj/item/reagent_containers/syringe/contraband/methamphetamine,
/obj/item/reagent_containers/food/drinks/beer{
pixel_x = -4
@@ -2590,6 +2586,10 @@
pixel_y = 11;
pixel_x = 5
},
+/obj/item/reagent_containers/syringe/contraband/morphine{
+ pixel_y = 4;
+ pixel_x = -4
+ },
/turf/open/floor/wood{
icon_state = "wood-broken2"
},
diff --git a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
index c075d11c602..9015669308b 100644
--- a/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
+++ b/_maps/RandomRuins/JungleRuins/jungle_paradise.dmm
@@ -4452,7 +4452,7 @@
/area/overmap_encounter/planetoid/cave/explored)
"FM" = (
/obj/effect/decal/cleanable/dirt/dust,
-/obj/item/reagent_containers/syringe/oxandrolone{
+/obj/item/reagent_containers/syringe/ysiltane{
pixel_x = 5;
pixel_y = -7
},
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
index 5c7b593bd69..647feae1d8c 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_distillery.dmm
@@ -1207,11 +1207,11 @@
/obj/effect/turf_decal/industrial/outline/red,
/obj/structure/closet/crate/medical,
/obj/item/storage/firstaid/regular,
-/obj/item/reagent_containers/glass/bottle/bicaridine{
+/obj/item/reagent_containers/glass/bottle/indomide{
pixel_x = -6
},
/obj/item/reagent_containers/syringe,
-/obj/item/reagent_containers/glass/bottle/bicaridine{
+/obj/item/reagent_containers/glass/bottle/indomide{
pixel_x = 6
},
/turf/open/floor/plasteel/patterned/brushed/rockplanet,
diff --git a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm
index 56551d08777..0fa0c5a2e1f 100644
--- a/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm
+++ b/_maps/RandomRuins/RockRuins/rockplanet_rustbase.dmm
@@ -485,7 +485,7 @@
pixel_x = 6;
pixel_y = 2
},
-/obj/item/reagent_containers/hypospray/medipen/stimulants{
+/obj/item/reagent_containers/hypospray/medipen/stimpack/crisis{
pixel_x = 10;
pixel_y = 7
},
diff --git a/_maps/RandomRuins/SpaceRuins/spacemall.dmm b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
index 1ec27f82370..af5c71eb982 100644
--- a/_maps/RandomRuins/SpaceRuins/spacemall.dmm
+++ b/_maps/RandomRuins/SpaceRuins/spacemall.dmm
@@ -9910,7 +9910,6 @@
/obj/effect/turf_decal/road/line/transparent/solgovblue,
/obj/effect/turf_decal/corner/transparent/black/diagonal,
/obj/structure/rack,
-/obj/item/hot_potato/harmless/toy,
/obj/item/toy/talking/AI,
/turf/open/floor/plasteel,
/area/ruin/space/has_grav/spacemall/shop2)
diff --git a/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm b/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm
index 0e452c4b555..bf7f8e20ee3 100644
--- a/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm
+++ b/_maps/RandomRuins/SpaceRuins/vi_deepstorage.dmm
@@ -6839,8 +6839,8 @@
/obj/item/reagent_containers/hypospray/medipen/rabbit,
/obj/item/reagent_containers/hypospray/medipen/survival,
/obj/item/reagent_containers/hypospray/medipen/survival,
-/obj/item/reagent_containers/hypospray/medipen/tricord,
-/obj/item/reagent_containers/hypospray/medipen/tricord,
+/obj/item/reagent_containers/hypospray/medipen/cureall,
+/obj/item/reagent_containers/hypospray/medipen/cureall,
/obj/item/reagent_containers/hypospray/medipen/bonefixingjuice,
/obj/item/reagent_containers/hypospray/medipen/bonefixingjuice,
/obj/item/reagent_containers/hypospray/medipen/morphine,
diff --git a/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm b/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm
index f93f529b540..cda339a49e6 100644
--- a/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm
+++ b/_maps/RandomRuins/WasteRuins/wasteplanet_facility.dmm
@@ -285,10 +285,7 @@
pixel_y = 2;
pixel_x = 8
},
-/obj/item/reagent_containers/glass/bottle/antitoxin{
- pixel_x = -4;
- pixel_y = 2
- },
+/obj/item/reagent_containers/glass/bottle/charcoal,
/obj/machinery/atmospherics/pipe/simple/supply/hidden/layer4{
dir = 9
},
diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm
index d5b13fb9e9b..4ab7449fc58 100644
--- a/_maps/map_files/generic/CentCom.dmm
+++ b/_maps/map_files/generic/CentCom.dmm
@@ -627,7 +627,7 @@
/turf/open/floor/plating/abductor,
/area/abductor_ship)
"alE" = (
-/obj/structure/table/optable/abductor,
+/obj/structure/table/optable,
/turf/open/floor/plating/abductor,
/area/abductor_ship)
"alF" = (
@@ -18594,7 +18594,7 @@ aaa
akq
aJB
ali
-alE
+ali
ali
amu
and
@@ -18621,7 +18621,7 @@ aaa
akq
akN
ali
-alE
+ali
ali
amu
and
@@ -18648,7 +18648,7 @@ aaa
akq
aAv
ali
-alE
+ali
ali
amu
and
diff --git a/_maps/shuttles/cybersun/cybersun_nimbus.dmm b/_maps/shuttles/cybersun/cybersun_nimbus.dmm
index 95ac6a25233..51d3f05eb94 100644
--- a/_maps/shuttles/cybersun/cybersun_nimbus.dmm
+++ b/_maps/shuttles/cybersun/cybersun_nimbus.dmm
@@ -38,14 +38,9 @@
/obj/item/storage/firstaid/medical{
pixel_x = -4
},
-/obj/item/hypospray/mkii/tricord{
- pixel_x = 7;
- pixel_y = 2
- },
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord,
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord{
- pixel_x = -5
- },
+/obj/item/hypospray/mkii/cureall,
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall,
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall,
/turf/open/floor/plasteel/mono/white,
/area/ship/cargo)
"aL" = (
diff --git a/_maps/shuttles/independent/independent_atoll.dmm b/_maps/shuttles/independent/independent_atoll.dmm
index 7c146a610e1..6813610b8fb 100644
--- a/_maps/shuttles/independent/independent_atoll.dmm
+++ b/_maps/shuttles/independent/independent_atoll.dmm
@@ -1006,8 +1006,7 @@
/area/ship/hallway/aft)
"in" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/obj/machinery/airalarm/directional/south,
/turf/open/floor/wood/walnut,
@@ -2123,8 +2122,7 @@
"sv" = (
/obj/structure/fluff/hedge,
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/turf/open/floor/wood/walnut,
/area/ship/crew/ccommons)
@@ -2190,8 +2188,7 @@
/area/ship/crew/dorm/captain)
"sX" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer4{
dir = 5
@@ -2277,8 +2274,7 @@
/area/ship/medical)
"ux" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/turf/open/floor/wood/walnut,
/area/ship/crew/ccommons)
@@ -2292,9 +2288,7 @@
/turf/open/floor/plasteel/tech,
/area/ship/engineering/engines/starboard)
"uL" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 4
- },
+/obj/machinery/power/smes/shuttle/precharged,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -2716,8 +2710,7 @@
/area/ship/crew/dorm/captain)
"yA" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/turf/open/floor/wood/walnut,
/area/ship/crew/office)
@@ -2732,9 +2725,7 @@
/turf/open/floor/plating,
/area/ship/engineering/engines/port)
"yF" = (
-/obj/machinery/power/smes/shuttle/precharged{
- dir = 4
- },
+/obj/machinery/power/smes/shuttle/precharged,
/obj/structure/cable/yellow{
icon_state = "0-8"
},
@@ -3380,8 +3371,7 @@
/area/ship/hallway/port)
"Fv" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/obj/effect/decal/cleanable/dirt/dust,
/obj/machinery/computer/med_data/laptop{
@@ -4830,9 +4820,7 @@
/turf/open/floor/plasteel/patterned/ridged,
/area/ship/crew/office)
"Rj" = (
-/obj/machinery/power/shuttle/engine/electric{
- dir = 4
- },
+/obj/machinery/power/shuttle/engine/electric,
/obj/structure/cable/yellow{
icon_state = "0-4"
},
@@ -5001,24 +4989,22 @@
pixel_x = -6;
pixel_y = 14
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle";
- pixel_x = 6;
- pixel_y = 14
- },
/obj/item/reagent_containers/glass/bottle/atropine{
pixel_x = -6;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle/morphine{
- pixel_x = 6;
- pixel_y = 8
- },
/obj/item/storage/pill_bottle/mannitol{
pixel_x = -8
},
/obj/item/storage/pill_bottle/mutadone,
+/obj/item/reagent_containers/glass/bottle/gjalrazine{
+ pixel_y = 14;
+ pixel_x = 6
+ },
+/obj/item/reagent_containers/glass/bottle/morphine{
+ pixel_x = 6;
+ pixel_y = 8
+ },
/obj/item/storage/pill_bottle/penacid{
pixel_x = 8
},
@@ -5101,9 +5087,7 @@
/turf/open/floor/carpet,
/area/ship/crew/ccommons)
"TZ" = (
-/obj/machinery/power/shuttle/engine/electric{
- dir = 4
- },
+/obj/machinery/power/shuttle/engine/electric,
/obj/structure/cable/yellow{
icon_state = "0-4"
},
@@ -5742,8 +5726,7 @@
/area/ship/hallway/aft)
"ZQ" = (
/obj/effect/turf_decal/siding/wood{
- color = "#543C30";
- dir = 2
+ color = "#543C30"
},
/obj/effect/decal/cleanable/dirt/dust,
/turf/open/floor/wood/walnut,
diff --git a/_maps/shuttles/independent/independent_mudskipper.dmm b/_maps/shuttles/independent/independent_mudskipper.dmm
index 5fbd51aa17d..5a40be16d03 100644
--- a/_maps/shuttles/independent/independent_mudskipper.dmm
+++ b/_maps/shuttles/independent/independent_mudskipper.dmm
@@ -366,8 +366,8 @@
/obj/item/bodybag,
/obj/item/bodybag,
/obj/item/pickaxe/mini,
-/obj/item/reagent_containers/pill/patch/styptic,
-/obj/item/reagent_containers/pill/patch/silver_sulf,
+/obj/item/reagent_containers/pill/patch/indomide,
+/obj/item/reagent_containers/pill/patch/alvitane,
/obj/item/multitool,
/obj/item/stack/marker_beacon/thirty,
/obj/item/gear_pack/anglegrinder,
diff --git a/_maps/shuttles/independent/independent_rigger.dmm b/_maps/shuttles/independent/independent_rigger.dmm
index 21acdaac8e7..c893782c580 100644
--- a/_maps/shuttles/independent/independent_rigger.dmm
+++ b/_maps/shuttles/independent/independent_rigger.dmm
@@ -365,11 +365,7 @@
pixel_x = 8;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle";
- pixel_x = 5
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/item/reagent_containers/syringe{
pixel_x = 7
},
@@ -4488,7 +4484,6 @@
/area/ship/hallway/central)
"ZI" = (
/obj/item/storage/case/surgery{
- pixel_x = 0;
pixel_y = 3
},
/obj/item/clothing/gloves/color/latex/nitrile,
diff --git a/_maps/shuttles/independent/independent_shetland.dmm b/_maps/shuttles/independent/independent_shetland.dmm
index 933904b9216..bb9ab8bd84b 100644
--- a/_maps/shuttles/independent/independent_shetland.dmm
+++ b/_maps/shuttles/independent/independent_shetland.dmm
@@ -1295,14 +1295,14 @@
pixel_x = 5;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
/obj/item/storage/box/bodybags,
/obj/structure/cable{
icon_state = "1-8"
},
+/obj/item/reagent_containers/glass/bottle/gjalrazine{
+ pixel_x = 5;
+ pixel_y = -8
+ },
/turf/open/floor/plasteel/white,
/area/ship/medical)
"lc" = (
diff --git a/_maps/shuttles/independent/independent_sola.dmm b/_maps/shuttles/independent/independent_sola.dmm
index 81bb07da0d8..7a6f87df481 100644
--- a/_maps/shuttles/independent/independent_sola.dmm
+++ b/_maps/shuttles/independent/independent_sola.dmm
@@ -2882,11 +2882,11 @@
/obj/item/storage/box/bodybags,
/obj/item/storage/box/syringes,
/obj/item/roller,
-/obj/item/reagent_containers/syringe/thializid,
/obj/effect/turf_decal/corner/opaque/bottlegreen{
dir = 6
},
/obj/item/healthanalyzer,
+/obj/item/reagent_containers/syringe/pancrazine,
/turf/open/floor/plasteel/white,
/area/ship/medical)
"LR" = (
diff --git a/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm b/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm
index ac01c1bbae3..25b37c2d3c8 100644
--- a/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm
+++ b/_maps/shuttles/nanotrasen/nanotrasen_magpie.dmm
@@ -1966,7 +1966,7 @@
},
/obj/machinery/airalarm/directional/west,
/obj/item/storage/box/syringes,
-/obj/item/reagent_containers/glass/bottle/bicaridine,
+/obj/item/reagent_containers/glass/bottle/indomide,
/obj/item/storage/pill_bottle/charcoal,
/obj/effect/spawner/random/medical/medkit,
/obj/item/storage/firstaid/medical,
diff --git a/_maps/shuttles/solgov/solgov_paracelsus.dmm b/_maps/shuttles/solgov/solgov_paracelsus.dmm
index aabb0c5bd31..c6d051ed4df 100644
--- a/_maps/shuttles/solgov/solgov_paracelsus.dmm
+++ b/_maps/shuttles/solgov/solgov_paracelsus.dmm
@@ -683,8 +683,7 @@
pixel_y = -1
},
/obj/item/paper_bin{
- pixel_x = 9;
- pixel_y = 0
+ pixel_x = 9
},
/obj/item/pen/solgov{
pixel_x = 9;
@@ -1161,7 +1160,6 @@
/area/ship/storage/eva)
"kN" = (
/obj/structure/sign/solgov_seal{
- pixel_x = 0;
pixel_y = -1
},
/turf/closed/wall/mineral/titanium,
@@ -1421,8 +1419,7 @@
"nG" = (
/obj/structure/filingcabinet/double{
dir = 4;
- pixel_x = -10;
- pixel_y = 0
+ pixel_x = -10
},
/obj/machinery/light/directional/west,
/turf/open/floor/carpet/royalblue,
@@ -1651,8 +1648,7 @@
pixel_y = -1
},
/obj/item/paper_bin{
- pixel_x = 9;
- pixel_y = 0
+ pixel_x = 9
},
/obj/item/pen/solgov{
pixel_x = 9;
@@ -2500,10 +2496,7 @@
pixel_x = -3;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/turf/open/floor/mineral/titanium/tiled/white,
/area/ship/medical/surgery)
"wY" = (
@@ -3650,8 +3643,7 @@
/area/ship/crew/canteen)
"IP" = (
/obj/structure/sign/solgov_flag{
- pixel_x = -1;
- pixel_y = 0
+ pixel_x = -1
},
/turf/closed/wall/mineral/titanium/nodiagonal,
/area/ship/security/armory)
@@ -4195,7 +4187,6 @@
},
/obj/structure/table,
/obj/item/storage/box/bodybags{
- pixel_x = 0;
pixel_y = 4
},
/turf/open/floor/plasteel/white,
@@ -4914,9 +4905,7 @@
/area/ship/hallway/port)
"TD" = (
/obj/item/radio/intercom/directional/south,
-/obj/effect/turf_decal/trimline/opaque/solgovblue/filled/line{
- dir = 2
- },
+/obj/effect/turf_decal/trimline/opaque/solgovblue/filled/line,
/obj/structure/bed/roller,
/turf/open/floor/plasteel/white,
/area/ship/crew/crewtwo)
@@ -5381,8 +5370,7 @@
/area/ship/medical)
"XQ" = (
/obj/structure/mirror{
- pixel_y = -25;
- pixel_x = 0
+ pixel_y = -25
},
/obj/structure/cable{
icon_state = "1-4"
diff --git a/_maps/shuttles/subshuttles/syndicate_runner.dmm b/_maps/shuttles/subshuttles/syndicate_runner.dmm
index 036a10b4904..c4b723e24db 100644
--- a/_maps/shuttles/subshuttles/syndicate_runner.dmm
+++ b/_maps/shuttles/subshuttles/syndicate_runner.dmm
@@ -50,9 +50,7 @@
/turf/open/floor/plasteel/white,
/area/ship/bridge)
"aj" = (
-/obj/machinery/power/shuttle/engine/electric/premium{
- dir = 4
- },
+/obj/machinery/power/shuttle/engine/electric/premium,
/obj/structure/window/reinforced,
/obj/structure/window/reinforced{
dir = 1
@@ -85,18 +83,11 @@
/area/ship/bridge)
"al" = (
/obj/structure/table/chem,
-/obj/item/reagent_containers/glass/bottle/bicaridine{
+/obj/item/reagent_containers/glass/bottle/indomide{
pixel_x = 7;
pixel_y = 14
},
-/obj/item/reagent_containers/glass/bottle/antitoxin{
- pixel_x = -4;
- pixel_y = 10
- },
-/obj/item/reagent_containers/glass/bottle/kelotane{
- pixel_x = 4;
- pixel_y = 7
- },
+/obj/item/reagent_containers/glass/bottle/charcoal,
/obj/item/reagent_containers/glass/bottle/dexalin{
pixel_x = -3;
pixel_y = 2
@@ -104,6 +95,10 @@
/obj/item/reagent_containers/syringe{
pixel_x = 8
},
+/obj/item/reagent_containers/glass/bottle/alvitane{
+ pixel_x = 4;
+ pixel_y = 3
+ },
/turf/open/floor/plasteel/mono/dark,
/area/ship/bridge)
"bz" = (
@@ -237,7 +232,6 @@
/area/ship/bridge)
"gi" = (
/obj/item/storage/case/surgery{
- pixel_x = 0;
pixel_y = 3
},
/obj/structure/table/chem,
@@ -434,9 +428,7 @@
/turf/open/floor/plasteel/white,
/area/ship/bridge)
"DW" = (
-/obj/machinery/power/shuttle/engine/electric/premium{
- dir = 4
- },
+/obj/machinery/power/shuttle/engine/electric/premium,
/obj/structure/window/reinforced{
dir = 1
},
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index e8da2479685..c890cc95dcf 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -126,7 +126,7 @@ SUBSYSTEM_DEF(traumas)
/obj/item/melee/baton/abductor, /obj/item/radio/headset/abductor, /obj/item/scalpel/alien, /obj/item/hemostat/alien,
/obj/item/retractor/alien, /obj/item/circular_saw/alien, /obj/item/surgicaldrill/alien, /obj/item/cautery/alien,
/obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor,
- /obj/structure/table/abductor, /obj/structure/table/optable/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
+ /obj/structure/table/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
/obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor,
/obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)),
diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm
index bae7a4f905b..e02ad5c832f 100644
--- a/code/datums/components/embedded.dm
+++ b/code/datums/components/embedded.dm
@@ -218,8 +218,8 @@
if(harmful)
var/damage = weapon.w_class * remove_pain_mult
// It hurts to rip it out, get surgery you dingus. unlike the others, this CAN wound + increase slash bloodflow
- limb.receive_damage(brute = (1 - pain_stam_pct) * damage, stamina = pain_stam_pct * damage, sharpness = SHARP_EDGED)
- victim.force_scream()
+ var/scream_power = limb.receive_damage(brute = (1 - pain_stam_pct) * damage, stamina = pain_stam_pct * damage, sharpness = SHARP_EDGED)
+ victim.force_pain_noise(scream_power)
victim.visible_message(
span_notice("[victim] successfully rips [weapon] [harmful ? "out" : "off"] of [victim.p_their()] [limb.name]!"),
diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm
index 112ca515d0f..9fc2971084b 100644
--- a/code/datums/components/tackle.dm
+++ b/code/datums/components/tackle.dm
@@ -395,7 +395,7 @@
playsound(user, 'sound/effects/blobattack.ogg', 60, TRUE)
playsound(user, 'sound/effects/splat.ogg', 70, TRUE)
playsound(user, 'sound/effects/wounds/crack2.ogg', 70, TRUE)
- user.force_scream()
+ user.force_pain_noise(400)
user.gain_trauma(/datum/brain_trauma/severe/paralysis/paraplegic) // oopsie indeed!
shake_camera(user, 7, 7)
user.flash_act(1, TRUE, TRUE, length = 4.5) //PENTEST EDIT
diff --git a/code/datums/diseases/advance/advance.dm b/code/datums/diseases/advance/advance.dm
index db748da77e2..d4a5e0315df 100644
--- a/code/datums/diseases/advance/advance.dm
+++ b/code/datums/diseases/advance/advance.dm
@@ -60,7 +60,7 @@
/datum/reagent/pax, /datum/reagent/drug/happiness, /datum/reagent/medicine/ephedrine
),
list( // level 9
- /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/sal_acid
+ /datum/reagent/toxin/lipolicide, /datum/reagent/medicine/silfrine
),
list( // level 10
/datum/reagent/medicine/haloperidol, /datum/reagent/drug/aranesp, /datum/reagent/medicine/diphenhydramine
diff --git a/code/datums/diseases/decloning.dm b/code/datums/diseases/decloning.dm
deleted file mode 100644
index 340d9fd0f30..00000000000
--- a/code/datums/diseases/decloning.dm
+++ /dev/null
@@ -1,59 +0,0 @@
-/datum/disease/decloning
- form = "Virus"
- name = "Cellular Degeneration"
- max_stages = 5
- stage_prob = 1
- cure_text = "Rezadone or death."
- agent = "Severe Genetic Damage"
- viable_mobtypes = list(/mob/living/carbon/human)
- desc = @"If left untreated the subject will [REDACTED]!"
- severity = "Dangerous!"
- cures = list(/datum/reagent/medicine/rezadone)
- disease_flags = CAN_CARRY|CAN_RESIST
- spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
- process_dead = TRUE
-
-/datum/disease/decloning/stage_act()
- ..()
- if(affected_mob.stat == DEAD)
- cure()
- return
- switch(stage)
- if(2)
- if(prob(2))
- affected_mob.emote("itch")
- if(prob(2))
- affected_mob.emote("yawn")
- if(3)
- if(prob(2))
- affected_mob.emote("itch")
- if(prob(2))
- affected_mob.emote("drool")
- if(prob(3))
- affected_mob.adjustCloneLoss(1)
- if(prob(2))
- to_chat(affected_mob, span_danger("Your skin feels strange."))
-
- if(4)
- if(prob(2))
- affected_mob.emote("itch")
- if(prob(2))
- affected_mob.emote("drool")
- if(prob(5))
- affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
- affected_mob.adjustCloneLoss(2)
- if(prob(15))
- affected_mob.stuttering += 3
- if(5)
- if(prob(2))
- affected_mob.emote("itch")
- if(prob(2))
- affected_mob.emote("drool")
- if(prob(5))
- to_chat(affected_mob, span_danger("Your skin starts degrading!"))
- if(prob(10))
- affected_mob.adjustCloneLoss(5)
- affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
- if(affected_mob.cloneloss >= 100)
- affected_mob.visible_message(span_danger("[affected_mob] skin turns to dust!"), "Your skin turns to dust!")
- affected_mob.dust()
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index 6ddd9e8ad3a..007b530d06c 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -4,7 +4,7 @@
max_stages = 5
spread_text = "Airborne"
cure_text = "Spaceacillin & Perfluorodecalin"
- cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/perfluorodecalin)
+ cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salbutamol)
agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
diff --git a/code/datums/dna.dm b/code/datums/dna.dm
index 63f65d8dd75..619d8aa3f06 100644
--- a/code/datums/dna.dm
+++ b/code/datums/dna.dm
@@ -626,7 +626,7 @@
dna.remove_all_mutations()
dna.stability = 100
if(prob(max(70-instability,0)))
- switch(rand(0,10)) //not complete and utter death
+ switch(rand(0,8)) //not complete and utter death
if(0)
monkeyize()
if(1)
@@ -641,14 +641,8 @@
to_chat(src, span_notice("Oh, I actually feel quite alright!")) //you thought
physiology.damage_resistance = -20000
if(5)
- to_chat(src, span_notice("Oh, I actually feel quite alright!"))
- reagents.add_reagent(/datum/reagent/aslimetoxin, 10)
- if(6)
apply_status_effect(STATUS_EFFECT_GO_AWAY)
- if(7)
- to_chat(src, span_notice("Oh, I actually feel quite alright!"))
- ForceContractDisease(new/datum/disease/decloning()) //slow acting, non-viral clone damage based GBS
- if(8)
+ if(6)
var/list/elligible_organs = list()
for(var/obj/item/organ/O in internal_organs) //make sure we dont get an implant or cavity item
elligible_organs += O
@@ -658,7 +652,7 @@
O.Remove(src)
visible_message(span_danger("[src] vomits up their [O.name]!"), span_danger("You vomit up your [O.name]")) //no "vomit up your the heart"
O.forceMove(drop_location())
- if(9 to 10)
+ if(7 to 9)
ForceContractDisease(new/datum/disease/gastrolosis())
to_chat(src, span_notice("Oh, I actually feel quite alright!"))
else
diff --git a/code/datums/mood_events/generic_negative_events.dm b/code/datums/mood_events/generic_negative_events.dm
index 358d4e15592..0c016e7fc92 100644
--- a/code/datums/mood_events/generic_negative_events.dm
+++ b/code/datums/mood_events/generic_negative_events.dm
@@ -114,6 +114,11 @@
mood_change = -4
timeout = 3 MINUTES
+/datum/mood_event/uncomfortable_medicine
+ description = span_warning("Medicine may be good for me, but right now I feel worse.")
+ mood_change = -3
+ timeout = 120 SECONDS
+
/datum/mood_event/painful_medicine
description = span_warning("Medicine may be good for me but right now it stings like hell.")
mood_change = -5
diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm
index 9a3f37015c2..2e97bbe5d9e 100644
--- a/code/datums/wounds/_wounds.dm
+++ b/code/datums/wounds/_wounds.dm
@@ -327,6 +327,14 @@
/datum/wound/proc/on_synthflesh(power)
return
+/// When silfrine is applied to the victim, we call this.
+/datum/wound/proc/on_silfrine(power)
+ return
+
+/// When ysiltane/alvitane/quardextane is applied to the victim, we call this.
+/datum/wound/proc/on_tane(power)
+ return
+
/// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them
/datum/wound/proc/on_stasis()
return
diff --git a/code/datums/wounds/bones.dm b/code/datums/wounds/bones.dm
index f881c115b57..73420e2e439 100644
--- a/code/datums/wounds/bones.dm
+++ b/code/datums/wounds/bones.dm
@@ -102,7 +102,8 @@
if(prob((severity - 1) * 15))
// And you have a 70% or 50% chance to actually land the blow, respectively
if(prob(70 - 20 * (severity - 1)))
- to_chat(victim, span_userdanger("The fracture in your [limb.name] shoots with pain as you strike [target]!"))
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(victim, span_userdanger("The fracture in your [limb.name] shoots with pain as you strike [target]!"))
limb.receive_damage(brute = rand(1,2))
else
victim.visible_message(
@@ -287,7 +288,7 @@
ignored_mobs = victim,
)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] back into place!"))
- victim.force_scream()
+ victim.force_pain_noise(80)
limb.receive_damage(brute = 5, wound_bonus = CANT_WOUND)
qdel(src)
else
@@ -314,7 +315,7 @@
ignored_mobs = victim,
)
to_chat(victim, span_userdanger("[user] snaps your dislocated [limb.name] with a sickening crack!"))
- victim.force_scream()
+ victim.force_pain_noise(100)
limb.receive_damage(brute = 20, wound_bonus = 40)
else
user.visible_message(
@@ -431,7 +432,7 @@
return
I.use(1)
- victim.force_scream()
+ victim.force_pain_noise(60)
if(user != victim)
user.visible_message(
span_notice("[user] finishes applying [I] to [victim]'s [limb.name], giving off a wet fizzle."),
diff --git a/code/datums/wounds/burns.dm b/code/datums/wounds/burns.dm
index cb6eff02d3c..922c67ecd87 100644
--- a/code/datums/wounds/burns.dm
+++ b/code/datums/wounds/burns.dm
@@ -227,10 +227,21 @@
to_chat(user, span_warning("You need to open [mesh_check] first."))
return
ointmentmesh(mesh_check, user)
-e
+
/datum/wound/burn/on_synthflesh(amount)
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
+/// When a -tane chem is applied to the victim, we call this.
+/datum/wound/burn/on_tane(amount)
+ if(amount > 10 && severity <= WOUND_SEVERITY_SEVERE)
+ qdel(src)
+ return
+
+ flesh_healing += amount * 0.25
+ sanitization += amount * 0.1
+ return
+
+
// we don't even care about first degree burns, straight to second
/datum/wound/burn/moderate
name = "Second Degree Burns"
diff --git a/code/datums/wounds/muscle.dm b/code/datums/wounds/muscle.dm
index cf13b3bf2a5..88b7093ab69 100644
--- a/code/datums/wounds/muscle.dm
+++ b/code/datums/wounds/muscle.dm
@@ -73,7 +73,8 @@
if(prob(severity * 15))
//And you have a 70% or 50% chance to actually land the blow, respectively
if(prob(70 - 20 * severity))
- to_chat(victim, span_userdanger("The damaged muscle in your [limb.name] shoots with pain as you strike [target]!"))
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(victim, span_userdanger("The damaged muscle in your [limb.name] shoots with pain as you strike [target]!"))
limb.receive_damage(brute=rand(1,3))
else
victim.visible_message(
diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm
index cc607e3a6c8..a7ddf660d0b 100644
--- a/code/datums/wounds/pierce.dm
+++ b/code/datums/wounds/pierce.dm
@@ -116,6 +116,18 @@
. = ..()
blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
+/datum/wound/pierce/on_silfrine(power)
+ switch(power)
+ if(0 to 3)
+ EMPTY_BLOCK_GUARD
+ if(4 to 8)
+ if(severity < WOUND_SEVERITY_MODERATE)
+ qdel(src)
+ if(8 to 30)
+ if(severity < WOUND_SEVERITY_SEVERE)
+ qdel(src)
+ blood_flow -= 0.05 * power
+
/// If someone is using a suture to close this puncture
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)
var/self_penalty_mult = (user == victim ? 1 : 1)
@@ -158,7 +170,7 @@
)
limb.receive_damage(burn = 2 + severity, wound_bonus = CANT_WOUND)
if(prob(15))
- victim.force_scream()
+ victim.force_pain_noise(50)
var/blood_cauterized = (0.6 / (self_penalty_mult * improv_penalty_mult))
blood_flow -= blood_cauterized
diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm
index 7648ff07880..a3003c22a6c 100644
--- a/code/datums/wounds/slash.dm
+++ b/code/datums/wounds/slash.dm
@@ -151,6 +151,18 @@
. = ..()
blood_flow -= 0.075 * power // 20u * 0.075 = -1.5 blood flow
+/datum/wound/slash/on_silfrine(power)
+ switch(power)
+ if(0 to 5)
+ EMPTY_BLOCK_GUARD
+ if(6 to 11)
+ if(severity < WOUND_SEVERITY_MODERATE)
+ qdel(src)
+ if(12 to 30)
+ if(severity < WOUND_SEVERITY_SEVERE)
+ qdel(src)
+ blood_flow -= 0.05 * power
+
/// If someone's putting a laser gun up to our cut to cauterize it
/datum/wound/slash/proc/las_cauterize(obj/item/gun/energy/laser/lasgun, mob/user)
var/self_penalty_mult = (user == victim ? 1.25 : 1)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index 46e419666c2..36fc981ed53 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -286,7 +286,7 @@
connected_message("Clone Ejected: Not enough material.")
if(internal_radio)
SPEAK("The cloning of [mob_occupant.real_name] has been ended prematurely due to insufficient material.")
- if(mob_occupant && (mob_occupant.stat == DEAD) || mob_occupant.hellbound) //Autoeject corpses.
+ if(mob_occupant && (mob_occupant.stat == DEAD)) //Autoeject corpses.
connected_message("Clone Rejected: Deceased.")
if(internal_radio)
SPEAK("The cloning of [mob_occupant.real_name] has been \
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index 9abb6ed8b15..be79ff44b95 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -40,7 +40,6 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/toy/clockwork_watch = 2,
/obj/item/toy/toy_dagger = 2,
/obj/item/extendohand/acme = 1,
- /obj/item/hot_potato/harmless/toy = 1,
/obj/item/card/emagfake = 1,
/obj/item/clothing/shoes/kindleKicks = 2,
/obj/item/toy/plush/goatplushie/angry/realgoat = 2,
diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm
index cea3f2eadaa..9218c140d3b 100644
--- a/code/game/machinery/computer/cloning.dm
+++ b/code/game/machinery/computer/cloning.dm
@@ -542,10 +542,6 @@
scantemp = "Unable to locate valid genetic data."
playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
return
- if(!body_only && mob_occupant.hellbound)
- scantemp = "Subject's brain is not responding to scanning stimuli."
- playsound(src, 'sound/machines/terminal_prompt_deny.ogg', 50, FALSE)
- return
if((HAS_TRAIT(mob_occupant, TRAIT_HUSK)) && (src.scanner.scan_level < 2))
scantemp = "Subject's body is too damaged to scan properly."
playsound(src, 'sound/machines/terminal_alert.ogg', 50, FALSE)
diff --git a/code/game/machinery/medipen_refiller.dm b/code/game/machinery/medipen_refiller.dm
index 749c1aa322b..1d385839df2 100644
--- a/code/game/machinery/medipen_refiller.dm
+++ b/code/game/machinery/medipen_refiller.dm
@@ -11,8 +11,8 @@
/obj/item/reagent_containers/hypospray/medipen = /datum/reagent/medicine/epinephrine,
/obj/item/reagent_containers/hypospray/medipen/atropine = /datum/reagent/medicine/atropine,
/obj/item/reagent_containers/hypospray/medipen/salbutamol = /datum/reagent/medicine/salbutamol,
- /obj/item/reagent_containers/hypospray/medipen/oxandrolone = /datum/reagent/medicine/oxandrolone,
- /obj/item/reagent_containers/hypospray/medipen/salacid = /datum/reagent/medicine/sal_acid,
+ /obj/item/reagent_containers/hypospray/medipen/ysiltane = /datum/reagent/medicine/ysiltane,
+ /obj/item/reagent_containers/hypospray/medipen/silfrine = /datum/reagent/medicine/silfrine,
/obj/item/reagent_containers/hypospray/medipen/penacid = /datum/reagent/medicine/pen_acid
)
/// var to prevent glitches in the animation
diff --git a/code/game/machinery/sleeper.dm b/code/game/machinery/sleeper.dm
index 6d89618d6e1..c99eff22ded 100644
--- a/code/game/machinery/sleeper.dm
+++ b/code/game/machinery/sleeper.dm
@@ -27,11 +27,11 @@
var/list/dispensable_reagents
var/list/starting_beakers = list(
- /obj/item/reagent_containers/glass/bottle/antitoxin/sleeper,
- /obj/item/reagent_containers/glass/bottle/bicaridine/sleeper,
+ /obj/item/reagent_containers/glass/bottle/charcoal/sleeper,
+ /obj/item/reagent_containers/glass/bottle/indomide/sleeper,
/obj/item/reagent_containers/glass/bottle/dexalin/sleeper,
/obj/item/reagent_containers/glass/bottle/epinephrine/sleeper,
- /obj/item/reagent_containers/glass/bottle/kelotane/sleeper,
+ /obj/item/reagent_containers/glass/bottle/alvitane/sleeper,
/obj/item/reagent_containers/glass/bottle/morphine/sleeper)
///Chembag which holds all the beakers, don't look at me like that
diff --git a/code/game/objects/effects/spawners/random/exotic.dm b/code/game/objects/effects/spawners/random/exotic.dm
index 4cc66f19e23..b2b7975e907 100644
--- a/code/game/objects/effects/spawners/random/exotic.dm
+++ b/code/game/objects/effects/spawners/random/exotic.dm
@@ -36,7 +36,6 @@
/obj/item/reagent_containers/syringe/contraband/crank = 1,
/obj/item/reagent_containers/syringe/contraband/methamphetamine = 1,
/obj/item/reagent_containers/syringe/contraband/mammoth = 1,
- /obj/item/reagent_containers/syringe/contraband/fentanyl = 1,
/obj/item/reagent_containers/syringe/contraband/morphine = 1,
/obj/item/storage/pill_bottle/happy = 1,
/obj/item/storage/pill_bottle/lsd = 1,
diff --git a/code/game/objects/effects/spawners/random/salvaging.dm b/code/game/objects/effects/spawners/random/salvaging.dm
index dfa50c49bb4..b94b0576393 100644
--- a/code/game/objects/effects/spawners/random/salvaging.dm
+++ b/code/game/objects/effects/spawners/random/salvaging.dm
@@ -61,7 +61,7 @@
/obj/item/clothing/gloves/combat = 200,
/obj/item/clothing/head/chameleon = 200,
/obj/item/pen/sleepy = 200,
- /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 100,
+ /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis = 100,
/obj/item/grenade/c4 = 100,
/obj/item/wrench/syndie = 30,
diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm
index 9a8a6e4174d..5803c1efad2 100644
--- a/code/game/objects/items/cigs_lighters.dm
+++ b/code/game/objects/items/cigs_lighters.dm
@@ -339,11 +339,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
chem_volume = 60
smoketime = 2 * 60
smoke_all = TRUE
- list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/omnizine = 15)
-
-/obj/item/clothing/mask/cigarette/xeno
- desc = "A Xeno Filtered brand cigarette."
- list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15)
+ list_reagents = list(/datum/reagent/drug/nicotine = 10, /datum/reagent/medicine/panacea = 15)
// Rollies.
@@ -744,7 +740,7 @@ CIGARETTE PACKETS ARE IN FANCY.DM
heat = 3000 //Blue flame!
light_color = LIGHT_COLOR_CYAN
overlay_state = "slime"
- grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5, /datum/reagent/medicine/pyroxadone = 5)
+ grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5)
/obj/item/lighter/clockwork
name = "bronze zippo"
diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm
index 86af260dae6..c5a8fd4d9e0 100644
--- a/code/game/objects/items/defib.dm
+++ b/code/game/objects/items/defib.dm
@@ -552,10 +552,7 @@
shock_touching(30, H)
var/failed
-
- if (H.hellbound)
- failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's soul appears to be on another plane of existence. Further attempts futile.")
- else if (!heart)
+ if (!heart)
failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart is missing.")
else if (heart.organ_flags & ORGAN_FAILING)
failed = span_warning("[req_defib ? "[defib]" : "[src]"] buzzes: Resuscitation failed - Patient's heart too damaged, replace or repair and try again.")
diff --git a/code/game/objects/items/food/donk.dm b/code/game/objects/items/food/donk.dm
index d9eb797c7a0..5d6c2662891 100644
--- a/code/game/objects/items/food/donk.dm
+++ b/code/game/objects/items/food/donk.dm
@@ -50,7 +50,7 @@
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/nutriment/protein = 2,
- /datum/reagent/medicine/omnizine = 6
+ /datum/reagent/medicine/panacea/effluvial = 6
)
tastes = list("meat" = 2, "dough" = 2, "laziness" = 1)
foodtypes = GRAIN
@@ -92,7 +92,7 @@
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/nutriment/protein = 2,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea/effluvial = 2,
/datum/reagent/consumable/capsaicin = 5
)
tastes = list("meat" = 2, "dough" = 2, "weird spices" = 2)
@@ -120,7 +120,7 @@
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/nutriment/protein = 3,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea/effluvial = 2,
/datum/reagent/consumable/soysauce = 2,
)
tastes = list("meat" = 2, "dough" = 2, "soy sauce" = 2)
@@ -148,7 +148,7 @@
food_reagents = list(
/datum/reagent/consumable/nutriment = 3,
/datum/reagent/consumable/nutriment/protein = 2,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea/effluvial = 2,
/datum/reagent/consumable/tomatojuice = 2
)
tastes = list("meat" = 2, "dough" = 2, "melty cheese"= 2)
@@ -174,7 +174,7 @@
icon_state = "donkpocketberry"
food_reagents = list(
/datum/reagent/consumable/nutriment = 4,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea/effluvial = 2,
/datum/reagent/consumable/berryjuice = 3
)
tastes = list("dough" = 2, "warm jam" = 2)
diff --git a/code/game/objects/items/food/donut.dm b/code/game/objects/items/food/donut.dm
index c589231d612..7c8a9194751 100644
--- a/code/game/objects/items/food/donut.dm
+++ b/code/game/objects/items/food/donut.dm
@@ -89,7 +89,7 @@
/datum/reagent/toxin/slimejelly,
/datum/reagent/consumable/banana,
/datum/reagent/consumable/berryjuice,
- /datum/reagent/medicine/omnizine,
+ /datum/reagent/medicine/panacea,
)
reagents.add_reagent(extra_reagent, 3)
diff --git a/code/game/objects/items/food/meatslab.dm b/code/game/objects/items/food/meatslab.dm
index 3947456a987..f4edc995bdb 100644
--- a/code/game/objects/items/food/meatslab.dm
+++ b/code/game/objects/items/food/meatslab.dm
@@ -862,7 +862,7 @@
bite_consumption = 1
food_reagents = list(
/datum/reagent/consumable/nutriment = 1,
- /datum/reagent/medicine/regen_jelly = 1,
+ /datum/reagent/medicine/panacea/effluvial = 1,
)
tastes = list("jelly" = 1, "sweet meat" = 1, "oil" = 1)
foodtypes = MEAT
diff --git a/code/game/objects/items/food/pastry.dm b/code/game/objects/items/food/pastry.dm
index 1e56a1de310..fa0ff82e86e 100644
--- a/code/game/objects/items/food/pastry.dm
+++ b/code/game/objects/items/food/pastry.dm
@@ -188,13 +188,11 @@
name = "exceptional plump helmet biscuit"
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump helmet biscuit!"
food_reagents = list(
- /datum/reagent/medicine/omnizine = 5,
+ /datum/reagent/medicine/panacea = 5,
/datum/reagent/consumable/nutriment = 1,
/datum/reagent/consumable/nutriment/vitamin = 1,
)
. = ..()
- if(fey)
- reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
/obj/item/food/cracker
name = "cracker"
diff --git a/code/game/objects/items/food/pie.dm b/code/game/objects/items/food/pie.dm
index 77c7ff22f0a..f43cd337824 100644
--- a/code/game/objects/items/food/pie.dm
+++ b/code/game/objects/items/food/pie.dm
@@ -201,7 +201,7 @@
desc = "Microwave is taken by a fey mood! It has cooked an exceptional plump pie!"
food_reagents = list(
/datum/reagent/consumable/nutriment = 11,
- /datum/reagent/medicine/omnizine = 5,
+ /datum/reagent/medicine/panacea = 5,
/datum/reagent/consumable/nutriment/vitamin = 4,
)
. = ..()
diff --git a/code/game/objects/items/food/pizza.dm b/code/game/objects/items/food/pizza.dm
index 58d846c331b..3d163bf7a20 100644
--- a/code/game/objects/items/food/pizza.dm
+++ b/code/game/objects/items/food/pizza.dm
@@ -136,7 +136,7 @@
/datum/reagent/consumable/nutriment = 20,
/datum/reagent/consumable/nutriment/protein = 15,
/datum/reagent/consumable/tomatojuice = 6,
- /datum/reagent/medicine/omnizine = 10,
+ /datum/reagent/medicine/panacea/effluvial = 10,
/datum/reagent/consumable/nutriment/vitamin = 5,
)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "meat" = 1, "laziness" = 1)
diff --git a/code/game/objects/items/food/salad.dm b/code/game/objects/items/food/salad.dm
index 2af6ed6ec41..3bdded37c15 100644
--- a/code/game/objects/items/food/salad.dm
+++ b/code/game/objects/items/food/salad.dm
@@ -19,7 +19,7 @@
icon_state = "aesirsalad"
food_reagents = list(
/datum/reagent/consumable/nutriment = 8,
- /datum/reagent/medicine/omnizine = 10,
+ /datum/reagent/medicine/panacea = 10,
/datum/reagent/consumable/nutriment/vitamin = 12
)
tastes = list("leaves" = 1)
diff --git a/code/game/objects/items/food/soup.dm b/code/game/objects/items/food/soup.dm
index d93e6ff6e43..fe04a95a3ee 100644
--- a/code/game/objects/items/food/soup.dm
+++ b/code/game/objects/items/food/soup.dm
@@ -103,7 +103,7 @@
/datum/reagent/consumable/nutriment/protein = 2,
/datum/reagent/water = 5,
/datum/reagent/consumable/nutriment/vitamin = 9,
- /datum/reagent/medicine/omnizine = 5
+ /datum/reagent/medicine/neoxanthin = 5
)
tastes = list("nettles" = 1)
foodtypes = VEGETABLES
@@ -128,7 +128,7 @@
/datum/reagent/consumable/capsaicin,
/datum/reagent/consumable/frostoil,
/datum/reagent/medicine/oculine,
- /datum/reagent/medicine/omnizine,
+ /datum/reagent/medicine/panacea,
/datum/reagent/toxin,
/datum/reagent/toxin/slimejelly,
)
diff --git a/code/game/objects/items/food/sweets.dm b/code/game/objects/items/food/sweets.dm
index f3ec680a419..9ab28804f6d 100644
--- a/code/game/objects/items/food/sweets.dm
+++ b/code/game/objects/items/food/sweets.dm
@@ -124,7 +124,7 @@
/datum/reagent/toxin = 1,
/datum/reagent/iron = 10,
/datum/reagent/consumable/sugar = 5,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea = 2,
) //lollipop, but vitamins = toxins
tastes = list("cobwebs" = 1, "sugar" = 2)
foodtypes = JUNKFOOD | SUGAR //| BUGS
diff --git a/code/game/objects/items/hot_potato.dm b/code/game/objects/items/hot_potato.dm
deleted file mode 100644
index f1957f7132b..00000000000
--- a/code/game/objects/items/hot_potato.dm
+++ /dev/null
@@ -1,175 +0,0 @@
-//CREATOR'S NOTE: DO NOT FUCKING GIVE THIS TO BOTANY!
-/obj/item/hot_potato
- name = "hot potato"
- desc = "A label on the side of this potato reads \"Product of DonkCo Service Wing. Activate far away from populated areas. Device will only attach to sapient creatures.\" You can attack anyone with it to force it on them instead of yourself!"
- icon = 'icons/obj/hydroponics/harvest.dmi'
- icon_state = "potato"
- item_flags = NOBLUDGEON
- force = 0
- var/icon_off = "potato"
- var/icon_on = "potato_active"
- var/detonation_timerid
- var/activation_time = 0
- var/timer = 600 //deciseconds
- var/show_timer = FALSE
- var/reusable = FALSE //absolute madman
- var/sticky = TRUE
- var/forceful_attachment = TRUE
- var/stimulant = TRUE
- var/detonate_explosion = TRUE
- var/detonate_dev_range = 0
- var/detonate_heavy_range = 0
- var/detonate_light_range = 2
- var/detonate_flash_range = 5
- var/detonate_fire_range = 5
-
- var/active = FALSE
-
- var/color_val = FALSE
-
- var/datum/weakref/current
-
-/obj/item/hot_potato/Destroy()
- if(active)
- deactivate()
- return ..()
-
-/obj/item/hot_potato/proc/colorize(mob/target)
- //Clear color from old target
- if(current)
- var/mob/M = current.resolve()
- if(istype(M))
- M.remove_atom_colour(FIXED_COLOUR_PRIORITY)
- //Give to new target
- current = null
- //Swap colors
- color_val = !color_val
- if(istype(target))
- current = WEAKREF(target)
- target.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY)
-
-/obj/item/hot_potato/proc/detonate()
- var/atom/location = loc
- location.visible_message(span_userdanger("[src] [detonate_explosion? "explodes" : "activates"]!"), span_userdanger("[src] activates! You've ran out of time!"))
- if(detonate_explosion)
- explosion(src, detonate_dev_range, detonate_heavy_range, detonate_light_range, detonate_flash_range, flame_range = detonate_fire_range)
- deactivate()
- if(!reusable)
- var/mob/M = loc
- if(istype(M))
- M.dropItemToGround(src, TRUE)
- qdel(src)
-
-/obj/item/hot_potato/attack_self(mob/user)
- if(activate(timer, user))
- user.visible_message(span_boldwarning("[user] squeezes [src], which promptly starts to flash red-hot colors!"), span_boldwarning("You squeeze [src], activating its countdown and attachment mechanism!"),
- span_boldwarning("You hear a mechanical click and a loud beeping!"))
- return
- return ..()
-
-/obj/item/hot_potato/process(seconds_per_tick)
- if(stimulant)
- if(isliving(loc))
- var/mob/living/L = loc
- L.SetStun(0)
- L.SetKnockdown(0)
- L.set_sleeping(0)
- L.SetImmobilized(0)
- L.SetParalyzed(0)
- L.SetUnconscious(0)
- L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, clamp(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck!
- colorize(L)
-
-/obj/item/hot_potato/examine(mob/user)
- . = ..()
- if(active)
- . += span_warning("[src] is flashing red-hot! You should probably get rid of it!")
- if(show_timer)
- . += span_warning("[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!")
-
-/obj/item/hot_potato/equipped(mob/user)
- . = ..()
- if(active)
- to_chat(user, span_userdanger("You have a really bad feeling about [src]!"))
-
-/obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params)
- . = ..()
- if(!adjacent || !ismob(target))
- return
- force_onto(target, user)
-
-/obj/item/hot_potato/proc/force_onto(mob/living/victim, mob/user)
- if(!istype(victim) || user != loc || victim == user)
- return FALSE
- if(!victim.client)
- to_chat(user, span_boldwarning("[src] refuses to attach to a non-sapient creature!"))
- if(victim.stat != CONSCIOUS || !victim.usable_legs)
- to_chat(user, span_boldwarning("[src] refuses to attach to someone incapable of using it!"))
- user.temporarilyRemoveItemFromInventory(src, TRUE)
- . = FALSE
- if(!victim.put_in_hands(src))
- if(forceful_attachment)
- victim.dropItemToGround(victim.get_inactive_held_item())
- if(!victim.put_in_hands(src))
- victim.dropItemToGround(victim.get_active_held_item())
- if(victim.put_in_hands(src))
- . = TRUE
- else
- . = TRUE
- else
- . = TRUE
- if(.)
- log_combat(user, victim, "forced a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
- user.visible_message(span_userdanger("[user] forces [src] onto [victim]!"), span_userdanger("You force [src] onto [victim]!"), span_boldwarning("You hear a mechanical click and a beep."))
- colorize(null)
- else
- log_combat(user, victim, "tried to force a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
- user.visible_message(span_boldwarning("[user] tried to force [src] onto [victim], but it could not attach!"), span_boldwarning("You try to force [src] onto [victim], but it is unable to attach!"), span_boldwarning("You hear a mechanical click and two buzzes."))
- user.put_in_hands(src)
-
-/obj/item/hot_potato/dropped(mob/user)
- . = ..()
- colorize(null)
-
-/obj/item/hot_potato/proc/activate(delay, mob/user)
- if(active)
- return
- update_appearance()
- if(sticky)
- ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
- name = "primed [name]"
- activation_time = timer + world.time
- detonation_timerid = addtimer(CALLBACK(src, PROC_REF(detonate)), delay, TIMER_STOPPABLE)
- START_PROCESSING(SSfastprocess, src)
- if(user)
- log_bomber(user, "has primed a", src, "for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])")
- else
- log_bomber(null, null, src, "was primed for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])")
- active = TRUE
-
-/obj/item/hot_potato/proc/deactivate()
- update_appearance()
- name = initial(name)
- REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
- deltimer(detonation_timerid)
- STOP_PROCESSING(SSfastprocess, src)
- detonation_timerid = null
- colorize(null)
- active = FALSE
-
-/obj/item/hot_potato/update_icon_state()
- icon_state = active ? icon_on : icon_off
- return ..()
-
-/obj/item/hot_potato/syndicate
- detonate_light_range = 4
- detonate_fire_range = 5
-
-/obj/item/hot_potato/harmless
- detonate_explosion = FALSE
-
-/obj/item/hot_potato/harmless/toy
- desc = "A label on the side of this potato reads \"Product of DonkCo Toys and Recreation department.\" You can attack anyone with it to put it on them instead, if they have a free hand to take it!"
- sticky = FALSE
- reusable = TRUE
- forceful_attachment = FALSE
diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm
index 684289c0f12..4aa1e369922 100644
--- a/code/game/objects/items/implants/implant_misc.dm
+++ b/code/game/objects/items/implants/implant_misc.dm
@@ -37,7 +37,7 @@
imp_in.set_resting(FALSE)
imp_in.reagents.add_reagent(/datum/reagent/medicine/synaptizine, 10)
- imp_in.reagents.add_reagent(/datum/reagent/medicine/omnizine, 10)
+ imp_in.reagents.add_reagent(/datum/reagent/medicine/panacea, 10)
imp_in.reagents.add_reagent(/datum/reagent/medicine/stimulants, 10)
if(!uses)
qdel(src)
diff --git a/code/game/objects/items/melee/sword.dm b/code/game/objects/items/melee/sword.dm
index f0e7a90025b..094b288daa1 100644
--- a/code/game/objects/items/melee/sword.dm
+++ b/code/game/objects/items/melee/sword.dm
@@ -337,9 +337,8 @@
/datum/reagent/drug/mammoth = 5,
/datum/reagent/drug/aranesp = 5,
/datum/reagent/drug/pumpup = 10,
- /datum/reagent/medicine/omnizine = 10,
+ /datum/reagent/medicine/panacea = 10,
/datum/reagent/medicine/earthsblood = 15,
- /datum/reagent/medicine/omnizine/protozine = 15
)
/obj/item/melee/sword/greyking/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm
index b01eddb2580..f4186d3c1fd 100644
--- a/code/game/objects/items/robot/robot_upgrades.dm
+++ b/code/game/objects/items/robot/robot_upgrades.dm
@@ -402,7 +402,7 @@
desc = "An upgrade to the Medical module's hypospray, allowing it \
to treat a wider range of conditions and problems."
additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate,
- /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, /datum/reagent/medicine/rezadone,
+ /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/ysiltane, /datum/reagent/medicine/silfrine, /datum/reagent/medicine/rezadone,
/datum/reagent/medicine/pen_acid)
/obj/item/borg/upgrade/piercing_hypospray
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 9f6a7c1dfb4..4f552bb5b68 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -138,7 +138,7 @@
self_delay = 2 SECONDS
other_delay = 1.5 SECONDS
heal_brute = 10
- grind_results = list(/datum/reagent/medicine/c2/libital = 10)
+ grind_results = list(/datum/reagent/medicine/indomide = 10)
merge_type = /obj/item/stack/medical/bruise_pack
/obj/item/stack/medical/gauze
diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm
index 7058b2ec8f0..e836a6aa711 100644
--- a/code/game/objects/items/storage/backpack.dm
+++ b/code/game/objects/items/storage/backpack.dm
@@ -661,7 +661,7 @@
new /obj/item/ammo_box/magazine/m9mm_rattlesnake(src)
new /obj/item/ammo_box/magazine/m9mm_rattlesnake(src)
new /obj/item/reagent_containers/food/drinks/bottle/vodka/badminka(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
+ new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src)
new /obj/item/grenade/syndieminibomb(src)
/obj/item/storage/backpack/henchmen
diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm
index 9245c8109ce..b61e446a210 100644
--- a/code/game/objects/items/storage/belt.dm
+++ b/code/game/objects/items/storage/belt.dm
@@ -271,10 +271,10 @@
/obj/item/storage/belt/medical/webbing/combat/PopulateContents()
. = ..()
- new /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
- new /obj/item/reagent_containers/medigel/styptic(src)
+ new /obj/item/reagent_containers/hypospray/medipen/stimpack(src)
+ new /obj/item/reagent_containers/hypospray/medipen/stimpack(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
new /obj/item/stack/medical/gauze/twelve(src)
new /obj/item/stack/medical/splint(src)
diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm
index be1fd38f9d7..3c6987ba071 100644
--- a/code/game/objects/items/storage/boxes.dm
+++ b/code/game/objects/items/storage/boxes.dm
@@ -260,9 +260,9 @@
/obj/item/storage/box/hypospray/PopulateContents()
new /obj/item/hypospray/mkii(src)
- new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine(src)
- new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin(src)
- new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane(src)
new /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin(src)
/obj/item/storage/box/hypospray/mkiii
@@ -270,10 +270,10 @@
/obj/item/storage/box/hypospray/mkiii/PopulateContents()
new /obj/item/hypospray/mkii/mkiii(src)
- new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine(src)
- new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin(src)
- new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane(src)
- new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/silfrine(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/gjalrazine(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/ysiltane(src)
+ new /obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salbutamol(src)
/obj/item/storage/box/medigels
name = "box of medical gels"
@@ -1177,14 +1177,14 @@
new /obj/item/circuitboard/machine/circuit_imprinter/department/science(src)
new /obj/item/circuitboard/computer/rdconsole(src)
-/obj/item/storage/box/silver_sulf
- name = "box of silver sulfadiazine patches"
+/obj/item/storage/box/alvitane
+ name = "box of alvitane patches"
desc = "Contains patches used to treat burns."
illustration = "firepatch"
-/obj/item/storage/box/silver_sulf/PopulateContents()
+/obj/item/storage/box/alvitane/PopulateContents()
for(var/i in 1 to 7)
- new /obj/item/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/pill/patch/alvitane(src)
/obj/item/storage/box/fountainpens
name = "box of fountain pens"
diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm
index 0559b48445d..92cf5e0238d 100644
--- a/code/game/objects/items/storage/fancy.dm
+++ b/code/game/objects/items/storage/fancy.dm
@@ -329,13 +329,6 @@
if(prob(7))
spawn_type = /obj/item/clothing/mask/cigarette/candy/nicotine //uh oh!
-/obj/item/storage/fancy/cigarettes/cigpack_xeno
- name = "\improper Xeno Filtered packet"
- desc = "Loaded with 100% pure slime. And also nicotine."
- icon_state = "slime"
- base_icon_state = "slime"
- spawn_type = /obj/item/clothing/mask/cigarette/xeno
-
/obj/item/storage/fancy/cigarettes/cigpack_cannabis
name = "\improper Freak Brothers' Special packet"
desc = "A label on the packaging reads, \"Endorsed by Phineas, Freddy and Franklin.\""
diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm
index 2aff38194bf..0021ae837f4 100644
--- a/code/game/objects/items/storage/firstaid.dm
+++ b/code/game/objects/items/storage/firstaid.dm
@@ -155,8 +155,8 @@
/obj/item/stack/medical/ointment = 2,
/obj/item/stack/medical/mesh = 1,
/obj/item/stack/medical/gauze = 1,
- /obj/item/reagent_containers/pill/patch/silver_sulf = 1,
- /obj/item/reagent_containers/hypospray/medipen/oxandrolone = 1,
+ /obj/item/reagent_containers/pill/patch/alvitane = 1,
+ /obj/item/reagent_containers/hypospray/medipen/ysiltane = 1,
/obj/item/reagent_containers/hypospray/medipen = 1,
/obj/item/reagent_containers/hypospray/medipen/ekit = 1,
)
@@ -175,9 +175,9 @@
return
var/static/items_inside = list(
/obj/item/storage/pill_bottle/charcoal/less = 1,
- /obj/item/reagent_containers/syringe/thializid = 3,
+ /obj/item/reagent_containers/syringe/pancrazine = 3,
/obj/item/storage/pill_bottle/potassiodide = 1,
- /obj/item/reagent_containers/hypospray/medipen/penacid = 1,
+ /obj/item/reagent_containers/hypospray/medipen/gjalrazine = 1,
)
generate_items_inside(items_inside,src)
@@ -211,7 +211,7 @@
if(empty)
return
var/static/items_inside = list(
- /obj/item/reagent_containers/syringe/perfluorodecalin = 3,
+ /obj/item/reagent_containers/syringe/dexalin = 3,
/obj/item/reagent_containers/hypospray/medipen/salbutamol = 1,
/obj/item/reagent_containers/hypospray/medipen = 1,
/obj/item/storage/pill_bottle/iron = 1,
@@ -231,13 +231,13 @@
if(empty)
return
var/static/items_inside = list(
- /obj/item/reagent_containers/pill/patch/styptic = 1,
- /obj/item/storage/pill_bottle/trophazole = 1,
+ /obj/item/reagent_containers/medigel/hadrakine = 1,
+ /obj/item/storage/pill_bottle/indomide = 1,
/obj/item/stack/medical/bone_gel = 1,
/obj/item/stack/sticky_tape/surgical = 1,
/obj/item/stack/medical/gauze = 1,
/obj/item/stack/medical/splint = 1,
- /obj/item/reagent_containers/hypospray/medipen/salacid = 1,
+ /obj/item/reagent_containers/hypospray/medipen/silfrine = 1,
/obj/item/reagent_containers/hypospray/medipen/ekit = 1,
)
generate_items_inside(items_inside,src)
@@ -287,10 +287,10 @@
new /obj/item/stack/medical/gauze(src)
new /obj/item/defibrillator/compact/combat/loaded(src)
new /obj/item/reagent_containers/hypospray/combat(src)
- new /obj/item/reagent_containers/pill/patch/styptic(src)
- new /obj/item/reagent_containers/pill/patch/styptic(src)
- new /obj/item/reagent_containers/pill/patch/silver_sulf(src)
- new /obj/item/reagent_containers/pill/patch/silver_sulf(src)
+ new /obj/item/reagent_containers/hypospray/medipen/ysiltane(src)
+ new /obj/item/reagent_containers/hypospray/medipen/ysiltane(src)
+ new /obj/item/reagent_containers/hypospray/medipen/silfrine(src)
+ new /obj/item/reagent_containers/hypospray/medipen/silfrine(src)
new /obj/item/clothing/glasses/hud/health/night(src)
//medibot assembly
@@ -406,15 +406,6 @@
for(var/i in 1 to 5)
new /obj/item/reagent_containers/pill/stimulant(src)
-/obj/item/storage/pill_bottle/mining
- name = "bottle of patches"
- desc = "Contains patches used to treat brute and burn damage."
-
-/obj/item/storage/pill_bottle/mining/PopulateContents()
- new /obj/item/reagent_containers/pill/patch/silver_sulf(src)
- for(var/i in 1 to 3)
- new /obj/item/reagent_containers/pill/patch/styptic(src)
-
/obj/item/storage/pill_bottle/zoom
name = "suspicious pill bottle"
desc = "The label is pretty old and almost unreadable, you recognize some chemical compounds."
@@ -489,13 +480,13 @@
for(var/i in 1 to 7)
new /obj/item/reagent_containers/pill/floorpill(src)
-/obj/item/storage/pill_bottle/trophazole
- name = "bottle of trophazole pills"
+/obj/item/storage/pill_bottle/indomide
+ name = "bottle of indomide pills"
desc = "Contains pills used to treat brute damage.The tag in the bottle states 'Eat before ingesting'."
-/obj/item/storage/pill_bottle/trophazole/PopulateContents()
+/obj/item/storage/pill_bottle/indomide/PopulateContents()
for(var/i in 1 to 4)
- new /obj/item/reagent_containers/pill/trophazole(src)
+ new /obj/item/reagent_containers/pill/indomide(src)
/obj/item/storage/pill_bottle/licarb
name = "bottle of lithium carbonate pills"
@@ -515,7 +506,7 @@
new /obj/item/reagent_containers/pill/finobranc(src)
/obj/item/storage/pill_bottle/stardrop
- name = "bottle of stardrop capsules"
+ name = "bottle of stardrop patches"
desc = "Contains vision-enhancing patches."
custom_price = 300
@@ -524,7 +515,7 @@
new /obj/item/reagent_containers/pill/patch/stardrop(src)
/obj/item/storage/pill_bottle/starlight
- name = "bottle of starlight capsules"
+ name = "bottle of starlight patches"
desc = "Contains vision-enhancing patches."
/obj/item/storage/pill_bottle/starlight/PopulateContents()
diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm
index c8739f010d7..8b025e07cc9 100644
--- a/code/game/objects/items/storage/uplink_kits.dm
+++ b/code/game/objects/items/storage/uplink_kits.dm
@@ -119,7 +119,7 @@
new /obj/item/ammo_box/magazine/m10mm_ringneck(src)
new /obj/item/clothing/under/chameleon(src)
new /obj/item/card/id/syndicate(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
+ new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src)
new /obj/item/reagent_containers/glass/rag(src)
if("ninja")
@@ -369,7 +369,6 @@
/obj/item/storage/box/syndie_kit/chemical/PopulateContents()
new /obj/item/reagent_containers/glass/bottle/polonium(src)
new /obj/item/reagent_containers/glass/bottle/venom(src)
- new /obj/item/reagent_containers/glass/bottle/fentanyl(src)
new /obj/item/reagent_containers/glass/bottle/formaldehyde(src)
new /obj/item/reagent_containers/glass/bottle/spewium(src)
new /obj/item/reagent_containers/glass/bottle/cyanide(src)
diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm
index 3f2920c570e..98beb900d3e 100644
--- a/code/game/objects/structures/divine.dm
+++ b/code/game/objects/structures/divine.dm
@@ -39,7 +39,7 @@
return
last_process = world.time
to_chat(user, span_notice("The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards."))
- user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20)
+ user.reagents.add_reagent(/datum/reagent/medicine/panacea,20)
update_appearance()
addtimer(CALLBACK(src, TYPE_PROC_REF(/atom, update_appearance)), time_between_uses)
diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm
index 97cecda745f..e4c82fb29d7 100644
--- a/code/game/objects/structures/flora.dm
+++ b/code/game/objects/structures/flora.dm
@@ -835,7 +835,6 @@
/datum/reagent/toxin/acid/fluacid = -0.4,
/datum/reagent/toxin/plantbgone = -0.5,
/datum/reagent/napalm = -0.6,
- /datum/reagent/hellwater = -1,
/datum/reagent/liquidgibs = -0.2,
/datum/reagent/consumable/ethanol/demonsblood = -0.8,
/datum/reagent/medicine/soulus = -0.2
@@ -959,7 +958,7 @@
var/luck = rand(1, 100)
if(karma > 100)
if(luck > 90)
- L.reagents.add_reagent(/datum/reagent/medicine/omnizine, 5)
+ L.reagents.add_reagent(/datum/reagent/medicine/panacea, 5)
else if (luck > 50)
SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "treekarma", /datum/mood_event/better_tree, name)
else if (luck > 25)
@@ -1032,7 +1031,6 @@
/datum/reagent/toxin/acid/fluacid = -0.4,
/datum/reagent/toxin/plantbgone = -0.5,
/datum/reagent/napalm = -0.6,
- /datum/reagent/hellwater = -1,
/datum/reagent/liquidgibs = -0.2,
/datum/reagent/consumable/ethanol/demonsblood = -0.8,
/datum/reagent/medicine/soulus = -0.2
diff --git a/code/game/objects/structures/geyser.dm b/code/game/objects/structures/geyser.dm
index 58b117daeb3..27ae00f8f50 100644
--- a/code/game/objects/structures/geyser.dm
+++ b/code/game/objects/structures/geyser.dm
@@ -48,7 +48,7 @@
/datum/reagent/uranium/radium = 10,
/datum/reagent/ammonia = 6,
/datum/reagent/saltpetre = 6,
- /datum/reagent/medicine/omnizine/protozine = 3,
+ /datum/reagent/medicine/panacea/effluvial = 3,
/datum/reagent/wittel = 1
)
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 0ded860cdd5..8e4cf6eaf22 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -189,7 +189,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an
for(var/mob/living/M in compiled)
var/mob/living/mob_occupant = get_mob_or_brainmob(M)
- if(mob_occupant.client && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)) && !mob_occupant.hellbound)
+ if(mob_occupant.client && !(HAS_TRAIT(mob_occupant, TRAIT_BADDNA)))
icon_state = "morgue4" // Revivable
if(mob_occupant.stat == DEAD && beeper && COOLDOWN_FINISHED(src, next_beep))
playsound(src, 'sound/weapons/gun/general/empty_alarm.ogg', 50, FALSE) //Revive them you blind fucks
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 185133d5773..2a8dc9df31b 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -797,10 +797,6 @@ Congratulations! You are now trained for invasive xenobiology research!"}
to_chat(user, span_warning("You need one sheet of silver to do this!"))
return
to_chat(user, span_notice("You start adding [P] to [src]..."))
- if(do_after(user, 50, target = src))
- P.use(1)
- new /obj/structure/table/optable/abductor(src.loc)
- qdel(src)
/obj/structure/table/abductor
name = "alien table"
@@ -816,47 +812,6 @@ Congratulations! You are now trained for invasive xenobiology research!"}
canSmoothWith = list(SMOOTH_GROUP_ABDUCTOR_TABLES)
frame = /obj/structure/table_frame/abductor
-/obj/structure/table/optable/abductor
- name = "alien operating table"
- desc = "Used for alien medical procedures. The surface is covered in tiny spines."
- frame = /obj/structure/table_frame/abductor
- buildstack = /obj/item/stack/sheet/mineral/silver
- framestack = /obj/item/stack/sheet/mineral/abductor
- buildstackamount = 1
- framestackamount = 1
- icon = 'icons/obj/abductor.dmi'
- icon_state = "bed"
- can_buckle = 1
- /// Amount to inject per second
- var/inject_am = 0.5
-
- var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico)
-
-/obj/structure/table/optable/abductor/Initialize()
- . = ..()
- var/static/list/loc_connections = list(
- COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
- )
- AddElement(/datum/element/connect_loc, loc_connections)
-
-/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM)
- SIGNAL_HANDLER
- if(iscarbon(AM))
- START_PROCESSING(SSobj, src)
- to_chat(AM, span_danger("You feel a series of tiny pricks!"))
-
-/obj/structure/table/optable/abductor/process(seconds_per_tick)
- . = PROCESS_KILL
- for(var/mob/living/carbon/C in get_turf(src))
- . = TRUE
- for(var/chemical in injected_reagents)
- if(C.reagents.get_reagent_amount(chemical) < inject_am * seconds_per_tick)
- C.reagents.add_reagent(chemical, inject_am * seconds_per_tick)
-
-/obj/structure/table/optable/abductor/Destroy()
- STOP_PROCESSING(SSobj, src)
- . = ..()
-
/obj/structure/closet/abductor
name = "alien locker"
desc = "Contains secrets of the universe."
diff --git a/code/modules/antagonists/borer/borer_chems.dm b/code/modules/antagonists/borer/borer_chems.dm
index dc869b88c63..2b94b9e495b 100644
--- a/code/modules/antagonists/borer/borer_chems.dm
+++ b/code/modules/antagonists/borer/borer_chems.dm
@@ -29,9 +29,9 @@
chemname = "mannitol"
chem_desc = "Heals any brain damage the host may have."
-/datum/borer_chem/omnizine
- chem = /datum/reagent/medicine/omnizine
- chemname = "omnizine"
+/datum/borer_chem/panacea
+ chem = /datum/reagent/medicine/panacea
+ chemname = "panacea"
chem_desc = "Slowly heals all damage types in the host. Overdose will cause damage in all types instead."
quantity = 5
diff --git a/code/modules/awaymissions/mission_code/Academy.dm b/code/modules/awaymissions/mission_code/Academy.dm
index 66397bc4e31..b19c8a81752 100644
--- a/code/modules/awaymissions/mission_code/Academy.dm
+++ b/code/modules/awaymissions/mission_code/Academy.dm
@@ -83,203 +83,6 @@
icon_state = "forge_off"
STOP_PROCESSING(SSobj, src)
-/obj/item/dice/d20/fate
- name = "\improper Die of Fate"
- desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky."
- icon_state = "d20"
- sides = 20
- microwave_riggable = FALSE
- var/reusable = TRUE
- var/used = FALSE
-
-/obj/item/dice/d20/fate/one_use
- reusable = FALSE
-
-/obj/item/dice/d20/fate/cursed
- name = "cursed Die of Fate"
- desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea."
- color = "#00BB00"
-
- rigged = DICE_TOTALLY_RIGGED
- rigged_value = 1
-
-/obj/item/dice/d20/fate/cursed/one_use
- reusable = FALSE
-
-/obj/item/dice/d20/fate/stealth
- name = "d20"
- desc = "A die with twenty sides. The preferred die to throw at the GM."
-
-/obj/item/dice/d20/fate/stealth/one_use
- reusable = FALSE
-
-/obj/item/dice/d20/fate/stealth/cursed
- rigged = DICE_TOTALLY_RIGGED
- rigged_value = 1
-
-/obj/item/dice/d20/fate/stealth/cursed/one_use
- reusable = FALSE
-
-/obj/item/dice/d20/fate/diceroll(mob/user)
- . = ..()
- if(!used)
- if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
- to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans!"))
- return
-
- if(!reusable)
- used = TRUE
-
- var/turf/T = get_turf(src)
- T.visible_message(span_userdanger("[src] flares briefly."))
-
- addtimer(CALLBACK(src, PROC_REF(effect), user, .), 1 SECONDS)
-
-/obj/item/dice/d20/fate/equipped(mob/user, slot)
- . = ..()
- if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
- to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans! You should leave it alone."))
- user.dropItemToGround(src)
-
-
-/obj/item/dice/d20/fate/proc/effect(mob/living/carbon/human/user,roll)
- var/turf/T = get_turf(src)
- switch(roll)
- if(1)
- //Dust
- T.visible_message(span_userdanger("[user] turns to dust!"))
- user.hellbound = TRUE
- user.dust()
- if(2)
- //Death
- T.visible_message(span_userdanger("[user] suddenly dies!"))
- user.death()
- if(3)
- //Swarm of creatures
- T.visible_message(span_userdanger("A swarm of creatures surround [user]!"))
- for(var/direction in GLOB.alldirs)
- new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction))
- if(4)
- //Destroy Equipment
- T.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!"))
- for(var/obj/item/I in user)
- if(istype(I, /obj/item/implant))
- continue
- qdel(I)
- if(5)
- //Monkeying
- T.visible_message(span_userdanger("[user] transforms into a monkey!"))
- user.monkeyize()
- if(6)
- //Cut speed
- T.visible_message(span_userdanger("[user] starts moving slower!"))
- user.add_movespeed_modifier(/datum/movespeed_modifier/die_of_fate)
- if(7)
- //Throw
- T.visible_message(span_userdanger("Unseen forces throw [user]!"))
- user.Stun(60)
- user.adjustBruteLoss(50)
- var/throw_dir = pick(GLOB.cardinals)
- var/atom/throw_target = get_edge_target_turf(user, throw_dir)
- user.throw_at(throw_target, 200, 4)
- if(8)
- //Fueltank Explosion
- T.visible_message(span_userdanger("An explosion bursts into existence around [user]!"))
- explosion(get_turf(user),-1,0,2, flame_range = 2)
- if(9)
- //Cold
- var/datum/disease/D = new /datum/disease/cold()
- T.visible_message(span_userdanger("[user] looks a little under the weather!"))
- user.ForceContractDisease(D, FALSE, TRUE)
- if(10)
- //Nothing
- T.visible_message(span_userdanger("Nothing seems to happen."))
- if(11)
- //Cookie
- T.visible_message(span_userdanger("A cookie appears out of thin air!"))
- var/obj/item/food/cookie/C = new(drop_location())
- do_smoke(0, drop_location())
- C.name = "Cookie of Fate"
- if(12)
- //Healing
- T.visible_message(span_userdanger("[user] looks very healthy!"))
- user.revive(full_heal = TRUE, admin_revive = TRUE)
- if(13)
- //Mad Dosh
- T.visible_message(span_userdanger("Mad dosh shoots out of [src]!"))
- var/turf/Start = get_turf(src)
- for(var/direction in GLOB.alldirs)
- var/turf/dirturf = get_step(Start,direction)
- if(rand(0,1))
- new /obj/item/spacecash/bundle/c1000(dirturf)
- else
- var/obj/item/storage/bag/money/M = new(dirturf)
- for(var/i in 1 to rand(5,50))
- new /obj/item/coin/gold(M)
- if(14)
- //Free Gun
- T.visible_message(span_userdanger("An impressive gun appears!"))
- do_smoke(0, drop_location())
- new /obj/item/gun/ballistic/revolver/mateba(drop_location())
- if(15)
- //Random One-use spellbook
- T.visible_message(span_userdanger("A magical looking book drops to the floor!"))
- do_smoke(0, drop_location())
- new /obj/item/book/granter/spell/random(drop_location())
- if(16)
- //Servant & Servant Summon
- T.visible_message(span_userdanger("A Dice Servant appears in a cloud of smoke!"))
- var/mob/living/carbon/human/H = new(drop_location())
- do_smoke(0, drop_location())
-
- H.equipOutfit(/datum/outfit/butler)
- var/datum/mind/servant_mind = new /datum/mind()
- var/datum/antagonist/magic_servant/A = new
- servant_mind.add_antag_datum(A)
- A.setup_master(user)
- servant_mind.transfer_to(H)
-
- var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H)
- if(LAZYLEN(candidates))
- var/mob/dead/observer/C = pick(candidates)
- message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
- H.key = C.key
-
- var/obj/effect/proc_holder/spell/targeted/summonmob/S = new
- S.target_mob = H
- user.mind.AddSpell(S)
-
- if(17)
- //Tator Kit
- T.visible_message(span_userdanger("A suspicious box appears!"))
- new /obj/item/storage/box/syndicate/bundle_A(drop_location())
- do_smoke(0, drop_location())
- if(18)
- //Captain ID
- T.visible_message(span_userdanger("A golden identification card appears!"))
- new /obj/item/card/id/captains_spare(drop_location())
- do_smoke(0, drop_location())
- if(19)
- //Instrinct Resistance
- T.visible_message(span_userdanger("[user] looks very robust!"))
- user.physiology.brute_mod *= 0.5
- user.physiology.burn_mod *= 0.5
-
- if(20)
- //Free wizard! //NOT ANY MORE FUCKING CHRIST
- T.visible_message(span_userdanger("Magic arches out of [src] and into ground under [user]!"))
- new /obj/item/clothing/suit/wizrobe(drop_location())
- new /obj/item/clothing/head/wizard(drop_location())
- new /obj/item/clothing/gloves/combat/wizard(drop_location())
- new /obj/item/staff(drop_location())
- new /obj/structure/mirror/magic(drop_location())
-
-/datum/outfit/butler
- name = "Butler"
- uniform = /obj/item/clothing/under/suit/black_really
- shoes = /obj/item/clothing/shoes/laceup
- gloves = /obj/item/clothing/gloves/color/white
-
/obj/effect/proc_holder/spell/targeted/summonmob
name = "Summon Servant"
desc = "This spell can be used to call your servant, whenever you need it."
diff --git a/code/modules/cargo/blackmarket/packs/consumables.dm b/code/modules/cargo/blackmarket/packs/consumables.dm
index 1eeb2faf887..45a0296c56f 100644
--- a/code/modules/cargo/blackmarket/packs/consumables.dm
+++ b/code/modules/cargo/blackmarket/packs/consumables.dm
@@ -43,7 +43,7 @@
/datum/blackmarket_item/consumable/syndie_cigs
name = "Syndicate Cigarettes"
- desc = "Who said smoking was bad for you? These omnizine laced cigarettes will have you feeling like a million bucks!"
+ desc = "Who said smoking was bad for you? These Panacea laced cigarettes will have you feeling like a million bucks!"
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost_min = 50
@@ -77,7 +77,7 @@
/datum/blackmarket_item/consumable/stimpack
name = "Stimpack"
desc = "A quick inject medipen loaded with a cocktail of powerful stimulants. Side effects may include nasuea, heartburn, constipation, weight loss, increased blood pressure, kidney stones, liver damage, mood swings, mania, anemia, weight gain, total organ failure, runny nose and minor retinal irritation."
- item = /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor
+ item = /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis
stock_min = 4
stock_max = 6
@@ -294,6 +294,16 @@
availability_prob = 30
spawn_weighting = FALSE
+/datum/blackmarket_item/consumable/nesah
+ name = "Nesah Injector"
+ desc = "Other day some dude with black hair called us up and started talkin about some grand plan. Grand plan to sell merch, we assume, because he offloaded way too fuckin many of these injectors. Our chems guy said it's just a healing injector, so go fuckin wild. "
+ item = /obj/item/reagent_containers/hypospray/medipen/netzach
+ cost_min = 500
+ cost_max = 1000
+ stock_max = 12
+ availability_prob = 50
+ spawn_weighting = FALSE
+
/datum/blackmarket_item/consumable/finobranc
name = "Finobranc Tablets"
desc = "So get this, I know a Solarian Tgirl over the intranet, and we're chatting, and she sends me these things to try. I figure, hell yeah, try them, and got 5 days work done in one day. Now I'm sellin them. Miracle product I tell ya"
diff --git a/code/modules/cargo/packs/medical.dm b/code/modules/cargo/packs/medical.dm
index 937f0036d53..9906e6dd3df 100644
--- a/code/modules/cargo/packs/medical.dm
+++ b/code/modules/cargo/packs/medical.dm
@@ -166,7 +166,6 @@
/obj/item/storage/firstaid/fire,
/obj/item/defibrillator/loaded,
/obj/item/reagent_containers/blood/OMinus,
- /obj/item/storage/pill_bottle/mining,
/obj/item/reagent_containers/pill/neurine,
/obj/item/vending_refill/medical)
crate_name = "medical surplus crate"
@@ -226,32 +225,32 @@
/obj/item/reagent_containers/glass/bottle/vial/small)
crate_name = "empty vial crate"
-/datum/supply_pack/medical/vials/bica_vial
- name = "Bicaridine Vial Crate"
- desc = "Contains a spare bicaridine vial, for usage in a Hypospray."
+/datum/supply_pack/medical/vials/indo_vial
+ name = "Indomide Vial Crate"
+ desc = "Contains a spare indomide vial, for usage in a Hypospray."
cost = 400
contains = list(
- /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine,
+ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide,
)
- crate_name = "bicaridine vial crate"
+ crate_name = "indomide vial crate"
-/datum/supply_pack/medical/vials/kelo_vial
- name = "Kelotane Vial Crate"
- desc = "Contains a spare kelotane vial, for usage in a Hypospray."
+/datum/supply_pack/medical/vials/alvi_vial
+ name = "Alvitane Vial Crate"
+ desc = "Contains a spare alvitane vial, for usage in a Hypospray."
cost = 400
contains = list(
- /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane,
+ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane,
)
- crate_name = "kelotane vial crate"
+ crate_name = "alvitane vial crate"
/datum/supply_pack/medical/vials/dylo_vial
- name = "Dylovene Vial Crate"
+ name = "Pancrazine Vial Crate"
desc = "Contains a spare dylovene vial, for usage in a Hypospray."
cost = 400
contains = list(
- /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin,
+ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine,
)
- crate_name = "dylovene vial crate"
+ crate_name = "pancrazine vial crate"
/datum/supply_pack/medical/vials/dexa_vial
name = "Dexalin Vial Crate"
@@ -263,13 +262,13 @@
crate_name = "dexalin vial crate"
/datum/supply_pack/medical/vials/tric_vial
- name = "Tricordrazine Vial Crate"
- desc = "Contains a spare tricordrazine vial, for usage in a Hypospray."
+ name = "Cureall Vial Crate"
+ desc = "Contains a spare cureall vial, for usage in a Hypospray."
cost = 300
contains = list(
- /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord,
+ /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall,
)
- crate_name = "tricordrazine vial crate"
+ crate_name = "cureall vial crate"
/datum/supply_pack/medical/vials/morb_vial
name = "Morphine Vial Crate"
diff --git a/code/modules/clothing/factions/clip.dm b/code/modules/clothing/factions/clip.dm
index a1279f78fb0..b0317006acb 100644
--- a/code/modules/clothing/factions/clip.dm
+++ b/code/modules/clothing/factions/clip.dm
@@ -566,10 +566,10 @@
supports_variations = VOX_VARIATION
/obj/item/storage/belt/medical/webbing/clip/prefilled/PopulateContents()
- new /obj/item/reagent_containers/medigel/styptic(src)
- new /obj/item/reagent_containers/medigel/styptic(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
new /obj/item/reagent_containers/medigel/synthflesh(src)
new /obj/item/reagent_containers/medigel/synthflesh(src)
new /obj/item/stack/medical/splint(src)
diff --git a/code/modules/clothing/factions/frontiersmen.dm b/code/modules/clothing/factions/frontiersmen.dm
index 23f0c66fe41..5e0fc272b94 100644
--- a/code/modules/clothing/factions/frontiersmen.dm
+++ b/code/modules/clothing/factions/frontiersmen.dm
@@ -314,9 +314,9 @@
update_appearance()
/obj/item/storage/belt/medical/webbing/frontiersmen/combat/PopulateContents()
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
- new /obj/item/reagent_containers/hypospray/medipen/stimulants(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
- new /obj/item/reagent_containers/medigel/styptic(src)
+ new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src)
+ new /obj/item/reagent_containers/hypospray/medipen/combat_drug(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
new /obj/item/stack/medical/gauze/twelve(src)
new /obj/item/stack/medical/splint(src)
diff --git a/code/modules/clothing/factions/gezena.dm b/code/modules/clothing/factions/gezena.dm
index 47c484c25af..5e250bd3fed 100644
--- a/code/modules/clothing/factions/gezena.dm
+++ b/code/modules/clothing/factions/gezena.dm
@@ -272,10 +272,10 @@
item_state = "whitecloth"
/obj/item/storage/belt/medical/gezena/paramedic/PopulateContents()
- new /obj/item/reagent_containers/medigel/styptic(src)
- new /obj/item/reagent_containers/medigel/styptic(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
- new /obj/item/reagent_containers/medigel/silver_sulf(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
+ new /obj/item/reagent_containers/medigel/hadrakine(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
+ new /obj/item/reagent_containers/medigel/quardexane(src)
new /obj/item/reagent_containers/medigel/synthflesh(src)
new /obj/item/stack/medical/gauze/twelve(src)
new /obj/item/stack/medical/splint(src)
diff --git a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
index ad27bc6b4c0..161ef126091 100644
--- a/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
+++ b/code/modules/clothing/outfits/ert/frontiersmen_ert.dm
@@ -242,7 +242,7 @@
belt = /obj/item/storage/belt/medical/webbing/frontiersmen/combat
glasses = /obj/item/clothing/glasses/hud/health
- backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack/traitor = 3, /obj/item/ammo_box/magazine/m9mm_mauler/extended=2)
+ backpack_contents = list(/obj/item/clothing/mask/gas/frontiersmen, /obj/item/storage/firstaid/medical=1, /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis = 3, /obj/item/ammo_box/magazine/m9mm_mauler/extended=2)
/datum/outfit/job/frontiersmen/ert/engineer
name = "ERT - Frontiersman Engineer"
diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
index afa588b745e..1157a10499e 100644
--- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm
+++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm
@@ -185,10 +185,6 @@
list_reagents = list(/datum/reagent/water/holywater = 100)
foodtype = NONE
-/obj/item/reagent_containers/food/drinks/bottle/holywater/hell
- desc = "A flask of holy water...it's been sitting in the Necropolis a while though."
- list_reagents = list(/datum/reagent/hellwater = 100)
-
/obj/item/reagent_containers/food/drinks/bottle/vermouth
name = "Whitespear Dry Vermouth"
desc = "Dry and sweet vermouth, commonly used for mixed drinks. Some Solarians drink it as a digestive before meals."
diff --git a/code/modules/food_and_drinks/recipes/drinks_recipes.dm b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
index cbaf24e8c97..2066506e6c5 100644
--- a/code/modules/food_and_drinks/recipes/drinks_recipes.dm
+++ b/code/modules/food_and_drinks/recipes/drinks_recipes.dm
@@ -651,7 +651,7 @@
/datum/chemical_reaction/molten_bubbles
results = list(/datum/reagent/consumable/molten = 30)
- required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/lavaland_extract = 1)
+ required_reagents = list(/datum/reagent/clf3 = 10, /datum/reagent/consumable/space_cola = 20, /datum/reagent/medicine/leporazine = 1, /datum/reagent/medicine/hunter_extract = 1)
/datum/chemical_reaction/plasma_bubbles
results = list(/datum/reagent/consumable/molten/plasma_fizz = 3)
diff --git a/code/modules/hydroponics/grown/ambrosia.dm b/code/modules/hydroponics/grown/ambrosia.dm
index 09a31d99fca..a4de7ccd4eb 100644
--- a/code/modules/hydroponics/grown/ambrosia.dm
+++ b/code/modules/hydroponics/grown/ambrosia.dm
@@ -24,7 +24,7 @@
icon_dead = "ambrosia-dead"
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list(/obj/item/seeds/ambrosia/deus)
- reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/medicine/bicaridine = 0.1, /datum/reagent/medicine/kelotane = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1)
+ reagents_add = list(/datum/reagent/drug/space_drugs = 0.15, /datum/reagent/medicine/indomide = 0.1, /datum/reagent/medicine/alvitane = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05, /datum/reagent/toxin = 0.1)
/obj/item/food/grown/ambrosia/vulgaris
seed = /obj/item/seeds/ambrosia
@@ -41,7 +41,7 @@
plantname = "Ambrosia Deus"
product = /obj/item/food/grown/ambrosia/deus
mutatelist = list(/obj/item/seeds/ambrosia/gaia)
- reagents_add = list(/datum/reagent/medicine/omnizine = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05)
+ reagents_add = list(/datum/reagent/medicine/panacea = 0.15, /datum/reagent/medicine/synaptizine = 0.15, /datum/reagent/drug/space_drugs = 0.1, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.05)
rarity = 40
research = PLANT_RESEARCH_TIER_2
diff --git a/code/modules/hydroponics/grown/berries.dm b/code/modules/hydroponics/grown/berries.dm
index 3b5b0bd8852..f97ea9d3b83 100644
--- a/code/modules/hydroponics/grown/berries.dm
+++ b/code/modules/hydroponics/grown/berries.dm
@@ -237,7 +237,7 @@
species = "greengrape"
plantname = "Green-Grape Vine"
product = /obj/item/food/grown/grapes/green
- reagents_add = list(/datum/reagent/medicine/kelotane = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1)
+ reagents_add = list(/datum/reagent/medicine/alvitane = 0.2, /datum/reagent/consumable/nutriment/vitamin = 0.04, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/consumable/sugar = 0.1)
// No rarity: technically it's a beneficial mutant, but it's not exactly "new"...
mutatelist = list()
research = PLANT_RESEARCH_TIER_0//see above
diff --git a/code/modules/hydroponics/grown/cannabis.dm b/code/modules/hydroponics/grown/cannabis.dm
index e82802745a3..b786be69435 100644
--- a/code/modules/hydroponics/grown/cannabis.dm
+++ b/code/modules/hydroponics/grown/cannabis.dm
@@ -51,7 +51,7 @@
plantname = "Lifeweed"
product = /obj/item/food/grown/cannabis/white
mutatelist = list()
- reagents_add = list(/datum/reagent/medicine/omnizine = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15)
+ reagents_add = list(/datum/reagent/medicine/panacea = 0.35, /datum/reagent/drug/space_drugs = 0.15, /datum/reagent/toxin/lipolicide = 0.15)
rarity = 40
research = PLANT_RESEARCH_TIER_3
diff --git a/code/modules/hydroponics/grown/cocoa_vanilla.dm b/code/modules/hydroponics/grown/cocoa_vanilla.dm
index 21f6994fd9c..4ba942ff2fd 100644
--- a/code/modules/hydroponics/grown/cocoa_vanilla.dm
+++ b/code/modules/hydroponics/grown/cocoa_vanilla.dm
@@ -38,7 +38,7 @@
product = /obj/item/food/grown/vanillapod
genes = list(/datum/plant_gene/trait/repeated_harvest)
mutatelist = list()
- reagents_add = list(/datum/reagent/consumable/vanilla = 0.25, /datum/reagent/consumable/nutriment = 0.1, /datum/reagent/medicine/antitoxin = 0.2)
+ reagents_add = list(/datum/reagent/consumable/vanilla = 0.25, /datum/reagent/consumable/nutriment = 0.1)
research = PLANT_RESEARCH_TIER_0 //nothing new, technically
/obj/item/food/grown/vanillapod
diff --git a/code/modules/hydroponics/grown/flowers.dm b/code/modules/hydroponics/grown/flowers.dm
index d43cae2aa01..86358e79b22 100644
--- a/code/modules/hydroponics/grown/flowers.dm
+++ b/code/modules/hydroponics/grown/flowers.dm
@@ -15,7 +15,7 @@
icon_grow = "poppy-grow"
icon_dead = "poppy-dead"
mutatelist = list(/obj/item/seeds/poppy/geranium, /obj/item/seeds/poppy/lily)
- reagents_add = list(/datum/reagent/medicine/bicaridine = 0.2, /datum/reagent/consumable/nutriment = 0.05)
+ reagents_add = list(/datum/reagent/medicine/indomide = 0.2, /datum/reagent/consumable/nutriment = 0.05)
/obj/item/food/grown/poppy
seed = /obj/item/seeds/poppy
diff --git a/code/modules/hydroponics/grown/nettle.dm b/code/modules/hydroponics/grown/nettle.dm
index 1a91acc8a51..3f6d8133226 100644
--- a/code/modules/hydroponics/grown/nettle.dm
+++ b/code/modules/hydroponics/grown/nettle.dm
@@ -11,7 +11,7 @@
growthstages = 5
genes = list(/datum/plant_gene/trait/repeated_harvest, /datum/plant_gene/trait/plant_type/weed_hardy, /datum/plant_gene/trait/attack/nettle_attack, /datum/plant_gene/trait/backfire/nettle_burn)
mutatelist = list(/obj/item/seeds/nettle/death)
- reagents_add = list(/datum/reagent/toxin/acid = 0.5)
+ reagents_add = list(/datum/reagent/toxin/acid = 0.5, /datum/reagent/medicine/neoxanthin = 0.25)
/obj/item/seeds/nettle/Initialize(mapload,nogenes)
. = ..()
@@ -50,7 +50,7 @@
bite_consumption_mod = 2
lefthand_file = 'icons/mob/inhands/weapons/plants_lefthand.dmi'
righthand_file = 'icons/mob/inhands/weapons/plants_righthand.dmi'
- damtype = "fire"
+ damtype = BURN
force = 15
hitsound = 'sound/weapons/bladeslice.ogg'
throwforce = 5
diff --git a/code/modules/hydroponics/grown/replicapod.dm b/code/modules/hydroponics/grown/replicapod.dm
index 611de0ce5ca..437bd7f2ae9 100644
--- a/code/modules/hydroponics/grown/replicapod.dm
+++ b/code/modules/hydroponics/grown/replicapod.dm
@@ -84,9 +84,6 @@
else
if(M.ckey == ckey && M.stat == DEAD)
make_podman = TRUE
- if(isliving(M))
- var/mob/living/L = M
- make_podman = !L.hellbound
break
else //If the player has ghosted from his corpse before blood was drawn, his ckey is no longer attached to the mob, so we need to match up the cloned player through the mind key
for(var/mob/M in GLOB.player_list)
@@ -96,9 +93,6 @@
if(!O.can_reenter_corpse)
break
make_podman = TRUE
- if(isliving(M))
- var/mob/living/L = M
- make_podman = !L.hellbound
ckey_holder = M.ckey
break
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index b4880eb5072..b076d2f2427 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -33,6 +33,19 @@
return
emote("scream")
+/mob/proc/force_pain_noise(power)
+ if(HAS_TRAIT(src, TRAIT_ANALGESIA))
+ power = power/4
+ if(HAS_TRAIT(src, TRAIT_PAIN_RESIST))
+ power = power/2
+ switch(power)
+ if(10 to 25)
+ emote("gasp")
+ if(25 to 50)
+ emote("groan")
+ if(50 to 100)
+ emote("scream")
+
/mob/proc/force_manual_scream()
if(HAS_TRAIT(src, TRAIT_ANALGESIA))
return
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index 5e10d67f5e2..98efd0f9dff 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -925,7 +925,7 @@
/mob/living/carbon/proc/can_defib()
var/obj/item/organ/heart = getorgan(/obj/item/organ/heart)
- if (hellbound || HAS_TRAIT(src, TRAIT_HUSK))
+ if (HAS_TRAIT(src, TRAIT_HUSK))
return
if((getBruteLoss() >= MAX_REVIVE_BRUTE_DAMAGE) || (getFireLoss() >= MAX_REVIVE_FIRE_DAMAGE))
return
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index 59726dcacb4..2adbcee1976 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -136,8 +136,6 @@
just_sleeping = TRUE
if(!just_sleeping)
- if(hellbound)
- . += span_warning("[t_His] soul seems to have been ripped out of [t_his] body. Revival is impossible.")
. += ""
if(getorgan(/obj/item/organ/brain) && !key && !get_ghost(even_if_they_cant_reenter = FALSE, ghosts_with_clients = FALSE)) //PENTEST EDIT START
. += span_deadsay("[t_He] [t_is] limp and unresponsive; there are no signs of life and [t_his] soul has moved on. [t_He] won't be coming back...")
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index c67a58f0048..c41f67cc190 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -124,8 +124,6 @@
var/list/guaranteed_butcher_results = null ///these will always be yielded from butchering
var/butcher_difficulty = 0 ///effectiveness prob. is modified negatively by this amount; positive numbers make it more difficult, negative ones make it easier
- var/hellbound = 0 ///People who've signed infernal contracts are unrevivable.
-
var/list/weather_immunities = list()
var/stun_absorption = null ///converted to a list of stun absorption sources this mob has when one is added
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
index bac09fde17a..8300da19999 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/hivelord_outfits.dm
@@ -315,15 +315,15 @@
for(var/i = 1 to 3)
if(prob(75))
backpack_contents += pick_weight(list(
- /obj/item/reagent_containers/pill/patch/styptic = 5,
- /obj/item/reagent_containers/pill/patch/silver_sulf = 5,
+ /obj/item/reagent_containers/pill/patch/indomide = 5,
+ /obj/item/reagent_containers/pill/patch/alvitane = 5,
/obj/item/storage/firstaid/medical = 3,
/obj/item/reagent_containers/syringe = 3,
/obj/item/reagent_containers/glass/beaker = 2,
/obj/item/reagent_containers/dropper = 2,
/obj/item/reagent_containers/pill/charcoal = 2,
- /obj/item/reagent_containers/medigel/styptic = 2,
- /obj/item/reagent_containers/medigel/silver_sulf = 2,
+ /obj/item/reagent_containers/medigel/quardexane = 2,
+ /obj/item/reagent_containers/medigel/hadrakine = 2,
/obj/item/reagent_containers/medigel/sterilizine = 1,
/obj/item/flashlight/pen = 1,
/obj/item/hypospray/mkii = 1,
diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
index d052f111e9d..2d24e57b9fc 100644
--- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm
@@ -191,5 +191,5 @@
for(counter=0, counter<=powerlevel, counter++)
var/obj/item/food/hugemushroomslice/S = new /obj/item/food/hugemushroomslice(src.loc)
S.reagents.add_reagent(/datum/reagent/drug/mushroomhallucinogen, powerlevel)
- S.reagents.add_reagent(/datum/reagent/medicine/omnizine, powerlevel)
+ S.reagents.add_reagent(/datum/reagent/medicine/panacea, powerlevel)
S.reagents.add_reagent(/datum/reagent/medicine/synaptizine, powerlevel)
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 223e7d984b3..5940c567a63 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -59,8 +59,6 @@
O.dna.default_mutation_genes = dna.default_mutation_genes
O.dna.set_se(1, GET_INITIALIZED_MUTATION(RACEMUT))
- if(hellbound)
- O.hellbound = hellbound
O.a_intent = INTENT_HARM
//keep viruses?
@@ -236,9 +234,6 @@
O.dna.set_se(0, GET_INITIALIZED_MUTATION(RACEMUT))
O.domutcheck()
- if(hellbound)
- O.hellbound = hellbound
-
//keep viruses?
if (tr_flags & TR_KEEPVIRUS)
O.diseases = diseases
diff --git a/code/modules/movespeed/modifiers/reagent.dm b/code/modules/movespeed/modifiers/reagent.dm
index a66baa6c516..e533cdd6d69 100644
--- a/code/modules/movespeed/modifiers/reagent.dm
+++ b/code/modules/movespeed/modifiers/reagent.dm
@@ -45,3 +45,9 @@
/datum/movespeed_modifier/reagent/shock_wine
multiplicative_slowdown = -0.30
+
+/datum/movespeed_modifier/reagent/silfrine
+ multiplicative_slowdown = 0.2
+
+/datum/movespeed_modifier/reagent/silfrine_od
+ multiplicative_slowdown = 0.4
diff --git a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
index 98c2b012c55..5cb43543056 100644
--- a/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_synthesizer.dm
@@ -10,7 +10,7 @@
use_power = NO_POWER_USE
var/static/list/shortcuts = list(
"meth" = /datum/reagent/drug/methamphetamine,
- "tricord" = /datum/reagent/medicine/tricordrazine
+ "cureall" = /datum/reagent/medicine/cureall
)
/obj/machinery/chem_dispenser/chem_synthesizer/ui_interact(mob/user, datum/tgui/ui)
diff --git a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
deleted file mode 100644
index b7becfa6e6e..00000000000
--- a/code/modules/reagents/chemistry/reagents/cat2_medicine_reagents.dm
+++ /dev/null
@@ -1,519 +0,0 @@
-// Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful.
-/datum/reagent/medicine/c2
- name = "Category two reagent"
- harmful = TRUE
- metabolization_rate = 0.2
-
-/******BRUTE******/
-/*Suffix: -bital*/
-
-/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit.
- name = "Helbital"
- description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation."
- color = "#9400D3"
- taste_description = "cold and lifeless"
- overdose_threshold = 35
- reagent_state = SOLID
- var/helbent = FALSE
- var/reaping = FALSE
-
-/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M)
- . = TRUE
- var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss())
- var/thou_shall_heal = 0
- var/good_kind_of_healing = FALSE
- switch(M.stat)
- if(CONSCIOUS) //bad
- thou_shall_heal = death_is_coming/50
- M.adjustOxyLoss(2, TRUE)
- if(SOFT_CRIT) //meh convert
- thou_shall_heal = round(death_is_coming/47,0.1)
- M.adjustOxyLoss(1, TRUE)
- else //no convert
- thou_shall_heal = round(death_is_coming/45,0.1)
- good_kind_of_healing = TRUE
- M.adjustBruteLoss(-thou_shall_heal, FALSE)
-
- if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper!
- reaping = TRUE
- var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to
- if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING))
- helbent = TRUE
- to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?"))
- var/timeisticking = world.time
- var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors
- if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time))
- reaping = FALSE
- return //good job, you ruined it
- if(!RPSchoice)
- to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon."))
- reaping = FALSE
- return
- var/grim = pick(RockPaperScissors)
- if(grim == RPSchoice) //You Tied!
- to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now."))
- reaping = FALSE
- else if(RockPaperScissors[RPSchoice] == grim) //You lost!
- to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body."))
- M.dust()
- return
- else //VICTORY ROYALE
- to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds."))
- M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M)
- M.revive(full_heal = TRUE, admin_revive = FALSE)
- M.reagents.del_reagent(type)
- return
-
- ..()
- return
-
-/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M)
- if(!helbent)
- M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING)
- helbent = TRUE
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L)
- if(helbent)
- L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
- ..()
-
-/datum/reagent/medicine/c2/libital //messes with your liber
- name = "Libital"
- description = "A bruise reliever. Does minor liver damage."
- color = "#ECEC8D" // rgb: 236 236 141
- taste_description = "bitter with a hint of alcohol"
- reagent_state = SOLID
-
-/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3*REM)
- M.adjustBruteLoss(-3*REM)
- ..()
- return TRUE
-
-/*WS Begin - Medicine Fixes
-
-/datum/reagent/medicine/c2/probital
- name = "Probital"
- description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further."
- reagent_state = SOLID
- color = "#FFFF6B"
- overdose_threshold = 20
-
-/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2.25*REM, FALSE)
- var/ooo_youaregettingsleepy = 3.5
- switch(round(M.getStaminaLoss()))
- if(10 to 40)
- ooo_youaregettingsleepy = 3
- if(41 to 60)
- ooo_youaregettingsleepy = 2.5
- if(61 to 200) //you really can only go to 120
- ooo_youaregettingsleepy = 2
- M.adjustStaminaLoss(ooo_youaregettingsleepy*REM, FALSE)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M)
- M.adjustStaminaLoss(3*REM, 0)
- if(M.getStaminaLoss() >= 80)
- M.drowsyness++
- if(M.getStaminaLoss() >= 100)
- to_chat(M,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit..."))
- M.adjustStaminaLoss(-100, TRUE)
- M.Sleeping(10 SECONDS)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/probital/on_transfer(atom/A, method=INGEST, trans_volume)
- if(method != INGEST || !iscarbon(A))
- return
-
- A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05)
- A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
-
- ..()
-
-WS End */
-
-/******BURN******/
-/*Suffix: -uri*/
-/datum/reagent/medicine/c2/lenturi
- name = "Lenturi"
- description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system."
- reagent_state = LIQUID
- color = "#6171FF"
- var/resetting_probability = 0
- var/spammer = 0
-
-/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-3 * REM)
- M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM)
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/lenturi/on_mob_metabolize(mob/living/carbon/M)
- M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
- return ..()
-
-/datum/reagent/medicine/c2/lenturi/on_mob_end_metabolize(mob/living/carbon/M)
- M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
- return ..()
-
-/datum/reagent/medicine/c2/aiuri
- name = "Aiuri"
- description = "Used to treat burns. Does minor eye damage."
- reagent_state = LIQUID
- color = "#8C93FF"
- var/resetting_probability = 0
- var/message_cd = 0
-
-/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM)
- M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM)
- ..()
- return TRUE
-
-/*WS Begin - Fixes Medicines
-
-/datum/reagent/medicine/c2/hercuri
- name = "Hercuri"
- description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia."
- reagent_state = LIQUID
- color = "#F7FFA5"
- overdose_threshold = 25
- reagent_weight = 0.6
-
-/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M)
- if(M.getFireLoss() > 50)
- M.adjustFireLoss(-2*REM, FALSE)
- else
- M.adjustFireLoss(-1.25*REM, FALSE)
- M.adjust_bodytemperature(rand(-25,-5)*(TEMPERATURE_DAMAGE_COEFFICIENT*REM), 50)
- M.reagents?.chem_temp +=(-10*REM)
- M.adjust_fire_stacks(-1)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
- if(method != VAPOR)
- return
-
- M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
- M.adjust_fire_stacks(-reac_volume / 2)
- if(reac_volume >= metabolization_rate)
- M.ExtinguishMob()
-
- ..()
-
-/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M)
- M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly
- ..()
-
-WS End*/
-
-/******OXY******/
-/*Suffix: -mol*/
-#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox
-
-/datum/reagent/medicine/c2/convermol
- name = "Convermol"
- description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
- reagent_state = LIQUID
- color = "#FF6464"
- overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
-
-/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M)
- var/oxycalc = 2.5*REM*current_cycle
- if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
- M.adjustOxyLoss(-oxycalc, 0)
- M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0)
- if(prob(current_cycle) && M.losebreath)
- M.losebreath--
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M)
- metabolization_rate += 1
- ..()
- return TRUE
-
-#undef CONVERMOL_RATIO
-
-/datum/reagent/medicine/c2/tirimol
- name = "Tirimol"
- description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes."
- color = "#FF6464"
- var/drowsycd = 0
-
-/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M)
- M.adjustOxyLoss(-3)
- M.adjustStaminaLoss(2)
- if(drowsycd && (world.time > drowsycd))
- M.drowsyness += 10
- drowsycd = world.time + (45 SECONDS)
- else if(!drowsycd)
- drowsycd = world.time + (15 SECONDS)
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L)
- if(current_cycle > 20)
- L.Sleeping(10 SECONDS)
- ..()
-
-/******TOXIN******/
-/*Suffix: -iver*/
-
-/datum/reagent/medicine/c2/seiver //a bit of a gray joke
- name = "Seiver"
- description = "A medicine that shifts functionality based on temperature. Colder temperatures incurs radiation removal while hotter temperatures promote antitoxicity. Damages the heart." //CHEM HOLDER TEMPS, NOT AIR TEMPS
- var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads.
-
-/datum/reagent/medicine/c2/seiver/on_mob_metabolize(mob/living/carbon/human/M)
- . = ..()
- radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once.
-
-/datum/reagent/medicine/c2/seiver/on_mob_life(mob/living/carbon/human/M)
- var/chemtemp = min(holder.chem_temp, 1000)
- chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty
- var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints
-
- //you're hot
- var/toxcalc = min(round((chemtemp-1000)/175+5,0.1),5) //max 5 tox healing a tick
- if(toxcalc > 0)
- M.adjustToxLoss(toxcalc*-1)
- healypoints += toxcalc
-
- //and you're cold
- var/radcalc = round((T0C-chemtemp)/6,0.1) //max ~45 rad loss unless you've hit below 0K. if so, wow.
- if(radcalc > 0)
- //no cost percent healing if you are SUPER cold (on top of cost healing)
- if(chemtemp < radbonustemp*0.1) //if you're super chilly, it takes off 25% of your current rads
- M.radiation = round(M.radiation * 0.75)
- else if(chemtemp < radbonustemp)//else if you're under the chill-zone, it takes off 10% of your current rads
- M.radiation = round(M.radiation * 0.9)
- M.radiation -= radcalc
- healypoints += (radcalc/5)
-
-
- //you're yes and... oh no!
- healypoints = round(healypoints,0.1)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints/5)
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines
- name = "Multiver"
- description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
-
-/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M)
- var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
- for(var/r in M.reagents.reagent_list)
- var/datum/reagent/the_reagent = r
- if(istype(the_reagent, /datum/reagent/medicine))
- medibonus += 1
- M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u
- for(var/r2 in M.reagents.reagent_list)
- var/datum/reagent/the_reagent2 = r2
- if(the_reagent2 == src)
- continue
- var/amount2purge = 3
- if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines
- continue
- M.reagents.remove_reagent(the_reagent2.type, amount2purge)
- ..()
- return TRUE
-
-#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either
-
-/*WS Begin - Medicine Fixes
-
-/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge
- name = "Syriniver"
- description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver."
- reagent_state = LIQUID
- color = "#8CDF24" // heavy saturation to make the color blend better
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- overdose_threshold = 6
- var/conversion_amount
-
-/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume)
- if(method != INJECT || !iscarbon(A))
- return
- var/mob/living/carbon/C = A
- if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
- C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
- if((L.organ_flags & ORGAN_FAILING) || !L)
- return
- conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
- C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount)
- C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount)
- ..()
-
-/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(issyrinormusc(R))
- continue
- M.reagents.remove_reagent(R.type,0.4)
-
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/musiver //MUScles
- name = "Musiver"
- description = "The active metabolite of syriniver. Causes muscle weakness on overdose"
- reagent_state = LIQUID
- color = "#DFD54E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 25
- var/datum/brain_trauma/mild/muscle_weakness/U
-
-/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(issyrinormusc(R))
- continue
- M.reagents.remove_reagent(R.type,0.2)
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M)
- U = new()
- M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
- ..()
-
-/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M)
- if(U)
- QDEL_NULL(U)
- return ..()
-
-/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- ..()
- . = 1
-
-#undef issyrinormusc
-
-WS End*/
-
-/******COMBOS******/
-/*Suffix: Combo of healing, prob gonna get wack REAL fast*/
-
-
-
-/* fucking whitesands left this in code while we had the OTHER synthflesh
-/datum/reagent/medicine/c2/instabitaluri
- name = "Synthflesh (Instabitaluri)"
- description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only."
- reagent_state = LIQUID
- color = "#FFEBEB"
-
-/datum/reagent/medicine/c2/instabitaluri/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
- if(iscarbon(M))
- var/mob/living/carbon/carbies = M
- if (carbies.stat == DEAD)
- show_message = 0
- if(method in list(PATCH, TOUCH, SMOKE))
- var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
- var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
- for(var/i in carbies.all_wounds)
- var/datum/wound/iter_wound = i
- iter_wound.on_synthflesh(reac_volume)
- carbies.adjustToxLoss((harmies+burnies)*0.66)
- if(show_message)
- to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!"))
- SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100))
- carbies.cure_husk("burn")
- carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something
- ..()
- return TRUE
-*/
-
-/******ORGAN HEALING******/
-/*Suffix: -rite*/
-/*
-*How this medicine works:
-*Penthrite if you are not in crit only stabilizes your heart.
-*As soon as you pass crit threshold it's special effects kick in. Penthrite forces your heart to beat preventing you from entering
-*soft and hard crit, but there is a catch. During this you will be healed and you will sustain
-*heart damage that will not imapct you as long as penthrite is in your system.
-*If you reach the threshold of -60 HP penthrite stops working and you get a heart attack, penthrite is flushed from your system in that very moment,
-*causing you to loose your soft crit, hard crit and heart stabilization effects.
-*Overdosing on penthrite also causes a heart failure.
-*/
-/datum/reagent/medicine/c2/penthrite
- name = "Penthrite"
- description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. It reacts violently with other emergency medication."
- color = "#F5F5F5"
- overdose_threshold = 50
-
-/datum/reagent/medicine/c2/penthrite/on_mob_add(mob/living/M)
- . = ..()
- to_chat(M,"Your heart begins to beat with great force!")
- ADD_TRAIT(M, TRAIT_STABLEHEART, type)
- ADD_TRAIT(M, TRAIT_NOHARDCRIT,type)
- ADD_TRAIT(M, TRAIT_NOSOFTCRIT,type)
- M.crit_threshold = M.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping!
-
-
-/datum/reagent/medicine/c2/penthrite/on_mob_life(mob/living/carbon/human/H)
- H.adjustOrganLoss(ORGAN_SLOT_STOMACH,0.25)
- if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > H.crit_threshold) //we cannot save someone above our raised crit threshold.
-
- H.adjustToxLoss(-2 * REM, 0)
- H.adjustBruteLoss(-2 * REM, 0)
- H.adjustFireLoss(-2 * REM, 0)
- H.adjustOxyLoss(-6 * REM, 0)
-
- H.losebreath = 0
-
- H.adjustOrganLoss(ORGAN_SLOT_HEART,max(1,volume/10)) // your heart is barely keeping up!
-
- H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
-
-
- if(prob(33))
- to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!"))
-
- if(H.health <= H.crit_threshold) //certain death above this threshold
- REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack
- to_chat(H,span_danger("You feel something rupturing inside your chest!"))
- H.force_scream()
- H.set_heartattack(TRUE)
- volume = 0
- . = ..()
-
-/datum/reagent/medicine/c2/penthrite/on_mob_end_metabolize(mob/living/M)
- M.crit_threshold = M.crit_threshold - HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping!
- REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
- REMOVE_TRAIT(M, TRAIT_NOHARDCRIT,type)
- REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT,type)
- . = ..()
-
-/datum/reagent/medicine/c2/penthrite/overdose_process(mob/living/carbon/human/H)
- REMOVE_TRAIT(H, TRAIT_STABLEHEART, type)
- H.adjustStaminaLoss(10)
- H.adjustOrganLoss(ORGAN_SLOT_HEART,10)
- H.set_heartattack(TRUE)
-
-
-/******NICHE******/
-//todo
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm
new file mode 100644
index 00000000000..9cdf5d2a1d1
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/_medicine_reagents.dm
@@ -0,0 +1,8 @@
+/datum/reagent/medicine
+ name = "Medicine"
+ taste_description = "bitterness"
+ category = "Medicine"
+
+/datum/reagent/medicine/on_mob_life(mob/living/carbon/M)
+ current_cycle++
+ holder.remove_reagent(type, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm
new file mode 100644
index 00000000000..2e6f3c8adcc
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/blood_reagents.dm
@@ -0,0 +1,129 @@
+/* Reagents that primarily interface with blood and bleeding
+** chitosan I guess
+*/
+
+
+// helps bleeding wounds clot faster
+/datum/reagent/medicine/chitosan
+ name = "Chitosan"
+ description = "Vastly improves the blood's natural ability to coagulate and stop bleeding by hightening platelet production and effectiveness. Overdosing will cause extreme blood clotting, resulting in potential brain damage."
+ reagent_state = LIQUID
+ color = "#bb2424"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 20
+ /// The bloodiest wound that the patient has will have its blood_flow reduced by this much each tick
+ var/clot_rate = 0.3
+ /// While this reagent is in our bloodstream, we reduce all bleeding by this factor
+ var/passive_bleed_modifier = 0.7
+ /// For tracking when we tell the person we're no longer bleeding
+ var/was_working
+
+/datum/reagent/medicine/chitosan/on_mob_metabolize(mob/living/M)
+ ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan)
+
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/blood_boy = M
+ blood_boy.physiology?.bleed_mod *= passive_bleed_modifier
+ return ..()
+
+/datum/reagent/medicine/chitosan/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan)
+
+ if(was_working)
+ to_chat(M, span_warning("The medicine thickening your blood loses its effect!"))
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/blood_boy = M
+ blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
+
+ return ..()
+
+/datum/reagent/medicine/chitosan/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(!M.blood_volume || !M.all_wounds)
+ return
+
+ var/datum/wound/bloodiest_wound
+
+ for(var/i in M.all_wounds)
+ var/datum/wound/iter_wound = i
+ if(iter_wound.blood_flow)
+ if(iter_wound.blood_flow > bloodiest_wound?.blood_flow)
+ bloodiest_wound = iter_wound
+
+ if(bloodiest_wound)
+ if(!was_working)
+ to_chat(M, span_green("You can feel your flowing blood start thickening!"))
+ was_working = TRUE
+ bloodiest_wound.blood_flow = max(0, bloodiest_wound.blood_flow - clot_rate)
+ else if(was_working)
+ was_working = FALSE
+
+/datum/reagent/medicine/chitosan/overdose_process(mob/living/carbon/M)
+ . = ..()
+ if(!M.blood_volume)
+ return
+
+ if(prob(15))
+ M.losebreath += rand(2,4)
+ M.adjustOxyLoss(rand(1,3))
+ if(prob(30))
+ to_chat(M, span_danger("You can feel your blood clotting up in your veins!"))
+ else if(prob(10))
+ to_chat(M, span_userdanger("You feel like your blood has stopped moving!"))
+ M.adjustOxyLoss(rand(3,4))
+
+ if(prob(50))
+ var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
+ our_lungs.applyOrganDamage(1)
+ else if(prob(25))
+ var/obj/item/organ/lungs/our_brain = M.getorganslot(ORGAN_SLOT_BRAIN)
+ our_brain.applyOrganDamage(1)
+ else
+ var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART)
+ our_heart.applyOrganDamage(1)
+
+/datum/reagent/medicine/salglu_solution
+ name = "Saline-Glucose Solution"
+ description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute."
+ reagent_state = LIQUID
+ color = "#DCDCDC"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
+ taste_description = "sweetness and salt"
+ var/last_added = 0
+ var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
+ var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick
+
+/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
+ if(last_added)
+ M.blood_volume -= last_added
+ last_added = 0
+ if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level.
+ var/amount_to_add = min(M.blood_volume, volume*5)
+ var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable)
+ last_added = new_blood_level - M.blood_volume
+ M.blood_volume = new_blood_level + extra_regen
+ if(prob(33))
+ M.adjustBruteLoss(-0.5*REM, 0)
+ M.adjustFireLoss(-0.5*REM, 0)
+ . = TRUE
+ ..()
+
+/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M)
+ if(prob(3))
+ to_chat(M, span_warning("You feel salty."))
+ holder.add_reagent(/datum/reagent/consumable/sodiumchloride, 1)
+ holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5)
+ else if(prob(3))
+ to_chat(M, span_warning("You feel sweet."))
+ holder.add_reagent(/datum/reagent/consumable/sugar, 1)
+ holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5)
+ if(prob(33))
+ M.adjustBruteLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ M.adjustFireLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ . = TRUE
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm
new file mode 100644
index 00000000000..1b251d65217
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/fauna_reagents.dm
@@ -0,0 +1,52 @@
+/*
+** Reagents that are from fauna
+*/
+
+/datum/reagent/medicine/soulus
+ name = "Soulus Dust"
+ description = "Ground legion cores. The dust quickly seals wounds yet slowly causes the tissue to undergo necrosis."
+ reagent_state = SOLID
+ color = "#302f20"
+ metabolization_rate = REAGENTS_METABOLISM * 0.8
+ overdose_threshold = 50
+ var/tox_dam = 0.25
+
+/datum/reagent/medicine/soulus/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, INJECT))
+ M.set_timed_status_effect(reac_volume SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ if(M.getFireLoss())
+ M.adjustFireLoss(-reac_volume*1.2)
+ if(M.getBruteLoss())
+ M.adjustBruteLoss(-reac_volume*1.2)
+ if(prob(50))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_good, name)
+ else
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_bad, name)
+ ..()
+
+/datum/reagent/medicine/soulus/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-0.1*REM, 0)
+ M.adjustBruteLoss(-0.1*REM, 0)
+ M.adjustToxLoss(tox_dam*REM, 0)
+ ..()
+
+/datum/reagent/medicine/soulus/overdose_process(mob/living/M)
+ var/mob/living/carbon/C = M
+ if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull))
+ var/obj/item/organ/legion_skull/spare_ribs = new()
+ spare_ribs.Insert(M)
+ ..()
+
+/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M)
+ SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "legion")
+ ..()
+
+/datum/reagent/medicine/soulus/pure
+ name = "Purified Soulus Dust"
+ description = "Ground legion cores."
+ reagent_state = SOLID
+ color = "#302f20"
+ metabolization_rate = REAGENTS_METABOLISM
+ overdose_threshold = 100
+ tox_dam = 0
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
new file mode 100644
index 00000000000..f9f46558599
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
@@ -0,0 +1,196 @@
+/*
+** reagents that come from plants
+*/
+
+/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems.
+ name = "Polypyrylium Oligomers"
+ description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
+ reagent_state = SOLID
+ color = "#9423FF"
+ metabolization_rate = 0.15 * REAGENTS_METABOLISM
+ overdose_threshold = 50
+ taste_description = "numbing bitterness"
+ /// While this reagent is in our bloodstream, we reduce all bleeding by this factor
+ var/passive_bleed_modifier = 0.55
+ /// For tracking when we tell the person we're no longer bleeding
+ var/was_working
+
+/datum/reagent/medicine/polypyr/on_mob_metabolize(mob/living/M)
+ ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr)
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/blood_boy = M
+ blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
+ return ..()
+
+/datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr)
+ //should probably generic proc this at a later point. I'm probably gonna use it a bit
+ if(was_working)
+ to_chat(M, span_warning("The medicine thickening your blood loses its effect!"))
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/blood_boy = M
+ blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
+
+ return ..()
+
+
+/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all.
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25)
+ M.adjustBruteLoss(-0.5, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(method == TOUCH || method == SMOKE || method == VAPOR)
+ if(M && ishuman(M) && reac_volume >= 0.5)
+ var/mob/living/carbon/human/H = M
+ H.hair_color = "92f"
+ H.facial_hair_color = "92f"
+ H.update_hair()
+
+/datum/reagent/medicine/polypyr/overdose_process(mob/living/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5)
+ ..()
+ . = 1
+
+
+/datum/reagent/medicine/puce_essence
+ name = "Pucetylline Essence"
+ description = "Ground essence of puce crystals."
+ reagent_state = SOLID
+ color = "#CC8899"
+ metabolization_rate = 2.5 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/puce_essence/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustToxLoss(-1*REM, 0)
+ else
+ M.adjustCloneLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type, 0.25)
+ if(holder.has_reagent(/datum/reagent/medicine/soulus)) // No, you can't chemstack with soulus dust
+ holder.remove_reagent(/datum/reagent/medicine/soulus, 5)
+ M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to puce
+ ..()
+
+/datum/reagent/medicine/puce_essence/expose_atom(atom/A, volume)
+ if(!iscarbon(A))
+ A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY)
+ ..()
+
+/datum/reagent/medicine/puce_essence/on_mob_end_metabolize(mob/living/M)
+ M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) puce
+
+/datum/reagent/medicine/puce_essence/overdose_process(mob/living/M)
+ M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal puce
+
+/datum/reagent/medicine/chartreuse // C H A R T R E U S E
+ name = "Chartreuse Solution"
+ description = "Refined essence of puce crystals."
+ reagent_state = SOLID
+ color = "#DFFF00"
+ metabolization_rate = 2.5 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/chartreuse/on_mob_life(mob/living/carbon/M) // Yes, you can chemstack with soulus dust
+ if(prob(80))
+ M.adjustToxLoss(-2*REM, 0)
+ M.adjustCloneLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type, 1)
+ M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to chartreuse
+ ..()
+
+/datum/reagent/medicine/chartreuse/expose_atom(atom/A, volume)
+ if(!iscarbon(A))
+ A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY)
+ ..()
+
+/datum/reagent/medicine/chartreuse/on_mob_end_metabolize(mob/living/M)
+ M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) chartreuse
+
+/datum/reagent/medicine/chartreuse/overdose_process(mob/living/M)
+ M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal chartreuse
+ M.set_drugginess(15) // Also druggy
+ ..()
+
+
+/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants
+ name = "Earthsblood"
+ description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain. For some strange reason, it also induces temporary pacifism in those who imbibe it and semi-permanent pacifism in those who overdose on it."
+ color = "#FFAF00"
+ metabolization_rate = 0.4 //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations.
+ overdose_threshold = 25
+
+/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
+ if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE
+ M.adjustBruteLoss(-1 * REM, 0)
+ M.adjustFireLoss(-1 * REM, 0)
+ M.adjustOxyLoss(-0.5 * REM, 0)
+ M.adjustToxLoss(-0.5 * REM, 0)
+ M.adjustCloneLoss(-0.1 * REM, 0)
+ M.adjustStaminaLoss(-0.5 * REM, 0)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
+ else
+ M.adjustBruteLoss(-5 * REM, 0) //slow to start, but very quick healing once it gets going
+ M.adjustFireLoss(-5 * REM, 0)
+ M.adjustOxyLoss(-3 * REM, 0)
+ M.adjustToxLoss(-3 * REM, 0)
+ M.adjustCloneLoss(-1 * REM, 0)
+ M.adjustStaminaLoss(-3 * REM, 0)
+ M.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/jitter, 30 SECONDS)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150)
+ M.druggy = min(max(0, M.druggy + 10), 15) //See above
+ ..()
+ . = 1
+
+/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_PACIFISM, type)
+
+/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_PACIFISM, type)
+ ..()
+
+/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
+ M.hallucination = min(max(0, M.hallucination + 5), 60)
+ if(current_cycle > 25)
+ M.adjustToxLoss(4 * REM, 0)
+ if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee
+ M.adjustToxLoss(6 * REM, 0)
+ if(iscarbon(M))
+ var/mob/living/carbon/hippie = M
+ hippie.gain_trauma(/datum/brain_trauma/severe/pacifism)
+ ..()
+ . = 1
+
+//Earthsblood is still a wonderdrug. Just... don't expect to be able to mutate something that makes plants so healthy.
+/datum/reagent/medicine/earthsblood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+ . = ..()
+ if(chems.has_reagent(type, 1))
+ mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1))
+ mytray.adjustPests(-rand(1,3))
+ mytray.adjustWeeds (-rand(1,3))
+ if(myseed)
+ myseed.adjust_instability(-round(chems.get_reagent_amount(type) * 1.3))
+ myseed.adjust_potency(round(chems.get_reagent_amount(type)))
+ myseed.adjust_yield(round(chems.get_reagent_amount(type)))
+ myseed.adjust_endurance(round(chems.get_reagent_amount(type) * 0.5))
+ myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.5))
+
+/datum/reagent/medicine/neoxanthin
+ name = "Neoxanthin"
+ description = "A naturally occuring carotenoid found in several varieties of plants. Has mild antioxidant properties."
+ reagent_state = SOLID
+ color = "#CC8899"
+ metabolization_rate = 0.15 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/neoxanthin/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustToxLoss(-1*REM, 0)
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm
new file mode 100644
index 00000000000..06fe6fdd906
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/ipc_reagents.dm
@@ -0,0 +1,36 @@
+/*
+** for some reason
+*/
+
+/datum/reagent/medicine/system_cleaner
+ name = "System Cleaner"
+ description = "Neutralizes harmful chemical compounds inside synthetic systems."
+ reagent_state = LIQUID
+ color = "#F1C40F"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ process_flags = SYNTHETIC
+
+/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M)
+ M.adjustToxLoss(-2*REM, 0)
+ . = 1
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+
+/datum/reagent/medicine/liquid_solder
+ name = "Liquid Solder"
+ description = "Repairs brain damage in synthetics."
+ color = "#727272"
+ taste_description = "metallic"
+ process_flags = SYNTHETIC
+
+/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM)
+ if(iscarbon(M))
+ var/mob/living/carbon/C = M
+ if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL))
+ C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL)
+ if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD))
+ C.cure_trauma_type(BRAIN_TRAUMA_MILD)
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm
new file mode 100644
index 00000000000..09e84767c81
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/medicine_reagents.dm
@@ -0,0 +1,842 @@
+/* For chems that primarily interface with damage
+** I.E. healing chems
+** organized
+** >brute
+** >burn
+** >tox
+** >oxygen
+** >multi
+** >misc
+*/
+
+
+
+/// BRUTE CHEMS ///
+
+/datum/reagent/medicine/indomide
+ name = "Indomide"
+ description = "An anti-inflammatory initially isolated from a Kalixcian cave fungus. Thins the blood, and causes bruises and cuts to slowly heal. Overdose can cause sores to open along the body."
+ reagent_state = LIQUID
+ color = "#FFFF6B"
+ overdose_threshold = 30
+ var/passive_bleed_modifier = 1.2
+
+/datum/reagent/medicine/indomide/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/indomide/on_mob_metabolize(mob/living/L)
+ . = ..()
+ if(!ishuman(L))
+ return
+ var/mob/living/carbon/human/normal_guy = L
+ normal_guy.physiology?.bleed_mod *= passive_bleed_modifier
+
+/datum/reagent/medicine/indomide/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(!ishuman(L))
+ return
+ var/mob/living/carbon/human/normal_guy = L
+ normal_guy.physiology?.bleed_mod /= passive_bleed_modifier
+
+
+/datum/reagent/medicine/indomide/overdose_start(mob/living/M)
+ . = ..()
+ ADD_TRAIT(M, TRAIT_BLOODY_MESS, /datum/reagent/medicine/indomide)
+
+/datum/reagent/medicine/indomide/overdose_process(mob/living/M)
+ . = ..()
+ M.adjustBruteLoss(0.2*REM, 0)
+
+ if(!iscarbon(M))
+ return
+
+ var/mob/living/carbon/victim = M
+
+ if(prob(5))
+ var/obj/item/bodypart/open_sore = pick(victim.bodyparts)
+ if(IS_ORGANIC_LIMB(open_sore))
+ open_sore.force_wound_upwards(/datum/wound/slash/moderate)
+ M.emote("gasps")
+
+/datum/reagent/medicine/indomide/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ REMOVE_TRAIT(L, TRAIT_BLOODY_MESS, /datum/reagent/medicine/indomide)
+
+/datum/reagent/medicine/indomide/on_transfer(atom/A, method=INGEST, trans_volume)
+ if(method != INGEST || !istype(A, /obj/item/organ/stomach))
+ return
+
+ A.reagents.remove_reagent(/datum/reagent/medicine/indomide, trans_volume * 0.05)
+ A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
+
+ ..()
+
+/datum/reagent/medicine/metafactor
+ name = "Mitogen Metabolism Factor"
+ description = "This enzyme catalyzes the conversion of nutricious food into healing peptides."
+ //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency.
+ metabolization_rate = 0.0625 * REAGENTS_METABOLISM
+ reagent_state = SOLID
+ color = "#FFBE00"
+ overdose_threshold = 10
+
+/datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/M)
+ metabolization_rate = 2 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/M)
+ if(prob(25))
+ M.vomit()
+ ..()
+
+
+/datum/reagent/medicine/hadrakine
+ name = "Hadrakine Powder"
+ description = "An aluminum based styptic that rapidly seals flesh wounds upon administration, and lingers in the blood stream, causing slightly reduced blood flow, and stimulating healing of further, minor injuries. Overdose causes blood clotting, shortness of breath, and potential brain damage."
+ reagent_state = LIQUID
+ color = "#FF9696"
+ overdose_threshold = 45
+ var/passive_bleed_modifier = 0.9
+ var/overdose_bleed_modifier = 0.3
+ var/brute_damage_modifier = 1.5
+
+/datum/reagent/medicine/hadrakine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustToxLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You don't feel so good..."))
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-reac_volume)
+ var/pain_points = M.adjustStaminaLoss(reac_volume*4)
+ M.force_pain_noise(pain_points)
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your bruises healing! It stings like hell!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your bruises throbbing."))
+ ..()
+
+
+/datum/reagent/medicine/hadrakine/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/hadrakine/on_mob_metabolize(mob/living/L)
+ . = ..()
+ if(!ishuman(L))
+ return
+ var/mob/living/carbon/human/normal_guy = L
+ normal_guy.physiology?.bleed_mod *= passive_bleed_modifier
+
+/datum/reagent/medicine/hadrakine/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(!ishuman(L))
+ return
+ var/mob/living/carbon/human/normal_guy = L
+ normal_guy.physiology?.bleed_mod /= passive_bleed_modifier
+ if(overdosed)
+ normal_guy.physiology?.bleed_mod /= overdose_bleed_modifier
+ normal_guy.physiology?.brute_mod /= brute_damage_modifier
+
+/datum/reagent/medicine/hadrakine/overdose_start(mob/living/M)
+ . = ..()
+
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/overdose_victim = M
+ overdose_victim.physiology?.bleed_mod *= overdose_bleed_modifier
+ overdose_victim.physiology?.brute_mod *= brute_damage_modifier
+
+/datum/reagent/medicine/hadrakine/overdose_process(mob/living/M)
+ M.adjustBruteLoss(0.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ if(prob(25))
+ M.losebreath++
+ if(prob(10))
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/silfrine
+ name = "Silfrine"
+ description = "An extremely aggressive silver-based compound suited best for catalyzing rapid platlet movement, and sealing of wounds. This is an extremely painful process. Overdose causes shortness of breath, and brute damage, as the body tries to seal non-existent wounds."
+ reagent_state = LIQUID
+ color = "#725cfd"
+ overdose_threshold = 20
+
+/datum/reagent/medicine/silfrine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ var/mob/living/carbon/paper_cut_victim = M
+ if(method in list(INGEST, INJECT, PATCH))
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_boldwarning("Your body ignites in pain as nerves are rapidly reformed, and flesh is freshly knit!"))
+ M.force_pain_noise(reac_volume*6)
+ M.adjustStaminaLoss(reac_volume*4)
+ for(var/owie in paper_cut_victim.all_wounds)
+ var/datum/wound/paper_cut = owie
+ paper_cut.on_silfrine(reac_volume)
+ ..()
+
+/datum/reagent/medicine/silfrine/on_mob_life(mob/living/carbon/M)
+ var/effectiveness_multiplier = clamp(M.getBruteLoss()/75, 0.3, 1.5)
+ var/brute_heal = effectiveness_multiplier * REM * -4
+ M.adjustBruteLoss(brute_heal, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/silfrine/on_mob_metabolize(mob/living/L)
+ . = ..()
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine)
+ if(!HAS_TRAIT(L, TRAIT_ANALGESIA))
+ SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+
+/datum/reagent/medicine/silfrine/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine)
+
+/datum/reagent/medicine/silfrine/overdose_start(mob/living/M)
+ . = ..()
+ M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/silfrine_od)
+ M.force_pain_noise(200)
+
+
+/datum/reagent/medicine/silfrine/overdose_process(mob/living/M)
+ if(prob(10))
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your flesh twisting as it tries to grow around non-existent wounds!"))
+ else
+ to_chat(M, span_danger("You feel points of pressure all across your body starting to throb uncomfortably."))
+ M.force_pain_noise(40)
+ M.adjustStaminaLoss(40*REM, 0)
+ M.adjustBruteLoss(5*REM, 0)
+ if(prob(25))
+ M.losebreath++
+ ..()
+ . = 1
+
+
+/// BURN REAGENTS ///
+
+/datum/reagent/medicine/leporazine
+ name = "Leporazine"
+ description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels."
+ color = "#DB90C6"
+
+/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M)
+ if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
+ M.adjust_bodytemperature(-4 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
+ else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
+ M.adjust_bodytemperature(4 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
+ ..()
+
+/datum/reagent/medicine/alvitane
+ name = "Alvitane"
+ description = "A moderate intensity burn medication derived from chemicals specializing in dermal regeneration. Ideal application is exposing it to the flesh, as it allows burns to rapidly reknit themselves. Overdose weakens the user's ability to resist burns, and causes minor toxic effects."
+ reagent_state = LIQUID
+ color = "#F7FFA5"
+ overdose_threshold = 30
+ var/burn_damage_modifier = 1.3
+
+/datum/reagent/medicine/alvitane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-1*REM, 0)
+ M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/alvitane/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ M.adjustFireLoss(-reac_volume/2)
+ M.force_pain_noise(reac_volume/2)
+ M.adjustStaminaLoss(reac_volume/2)
+ if(iscarbon(M) && M.stat != DEAD)
+ var/mob/living/carbon/burn_ward_attendee = M
+ for(var/owie in burn_ward_attendee.all_wounds)
+ var/datum/wound/burn = owie
+ burn.on_tane(reac_volume/4)
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your burns regenerating! Your nerves are burning!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your burns twisting."))
+ ..()
+
+/datum/reagent/medicine/alvitane/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(!ishuman(L))
+ return
+
+ if(overdosed)
+ var/mob/living/carbon/human/normal_guy = L
+ normal_guy.physiology?.burn_mod /= burn_damage_modifier
+
+/datum/reagent/medicine/alvitane/overdose_start(mob/living/M)
+ . = ..()
+
+ if(!ishuman(M))
+ return
+
+ var/mob/living/carbon/human/overdose_victim = M
+ overdose_victim.physiology?.burn_mod *= burn_damage_modifier
+
+/datum/reagent/medicine/alvitane/overdose_process(mob/living/carbon/M)
+ M.adjustToxLoss(0.5*REM, 0)
+ M.set_timed_status_effect(5 SECONDS, /datum/status_effect/jitter, only_if_higher = TRUE)
+ ..()
+
+
+/datum/reagent/medicine/quardexane
+ name = "Quardexane"
+ description = "A third-generation burn medication originating from the Shoal. Injection allows it to rapidly re-knit burns, while vaporous application acts as an cooling agent and sanitizing substance. Overdose causes new burns to form on the user's body."
+ reagent_state = LIQUID
+ color = "#4ab1ba"
+ overdose_threshold = 25
+ reagent_weight = 0.6
+
+/datum/reagent/medicine/quardexane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0)
+ M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/quardexane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
+ if(method == VAPOR || TOUCH)
+ M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
+ M.adjust_fire_stacks(-reac_volume / 2)
+ if(reac_volume >= metabolization_rate)
+ M.ExtinguishMob()
+
+ if(method == INJECT)
+ M.adjustFireLoss(-2*reac_volume, 0)
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your burns regenerating! Your nerves are burning!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_danger("Your burns start to throb, before subsiding!"))
+
+ if(iscarbon(M) && M.stat != DEAD && (method in list(VAPOR, INJECT, TOUCH)))
+ var/mob/living/carbon/burn_ward_attendee = M
+ for(var/owie in burn_ward_attendee.all_wounds)
+ var/datum/wound/burn = owie
+ burn.on_tane(reac_volume/2)
+
+ ..()
+
+/datum/reagent/medicine/quardexane/overdose_process(mob/living/carbon/M)
+ M.adjustFireLoss(3*REM, 0.)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
+ ..()
+
+/datum/reagent/medicine/ysiltane
+ name = "Ysiltane"
+ description = "A burn treatment derived from plasma. Application by injection or ingestion causes burns to rapidly repair themselves. The intensity of application causes the user's system to temporarily crash. Overdose causes a toxic crisis within the user's system, and can damage organs."
+ reagent_state = LIQUID
+ color = "#862929"
+ overdose_threshold = 21
+ reagent_weight = 2
+
+/datum/reagent/medicine/ysiltane/on_mob_life(mob/living/carbon/M)
+ if(current_cycle > 2 && current_cycle <= 6)
+ M.adjustFireLoss(-10*REM, 0)
+ M.adjustFireLoss(-2*REM, 0)
+ M.adjustStaminaLoss(1*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/ysiltane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
+ if(method in list(INJECT, INGEST))
+ M.adjustFireLoss(-reac_volume*2)
+ M.adjustStaminaLoss(reac_volume*6)
+ if(!HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_boldwarning("Your nerves ignite in pain as burns start to rapidly regenerate!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_warning("You feel your burns twisting."))
+
+ if(iscarbon(M) && M.stat != DEAD)
+ var/mob/living/carbon/burn_ward_attendee = M
+ for(var/owie in burn_ward_attendee.all_wounds)
+ var/datum/wound/burn = owie
+ burn.on_tane(reac_volume)
+
+ ..()
+
+/datum/reagent/medicine/ysiltane/overdose_process(mob/living/carbon/M)
+ M.adjustFireLoss(3*REM, 0.)
+ M.adjust_bodytemperature(5 * TEMPERATURE_DAMAGE_COEFFICIENT, 330)
+ ..()
+
+
+/// TOXIN REAGENTS ///
+
+
+/datum/reagent/medicine/calomel
+ name = "Calomel"
+ description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
+ reagent_state = LIQUID
+ color = "#8CDF24" // heavy saturation to make the color blend better
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ taste_description = "acid"
+
+/datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.type,3)
+ if(M.health > 20)
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/charcoal
+ name = "Charcoal"
+ description = "Heals toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream. Administer orally"
+ reagent_state = SOLID
+ color = "#101a13"
+ metabolization_rate = 0.75 * REAGENTS_METABOLISM
+ overdose_threshold = 20
+
+/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-1*REM, 0)
+ . = 1
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+
+/datum/reagent/medicine/charcoal/on_transfer(atom/A, method=TOUCH, volume)
+ if(method == INGEST || !istype(A, /obj/item/organ/stomach))
+ return
+ A.reagents.remove_reagent(/datum/reagent/medicine/charcoal, volume) //We really should not be injecting an insoluble granular material.
+ A.reagents.add_reagent(/datum/reagent/carbon, volume) // Its pores would get clogged with gunk anyway.
+ ..()
+
+//its seiver. i ran out of ideas + seiver was a good one
+/datum/reagent/medicine/pancrazine
+ name = "Pancrazine"
+ description = "A second generation Tecetian research chemical developed as the byproduct of the terraforming process. Injection of the substance while cold causes the body to regenerate radiation damage, while heating it causes rapid purging of toxic effects."
+ color = "#c3915d"
+ var/radbonustemp = (T0C - 100) //being below this number gives you 10% off rads.
+
+/datum/reagent/medicine/pancrazine/on_mob_metabolize(mob/living/carbon/human/M)
+ . = ..()
+ radbonustemp = rand(radbonustemp - 50, radbonustemp + 50) // Basically this means 50K and below will always give the percent heal, and upto 150K could. Calculated once.
+
+/datum/reagent/medicine/pancrazine/on_mob_life(mob/living/carbon/human/M)
+ var/chemtemp = min(holder.chem_temp, 1000)
+ chemtemp = chemtemp ? chemtemp : 273 //why do you have null sweaty
+ var/healypoints = 0 //5 healypoints = 1 heart damage; 5 rads = 1 tox damage healed for the purpose of healypoints
+
+ //you're hot
+ var/toxcalc = min(round((chemtemp-1000)/175+5,0.1),5) //max 2.5 tox healing a tick
+ if(toxcalc > 0)
+ M.adjustToxLoss(toxcalc*-0.5)
+ healypoints += toxcalc
+
+ //and you're cold
+ var/radcalc = round((T0C-chemtemp)/6,0.1) //max ~45 rad loss unless you've hit below 0K. if so, wow.
+ if(radcalc > 0)
+ //no cost percent healing if you are SUPER cold (on top of cost healing)
+ if(chemtemp < radbonustemp*0.1) //if you're super chilly, it takes off 25% of your current rads
+ M.radiation = round(M.radiation * 0.75)
+ else if(chemtemp < radbonustemp)//else if you're under the chill-zone, it takes off 10% of your current rads
+ M.radiation = round(M.radiation * 0.9)
+ M.radiation -= radcalc
+ healypoints += (radcalc/5)
+
+
+ //you're yes and... oh no!
+ healypoints = round(healypoints,0.1)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, healypoints/5)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/pancrazine/overdose_process(mob/living/M)
+ . = ..()
+ if(prob(50))
+ M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ if(prob(10))
+ M.adjust_disgust(33)
+
+/datum/reagent/medicine/gjalrazine
+ name = "Gjalrazine"
+ description = "A plasma-derieved syrum that stimulates the body's natural defenses against toxins. Injection forces the body to start purging toxins, at cost of a rising sense of disgust. Overdose causes the substance to start binding to blood cells, causing blood toxicity."
+ reagent_state = LIQUID
+ color = "#8CDF24"
+ metabolization_rate = 0.75 * REAGENTS_METABOLISM
+ overdose_threshold = 12
+
+/datum/reagent/medicine/gjalrazine/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-3*REM, 0)
+ M.adjust_disgust(1)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/gjalrazine/expose_mob(mob/living/M, method, reac_volume, show_message, touch_protection)
+ . = ..()
+ if((method in list(TOUCH, PATCH, INGEST, INJECT)) && M.stat != DEAD)
+ if(method == INGEST)
+ M.adjustOrganLoss(ORGAN_SLOT_STOMACH, reac_volume)
+ to_chat(M, "Your stomach cramps!")
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ M.adjustToxLoss(-reac_volume*4)
+ M.adjust_disgust(50)
+ M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+
+/datum/reagent/medicine/gjalrazine/overdose_process(mob/living/M)
+ . = ..()
+ M.set_timed_status_effect(30 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ M.adjust_disgust(30)
+ M.adjustToxLoss(2*REM, 0)
+
+/// OXYGEN REAGENTS ///
+
+// oxygen has good reason to be less complicated because it's major causes are suffocating and blood loss
+// blood loss has treatment methods aside from these meds
+// and suffocation shouldn't be a major affair
+
+/datum/reagent/medicine/dexalin
+ name = "Dexalin"
+ description = "Restores oxygen loss. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#0080FF"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M)
+ M.adjustOxyLoss(-0.5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
+ M.adjustOxyLoss(2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/salbutamol
+ name = "Salbutamol"
+ description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent."
+ reagent_state = LIQUID
+ color = "#00FFFF"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M)
+ M.adjustOxyLoss(-3*REM, 0)
+ if(M.losebreath >= 4)
+ M.losebreath -= 2
+ ..()
+ . = 1
+
+/datum/reagent/medicine/inaprovaline
+ name = "Inaprovaline"
+ description = "Stabilizes the breathing of patients. Good for those in critical condition."
+ reagent_state = LIQUID
+ color = "#A4D8D8"
+
+/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M)
+ if(M.losebreath >= 5)
+ M.losebreath -= 5
+ ..()
+
+/// RADIATION REAGENTS ///
+
+/datum/reagent/medicine/anti_rad
+ name = "Emergency Radiation Purgant" //taking real names
+ description = "Rapidly purges radiation from the body."
+ reagent_state = LIQUID
+ color = "#E6FFF0"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L)
+ to_chat(L, span_warning("Your stomach starts to churn and cramp!"))
+ . = ..()
+
+/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M)
+ M.radiation -= M.radiation - rand(50,150)
+ M.adjust_disgust(4*REM)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/potass_iodide
+ name = "Potassium Iodide"
+ description = "Efficiently restores low radiation damage."
+ reagent_state = LIQUID
+ color = "#BAA15D"
+ metabolization_rate = 2 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M)
+ if(M.radiation > 0)
+ M.radiation -= min(M.radiation, 8)
+ ..()
+
+/datum/reagent/medicine/pen_acid
+ name = "Pentetic Acid"
+ description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body."
+ reagent_state = LIQUID
+ color = "#E6FFF0"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M)
+ M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50
+ M.adjustToxLoss(-2*REM, 0)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(R != src)
+ M.reagents.remove_reagent(R.type,2)
+ ..()
+ . = 1
+
+/// MULTI-DAMAGE REAGENTS ///
+
+
+/datum/reagent/medicine/synthflesh
+ name = "Synthflesh"
+ description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only."
+ reagent_state = LIQUID
+ color = "#FFEBEB"
+
+/datum/reagent/medicine/synthflesh/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
+ if(iscarbon(M))
+ var/mob/living/carbon/carbies = M
+ if (carbies.stat == DEAD)
+ show_message = 0
+ if(method in list(PATCH, TOUCH, SMOKE))
+ var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
+ var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
+ for(var/i in carbies.all_wounds)
+ var/datum/wound/iter_wound = i
+ iter_wound.on_synthflesh(reac_volume)
+ carbies.adjustToxLoss((harmies+burnies)*0.66)
+ if(show_message)
+ to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!"))
+ SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh) + reac_volume >= 100))
+ carbies.cure_husk("burn")
+ carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/cryoxadone
+ name = "Cryoxadone"
+ description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly."
+ color = "#0000C8"
+ taste_description = "sludge"
+
+/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
+ var/power = -0.00003 * (M.bodytemperature ** 2) + 3
+ if(M.bodytemperature < T0C)
+ M.adjustOxyLoss(-3 * power, 0)
+ M.adjustBruteLoss(-power, 0)
+ M.adjustFireLoss(-power, 0)
+ M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs
+ M.adjustCloneLoss(-power, 0)
+ for(var/i in M.all_wounds)
+ var/datum/wound/iter_wound = i
+ iter_wound.on_xadone(power)
+ REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration
+ . = 1
+ metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5)
+ ..()
+
+/datum/reagent/medicine/hunter_extract
+ name = "Hunter's Extract"
+ description = "An extract of floral compounds and exotic frontier bacteria. Heals the user in small doses, but is extremely toxic otherwise."
+ color = "#6B372E" //dark and red like lavaland
+ metabolization_rate = REAGENTS_METABOLISM * 0.5
+ overdose_threshold = 10
+
+/datum/reagent/medicine/hunter_extract/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ ADD_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC)
+ ..()
+
+/datum/reagent/medicine/hunter_extract/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC)
+ ..()
+
+/datum/reagent/medicine/hunter_extract/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-1*REM, 0)
+ M.adjustBruteLoss(-1*REM, 0)
+ M.adjustToxLoss(-1*REM, 0)
+ if(M.health <= M.crit_threshold)
+ M.adjustOxyLoss(-1*REM, 0)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/hunter_extract/overdose_process(mob/living/M) // Thanks to actioninja
+ if(prob(2) && iscarbon(M))
+ var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
+ var/obj/item/bodypart/bp = M.get_bodypart(selected_part)
+ if(bp)
+ M.visible_message(span_warning("[M] feels a spike of pain!!"), span_danger("You feel a spike of pain!!"))
+ bp.receive_damage(0, 0, 200)
+ else //SUCH A LUST FOR REVENGE!!!
+ to_chat(M, span_warning("A phantom limb hurts!"))
+ return ..()
+
+
+/datum/reagent/medicine/panacea
+ name = "Panacea"
+ description = "One of the developments of the frontier, Panacea is a term for a variety of mildly-anomalous substances usually found within Frontier space. Despite disparate origins, they all share a similar effect of slowly healing the body. Overdosing on them causes this effect to reverse."
+ reagent_state = LIQUID
+ color = "#DCDCDC"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+ var/healing = 1
+
+/datum/reagent/medicine/panacea/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-healing*REM, 0)
+ M.adjustOxyLoss(-healing*REM, 0)
+ M.adjustBruteLoss(-healing*REM, 0)
+ M.adjustFireLoss(-healing*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/panacea/overdose_process(mob/living/M)
+ M.adjustToxLoss(1.5*REM, 0)
+ M.adjustOxyLoss(1.5*REM, 0)
+ M.adjustBruteLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ M.adjustFireLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/panacea/effluvial
+ name = "Effluvial Panacea"
+ description = "A waste product of industrial processes to synthesize Panacea, or more often, an impure form, Effluvial Panacea has the same effects as true panacea, simply reduced in effectiveness."
+ color = "#d8c7b7"
+ healing = 0.2
+
+/datum/reagent/medicine/panacea/effluvial/on_mob_life(mob/living/carbon/M)
+ if(prob(25))
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/stimulants
+ name = "Indoril Stimulant"
+ description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage."
+ color = "#78008C"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 60
+
+/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
+ ..()
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
+ ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+
+/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
+ REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+ ..()
+
+/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
+ if(M.health < 50 && M.health > 0)
+ M.adjustOxyLoss(-1*REM, 0)
+ M.adjustToxLoss(-1*REM, 0)
+ M.adjustBruteLoss(-1*REM, 0)
+ M.adjustFireLoss(-1*REM, 0)
+ M.AdjustAllImmobility(-60)
+ M.adjustStaminaLoss(-5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/stimulants/overdose_process(mob/living/M)
+ if(prob(33))
+ M.adjustStaminaLoss(2.5*REM, 0)
+ M.adjustToxLoss(1*REM, 0)
+ M.losebreath++
+ . = 1
+ ..()
+
+/datum/reagent/medicine/cureall
+ name = "Cureall Solution"
+ description = "A diluted solution created from plasmatic binding of Alvitane, Indomide, and charcoal. Slowly restores all types of damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ taste_description = "still water"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/cureall/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-0.3*REM, 0)
+ M.adjustFireLoss(-0.3*REM, 0)
+ M.adjustToxLoss(-0.3*REM, 0)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/cureall/overdose_process(mob/living/M)
+ if(prob(50))
+ M.adjustBruteLoss(0.5*REM, 0)
+ M.adjustFireLoss(0.5*REM, 0)
+ M.adjustToxLoss(0.5*REM, 0)
+ . = 1
+ ..()
+
+/// CRIT REAGENTS ///
+
+/datum/reagent/medicine/epinephrine
+ name = "Epinephrine"
+ description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage."
+ reagent_state = LIQUID
+ color = "#D2FFFA"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type)
+
+/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/M)
+ REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type)
+ ..()
+
+/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M)
+ if(M.health <= M.crit_threshold)
+ M.adjustToxLoss(-0.5*REM, 0)
+ M.adjustBruteLoss(-0.5*REM, 0)
+ M.adjustFireLoss(-0.5*REM, 0)
+ M.adjustOxyLoss(-0.5*REM, 0)
+ if(M.losebreath >= 4)
+ M.losebreath -= 2
+ if(M.losebreath < 0)
+ M.losebreath = 0
+ M.adjustStaminaLoss(-0.5*REM, 0)
+ . = 1
+ if(prob(20))
+ M.AdjustAllImmobility(-20)
+ ..()
+
+/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M)
+ if(prob(33))
+ M.adjustStaminaLoss(2.5*REM, 0)
+ M.adjustToxLoss(1*REM, 0)
+ M.losebreath++
+ . = 1
+ ..()
+
+/datum/reagent/medicine/atropine
+ name = "Atropine"
+ description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients."
+ reagent_state = LIQUID
+ color = "#1D3535" //slightly more blue, like epinephrine
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 35
+
+/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M)
+ if(M.health <= M.crit_threshold)
+ M.adjustToxLoss(-2*REM, 0)
+ M.adjustBruteLoss(-2*REM, 0)
+ M.adjustFireLoss(-2*REM, 0)
+ M.adjustOxyLoss(-5*REM, 0)
+ . = 1
+ M.losebreath = 0
+ if(prob(20))
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/atropine/overdose_process(mob/living/M)
+ M.adjustToxLoss(0.5*REM, 0)
+ . = 1
+ M.set_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/dizziness, max_duration = 20 SECONDS)
+ ..()
+
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm
new file mode 100644
index 00000000000..0cb149911c6
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/misc_reagents.dm
@@ -0,0 +1,242 @@
+/*
+** really more "weird" reagents
+** one could even say strange ones
+*/
+
+/* Admin Reagent */
+
+/datum/reagent/medicine/adminordrazine
+ name = "Adminordrazine"
+ description = "It's magic. We don't have to explain it."
+ color = "#E0BB00" //golden for the gods
+ can_synth = FALSE
+ taste_description = "badmins"
+
+/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
+ M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
+ M.setCloneLoss(0, 0)
+ M.setOxyLoss(0, 0)
+ M.radiation = 0
+ M.heal_bodypart_damage(5,5)
+ M.adjustToxLoss(-5, 0, TRUE)
+ M.hallucination = 0
+ REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT))
+ M.set_blurriness(0)
+ M.set_blindness(0)
+ M.SetKnockdown(0)
+ M.SetStun(0)
+ M.SetUnconscious(0)
+ M.SetParalyzed(0)
+ M.SetImmobilized(0)
+ M.silent = FALSE
+ M.disgust = 0
+ M.drowsyness = 0
+ M.stuttering = 0
+ M.slurring = 0
+ M.confused = 0
+ M.set_sleeping(0)
+ M.remove_status_effect(/datum/status_effect/jitter)
+ M.remove_status_effect(/datum/status_effect/dizziness)
+ if(M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume = BLOOD_VOLUME_NORMAL
+
+ M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC)
+ for(var/organ in M.internal_organs)
+ var/obj/item/organ/O = organ
+ O.setOrganDamage(0)
+ for(var/thing in M.diseases)
+ var/datum/disease/D = thing
+ if(D.severity == DISEASE_SEVERITY_POSITIVE)
+ continue
+ D.cure()
+ ..()
+ . = 1
+
+/datum/reagent/medicine/adminordrazine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+ . = ..()
+ if(chems.has_reagent(type, 1))
+ mytray.adjustWater(round(chems.get_reagent_amount(type) * 1))
+ mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1))
+ mytray.adjustPests(-rand(1,5))
+ mytray.adjustWeeds(-rand(1,5))
+ if(chems.has_reagent(type, 3))
+ switch(rand(100))
+ if(66 to 100)
+ mytray.mutatespecie()
+ if(33 to 65)
+ mytray.mutateweed()
+ if(1 to 32)
+ mytray.mutatepest(user)
+ else
+ if(prob(20))
+ mytray.visible_message(span_warning("Nothing happens..."))
+
+/* Basically an anomalychem at this point */
+
+/datum/reagent/medicine/strange_reagent
+ name = "Strange Reagent"
+ description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living."
+ reagent_state = LIQUID
+ color = "#A0E85E"
+ metabolization_rate = 1.25 * REAGENTS_METABOLISM
+ taste_description = "magnets"
+ harmful = TRUE
+
+/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ if(M.stat != DEAD)
+ return ..()
+ if(iscarbon(M) && method != INGEST) //simplemobs can still be splashed
+ return ..()
+ var/amount_to_revive = round((M.getBruteLoss()+M.getFireLoss())/20)
+ if(M.getBruteLoss()+M.getFireLoss() >= 200 || HAS_TRAIT(M, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive.
+ M.visible_message(span_warning("[M]'s body convulses a bit, and then falls still once more."))
+ M.do_jitter_animation(10)
+ return
+ M.visible_message(span_warning("[M]'s body starts convulsing!"))
+ M.notify_ghost_cloning("Your body is being revived with Strange Reagent!")
+ M.do_jitter_animation(10)
+ var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79)
+ ..()
+
+/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M)
+ var/damage_at_random = rand(0,250)/100 //0 to 2.5
+ M.adjustBruteLoss(damage_at_random*REM, FALSE)
+ M.adjustFireLoss(damage_at_random*REM, FALSE)
+ ..()
+ . = TRUE
+
+/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+ . = ..()
+ if(chems.has_reagent(type, 5))
+ mytray.spawnplant()
+
+/* Stasis just freezes you. It's pretty misc */
+
+/datum/reagent/medicine/stasis
+ name = "Stasis"
+ description = "A liquid blue chemical that causes the body to enter a chemically induced stasis, irregardless of current state."
+ reagent_state = LIQUID
+ color = "#51b5cb" //a nice blue
+ overdose_threshold = 0
+
+/datum/reagent/medicine/stasis/expose_mob(mob/living/M, method=INJECT, reac_volume, show_message = 1)
+ if(method != INJECT)
+ return
+ if(iscarbon(M))
+ var/stasis_duration = min(20 SECONDS * reac_volume, 300 SECONDS)
+ to_chat(M, span_warning("Your body starts to slow down, sensation retreating from your limbs!"))
+ M.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT)
+ addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT), stasis_duration, TIMER_UNIQUE)
+
+/datum/reagent/medicine/stasis/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(1)
+ ..()
+ . = 1
+
+/* Rezadone is good for unhusking at this point */
+
+/datum/reagent/medicine/rezadone
+ name = "Rezadone"
+ description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage."
+ reagent_state = SOLID
+ color = "#669900" // rgb: 102, 153, 0
+ overdose_threshold = 30
+ taste_description = "fish"
+
+/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M)
+ M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
+ M.heal_bodypart_damage(1,1)
+ REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/rezadone/overdose_process(mob/living/M)
+ M.adjustToxLoss(1, 0)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/rezadone/expose_mob(mob/living/M, method=TOUCH, reac_volume)
+ . = ..()
+ if(iscarbon(M))
+ var/mob/living/carbon/patient = M
+ if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
+ patient.cure_husk("burn")
+ patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance."))
+
+
+//insulin
+/datum/reagent/medicine/insulin
+ name = "Insulin"
+ description = "Increases sugar depletion rates."
+ reagent_state = LIQUID
+ color = "#FFFFF0"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M)
+ if(M.AdjustSleeping(-20))
+ . = 1
+ M.reagents.remove_reagent(/datum/reagent/consumable/sugar, 3)
+ ..()
+
+/*
+** changeling reagents
+** there's only two so no file
+*/
+
+//used for changeling's adrenaline power
+/datum/reagent/medicine/changelingadrenaline
+ name = "Changeling Adrenaline"
+ description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
+ color = "#C1151D"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob)
+ ..()
+ M.AdjustAllImmobility(-20)
+ M.adjustStaminaLoss(-10, 0)
+ M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ return TRUE
+
+/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
+ ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L)
+ ..()
+ REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
+ REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ L.remove_status_effect(/datum/status_effect/dizziness)
+ L.remove_status_effect(/datum/status_effect/jitter)
+
+/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob)
+ M.adjustToxLoss(1, 0)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/changelinghaste
+ name = "Changeling Haste"
+ description = "Drastically increases movement speed, but deals toxin damage."
+ color = "#AE151D"
+ metabolization_rate = 1
+
+/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
+ ..()
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
+
+/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
+ ..()
+
+/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(2, 0)
+ ..()
+ return TRUE
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm
new file mode 100644
index 00000000000..8a2987d7970
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/organ_reagents.dm
@@ -0,0 +1,175 @@
+/* reagents that primarily interface with organ damage.
+** Things like oculine, incausiate
+*/
+
+
+/datum/reagent/medicine/oculine
+ name = "Oculine"
+ description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind."
+ reagent_state = LIQUID
+ color = "#404040" //oculine is dark grey,
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ taste_description = "dull toxin"
+
+/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M)
+ var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
+ if (!eyes)
+ return
+ eyes.applyOrganDamage(-2)
+ if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE))
+ if(prob(20))
+ to_chat(M, span_warning("Your vision slowly returns..."))
+ M.cure_blind(EYE_DAMAGE)
+ M.cure_nearsighted(EYE_DAMAGE)
+ M.blur_eyes(35)
+
+ else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE))
+ to_chat(M, span_warning("The blackness in your peripheral vision fades."))
+ M.cure_nearsighted(EYE_DAMAGE)
+ M.blur_eyes(10)
+ else if(M.eye_blind || M.eye_blurry)
+ M.set_blindness(0)
+ M.set_blurriness(0)
+ ..()
+
+/datum/reagent/medicine/inacusiate
+ name = "Inacusiate"
+ description = "Rapidly restores hearing to a patient, assuming the loss of hearing is not chronic."
+ color = "#606060" //inacusiate is light grey
+
+/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M)
+ var/obj/item/organ/ears/ears = M.getorganslot(ORGAN_SLOT_EARS)
+ if(!ears)
+ return
+ ears.adjustEarDamage(-4 * REM)
+ return ..()
+
+/datum/reagent/medicine/mannitol
+ name = "Mannitol"
+ description = "Efficiently restores brain damage."
+ color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey
+
+/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C)
+ C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM)
+ ..()
+
+/datum/reagent/medicine/neurine
+ name = "Neurine"
+ description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas."
+ color = "#C0C0C0" //ditto
+
+/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C)
+ if(C.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin))
+ C.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5)
+ if(prob(15))
+ C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
+ ..()
+
+/datum/reagent/medicine/corazone
+ // Heart attack code will not do damage if corazone is present
+ // because it's SPACE MAGIC ASPIRIN
+ name = "Corazone"
+ description = "A medication used to treat pain, fever, and inflammation, along with heart attacks. Can also be used to stabilize livers."
+ color = "#F49797"
+ self_consuming = TRUE
+
+/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_PAIN_RESIST, type)
+ ADD_TRAIT(M, TRAIT_STABLEHEART, type)
+ ADD_TRAIT(M, TRAIT_STABLELIVER, type)
+
+/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type)
+ REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
+ REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
+
+/datum/reagent/medicine/silibinin
+ name = "Silibinin"
+ description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver."
+ reagent_state = SOLID
+ color = "#FFFFD0"
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/silibinin/expose_mob(mob/living/carbon/M, method=INJECT, reac_volume)
+ if(method != INJECT)
+ return
+
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1) //on injection, will heal the liver. This will (hopefully) fix dead livers.
+
+ ..()
+
+/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented.
+ ..()
+ . = 1
+
+
+
+/*
+*How this medicine works:
+*Penthrite if you are not in crit only stabilizes your heart.
+*As soon as you pass crit threshold it's special effects kick in. Penthrite forces your heart to beat preventing you from entering
+*soft and hard crit, but there is a catch. During this you will be healed and you will sustain
+*heart damage that will not imapct you as long as penthrite is in your system.
+*If you reach the threshold of -60 HP penthrite stops working and you get a heart attack, penthrite is flushed from your system in that very moment,
+*causing you to loose your soft crit, hard crit and heart stabilization effects.
+*Overdosing on penthrite also causes a heart failure.
+*/
+
+/datum/reagent/medicine/penthrite
+ name = "Penthrite"
+ description = "An expensive medicine that aids with pumping blood around the body even without a heart, and prevents the heart from slowing down. It reacts violently with other emergency medication."
+ color = "#F5F5F5"
+ overdose_threshold = 50
+
+
+/datum/reagent/medicine/penthrite/on_mob_add(mob/living/M)
+ . = ..()
+ to_chat(M,"Your heart begins to beat with great force!")
+ ADD_TRAIT(M, TRAIT_STABLEHEART, type)
+ ADD_TRAIT(M, TRAIT_NOHARDCRIT,type)
+ ADD_TRAIT(M, TRAIT_NOSOFTCRIT,type)
+ M.crit_threshold = M.crit_threshold + HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping!
+
+
+/datum/reagent/medicine/penthrite/on_mob_life(mob/living/carbon/human/H)
+ H.adjustOrganLoss(ORGAN_SLOT_STOMACH,0.25)
+ if(H.health <= HEALTH_THRESHOLD_CRIT && H.health > H.crit_threshold) //we cannot save someone above our raised crit threshold.
+
+ H.adjustToxLoss(-2 * REM, 0)
+ H.adjustBruteLoss(-2 * REM, 0)
+ H.adjustFireLoss(-2 * REM, 0)
+ H.adjustOxyLoss(-6 * REM, 0)
+
+ H.losebreath = 0
+
+ H.adjustOrganLoss(ORGAN_SLOT_HEART,max(1,volume/10)) // your heart is barely keeping up!
+
+ H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ H.set_timed_status_effect(rand(0 SECONDS, 4 SECONDS) * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+
+
+ if(prob(33))
+ to_chat(H,span_danger("Your body is trying to give up, but your heart is still beating!"))
+
+ if(H.health <= H.crit_threshold) //certain death above this threshold
+ REMOVE_TRAIT(H, TRAIT_STABLEHEART, type) //we have to remove the stable heart before we give him heart attack
+ to_chat(H,span_danger("You feel something rupturing inside your chest!"))
+ H.force_scream()
+ H.set_heartattack(TRUE)
+ volume = 0
+ . = ..()
+
+/datum/reagent/medicine/penthrite/on_mob_end_metabolize(mob/living/M)
+ M.crit_threshold = M.crit_threshold - HEALTH_THRESHOLD_FULLCRIT*2 //your heart is still pumping!
+ REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
+ REMOVE_TRAIT(M, TRAIT_NOHARDCRIT,type)
+ REMOVE_TRAIT(M, TRAIT_NOSOFTCRIT,type)
+ . = ..()
+
+/datum/reagent/medicine/penthrite/overdose_process(mob/living/carbon/human/H)
+ REMOVE_TRAIT(H, TRAIT_STABLEHEART, type)
+ H.adjustStaminaLoss(10)
+ H.adjustOrganLoss(ORGAN_SLOT_HEART,10)
+ H.set_heartattack(TRUE)
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm
new file mode 100644
index 00000000000..eb65838be30
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/pain_reagents.dm
@@ -0,0 +1,369 @@
+/* Tramal - low power and lasts over a long period of time. Space Ibuprofen
+** Morphine - Medium intensity and less duration. Makes you sleepy.
+** Dimorlin - high intensity low duration. Analgesia
+** Miner's Salve - High intensity with some
+*/
+
+/datum/reagent/medicine/tramal
+ name = "Tramal"
+ description = "A low intensity, high duration painkiller. Causes slight drowiness in extended use."
+ reagent_state = LIQUID
+ color = "#34eeee"
+ metabolization_rate = 0.2 * REAGENTS_METABOLISM
+ overdose_threshold = 35
+ addiction_threshold = 30
+
+/datum/reagent/medicine/tramal/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
+
+/datum/reagent/medicine/tramal/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
+ ..()
+
+/datum/reagent/medicine/tramal/on_mob_life(mob/living/carbon/M)
+ if(current_cycle >= 5)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_light, name)
+ switch(current_cycle)
+ if(60)
+ to_chat(M, span_warning("You feel drowsy..."))
+ if(61 to INFINITY)
+ M.drowsyness += 1
+ ..()
+
+/datum/reagent/medicine/tramal/overdose_start(mob/living/M)
+ . = ..()
+ ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
+
+/datum/reagent/medicine/tramal/overdose_process(mob/living/M)
+ if(prob(33))
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/tramal/addiction_act_stage1(mob/living/M)
+ if(prob(33))
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/tramal/addiction_act_stage2(mob/living/M)
+ if(prob(33))
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/tramal/addiction_act_stage3(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/tramal/addiction_act_stage4(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(2*REM, 0)
+ . = 1
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+
+/datum/reagent/medicine/morphine
+ name = "Morphine"
+ description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal."
+ reagent_state = LIQUID
+ color = "#A9FBFB"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+ addiction_threshold = 25
+
+/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ if(ishuman(L))
+ var/mob/living/carbon/human/drugged = L
+ drugged.physiology.damage_resistance += 5
+
+/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ if(ishuman(L))
+ var/mob/living/carbon/human/drugged = L
+ drugged.physiology.damage_resistance -= 5
+ ..()
+
+/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M)
+ if(current_cycle >= 5)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name)
+ switch(current_cycle)
+ if(29)
+ to_chat(M, span_warning("You start to feel tired..."))
+ if(30 to 59)
+ M.drowsyness += 1
+ if(60 to INFINITY)
+ M.Sleeping(40)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/morphine/overdose_start(mob/living/M)
+ . = ..()
+ ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
+
+/datum/reagent/medicine/morphine/overdose_process(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(2*REM, 0)
+ . = 1
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(3*REM, 0)
+ . = 1
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/dimorlin
+ name = "Dimorlin"
+ description = "A powerful opiate-derivative analgesiac. Extremely habit forming"
+ reagent_state = LIQUID
+ color = "#71adad"
+ metabolization_rate = 0.4 * REAGENTS_METABOLISM
+ overdose_threshold = 15
+ addiction_threshold = 11
+
+/datum/reagent/medicine/dimorlin/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_ANALGESIA, type)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.set_screwyhud(SCREWYHUD_HEALTHY)
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ if(ishuman(L))
+ var/mob/living/carbon/human/drugged = L
+ drugged.physiology.damage_resistance += 15
+
+/datum/reagent/medicine/dimorlin/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_ANALGESIA, type)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.set_screwyhud(SCREWYHUD_NONE)
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+ if(ishuman(L))
+ var/mob/living/carbon/human/drugged = L
+ drugged.physiology.damage_resistance -= 15
+ ..()
+
+/datum/reagent/medicine/dimorlin/on_mob_life(mob/living/carbon/C)
+ C.set_screwyhud(SCREWYHUD_HEALTHY)
+ if(current_cycle >= 3)
+ SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name)
+ ..()
+
+/datum/reagent/medicine/dimorlin/overdose_start(mob/living/M)
+ . = ..()
+ ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
+
+/datum/reagent/medicine/dimorlin/overdose_process(mob/living/M)
+ if(prob(33))
+ M.losebreath++
+ M.adjustOxyLoss(4, 0)
+ if(prob(20))
+ M.AdjustUnconscious(20)
+ if(prob(5))
+ M.adjustOrganLoss(ORGAN_SLOT_EYES, 5)
+ ..()
+
+/datum/reagent/medicine/dimorlin/addiction_act_stage1(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/dimorlin/addiction_act_stage2(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ M.set_timed_status_effect(3 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/dimorlin/addiction_act_stage3(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(2*REM, 0)
+ . = 1
+ M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/dimorlin/addiction_act_stage4(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(3*REM, 0)
+ . = 1
+ M.set_timed_status_effect(5 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ ..()
+
+/datum/reagent/medicine/mine_salve
+ name = "Miner's Salve"
+ description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed."
+ reagent_state = LIQUID
+ color = "#6D6374"
+ metabolization_rate = 0.4 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
+ C.set_screwyhud(SCREWYHUD_HEALTHY)
+ C.adjustBruteLoss(-0.25*REM, 0)
+ C.adjustFireLoss(-0.25*REM, 0)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/mine_salve/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjust_nutrition(-5)
+ if(show_message)
+ to_chat(M, span_warning("Your stomach feels empty and cramps!"))
+ else
+ var/mob/living/carbon/C = M
+ for(var/s in C.surgeries)
+ var/datum/surgery/S = s
+ S.speed_modifier = max(0.1, S.speed_modifier)
+
+ if(show_message)
+ to_chat(M, span_danger("You feel your wounds fade away to nothing!") )
+ ..()
+
+/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_ANALGESIA, type)
+ if(iscarbon(L))
+ var/mob/living/carbon/C = L
+ C.set_screwyhud(SCREWYHUD_HEALTHY)
+
+/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M)
+ if(iscarbon(M))
+ var/mob/living/carbon/N = M
+ REMOVE_TRAIT(N, TRAIT_ANALGESIA, type)
+ N.set_screwyhud(SCREWYHUD_NONE)
+ ..()
+
+
+/datum/reagent/medicine/carfencadrizine
+ name = "Carfencadrizine"
+ description = "A highly potent synthetic painkiller held in a suspension of stimulating agents. Allows people to keep moving long beyond when they should stop."
+ color = "#859480"
+ overdose_threshold = 8
+ addiction_threshold = 7
+ metabolization_rate = 0.1
+
+/datum/reagent/medicine/carfencadrizine/on_mob_metabolize(mob/living/L)
+ . = ..()
+ ADD_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine)
+ ADD_TRAIT(L, TRAIT_PINPOINT_EYES, type)
+ ADD_TRAIT(L, TRAIT_NOSOFTCRIT, type)
+ ADD_TRAIT(L, TRAIT_NOHARDCRIT, type)
+
+/datum/reagent/medicine/carfencadrizine/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ REMOVE_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine)
+ REMOVE_TRAIT(L, TRAIT_PINPOINT_EYES, type)
+ REMOVE_TRAIT(L, TRAIT_NOSOFTCRIT, type)
+ REMOVE_TRAIT(L, TRAIT_NOHARDCRIT, type)
+
+/datum/reagent/medicine/carfencadrizine/on_mob_life(mob/living/carbon/M)
+ if(current_cycle >= 3)
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name)
+
+ if(M.health <= M.crit_threshold)
+ if(prob(20))
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 4)
+ if(prob(40))
+ M.playsound_local(get_turf(M), 'sound/health/slowbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
+ ..()
+
+/datum/reagent/medicine/carfencadrizine/overdose_process(mob/living/M)
+ if(prob(66))
+ M.losebreath++
+ M.adjustOxyLoss(4, 0)
+ if(prob(40))
+ M.AdjustUnconscious(20)
+ if(prob(10))
+ M.adjustOrganLoss(ORGAN_SLOT_EYES, 3)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 7)
+ ..()
+
+/datum/reagent/medicine/carfencadrizine/addiction_act_stage1(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
+ ..()
+
+/datum/reagent/medicine/carfencadrizine/addiction_act_stage2(mob/living/M)
+ if(prob(33))
+ M.drop_all_held_items()
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ if(prob(15))
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 1)
+ ..()
+
+/datum/reagent/medicine/carfencadrizine/addiction_act_stage3(mob/living/M)
+ if(prob(50))
+ M.drop_all_held_items()
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ if(prob(30))
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 2)
+ ..()
+
+/datum/reagent/medicine/carfencadrizine/addiction_act_stage4(mob/living/M)
+ if(prob(60))
+ M.drop_all_held_items()
+ M.adjustToxLoss(1*REM, 0)
+ . = 1
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ if(prob(40))
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 2)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 2)
+ ..()
+
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm
new file mode 100644
index 00000000000..d920ecf8886
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/status_reagents.dm
@@ -0,0 +1,330 @@
+//reagents relating to status effects
+//i.e. jitter, drunk, dizzy
+
+//I consider disease a status
+/datum/reagent/medicine/spaceacillin
+ name = "Spaceacillin"
+ description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with."
+ color = "#E1F2E6"
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/mutadone
+ name = "Mutadone"
+ description = "Removes jitteriness and restores genetic defects."
+ color = "#5096C8"
+ taste_description = "acid"
+
+/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M)
+ M.adjust_timed_status_effect(-100 SECONDS * REM, /datum/status_effect/jitter)
+ if(M.has_dna())
+ M.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE)
+ if(!QDELETED(M)) //We were a monkey, now a human
+ ..()
+
+/datum/reagent/medicine/antihol
+ name = "Antihol"
+ description = "Purges alcoholic substance from the patient's body and eliminates its side effects."
+ color = "#00B4C8"
+ taste_description = "raw egg"
+
+/datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M)
+ M.remove_status_effect(/datum/status_effect/dizziness)
+ M.drowsyness = 0
+ M.slurring = 0
+ M.confused = 0
+ M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1)
+ M.adjustToxLoss(-0.2*REM, 0)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.adjust_drunk_effect(-10)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/diphenhydramine
+ name = "Diphenhydramine"
+ description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness."
+ reagent_state = LIQUID
+ color = "#64FFE6"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M)
+ if(prob(10))
+ M.drowsyness += 1
+ M.adjust_timed_status_effect(-12 SECONDS, /datum/status_effect/jitter)
+ M.reagents.remove_reagent(/datum/reagent/toxin/histamine,3)
+ ..()
+
+
+/datum/reagent/medicine/haloperidol
+ name = "Haloperidol"
+ description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage."
+ reagent_state = LIQUID
+ color = "#27870a"
+ metabolization_rate = 0.4 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M)
+ for(var/datum/reagent/drug/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,5)
+ M.drowsyness += 2
+ if(M.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS)
+ M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter)
+ if (M.hallucination >= 5)
+ M.hallucination -= 5
+ if(prob(20))
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50)
+ M.adjustStaminaLoss(2.5*REM, 0)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/modafinil
+ name = "Modafinil"
+ description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with."
+ reagent_state = LIQUID
+ color = "#BEF7D8" // palish blue white
+ metabolization_rate = 0.1 * REAGENTS_METABOLISM
+ overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested)
+ taste_description = "salt" // it actually does taste salty
+ var/overdose_progress = 0 // to track overdose progress
+
+/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M)
+ ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type)
+ ..()
+
+/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type)
+ ..()
+
+/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M)
+ if(!overdosed) // We do not want any effects on OD
+ overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun
+ M.AdjustAllImmobility(-5)
+ M.adjustStaminaLoss(-0.5*REM, 0)
+ M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 20 SECONDS)
+ metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick
+ . = TRUE
+ ..()
+
+/datum/reagent/medicine/modafinil/overdose_start(mob/living/M)
+ to_chat(M, span_userdanger("You feel awfully out of breath and jittery!"))
+ metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.01 per tick on overdose
+
+/datum/reagent/medicine/modafinil/overdose_process(mob/living/M)
+ overdose_progress++
+ switch(overdose_progress)
+ if(1 to 40)
+ M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS)
+ M.stuttering = min(M.stuttering+1, 10)
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ if(prob(50))
+ M.losebreath++
+ if(41 to 80)
+ M.adjustOxyLoss(0.1*REM, 0)
+ M.adjustStaminaLoss(0.1*REM, 0)
+ M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS)
+ M.stuttering = min(M.stuttering+1, 20)
+ M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
+ if(prob(50))
+ M.losebreath++
+ if(prob(20))
+ to_chat(M, span_userdanger("You have a sudden fit!"))
+ M.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used
+ if(81)
+ to_chat(M, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal
+ M.adjustOxyLoss(0.1*REM, 0)
+ M.adjustStaminaLoss(0.1*REM, 0)
+ if(82 to INFINITY)
+ M.Sleeping(100)
+ M.adjustOxyLoss(1.5*REM, 0)
+ M.adjustStaminaLoss(1.5*REM, 0)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/synaptizine
+ name = "Synaptizine"
+ description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations."
+ color = "#FF00FF"
+
+/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M)
+ M.drowsyness = max(M.drowsyness-5, 0)
+ M.AdjustStun(-20)
+ M.AdjustKnockdown(-20)
+ M.AdjustUnconscious(-20)
+ M.AdjustImmobilized(-20)
+ M.AdjustParalyzed(-20)
+ if(M.has_reagent(/datum/reagent/toxin/mindbreaker))
+ M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
+ M.hallucination = max(0, M.hallucination - 10)
+ if(prob(30))
+ M.adjustToxLoss(1, 0)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/synaphydramine
+ name = "Diphen-Synaptizine"
+ description = "Reduces drowsiness, hallucinations, and Histamine from body."
+ color = "#EC536D" // rgb: 236, 83, 109
+
+/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M)
+ M.drowsyness = max(M.drowsyness-5, 0)
+ if(M.has_reagent(/datum/reagent/toxin/mindbreaker))
+ M.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
+ if(M.has_reagent(/datum/reagent/toxin/histamine))
+ M.remove_reagent(/datum/reagent/toxin/histamine, 5)
+ M.hallucination = max(0, M.hallucination - 10)
+ if(prob(30))
+ M.adjustToxLoss(1, 0)
+ . = 1
+ ..()
+
+
+//"Mood is status" declared Erika
+
+/datum/reagent/medicine/lithium_carbonate
+ name = "Lithium Carbonate"
+ description = "A mood stabilizer discovered by most spacefaring civilizations. Fairly widespread as a result."
+ color = "#b3acaa" //grey. boring.
+ reagent_state = SOLID
+ metabolization_rate = REAGENTS_METABOLISM * 0.5
+ overdose_threshold = 20
+
+/datum/reagent/medicine/lithium_carbonate/on_mob_life(mob/living/carbon/M)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
+ if(mood.sanity <= SANITY_GREAT)
+ mood.setSanity(min(mood.sanity+5, SANITY_GREAT))
+ ..()
+ . = 1
+
+/datum/reagent/medicine/lithium_carbonate/overdose_process(mob/living/M)
+ if(prob(5))
+ M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/psicodine
+ name = "Psicodine"
+ description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage."
+ reagent_state = LIQUID
+ color = "#07E79E"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+
+/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L)
+ ..()
+ ADD_TRAIT(L, TRAIT_FEARLESS, type)
+
+/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/L)
+ REMOVE_TRAIT(L, TRAIT_FEARLESS, type)
+ ..()
+
+/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M)
+ M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter)
+ M.adjust_timed_status_effect(-12 SECONDS * REM, /datum/status_effect/dizziness)
+ M.confused = max(0, M.confused-6)
+ M.disgust = max(0, M.disgust-6)
+ var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
+ if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then...
+ mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral
+ ..()
+ . = 1
+
+/datum/reagent/medicine/psicodine/overdose_process(mob/living/M)
+ M.hallucination = min(max(0, M.hallucination + 5), 60)
+ M.adjustToxLoss(1, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/ephedrine
+ name = "Ephedrine"
+ description = "Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing."
+ reagent_state = LIQUID
+ color = "#D2FFFA"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 30
+ addiction_threshold = 25
+
+/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L)
+ ..()
+ L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
+ ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+
+/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L)
+ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
+ REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
+ ..()
+
+/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
+ if(prob(20) && iscarbon(M))
+ var/obj/item/I = M.get_active_held_item()
+ if(I && M.dropItemToGround(I))
+ to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!"))
+ M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
+
+ M.AdjustAllImmobility(-20)
+ M.adjustStaminaLoss(-1*REM, FALSE)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M)
+ if(prob(2) && iscarbon(M))
+ var/datum/disease/D = new /datum/disease/heart_failure
+ M.ForceContractDisease(D)
+ to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there.."))
+ M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
+
+ if(prob(7))
+ to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]"))
+
+ if(prob(33))
+ M.adjustToxLoss(1*REM, 0)
+ M.losebreath++
+ . = 1
+ return TRUE
+
+/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M)
+ if(prob(3) && iscarbon(M))
+ M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
+ M.Unconscious(100)
+ M.set_timed_status_effect(120 SECONDS, /datum/status_effect/jitter)
+
+ if(prob(33))
+ M.adjustToxLoss(2*REM, 0)
+ M.losebreath += 2
+ . = 1
+ ..()
+
+/datum/reagent/medicine/ephedrine/addiction_act_stage2(mob/living/M)
+ if(prob(6) && iscarbon(M))
+ M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
+ M.Unconscious(100)
+ M.set_timed_status_effect(240 SECONDS, /datum/status_effect/jitter)
+
+ if(prob(33))
+ M.adjustToxLoss(3*REM, 0)
+ M.losebreath += 3
+ . = 1
+ ..()
+
+/datum/reagent/medicine/ephedrine/addiction_act_stage3(mob/living/M)
+ if(prob(12) && iscarbon(M))
+ M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
+ M.Unconscious(100)
+ M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter)
+
+ if(prob(33))
+ M.adjustToxLoss(4*REM, 0)
+ M.losebreath += 4
+ . = 1
+ ..()
+
+/datum/reagent/medicine/ephedrine/addiction_act_stage4(mob/living/M)
+ if(prob(24) && iscarbon(M))
+ M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
+ M.Unconscious(100)
+ M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter)
+
+ if(prob(33))
+ M.adjustToxLoss(5*REM, 0)
+ M.losebreath += 5
+ . = 1
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm
new file mode 100644
index 00000000000..fa644a7a25d
--- /dev/null
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/wound_reagents.dm
@@ -0,0 +1,27 @@
+/* Medicines that interface with wounds first and foremost
+**
+*/
+
+/datum/reagent/medicine/bonefixingjuice
+ name = "C4L-Z1UM Agent"
+ description = "A peculiar substance capable of instantly regenerating live tissue."
+ taste_description = "milk"
+ metabolization_rate = 0
+
+/datum/reagent/medicine/bonefixingjuice/on_mob_life(mob/living/M)
+ var/mob/living/carbon/C = M
+ switch(current_cycle)
+ if(1 to 10)
+ if(C.drowsyness < 10)
+ C.drowsyness += 2
+ if(11 to 30)
+ C.adjustStaminaLoss(5)
+ if(31 to INFINITY)
+ C.AdjustSleeping(40)
+ //formerly everything-fixing juice
+ for(var/datum/wound/blunt/broken_bone in C.all_wounds)
+ broken_bone.remove_wound()
+ for(var/obj/item/organ/O in C.internal_organs)
+ O.damage = 0
+ holder.remove_reagent(/datum/reagent/medicine/bonefixingjuice, 10)
+ ..()
diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
deleted file mode 100644
index 4a7cda6927a..00000000000
--- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm
+++ /dev/null
@@ -1,2562 +0,0 @@
-#define PERF_BASE_DAMAGE 0.5
-
-//////////////////////////////////////////////////////////////////////////////////////////
- // MEDICINE REAGENTS
-//////////////////////////////////////////////////////////////////////////////////////
-
-// where all the reagents related to medicine go.
-
-/datum/reagent/medicine
- name = "Medicine"
- taste_description = "bitterness"
- category = "Medicine"
-
-/datum/reagent/medicine/on_mob_life(mob/living/carbon/M)
- current_cycle++
- holder.remove_reagent(type, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism
-
-/datum/reagent/medicine/leporazine
- name = "Leporazine"
- description = "Leporazine will effectively regulate a patient's body temperature, ensuring it never leaves safe levels."
- color = "#DB90C6"
-
-/datum/reagent/medicine/leporazine/on_mob_life(mob/living/carbon/M)
- if(M.bodytemperature > M.get_body_temp_normal(apply_change=FALSE))
- M.adjust_bodytemperature(-4 * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal(apply_change=FALSE))
- else if(M.bodytemperature < (M.get_body_temp_normal(apply_change=FALSE) + 1))
- M.adjust_bodytemperature(4 * TEMPERATURE_DAMAGE_COEFFICIENT, 0, M.get_body_temp_normal(apply_change=FALSE))
- ..()
-
-/datum/reagent/medicine/adminordrazine //An OP chemical for admins
- name = "Adminordrazine"
- description = "It's magic. We don't have to explain it."
- color = "#E0BB00" //golden for the gods
- can_synth = FALSE
- taste_description = "badmins"
-
-/datum/reagent/medicine/adminordrazine/on_mob_life(mob/living/carbon/M)
- M.reagents.remove_all_type(/datum/reagent/toxin, 5*REM, 0, 1)
- M.setCloneLoss(0, 0)
- M.setOxyLoss(0, 0)
- M.radiation = 0
- M.heal_bodypart_damage(5,5)
- M.adjustToxLoss(-5, 0, TRUE)
- M.hallucination = 0
- REMOVE_TRAITS_NOT_IN(M, list(SPECIES_TRAIT, ROUNDSTART_TRAIT, ORGAN_TRAIT))
- M.set_blurriness(0)
- M.set_blindness(0)
- M.SetKnockdown(0)
- M.SetStun(0)
- M.SetUnconscious(0)
- M.SetParalyzed(0)
- M.SetImmobilized(0)
- M.silent = FALSE
- M.disgust = 0
- M.drowsyness = 0
- M.stuttering = 0
- M.slurring = 0
- M.confused = 0
- M.set_sleeping(0)
- M.remove_status_effect(/datum/status_effect/jitter)
- M.remove_status_effect(/datum/status_effect/dizziness)
- if(M.blood_volume < BLOOD_VOLUME_NORMAL)
- M.blood_volume = BLOOD_VOLUME_NORMAL
-
- M.cure_all_traumas(TRAUMA_RESILIENCE_MAGIC)
- for(var/organ in M.internal_organs)
- var/obj/item/organ/O = organ
- O.setOrganDamage(0)
- for(var/thing in M.diseases)
- var/datum/disease/D = thing
- if(D.severity == DISEASE_SEVERITY_POSITIVE)
- continue
- D.cure()
- ..()
- . = 1
-
-/datum/reagent/medicine/adminordrazine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
- . = ..()
- if(chems.has_reagent(type, 1))
- mytray.adjustWater(round(chems.get_reagent_amount(type) * 1))
- mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1))
- mytray.adjustPests(-rand(1,5))
- mytray.adjustWeeds(-rand(1,5))
- if(chems.has_reagent(type, 3))
- switch(rand(100))
- if(66 to 100)
- mytray.mutatespecie()
- if(33 to 65)
- mytray.mutateweed()
- if(1 to 32)
- mytray.mutatepest(user)
- else
- if(prob(20))
- mytray.visible_message(span_warning("Nothing happens..."))
-
-/datum/reagent/medicine/adminordrazine/quantum_heal
- name = "Quantum Medicine"
- description = "Rare and experimental particles, that apparently swap the user's body with one from an alternate dimension where it's completely healthy."
- taste_description = "science"
-
-/datum/reagent/medicine/synaptizine
- name = "Synaptizine"
- description = "Increases resistance to stuns as well as reducing drowsiness and hallucinations."
- color = "#FF00FF"
-
-/datum/reagent/medicine/synaptizine/on_mob_life(mob/living/carbon/M)
- M.drowsyness = max(M.drowsyness-5, 0)
- M.AdjustStun(-20)
- M.AdjustKnockdown(-20)
- M.AdjustUnconscious(-20)
- M.AdjustImmobilized(-20)
- M.AdjustParalyzed(-20)
- if(M.has_reagent(/datum/reagent/toxin/mindbreaker))
- M.reagents.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
- M.hallucination = max(0, M.hallucination - 10)
- if(prob(30))
- M.adjustToxLoss(1, 0)
- . = 1
- ..()
-
-/datum/reagent/medicine/synaphydramine
- name = "Diphen-Synaptizine"
- description = "Reduces drowsiness, hallucinations, and Histamine from body."
- color = "#EC536D" // rgb: 236, 83, 109
-
-/datum/reagent/medicine/synaphydramine/on_mob_life(mob/living/carbon/M)
- M.drowsyness = max(M.drowsyness-5, 0)
- if(M.has_reagent(/datum/reagent/toxin/mindbreaker))
- M.remove_reagent(/datum/reagent/toxin/mindbreaker, 5)
- if(M.has_reagent(/datum/reagent/toxin/histamine))
- M.remove_reagent(/datum/reagent/toxin/histamine, 5)
- M.hallucination = max(0, M.hallucination - 10)
- if(prob(30))
- M.adjustToxLoss(1, 0)
- . = 1
- ..()
-
-/datum/reagent/medicine/cryoxadone
- name = "Cryoxadone"
- description = "A chemical mixture with almost magical healing powers. Its main limitation is that the patient's body temperature must be under 270K for it to metabolise correctly."
- color = "#0000C8"
- taste_description = "sludge"
-
-/datum/reagent/medicine/cryoxadone/on_mob_life(mob/living/carbon/M)
- var/power = -0.00003 * (M.bodytemperature ** 2) + 3
- if(M.bodytemperature < T0C)
- M.adjustOxyLoss(-3 * power, 0)
- M.adjustBruteLoss(-power, 0)
- M.adjustFireLoss(-power, 0)
- M.adjustToxLoss(-power, 0, TRUE) //heals TOXINLOVERs
- M.adjustCloneLoss(-power, 0)
- for(var/i in M.all_wounds)
- var/datum/wound/iter_wound = i
- iter_wound.on_xadone(power)
- REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC) //fixes common causes for disfiguration
- . = 1
- metabolization_rate = REAGENTS_METABOLISM * (0.00001 * (M.bodytemperature ** 2) + 0.5)
- ..()
-
-/datum/reagent/medicine/clonexadone
- name = "Clonexadone"
- description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone."
- color = "#3D3DC6"
- taste_description = "muscle"
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M)
- if(M.bodytemperature < T0C)
- M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0)
- REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
- . = 1
- metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75)
- ..()
-
-/datum/reagent/medicine/pyroxadone
- name = "Pyroxadone"
- description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation."
- color = "#f7832a"
- taste_description = "spicy jelly"
-
-/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M)
- . = ..()
-
- var/bodytemp = M.bodytemperature
- var/heatlimit = M.dna.species.bodytemp_heat_damage_limit
-
- if(bodytemp < heatlimit)
- return .
-
- var/power = 0
-
- if(bodytemp < 400)
- power = 2
-
- else if(bodytemp < 460)
- power = 3
-
- else
- power = 5
-
- if(M.on_fire)
- power *= 2
-
- M.adjustOxyLoss(-2 * power, 0)
- M.adjustBruteLoss(-power, 0)
- M.adjustFireLoss(-1.5 * power, 0)
- M.adjustToxLoss(-power, 0, TRUE)
- M.adjustCloneLoss(-power, 0)
- for(var/i in M.all_wounds)
- var/datum/wound/iter_wound = i
- iter_wound.on_xadone(power)
- REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
-
-/datum/reagent/medicine/rezadone
- name = "Rezadone"
- description = "A powder derived from fish toxin, Rezadone can effectively treat genetic damage as well as restoring minor wounds. Overdose will cause intense nausea and minor toxin damage."
- reagent_state = SOLID
- color = "#669900" // rgb: 102, 153, 0
- overdose_threshold = 30
- taste_description = "fish"
-
-/datum/reagent/medicine/rezadone/on_mob_life(mob/living/carbon/M)
- M.setCloneLoss(0) //Rezadone is almost never used in favor of cryoxadone. Hopefully this will change that.
- M.heal_bodypart_damage(1,1)
- REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/rezadone/overdose_process(mob/living/M)
- M.adjustToxLoss(1, 0)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
- . = 1
-
-/datum/reagent/medicine/rezadone/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- . = ..()
- if(iscarbon(M))
- var/mob/living/carbon/patient = M
- if(reac_volume >= 5 && HAS_TRAIT_FROM(patient, TRAIT_HUSK, "burn") && patient.getFireLoss() < THRESHOLD_UNHUSK) //One carp yields 12u rezadone.
- patient.cure_husk("burn")
- patient.visible_message(span_nicegreen("[patient]'s body rapidly absorbs moisture from the enviroment, taking on a more healthy appearance."))
-
-/datum/reagent/medicine/spaceacillin
- name = "Spaceacillin"
- description = "Spaceacillin will prevent a patient from conventionally spreading any diseases they are currently infected with."
- color = "#E1F2E6"
- metabolization_rate = 0.1 * REAGENTS_METABOLISM
-
-//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects.
-/datum/reagent/medicine/silver_sulfadiazine
- name = "Silver Sulfadiazine"
- description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- overdose_threshold = 45
-
-/datum/reagent/medicine/silver_sulfadiazine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustToxLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You don't feel so good..."))
- else if(M.getFireLoss())
- M.adjustFireLoss(-reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your burns healing! It stings like hell!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your burns throbbing."))
- ..()
-
-/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M)
- M.adjustFireLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxandrolone
- name = "Oxandrolone"
- description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns."
- reagent_state = LIQUID
- color = "#1E8BFF"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
-
-/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
- if(M.getFireLoss() > 25)
- M.adjustFireLoss(-4*REM, 0) //Twice as effective as AIURI for severe burns
- else
- M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
- ..()
- . = 1
-
-/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
- if(M.getFireLoss()) //It only makes existing burns worse
- M.adjustFireLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
- . = 1
- ..()
-
-/datum/reagent/medicine/styptic_powder
- name = "Styptic Powder"
- description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#FF9696"
- overdose_threshold = 45
-
-/datum/reagent/medicine/styptic_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustToxLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You don't feel so good..."))
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your bruises healing! It stings like hell!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your bruises throbbing."))
- ..()
-
-
-/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M)
- M.adjustBruteLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/salglu_solution
- name = "Saline-Glucose Solution"
- description = "Has a 33% chance per metabolism cycle to heal brute and burn damage. Can be used as a temporary blood substitute."
- reagent_state = LIQUID
- color = "#DCDCDC"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 60
- taste_description = "sweetness and salt"
- var/last_added = 0
- var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active
- var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick
-
-/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M)
- if(last_added)
- M.blood_volume -= last_added
- last_added = 0
- if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level.
- var/amount_to_add = min(M.blood_volume, volume*5)
- var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable)
- last_added = new_blood_level - M.blood_volume
- M.blood_volume = new_blood_level + extra_regen
- if(prob(33))
- M.adjustBruteLoss(-0.5*REM, 0)
- M.adjustFireLoss(-0.5*REM, 0)
- . = TRUE
- ..()
-
-/datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M)
- if(prob(3))
- to_chat(M, span_warning("You feel salty."))
- holder.add_reagent(/datum/reagent/consumable/sodiumchloride, 1)
- holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5)
- else if(prob(3))
- to_chat(M, span_warning("You feel sweet."))
- holder.add_reagent(/datum/reagent/consumable/sugar, 1)
- holder.remove_reagent(/datum/reagent/medicine/salglu_solution, 0.5)
- if(prob(33))
- M.adjustBruteLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- M.adjustFireLoss(0.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- . = TRUE
- ..()
-
-/datum/reagent/medicine/mine_salve
- name = "Miner's Salve"
- description = "A powerful painkiller. Restores bruising and burns in addition to making the patient believe they are fully healed."
- reagent_state = LIQUID
- color = "#6D6374"
- metabolization_rate = 0.4 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/mine_salve/on_mob_life(mob/living/carbon/C)
- C.set_screwyhud(SCREWYHUD_HEALTHY)
- C.adjustBruteLoss(-0.25*REM, 0)
- C.adjustFireLoss(-0.25*REM, 0)
- ..()
- return TRUE
-
-/datum/reagent/medicine/mine_salve/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjust_nutrition(-5)
- if(show_message)
- to_chat(M, span_warning("Your stomach feels empty and cramps!"))
- else
- var/mob/living/carbon/C = M
- for(var/s in C.surgeries)
- var/datum/surgery/S = s
- S.speed_modifier = max(0.1, S.speed_modifier)
-
- if(show_message)
- to_chat(M, span_danger("You feel your wounds fade away to nothing!") )
- ..()
-
-/datum/reagent/medicine/mine_salve/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_ANALGESIA, type)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.set_screwyhud(SCREWYHUD_HEALTHY)
-
-/datum/reagent/medicine/mine_salve/on_mob_end_metabolize(mob/living/M)
- if(iscarbon(M))
- var/mob/living/carbon/N = M
- REMOVE_TRAIT(N, TRAIT_ANALGESIA, type)
- N.set_screwyhud(SCREWYHUD_NONE)
- ..()
-
-/datum/reagent/medicine/synthflesh
- name = "Synthflesh"
- description = "Has a 100% chance of instantly healing brute and burn damage. One unit of the chemical will heal one point of damage. Touch application only."
- reagent_state = LIQUID
- color = "#FFEBEB"
-
-/datum/reagent/medicine/synthflesh/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
- if(iscarbon(M))
- var/mob/living/carbon/carbies = M
- if (carbies.stat == DEAD)
- show_message = 0
- if(method in list(PATCH, TOUCH, SMOKE))
- var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
- var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
- for(var/i in carbies.all_wounds)
- var/datum/wound/iter_wound = i
- iter_wound.on_synthflesh(reac_volume)
- carbies.adjustToxLoss((harmies+burnies)*0.66)
- if(show_message)
- to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!"))
- SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/synthflesh) + reac_volume >= 100))
- carbies.cure_husk("burn")
- carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something
- ..()
- return TRUE
-
-/datum/reagent/medicine/charcoal
- name = "Charcoal"
- description = "Heals toxin damage as well as slowly removing any other chemicals the patient has in their bloodstream."
- reagent_state = LIQUID
- color = "#000000"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- taste_description = "ash"
- process_flags = ORGANIC //WS Edit - IPCs
-
-/datum/reagent/medicine/charcoal/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-2*REM, 0)
- . = 1
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.type,1)
- ..()
-
-/datum/reagent/medicine/charcoal/on_transfer(atom/A, method=TOUCH, volume)
- if(method == INGEST || !iscarbon(A)) //the atom not the charcoal
- return
- A.reagents.remove_reagent(/datum/reagent/medicine/charcoal/, volume) //We really should not be injecting an insoluble granular material.
- A.reagents.add_reagent(/datum/reagent/carbon, volume) // Its pores would get clogged with gunk anyway.
- ..()
-
-/datum/reagent/medicine/system_cleaner
- name = "System Cleaner"
- description = "Neutralizes harmful chemical compounds inside synthetic systems."
- reagent_state = LIQUID
- color = "#F1C40F"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- process_flags = SYNTHETIC //WS Edit - IPCs
-
-/datum/reagent/medicine/system_cleaner/on_mob_life(mob/living/M)
- M.adjustToxLoss(-2*REM, 0)
- . = 1
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.type,1)
- ..()
-
-/datum/reagent/medicine/liquid_solder
- name = "Liquid Solder"
- description = "Repairs brain damage in synthetics."
- color = "#727272"
- taste_description = "metallic"
- process_flags = SYNTHETIC //WS Edit - IPCs
-
-/datum/reagent/medicine/liquid_solder/on_mob_life(mob/living/M)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -3*REM)
- if(iscarbon(M))
- var/mob/living/carbon/C = M
- if(prob(30) && C.has_trauma_type(BRAIN_TRAUMA_SPECIAL))
- C.cure_trauma_type(BRAIN_TRAUMA_SPECIAL)
- if(prob(10) && C.has_trauma_type(BRAIN_TRAUMA_MILD))
- C.cure_trauma_type(BRAIN_TRAUMA_MILD)
- ..()
-
-/datum/reagent/medicine/omnizine
- name = "Omnizine"
- description = "Slowly heals all damage types. Overdose will cause damage in all types instead."
- reagent_state = LIQUID
- color = "#DCDCDC"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
- var/healing = 0.5
-
-/datum/reagent/medicine/omnizine/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-healing*REM, 0)
- M.adjustOxyLoss(-healing*REM, 0)
- M.adjustBruteLoss(-healing*REM, 0)
- M.adjustFireLoss(-healing*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/omnizine/overdose_process(mob/living/M)
- M.adjustToxLoss(1.5*REM, 0)
- M.adjustOxyLoss(1.5*REM, 0)
- M.adjustBruteLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- M.adjustFireLoss(1.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/omnizine/protozine
- name = "Protozine"
- description = "A less environmentally friendly and somewhat weaker variant of omnizine."
- color = "#d8c7b7"
- healing = 0.2
-
-/datum/reagent/medicine/calomel
- name = "Calomel"
- description = "Quickly purges the body of all chemicals. Toxin damage is dealt if the patient is in good condition."
- reagent_state = LIQUID
- color = "#19C832"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- taste_description = "acid"
-
-/datum/reagent/medicine/calomel/on_mob_life(mob/living/carbon/M)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.type,3)
- if(M.health > 20)
- M.adjustToxLoss(1*REM, 0)
- . = 1
- ..()
-
-/datum/reagent/medicine/potass_iodide
- name = "Potassium Iodide"
- description = "Efficiently restores low radiation damage."
- reagent_state = LIQUID
- color = "#BAA15D"
- metabolization_rate = 2 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/potass_iodide/on_mob_life(mob/living/carbon/M)
- if(M.radiation > 0)
- M.radiation -= min(M.radiation, 8)
- ..()
-
-/datum/reagent/medicine/pen_acid
- name = "Pentetic Acid"
- description = "Reduces massive amounts of radiation and toxin damage while purging other chemicals from the body."
- reagent_state = LIQUID
- color = "#E6FFF0"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/pen_acid/on_mob_life(mob/living/carbon/M)
- M.radiation -= max(M.radiation-RAD_MOB_SAFE, 0)/50
- M.adjustToxLoss(-2*REM, 0)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(R != src)
- M.reagents.remove_reagent(R.type,2)
- ..()
- . = 1
-
-/datum/reagent/medicine/anti_rad
- name = "Emergency Radiation Purgant" //taking real names
- description = "Rapidly purges radiation from the body."
- reagent_state = LIQUID
- color = "#E6FFF0"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/anti_rad/on_mob_metabolize(mob/living/L)
- to_chat(L, span_warning("Your stomach starts to churn and cramp!"))
- . = ..()
-
-/datum/reagent/medicine/anti_rad/on_mob_life(mob/living/carbon/M)
- M.radiation -= M.radiation - rand(50,150)
- M.adjust_disgust(4*REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/sal_acid
- name = "Salicylic Acid"
- description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
- reagent_state = LIQUID
- color = "#D2D2D2"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
-
-/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
- if(M.getBruteLoss() > 25)
- M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
- else
- M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
- ..()
- . = 1
-
-/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
- if(M.getBruteLoss()) //It only makes existing bruises worse
- M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
- . = 1
- ..()
-
-/datum/reagent/medicine/salbutamol
- name = "Salbutamol"
- description = "Rapidly restores oxygen deprivation as well as preventing more of it to an extent."
- reagent_state = LIQUID
- color = "#00FFFF"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/salbutamol/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-3*REM, 0)
- if(M.losebreath >= 4)
- M.losebreath -= 2
- ..()
- . = 1
-
-/datum/reagent/medicine/perfluorodecalin
- name = "Perfluorodecalin"
- description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
- reagent_state = LIQUID
- color = "#FF6464"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
-
-/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
- var/oxycalc = 2.5*REM*current_cycle
- if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
- M.adjustOxyLoss(-oxycalc, 0)
- M.adjustToxLoss(oxycalc/2.5, 0)
- if(prob(current_cycle) && M.losebreath)
- M.losebreath--
- ..()
- return TRUE
-
-/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M)
- metabolization_rate += 1
- return ..()
-
-/datum/reagent/medicine/ephedrine
- name = "Ephedrine"
- description = "Increases stun resistance and movement speed, giving you hand cramps. Overdose deals toxin damage and inhibits breathing."
- reagent_state = LIQUID
- color = "#D2FFFA"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 30
- addiction_threshold = 25
-
-/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L)
- ..()
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
- ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
-
-/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine)
- REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
- ..()
-
-/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M)
- if(prob(20) && iscarbon(M))
- var/obj/item/I = M.get_active_held_item()
- if(I && M.dropItemToGround(I))
- to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!"))
- M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
-
- M.AdjustAllImmobility(-20)
- M.adjustStaminaLoss(-1*REM, FALSE)
- ..()
- return TRUE
-
-/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M)
- if(prob(2) && iscarbon(M))
- var/datum/disease/D = new /datum/disease/heart_failure
- M.ForceContractDisease(D)
- to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there.."))
- M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0)
-
- if(prob(7))
- to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]"))
-
- if(prob(33))
- M.adjustToxLoss(1*REM, 0)
- M.losebreath++
- . = 1
- return TRUE
-
-/datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M)
- if(prob(3) && iscarbon(M))
- M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
- M.Unconscious(100)
- M.set_timed_status_effect(120 SECONDS, /datum/status_effect/jitter)
-
- if(prob(33))
- M.adjustToxLoss(2*REM, 0)
- M.losebreath += 2
- . = 1
- ..()
-
-/datum/reagent/medicine/ephedrine/addiction_act_stage2(mob/living/M)
- if(prob(6) && iscarbon(M))
- M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
- M.Unconscious(100)
- M.set_timed_status_effect(240 SECONDS, /datum/status_effect/jitter)
-
- if(prob(33))
- M.adjustToxLoss(3*REM, 0)
- M.losebreath += 3
- . = 1
- ..()
-
-/datum/reagent/medicine/ephedrine/addiction_act_stage3(mob/living/M)
- if(prob(12) && iscarbon(M))
- M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
- M.Unconscious(100)
- M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter)
-
- if(prob(33))
- M.adjustToxLoss(4*REM, 0)
- M.losebreath += 4
- . = 1
- ..()
-
-/datum/reagent/medicine/ephedrine/addiction_act_stage4(mob/living/M)
- if(prob(24) && iscarbon(M))
- M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!"))
- M.Unconscious(100)
- M.set_timed_status_effect(300 SECONDS, /datum/status_effect/jitter)
-
- if(prob(33))
- M.adjustToxLoss(5*REM, 0)
- M.losebreath += 5
- . = 1
- ..()
-
-/datum/reagent/medicine/diphenhydramine
- name = "Diphenhydramine"
- description = "Rapidly purges the body of Histamine and reduces jitteriness. Slight chance of causing drowsiness."
- reagent_state = LIQUID
- color = "#64FFE6"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/diphenhydramine/on_mob_life(mob/living/carbon/M)
- if(prob(10))
- M.drowsyness += 1
- M.adjust_timed_status_effect(-12 SECONDS, /datum/status_effect/jitter)
- M.reagents.remove_reagent(/datum/reagent/toxin/histamine,3)
- ..()
-
-/datum/reagent/medicine/morphine
- name = "Morphine"
- description = "A painkiller that allows the patient to move at full speed even in bulky objects. Causes drowsiness and eventually unconsciousness in high doses. Overdose will cause a variety of effects, ranging from minor to lethal."
- reagent_state = LIQUID
- color = "#A9FBFB"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 30
- addiction_threshold = 25
-
-/datum/reagent/medicine/morphine/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
- if(ishuman(L))
- var/mob/living/carbon/human/drugged = L
- drugged.physiology.damage_resistance += 5
-
-/datum/reagent/medicine/morphine/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
- if(ishuman(L))
- var/mob/living/carbon/human/drugged = L
- drugged.physiology.damage_resistance -= 5
- ..()
-
-/datum/reagent/medicine/morphine/on_mob_life(mob/living/carbon/M)
- if(current_cycle >= 5)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_medium, name)
- switch(current_cycle)
- if(29)
- to_chat(M, span_warning("You start to feel tired..."))
- if(30 to 59)
- M.drowsyness += 1
- if(60 to INFINITY)
- M.Sleeping(40)
- . = 1
- ..()
-
-/datum/reagent/medicine/morphine/overdose_start(mob/living/M)
- . = ..()
- ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
-
-/datum/reagent/medicine/morphine/overdose_process(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/morphine/addiction_act_stage1(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/morphine/addiction_act_stage2(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(1*REM, 0)
- . = 1
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/morphine/addiction_act_stage3(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(2*REM, 0)
- . = 1
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/morphine/addiction_act_stage4(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(3*REM, 0)
- . = 1
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/tramal
- name = "Tramal"
- description = "A low intensity, high duration painkiller. Causes slight drowiness in extended use."
- reagent_state = LIQUID
- color = "#34eeee"
- metabolization_rate = 0.2 * REAGENTS_METABOLISM
- overdose_threshold = 35
- addiction_threshold = 30
-
-/datum/reagent/medicine/tramal/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_PAIN_RESIST, type)
-
-/datum/reagent/medicine/tramal/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_PAIN_RESIST, type)
- ..()
-
-/datum/reagent/medicine/tramal/on_mob_life(mob/living/carbon/M)
- if(current_cycle >= 5)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_light, name)
- switch(current_cycle)
- if(60)
- to_chat(M, span_warning("You feel drowsy..."))
- if(61 to INFINITY)
- M.drowsyness += 1
- ..()
-
-/datum/reagent/medicine/tramal/overdose_start(mob/living/M)
- . = ..()
- ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
-
-/datum/reagent/medicine/tramal/overdose_process(mob/living/M)
- if(prob(33))
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/tramal/addiction_act_stage1(mob/living/M)
- if(prob(33))
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/tramal/addiction_act_stage2(mob/living/M)
- if(prob(33))
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/tramal/addiction_act_stage3(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/tramal/addiction_act_stage4(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(2*REM, 0)
- . = 1
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/dimorlin
- name = "Dimorlin"
- description = "A powerful opiate-derivative analgesiac. Extremely habit forming"
- reagent_state = LIQUID
- color = "#71adad"
- metabolization_rate = 0.4 * REAGENTS_METABOLISM
- overdose_threshold = 15
- addiction_threshold = 11
-
-/datum/reagent/medicine/dimorlin/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_ANALGESIA, type)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.set_screwyhud(SCREWYHUD_HEALTHY)
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
- if(ishuman(L))
- var/mob/living/carbon/human/drugged = L
- drugged.physiology.damage_resistance += 15
-
-/datum/reagent/medicine/dimorlin/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_ANALGESIA, type)
- if(iscarbon(L))
- var/mob/living/carbon/C = L
- C.set_screwyhud(SCREWYHUD_NONE)
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
- if(ishuman(L))
- var/mob/living/carbon/human/drugged = L
- drugged.physiology.damage_resistance -= 15
- ..()
-
-/datum/reagent/medicine/dimorlin/on_mob_life(mob/living/carbon/C)
- C.set_screwyhud(SCREWYHUD_HEALTHY)
- if(current_cycle >= 3)
- SEND_SIGNAL(C, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name)
- ..()
-
-/datum/reagent/medicine/dimorlin/overdose_start(mob/living/M)
- . = ..()
- ADD_TRAIT(M, TRAIT_PINPOINT_EYES, type)
-
-/datum/reagent/medicine/dimorlin/overdose_process(mob/living/M)
- if(prob(33))
- M.losebreath++
- M.adjustOxyLoss(4, 0)
- if(prob(20))
- M.AdjustUnconscious(20)
- if(prob(5))
- M.adjustOrganLoss(ORGAN_SLOT_EYES, 5)
- ..()
-
-/datum/reagent/medicine/dimorlin/addiction_act_stage1(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.set_timed_status_effect(4 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/dimorlin/addiction_act_stage2(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(1*REM, 0)
- . = 1
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/dimorlin/addiction_act_stage3(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(2*REM, 0)
- . = 1
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/dimorlin/addiction_act_stage4(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(3*REM, 0)
- . = 1
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/oculine
- name = "Oculine"
- description = "Quickly restores eye damage, cures nearsightedness, and has a chance to restore vision to the blind."
- reagent_state = LIQUID
- color = "#404040" //oculine is dark grey, inacusiate is light grey
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- taste_description = "dull toxin"
-
-/datum/reagent/medicine/oculine/on_mob_life(mob/living/carbon/M)
- var/obj/item/organ/eyes/eyes = M.getorganslot(ORGAN_SLOT_EYES)
- if (!eyes)
- return
- eyes.applyOrganDamage(-2)
- if(HAS_TRAIT_FROM(M, TRAIT_BLIND, EYE_DAMAGE))
- if(prob(20))
- to_chat(M, span_warning("Your vision slowly returns..."))
- M.cure_blind(EYE_DAMAGE)
- M.cure_nearsighted(EYE_DAMAGE)
- M.blur_eyes(35)
-
- else if(HAS_TRAIT_FROM(M, TRAIT_NEARSIGHT, EYE_DAMAGE))
- to_chat(M, span_warning("The blackness in your peripheral vision fades."))
- M.cure_nearsighted(EYE_DAMAGE)
- M.blur_eyes(10)
- else if(M.eye_blind || M.eye_blurry)
- M.set_blindness(0)
- M.set_blurriness(0)
- ..()
-
-/datum/reagent/medicine/inacusiate
- name = "Inacusiate"
- description = "Instantly restores all hearing to the patient, but does not cure deafness."
- color = "#606060" // ditto
-
-/datum/reagent/medicine/inacusiate/on_mob_life(mob/living/carbon/M)
- M.restoreEars()
- ..()
-
-/datum/reagent/medicine/atropine
- name = "Atropine"
- description = "If a patient is in critical condition, rapidly heals all damage types as well as regulating oxygen in the body. Excellent for stabilizing wounded patients."
- reagent_state = LIQUID
- color = "#1D3535" //slightly more blue, like epinephrine
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 35
-
-/datum/reagent/medicine/atropine/on_mob_life(mob/living/carbon/M)
- if(M.health <= M.crit_threshold)
- M.adjustToxLoss(-2*REM, 0)
- M.adjustBruteLoss(-2*REM, 0)
- M.adjustFireLoss(-2*REM, 0)
- M.adjustOxyLoss(-5*REM, 0)
- . = 1
- M.losebreath = 0
- if(prob(20))
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- ..()
-
-/datum/reagent/medicine/atropine/overdose_process(mob/living/M)
- M.adjustToxLoss(0.5*REM, 0)
- . = 1
- M.set_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/dizziness, max_duration = 20 SECONDS)
- ..()
-
-/datum/reagent/medicine/epinephrine
- name = "Epinephrine"
- description = "Very minor boost to stun resistance. Slowly heals damage if a patient is in critical condition, as well as regulating oxygen loss. Overdose causes weakness and toxin damage."
- reagent_state = LIQUID
- color = "#D2FFFA"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-/datum/reagent/medicine/epinephrine/on_mob_metabolize(mob/living/carbon/M)
- ..()
- ADD_TRAIT(M, TRAIT_NOCRITDAMAGE, type)
-
-/datum/reagent/medicine/epinephrine/on_mob_end_metabolize(mob/living/carbon/M)
- REMOVE_TRAIT(M, TRAIT_NOCRITDAMAGE, type)
- ..()
-
-/datum/reagent/medicine/epinephrine/on_mob_life(mob/living/carbon/M)
- if(M.health <= M.crit_threshold)
- M.adjustToxLoss(-0.5*REM, 0)
- M.adjustBruteLoss(-0.5*REM, 0)
- M.adjustFireLoss(-0.5*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- if(M.losebreath >= 4)
- M.losebreath -= 2
- if(M.losebreath < 0)
- M.losebreath = 0
- M.adjustStaminaLoss(-0.5*REM, 0)
- . = 1
- if(prob(20))
- M.AdjustAllImmobility(-20)
- ..()
-
-/datum/reagent/medicine/epinephrine/overdose_process(mob/living/M)
- if(prob(33))
- M.adjustStaminaLoss(2.5*REM, 0)
- M.adjustToxLoss(1*REM, 0)
- M.losebreath++
- . = 1
- ..()
-
-/datum/reagent/medicine/strange_reagent
- name = "Strange Reagent"
- description = "A miracle drug capable of bringing the dead back to life. Works topically unless anotamically complex, in which case works orally. Only works if the target has less than 200 total brute and burn damage and hasn't been husked and requires more reagent depending on damage inflicted. Causes damage to the living."
- reagent_state = LIQUID
- color = "#A0E85E"
- metabolization_rate = 1.25 * REAGENTS_METABOLISM
- taste_description = "magnets"
- harmful = TRUE
-
-/datum/reagent/medicine/strange_reagent/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(M.stat != DEAD)
- return ..()
- if(M.hellbound) //they are never coming back
- M.visible_message(span_warning("[M]'s body does not react..."))
- return
- if(iscarbon(M) && method != INGEST) //simplemobs can still be splashed
- return ..()
- var/amount_to_revive = round((M.getBruteLoss()+M.getFireLoss())/20)
- if(M.getBruteLoss()+M.getFireLoss() >= 200 || HAS_TRAIT(M, TRAIT_HUSK) || reac_volume < amount_to_revive) //body will die from brute+burn on revive or you haven't provided enough to revive.
- M.visible_message(span_warning("[M]'s body convulses a bit, and then falls still once more."))
- M.do_jitter_animation(10)
- return
- M.visible_message(span_warning("[M]'s body starts convulsing!"))
- M.notify_ghost_cloning("Your body is being revived with Strange Reagent!")
- M.do_jitter_animation(10)
- var/excess_healing = 5*(reac_volume-amount_to_revive) //excess reagent will heal blood and organs across the board
- addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 40) //jitter immediately, then again after 4 and 8 seconds
- addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living/carbon, do_jitter_animation), 10), 80)
- addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, revive), FALSE, FALSE, excess_healing), 79)
- ..()
-
-/datum/reagent/medicine/strange_reagent/on_mob_life(mob/living/carbon/M)
- var/damage_at_random = rand(0,250)/100 //0 to 2.5
- M.adjustBruteLoss(damage_at_random*REM, FALSE)
- M.adjustFireLoss(damage_at_random*REM, FALSE)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/strange_reagent/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
- . = ..()
- if(chems.has_reagent(type, 5))
- mytray.spawnplant()
-
-/datum/reagent/medicine/mannitol
- name = "Mannitol"
- description = "Efficiently restores brain damage."
- color = "#A0A0A0" //mannitol is light grey, neurine is lighter grey
-
-/datum/reagent/medicine/mannitol/on_mob_life(mob/living/carbon/C)
- C.adjustOrganLoss(ORGAN_SLOT_BRAIN, -2*REM)
- ..()
-
-/datum/reagent/medicine/neurine
- name = "Neurine"
- description = "Reacts with neural tissue, helping reform damaged connections. Can cure minor traumas."
- color = "#C0C0C0" //ditto
-
-/datum/reagent/medicine/neurine/on_mob_life(mob/living/carbon/C)
- if(C.has_reagent(/datum/reagent/consumable/ethanol/neurotoxin))
- C.remove_reagent(/datum/reagent/consumable/ethanol/neurotoxin, 5)
- if(prob(15))
- C.cure_trauma_type(resilience = TRAUMA_RESILIENCE_BASIC)
- ..()
-
-/datum/reagent/medicine/mutadone
- name = "Mutadone"
- description = "Removes jitteriness and restores genetic defects."
- color = "#5096C8"
- taste_description = "acid"
-
-/datum/reagent/medicine/mutadone/on_mob_life(mob/living/carbon/M)
- M.adjust_timed_status_effect(-100 SECONDS * REM, /datum/status_effect/jitter)
- if(M.has_dna())
- M.dna.remove_all_mutations(list(MUT_NORMAL, MUT_EXTRA), TRUE)
- if(!QDELETED(M)) //We were a monkey, now a human
- ..()
-
-/datum/reagent/medicine/antihol
- name = "Antihol"
- description = "Purges alcoholic substance from the patient's body and eliminates its side effects."
- color = "#00B4C8"
- taste_description = "raw egg"
-
-/datum/reagent/medicine/antihol/on_mob_life(mob/living/carbon/M)
- M.remove_status_effect(/datum/status_effect/dizziness)
- M.drowsyness = 0
- M.slurring = 0
- M.confused = 0
- M.reagents.remove_all_type(/datum/reagent/consumable/ethanol, 3*REM, 0, 1)
- M.adjustToxLoss(-0.2*REM, 0)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.adjust_drunk_effect(-10)
- ..()
- . = 1
-
-/datum/reagent/medicine/stimulants
- name = "Indoril"
- description = "Increases stun resistance and movement speed in addition to restoring minor damage and weakness. Overdose causes weakness and toxin damage."
- color = "#78008C"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 60
-
-/datum/reagent/medicine/stimulants/on_mob_metabolize(mob/living/L)
- ..()
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
- ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
-
-/datum/reagent/medicine/stimulants/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/stimulants)
- REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
- ..()
-
-/datum/reagent/medicine/stimulants/on_mob_life(mob/living/carbon/M)
- if(M.health < 50 && M.health > 0)
- M.adjustOxyLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
- M.adjustBruteLoss(-1*REM, 0)
- M.adjustFireLoss(-1*REM, 0)
- M.AdjustAllImmobility(-60)
- M.adjustStaminaLoss(-5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/stimulants/overdose_process(mob/living/M)
- if(prob(33))
- M.adjustStaminaLoss(2.5*REM, 0)
- M.adjustToxLoss(1*REM, 0)
- M.losebreath++
- . = 1
- ..()
-
-/datum/reagent/medicine/insulin
- name = "Insulin"
- description = "Increases sugar depletion rates."
- reagent_state = LIQUID
- color = "#FFFFF0"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/insulin/on_mob_life(mob/living/carbon/M)
- if(M.AdjustSleeping(-20))
- . = 1
- M.reagents.remove_reagent(/datum/reagent/consumable/sugar, 3)
- ..()
-
-//Trek Chems, simple to mix but weak as healing. Second tier trekchems will heal faster.
-/datum/reagent/medicine/bicaridine
- name = "Bicaridine"
- description = "Restores bruising. Overdose causes it instead."
- reagent_state = LIQUID
- color = "#bf0000"
- overdose_threshold = 30
-
-/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-0.5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
- M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridinep
- name = "Bicaridine Plus"
- description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine."
- reagent_state = LIQUID
- color = "#bf0000"
- overdose_threshold = 25
-
-/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M)
- M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalin
- name = "Dexalin"
- description = "Restores oxygen loss. Overdose causes it instead."
- reagent_state = LIQUID
- color = "#0080FF"
- overdose_threshold = 30
-
-/datum/reagent/medicine/dexalin/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-0.5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalin/overdose_process(mob/living/M)
- M.adjustOxyLoss(2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalinp
- name = "Dexalin Plus"
- description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin."
- reagent_state = LIQUID
- color = "#0040FF"
- overdose_threshold = 25
-
-/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-2*REM, 0)
- if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
- M.blood_volume += 1
- if(holder.has_reagent(/datum/reagent/toxin/lexorin))
- holder.remove_reagent(/datum/reagent/toxin/lexorin, 3)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M)
- M.adjustOxyLoss(6*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/kelotane
- name = "Kelotane"
- description = "Heals burn damage. Overdose causes it instead."
- reagent_state = LIQUID
- color = "#FFa800"
- overdose_threshold = 30
-
-/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-0.5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
- M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/dermaline
- name = "Dermaline"
- description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity."
- reagent_state = LIQUID
- color = "#FF8000"
- overdose_threshold = 25
-
-/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/dermaline/overdose_process(mob/living/M)
- M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/antitoxin
- name = "Dylovene"
- description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
- reagent_state = LIQUID
- color = "#00a000"
- overdose_threshold = 30
- taste_description = "a roll of gauze"
-
-/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-0.5*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
- ..()
- . = 1
-
-/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
- . = ..()
- if(chems.has_reagent(type, 1))
- mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
-
-/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
- M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
- ..()
- . = 1
-
-/datum/reagent/medicine/inaprovaline
- name = "Inaprovaline"
- description = "Stabilizes the breathing of patients. Good for those in critical condition."
- reagent_state = LIQUID
- color = "#A4D8D8"
-
-/datum/reagent/medicine/inaprovaline/on_mob_life(mob/living/carbon/M)
- if(M.losebreath >= 5)
- M.losebreath -= 5
- ..()
-
-/datum/reagent/medicine/tricordrazine
- name = "Tricordrazine"
- description = "A weak dilutant that slowly heals brute, burn, and toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "water that has been standing still in a glass on a counter overnight"
-
-/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- . = 1
- ..()
-/datum/reagent/medicine/tetracordrazine //WS edit: Yes
- name = "Tetracordrazine"
- description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it"
-
-/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- . = 1
- ..()
-
-/datum/reagent/medicine/regen_jelly
- name = "Regenerative Jelly"
- description = "Gradually regenerates all types of damage, without harming slime anatomy."
- reagent_state = LIQUID
- color = "#CC23FF"
- taste_description = "jelly"
-
-/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
- if(M && ishuman(M) && reac_volume >= 0.5)
- var/mob/living/carbon/human/H = M
- H.hair_color = "C2F"
- H.facial_hair_color = "C2F"
- H.update_hair()
-
-/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0)
- M.adjustFireLoss(-1.5*REM, 0)
- M.adjustOxyLoss(-1.5*REM, 0)
- M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
- ..()
- . = 1
-
-/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
- name = "Restorative Nanites"
- description = "Miniature medical robots that swiftly restore bodily damage."
- reagent_state = SOLID
- color = "#555555"
- overdose_threshold = 30
- process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
-
-/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
- M.adjustFireLoss(-5*REM, 0)
- M.adjustOxyLoss(-15, 0)
- M.adjustToxLoss(-5*REM, 0)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
- M.adjustCloneLoss(-3*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
- if(prob(25))
- M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
- M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
- ..()
- . = 1
-
-/datum/reagent/medicine/earthsblood //Created by ambrosia gaia plants
- name = "Earthsblood"
- description = "Ichor from an extremely powerful plant. Great for restoring wounds, but it's a little heavy on the brain. For some strange reason, it also induces temporary pacifism in those who imbibe it and semi-permanent pacifism in those who overdose on it."
- color = "#FFAF00"
- metabolization_rate = 0.4 //Math is based on specific metab rate so we want this to be static AKA if define or medicine metab rate changes, we want this to stay until we can rework calculations.
- overdose_threshold = 25
-
-/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
- if(current_cycle <= 25) //10u has to be processed before u get into THE FUN ZONE
- M.adjustBruteLoss(-1 * REM, 0)
- M.adjustFireLoss(-1 * REM, 0)
- M.adjustOxyLoss(-0.5 * REM, 0)
- M.adjustToxLoss(-0.5 * REM, 0)
- M.adjustCloneLoss(-0.1 * REM, 0)
- M.adjustStaminaLoss(-0.5 * REM, 0)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1 * REM, 150) //This does, after all, come from ambrosia, and the most powerful ambrosia in existence, at that!
- else
- M.adjustBruteLoss(-5 * REM, 0) //slow to start, but very quick healing once it gets going
- M.adjustFireLoss(-5 * REM, 0)
- M.adjustOxyLoss(-3 * REM, 0)
- M.adjustToxLoss(-3 * REM, 0)
- M.adjustCloneLoss(-1 * REM, 0)
- M.adjustStaminaLoss(-3 * REM, 0)
- M.adjust_timed_status_effect(3 SECONDS, /datum/status_effect/jitter, 30 SECONDS)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2 * REM, 150)
- M.druggy = min(max(0, M.druggy + 10), 15) //See above
- ..()
- . = 1
-
-/datum/reagent/medicine/earthsblood/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_PACIFISM, type)
-
-/datum/reagent/medicine/earthsblood/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_PACIFISM, type)
- ..()
-
-/datum/reagent/medicine/earthsblood/overdose_process(mob/living/M)
- M.hallucination = min(max(0, M.hallucination + 5), 60)
- if(current_cycle > 25)
- M.adjustToxLoss(4 * REM, 0)
- if(current_cycle > 100) //podpeople get out reeeeeeeeeeeeeeeeeeeee
- M.adjustToxLoss(6 * REM, 0)
- if(iscarbon(M))
- var/mob/living/carbon/hippie = M
- hippie.gain_trauma(/datum/brain_trauma/severe/pacifism)
- ..()
- . = 1
-
-//Earthsblood is still a wonderdrug. Just... don't expect to be able to mutate something that makes plants so healthy.
-/datum/reagent/medicine/earthsblood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
- . = ..()
- if(chems.has_reagent(type, 1))
- mytray.adjustHealth(round(chems.get_reagent_amount(type) * 1))
- mytray.adjustPests(-rand(1,3))
- mytray.adjustWeeds (-rand(1,3))
- if(myseed)
- myseed.adjust_instability(-round(chems.get_reagent_amount(type) * 1.3))
- myseed.adjust_potency(round(chems.get_reagent_amount(type)))
- myseed.adjust_yield(round(chems.get_reagent_amount(type)))
- myseed.adjust_endurance(round(chems.get_reagent_amount(type) * 0.5))
- myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.5))
-
-/datum/reagent/medicine/haloperidol
- name = "Haloperidol"
- description = "Increases depletion rates for most stimulating/hallucinogenic drugs. Reduces druggy effects and jitteriness. Severe stamina regeneration penalty, causes drowsiness. Small chance of brain damage."
- reagent_state = LIQUID
- color = "#27870a"
- metabolization_rate = 0.4 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/haloperidol/on_mob_life(mob/living/carbon/M)
- for(var/datum/reagent/drug/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,5)
- M.drowsyness += 2
- if(M.get_timed_status_effect_duration(/datum/status_effect/jitter) >= 6 SECONDS)
- M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter)
- if (M.hallucination >= 5)
- M.hallucination -= 5
- if(prob(20))
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1*REM, 50)
- M.adjustStaminaLoss(2.5*REM, 0)
- ..()
- return TRUE
-
-/* WS edit begin - Lavaland rework
-/datum/reagent/medicine/lavaland_extract
- name = "Lavaland Extract"
- description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
- color = "#6B372E" //dark and red like lavaland
- overdose_threshold = 3 //To prevent people stacking massive amounts of a very strong healing reagent
- can_synth = FALSE
-
-/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
- M.heal_bodypart_damage(5,5)
- ..()
- return TRUE
-
-/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M)
- M.adjustBruteLoss(3*REM, 0, FALSE, BODYTYPE_ORGANIC)
- M.adjustFireLoss(3*REM, 0, FALSE, BODYTYPE_ORGANIC)
- M.adjustToxLoss(3*REM, 0)
- ..()
- return TRUE
-*/ //WS edit end
-
-//used for changeling's adrenaline power
-/datum/reagent/medicine/changelingadrenaline
- name = "Changeling Adrenaline"
- description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed."
- color = "#C1151D"
- overdose_threshold = 30
-
-/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob)
- ..()
- M.AdjustAllImmobility(-20)
- M.adjustStaminaLoss(-10, 0)
- M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- return TRUE
-
-/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
- ADD_TRAIT(L, TRAIT_STUNRESISTANCE, type)
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L)
- ..()
- REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type)
- REMOVE_TRAIT(L, TRAIT_STUNRESISTANCE, type)
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
- L.remove_status_effect(/datum/status_effect/dizziness)
- L.remove_status_effect(/datum/status_effect/jitter)
-
-/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob)
- M.adjustToxLoss(1, 0)
- ..()
- return TRUE
-
-/datum/reagent/medicine/changelinghaste
- name = "Changeling Haste"
- description = "Drastically increases movement speed, but deals toxin damage."
- color = "#AE151D"
- metabolization_rate = 1
-
-/datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L)
- ..()
- L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
-
-/datum/reagent/medicine/changelinghaste/on_mob_end_metabolize(mob/living/L)
- L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste)
- ..()
-
-/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(2, 0)
- ..()
- return TRUE
-
-/datum/reagent/medicine/corazone
- // Heart attack code will not do damage if corazone is present
- // because it's SPACE MAGIC ASPIRIN
- name = "Corazone"
- description = "A medication used to treat pain, fever, and inflammation, along with heart attacks. Can also be used to stabilize livers."
- color = "#F49797"
- self_consuming = TRUE
-
-/datum/reagent/medicine/corazone/on_mob_metabolize(mob/living/M)
- ..()
- ADD_TRAIT(M, TRAIT_PAIN_RESIST, type)
- ADD_TRAIT(M, TRAIT_STABLEHEART, type)
- ADD_TRAIT(M, TRAIT_STABLELIVER, type)
-
-/datum/reagent/medicine/corazone/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_PAIN_RESIST, type)
- REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
- REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
-
-/datum/reagent/medicine/cordiolis_hepatico
- name = "Cordiolis Hepatico"
- description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
- color = "#000000"
- self_consuming = TRUE
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
- ..()
- ADD_TRAIT(M, TRAIT_STABLELIVER, type)
- ADD_TRAIT(M, TRAIT_STABLEHEART, type)
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
- ..()
- REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
- REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
-
-/datum/reagent/medicine/muscle_stimulant
- name = "Muscle Stimulant"
- description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
- . = ..()
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
- . = ..()
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/modafinil
- name = "Modafinil"
- description = "Long-lasting sleep suppressant that very slightly reduces stun and knockdown times. Overdosing has horrendous side effects and deals lethal oxygen damage, will knock you unconscious if not dealt with."
- reagent_state = LIQUID
- color = "#BEF7D8" // palish blue white
- metabolization_rate = 0.1 * REAGENTS_METABOLISM
- overdose_threshold = 20 // with the random effects this might be awesome or might kill you at less than 10u (extensively tested)
- taste_description = "salt" // it actually does taste salty
- var/overdose_progress = 0 // to track overdose progress
-
-/datum/reagent/medicine/modafinil/on_mob_metabolize(mob/living/M)
- ADD_TRAIT(M, TRAIT_SLEEPIMMUNE, type)
- ..()
-
-/datum/reagent/medicine/modafinil/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_SLEEPIMMUNE, type)
- ..()
-
-/datum/reagent/medicine/modafinil/on_mob_life(mob/living/carbon/M)
- if(!overdosed) // We do not want any effects on OD
- overdose_threshold = overdose_threshold + rand(-10,10)/10 // for extra fun
- M.AdjustAllImmobility(-5)
- M.adjustStaminaLoss(-0.5*REM, 0)
- M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 20 SECONDS)
- metabolization_rate = 0.01 * REAGENTS_METABOLISM * rand(5,20) // randomizes metabolism between 0.02 and 0.08 per tick
- . = TRUE
- ..()
-
-/datum/reagent/medicine/modafinil/overdose_start(mob/living/M)
- to_chat(M, span_userdanger("You feel awfully out of breath and jittery!"))
- metabolization_rate = 0.025 * REAGENTS_METABOLISM // sets metabolism to 0.01 per tick on overdose
-
-/datum/reagent/medicine/modafinil/overdose_process(mob/living/M)
- overdose_progress++
- switch(overdose_progress)
- if(1 to 40)
- M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS)
- M.stuttering = min(M.stuttering+1, 10)
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- if(prob(50))
- M.losebreath++
- if(41 to 80)
- M.adjustOxyLoss(0.1*REM, 0)
- M.adjustStaminaLoss(0.1*REM, 0)
- M.adjust_timed_status_effect(2 SECONDS * REM, /datum/status_effect/jitter, max_duration = 40 SECONDS)
- M.stuttering = min(M.stuttering+1, 20)
- M.set_timed_status_effect(20 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- if(prob(50))
- M.losebreath++
- if(prob(20))
- to_chat(M, span_userdanger("You have a sudden fit!"))
- M.Paralyze(20) // you should be in a bad spot at this point unless epipen has been used
- if(81)
- to_chat(M, span_userdanger("You feel too exhausted to continue!")) // at this point you will eventually die unless you get charcoal
- M.adjustOxyLoss(0.1*REM, 0)
- M.adjustStaminaLoss(0.1*REM, 0)
- if(82 to INFINITY)
- M.Sleeping(100)
- M.adjustOxyLoss(1.5*REM, 0)
- M.adjustStaminaLoss(1.5*REM, 0)
- ..()
- return TRUE
-
-/datum/reagent/medicine/psicodine
- name = "Psicodine"
- description = "Suppresses anxiety and other various forms of mental distress. Overdose causes hallucinations and minor toxin damage."
- reagent_state = LIQUID
- color = "#07E79E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-/datum/reagent/medicine/psicodine/on_mob_metabolize(mob/living/L)
- ..()
- ADD_TRAIT(L, TRAIT_FEARLESS, type)
-
-/datum/reagent/medicine/psicodine/on_mob_end_metabolize(mob/living/L)
- REMOVE_TRAIT(L, TRAIT_FEARLESS, type)
- ..()
-
-/datum/reagent/medicine/psicodine/on_mob_life(mob/living/carbon/M)
- M.adjust_timed_status_effect(-6 SECONDS * REM, /datum/status_effect/jitter)
- M.adjust_timed_status_effect(-12 SECONDS * REM, /datum/status_effect/dizziness)
- M.confused = max(0, M.confused-6)
- M.disgust = max(0, M.disgust-6)
- var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
- if(mood.sanity <= SANITY_NEUTRAL) // only take effect if in negative sanity and then...
- mood.setSanity(min(mood.sanity+5, SANITY_NEUTRAL)) // set minimum to prevent unwanted spiking over neutral
- ..()
- . = 1
-
-/datum/reagent/medicine/psicodine/overdose_process(mob/living/M)
- M.hallucination = min(max(0, M.hallucination + 5), 60)
- M.adjustToxLoss(1, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/metafactor
- name = "Mitogen Metabolism Factor"
- description = "This enzyme catalyzes the conversion of nutricious food into healing peptides."
- metabolization_rate = 0.0625 * REAGENTS_METABOLISM //slow metabolism rate so the patient can self heal with food even after the troph has metabolized away for amazing reagent efficency.
- reagent_state = SOLID
- color = "#FFBE00"
- overdose_threshold = 10
-
-/datum/reagent/medicine/metafactor/overdose_start(mob/living/carbon/M)
- metabolization_rate = 2 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/metafactor/overdose_process(mob/living/carbon/M)
- if(prob(25))
- M.vomit()
- ..()
-
-/datum/reagent/medicine/silibinin
- name = "Silibinin"
- description = "A thistle derrived hepatoprotective flavolignan mixture that help reverse damage to the liver."
- reagent_state = SOLID
- color = "#FFFFD0"
- metabolization_rate = 1.5 * REAGENTS_METABOLISM
-
-/datum/reagent/medicine/silibinin/expose_mob(mob/living/carbon/M, method=INJECT, reac_volume)
- if(method != INJECT)
- return
-
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, -1) //on injection, will heal the liver. This will (hopefully) fix dead livers.
-
- ..()
-
-/datum/reagent/medicine/silibinin/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, -2)//Add a chance to cure liver trauma once implemented.
- ..()
- . = 1
-
-/datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems.
- name = "Polypyrylium Oligomers"
- description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals."
- reagent_state = SOLID
- color = "#9423FF"
- metabolization_rate = 0.15 * REAGENTS_METABOLISM
- overdose_threshold = 50
- taste_description = "numbing bitterness"
- /// While this reagent is in our bloodstream, we reduce all bleeding by this factor
- var/passive_bleed_modifier = 0.55
- /// For tracking when we tell the person we're no longer bleeding
- var/was_working
-
-/datum/reagent/medicine/polypyr/on_mob_metabolize(mob/living/M)
- ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr)
- if(!ishuman(M))
- return
-
- var/mob/living/carbon/human/blood_boy = M
- blood_boy.physiology?.bleed_mod *= passive_bleed_modifier
- return ..()
-
-/datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/polypyr)
- //should probably generic proc this at a later point. I'm probably gonna use it a bit
- if(was_working)
- to_chat(M, span_warning("The medicine thickening your blood loses its effect!"))
- if(!ishuman(M))
- return
-
- var/mob/living/carbon/human/blood_boy = M
- blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
-
- return ..()
-
-
-/datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all.
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25)
- M.adjustBruteLoss(-0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/polypyr/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if(method == TOUCH || method == SMOKE || method == VAPOR)
- if(M && ishuman(M) && reac_volume >= 0.5)
- var/mob/living/carbon/human/H = M
- H.hair_color = "92f"
- H.facial_hair_color = "92f"
- H.update_hair()
-
-/datum/reagent/medicine/polypyr/overdose_process(mob/living/M)
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5)
- ..()
- . = 1
-
-/datum/reagent/medicine/carthatoline
- name = "Carthatoline"
- description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage."
- reagent_state = LIQUID
- color = "#225722"
- overdose_threshold = 25
-
-/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-2*REM, 0)
- if(M.getToxLoss() && prob(10))
- M.vomit(1)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,2)
- ..()
- . = 1
-
-/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M)
- M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math.
- ..()
- . = 1
-
-/datum/reagent/medicine/bonefixingjuice
- name = "C4L-Z1UM Agent"
- description = "A peculiar substance capable of instantly regenerating live tissue."
- taste_description = "milk"
- metabolization_rate = 0
-
-/datum/reagent/medicine/bonefixingjuice/on_mob_life(mob/living/M)
- var/mob/living/carbon/C = M
- switch(current_cycle)
- if(1 to 10)
- if(C.drowsyness < 10)
- C.drowsyness += 2
- if(11 to 30)
- C.adjustStaminaLoss(5)
- if(31 to INFINITY)
- C.AdjustSleeping(40)
- //formerly everything-fixing juice
- for(var/datum/wound/blunt/broken_bone in C.all_wounds)
- broken_bone.remove_wound()
- for(var/obj/item/organ/O in C.internal_organs)
- O.damage = 0
- holder.remove_reagent(/datum/reagent/medicine/bonefixingjuice, 10)
- ..()
-
-/datum/reagent/medicine/converbital
- name = "Converbital"
- description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns"
- reagent_state = LIQUID
- taste_description = "burning"
- color = "#7a1f13"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustFireLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight burning sensation..."))
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume)
- M.adjustFireLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/converbital/overdose_process(mob/living/M)
- M.adjustFireLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/convuri
- name = "Convuri"
- description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing"
- reagent_state = SOLID
- taste_description = "white-hot pain"
- color = "#b85505"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustBruteLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight tearing sensation..."))
- else if(M.getBruteLoss())
- M.adjustFireLoss(-reac_volume)
- M.adjustBruteLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/convuri/overdose_process(mob/living/M)
- M.adjustBruteLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole
- name = "Trophazole"
- description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides"
- reagent_state = LIQUID
- color = "#FFFF6B"
- overdose_threshold = 20
-
-/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole/overdose_process(mob/living/M)
- M.adjustBruteLoss(3*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume)
- if(method != INGEST || !iscarbon(A))
- return
-
- A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05)
- A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
-
- ..()
-
-
-/datum/reagent/medicine/rhigoxane
- name = "Rhigoxane"
- description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires."
- reagent_state = LIQUID
- color = "#F7FFA5"
- overdose_threshold = 25
- reagent_weight = 0.6
-
-/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0.)
- M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
- ..()
- . = 1
-
-/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
- if(method != VAPOR)
- return
-
- M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
- M.adjust_fire_stacks(-reac_volume / 2)
- if(reac_volume >= metabolization_rate)
- M.ExtinguishMob()
-
- ..()
-
-/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M)
- M.adjustFireLoss(3*REM, 0.)
- M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
- ..()
-
-
-/datum/reagent/medicine/thializid
- name = "Thializid"
- description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid."
- reagent_state = LIQUID
- color = "#8CDF24" // heavy saturation to make the color blend better
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- overdose_threshold = 6
- var/conversion_amount
-
-/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume)
- if(method != INJECT || !iscarbon(A))
- return
- var/mob/living/carbon/C = A
- if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
- C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
- if((L.organ_flags & ORGAN_FAILING) || !L)
- return
- conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
- C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount)
- C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount)
- ..()
-
-/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
-
- ..()
- . = 1
-
-/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxalizid
- name = "Oxalizid"
- description = "The active metabolite of thializid. Causes muscle weakness on overdose"
- reagent_state = LIQUID
- color = "#DFD54E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 25
- var/datum/brain_trauma/mild/muscle_weakness/U
-
-/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M)
- U = new()
- M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
- ..()
-
-/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M)
- if(U)
- QDEL_NULL(U)
- return ..()
-
-/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- ..()
- . = 1
-
-/datum/reagent/medicine/soulus
- name = "Soulus Dust"
- description = "Ground legion cores. The dust quickly seals wounds yet slowly causes the tissue to undergo necrosis."
- reagent_state = SOLID
- color = "#302f20"
- metabolization_rate = REAGENTS_METABOLISM * 0.8
- overdose_threshold = 50
- var/tox_dam = 0.25
-
-/datum/reagent/medicine/soulus/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, INJECT))
- M.set_timed_status_effect(reac_volume SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- if(M.getFireLoss())
- M.adjustFireLoss(-reac_volume*1.2)
- if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume*1.2)
- if(prob(50))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_good, name)
- else
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "legion", /datum/mood_event/legion_bad, name)
- ..()
-
-/datum/reagent/medicine/soulus/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-0.1*REM, 0)
- M.adjustBruteLoss(-0.1*REM, 0)
- M.adjustToxLoss(tox_dam*REM, 0)
- ..()
-
-/datum/reagent/medicine/soulus/overdose_process(mob/living/M)
- var/mob/living/carbon/C = M
- if(!istype(C.getorganslot(ORGAN_SLOT_REGENERATIVE_CORE), /obj/item/organ/legion_skull))
- var/obj/item/organ/legion_skull/spare_ribs = new()
- spare_ribs.Insert(M)
- ..()
-
-/datum/reagent/medicine/soulus/on_mob_end_metabolize(mob/living/M)
- SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "legion")
- ..()
-
-/datum/reagent/medicine/soulus/pure
- name = "Purified Soulus Dust"
- description = "Ground legion cores."
- reagent_state = SOLID
- color = "#302f20"
- metabolization_rate = REAGENTS_METABOLISM
- overdose_threshold = 100
- tox_dam = 0
-
-/datum/reagent/medicine/puce_essence // P U C E
- name = "Pucetylline Essence"
- description = "Ground essence of puce crystals."
- reagent_state = SOLID
- color = "#CC8899"
- metabolization_rate = 2.5 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-/datum/reagent/medicine/puce_essence/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustToxLoss(-1*REM, 0)
- else
- M.adjustCloneLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type, 0.25)
- if(holder.has_reagent(/datum/reagent/medicine/soulus)) // No, you can't chemstack with soulus dust
- holder.remove_reagent(/datum/reagent/medicine/soulus, 5)
- M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to puce
- ..()
-
-/datum/reagent/medicine/puce_essence/expose_atom(atom/A, volume)
- if(!iscarbon(A))
- A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY)
- ..()
-
-/datum/reagent/medicine/puce_essence/on_mob_end_metabolize(mob/living/M)
- M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) puce
-
-/datum/reagent/medicine/puce_essence/overdose_process(mob/living/M)
- M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal puce
-
-/datum/reagent/medicine/chartreuse // C H A R T R E U S E
- name = "Chartreuse Solution"
- description = "Refined essence of puce crystals."
- reagent_state = SOLID
- color = "#DFFF00"
- metabolization_rate = 2.5 * REAGENTS_METABOLISM
- overdose_threshold = 30
-
-/datum/reagent/medicine/chartreuse/on_mob_life(mob/living/carbon/M) // Yes, you can chemstack with soulus dust
- if(prob(80))
- M.adjustToxLoss(-2*REM, 0)
- M.adjustCloneLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type, 1)
- M.add_atom_colour(color, TEMPORARY_COLOUR_PRIORITY) // Changes color to chartreuse
- ..()
-
-/datum/reagent/medicine/chartreuse/expose_atom(atom/A, volume)
- if(!iscarbon(A))
- A.add_atom_colour(color, WASHABLE_COLOUR_PRIORITY)
- ..()
-
-/datum/reagent/medicine/chartreuse/on_mob_end_metabolize(mob/living/M)
- M.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, color) // Removes temporary (not permanent) chartreuse
-
-/datum/reagent/medicine/chartreuse/overdose_process(mob/living/M)
- M.add_atom_colour(color, FIXED_COLOUR_PRIORITY) // Eternal chartreuse
- M.set_drugginess(15) // Also druggy
- ..()
-
-/datum/reagent/medicine/lavaland_extract
- name = "Lavaland Extract"
- description = "An extract of lavaland atmospheric and mineral elements. Heals the user in small doses, but is extremely toxic otherwise."
- color = "#6B372E" //dark and red like lavaland
- metabolization_rate = REAGENTS_METABOLISM * 0.5
- overdose_threshold = 10
-
-/datum/reagent/medicine/lavaland_extract/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- ADD_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC)
- ..()
-
-/datum/reagent/medicine/lavaland_extract/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_NOLIMBDISABLE, TRAIT_GENERIC)
- ..()
-
-/datum/reagent/medicine/lavaland_extract/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-1*REM, 0)
- M.adjustBruteLoss(-1*REM, 0)
- M.adjustToxLoss(-1*REM, 0)
- if(M.health <= M.crit_threshold)
- M.adjustOxyLoss(-1*REM, 0)
- ..()
- return TRUE
-
-/datum/reagent/medicine/lavaland_extract/overdose_process(mob/living/M) // Thanks to actioninja
- if(prob(2) && iscarbon(M))
- var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)
- var/obj/item/bodypart/bp = M.get_bodypart(selected_part)
- if(bp)
- M.visible_message(span_warning("[M] feels a spike of pain!!"), span_danger("You feel a spike of pain!!"))
- bp.receive_damage(0, 0, 200)
- else //SUCH A LUST FOR REVENGE!!!
- to_chat(M, span_warning("A phantom limb hurts!"))
- return ..()
-
-/datum/reagent/medicine/skeletons_boon
- name = "Skeleton’s Boon"
- description = "A robust solution of minerals that greatly strengthens the bones."
- color = "#dbdfa2"
- metabolization_rate = REAGENTS_METABOLISM * 0.125
- overdose_threshold = 50
- var/plasma_armor = 33
- var/skele_armor = 20
- var/added_armor = 0
-
-/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- if(isplasmaman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += plasma_armor
- H.physiology.armor.bullet += plasma_armor
- added_armor = plasma_armor
- if(isskeleton(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += skele_armor
- H.physiology.armor.bullet += skele_armor
- added_armor = skele_armor
- ..()
-
-/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee -= added_armor
- H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
- ..()
-
-/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
- ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- ..()
-
-/datum/reagent/medicine/lithium_carbonate
- name = "Lithium Carbonate"
- description = "A mood stabilizer discovered by most spacefaring civilizations. Fairly widespread as a result."
- color = "#b3acaa" //grey. boring.
- reagent_state = SOLID
- metabolization_rate = REAGENTS_METABOLISM * 0.5
- overdose_threshold = 20
-
-/datum/reagent/medicine/lithium_carbonate/on_mob_life(mob/living/carbon/M)
- var/datum/component/mood/mood = M.GetComponent(/datum/component/mood)
- if(mood.sanity <= SANITY_GREAT)
- mood.setSanity(min(mood.sanity+5, SANITY_GREAT))
- ..()
- . = 1
-
-/datum/reagent/medicine/lithium_carbonate/overdose_process(mob/living/M)
- if(prob(5))
- M.set_timed_status_effect(10 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2*REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/melatonin
- name = "Human Sleep Hormone"
- description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to."
- color = "#e1b1e1" //very light pink ourple
- overdose_threshold = 0
- var/regenerating
- var/rachnid_limb
-
-/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
- . = ..()
- if(iscarbon(L))
- var/mob/living/carbon/imbiber = L
- if(isspiderperson(imbiber))
- //we check limbs, if one is missing, we break from the for loop after setting it to heal
- for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!imbiber.get_bodypart(limb))
- rachnid_limb = limb
- break
-
-/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
- . = ..()
- if(isspiderperson(L) && regenerating)
- var/mob/living/carbon/spider
- spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
- return
-
-
-/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
- . = ..()
- if(isvox(M))
- M.adjustToxLoss(1)
- if(islizard(M))
- if(prob(10))
- M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
- if(isspiderperson(M) && rachnid_limb)
- if(prob(7))
- to_chat(M, "Your body aches near [rachnid_limb]")
- if(current_cycle > 20 && !regenerating)
- regenerating = TRUE
-
- else
- if(M.IsSleeping())
- if(M.getBruteLoss() && M.getFireLoss())
- if(prob(50))
- M.adjustBruteLoss(-0.5)
- else
- M.adjustFireLoss(-0.5)
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-0.2)
- else if(M.getFireLoss())
- M.adjustFireLoss(-0.2)
-
-/datum/reagent/medicine/stasis
- name = "Stasis"
- description = "A liquid blue chemical that causes the body to enter a chemically induced stasis, irregardless of current state."
- reagent_state = LIQUID
- color = "#51b5cb" //a nice blue
- overdose_threshold = 0
-
-/datum/reagent/medicine/stasis/expose_mob(mob/living/M, method=INJECT, reac_volume, show_message = 1)
- if(method != INJECT)
- return
- if(iscarbon(M))
- var/stasis_duration = min(20 SECONDS * reac_volume, 300 SECONDS)
- to_chat(M, span_warning("Your body starts to slow down, sensation retreating from your limbs!"))
- M.apply_status_effect(STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT)
- addtimer(CALLBACK(M, TYPE_PROC_REF(/mob/living, remove_status_effect), STATUS_EFFECT_STASIS, STASIS_DRUG_EFFECT), stasis_duration, TIMER_UNIQUE)
-
-/datum/reagent/medicine/stasis/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(1)
- ..()
- . = 1
-
-/datum/reagent/medicine/carfencadrizine
- name = "Carfencadrizine"
- description = "A highly potent synthetic painkiller held in a suspension of stimulating agents. Allows people to keep moving long beyond when they should stop."
- color = "#859480"
- overdose_threshold = 8
- addiction_threshold = 7
- metabolization_rate = 0.1
-
-/datum/reagent/medicine/carfencadrizine/on_mob_metabolize(mob/living/L)
- . = ..()
- ADD_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine)
- ADD_TRAIT(L, TRAIT_PINPOINT_EYES, type)
- ADD_TRAIT(L, TRAIT_NOSOFTCRIT, type)
- ADD_TRAIT(L, TRAIT_NOHARDCRIT, type)
-
-/datum/reagent/medicine/carfencadrizine/on_mob_end_metabolize(mob/living/L)
- . = ..()
- REMOVE_TRAIT(L, TRAIT_HARDLY_WOUNDED, /datum/reagent/medicine/carfencadrizine)
- REMOVE_TRAIT(L, TRAIT_PINPOINT_EYES, type)
- REMOVE_TRAIT(L, TRAIT_NOSOFTCRIT, type)
- REMOVE_TRAIT(L, TRAIT_NOHARDCRIT, type)
-
-/datum/reagent/medicine/carfencadrizine/on_mob_life(mob/living/carbon/M)
- if(current_cycle >= 3)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "numb", /datum/mood_event/narcotic_heavy, name)
-
- if(M.health <= M.crit_threshold)
- if(prob(20))
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 4)
- if(prob(40))
- M.playsound_local(get_turf(M), 'sound/health/slowbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
- ..()
-
-/datum/reagent/medicine/carfencadrizine/overdose_process(mob/living/M)
- if(prob(66))
- M.losebreath++
- M.adjustOxyLoss(4, 0)
- if(prob(40))
- M.AdjustUnconscious(20)
- if(prob(10))
- M.adjustOrganLoss(ORGAN_SLOT_EYES, 3)
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 7)
- ..()
-
-/datum/reagent/medicine/carfencadrizine/addiction_act_stage1(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
- ..()
-
-/datum/reagent/medicine/carfencadrizine/addiction_act_stage2(mob/living/M)
- if(prob(33))
- M.drop_all_held_items()
- M.adjustToxLoss(1*REM, 0)
- . = 1
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- M.set_timed_status_effect(6 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- if(prob(15))
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 1)
- ..()
-
-/datum/reagent/medicine/carfencadrizine/addiction_act_stage3(mob/living/M)
- if(prob(50))
- M.drop_all_held_items()
- M.adjustToxLoss(1*REM, 0)
- . = 1
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- if(prob(30))
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 1)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 2)
- ..()
-
-/datum/reagent/medicine/carfencadrizine/addiction_act_stage4(mob/living/M)
- if(prob(60))
- M.drop_all_held_items()
- M.adjustToxLoss(1*REM, 0)
- . = 1
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/dizziness, only_if_higher = TRUE)
- M.set_timed_status_effect(8 SECONDS * REM, /datum/status_effect/jitter, only_if_higher = TRUE)
- if(prob(40))
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 2)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 2)
- ..()
-
-// helps bleeding wounds clot faster
-/datum/reagent/medicine/chitosan
- name = "chitosan"
- description = "Vastly improves the blood's natural ability to coagulate and stop bleeding by hightening platelet production and effectiveness. Overdosing will cause extreme blood clotting, resulting in potential brain damage."
- reagent_state = LIQUID
- color = "#bb2424"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 20
- /// The bloodiest wound that the patient has will have its blood_flow reduced by this much each tick
- var/clot_rate = 0.3
- /// While this reagent is in our bloodstream, we reduce all bleeding by this factor
- var/passive_bleed_modifier = 0.7
- /// For tracking when we tell the person we're no longer bleeding
- var/was_working
-
-/datum/reagent/medicine/chitosan/on_mob_metabolize(mob/living/M)
- ADD_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan)
-
- if(!ishuman(M))
- return
-
- var/mob/living/carbon/human/blood_boy = M
- blood_boy.physiology?.bleed_mod *= passive_bleed_modifier
- return ..()
-
-/datum/reagent/medicine/chitosan/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_COAGULATING, /datum/reagent/medicine/chitosan)
-
- if(was_working)
- to_chat(M, span_warning("The medicine thickening your blood loses its effect!"))
- if(!ishuman(M))
- return
-
- var/mob/living/carbon/human/blood_boy = M
- blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
-
- return ..()
-
-/datum/reagent/medicine/chitosan/on_mob_life(mob/living/carbon/M)
- . = ..()
- if(!M.blood_volume || !M.all_wounds)
- return
-
- var/datum/wound/bloodiest_wound
-
- for(var/i in M.all_wounds)
- var/datum/wound/iter_wound = i
- if(iter_wound.blood_flow)
- if(iter_wound.blood_flow > bloodiest_wound?.blood_flow)
- bloodiest_wound = iter_wound
-
- if(bloodiest_wound)
- if(!was_working)
- to_chat(M, span_green("You can feel your flowing blood start thickening!"))
- was_working = TRUE
- bloodiest_wound.blood_flow = max(0, bloodiest_wound.blood_flow - clot_rate)
- else if(was_working)
- was_working = FALSE
-
-/datum/reagent/medicine/chitosan/overdose_process(mob/living/carbon/M)
- . = ..()
- if(!M.blood_volume)
- return
-
- if(prob(15))
- M.losebreath += rand(2,4)
- M.adjustOxyLoss(rand(1,3))
- if(prob(30))
- to_chat(M, span_danger("You can feel your blood clotting up in your veins!"))
- else if(prob(10))
- to_chat(M, span_userdanger("You feel like your blood has stopped moving!"))
- M.adjustOxyLoss(rand(3,4))
-
- if(prob(50))
- var/obj/item/organ/lungs/our_lungs = M.getorganslot(ORGAN_SLOT_LUNGS)
- our_lungs.applyOrganDamage(1)
- else if(prob(25))
- var/obj/item/organ/lungs/our_brain = M.getorganslot(ORGAN_SLOT_BRAIN)
- our_brain.applyOrganDamage(1)
- else
- var/obj/item/organ/heart/our_heart = M.getorganslot(ORGAN_SLOT_HEART)
- our_heart.applyOrganDamage(1)
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 722e37194fd..13990f81670 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -292,51 +292,9 @@
M.adjustFireLoss(2, 0) // burns
..()
-/datum/reagent/fuel/unholywater //if you somehow managed to extract this from someone, dont splash it on yourself and have a smoke
- name = "Unholy Water"
- description = "Something that shouldn't exist on this plane of existence."
- taste_description = "suffering"
-
-/datum/reagent/fuel/unholywater/expose_mob(mob/living/M, method=TOUCH, reac_volume)
- if((method == TOUCH || method == SMOKE) || method == VAPOR)
- M.reagents.add_reagent(type,reac_volume/4)
- return
- return ..()
-
-/datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M)
- // Will deal about 90 damage when 50 units are thrown
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150)
- M.adjustToxLoss(2, 0)
- M.adjustFireLoss(2, 0)
- M.adjustOxyLoss(2, 0)
- M.adjustBruteLoss(2, 0)
- holder.remove_reagent(type, 1)
- return TRUE
-
-/datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god
- name = "Hell Water"
- description = "YOUR FLESH! IT BURNS!"
- taste_description = "burning"
- accelerant_quality = 20
- process_flags = ORGANIC | SYNTHETIC
-
-/datum/reagent/hellwater/on_mob_life(mob/living/carbon/M)
- M.fire_stacks = min(5,M.fire_stacks + 3)
- M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
- M.adjustToxLoss(1, 0)
- M.adjustFireLoss(1, 0) //Hence the other damages... ain't I a bastard?
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 5, 150)
- holder.remove_reagent(type, 1)
-
-/datum/reagent/medicine/omnizine/godblood
- name = "Godblood"
- description = "Slowly heals all damage types. Has a rather high overdose threshold. Glows with mysterious power."
- overdose_threshold = 150
-
-///Used for clownery
/datum/reagent/lube
- name = "Space Lube"
- description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them. giggity."
+ name = "Industrial Lubricant"
+ description = "Lubricant is a substance introduced between two moving surfaces to reduce the friction and wear between them."
color = "#009CA8" // rgb: 0, 156, 168
taste_description = "cherry" // by popular demand
var/lube_kind = TURF_WET_LUBE ///What kind of slipperiness gets added to turfs.
@@ -347,12 +305,6 @@
if(reac_volume >= 1)
T.MakeSlippery(lube_kind, 15 SECONDS, min(reac_volume * 2 SECONDS, 120))
-///Stronger kind of lube. Applies TURF_WET_SUPERLUBE.
-/datum/reagent/lube/superlube
- name = "Super Duper Lube"
- description = "This \[REDACTED\] has been outlawed after the incident on \[DATA EXPUNGED\]."
- lube_kind = TURF_WET_SUPERLUBE
-
/datum/reagent/spraytan
name = "Spray Tan"
description = "A substance applied to the skin to darken the skin."
@@ -437,33 +389,6 @@
H.visible_message("[H] suddenly transforms!")
randomize_human(H)
-/datum/reagent/aslimetoxin
- name = "Advanced Mutation Toxin"
- description = "An advanced corruptive toxin produced by slimes."
- color = "#13BC5E" // rgb: 19, 188, 94
- taste_description = "slime"
-
-/datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume)
- if(method != TOUCH && method != SMOKE)
- L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
-
-/datum/reagent/gluttonytoxin
- name = "Gluttony's Blessing"
- description = "An advanced corruptive toxin produced by something terrible."
- color = "#5EFF3B" //RGB: 94, 255, 59
- can_synth = FALSE
- taste_description = "decay"
-
-/datum/reagent/gluttonytoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume)
- L.ForceContractDisease(new /datum/disease/transformation/morph(), FALSE, TRUE)
-
-/datum/reagent/serotrotium
- name = "Serotrotium"
- description = "A chemical compound that promotes concentrated production of the serotonin neurotransmitter in humans."
- color = "#202040" // rgb: 20, 20, 40
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- taste_description = "bitterness"
-
/datum/reagent/oxygen
name = "Oxygen"
description = "A colorless, odorless gas. Grows on trees but is still pretty valuable."
@@ -1491,13 +1416,8 @@
myseed.adjust_weed_chance(round(chems.get_reagent_amount(type) * 0.3))
myseed.adjust_production(-round(chems.get_reagent_amount(type) * 0.075))
-
-
-
// GOON OTHERS
-
-
/datum/reagent/fuel/oil
name = "Oil"
description = "Burns in a small smoky fire, can be used to get Ash."
@@ -2319,13 +2239,13 @@
/datum/reagent/crystal_reagent
name = "Crystal Reagent"
- description = "A strange crystal substance. Heals faster than omnizine."
+ description = "A strange crystalline substance with an impressive healing factor."
reagent_state = LIQUID
color = "#1B9681"
metabolization_rate = 0.5 * REAGENTS_METABOLISM
overdose_threshold = 20
- taste_description = "rocks"
- var/healing = 0.8
+ taste_description = "sharp rocks"
+ var/healing = 2
/datum/reagent/crystal_reagent/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-healing*REM, 0)
@@ -2395,12 +2315,11 @@
)
/datum/reagent/three_eye/on_mob_metabolize(mob/living/L)
. = ..()
- //addtimer(CALLBACK(L, TYPE_PROC_REF(/mob, add_client_colour), /datum/client_colour/thirdeye), 1.5 SECONDS)
L.add_client_colour(/datum/client_colour/thirdeye)
if(L.client?.holder) //You are worthy.
worthy = TRUE
- L.visible_message(span_danger("Grips their head and dances around, collapsing to the floor!"), \
- span_danger("Visions of a realm BYOND your own flash across your eyes, before it all goes black..."))
+ L.visible_message(span_danger("[L] grips their head and dances around, collapsing to the floor!"), \
+ span_danger("Visions of a realm BYOND your own flash across your eyes, before it all goes black..."))
addtimer(CALLBACK(L, TYPE_PROC_REF(/mob/living, set_sleeping), 40 SECONDS), 10 SECONDS)
addtimer(CALLBACK(L.reagents, TYPE_PROC_REF(/datum/reagents, remove_reagent), src.type, src.volume,), 10 SECONDS)
return
@@ -2420,7 +2339,7 @@
H.seizure()
H.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(2, 4))
if(prob(7))
- to_chat(M, span_warning("[pick(dose_messages)]"))
+ to_chat(M, span_warning("[pick(dose_messages)]"))
/datum/reagent/three_eye/overdose_start(mob/living/M)
on_mob_metabolize(M) //set worthy
diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
index bf425d23534..c4d68f26a38 100644
--- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm
@@ -512,25 +512,6 @@
else
..()
-/datum/reagent/toxin/fentanyl
- name = "Fentanyl"
- description = "Fentanyl will inhibit brain function and cause toxin damage before eventually knocking out its victim."
- reagent_state = LIQUID
- color = "#64916E"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- toxpwr = 0
-
-/datum/reagent/toxin/fentanyl/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3*REM, 150)
- if(M.toxloss <= 60)
- M.adjustToxLoss(1*REM, 0)
- if(current_cycle >= 4)
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "smacked out", /datum/mood_event/narcotic_heavy, name)
- if(current_cycle >= 18)
- M.Sleeping(40)
- ..()
- return TRUE
-
/datum/reagent/toxin/cyanide
name = "Cyanide"
description = "An infamous poison known for its use in assassination. Causes small amounts of toxin damage with a small chance of oxygen damage or a stun."
diff --git a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm b/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
deleted file mode 100644
index c68438fa73c..00000000000
--- a/code/modules/reagents/chemistry/recipes/cat2_medicines.dm
+++ /dev/null
@@ -1,86 +0,0 @@
-
-
-/*****BRUTE*****/
-
-/datum/chemical_reaction/helbital
- results = list(/datum/reagent/medicine/c2/helbital = 3)
- required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1)
- mix_message = "The mixture turns into a thick, yellow powder."
-
-/datum/chemical_reaction/libital
- results = list(/datum/reagent/medicine/c2/libital = 3)
- required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/oxygen = 1, /datum/reagent/nitrogen = 1)
-
-
-/*WS Begin - Fixes medicines
-
-/datum/chemical_reaction/probital
- results = list(/datum/reagent/medicine/c2/probital = 4)
- required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1)
-
-WS End */
-
-/*****BURN*****/
-
-/*WS Begin - No CobbyChems
-
-/datum/chemical_reaction/lenturi
- results = list(/datum/reagent/medicine/c2/lenturi = 5)
- required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1)
-
-*/
-
-/datum/chemical_reaction/aiuri
- results = list(/datum/reagent/medicine/c2/aiuri = 4)
- required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2)
-
-/*WS Begin - Fixes medicines
-
-/datum/chemical_reaction/hercuri
- results = list(/datum/reagent/medicine/c2/hercuri = 5)
- required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1)
- required_temp = 47
- is_cold_recipe = TRUE
-
-WS End */
-
-/*****OXY*****/
-
-/*WS Begin - No CobbyChems
-
-/datum/chemical_reaction/convermol
- results = list(/datum/reagent/medicine/c2/convermol = 3)
- required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1)
- required_temp = 370
- mix_message = "The mixture rapidly turns into a dense pink liquid."
-
-*/
-
-/datum/chemical_reaction/tirimol
- results = list(/datum/reagent/medicine/c2/tirimol = 5)
- required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2)
- required_catalysts = list(/datum/reagent/toxin/acid = 1)
-
-/*****TOX*****/
-
-/datum/chemical_reaction/seiver
- results = list(/datum/reagent/medicine/c2/seiver = 3)
- required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/potassium = 1, /datum/reagent/aluminium = 1)
-
-/*WS Begin - No CobbyChems
-
-/datum/chemical_reaction/multiver
- results = list(/datum/reagent/medicine/c2/multiver = 2)
- required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1)
- mix_message = "The mixture yields a fine black powder."
- required_temp = 380
-
-/datum/chemical_reaction/syriniver
- results = list(/datum/reagent/medicine/c2/syriniver = 5)
- required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2)
-
-*/
-
-/datum/chemical_reaction/penthrite
- results = list(/datum/reagent/medicine/c2/penthrite = 3)
- required_reagents = list(/datum/reagent/pentaerythritol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid/nitracid = 1 , /datum/reagent/wittel = 1)
diff --git a/code/modules/reagents/chemistry/recipes/drugs.dm b/code/modules/reagents/chemistry/recipes/drugs.dm
index ecfc31e5e76..36aa9d73477 100644
--- a/code/modules/reagents/chemistry/recipes/drugs.dm
+++ b/code/modules/reagents/chemistry/recipes/drugs.dm
@@ -59,3 +59,4 @@
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
mix_message = "The mixture concentrates into itself, taking on a deep coloration!"
required_temp = 150
+ is_cold_recipe = TRUE
diff --git a/code/modules/reagents/chemistry/recipes/medical_consumables.dm b/code/modules/reagents/chemistry/recipes/medical_consumables.dm
new file mode 100644
index 00000000000..259a5efe409
--- /dev/null
+++ b/code/modules/reagents/chemistry/recipes/medical_consumables.dm
@@ -0,0 +1,11 @@
+/datum/chemical_reaction/medmesh
+ required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
+ mob_react = FALSE
+
+/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume)
+ var/location = get_turf(holder.my_atom)
+ for(var/i in 1 to created_volume)
+ new /obj/item/stack/medical/mesh/advanced(location)
+
+/datum/chemical_reaction/medmesh/ash
+ required_reagents = list(/datum/reagent/ash_fibers = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
diff --git a/code/modules/reagents/chemistry/recipes/medicine.dm b/code/modules/reagents/chemistry/recipes/medicine.dm
index d973ec45275..221c20ee2d4 100644
--- a/code/modules/reagents/chemistry/recipes/medicine.dm
+++ b/code/modules/reagents/chemistry/recipes/medicine.dm
@@ -1,105 +1,58 @@
+// brute chems
-/datum/chemical_reaction/bicaridine
- results = list(/datum/reagent/medicine/bicaridine = 3)
- required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
-
-/datum/chemical_reaction/bicaridinep
- results = list(/datum/reagent/medicine/bicaridinep = 3)
- required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/sodiumchloride = 1)
-
-/datum/chemical_reaction/kelotane
- results = list(/datum/reagent/medicine/kelotane = 2)
- required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1)
-
-/datum/chemical_reaction/dermaline
- results = list(/datum/reagent/medicine/dermaline = 3)
- required_reagents = list(/datum/reagent/medicine/kelotane = 1, /datum/reagent/acetone = 1, /datum/reagent/phosphorus = 1)
-
-/datum/chemical_reaction/antitoxin
- results = list(/datum/reagent/medicine/antitoxin = 3)
- required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
-
-/datum/chemical_reaction/dexalin
- results = list(/datum/reagent/medicine/dexalin = 5)
- required_reagents = list(/datum/reagent/oxygen = 5)
- required_catalysts = list(/datum/reagent/toxin/plasma = 1)
-
-/datum/chemical_reaction/dexalinp
- results = list(/datum/reagent/medicine/dexalinp = 3)
- required_reagents = list(/datum/reagent/medicine/dexalin = 1, /datum/reagent/carbon = 1, /datum/reagent/iron = 1)
-
-/datum/chemical_reaction/tricordrazine
- results = list(/datum/reagent/medicine/tricordrazine = 3)
- required_reagents = list(/datum/reagent/medicine/bicaridine = 1, /datum/reagent/medicine/kelotane = 1, /datum/reagent/medicine/antitoxin = 1)
-
-/datum/chemical_reaction/tetracordrazine
- results = list(/datum/reagent/medicine/tetracordrazine = 4)
- required_reagents = list(/datum/reagent/medicine/tricordrazine = 3, /datum/reagent/medicine/dexalin = 1)
-/datum/chemical_reaction/synthflesh
- results = list(/datum/reagent/medicine/synthflesh = 3)
- required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/styptic_powder = 1)
+/datum/chemical_reaction/indomide
+ results = list(/datum/reagent/medicine/indomide = 4)
+ required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1)
-/datum/chemical_reaction/styptic_powder
- results = list(/datum/reagent/medicine/styptic_powder = 4)
- required_reagents = list(/datum/reagent/aluminium = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1)
+/datum/chemical_reaction/hadrakine
+ results = list(/datum/reagent/medicine/hadrakine = 4)
+ required_reagents = list(/datum/reagent/aluminium = 3, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1)
mix_message = "The solution yields an astringent powder."
-/datum/chemical_reaction/corazone
- results = list(/datum/reagent/medicine/corazone = 3)
- required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1)
-
-/datum/chemical_reaction/carthatoline
- results = list(/datum/reagent/medicine/carthatoline = 3)
- required_reagents = list(/datum/reagent/medicine/antitoxin = 1, /datum/reagent/carbon = 2)
- required_catalysts = list(/datum/reagent/toxin/plasma = 1)
-
-/*/datum/chemical_reaction/hepanephrodaxon //WS edit: temporary removal of an overloaded chem
- results = list(/datum/reagent/medicine/hepanephrodaxon = 5)
- required_reagents = list(/datum/reagent/medicine/carthatoline = 2, /datum/reagent/carbon = 2, /datum/reagent/lithium = 1)
- required_catalysts = list(/datum/reagent/toxin/plasma = 5)*/
-
-/datum/chemical_reaction/system_cleaner
- results = list(/datum/reagent/medicine/system_cleaner = 4)
- required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1)
-
-/datum/chemical_reaction/liquid_solder
- results = list(/datum/reagent/medicine/liquid_solder = 3)
- required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1)
- required_temp = 370
- mix_message = "The mixture becomes a metallic slurry."
+/datum/chemical_reaction/silfrine
+ results = list(/datum/reagent/medicine/silfrine = 5)
+ required_reagents = list(/datum/reagent/silver = 3, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/toxin/acid = 1)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 2)
+ required_temp = 450
+ mix_message = "The solution rapidly bubbles, before yielding a dark blue compound"
-/datum/chemical_reaction/perfluorodecalin
- results = list(/datum/reagent/medicine/perfluorodecalin = 3)
- required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1)
- required_temp = 370
- mix_message = "The mixture rapidly turns into a dense pink liquid."
+// burn chems
/datum/chemical_reaction/leporazine
results = list(/datum/reagent/medicine/leporazine = 2)
required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/copper = 1)
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
-/datum/chemical_reaction/rezadone
- results = list(/datum/reagent/medicine/rezadone = 3)
- required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1)
+/datum/chemical_reaction/alvitane
+ results = list(/datum/reagent/medicine/alvitane = 4)
+ required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1, /datum/reagent/silver = 2)
+ required_catalysts = list(/datum/reagent/cryptobiolin = 5)
+ required_temp = 220
+ is_cold_recipe = TRUE
+ mix_message = "The solution quietly incorporates as the temperatures drop."
-/datum/chemical_reaction/spaceacillin
- results = list(/datum/reagent/medicine/spaceacillin = 2)
- required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1)
+/datum/chemical_reaction/quardexane
+ results = list(/datum/reagent/medicine/quardexane = 5)
+ required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1)
-/datum/chemical_reaction/oculine
- results = list(/datum/reagent/medicine/oculine = 3)
- required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1)
- mix_message = "The mixture bubbles noticeably and becomes a dark grey color!"
+/datum/chemical_reaction/ysiltane
+ results = list(/datum/reagent/medicine/ysiltane = 5)
+ required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/hydrogen = 1, /datum/reagent/chlorine = 1)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 10)
+ mix_message = "The solution quickly fizzes, a small cloud of smoke coming out!"
-/datum/chemical_reaction/inacusiate
- results = list(/datum/reagent/medicine/inacusiate = 2)
- required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/charcoal = 1)
- mix_message = "The mixture sputters loudly and becomes a light grey color!"
+/datum/chemical_reaction/ysiltane/on_reaction(datum/reagents/holder, created_volume)
+ var/datum/effect_system/smoke_spread/bad/smoke = new (get_turf(holder.my_atom))
+ smoke.set_up(1, src)
+ smoke.start()
+ qdel(smoke)
-/datum/chemical_reaction/synaptizine
- results = list(/datum/reagent/medicine/synaptizine = 3)
- required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1)
+// toxin chems
+
+/datum/chemical_reaction/calomel
+ results = list(/datum/reagent/medicine/calomel = 2)
+ required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1)
+ required_temp = 374
/datum/chemical_reaction/charcoal
results = list(/datum/reagent/medicine/charcoal = 2)
@@ -107,34 +60,29 @@
mix_message = "The mixture yields a fine black powder."
required_temp = 380
-/datum/chemical_reaction/silver_sulfadiazine
- results = list(/datum/reagent/medicine/silver_sulfadiazine = 5)
- required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/silver = 1, /datum/reagent/sulfur = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1)
-
-/datum/chemical_reaction/salglu_solution
- results = list(/datum/reagent/medicine/salglu_solution = 3)
- required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1)
-
-/datum/chemical_reaction/mine_salve
- results = list(/datum/reagent/medicine/mine_salve = 3)
- required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1)
+/datum/chemical_reaction/pancrazine
+ results = list(/datum/reagent/medicine/pancrazine = 3)
+ required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
+ required_catalysts = list(/datum/reagent/ammonia = 5)
-/datum/chemical_reaction/mine_salve2
- results = list(/datum/reagent/medicine/mine_salve = 15)
- required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these
+/datum/chemical_reaction/gjalrazine
+ results = list(/datum/reagent/medicine/gjalrazine = 10)
+ required_reagents = list(/datum/reagent/medicine/pancrazine = 3, /datum/reagent/carbon = 4, /datum/reagent/diethylamine = 3)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 1)
-/*WS Begin - No Cobbychmes
+// oxygen chems
-/datum/chemical_reaction/instabitaluri
- results = list(/datum/reagent/medicine/c2/instabitaluri = 3)
- required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/c2/libital = 1)
+/datum/chemical_reaction/dexalin
+ results = list(/datum/reagent/medicine/dexalin = 5)
+ required_reagents = list(/datum/reagent/oxygen = 5)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 1)
-WS End */
+/datum/chemical_reaction/salbutamol
+ results = list(/datum/reagent/medicine/salbutamol = 5)
+ required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1)
+ required_catalysts = list(/datum/reagent/toxin/acid)
-/datum/chemical_reaction/calomel
- results = list(/datum/reagent/medicine/calomel = 2)
- required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/chlorine = 1)
- required_temp = 374
+///radiation chems
/datum/chemical_reaction/potass_iodide
results = list(/datum/reagent/medicine/potass_iodide = 2)
@@ -144,48 +92,63 @@ WS End */
results = list(/datum/reagent/medicine/pen_acid = 6)
required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/chlorine = 1, /datum/reagent/ammonia = 1, /datum/reagent/toxin/formaldehyde = 1, /datum/reagent/sodium = 1, /datum/reagent/toxin/cyanide = 1)
-/datum/chemical_reaction/sal_acid
- results = list(/datum/reagent/medicine/sal_acid = 5)
- required_reagents = list(/datum/reagent/sodium = 1, /datum/reagent/phenol = 1, /datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/toxin/acid = 1)
-/datum/chemical_reaction/oxandrolone
- results = list(/datum/reagent/medicine/oxandrolone = 6)
- required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1)
+///Multi-damage chems
-/datum/chemical_reaction/salbutamol
- results = list(/datum/reagent/medicine/salbutamol = 5)
- required_reagents = list(/datum/reagent/medicine/sal_acid = 1, /datum/reagent/lithium = 1, /datum/reagent/aluminium = 1, /datum/reagent/bromine = 1, /datum/reagent/ammonia = 1)
+/datum/chemical_reaction/synthflesh
+ results = list(/datum/reagent/medicine/synthflesh = 3)
+ required_reagents = list(/datum/reagent/blood = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/hadrakine = 1)
-/datum/chemical_reaction/ephedrine
- results = list(/datum/reagent/medicine/ephedrine = 4)
- required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1)
- mix_message = "The solution fizzes and gives off toxic fumes."
+/datum/chemical_reaction/cryoxadone
+ results = list(/datum/reagent/medicine/cryoxadone = 3)
+ required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1)
-/datum/chemical_reaction/diphenhydramine
- results = list(/datum/reagent/medicine/diphenhydramine = 4)
- required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1)
- mix_message = "The mixture dries into a pale blue powder."
+/datum/chemical_reaction/cureall
+ results = list(/datum/reagent/medicine/cureall = 3)
+ required_reagents = list(/datum/reagent/medicine/alvitane = 1, /datum/reagent/medicine/indomide = 1, /datum/reagent/medicine/charcoal = 1)
-/datum/chemical_reaction/oculine
- results = list(/datum/reagent/medicine/oculine = 3)
- required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1)
- mix_message = "The mixture sputters loudly and becomes a pale pink color."
+/datum/chemical_reaction/cureall_alternative
+ results = list(/datum/reagent/medicine/cureall = 5)
+ required_reagents = list(/datum/reagent/medicine/panacea/effluvial = 5, /datum/reagent/toxin/plasma = 1)
+ mix_message = "The plasma begins tinting the compound as it incorporates into the mix"
-/datum/chemical_reaction/atropine
- results = list(/datum/reagent/medicine/atropine = 5)
- required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1)
+/datum/chemical_reaction/panacea
+ results = list(/datum/reagent/medicine/panacea = 5)
+ required_reagents = list(/datum/reagent/medicine/panacea/effluvial = 3, /datum/reagent/stable_plasma = 1, /datum/reagent/medicine/cryoxadone = 1)
+ required_temp = 78
+ is_cold_recipe = TRUE
-/datum/chemical_reaction/epinephrine
- results = list(/datum/reagent/medicine/epinephrine = 6)
- required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1)
+/datum/chemical_reaction/hunter_extract
+ results = list(/datum/reagent/medicine/hunter_extract = 5)
+ required_reagents = list(/datum/reagent/consumable/vitfro = 1, /datum/reagent/medicine/puce_essence = 2, /datum/reagent/toxin/plasma = 2)
+
+///Blood chems
+
+/datum/chemical_reaction/chitosan
+ results = list(/datum/reagent/medicine/chitosan = 10)
+ required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/consumable/sugar = 2, /datum/reagent/cryptobiolin = 1)
+ required_temp = 380
+
+/datum/chemical_reaction/chitosan_failure
+ results = list(/datum/reagent/carbon = 1)
+ required_reagents = list(/datum/reagent/medicine/chitosan = 1)
+ required_temp = 405
+
+/datum/chemical_reaction/salglu_solution
+ results = list(/datum/reagent/medicine/salglu_solution = 3)
+ required_reagents = list(/datum/reagent/consumable/sodiumchloride = 1, /datum/reagent/water = 1, /datum/reagent/consumable/sugar = 1)
+
+///Organ chems
-/datum/chemical_reaction/strange_reagent
- results = list(/datum/reagent/medicine/strange_reagent = 3)
- required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+/datum/chemical_reaction/oculine
+ results = list(/datum/reagent/medicine/oculine = 3)
+ required_reagents = list(/datum/reagent/medicine/charcoal = 1, /datum/reagent/carbon = 1, /datum/reagent/hydrogen = 1)
+ mix_message = "The mixture bubbles noticeably and becomes a dark grey color!"
-/datum/chemical_reaction/strange_reagent/alt
- results = list(/datum/reagent/medicine/strange_reagent = 2)
- required_reagents = list(/datum/reagent/medicine/omnizine/protozine = 1, /datum/reagent/water/holywater = 1, /datum/reagent/toxin/mutagen = 1)
+/datum/chemical_reaction/inacusiate
+ results = list(/datum/reagent/medicine/inacusiate = 2)
+ required_reagents = list(/datum/reagent/water = 1, /datum/reagent/carbon = 1, /datum/reagent/medicine/charcoal = 1)
+ mix_message = "The mixture sputters loudly and becomes a light grey color!"
/datum/chemical_reaction/mannitol
results = list(/datum/reagent/medicine/mannitol = 3)
@@ -196,49 +159,30 @@ WS End */
results = list(/datum/reagent/medicine/neurine = 3)
required_reagents = list(/datum/reagent/medicine/mannitol = 1, /datum/reagent/acetone = 1, /datum/reagent/oxygen = 1)
-/datum/chemical_reaction/mutadone
- results = list(/datum/reagent/medicine/mutadone = 3)
- required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1)
-
-/datum/chemical_reaction/antihol
- results = list(/datum/reagent/medicine/antihol = 3)
- required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/copper = 1)
-
-/datum/chemical_reaction/cryoxadone
- results = list(/datum/reagent/medicine/cryoxadone = 3)
- required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/mutagen = 1)
-
-/datum/chemical_reaction/pyroxadone
- results = list(/datum/reagent/medicine/pyroxadone = 2)
- required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
-
-/datum/chemical_reaction/clonexadone
- results = list(/datum/reagent/medicine/clonexadone = 2)
- required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1)
- required_catalysts = list(/datum/reagent/toxin/plasma = 5)
-
-/datum/chemical_reaction/haloperidol
- results = list(/datum/reagent/medicine/haloperidol = 5)
- required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1)
+/datum/chemical_reaction/corazone
+ results = list(/datum/reagent/medicine/corazone = 3)
+ required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/lithium = 1)
-/datum/chemical_reaction/regen_jelly
- results = list(/datum/reagent/medicine/regen_jelly = 1)
- required_reagents = list(/datum/reagent/medicine/tetracordrazine = 1, /datum/reagent/toxin/slimejelly = 1)
+///pain chems
-/datum/chemical_reaction/regen_jelly2
- results = list(/datum/reagent/medicine/regen_jelly = 2)
- required_reagents = list(/datum/reagent/medicine/omnizine = 1, /datum/reagent/toxin/slimejelly = 1)
+/datum/chemical_reaction/tramal
+ results = list(/datum/reagent/medicine/tramal = 2) // these make me kinda wish i knew irl chem so i could have better recipes.
+ required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1)
+ required_catalysts = list(/datum/reagent/ammonia = 2)
+ required_temp = 340
/datum/chemical_reaction/morphine
results = list(/datum/reagent/medicine/morphine = 2)
required_reagents = list(/datum/reagent/carbon = 2, /datum/reagent/hydrogen = 2, /datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1)
required_temp = 480
-/datum/chemical_reaction/tramal
- results = list(/datum/reagent/medicine/tramal = 2) // these make me kinda wish i knew irl chem so i could have better recipes.
- required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1)
- required_catalysts = list(/datum/reagent/ammonia = 2)
- required_temp = 340
+
+/datum/chemical_reaction/carfen
+ results = list(/datum/reagent/medicine/carfencadrizine = 4)
+ required_reagents = list(/datum/reagent/medicine/dimorlin = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/sugar = 2)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 2)
+ required_temp = 127
+ is_cold_recipe = TRUE
/datum/chemical_reaction/dimorlin
results = list(/datum/reagent/medicine/dimorlin = 2, /datum/reagent/hydrogen = 2)
@@ -246,6 +190,28 @@ WS End */
required_temp = 730
mix_message = "The mixture rapidly incorporates, leaving a layer of liquid hydrogen atop!"
+/// status chems
+
+/datum/chemical_reaction/spaceacillin
+ results = list(/datum/reagent/medicine/spaceacillin = 2)
+ required_reagents = list(/datum/reagent/cryptobiolin = 1, /datum/reagent/medicine/epinephrine = 1)
+
+/datum/chemical_reaction/synaptizine
+ results = list(/datum/reagent/medicine/synaptizine = 3)
+ required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1)
+
+/datum/chemical_reaction/mutadone
+ results = list(/datum/reagent/medicine/mutadone = 3)
+ required_reagents = list(/datum/reagent/toxin/mutagen = 1, /datum/reagent/acetone = 1, /datum/reagent/bromine = 1)
+
+/datum/chemical_reaction/antihol
+ results = list(/datum/reagent/medicine/antihol = 3)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/medicine/charcoal = 1, /datum/reagent/copper = 1)
+
+/datum/chemical_reaction/haloperidol
+ results = list(/datum/reagent/medicine/haloperidol = 5)
+ required_reagents = list(/datum/reagent/chlorine = 1, /datum/reagent/fluorine = 1, /datum/reagent/aluminium = 1, /datum/reagent/medicine/potass_iodide = 1, /datum/reagent/fuel/oil = 1)
+
/datum/chemical_reaction/modafinil
results = list(/datum/reagent/medicine/modafinil = 5)
required_reagents = list(/datum/reagent/diethylamine = 1, /datum/reagent/ammonia = 1, /datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/toxin/acid = 1)
@@ -255,54 +221,68 @@ WS End */
results = list(/datum/reagent/medicine/psicodine = 5)
required_reagents = list(/datum/reagent/medicine/mannitol = 2, /datum/reagent/water = 2, /datum/reagent/impedrezene = 1)
-/datum/chemical_reaction/medmesh
- required_reagents = list(/datum/reagent/cellulose = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
- mob_react = FALSE
+/datum/chemical_reaction/diphenhydramine
+ results = list(/datum/reagent/medicine/diphenhydramine = 4)
+ required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/carbon = 1, /datum/reagent/bromine = 1, /datum/reagent/diethylamine = 1, /datum/reagent/consumable/ethanol = 1)
+ mix_message = "The mixture dries into a pale blue powder."
+
+/datum/chemical_reaction/lithium_carbonate
+ results = list(/datum/reagent/medicine/lithium_carbonate = 3)
+ required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/carbon = 1, /datum/reagent/water = 1)
-/datum/chemical_reaction/medmesh/on_reaction(datum/reagents/holder, created_volume)
- var/location = get_turf(holder.my_atom)
- for(var/i in 1 to created_volume)
- new /obj/item/stack/medical/mesh/advanced(location)
+/datum/chemical_reaction/synaptizine
+ results = list(/datum/reagent/medicine/synaptizine = 3)
+ required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/lithium = 1, /datum/reagent/water = 1)
-/datum/chemical_reaction/converbital
- results = list(/datum/reagent/medicine/converbital = 3)
- required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/acetone = 1, /datum/reagent/medicine/kelotane = 1)
- mix_message = "The mixture spits and steams as it settles into a reddish-black paste"
+/// crit chems
-/datum/chemical_reaction/convuri
- results = list(/datum/reagent/medicine/convuri = 3)
- required_reagents = list(/datum/reagent/fuel = 1, /datum/reagent/ash =1, /datum/reagent/medicine/bicaridine = 1)
- mix_message = "the mixture rapidly dries into an orange powder"
+/datum/chemical_reaction/atropine
+ results = list(/datum/reagent/medicine/atropine = 5)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/phenol = 1, /datum/reagent/toxin/acid = 1)
-/datum/chemical_reaction/trophazole
- results = list(/datum/reagent/medicine/trophazole = 4)
- required_reagents = list(/datum/reagent/copper = 1, /datum/reagent/acetone = 2, /datum/reagent/phosphorus = 1)
+/datum/chemical_reaction/epinephrine
+ results = list(/datum/reagent/medicine/epinephrine = 6)
+ required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/acetone = 1, /datum/reagent/diethylamine = 1, /datum/reagent/oxygen = 1, /datum/reagent/chlorine = 1, /datum/reagent/hydrogen = 1)
-/datum/chemical_reaction/rhigoxane
- results = list(/datum/reagent/medicine/rhigoxane/ = 5)
- required_reagents = list(/datum/reagent/cryostylane = 3, /datum/reagent/bromine = 1, /datum/reagent/lye = 1)
+///things im not going to organize right now (This means they should be in another file)
-/datum/chemical_reaction/thializid
- results = list(/datum/reagent/medicine/thializid = 5)
- required_reagents = list(/datum/reagent/sulfur = 1, /datum/reagent/fluorine = 1, /datum/reagent/toxin = 1, /datum/reagent/nitrous_oxide = 2)
+/datum/chemical_reaction/rezadone
+ results = list(/datum/reagent/medicine/rezadone = 3)
+ required_reagents = list(/datum/reagent/toxin/carpotoxin = 1, /datum/reagent/cryptobiolin = 1, /datum/reagent/copper = 1)
-/datum/chemical_reaction/medsuture/ash
- required_reagents = list(/datum/reagent/ash_fibers = 10, /datum/reagent/toxin/formaldehyde = 20, /datum/reagent/medicine/polypyr = 15)
+/datum/chemical_reaction/stasis
+ results = list(/datum/reagent/medicine/stasis = 5)
+ required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/copper = 1, /datum/reagent/medicine/salglu_solution = 3)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 5)
+ required_temp = 207
+ is_cold_recipe = TRUE
-/datum/chemical_reaction/medmesh/ash
- required_reagents = list(/datum/reagent/ash_fibers = 20, /datum/reagent/consumable/aloejuice = 20, /datum/reagent/space_cleaner/sterilizine = 10)
+/datum/chemical_reaction/system_cleaner
+ results = list(/datum/reagent/medicine/system_cleaner = 4)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/chlorine = 1, /datum/reagent/phenol = 2, /datum/reagent/potassium = 1)
-/datum/chemical_reaction/lavaland_extract
- results = list(/datum/reagent/medicine/lavaland_extract = 5)
- required_reagents = list(/datum/reagent/consumable/vitfro = 1, /datum/reagent/medicine/puce_essence = 2, /datum/reagent/toxin/plasma = 2)
+/datum/chemical_reaction/liquid_solder
+ results = list(/datum/reagent/medicine/liquid_solder = 3)
+ required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/copper = 1, /datum/reagent/silver = 1)
+ required_temp = 370
+ mix_message = "The mixture becomes a metallic slurry."
/datum/chemical_reaction/bonefixingjuice
results = list(/datum/reagent/medicine/bonefixingjuice = 3)
required_reagents = list(/datum/reagent/consumable/entpoly = 1, /datum/reagent/calcium = 1, /datum/reagent/toxin/plasma = 1)
-/datum/chemical_reaction/skele_boon
- results = list(/datum/reagent/medicine/skeletons_boon = 5)
- required_reagents = list(/datum/reagent/medicine/lavaland_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5)
+/datum/chemical_reaction/mine_salve
+ results = list(/datum/reagent/medicine/mine_salve = 3)
+ required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/water = 1, /datum/reagent/iron = 1)
+
+/datum/chemical_reaction/mine_salve2
+ results = list(/datum/reagent/medicine/mine_salve = 15)
+ required_reagents = list(/datum/reagent/toxin/plasma = 5, /datum/reagent/iron = 5, /datum/reagent/consumable/sugar = 1) // A sheet of plasma, a twinkie and a sheet of metal makes four of these
+
+/datum/chemical_reaction/ephedrine
+ results = list(/datum/reagent/medicine/ephedrine = 4)
+ required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fuel/oil = 1, /datum/reagent/hydrogen = 1, /datum/reagent/diethylamine = 1)
+ mix_message = "The solution fizzes and gives off toxic fumes."
/datum/chemical_reaction/pure_soulus_dust_hollow
results = list(/datum/reagent/medicine/soulus/pure = 20,)
@@ -315,29 +295,3 @@ WS End */
/datum/chemical_reaction/chartreuse
results = list(/datum/reagent/medicine/chartreuse = 10)
required_reagents = list(/datum/reagent/medicine/puce_essence = 5, /datum/reagent/consumable/tinlux = 5, /datum/reagent/consumable/entpoly = 1)
-
-/datum/chemical_reaction/lithium_carbonate
- results = list(/datum/reagent/medicine/lithium_carbonate = 3)
- required_reagents = list(/datum/reagent/lithium = 1, /datum/reagent/carbon = 1, /datum/reagent/water = 1)
-
-/datum/chemical_reaction/chitosan
- results = list(/datum/reagent/medicine/chitosan = 10)
- required_reagents = list(/datum/reagent/silicon = 1, /datum/reagent/consumable/sugar = 2, /datum/reagent/cryptobiolin = 1)
- required_temp = 380
-
-/datum/chemical_reaction/chitosan_failure
- results = list(/datum/reagent/carbon = 1)
- required_reagents = list(/datum/reagent/medicine/chitosan = 1)
- required_temp = 405
-
-/datum/chemical_reaction/stasis
- results = list(/datum/reagent/medicine/stasis = 5)
- required_reagents = list(/datum/reagent/phenol = 1, /datum/reagent/copper = 1, /datum/reagent/medicine/salglu_solution = 3)
- required_catalysts = list(/datum/reagent/toxin/plasma = 5)
- required_temp = 207
-
-/datum/chemical_reaction/carfen
- results = list(/datum/reagent/medicine/carfencadrizine = 4)
- required_reagents = list(/datum/reagent/medicine/dimorlin = 1, /datum/reagent/medicine/synaptizine = 1, /datum/reagent/consumable/sugar = 2)
- required_catalysts = list(/datum/reagent/toxin/plasma = 2)
- required_temp = 127
diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm
index 3450e1f4634..897c833214f 100644
--- a/code/modules/reagents/chemistry/recipes/others.dm
+++ b/code/modules/reagents/chemistry/recipes/others.dm
@@ -7,14 +7,6 @@
results = list(/datum/reagent/lube = 4)
required_reagents = list(/datum/reagent/water = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
-/datum/chemical_reaction/spraytan
- results = list(/datum/reagent/spraytan = 2)
- required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/fuel/oil = 1)
-
-/datum/chemical_reaction/spraytan2
- results = list(/datum/reagent/spraytan = 2)
- required_reagents = list(/datum/reagent/consumable/orangejuice = 1, /datum/reagent/consumable/cornoil = 1)
-
/datum/chemical_reaction/impedrezene
results = list(/datum/reagent/impedrezene = 2)
required_reagents = list(/datum/reagent/mercury = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
@@ -398,7 +390,7 @@
/datum/chemical_reaction/carpet/purple
results = list(/datum/reagent/carpet/purple = 2)
- required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/medicine/regen_jelly = 1)
+ required_reagents = list(/datum/reagent/carpet = 1, /datum/reagent/colorful_reagent/powder/purple = 1)
//slimes only party
/datum/chemical_reaction/carpet/red
@@ -468,7 +460,7 @@
//butterflium
/datum/chemical_reaction/butterflium
- required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/omnizine = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1)
+ required_reagents = list(/datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/panacea = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/consumable/nutriment = 1)
/datum/chemical_reaction/butterflium/on_reaction(datum/reagents/holder, created_volume)
var/location = get_turf(holder.my_atom)
diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
index 94acf9d39cc..7a8f0069406 100644
--- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
+++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm
@@ -54,7 +54,7 @@
strengthdiv = 2
/datum/chemical_reaction/reagent_explosion/rdx
- results = list(/datum/reagent/rdx= 2)
+ results = list(/datum/reagent/rdx = 2)
required_reagents = list(/datum/reagent/phenol = 2, /datum/reagent/toxin/acid/nitracid = 1, /datum/reagent/acetone_oxide = 1)
required_temp = 404
strengthdiv = 6 //rdx deserves better than being just about equal to nitrous
@@ -133,11 +133,11 @@
/datum/chemical_reaction/reagent_explosion/penthrite_explosion_epinephrine
- required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/epinephrine = 1)
+ required_reagents = list(/datum/reagent/medicine/penthrite = 1, /datum/reagent/medicine/epinephrine = 1)
strengthdiv = 5
/datum/chemical_reaction/reagent_explosion/penthrite_explosion_atropine
- required_reagents = list(/datum/reagent/medicine/c2/penthrite = 1, /datum/reagent/medicine/atropine = 1)
+ required_reagents = list(/datum/reagent/medicine/penthrite = 1, /datum/reagent/medicine/atropine = 1)
strengthdiv = 5
modifier = 5
@@ -511,4 +511,4 @@
results = list(/datum/reagent/firefighting_foam = 3)
required_reagents = list(/datum/reagent/stabilizing_agent = 1,/datum/reagent/fluorosurfactant = 1,/datum/reagent/carbon = 1)
required_temp = 200
- is_cold_recipe = 1
+ is_cold_recipe = TRUE
diff --git a/code/modules/reagents/chemistry/recipes/toxins.dm b/code/modules/reagents/chemistry/recipes/toxins.dm
index 0d6b1b8a66f..d564913266d 100644
--- a/code/modules/reagents/chemistry/recipes/toxins.dm
+++ b/code/modules/reagents/chemistry/recipes/toxins.dm
@@ -4,11 +4,6 @@
required_reagents = list(/datum/reagent/consumable/ethanol = 1, /datum/reagent/oxygen = 1, /datum/reagent/silver = 1)
required_temp = 420
-/datum/chemical_reaction/fentanyl
- results = list(/datum/reagent/toxin/fentanyl = 1)
- required_reagents = list(/datum/reagent/drug/space_drugs = 1)
- required_temp = 674
-
/datum/chemical_reaction/cyanide
results = list(/datum/reagent/toxin/cyanide = 3)
required_reagents = list(/datum/reagent/fuel/oil = 1, /datum/reagent/ammonia = 1, /datum/reagent/oxygen = 1)
@@ -81,7 +76,7 @@
/datum/chemical_reaction/rotatium
results = list(/datum/reagent/toxin/rotatium = 3)
- required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/toxin/fentanyl = 1)
+ required_reagents = list(/datum/reagent/toxin/mindbreaker = 1, /datum/reagent/teslium = 1, /datum/reagent/drug/methamphetamine = 1)
mix_message = span_danger("After sparks, fire, and the smell of mindbreaker, the mix is constantly spinning with no stop in sight.")
/datum/chemical_reaction/anacea
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index 73f24c4aa33..fa8ca15b631 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -26,7 +26,7 @@ Borg Hypospray
var/bypass_protection = 0 //If the hypospray can go through armor or thick material
var/list/datum/reagents/reagent_list = list()
- var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/kelotane, /datum/reagent/medicine/bicaridine, /datum/reagent/medicine/antitoxin, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/morphine)
+ var/list/reagent_ids = list(/datum/reagent/medicine/dexalin, /datum/reagent/medicine/alvitane, /datum/reagent/medicine/indomide, /datum/reagent/medicine/pancrazine, /datum/reagent/medicine/epinephrine, /datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salglu_solution, /datum/reagent/medicine/morphine)
var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed.
var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values.
//Used as list for input() in shakers.
@@ -154,7 +154,7 @@ Borg Hypospray
icon_state = "borghypo_s"
charge_cost = 20
recharge_time = 2
- reagent_ids = list(/datum/reagent/medicine/syndicate_nanites, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine)
+ reagent_ids = list(/datum/reagent/medicine/panacea, /datum/reagent/medicine/potass_iodide, /datum/reagent/medicine/morphine)
bypass_protection = 1
accepts_reagent_upgrades = FALSE
@@ -249,7 +249,7 @@ Borg Shaker
/obj/item/reagent_containers/borghypo/peace/hacked
desc = "Everything's peaceful in death!"
icon_state = "borghypo_s"
- reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide,/datum/reagent/toxin/fentanyl)
+ reagent_ids = list(/datum/reagent/peaceborg/confuse,/datum/reagent/peaceborg/tire,/datum/reagent/pax/peaceborg,/datum/reagent/toxin/staminatoxin,/datum/reagent/toxin/sulfonal,/datum/reagent/toxin/sodium_thiopental,/datum/reagent/toxin/cyanide)
accepts_reagent_upgrades = FALSE
/obj/item/reagent_containers/borghypo/epi
diff --git a/code/modules/reagents/reagent_containers/bottle.dm b/code/modules/reagents/reagent_containers/bottle.dm
index a0847a5b26f..68c605cbc9f 100644
--- a/code/modules/reagents/reagent_containers/bottle.dm
+++ b/code/modules/reagents/reagent_containers/bottle.dm
@@ -69,11 +69,6 @@
desc = "A small bottle of Mannitol. Useful for healing brain damage."
list_reagents = list(/datum/reagent/medicine/mannitol = 30)
-/obj/item/reagent_containers/glass/bottle/charcoal
- name = "charcoal bottle"
- desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream."
- list_reagents = list(/datum/reagent/medicine/charcoal = 30)
-
/obj/item/reagent_containers/glass/bottle/mutagen
name = "unstable mutagen bottle"
desc = "A small bottle of unstable mutagen. Randomly changes the DNA structure of whoever comes in contact."
@@ -131,7 +126,7 @@
/obj/item/reagent_containers/glass/bottle/traitor/Initialize()
. = ..()
- extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/fentanyl, /datum/reagent/toxin/cyanide)
+ extra_reagent = pick(/datum/reagent/toxin/polonium, /datum/reagent/toxin/histamine, /datum/reagent/toxin/formaldehyde, /datum/reagent/toxin/venom, /datum/reagent/toxin/cyanide)
reagents.add_reagent(extra_reagent, 3)
/obj/item/reagent_containers/glass/bottle/polonium
@@ -149,11 +144,6 @@
desc = "A small bottle. Contains Venom."
list_reagents = list(/datum/reagent/toxin/venom = 30)
-/obj/item/reagent_containers/glass/bottle/fentanyl
- name = "fentanyl bottle"
- desc = "A small bottle. Contains Fentanyl."
- list_reagents = list(/datum/reagent/toxin/fentanyl = 30)
-
/obj/item/reagent_containers/glass/bottle/formaldehyde
name = "formaldehyde bottle"
desc = "A small bottle. Contains formaldehyde, a chemical that prevents organs from decaying."
@@ -407,23 +397,22 @@
volume = 50
list_reagents = list(/datum/reagent/medicine/epinephrine = 50)
-/obj/item/reagent_containers/glass/bottle/bicaridine
- name = "bicaridine bottle"
- desc = "A small bottle. Contains bicaridine, used to treat minor bruising."
+/obj/item/reagent_containers/glass/bottle/indomide
+ name = "indomide bottle"
+ desc = "A small bottle. Contains indomide, used to treat minor bruising."
volume = 50
- list_reagents = list(/datum/reagent/medicine/bicaridine = 50)
+ list_reagents = list(/datum/reagent/medicine/indomide = 50)
-/obj/item/reagent_containers/glass/bottle/kelotane
- name = "kelotane bottle"
- desc = "A small bottle. Contains kelotane, used for minor burns and skin damage."
+/obj/item/reagent_containers/glass/bottle/alvitane
+ name = "alvitane bottle"
+ desc = "A small bottle. Contains alvitane, used for minor burns and skin damage. Best used as injection!"
volume = 50
- list_reagents = list(/datum/reagent/medicine/kelotane = 50)
+ list_reagents = list(/datum/reagent/medicine/alvitane = 50)
-/obj/item/reagent_containers/glass/bottle/antitoxin
- name = "dylovene bottle"
- desc = "A small bottle. Contains dylovene, used to treat minor poisoning."
- volume = 50
- list_reagents = list(/datum/reagent/medicine/antitoxin = 50)
+/obj/item/reagent_containers/glass/bottle/charcoal
+ name = "charcoal bottle"
+ desc = "A small bottle of charcoal, which removes toxins and other chemicals from the bloodstream."
+ list_reagents = list(/datum/reagent/medicine/charcoal = 30)
/obj/item/reagent_containers/glass/bottle/dexalin
name = "dexalin bottle"
@@ -431,16 +420,22 @@
volume = 50
list_reagents = list(/datum/reagent/medicine/dexalin = 50)
+/obj/item/reagent_containers/glass/bottle/gjalrazine
+ name = "gjalrazine bottle"
+ desc = "A small bottle. Contains gjalrazine, used to treat major toxic damage."
+ volume = 50
+ list_reagents = list(/datum/reagent/medicine/gjalrazine = 50)
+
/obj/item/reagent_containers/glass/bottle/epinephrine/sleeper
cap_on = FALSE
-/obj/item/reagent_containers/glass/bottle/bicaridine/sleeper
+/obj/item/reagent_containers/glass/bottle/indomide/sleeper
cap_on = FALSE
-/obj/item/reagent_containers/glass/bottle/kelotane/sleeper
+/obj/item/reagent_containers/glass/bottle/alvitane/sleeper
cap_on = FALSE
-/obj/item/reagent_containers/glass/bottle/antitoxin/sleeper
+/obj/item/reagent_containers/glass/bottle/charcoal/sleeper
cap_on = FALSE
/obj/item/reagent_containers/glass/bottle/dexalin/sleeper
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index f661f39670e..17d40765ed3 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -197,13 +197,13 @@
/obj/item/reagent_containers/glass/beaker/slime
list_reagents = list(/datum/reagent/toxin/slimejelly = 50)
-/obj/item/reagent_containers/glass/beaker/large/styptic
- name = "styptic reserve tank"
- list_reagents = list(/datum/reagent/medicine/styptic_powder = 50)
+/obj/item/reagent_containers/glass/beaker/large/hadrakine
+ name = "hadrakine reserve tank"
+ list_reagents = list(/datum/reagent/medicine/hadrakine = 50)
-/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine
- name = "silver sulfadiazine reserve tank"
- list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 50)
+/obj/item/reagent_containers/glass/beaker/large/quardexane
+ name = "quardexane reserve tank"
+ list_reagents = list(/datum/reagent/medicine/quardexane = 50)
/obj/item/reagent_containers/glass/beaker/large/charcoal
name = "charcoal reserve tank"
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 8818fb83045..f299a595e5f 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -75,7 +75,7 @@
/obj/item/reagent_containers/hypospray/CMO
- list_reagents = list(/datum/reagent/medicine/omnizine = 30)
+ list_reagents = list(/datum/reagent/medicine/panacea = 30)
resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF
//combat
@@ -88,20 +88,7 @@
icon_state = "combat_hypo"
volume = 90
ignore_flags = 1 // So they can heal their comrades.
- list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/omnizine = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15)
-
-/obj/item/reagent_containers/hypospray/combat/nanites
- name = "experimental combat stimulant injector"
- desc = "A modified air-needle autoinjector for use in combat situations. Prefilled with experimental medical nanites and a stimulant for rapid healing and a combat boost."
- item_state = "nanite_hypo"
- icon_state = "nanite_hypo"
- base_icon_state = "nanite_hypo"
- volume = 100
- list_reagents = list(/datum/reagent/medicine/adminordrazine/quantum_heal = 80, /datum/reagent/medicine/synaptizine = 20)
-
-/obj/item/reagent_containers/hypospray/combat/nanites/update_icon_state()
- icon_state = "[base_icon_state][(reagents.total_volume > 0) ? null : 0]"
- return ..()
+ list_reagents = list(/datum/reagent/medicine/epinephrine = 30, /datum/reagent/medicine/panacea = 30, /datum/reagent/medicine/leporazine = 15, /datum/reagent/medicine/atropine = 15)
//MediPens
@@ -153,28 +140,13 @@
amount_per_transfer_from_this = 20
list_reagents = list(/datum/reagent/medicine/ephedrine = 10, /datum/reagent/consumable/coffee = 10)
-/obj/item/reagent_containers/hypospray/medipen/stimpack/traitor
- desc = "A modified stimulants autoinjector for use in combat situations. Has a mild healing effect."
- list_reagents = list(/datum/reagent/medicine/stimulants = 10, /datum/reagent/medicine/omnizine = 10)
-
-//watered down traitor stim
/obj/item/reagent_containers/hypospray/medipen/stimpack/crisis
name = "crisis stimpack"
icon_state = "stimpen"
item_state = "stimpen"
base_icon_state = "stimpen"
desc = "A modified stimulant autoinjector, containing a cocktail of potent nerve excitants and long-release healing chemicals. Designed for use in emergency situations where medical help may be hours or days away."
- list_reagents = list(/datum/reagent/medicine/stimulants = 5, /datum/reagent/medicine/ephedrine = 5, /datum/reagent/medicine/omnizine = 15)
-
-/obj/item/reagent_containers/hypospray/medipen/stimulants
- name = "stimulant medipen"
- desc = "Contains a very large amount of an incredibly powerful stimulant, vastly increasing your movement speed and reducing stuns by a very large amount for around five minutes. Do not take if pregnant."
- icon_state = "syndipen"
- item_state = "tbpen"
- base_icon_state = "syndipen"
- volume = 50
- amount_per_transfer_from_this = 50
- list_reagents = list(/datum/reagent/medicine/stimulants = 50)
+ list_reagents = list(/datum/reagent/medicine/stimulants = 5, /datum/reagent/medicine/ephedrine = 5, /datum/reagent/medicine/panacea = 15)
/obj/item/reagent_containers/hypospray/medipen/morphine
name = "morphine medipen"
@@ -188,13 +160,29 @@
list_reagents = list(/datum/reagent/medicine/tramal = 10)
custom_price = 25
-/obj/item/reagent_containers/hypospray/medipen/oxandrolone
- name = "oxandrolone medipen"
- desc = "A autoinjector containing oxandrolone, used to treat severe burns."
+/obj/item/reagent_containers/hypospray/medipen/silfrine
+ name = "silfrine medipen"
+ desc = "A autoinjector containing silfrine, used to near-instantly reknit hewn flesh."
+ icon_state = "salpen"
+ item_state = "salpen"
+ base_icon_state = "salpen"
+ list_reagents = list(/datum/reagent/medicine/silfrine = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/ysiltane
+ name = "ysiltane medipen"
+ desc = "A autoinjector containing ysiltane, used to rapidly clear up widespread surface-level burning."
icon_state = "oxapen"
item_state = "oxapen"
base_icon_state = "oxapen"
- list_reagents = list(/datum/reagent/medicine/oxandrolone = 10)
+ list_reagents = list(/datum/reagent/medicine/ysiltane = 10)
+
+/obj/item/reagent_containers/hypospray/medipen/gjalrazine
+ name = "gjalrazine medipen"
+ desc = "A autoinjector containing Gjalrazine, used to purge the body of toxic after effects."
+ icon_state = "penacid"
+ item_state = "penacid"
+ base_icon_state = "penacid"
+ list_reagents = list(/datum/reagent/medicine/gjalrazine = 10)
/obj/item/reagent_containers/hypospray/medipen/penacid
name = "pentetic acid medipen"
@@ -204,14 +192,6 @@
base_icon_state = "penacid"
list_reagents = list(/datum/reagent/medicine/pen_acid = 10)
-/obj/item/reagent_containers/hypospray/medipen/salacid
- name = "salicylic acid medipen"
- desc = "A autoinjector containing salicylic acid, used to treat severe brute damage."
- icon_state = "salacid"
- item_state = "salacid"
- base_icon_state = "salacid"
- list_reagents = list(/datum/reagent/medicine/sal_acid = 10)
-
/obj/item/reagent_containers/hypospray/medipen/salbutamol
name = "salbutamol medipen"
desc = "A autoinjector containing salbutamol, used to heal oxygen damage quickly."
@@ -305,10 +285,10 @@
amount_per_transfer_from_this = 10
custom_price = 25
-/obj/item/reagent_containers/hypospray/medipen/tricord
- name = "tricordrazine injector"
- desc = "An injector filled with tricordrazine, a mildly effective healing agent."
- list_reagents = list(/datum/reagent/medicine/tricordrazine = 15)
+/obj/item/reagent_containers/hypospray/medipen/cureall
+ name = "cureall injector"
+ desc = "An injector filled with cureall, a mildly effective healing agent."
+ list_reagents = list(/datum/reagent/medicine/cureall = 15)
volume = 15
amount_per_transfer_from_this = 15
icon_state = "morphen"
@@ -345,7 +325,7 @@
/obj/item/reagent_containers/hypospray/medipen/combat_drug
name = "combat cocktail"
desc = "An injector filled with a potent combat drug mixture. Straight from the Shoal."
- list_reagents = list(/datum/reagent/drug/combat_drug = 6, /datum/reagent/medicine/bicaridinep = 6, /datum/reagent/medicine/dermaline = 6)
+ list_reagents = list(/datum/reagent/drug/combat_drug = 6, /datum/reagent/medicine/silfrine = 6, /datum/reagent/medicine/ysiltane = 6)
volume = 18
amount_per_transfer_from_this = 18
icon_state = "syndipen"
@@ -371,6 +351,16 @@
base_icon_state = "syndipen"
item_state = "syndipen"
+/obj/item/reagent_containers/hypospray/medipen/netzach
+ name = "\improper Nesah injector"
+ desc = "A combat injector filled with a tightly curated mixture of regenerative compounds. \"The Fearlessness To Go Forward\" is etched in small text opposite the activator."
+ list_reagents = list(/datum/reagent/medicine/silfrine = 10, /datum/reagent/medicine/ysiltane = 10, /datum/reagent/drug/aranesp = 10, /datum/reagent/medicine/morphine = 10)
+ volume = 40
+ amount_per_transfer_from_this = 40
+ icon_state = "penacid"
+ base_icon_state = "penacid"
+ item_state = "penacid"
+
/obj/item/reagent_containers/hypospray/medipen/placebatol
name = "prescription medipen"
desc = "An injector filled with some prescribed substance."
@@ -412,19 +402,19 @@
var/penetrates = TRUE
/obj/item/hypospray/mkii/brute
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide
/obj/item/hypospray/mkii/toxin
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine
/obj/item/hypospray/mkii/oxygen
start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
/obj/item/hypospray/mkii/burn
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane
-/obj/item/hypospray/mkii/tricord
- start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord
+/obj/item/hypospray/mkii/cureall
+ start_vial = /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall
/obj/item/hypospray/mkii/mkiii
name = "hypospray mk.III"
@@ -691,7 +681,7 @@
custom_price = 500
volume = 35
amount_per_transfer_from_this = 36
- list_reagents = list(/datum/reagent/medicine/epinephrine = 5.5, /datum/reagent/medicine/lavaland_extract = 3, /datum/reagent/drug/methamphetamine = 2, /datum/reagent/medicine/morphine = 0.5, /datum/reagent/medicine/leporazine = 6, /datum/reagent/medicine/salglu_solution = 8, /datum/reagent/medicine/oxandrolone = 5, /datum/reagent/medicine/sal_acid = 5)
+ list_reagents = list(/datum/reagent/medicine/epinephrine = 5.5, /datum/reagent/medicine/hunter_extract = 3, /datum/reagent/drug/methamphetamine = 2, /datum/reagent/medicine/morphine = 0.5, /datum/reagent/medicine/leporazine = 6, /datum/reagent/medicine/salglu_solution = 8, /datum/reagent/medicine/ysiltane = 5, /datum/reagent/medicine/silfrine = 5)
#undef HYPO_SPRAY
#undef HYPO_INJECT
diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm
index f776eae8260..64d3fc1fd2e 100644
--- a/code/modules/reagents/reagent_containers/hypovial.dm
+++ b/code/modules/reagents/reagent_containers/hypovial.dm
@@ -121,30 +121,30 @@
unique_reskin = null
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/bicaridine
- name = "red hypovial (bicaridine)"
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/indomide
+ name = "red hypovial (indomide)"
icon_state = "hypovial-b"
- comes_with = list(/datum/reagent/medicine/bicaridine = 60)
+ comes_with = list(/datum/reagent/medicine/indomide = 60)
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/antitoxin
- name = "green hypovial (Dylovene)"
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/pancrazine
+ name = "green hypovial (pancrazine)"
icon_state = "hypovial-a"
- comes_with = list(/datum/reagent/medicine/antitoxin = 60)
+ comes_with = list(/datum/reagent/medicine/pancrazine = 60)
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/kelotane
- name = "orange hypovial (kelotane)"
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/alvitane
+ name = "orange hypovial (alvitane)"
icon_state = "hypovial-k"
- comes_with = list(/datum/reagent/medicine/kelotane = 60)
+ comes_with = list(/datum/reagent/medicine/alvitane = 60)
/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/dexalin
name = "blue hypovial (dexalin)"
icon_state = "hypovial-d"
comes_with = list(/datum/reagent/medicine/dexalin = 60)
-/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord
- name = "hypovial (tricordrazine)"
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall
+ name = "hypovial (cureall)"
icon_state = "hypovial"
- comes_with = list(/datum/reagent/medicine/tricordrazine = 60)
+ comes_with = list(/datum/reagent/medicine/cureall = 60)
/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/morphine
name = "hypovial (morphine)"
@@ -176,7 +176,7 @@
name = "hypovial (shoal juice)"
icon_state = "hypovial-b"
amount_per_transfer_from_this = 10
- comes_with = list(/datum/reagent/drug/combat_drug = 20, /datum/reagent/medicine/bicaridinep = 10, /datum/reagent/medicine/dermaline = 10, /datum/reagent/medicine/synaptizine = 20)
+ comes_with = list(/datum/reagent/drug/combat_drug = 20, /datum/reagent/medicine/silfrine = 20, /datum/reagent/medicine/ysiltane = 20)
/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/stasis
name = "hypovial (stasis)"
@@ -187,37 +187,37 @@
/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/CMO
name = "deluxe hypovial"
icon_state = "hypoviallarge-cmos"
- comes_with = list(/datum/reagent/medicine/omnizine = 40, /datum/reagent/medicine/leporazine = 40, /datum/reagent/medicine/atropine = 40)
+ comes_with = list(/datum/reagent/medicine/panacea = 40, /datum/reagent/medicine/leporazine = 40, /datum/reagent/medicine/atropine = 40)
-/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/bicaridine
- name = "large red hypovial (bicaridine plus)"
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/silfrine
+ name = "large red hypovial (silfrine)"
icon_state = "hypoviallarge-b"
- comes_with = list(/datum/reagent/medicine/bicaridinep = 120)
+ comes_with = list(/datum/reagent/medicine/silfrine = 120)
-/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/antitoxin
- name = "large green hypovial (carthatoline)"
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/gjalrazine
+ name = "large green hypovial (gjalrazine)"
icon_state = "hypoviallarge-a"
- comes_with = list(/datum/reagent/medicine/carthatoline = 120)
+ comes_with = list(/datum/reagent/medicine/gjalrazine = 120)
-/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/kelotane
- name = "large orange hypovial (dermaline)"
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/ysiltane
+ name = "large orange hypovial (ysiltane)"
icon_state = "hypoviallarge-k"
- comes_with = list(/datum/reagent/medicine/dermaline = 120)
+ comes_with = list(/datum/reagent/medicine/ysiltane = 120)
-/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/dexalin
- name = "large blue hypovial (dexalin plus)"
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salbutamol
+ name = "large blue hypovial (salbutamol)"
icon_state = "hypoviallarge-d"
- comes_with = list(/datum/reagent/medicine/dexalinp = 120)
+ comes_with = list(/datum/reagent/medicine/salbutamol = 120)
/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/charcoal
name = "large black hypovial (charcoal)"
icon_state = "hypoviallarge-t"
comes_with = list(/datum/reagent/medicine/charcoal = 120)
-/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/tricord
- name = "large hypovial (tricord)"
+/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/cureall
+ name = "large hypovial (cureall)"
icon_state = "hypoviallarge"
- comes_with = list(/datum/reagent/medicine/tricordrazine = 120)
+ comes_with = list(/datum/reagent/medicine/cureall = 120)
/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/salglu
name = "large green hypovial (salglu)"
@@ -232,4 +232,4 @@
/obj/item/reagent_containers/glass/bottle/vial/large/preloaded/combat
name = "combat hypovial"
icon_state = "hypoviallarge-t"
- comes_with = list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/medicine/omnizine = 19, /datum/reagent/medicine/leporazine = 19, /datum/reagent/medicine/atropine = 19) //Epinephrine's main effect here is to kill suff damage, so we don't need much given atropine
+ comes_with = list(/datum/reagent/drug/combat_drug = 40, /datum/reagent/medicine/silfrine = 20, /datum/reagent/medicine/ysiltane = 20, /datum/reagent/medicine/synaptizine = 40)
diff --git a/code/modules/reagents/reagent_containers/medigel.dm b/code/modules/reagents/reagent_containers/medigel.dm
index 06f7840749c..59ba90a1a60 100644
--- a/code/modules/reagents/reagent_containers/medigel.dm
+++ b/code/modules/reagents/reagent_containers/medigel.dm
@@ -74,17 +74,17 @@
reagents.trans_to(M, amount_per_transfer_from_this, transfered_by = user, method = apply_type)
return
-/obj/item/reagent_containers/medigel/styptic
- name = "medical gel (styptic powder)"
- desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains styptic powder, for treating cuts and bruises."
+/obj/item/reagent_containers/medigel/hadrakine
+ name = "medical gel (hadrakine powder)"
+ desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains hadrakine powder, for treating cuts and bruises."
icon_state = "brutegel"
- list_reagents = list(/datum/reagent/medicine/styptic_powder = 60)
+ list_reagents = list(/datum/reagent/medicine/hadrakine = 60)
-/obj/item/reagent_containers/medigel/silver_sulf
- name = "medical gel (silver sulfadiazine)"
- desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains silver sulfadiazine, useful for treating burns."
+/obj/item/reagent_containers/medigel/quardexane
+ name = "medical gel (quardexane)"
+ desc = "A medical gel applicator bottle, designed for precision application, with an unscrewable cap. This one contains quardexane, useful for treating burns."
icon_state = "burngel"
- list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 60)
+ list_reagents = list(/datum/reagent/medicine/quardexane = 60)
/obj/item/reagent_containers/medigel/synthflesh
name = "medical gel (synthflesh)"
diff --git a/code/modules/reagents/reagent_containers/patch.dm b/code/modules/reagents/reagent_containers/patch.dm
index af8baf074c1..89b075e0c42 100644
--- a/code/modules/reagents/reagent_containers/patch.dm
+++ b/code/modules/reagents/reagent_containers/patch.dm
@@ -27,16 +27,16 @@
return 0
return 1 // Masks were stopping people from "eating" patches. Thanks, inheritance.
-/obj/item/reagent_containers/pill/patch/styptic
- name = "brute patch"
+/obj/item/reagent_containers/pill/patch/indomide
+ name = "indomide patch"
desc = "Helps with brute injuries."
- list_reagents = list(/datum/reagent/medicine/styptic_powder = 20)
+ list_reagents = list(/datum/reagent/medicine/indomide = 20)
icon_state = "bandaid_brute"
-/obj/item/reagent_containers/pill/patch/silver_sulf
- name = "burn patch"
+/obj/item/reagent_containers/pill/patch/alvitane
+ name = "alvitane patch"
desc = "Helps with burn injuries."
- list_reagents = list(/datum/reagent/medicine/silver_sulfadiazine = 20)
+ list_reagents = list(/datum/reagent/medicine/alvitane = 20)
icon_state = "bandaid_burn"
/obj/item/reagent_containers/pill/patch/synthflesh
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 068aeffcffa..0a47719ab5c 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -146,18 +146,18 @@
list_reagents = list(/datum/reagent/medicine/mutadone = 50)
rename_with_volume = TRUE
-/obj/item/reagent_containers/pill/salicylic
- name = "salicylic acid pill"
- desc = "Used to dull pain."
+/obj/item/reagent_containers/pill/silfrine
+ name = "silfrine pill"
+ desc = "Used to stimulate brute healing."
icon_state = "pill9"
- list_reagents = list(/datum/reagent/medicine/sal_acid = 24)
+ list_reagents = list(/datum/reagent/medicine/silfrine = 15)
rename_with_volume = TRUE
-/obj/item/reagent_containers/pill/oxandrolone
- name = "oxandrolone pill"
+/obj/item/reagent_containers/pill/ysiltane
+ name = "ysiltane pill"
desc = "Used to stimulate burn healing."
icon_state = "pill11"
- list_reagents = list(/datum/reagent/medicine/oxandrolone = 24)
+ list_reagents = list(/datum/reagent/medicine/ysiltane = 15)
rename_with_volume = TRUE
/obj/item/reagent_containers/pill/insulin
@@ -195,13 +195,6 @@
icon_state = "pill22"
rename_with_volume = TRUE
-/obj/item/reagent_containers/pill/hsh
- name = "HSH pill"
- desc = "A pill of Human Sleep Hormone."
- list_reagents = list(/datum/reagent/medicine/melatonin = 10)
- icon_state = "pill22"
- rename_with_volume = TRUE
-
///////////////////////////////////////// Psychologist inventory pills
/obj/item/reagent_containers/pill/happinesspsych
name = "mood stabilizer pill"
@@ -286,17 +279,6 @@
icon_state = "pill18"
list_reagents = list(/datum/reagent/drug/finobranc = 5)
-/*WS Begin - No Cobbychem
-
-/obj/item/reagent_containers/pill/c2/probital
- name = "Probital pill"
- desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'. Causes fatigue and diluted with granibitaluri."
- icon_state = "pill12"
- list_reagents = list(/datum/reagent/medicine/c2/probital = 5, /datum/reagent/medicine/granibitaluri = 10)
- rename_with_volume = TRUE
-
-WS End */
-
/obj/item/reagent_containers/pill/iron
name = "iron pill"
desc = "Used to reduce bloodloss slowly."
@@ -304,11 +286,11 @@ WS End */
list_reagents = list(/datum/reagent/iron = 30)
rename_with_volume = TRUE
-/obj/item/reagent_containers/pill/trophazole
- name = "Trophazole pill"
+/obj/item/reagent_containers/pill/indomide
+ name = "indomide pill"
desc = "Used to treat brute damage of minor and moderate severity.The carving in the pill says 'Eat before ingesting'."
icon_state = "pill12"
- list_reagents = list(/datum/reagent/medicine/trophazole = 15)
+ list_reagents = list(/datum/reagent/medicine/indomide = 15)
rename_with_volume = TRUE
/obj/item/reagent_containers/pill/stardrop
@@ -323,11 +305,11 @@ WS End */
icon_state = "pill11"
list_reagents = list(/datum/reagent/drug/stardrop/starlight = 10)
-/obj/item/reagent_containers/spray/rhigoxane
- name = "medical spray (rhigoxane)"
- desc = "A medical spray bottle.This one contains rhigoxane, it is used to treat burns and cool down temperature if applied with spray."
+/obj/item/reagent_containers/spray/quardexane
+ name = "medical spray (quardexane)"
+ desc = "A medical spray bottle.This one contains quardexane, it is used to treat burns and cool down temperature if applied with spray."
icon_state = "sprayer"
- list_reagents = list(/datum/reagent/medicine/rhigoxane = 100)
+ list_reagents = list(/datum/reagent/medicine/quardexane = 100)
/obj/item/reagent_containers/pill/placebatol
name = "prescription pill"
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index d4d0e3d4254..a94250c9c32 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -189,11 +189,6 @@
desc = "Contains charcoal."
list_reagents = list(/datum/reagent/medicine/charcoal = 15)
-/obj/item/reagent_containers/syringe/perfluorodecalin
- name = "syringe (perfluorodecalin)"
- desc = "Contains perfluorodecalin."
- list_reagents = list(/datum/reagent/medicine/perfluorodecalin = 15)
-
/obj/item/reagent_containers/syringe/antiviral
name = "syringe (spaceacillin)"
desc = "Contains antiviral agents."
@@ -233,13 +228,6 @@
volume = 1
list_reagents = list(/datum/reagent/mulligan = 1)
-/obj/item/reagent_containers/syringe/gluttony
- name = "Gluttony's Blessing"
- desc = "A syringe recovered from a dread place. It probably isn't wise to use."
- amount_per_transfer_from_this = 1
- volume = 1
- list_reagents = list(/datum/reagent/gluttonytoxin = 1)
-
/obj/item/reagent_containers/syringe/bluespace
name = "bluespace syringe"
desc = "An advanced syringe that can hold 60 units of chemicals."
@@ -256,20 +244,20 @@
volume = 10
proj_piercing = 1
-/obj/item/reagent_containers/syringe/spider_extract
- name = "spider extract syringe"
- desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world."
- list_reagents = list(/datum/reagent/spider_extract = 1)
+/obj/item/reagent_containers/syringe/dexalin
+ name = "syringe (dexalin)"
+ desc = "Contains dexalin."
+ list_reagents = list(/datum/reagent/medicine/dexalin = 15)
-/obj/item/reagent_containers/syringe/oxandrolone
- name = "syringe (oxandrolone)"
- desc = "Contains oxandrolone, used to treat severe burns."
- list_reagents = list(/datum/reagent/medicine/oxandrolone = 15)
+/obj/item/reagent_containers/syringe/ysiltane
+ name = "syringe (ysiltane)"
+ desc = "Contains ysiltane, used to treat severe burns."
+ list_reagents = list(/datum/reagent/medicine/ysiltane = 15)
-/obj/item/reagent_containers/syringe/salacid
- name = "syringe (salicylic acid)"
+/obj/item/reagent_containers/syringe/silfrine
+ name = "syringe (silfrine)"
desc = "Contains salicylic acid, used to treat severe brute damage."
- list_reagents = list(/datum/reagent/medicine/sal_acid = 15)
+ list_reagents = list(/datum/reagent/medicine/silfrine = 15)
/obj/item/reagent_containers/syringe/penacid
name = "syringe (pentetic acid)"
@@ -292,16 +280,13 @@
/obj/item/reagent_containers/syringe/contraband/mammoth
list_reagents = list(/datum/reagent/drug/mammoth = 15)
-/obj/item/reagent_containers/syringe/contraband/fentanyl
- list_reagents = list(/datum/reagent/toxin/fentanyl = 15)
-
/obj/item/reagent_containers/syringe/contraband/morphine
list_reagents = list(/datum/reagent/medicine/morphine = 15)
-/obj/item/reagent_containers/syringe/thializid
- name = "syringe (thializid)"
- desc = "Contains thializid, used to treat toxins and purge chemicals. The tag on the syringe states 'Inject one time per minute'."
- list_reagents = list(/datum/reagent/medicine/thializid = 15)
+/obj/item/reagent_containers/syringe/pancrazine
+ name = "syringe (pancrazine)"
+ desc = "Contains pancrazine, used to treat toxins and purge chemicals. The tag on the syringe states 'Heat before injection'."
+ list_reagents = list(/datum/reagent/medicine/pancrazine = 15)
/obj/item/reagent_containers/syringe/charcoal
name = "syringe (charcoal)"
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 8f19fd40d96..9f7d6093ce3 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -1,81 +1,5 @@
//These objects are used in the cardinal sin-themed ruins (i.e. Gluttony, Pride...)
-/obj/structure/cursed_slot_machine //Greed's slot machine: Used in the Greed ruin. Deals clone damage on each use, with a successful use giving a d20 of fate.
- name = "greed's slot machine"
- desc = "High stakes, high rewards."
- icon = 'icons/obj/economy.dmi'
- icon_state = "slots1"
- anchored = TRUE
- density = TRUE
- var/win_prob = 5
-
-/obj/structure/cursed_slot_machine/interact(mob/living/carbon/human/user)
- if(!istype(user))
- return
- if(obj_flags & IN_USE)
- return
- if(isipc(user))
- user.visible_message(span_warning(" As [user] tries to pull \the [src]'s lever, the machine seems to hesitate a bit."), span_warning("You feel as if you are trying to put at stake something you don't even have...\ You suddenly feel your mind... Suboptimal?"))
- user.adjustOrganLoss(ORGAN_SLOT_BRAIN, 10)
- else
- user.adjustCloneLoss(20)
- obj_flags |= IN_USE
-
- if(user.stat)
- to_chat(user, span_userdanger("No... just one more try..."))
- user.gib()
- else
- user.visible_message(span_warning("[user] pulls [src]'s lever with a glint in [user.p_their()] eyes!"), "You feel a draining as you pull the lever, but you \
- know it'll be worth it.")
- icon_state = "slots2"
- playsound(src, 'sound/lavaland/cursed_slot_machine.ogg', 50, FALSE)
- addtimer(CALLBACK(src, PROC_REF(determine_victor), user), 50)
-
-/obj/structure/cursed_slot_machine/proc/determine_victor(mob/living/user)
- icon_state = "slots1"
- obj_flags &= ~IN_USE
- if(prob(win_prob))
- playsound(src, 'sound/lavaland/cursed_slot_machine_jackpot.ogg', 50, FALSE)
- new/obj/structure/cursed_money(get_turf(src))
- if(user)
- to_chat(user, span_boldwarning("You've hit jackpot. Laughter echoes around you as your reward appears in the machine's place."))
- qdel(src)
- else
- if(user)
- to_chat(user, span_boldwarning("Fucking machine! Must be rigged. Still... one more try couldn't hurt, right?"))
-
-
-/obj/structure/cursed_money
- name = "bag of money"
- desc = "RICH! YES! YOU KNEW IT WAS WORTH IT! YOU'RE RICH! RICH! RICH!"
- icon = 'icons/obj/storage.dmi'
- icon_state = "moneybag"
- anchored = FALSE
- density = TRUE
-
-/obj/structure/cursed_money/Initialize()
- . = ..()
- addtimer(CALLBACK(src, PROC_REF(collapse)), 600)
-
-/obj/structure/cursed_money/proc/collapse()
- visible_message("[src] falls in on itself, \
- canvas rotting away and contents vanishing.")
- qdel(src)
-
-/obj/structure/cursed_money/attack_hand(mob/living/user)
- . = ..()
- if(.)
- return
- user.visible_message("[user] opens the bag and \
- and removes a die. The bag then vanishes.",
- "[span_boldwarning("You open the bag...!")]\n\
- And see a bag full of dice. Confused, \
- you take one... and the bag vanishes.")
- var/turf/T = get_turf(user)
- var/obj/item/dice/d20/fate/one_use/critical_fail = new(T)
- user.put_in_hands(critical_fail)
- qdel(src)
-
/obj/structure/mirror/magic/pride //Pride's mirror: Used in the Pride ruin.
name = "pride's mirror"
desc = "Pride cometh before the..."
diff --git a/code/modules/ruins/rockplanet_ruin_code.dm b/code/modules/ruins/rockplanet_ruin_code.dm
index 970265ab50e..79a2e125357 100644
--- a/code/modules/ruins/rockplanet_ruin_code.dm
+++ b/code/modules/ruins/rockplanet_ruin_code.dm
@@ -116,4 +116,4 @@
/obj/item/paper/crumpled/muddy/fluff/distillery
name = "distillery instructions"
desc = "A crumpled note soaked in alcohol."
- default_raw_text = "Moonshine Instructions
Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.
1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom.
2. Grind a cob of corn into bits, and add the mash to the still.
3. Pour an equal amount of sugar into the still, and stir.
4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now.
5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.
PS: If you've got some leftover sugar, mix it into bicaridine. Equal parts sugar, carbon, and oxygen makes a potent salve for your wounds."
+ default_raw_text = "Moonshine Instructions
Alright, I know some of y'all ain't literate enough for this, but if I'm ever found dead or missing, read this note. Gotta keep the craft alive.
1. Fill the still with around 5 units of enzyme. We keep the whole supply in the green crate in the storeroom.
2. Grind a cob of corn into bits, and add the mash to the still.
3. Pour an equal amount of sugar into the still, and stir.
4. Now, you'll have to scoop the product out and filter it by hand. We used to have a better still that'd filter the product itself, until last year's incident. This has to do for now.
5. Evaluate your product. Good 'shine is clear like water, and burns blue. If it ain't good, dump it.
."
diff --git a/code/modules/surgery/bodyparts/bodyparts.dm b/code/modules/surgery/bodyparts/bodyparts.dm
index b310fc48139..477a00dc5fb 100644
--- a/code/modules/surgery/bodyparts/bodyparts.dm
+++ b/code/modules/surgery/bodyparts/bodyparts.dm
@@ -559,7 +559,7 @@
if(updating_health)
owner.updatehealth()
if(owner.dna?.species && (REVIVESBYHEALING in owner.dna.species.species_traits))
- if(owner.health > 0 && !owner.hellbound)
+ if(owner.health > 0)
owner.revive(FALSE)
owner.cure_husk() // If it has REVIVESBYHEALING, it probably can't be cloned. No husk cure.
cremation_progress = min(0, cremation_progress - ((brute_dam + burn_dam)*(100/max_damage)))
diff --git a/code/modules/surgery/revival.dm b/code/modules/surgery/revival.dm
index 40b24a82e4b..1c9d9669b8f 100644
--- a/code/modules/surgery/revival.dm
+++ b/code/modules/surgery/revival.dm
@@ -18,7 +18,7 @@
return FALSE
if(target.stat != DEAD)
return FALSE
- if(target.hellbound || HAS_TRAIT(target, TRAIT_HUSK))
+ if(HAS_TRAIT(target, TRAIT_HUSK))
return FALSE
if(!is_valid_target(target)) //PENTEST CHANGE START
return FALSE
diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm
index 913490368fb..5c8900d8120 100644
--- a/code/modules/uplink/uplink_items.dm
+++ b/code/modules/uplink/uplink_items.dm
@@ -1350,14 +1350,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
item = /obj/item/healthanalyzer/rad_laser
cost = 3
-/datum/uplink_item/device_tools/stimpack
- name = "Stimpack"
- desc = "Stimpacks, the tool of many great heroes, make you nearly immune to stuns and knockdowns for about \
- 5 minutes after injection."
- item = /obj/item/reagent_containers/hypospray/medipen/stimulants
- cost = 5
- surplus = 90
-
/datum/uplink_item/device_tools/medkit
name = "Syndicate Combat Medic Kit"
desc = "This first aid kit is a suspicious brown and red. Included is a combat stimulant injector \
@@ -1600,16 +1592,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
restricted_roles = list("Medical Doctor", "Chief Medical Officer", "Roboticist")
cost = 5
-/datum/uplink_item/role_restricted/spider_injector
- name = "Australicus Slime Mutator"
- desc = "Crikey mate, it's been a wild travel from the Australicus sector but we've managed to get \
- some special spider extract from the giant spiders down there. Use this injector on a gold slime core \
- to create a few of the same type of spiders we found on the planets over there. They're a bit tame until you \
- also give them a bit of sentience though."
- item = /obj/item/reagent_containers/syringe/spider_extract
- cost = 10
- restricted_roles = list("Research Director", "Scientist", "Roboticist")
-
/datum/uplink_item/role_restricted/concealed_weapon_bay
name = "Concealed Weapon Bay"
desc = "A modification for civilian exosuits that allows them to equip one piece of equipment designed for combat exosuits. \
@@ -1635,15 +1617,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
cost = 14
item = /obj/vehicle/ridden/lawnmower/emagged
-/datum/uplink_item/role_restricted/explosive_hot_potato
- name = "Exploding Hot Potato"
- desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \
- The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
- item = /obj/item/hot_potato/syndicate
- cost = 4
- surplus = 0
- restricted_roles = list("Cook", "Botanist")
-
/datum/uplink_item/role_restricted/ez_clean_bundle
name = "EZ Clean Grenade Bundle"
desc = "A box with three cleaner grenades using the trademark Waffle Co. formula. Serves as a cleaner and causes acid damage to anyone standing nearby. \
@@ -1743,7 +1716,7 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item))
/datum/uplink_item/badass/syndiecigs
name = "Syndicate Smokes"
- desc = "Strong flavor, dense smoke, infused with omnizine."
+ desc = "Strong flavor, dense smoke, infused with panacea."
item = /obj/item/storage/fancy/cigarettes/cigpack_syndicate
cost = 2
illegal_tech = FALSE
diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm
index 26fe1f2c589..6f6986bda55 100644
--- a/code/modules/vending/medical.dm
+++ b/code/modules/vending/medical.dm
@@ -11,18 +11,17 @@
/obj/item/reagent_containers/syringe = 5,
/obj/item/reagent_containers/dropper = 2,
/obj/item/healthanalyzer = 2,
- /obj/item/reagent_containers/pill/patch/styptic = 5,
- /obj/item/reagent_containers/pill/patch/silver_sulf = 5,
+ /obj/item/reagent_containers/pill/patch/indomide = 5,
+ /obj/item/reagent_containers/pill/patch/alvitane = 5,
/obj/item/reagent_containers/hypospray/medipen = 3,
- /obj/item/reagent_containers/syringe/perfluorodecalin = 2,
/obj/item/reagent_containers/syringe/antiviral = 1,
/obj/item/reagent_containers/glass/bottle/charcoal = 3,
/obj/item/reagent_containers/glass/bottle/epinephrine = 3,
/obj/item/reagent_containers/glass/bottle/morphine = 1,
/obj/item/reagent_containers/glass/bottle/potass_iodide = 1,
/obj/item/reagent_containers/glass/bottle/salglu_solution = 3,
- /obj/item/reagent_containers/medigel/styptic = 1,
- /obj/item/reagent_containers/medigel/silver_sulf = 1,
+ /obj/item/reagent_containers/medigel/hadrakine = 1,
+ /obj/item/reagent_containers/medigel/quardexane = 1,
/obj/item/reagent_containers/medigel/synthflesh = 1,
/obj/item/reagent_containers/medigel/sterilizine = 1,
/obj/item/sensor_device = 1,
diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm
index 61a413a9630..351388b1e6e 100644
--- a/code/modules/vending/medical_wall.dm
+++ b/code/modules/vending/medical_wall.dm
@@ -25,7 +25,7 @@
/obj/item/reagent_containers/hypospray/medipen/psicodine = 6,
/obj/item/reagent_containers/hypospray/medipen/synap = 6,
/obj/item/reagent_containers/hypospray/medipen/mannitol = 10,
- /obj/item/reagent_containers/hypospray/medipen/tricord = 6,
+ /obj/item/reagent_containers/hypospray/medipen/cureall = 6,
/obj/item/reagent_containers/hypospray/medipen/tramal = 6,
/obj/item/reagent_containers/hypospray/medipen/antihol = 10,
/obj/item/reagent_containers/hypospray/medipen/anti_rad = 10,
@@ -34,8 +34,8 @@
/obj/item/reagent_containers/syringe/antiviral = 4
)
premium = list(
- /obj/item/reagent_containers/medigel/styptic = 3,
- /obj/item/reagent_containers/medigel/silver_sulf = 3,
+ /obj/item/reagent_containers/medigel/hadrakine = 3,
+ /obj/item/reagent_containers/medigel/quardexane = 3,
/obj/item/storage/pill_bottle/stardrop = 5,
)
diff --git a/shiptest.dme b/shiptest.dme
index e384448bc29..edd2f0e4f59 100644
--- a/shiptest.dme
+++ b/shiptest.dme
@@ -693,7 +693,6 @@
#include "code\datums\diseases\brainrot.dm"
#include "code\datums\diseases\cold.dm"
#include "code\datums\diseases\cold9.dm"
-#include "code\datums\diseases\decloning.dm"
#include "code\datums\diseases\dna_spread.dm"
#include "code\datums\diseases\fake_gbs.dm"
#include "code\datums\diseases\flu.dm"
@@ -1365,7 +1364,6 @@
#include "code\game\objects\items\gun_maint_kit.dm"
#include "code\game\objects\items\handcuffs.dm"
#include "code\game\objects\items\holosign_creator.dm"
-#include "code\game\objects\items\hot_potato.dm"
#include "code\game\objects\items\hourglass.dm"
#include "code\game\objects\items\inducer.dm"
#include "code\game\objects\items\kitchen.dm"
@@ -3357,11 +3355,9 @@
#include "code\modules\reagents\chemistry\machinery\pandemic.dm"
#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm"
#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm"
-#include "code\modules\reagents\chemistry\reagents\cat2_medicine_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\food_reagents.dm"
-#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\other_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm"
#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm"
@@ -3370,8 +3366,19 @@
#include "code\modules\reagents\chemistry\reagents\alcohol_reagents\ethanol.dm"
#include "code\modules\reagents\chemistry\reagents\alcohol_reagents\fruit_wine.dm"
#include "code\modules\reagents\chemistry\reagents\alcohol_reagents\mixed_drinks.dm"
-#include "code\modules\reagents\chemistry\recipes\cat2_medicines.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\_medicine_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\blood_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\fauna_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\flora_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\ipc_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\medicine_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\misc_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\organ_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\pain_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\status_reagents.dm"
+#include "code\modules\reagents\chemistry\reagents\medical_reagents\wound_reagents.dm"
#include "code\modules\reagents\chemistry\recipes\drugs.dm"
+#include "code\modules\reagents\chemistry\recipes\medical_consumables.dm"
#include "code\modules\reagents\chemistry\recipes\medicine.dm"
#include "code\modules\reagents\chemistry\recipes\others.dm"
#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm"
diff --git a/tools/UpdatePaths/Scripts/5162_chem_kill.txt b/tools/UpdatePaths/Scripts/5162_chem_kill.txt
new file mode 100644
index 00000000000..27898bacf53
--- /dev/null
+++ b/tools/UpdatePaths/Scripts/5162_chem_kill.txt
@@ -0,0 +1,12 @@
+/obj/item/reagent_containers/pill/patch/styptic : /obj/item/reagent_containers/pill/patch/indomide{@OLD}
+/obj/item/reagent_containers/pill/patch/silver_sulf : /obj/item/reagent_containers/pill/patch/alvitane{@OLD}
+/obj/item/reagent_containers/pill/patch/quardexane : /obj/item/reagent_containers/pill/patch/alvitane{@OLD}
+/obj/item/reagent_containers/pill/trophazole : /obj/item/reagent_containers/pill/indomide{@OLD}
+/obj/item/reagent_containers/syringe/contraband/fentanyl : /obj/item/reagent_containers/syringe/contraband/morphine{@OLD}
+/obj/item/reagent_containers/syringe/oxandrolone : /obj/item/reagent_containers/syringe/ysiltane{@OLD}
+/obj/item/reagent_containers/glass/bottle/bicaridine : /obj/item/reagent_containers/glass/bottle/indomide{@OLD}
+/obj/item/reagent_containers/hypospray/medipen/stimulants : /obj/item/reagent_containers/hypospray/medipen/stimpack/crisis{@OLD}
+/obj/item/reagent_containers/hypospray/medipen/tricord : /obj/item/reagent_containers/hypospray/medipen/cureall{@OLD}
+/obj/item/hypospray/mkii/tricord : /obj/item/hypospray/mkii/cureall
+/obj/item/reagent_containers/glass/bottle/vial/small/preloaded/tricord : /obj/item/reagent_containers/glass/bottle/vial/small/preloaded/cureall
+/obj/item/reagent_containers/glass/bottle/antitoxin : /obj/item/reagent_containers/glass/bottle/charcoal
\ No newline at end of file
From d954899d9c4695ca909a6220bfef2c68c487e1b7 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 04:04:58 -0700
Subject: [PATCH 04/52] Immediately fixes bleed_mod
---
.../chemistry/reagents/medical_reagents/flora_reagents.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
index f9f46558599..601333f1b26 100644
--- a/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/medical_reagents/flora_reagents.dm
@@ -21,7 +21,7 @@
return
var/mob/living/carbon/human/blood_boy = M
- blood_boy.physiology?.bleed_mod /= passive_bleed_modifier
+ blood_boy.physiology?.bleed_mod *= passive_bleed_modifier
return ..()
/datum/reagent/medicine/polypyr/on_mob_end_metabolize(mob/living/M)
From 4b114587a63dd2ca27bddc57b24d3fdbea3f0218 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:51:15 -0700
Subject: [PATCH 05/52] Day 0 Correction - force_pain_noise had an incorreclty
set switch.
---
code/modules/mob/emote.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/code/modules/mob/emote.dm b/code/modules/mob/emote.dm
index b076d2f2427..fe91d9b9799 100644
--- a/code/modules/mob/emote.dm
+++ b/code/modules/mob/emote.dm
@@ -43,7 +43,7 @@
emote("gasp")
if(25 to 50)
emote("groan")
- if(50 to 100)
+ if(50 to INFINITY) // PENTEST FIX - Shiptest accidently set this to a maximum of 100, but has some effects have powers greater than 100
emote("scream")
/mob/proc/force_manual_scream()
From 90ab1dc8615359741d4afb81ec02dabff97aacc8 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:56:54 -0700
Subject: [PATCH 06/52] Restores the abductor operation table
---
code/controllers/subsystem/traumas.dm | 3 +-
.../abductor/equipment/abduction_gear.dm | 4 ++
.../abductor/equipment/abduction_gear.dm | 40 +++++++++++++++++++
3 files changed, 46 insertions(+), 1 deletion(-)
create mode 100644 modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
diff --git a/code/controllers/subsystem/traumas.dm b/code/controllers/subsystem/traumas.dm
index c890cc95dcf..0e62fb150c6 100644
--- a/code/controllers/subsystem/traumas.dm
+++ b/code/controllers/subsystem/traumas.dm
@@ -128,7 +128,8 @@ SUBSYSTEM_DEF(traumas)
/obj/item/clothing/head/helmet/abductor, /obj/structure/bed/abductor, /obj/structure/table_frame/abductor,
/obj/structure/table/abductor, /obj/structure/closet/abductor, /obj/item/organ/heart/gland,
/obj/machinery/abductor, /obj/item/crowbar/abductor, /obj/item/screwdriver/abductor, /obj/item/weldingtool/abductor,
- /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor)),
+ /obj/item/wirecutters/abductor, /obj/item/wrench/abductor, /obj/item/stack/sheet/mineral/abductor,
+ /obj/structure/table/optable/abductor)), // PENTEST RESTORED - ALIEN OBJECTS
"birds" = typecacheof(list(
/obj/item/clothing/mask/gas/plaguedoctor, /obj/item/food/cracker,
diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index 2a8dc9df31b..00940f667dc 100644
--- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -797,6 +797,10 @@ Congratulations! You are now trained for invasive xenobiology research!"}
to_chat(user, span_warning("You need one sheet of silver to do this!"))
return
to_chat(user, span_notice("You start adding [P] to [src]..."))
+ if(do_after(user, 50, target = src)) // PENTEST REVERT - START
+ P.use(1)
+ new /obj/structure/table/optable/abductor(src.loc)
+ qdel(src) // PENTEST REVERT - END
/obj/structure/table/abductor
name = "alien table"
diff --git a/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
new file mode 100644
index 00000000000..b614c915d4b
--- /dev/null
+++ b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -0,0 +1,40 @@
+/obj/structure/table/optable/abductor
+ name = "alien operating table"
+ desc = "Used for alien medical procedures. The surface is covered in tiny spines."
+ frame = /obj/structure/table_frame/abductor
+ buildstack = /obj/item/stack/sheet/mineral/silver
+ framestack = /obj/item/stack/sheet/mineral/abductor
+ buildstackamount = 1
+ framestackamount = 1
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "bed"
+ can_buckle = 1
+ /// Amount to inject per second
+ var/inject_am = 0.5
+
+ var/static/list/injected_reagents = list(/datum/reagent/medicine/cordiolis_hepatico)
+
+/obj/structure/table/optable/abductor/Initialize()
+ . = ..()
+ var/static/list/loc_connections = list(
+ COMSIG_ATOM_ENTERED = PROC_REF(on_entered),
+ )
+ AddElement(/datum/element/connect_loc, loc_connections)
+
+/obj/structure/table/optable/abductor/proc/on_entered(datum/source, atom/movable/AM)
+ SIGNAL_HANDLER
+ if(iscarbon(AM))
+ START_PROCESSING(SSobj, src)
+ to_chat(AM, span_danger("You feel a series of tiny pricks!"))
+
+/obj/structure/table/optable/abductor/process(seconds_per_tick)
+ . = PROCESS_KILL
+ for(var/mob/living/carbon/C in get_turf(src))
+ . = TRUE
+ for(var/chemical in injected_reagents)
+ if(C.reagents.get_reagent_amount(chemical) < inject_am * seconds_per_tick)
+ C.reagents.add_reagent(chemical, inject_am * seconds_per_tick)
+
+/obj/structure/table/optable/abductor/Destroy()
+ STOP_PROCESSING(SSobj, src)
+ . = ..()
From 7fed1e40c67e98111098f9ed67acef112f0b6f2a Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:57:46 -0700
Subject: [PATCH 07/52] Restores hot potato
---
code/game/machinery/computer/arcade.dm | 3 +-
.../modules/toys/code/hot_potato.dm | 184 ++++++++++++++++++
modular_pentest/~pentest.dme | 1 +
3 files changed, 187 insertions(+), 1 deletion(-)
create mode 100644 modular_pentest/modules/toys/code/hot_potato.dm
diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm
index be79ff44b95..ff84c41c349 100644
--- a/code/game/machinery/computer/arcade.dm
+++ b/code/game/machinery/computer/arcade.dm
@@ -49,7 +49,8 @@ GLOBAL_LIST_INIT(arcade_prize_pool, list(
/obj/item/toy/brokenradio = 2,
/obj/item/toy/braintoy = 2,
/obj/item/clothing/glasses/trickblindfold = 2,
- /obj/item/toy/prize/honk = 1)) //PENTEST RESTORED
+ /obj/item/toy/prize/honk = 1, //PENTEST RESTORED - Honk
+ /obj/item/hot_potato/harmless/toy = 1,)) //PENTEST RESTORED - Harmless Hot Potato
/obj/machinery/computer/arcade
name = "random arcade"
diff --git a/modular_pentest/modules/toys/code/hot_potato.dm b/modular_pentest/modules/toys/code/hot_potato.dm
new file mode 100644
index 00000000000..befad40b2aa
--- /dev/null
+++ b/modular_pentest/modules/toys/code/hot_potato.dm
@@ -0,0 +1,184 @@
+/datum/uplink_item/role_restricted/explosive_hot_potato
+ name = "Exploding Hot Potato"
+ desc = "A potato rigged with explosives. On activation, a special mechanism is activated that prevents it from being dropped. \
+ The only way to get rid of it if you are holding it is to attack someone else with it, causing it to latch to that person instead."
+ item = /obj/item/hot_potato/syndicate
+ cost = 4
+ surplus = 0
+ restricted_roles = list("Cook", "Botanist")
+
+//CREATOR'S NOTE: DO NOT FUCKING GIVE THIS TO BOTANY!
+/obj/item/hot_potato
+ name = "hot potato"
+ desc = "A label on the side of this potato reads \"Product of DonkCo Service Wing. Activate far away from populated areas. Device will only attach to sapient creatures.\" You can attack anyone with it to force it on them instead of yourself!"
+ icon = 'icons/obj/hydroponics/harvest.dmi'
+ icon_state = "potato"
+ item_flags = NOBLUDGEON
+ force = 0
+ var/icon_off = "potato"
+ var/icon_on = "potato_active"
+ var/detonation_timerid
+ var/activation_time = 0
+ var/timer = 600 //deciseconds
+ var/show_timer = FALSE
+ var/reusable = FALSE //absolute madman
+ var/sticky = TRUE
+ var/forceful_attachment = TRUE
+ var/stimulant = TRUE
+ var/detonate_explosion = TRUE
+ var/detonate_dev_range = 0
+ var/detonate_heavy_range = 0
+ var/detonate_light_range = 2
+ var/detonate_flash_range = 5
+ var/detonate_fire_range = 5
+
+ var/active = FALSE
+
+ var/color_val = FALSE
+
+ var/datum/weakref/current
+
+/obj/item/hot_potato/Destroy()
+ if(active)
+ deactivate()
+ return ..()
+
+/obj/item/hot_potato/proc/colorize(mob/target)
+ //Clear color from old target
+ if(current)
+ var/mob/M = current.resolve()
+ if(istype(M))
+ M.remove_atom_colour(FIXED_COLOUR_PRIORITY)
+ //Give to new target
+ current = null
+ //Swap colors
+ color_val = !color_val
+ if(istype(target))
+ current = WEAKREF(target)
+ target.add_atom_colour(color_val? "#ffff00" : "#00ffff", FIXED_COLOUR_PRIORITY)
+
+/obj/item/hot_potato/proc/detonate()
+ var/atom/location = loc
+ location.visible_message(span_userdanger("[src] [detonate_explosion? "explodes" : "activates"]!"), span_userdanger("[src] activates! You've ran out of time!"))
+ if(detonate_explosion)
+ explosion(src, detonate_dev_range, detonate_heavy_range, detonate_light_range, detonate_flash_range, flame_range = detonate_fire_range)
+ deactivate()
+ if(!reusable)
+ var/mob/M = loc
+ if(istype(M))
+ M.dropItemToGround(src, TRUE)
+ qdel(src)
+
+/obj/item/hot_potato/attack_self(mob/user)
+ if(activate(timer, user))
+ user.visible_message(span_boldwarning("[user] squeezes [src], which promptly starts to flash red-hot colors!"), span_boldwarning("You squeeze [src], activating its countdown and attachment mechanism!"),
+ span_boldwarning("You hear a mechanical click and a loud beeping!"))
+ return
+ return ..()
+
+/obj/item/hot_potato/process(seconds_per_tick)
+ if(stimulant)
+ if(isliving(loc))
+ var/mob/living/L = loc
+ L.SetStun(0)
+ L.SetKnockdown(0)
+ L.set_sleeping(0)
+ L.SetImmobilized(0)
+ L.SetParalyzed(0)
+ L.SetUnconscious(0)
+ L.reagents.add_reagent(/datum/reagent/medicine/muscle_stimulant, clamp(5 - L.reagents.get_reagent_amount(/datum/reagent/medicine/muscle_stimulant), 0, 5)) //If you don't have legs or get bola'd, tough luck!
+ colorize(L)
+
+/obj/item/hot_potato/examine(mob/user)
+ . = ..()
+ if(active)
+ . += span_warning("[src] is flashing red-hot! You should probably get rid of it!")
+ if(show_timer)
+ . += span_warning("[src]'s timer looks to be at [DisplayTimeText(activation_time - world.time)]!")
+
+/obj/item/hot_potato/equipped(mob/user)
+ . = ..()
+ if(active)
+ to_chat(user, span_userdanger("You have a really bad feeling about [src]!"))
+
+/obj/item/hot_potato/afterattack(atom/target, mob/user, adjacent, params)
+ . = ..()
+ if(!adjacent || !ismob(target))
+ return
+ force_onto(target, user)
+
+/obj/item/hot_potato/proc/force_onto(mob/living/victim, mob/user)
+ if(!istype(victim) || user != loc || victim == user)
+ return FALSE
+ if(!victim.client)
+ to_chat(user, span_boldwarning("[src] refuses to attach to a non-sapient creature!"))
+ if(victim.stat != CONSCIOUS || !victim.usable_legs)
+ to_chat(user, span_boldwarning("[src] refuses to attach to someone incapable of using it!"))
+ user.temporarilyRemoveItemFromInventory(src, TRUE)
+ . = FALSE
+ if(!victim.put_in_hands(src))
+ if(forceful_attachment)
+ victim.dropItemToGround(victim.get_inactive_held_item())
+ if(!victim.put_in_hands(src))
+ victim.dropItemToGround(victim.get_active_held_item())
+ if(victim.put_in_hands(src))
+ . = TRUE
+ else
+ . = TRUE
+ else
+ . = TRUE
+ if(.)
+ log_combat(user, victim, "forced a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
+ user.visible_message(span_userdanger("[user] forces [src] onto [victim]!"), span_userdanger("You force [src] onto [victim]!"), span_boldwarning("You hear a mechanical click and a beep."))
+ colorize(null)
+ else
+ log_combat(user, victim, "tried to force a hot potato with explosive variables ([detonate_explosion]-[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_flash_range]/[detonate_fire_range]) onto")
+ user.visible_message(span_boldwarning("[user] tried to force [src] onto [victim], but it could not attach!"), span_boldwarning("You try to force [src] onto [victim], but it is unable to attach!"), span_boldwarning("You hear a mechanical click and two buzzes."))
+ user.put_in_hands(src)
+
+/obj/item/hot_potato/dropped(mob/user)
+ . = ..()
+ colorize(null)
+
+/obj/item/hot_potato/proc/activate(delay, mob/user)
+ if(active)
+ return
+ update_appearance()
+ if(sticky)
+ ADD_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
+ name = "primed [name]"
+ activation_time = timer + world.time
+ detonation_timerid = addtimer(CALLBACK(src, PROC_REF(detonate)), delay, TIMER_STOPPABLE)
+ START_PROCESSING(SSfastprocess, src)
+ if(user)
+ log_bomber(user, "has primed a", src, "for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])")
+ else
+ log_bomber(null, null, src, "was primed for detonation (Timer:[delay],Explosive:[detonate_explosion],Range:[detonate_dev_range]/[detonate_heavy_range]/[detonate_light_range]/[detonate_fire_range])")
+ active = TRUE
+
+/obj/item/hot_potato/proc/deactivate()
+ update_appearance()
+ name = initial(name)
+ REMOVE_TRAIT(src, TRAIT_NODROP, HOT_POTATO_TRAIT)
+ deltimer(detonation_timerid)
+ STOP_PROCESSING(SSfastprocess, src)
+ detonation_timerid = null
+ colorize(null)
+ active = FALSE
+
+/obj/item/hot_potato/update_icon_state()
+ icon_state = active ? icon_on : icon_off
+ return ..()
+
+/obj/item/hot_potato/syndicate
+ detonate_light_range = 4
+ detonate_fire_range = 5
+
+/obj/item/hot_potato/harmless
+ detonate_explosion = FALSE
+
+/obj/item/hot_potato/harmless/toy
+ desc = "A label on the side of this potato reads \"Product of DonkCo Toys and Recreation department.\" You can attack anyone with it to put it on them instead, if they have a free hand to take it!"
+ sticky = FALSE
+ reusable = TRUE
+ forceful_attachment = FALSE
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index 0f01ffcb89f..acd3e01ec85 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -375,6 +375,7 @@
#include "modules\surgery\code\wing_reconstruction.dm"
#include "modules\swarmers\code\megafauna_swarmer.dm"
#include "modules\swarmers\code\swarmer.dm"
+#include "modules\toys\code\hot_potato.dm"
#include "modules\umbrella\code\umbrellas.dm"
#include "modules\vehicle_atv\code\atv.dm"
#include "modules\vehicle_clown\code\clowncar.dm"
From 66d32eda2d16c23c8a542173db4d985c0ba49e1d Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:58:41 -0700
Subject: [PATCH 08/52] restores decloning
---
.../code/datums/diseases/decloning.dm | 59 +++++++++++++++++++
modular_pentest/~pentest.dme | 1 +
2 files changed, 60 insertions(+)
create mode 100644 modular_pentest/master_files/code/datums/diseases/decloning.dm
diff --git a/modular_pentest/master_files/code/datums/diseases/decloning.dm b/modular_pentest/master_files/code/datums/diseases/decloning.dm
new file mode 100644
index 00000000000..340d9fd0f30
--- /dev/null
+++ b/modular_pentest/master_files/code/datums/diseases/decloning.dm
@@ -0,0 +1,59 @@
+/datum/disease/decloning
+ form = "Virus"
+ name = "Cellular Degeneration"
+ max_stages = 5
+ stage_prob = 1
+ cure_text = "Rezadone or death."
+ agent = "Severe Genetic Damage"
+ viable_mobtypes = list(/mob/living/carbon/human)
+ desc = @"If left untreated the subject will [REDACTED]!"
+ severity = "Dangerous!"
+ cures = list(/datum/reagent/medicine/rezadone)
+ disease_flags = CAN_CARRY|CAN_RESIST
+ spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
+ process_dead = TRUE
+
+/datum/disease/decloning/stage_act()
+ ..()
+ if(affected_mob.stat == DEAD)
+ cure()
+ return
+ switch(stage)
+ if(2)
+ if(prob(2))
+ affected_mob.emote("itch")
+ if(prob(2))
+ affected_mob.emote("yawn")
+ if(3)
+ if(prob(2))
+ affected_mob.emote("itch")
+ if(prob(2))
+ affected_mob.emote("drool")
+ if(prob(3))
+ affected_mob.adjustCloneLoss(1)
+ if(prob(2))
+ to_chat(affected_mob, span_danger("Your skin feels strange."))
+
+ if(4)
+ if(prob(2))
+ affected_mob.emote("itch")
+ if(prob(2))
+ affected_mob.emote("drool")
+ if(prob(5))
+ affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
+ affected_mob.adjustCloneLoss(2)
+ if(prob(15))
+ affected_mob.stuttering += 3
+ if(5)
+ if(prob(2))
+ affected_mob.emote("itch")
+ if(prob(2))
+ affected_mob.emote("drool")
+ if(prob(5))
+ to_chat(affected_mob, span_danger("Your skin starts degrading!"))
+ if(prob(10))
+ affected_mob.adjustCloneLoss(5)
+ affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
+ if(affected_mob.cloneloss >= 100)
+ affected_mob.visible_message(span_danger("[affected_mob] skin turns to dust!"), "Your skin turns to dust!")
+ affected_mob.dust()
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index acd3e01ec85..d46fd023af4 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -28,6 +28,7 @@
#include "master_files\code\datums\components\crafting\recipes\misc.dm"
#include "master_files\code\datums\components\crafting\recipes\clothing.dm"
#include "master_files\code\datums\components\crafting\recipes\weapons.dm"
+#include "master_files\code\datums\diseases\decloning.dm"
#include "master_files\code\datums\diseases\pierrot_throat.dm"
#include "master_files\code\game\atoms.dm"
#include "master_files\code\game\pentest_proc.dm"
From f6b335811b582df3ef7a8185e57d5ed5fe38ec8e Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:58:51 -0700
Subject: [PATCH 09/52] forgo toys readme
---
modular_pentest/modules/toys/readme.md | 35 ++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
create mode 100644 modular_pentest/modules/toys/readme.md
diff --git a/modular_pentest/modules/toys/readme.md b/modular_pentest/modules/toys/readme.md
new file mode 100644
index 00000000000..0b0248659a0
--- /dev/null
+++ b/modular_pentest/modules/toys/readme.md
@@ -0,0 +1,35 @@
+
+
+https://github.com/PentestSS13/Pentest/pull/
+
+## \ Umbrellas
+
+Module ID: PENTEST_TOYS
+
+### Description:
+
+This file has code for toys!
+
+### Shiptest Proc/File Changes:
+
+- N/A
+
+### Modular Overrides:
+
+- N/A
+
+### Defines:
+
+- N/A
+
+### Map additions
+- N/A
+
+### Included files that are not contained in this module:
+
+- N/A
+
+
+### Credits:
+
+Ossa
From d05e3401d14b77fc4efbffde614c10ea362fd2c7 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:59:10 -0700
Subject: [PATCH 10/52] restores d20 of fate
---
.../awaymissions/mission_code/Academy.dm | 196 ++++++++++++++++++
1 file changed, 196 insertions(+)
create mode 100644 modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm
diff --git a/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm b/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm
new file mode 100644
index 00000000000..99abb22872b
--- /dev/null
+++ b/modular_pentest/master_files/code/modules/awaymissions/mission_code/Academy.dm
@@ -0,0 +1,196 @@
+/obj/item/dice/d20/fate
+ name = "\improper Die of Fate"
+ desc = "A die with twenty sides. You can feel unearthly energies radiating from it. Using this might be VERY risky."
+ icon_state = "d20"
+ sides = 20
+ microwave_riggable = FALSE
+ var/reusable = TRUE
+ var/used = FALSE
+
+/obj/item/dice/d20/fate/one_use
+ reusable = FALSE
+
+/obj/item/dice/d20/fate/cursed
+ name = "cursed Die of Fate"
+ desc = "A die with twenty sides. You feel that rolling this is a REALLY bad idea."
+ color = "#00BB00"
+
+ rigged = DICE_TOTALLY_RIGGED
+ rigged_value = 1
+
+/obj/item/dice/d20/fate/cursed/one_use
+ reusable = FALSE
+
+/obj/item/dice/d20/fate/stealth
+ name = "d20"
+ desc = "A die with twenty sides. The preferred die to throw at the GM."
+
+/obj/item/dice/d20/fate/stealth/one_use
+ reusable = FALSE
+
+/obj/item/dice/d20/fate/stealth/cursed
+ rigged = DICE_TOTALLY_RIGGED
+ rigged_value = 1
+
+/obj/item/dice/d20/fate/stealth/cursed/one_use
+ reusable = FALSE
+
+/obj/item/dice/d20/fate/diceroll(mob/user)
+ . = ..()
+ if(!used)
+ if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
+ to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans!"))
+ return
+
+ if(!reusable)
+ used = TRUE
+
+ var/turf/T = get_turf(src)
+ T.visible_message(span_userdanger("[src] flares briefly."))
+
+ addtimer(CALLBACK(src, PROC_REF(effect), user, .), 1 SECONDS)
+
+/obj/item/dice/d20/fate/equipped(mob/user, slot)
+ . = ..()
+ if(!ishuman(user) || !user.mind || (user.mind in SSticker.mode.wizards))
+ to_chat(user, span_warning("You feel the magic of the dice is restricted to ordinary humans! You should leave it alone."))
+ user.dropItemToGround(src)
+
+
+/obj/item/dice/d20/fate/proc/effect(mob/living/carbon/human/user,roll)
+ var/turf/T = get_turf(src)
+ switch(roll)
+ if(1)
+ //Dust
+ T.visible_message(span_userdanger("[user] turns to dust!"))
+ user.hellbound = TRUE
+ user.dust()
+ if(2)
+ //Death
+ T.visible_message(span_userdanger("[user] suddenly dies!"))
+ user.death()
+ if(3)
+ //Swarm of creatures
+ T.visible_message(span_userdanger("A swarm of creatures surround [user]!"))
+ for(var/direction in GLOB.alldirs)
+ new /mob/living/simple_animal/hostile/netherworld(get_step(get_turf(user),direction))
+ if(4)
+ //Destroy Equipment
+ T.visible_message(span_userdanger("Everything [user] is holding and wearing disappears!"))
+ for(var/obj/item/I in user)
+ if(istype(I, /obj/item/implant))
+ continue
+ qdel(I)
+ if(5)
+ //Monkeying
+ T.visible_message(span_userdanger("[user] transforms into a monkey!"))
+ user.monkeyize()
+ if(6)
+ //Cut speed
+ T.visible_message(span_userdanger("[user] starts moving slower!"))
+ user.add_movespeed_modifier(/datum/movespeed_modifier/die_of_fate)
+ if(7)
+ //Throw
+ T.visible_message(span_userdanger("Unseen forces throw [user]!"))
+ user.Stun(60)
+ user.adjustBruteLoss(50)
+ var/throw_dir = pick(GLOB.cardinals)
+ var/atom/throw_target = get_edge_target_turf(user, throw_dir)
+ user.throw_at(throw_target, 200, 4)
+ if(8)
+ //Fueltank Explosion
+ T.visible_message(span_userdanger("An explosion bursts into existence around [user]!"))
+ explosion(get_turf(user),-1,0,2, flame_range = 2)
+ if(9)
+ //Cold
+ var/datum/disease/D = new /datum/disease/cold()
+ T.visible_message(span_userdanger("[user] looks a little under the weather!"))
+ user.ForceContractDisease(D, FALSE, TRUE)
+ if(10)
+ //Nothing
+ T.visible_message(span_userdanger("Nothing seems to happen."))
+ if(11)
+ //Cookie
+ T.visible_message(span_userdanger("A cookie appears out of thin air!"))
+ var/obj/item/food/cookie/C = new(drop_location())
+ do_smoke(0, drop_location())
+ C.name = "Cookie of Fate"
+ if(12)
+ //Healing
+ T.visible_message(span_userdanger("[user] looks very healthy!"))
+ user.revive(full_heal = TRUE, admin_revive = TRUE)
+ if(13)
+ //Mad Dosh
+ T.visible_message(span_userdanger("Mad dosh shoots out of [src]!"))
+ var/turf/Start = get_turf(src)
+ for(var/direction in GLOB.alldirs)
+ var/turf/dirturf = get_step(Start,direction)
+ if(rand(0,1))
+ new /obj/item/spacecash/bundle/c1000(dirturf)
+ else
+ var/obj/item/storage/bag/money/M = new(dirturf)
+ for(var/i in 1 to rand(5,50))
+ new /obj/item/coin/gold(M)
+ if(14)
+ //Free Gun
+ T.visible_message(span_userdanger("An impressive gun appears!"))
+ do_smoke(0, drop_location())
+ new /obj/item/gun/ballistic/revolver/mateba(drop_location())
+ if(15)
+ //Random One-use spellbook
+ T.visible_message(span_userdanger("A magical looking book drops to the floor!"))
+ do_smoke(0, drop_location())
+ new /obj/item/book/granter/spell/random(drop_location())
+ if(16)
+ //Servant & Servant Summon
+ T.visible_message(span_userdanger("A Dice Servant appears in a cloud of smoke!"))
+ var/mob/living/carbon/human/H = new(drop_location())
+ do_smoke(0, drop_location())
+
+ H.equipOutfit(/datum/outfit/butler)
+ var/datum/mind/servant_mind = new /datum/mind()
+ var/datum/antagonist/magic_servant/A = new
+ servant_mind.add_antag_datum(A)
+ A.setup_master(user)
+ servant_mind.transfer_to(H)
+
+ var/list/mob/dead/observer/candidates = pollCandidatesForMob("Do you want to play as [user.real_name] Servant?", ROLE_WIZARD, null, ROLE_WIZARD, 50, H)
+ if(LAZYLEN(candidates))
+ var/mob/dead/observer/C = pick(candidates)
+ message_admins("[ADMIN_LOOKUPFLW(C)] was spawned as Dice Servant")
+ H.key = C.key
+
+ var/obj/effect/proc_holder/spell/targeted/summonmob/S = new
+ S.target_mob = H
+ user.mind.AddSpell(S)
+
+ if(17)
+ //Tator Kit
+ T.visible_message(span_userdanger("A suspicious box appears!"))
+ new /obj/item/storage/box/syndicate/bundle_A(drop_location())
+ do_smoke(0, drop_location())
+ if(18)
+ //Captain ID
+ T.visible_message(span_userdanger("A golden identification card appears!"))
+ new /obj/item/card/id/captains_spare(drop_location())
+ do_smoke(0, drop_location())
+ if(19)
+ //Instrinct Resistance
+ T.visible_message(span_userdanger("[user] looks very robust!"))
+ user.physiology.brute_mod *= 0.5
+ user.physiology.burn_mod *= 0.5
+
+ if(20)
+ //Free wizard! //NOT ANY MORE FUCKING CHRIST
+ T.visible_message(span_userdanger("Magic arches out of [src] and into ground under [user]!"))
+ new /obj/item/clothing/suit/wizrobe(drop_location())
+ new /obj/item/clothing/head/wizard(drop_location())
+ new /obj/item/clothing/gloves/combat/wizard(drop_location())
+ new /obj/item/staff(drop_location())
+ new /obj/structure/mirror/magic(drop_location())
+
+/datum/outfit/butler
+ name = "Butler"
+ uniform = /obj/item/clothing/under/suit/black_really
+ shoes = /obj/item/clothing/shoes/laceup
+ gloves = /obj/item/clothing/gloves/color/white
From 9a25d2260f08661e61c4b533f8b39cbded8ba2c4 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 06:59:20 -0700
Subject: [PATCH 11/52] restores spider injector
---
.../modules/xenobiology/code/slime_goldspawn.dm | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
index 3769cca7bcf..e031fff5471 100644
--- a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
+++ b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
@@ -29,3 +29,13 @@
if(prob(50))
for(var/j = 1, j <= rand(1, 3), j++)
step(S, pick(NORTH,SOUTH,EAST,WEST))
+
+/datum/uplink_item/role_restricted/spider_injector
+ name = "Australicus Slime Mutator"
+ desc = "Crikey mate, it's been a wild travel from the Australicus sector but we've managed to get \
+ some special spider extract from the giant spiders down there. Use this injector on a gold slime core \
+ to create a few of the same type of spiders we found on the planets over there. They're a bit tame until you \
+ also give them a bit of sentience though."
+ item = /obj/item/reagent_containers/syringe/spider_extract
+ cost = 10
+ restricted_roles = list("Research Director", "Scientist", "Roboticist")
From 6aaa9f4b363b44b7ba39e150f05cb532a58dd90a Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 07:00:08 -0700
Subject: [PATCH 12/52] restores the spider extract syringe
---
modular_pentest/modules/xenobiology/code/slime_goldspawn.dm | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
index e031fff5471..017ff36b8c4 100644
--- a/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
+++ b/modular_pentest/modules/xenobiology/code/slime_goldspawn.dm
@@ -39,3 +39,8 @@
item = /obj/item/reagent_containers/syringe/spider_extract
cost = 10
restricted_roles = list("Research Director", "Scientist", "Roboticist")
+
+/obj/item/reagent_containers/syringe/spider_extract
+ name = "spider extract syringe"
+ desc = "Contains crikey juice - makes any gold core create the most deadly companions in the world."
+ list_reagents = list(/datum/reagent/spider_extract = 1)
From 4e73a1e53fe41650ffd4569c1c2f0959fb165e17 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:45:35 -0700
Subject: [PATCH 13/52] Converts old Omnizine to Panacea
---
_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm | 2 +-
.../master_files/code/game/objects/items/food/donk.dm | 2 +-
.../master_files/code/game/objects/items/food/pizza.dm | 6 +++---
.../master_files/code/game/objects/items/food/sweets.dm | 2 +-
.../modules/xenobiology/code/crossbreeding/__corecross.dm | 4 ++--
.../modules/xenobiology/code/crossbreeding/charged.dm | 2 +-
6 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
index a0d3e3d6c6a..8681a4a0bb4 100644
--- a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
+++ b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
@@ -1616,7 +1616,7 @@
/obj/item/slimecrossbeaker/autoinjector/slimestimulant{
pixel_y = 11
},
-/obj/item/slimecrossbeaker/omnizine,
+/obj/item/slimecrossbeaker/panacea,
/obj/item/reagent_containers/glass/beaker{
pixel_y = 10;
pixel_x = -9
diff --git a/modular_pentest/master_files/code/game/objects/items/food/donk.dm b/modular_pentest/master_files/code/game/objects/items/food/donk.dm
index 18262ef594e..10e79813985 100644
--- a/modular_pentest/master_files/code/game/objects/items/food/donk.dm
+++ b/modular_pentest/master_files/code/game/objects/items/food/donk.dm
@@ -32,7 +32,7 @@
icon_state = "donkpocketbanana"
food_reagents = list(
/datum/reagent/consumable/nutriment = 4,
- /datum/reagent/medicine/omnizine = 2,
+ /datum/reagent/medicine/panacea/effluvial = 2,
/datum/reagent/consumable/banana = 4,
/datum/reagent/consumable/laughter = 6
)
diff --git a/modular_pentest/master_files/code/game/objects/items/food/pizza.dm b/modular_pentest/master_files/code/game/objects/items/food/pizza.dm
index f897957b17a..5fa98f1c8c4 100644
--- a/modular_pentest/master_files/code/game/objects/items/food/pizza.dm
+++ b/modular_pentest/master_files/code/game/objects/items/food/pizza.dm
@@ -4,7 +4,7 @@
icon = 'modular_pentest/master_files/icons/obj/food/pizza.dmi'
icon_state = "arnoldpizza"
slice_type = /obj/item/food/pizzaslice/arnold
- bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/omnizine = 30)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment = 30, /datum/reagent/consumable/nutriment/vitamin = 6, /datum/reagent/iron = 10, /datum/reagent/medicine/panacea = 30)
tastes = list("crust" = 1, "tomato" = 1, "cheese" = 1, "pepperoni" = 2, "9 millimeter bullets" = 2)
/obj/item/food/proc/try_break_off(mob/living/M, mob/living/user) //maybe i give you a pizza maybe i break off your arm
@@ -65,8 +65,8 @@
name = "hot pizza rolls"
desc = "A plate of scalding hot pizza rolls. Try not to burn your tongue with their meaty, cheesy goodness."
icon_state = "pizzarolls" // secc icon. we are blessed
- bonus_reagents = list(/datum/reagent/medicine/omnizine = 1) // Because they're teeny Donk pockets
- food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/omnizine = 1)
+ bonus_reagents = list(/datum/reagent/medicine/panacea = 1) // Because they're teeny Donk pockets
+ food_reagents = list(/datum/reagent/consumable/nutriment = 4, /datum/reagent/medicine/panacea = 1)
microwaved_type = null
tastes = list("meat" = 2, "dough" = 2, "cheese" = 2, "unbearable heat" = 1)
foodtypes = GRAIN
diff --git a/modular_pentest/master_files/code/game/objects/items/food/sweets.dm b/modular_pentest/master_files/code/game/objects/items/food/sweets.dm
index 57a0e0eb62b..d4470c1a669 100644
--- a/modular_pentest/master_files/code/game/objects/items/food/sweets.dm
+++ b/modular_pentest/master_files/code/game/objects/items/food/sweets.dm
@@ -4,7 +4,7 @@
icon = 'icons/obj/lollipop.dmi'
icon_state = "lollipop_stick"
item_state = "lollipop_stick"
- food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/omnizine = 2) //Honk
+ food_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/consumable/nutriment/vitamin = 1, /datum/reagent/iron = 10, /datum/reagent/consumable/sugar = 5, /datum/reagent/medicine/panacea = 2) //Honk
var/mutable_appearance/head
var/headcolor = rgb(0, 0, 0)
succ_dur = 15 * 60
diff --git a/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm b/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm
index a7b19bebc3b..30b16b1d5d8 100644
--- a/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm
+++ b/modular_pentest/modules/xenobiology/code/crossbreeding/__corecross.dm
@@ -128,11 +128,11 @@ To add a crossbreed:
color = "#FFCCCC"
list_reagents = list(/datum/reagent/pax/peaceborg = 5)
-/obj/item/slimecrossbeaker/omnizine //15u omnizine.
+/obj/item/slimecrossbeaker/panacea //15u omnizine panacea.
name = "healing extract"
desc = "A gelatinous extract of pure omnizine."
color = "#FF00FF"
- list_reagents = list(/datum/reagent/medicine/omnizine = 15)
+ list_reagents = list(/datum/reagent/medicine/panacea = 15)
/obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents.
var/ignore_flags = FALSE
diff --git a/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm b/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm
index 3e105e71708..a3aff3374ea 100644
--- a/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm
+++ b/modular_pentest/modules/xenobiology/code/crossbreeding/charged.dm
@@ -52,7 +52,7 @@ Charged extracts:
effect_desc = "Creates a packet of omnizine."
/obj/item/slimecross/charged/purple/do_effect(mob/user)
- new /obj/item/slimecrossbeaker/omnizine(get_turf(user))
+ new /obj/item/slimecrossbeaker/panacea(get_turf(user))
user.visible_message(span_notice("[src] sparks, and floods with a regenerative solution!"))
..()
From eb60612dfb88484b023817a22011114b74e291aa Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:45:59 -0700
Subject: [PATCH 14/52] Start of the new chem module
---
.../code/medical_reagents/blood_reagents.dm | 3 ++
.../code/medical_reagents/fauna_reagents.dm | 3 ++
.../code/medical_reagents/flora_reagents.dm | 3 ++
.../code/medical_reagents/ipc_reagents.dm | 3 ++
.../code/medical_reagents/organ_reagents.dm | 3 ++
.../code/medical_reagents/pain_reagents.dm | 3 ++
.../code/medical_reagents/status_reagents.dm | 3 ++
.../code/medical_reagents/wound_reagents.dm | 3 ++
modular_pentest/modules/chemistry/readme.md | 35 +++++++++++++++++++
9 files changed, 59 insertions(+)
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm
create mode 100644 modular_pentest/modules/chemistry/readme.md
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm
new file mode 100644
index 00000000000..38b6781b9b9
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/blood_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for blood
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm
new file mode 100644
index 00000000000..c641079fdb7
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/fauna_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents with fauna related sources
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm
new file mode 100644
index 00000000000..a8e311a441d
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/flora_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents from flora related sources
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm
new file mode 100644
index 00000000000..5f8f4492acc
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/ipc_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for IPCs
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm
new file mode 100644
index 00000000000..887c96d88b9
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/organ_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for organ repair.
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm
new file mode 100644
index 00000000000..89dd96e0c05
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/pain_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for pain management.
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm
new file mode 100644
index 00000000000..e0f3df600c9
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/status_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for status and mood effects.
+*/
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm
new file mode 100644
index 00000000000..1aa88d3a9f8
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/wound_reagents.dm
@@ -0,0 +1,3 @@
+/*
+ Chemical Reagents for wound treatment.
+*/
diff --git a/modular_pentest/modules/chemistry/readme.md b/modular_pentest/modules/chemistry/readme.md
new file mode 100644
index 00000000000..05375b5cf90
--- /dev/null
+++ b/modular_pentest/modules/chemistry/readme.md
@@ -0,0 +1,35 @@
+
+
+https://github.com/PentestSS13/Pentest/pull/
+
+## \Pentest fixes
+
+Module ID: PENTEST_CHEM
+
+### Description:
+
+Pentest Chemistry Overhaul
+
+### Shiptest Proc/File Changes:
+
+- N/A
+
+### Modular Overrides:
+
+- N/A
+
+### Defines:
+
+- N/A
+
+### Map additions:
+
+- N/A
+
+### Included files that are not contained in this module:
+
+- N/A
+
+### Credits:
+
+Ossa
From fb9b5442e335016d81a3d6bec90faa5730c15481 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:46:34 -0700
Subject: [PATCH 15/52] Restores xeno cits and corrects some descriptions
---
.../master_files/code/game/objects/items/cigs_lighters.dm | 6 ++++++
.../master_files/code/game/objects/items/storage/fancy.dm | 6 ++++++
modular_pentest/modules/chemistry/code/overrides.dm | 5 +++++
3 files changed, 17 insertions(+)
create mode 100644 modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm
create mode 100644 modular_pentest/master_files/code/game/objects/items/storage/fancy.dm
create mode 100644 modular_pentest/modules/chemistry/code/overrides.dm
diff --git a/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm b/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm
new file mode 100644
index 00000000000..37ebddfaf65
--- /dev/null
+++ b/modular_pentest/master_files/code/game/objects/items/cigs_lighters.dm
@@ -0,0 +1,6 @@
+/obj/item/clothing/mask/cigarette/xeno
+ desc = "A Xeno Filtered brand cigarette."
+ list_reagents = list (/datum/reagent/drug/nicotine = 20, /datum/reagent/medicine/regen_jelly = 15)
+
+/obj/item/lighter/slime
+ grind_results = list(/datum/reagent/iron = 1, /datum/reagent/fuel = 5)
diff --git a/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm b/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm
new file mode 100644
index 00000000000..e5e8a0168f7
--- /dev/null
+++ b/modular_pentest/master_files/code/game/objects/items/storage/fancy.dm
@@ -0,0 +1,6 @@
+/obj/item/storage/fancy/cigarettes/cigpack_xeno
+ name = "\improper Xeno Filtered packet"
+ desc = "Loaded with 100% pure slime. And also nicotine."
+ icon_state = "slime"
+ base_icon_state = "slime"
+ spawn_type = /obj/item/clothing/mask/cigarette/xeno
diff --git a/modular_pentest/modules/chemistry/code/overrides.dm b/modular_pentest/modules/chemistry/code/overrides.dm
new file mode 100644
index 00000000000..f0cc11b7073
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/overrides.dm
@@ -0,0 +1,5 @@
+/datum/blackmarket_item/consumable/syndie_cigs
+ desc = "Who said smoking was bad for you? These Omnizine Panacea laced cigarettes will have you feeling like a million bucks!"
+
+/datum/uplink_item/badass/syndiecigs
+ desc = "Strong flavor, dense smoke, infused with Ominzine Panacea."
From 5a5ba421b78a9b2fd9a613aec79ad5709eec4397 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:46:49 -0700
Subject: [PATCH 16/52] working copy of medicine reagents
---
.../medical_reagents/medicine_reagents.dm | 796 ++++++++++++++++++
1 file changed, 796 insertions(+)
create mode 100644 modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
new file mode 100644
index 00000000000..b5eef91197d
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -0,0 +1,796 @@
+/*
+ Omnizine is a chemical that heals all damage types, but can cause damage if overdosed. Protozine is a weaker variant of omnizine.
+*/
+
+/datum/reagent/medicine/panacea
+ name = "Omnizine Panacea"
+ description = "A rare bioactive compound first discovered within certain extraterrestrial plant species. Omnizine Panacea rapidly stimulates cellular regeneration, allowing it to slowly repair nearly all forms of bodily damage. Excessive doses can destabilize this process, causing the regenerative effect to reverse."
+
+/datum/reagent/medicine/panacea/effluvial
+ name = "Effluvial Panacea"
+ description = "A degraded or impure form of Omnizine Panacea produced through biomass decay or industrial food processing. While it retains some regenerative properties, contaminants and breakdown products greatly reduce its effectiveness."
+
+/*
+ Clonexadone is a chemical that heals clone damage, but nothing else. It requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone.
+ Clonexadone is made from cryoxadone and sodium, with plasma as a catalyst.
+*/
+
+/datum/reagent/medicine/clonexadone
+ name = "Clonexadone"
+ description = "A chemical that derives from Cryoxadone. It specializes in healing clone damage, but nothing else. Requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone."
+ color = "#3D3DC6"
+ taste_description = "muscle"
+ metabolization_rate = 1.5 * REAGENTS_METABOLISM
+
+/datum/reagent/medicine/clonexadone/on_mob_life(mob/living/carbon/M)
+ if(M.bodytemperature < T0C)
+ M.adjustCloneLoss(0.00006 * (M.bodytemperature ** 2) - 6, 0)
+ REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
+ . = 1
+ metabolization_rate = REAGENTS_METABOLISM * (0.000015 * (M.bodytemperature ** 2) + 0.75)
+ ..()
+
+/datum/chemical_reaction/clonexadone
+ results = list(/datum/reagent/medicine/clonexadone = 2)
+ required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 5)
+
+/*
+ Pyroxadone is a chemical that heals all damage types, but only if the user is above a certain body temperature.
+ It is made from cryoxadone and slime jelly, and apparently inverses the requirement for its activation.
+*/
+
+/datum/reagent/medicine/pyroxadone
+ name = "Pyroxadone"
+ description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation."
+ color = "#f7832a"
+ taste_description = "spicy jelly"
+
+/datum/reagent/medicine/pyroxadone/on_mob_life(mob/living/carbon/M)
+ . = ..()
+
+ var/bodytemp = M.bodytemperature
+ var/heatlimit = M.dna.species.bodytemp_heat_damage_limit
+ if(bodytemp < heatlimit)
+ return .
+ var/power = 0
+ if(bodytemp < 400)
+ power = 2
+ else if(bodytemp < 460)
+ power = 3
+ else
+ power = 5
+ if(M.on_fire)
+ power *= 2
+ M.adjustOxyLoss(-2 * power, 0)
+ M.adjustBruteLoss(-power, 0)
+ M.adjustFireLoss(-1.5 * power, 0)
+ M.adjustToxLoss(-power, 0, TRUE)
+ M.adjustCloneLoss(-power, 0)
+ for(var/i in M.all_wounds)
+ var/datum/wound/iter_wound = i
+ iter_wound.on_xadone(power)
+ REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
+
+/datum/chemical_reaction/pyroxadone
+ results = list(/datum/reagent/medicine/pyroxadone = 2)
+ required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
+
+
+
+
+
+
+/datum/reagent/medicine/oxandrolone
+ name = "Oxandrolone"
+ description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns."
+ reagent_state = LIQUID
+ color = "#1E8BFF"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+
+/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
+ if(M.getFireLoss() > 25)
+ M.adjustFireLoss(-4*REM, 0) //Twice as effective as AIURI for severe burns
+ else
+ M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
+ ..()
+ . = 1
+
+/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
+ if(M.getFireLoss()) //It only makes existing burns worse
+ M.adjustFireLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
+ . = 1
+ ..()
+
+
+
+
+/datum/reagent/medicine/styptic_powder
+ name = "Styptic Powder"
+ description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
+ reagent_state = LIQUID
+ color = "#FF9696"
+ overdose_threshold = 45
+
+/datum/reagent/medicine/styptic_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustToxLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You don't feel so good..."))
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your bruises healing! It stings like hell!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your bruises throbbing."))
+ ..()
+
+
+/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M)
+ M.adjustBruteLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/sal_acid
+ name = "Salicylic Acid"
+ description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
+ reagent_state = LIQUID
+ color = "#D2D2D2"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+
+/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
+ if(M.getBruteLoss() > 25)
+ M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
+ else
+ M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
+ ..()
+ . = 1
+
+/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
+ if(M.getBruteLoss()) //It only makes existing bruises worse
+ M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
+ . = 1
+ ..()
+
+
+
+/datum/reagent/medicine/perfluorodecalin
+ name = "Perfluorodecalin"
+ description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
+ reagent_state = LIQUID
+ color = "#FF6464"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
+
+/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
+ var/oxycalc = 2.5*REM*current_cycle
+ if(!overdosed)
+ oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
+ M.adjustOxyLoss(-oxycalc, 0)
+ M.adjustToxLoss(oxycalc/2.5, 0)
+ if(prob(current_cycle) && M.losebreath)
+ M.losebreath--
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M)
+ metabolization_rate += 1
+ return ..()
+
+
+
+/datum/reagent/medicine/bicaridine
+ name = "Bicaridine"
+ description = "Restores bruising. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#bf0000"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-0.5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
+ M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/bicaridinep
+ name = "Bicaridine Plus"
+ description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine."
+ reagent_state = LIQUID
+ color = "#bf0000"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M)
+ M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/dexalinp
+ name = "Dexalin Plus"
+ description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin."
+ reagent_state = LIQUID
+ color = "#0040FF"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M)
+ M.adjustOxyLoss(-2*REM, 0)
+ if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume += 1
+ if(holder.has_reagent(/datum/reagent/toxin/lexorin))
+ holder.remove_reagent(/datum/reagent/toxin/lexorin, 3)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M)
+ M.adjustOxyLoss(6*REM, 0)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/kelotane
+ name = "Kelotane"
+ description = "Heals burn damage. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#FFa800"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-0.5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
+ M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+
+/datum/reagent/medicine/dermaline
+ name = "Dermaline"
+ description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity."
+ reagent_state = LIQUID
+ color = "#FF8000"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dermaline/overdose_process(mob/living/M)
+ M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/antitoxin
+ name = "Dylovene"
+ description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
+ reagent_state = LIQUID
+ color = "#00a000"
+ overdose_threshold = 30
+ taste_description = "a roll of gauze"
+
+/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-0.5*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+ . = ..()
+ if(chems.has_reagent(type, 1))
+ mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
+
+/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
+ M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/tricordrazine
+ name = "Tricordrazine"
+ description = "A weak dilutant that slowly heals brute, burn, and toxin damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ taste_description = "water that has been standing still in a glass on a counter overnight"
+
+/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustBruteLoss(-0.25*REM, 0)
+ M.adjustFireLoss(-0.25*REM, 0)
+ M.adjustToxLoss(-0.25*REM, 0)
+ . = 1
+ ..()
+
+
+
+/datum/reagent/medicine/tetracordrazine //WS edit: Yes
+ name = "Tetracordrazine"
+ description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it"
+
+/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustBruteLoss(-0.25*REM, 0)
+ M.adjustFireLoss(-0.25*REM, 0)
+ M.adjustToxLoss(-0.25*REM, 0)
+ M.adjustOxyLoss(-0.5*REM, 0)
+ . = 1
+ ..()
+
+
+
+/datum/reagent/medicine/regen_jelly
+ name = "Regenerative Jelly"
+ description = "Gradually regenerates all types of damage, without harming slime anatomy."
+ reagent_state = LIQUID
+ color = "#CC23FF"
+ taste_description = "jelly"
+
+/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
+ if(M && ishuman(M) && reac_volume >= 0.5)
+ var/mob/living/carbon/human/H = M
+ H.hair_color = "C2F"
+ H.facial_hair_color = "C2F"
+ H.update_hair()
+
+/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1.5*REM, 0)
+ M.adjustFireLoss(-1.5*REM, 0)
+ M.adjustOxyLoss(-1.5*REM, 0)
+ M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
+ name = "Restorative Nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage."
+ reagent_state = SOLID
+ color = "#555555"
+ overdose_threshold = 30
+ process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
+
+/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
+ M.adjustFireLoss(-5*REM, 0)
+ M.adjustOxyLoss(-15, 0)
+ M.adjustToxLoss(-5*REM, 0)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
+ M.adjustCloneLoss(-3*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
+ if(prob(25))
+ M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
+ M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/cordiolis_hepatico
+ name = "Cordiolis Hepatico"
+ description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
+ color = "#000000"
+ self_consuming = TRUE
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_STABLELIVER, type)
+ ADD_TRAIT(M, TRAIT_STABLEHEART, type)
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
+ ..()
+ REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
+ REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
+
+
+
+
+/datum/reagent/medicine/muscle_stimulant
+ name = "Muscle Stimulant"
+ description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
+ . = ..()
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+
+
+
+
+/datum/reagent/medicine/carthatoline
+ name = "Carthatoline"
+ description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage."
+ reagent_state = LIQUID
+ color = "#225722"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-2*REM, 0)
+ if(M.getToxLoss() && prob(10))
+ M.vomit(1)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,2)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M)
+ M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math.
+ ..()
+ . = 1
+
+
+
+
+/datum/reagent/medicine/converbital
+ name = "Converbital"
+ description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns"
+ reagent_state = LIQUID
+ taste_description = "burning"
+ color = "#7a1f13"
+ metabolization_rate = REM * 1
+ overdose_threshold = 25
+
+/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustFireLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You feel a slight burning sensation..."))
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-reac_volume)
+ M.adjustFireLoss(reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
+ ..()
+
+/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(0.25*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/converbital/overdose_process(mob/living/M)
+ M.adjustFireLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+
+
+
+/datum/reagent/medicine/convuri
+ name = "Convuri"
+ description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing"
+ reagent_state = SOLID
+ taste_description = "white-hot pain"
+ color = "#b85505"
+ metabolization_rate = REM * 1
+ overdose_threshold = 25
+
+/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustBruteLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You feel a slight tearing sensation..."))
+ else if(M.getBruteLoss())
+ M.adjustFireLoss(-reac_volume)
+ M.adjustBruteLoss(reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
+ ..()
+
+/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(0.25*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/convuri/overdose_process(mob/living/M)
+ M.adjustBruteLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/trophazole
+ name = "Trophazole"
+ description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides"
+ reagent_state = LIQUID
+ color = "#FFFF6B"
+ overdose_threshold = 20
+
+/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment
+ ..()
+ . = 1
+
+/datum/reagent/medicine/trophazole/overdose_process(mob/living/M)
+ M.adjustBruteLoss(3*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume)
+ if(method != INGEST || !iscarbon(A))
+ return
+
+ A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05)
+ A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
+
+ ..()
+
+
+
+/datum/reagent/medicine/rhigoxane
+ name = "Rhigoxane"
+ description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires."
+ reagent_state = LIQUID
+ color = "#F7FFA5"
+ overdose_threshold = 25
+ reagent_weight = 0.6
+
+/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0.)
+ M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
+ if(method != VAPOR)
+ return
+
+ M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
+ M.adjust_fire_stacks(-reac_volume / 2)
+ if(reac_volume >= metabolization_rate)
+ M.ExtinguishMob()
+
+ ..()
+
+/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M)
+ M.adjustFireLoss(3*REM, 0.)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
+ ..()
+
+
+
+
+/datum/reagent/medicine/thializid
+ name = "Thializid"
+ description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid."
+ reagent_state = LIQUID
+ color = "#8CDF24" // heavy saturation to make the color blend better
+ metabolization_rate = 0.75 * REAGENTS_METABOLISM
+ overdose_threshold = 6
+ var/conversion_amount
+
+/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume)
+ if(method != INJECT || !iscarbon(A))
+ return
+ var/mob/living/carbon/C = A
+ if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
+ C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
+ var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
+ if((L.organ_flags & ORGAN_FAILING) || !L)
+ return
+ conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
+ C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount)
+ C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount)
+ ..()
+
+/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+
+ ..()
+ . = 1
+
+/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/oxalizid
+ name = "Oxalizid"
+ description = "The active metabolite of thializid. Causes muscle weakness on overdose"
+ reagent_state = LIQUID
+ color = "#DFD54E"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+ var/datum/brain_trauma/mild/muscle_weakness/U
+
+/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M)
+ U = new()
+ M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
+ ..()
+
+/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M)
+ if(U)
+ QDEL_NULL(U)
+ return ..()
+
+/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ ..()
+ . = 1
+
+
+
+/datum/reagent/medicine/skeletons_boon
+ name = "Skeleton’s Boon"
+ description = "A robust solution of minerals that greatly strengthens the bones."
+ color = "#dbdfa2"
+ metabolization_rate = REAGENTS_METABOLISM * 0.125
+ overdose_threshold = 50
+ var/plasma_armor = 33
+ var/skele_armor = 20
+ var/added_armor = 0
+
+/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ if(isplasmaman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += plasma_armor
+ H.physiology.armor.bullet += plasma_armor
+ added_armor = plasma_armor
+ if(isskeleton(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += skele_armor
+ H.physiology.armor.bullet += skele_armor
+ added_armor = skele_armor
+ ..()
+
+/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee -= added_armor
+ H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
+ ..()
+
+/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
+ ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ ..()
+
+
+
+/datum/reagent/medicine/melatonin
+ name = "Human Sleep Hormone"
+ description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to."
+ color = "#e1b1e1" //very light pink ourple
+ overdose_threshold = 0
+ var/regenerating
+ var/rachnid_limb
+
+/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
+ . = ..()
+ if(iscarbon(L))
+ var/mob/living/carbon/imbiber = L
+ if(isspiderperson(imbiber))
+ //we check limbs, if one is missing, we break from the for loop after setting it to heal
+ for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ if(!imbiber.get_bodypart(limb))
+ rachnid_limb = limb
+ break
+
+/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(isspiderperson(L) && regenerating)
+ var/mob/living/carbon/spider
+ spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
+ return
+
+
+/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(isvox(M))
+ M.adjustToxLoss(1)
+ if(islizard(M))
+ if(prob(10))
+ M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
+ if(isspiderperson(M) && rachnid_limb)
+ if(prob(7))
+ to_chat(M, "Your body aches near [rachnid_limb]")
+ if(current_cycle > 20 && !regenerating)
+ regenerating = TRUE
+
+ else
+ if(M.IsSleeping())
+ if(M.getBruteLoss() && M.getFireLoss())
+ if(prob(50))
+ M.adjustBruteLoss(-0.5)
+ else
+ M.adjustFireLoss(-0.5)
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-0.2)
+ else if(M.getFireLoss())
+ M.adjustFireLoss(-0.2)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
From ce51d48aea7f44a92bfb558fb4a58c0c2b4fa40b Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:46:59 -0700
Subject: [PATCH 17/52] enables files with code currently
---
modular_pentest/~pentest.dme | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index d46fd023af4..e92c242cd43 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -39,6 +39,7 @@
#include "master_files\code\game\objects\AI_modules.dm"
#include "master_files\code\game\objects\effects\decals\turfdecal\flooring_decals.dm"
#include "master_files\code\game\objects\effects\spawners\random\food_or_drink.dm"
+#include "master_files\code\game\objects\items\cigs_lighters.dm"
#include "master_files\code\game\objects\items\dna_injector.dm"
#include "master_files\code\game\objects\items\holy_weapons.dm"
#include "master_files\code\game\objects\items\puzzle_pieces.dm"
@@ -73,6 +74,7 @@
#include "master_files\code\game\objects\items\stacks\sheets\recipes\crate_recipes.dm"
#include "master_files\code\game\objects\items\storage\backpack.dm"
#include "master_files\code\game\objects\items\storage\boxes.dm"
+#include "master_files\code\game\objects\items\storage\fancy.dm"
#include "master_files\code\game\objects\items\storage\toolbox.dm"
#include "master_files\code\game\objects\structures\crates.dm"
#include "master_files\code\game\objects\structures\statues.dm"
@@ -80,6 +82,7 @@
#include "master_files\code\game\turfs\open\water.dm"
#include "master_files\code\game\turfs\open\floor\plating\misc_plating.dm"
#include "master_files\code\game\turfs\walls\reinf_plastitanium.dm"
+#include "master_files\code\modules\antagonists\abductor\equipment\abduction_gear.dm"
#include "master_files\code\modules\antagonists\changeling\changeling.dm"
#include "master_files\code\modules\antagonists\wizard\equipment\spellbook.dm"
#include "master_files\code\modules\assembly\flash.dm"
@@ -226,6 +229,7 @@
#include "modules\_pentest_fixes\weapons\gun_jam_removal.dm"
#include "modules\achievements\code\achievements.dm"
#include "modules\bedsheets\code\bedsheets.dm"
+#include "modules\chemistry\code\medical_reagents\medicine_reagents.dm"
#include "modules\cult\code\_cult_gamemode.dm"
#include "modules\cult\code\construct_spells.dm"
#include "modules\cult\code\constructs.dm"
From 5beed4f0480a14f553b1e7587f75883babd63185 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:58:41 -0700
Subject: [PATCH 18/52] Just not dealing with unholy water
---
modular_pentest/modules/cult/code/cult_items.dm | 13 +------------
modular_pentest/modules/cult/code/cult_ritual.dm | 2 --
.../modules/cult/code/cult_structures.dm | 2 --
3 files changed, 1 insertion(+), 16 deletions(-)
diff --git a/modular_pentest/modules/cult/code/cult_items.dm b/modular_pentest/modules/cult/code/cult_items.dm
index 40826ccb6fd..89b847fc138 100644
--- a/modular_pentest/modules/cult/code/cult_items.dm
+++ b/modular_pentest/modules/cult/code/cult_items.dm
@@ -510,17 +510,6 @@
else
return
-/obj/item/reagent_containers/glass/beaker/unholywater
- name = "flask of unholy water"
- desc = "Toxic to nonbelievers; reinvigorating to the faithful - this flask may be sipped or thrown."
- icon = 'icons/obj/drinks/drinks.dmi'
- icon_state = "holyflask"
- color = "#333333"
- list_reagents = list(/datum/reagent/fuel/unholywater = 50)
- can_have_cap = FALSE
- cap_icon_state = null
- cap_on = FALSE
-
/obj/item/cult_shift
name = "veil shifter"
desc = "This relic instantly teleports you, and anything you're pulling, forward by a moderate distance."
@@ -841,7 +830,7 @@
if(ishuman(target))
var/mob/living/carbon/human/H = target
if(H.stat != DEAD)
- H.reagents.add_reagent(/datum/reagent/fuel/unholywater, 7)
+ H.reagents.add_reagent(/datum/reagent/medicine/panacea, 7)
if(isshade(target) || isconstruct(target))
var/mob/living/simple_animal/M = target
if(M.health+15 < M.maxHealth)
diff --git a/modular_pentest/modules/cult/code/cult_ritual.dm b/modular_pentest/modules/cult/code/cult_ritual.dm
index f476b517ee5..1d104b426fa 100644
--- a/modular_pentest/modules/cult/code/cult_ritual.dm
+++ b/modular_pentest/modules/cult/code/cult_ritual.dm
@@ -26,9 +26,7 @@ This file contains the cult dagger and rune list code
if(iscultist(M))
if(M.reagents && M.reagents.has_reagent(/datum/reagent/water/holywater)) //allows cultists to be rescued from the clutches of ordained religion
to_chat(user, span_cult("You remove the taint from [M].") )
- var/holy2unholy = M.reagents.get_reagent_amount(/datum/reagent/water/holywater)
M.reagents.del_reagent(/datum/reagent/water/holywater)
- M.reagents.add_reagent(/datum/reagent/fuel/unholywater,holy2unholy)
log_combat(user, M, "smacked", src, " removing the holy water from them")
return FALSE
. = ..()
diff --git a/modular_pentest/modules/cult/code/cult_structures.dm b/modular_pentest/modules/cult/code/cult_structures.dm
index 6f64e77d37c..cdec58beff9 100644
--- a/modular_pentest/modules/cult/code/cult_structures.dm
+++ b/modular_pentest/modules/cult/code/cult_structures.dm
@@ -109,8 +109,6 @@
pickedtype += /obj/item/sharpener/cult
if("Construct Shell")
pickedtype += /obj/structure/constructshell
- if("Flask of Unholy Water")
- pickedtype += /obj/item/reagent_containers/glass/beaker/unholywater
else
return
if(src && !QDELETED(src) && anchored && pickedtype && Adjacent(user) && !user.incapacitated() && iscultist(user) && cooldowntime <= world.time)
From 4f687333c3ed3fd40b10808aa77c93700d9fad32 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:58:53 -0700
Subject: [PATCH 19/52] restores slime toxin
---
.../modules/xenobiology/code/slime_extracts.dm | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/modular_pentest/modules/xenobiology/code/slime_extracts.dm b/modular_pentest/modules/xenobiology/code/slime_extracts.dm
index 9e2656f12a8..b58925d9851 100644
--- a/modular_pentest/modules/xenobiology/code/slime_extracts.dm
+++ b/modular_pentest/modules/xenobiology/code/slime_extracts.dm
@@ -454,6 +454,16 @@
required_other = TRUE
required_container = /obj/item/slime_extract/black
+/datum/reagent/aslimetoxin
+ name = "Advanced Mutation Toxin"
+ description = "An advanced corruptive toxin produced by slimes."
+ color = "#13BC5E" // rgb: 19, 188, 94
+ taste_description = "slime"
+
+/datum/reagent/aslimetoxin/expose_mob(mob/living/L, method=TOUCH, reac_volume)
+ if(method != TOUCH && method != SMOKE)
+ L.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE)
+
//Oil
/datum/chemical_reaction/slime/slimeexplosion
From 77922b435f468bb8c8002ff2f8db17d6de7a3831 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 18:59:08 -0700
Subject: [PATCH 20/52] fixes a missing define that was only used once ever
---
.../chemistry/code/medical_reagents/medicine_reagents.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index b5eef91197d..59012160cf3 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -178,7 +178,7 @@
/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
var/oxycalc = 2.5*REM*current_cycle
if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
+ oxycalc = min(oxycalc,M.getOxyLoss()+ 0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
M.adjustOxyLoss(-oxycalc, 0)
M.adjustToxLoss(oxycalc/2.5, 0)
if(prob(current_cycle) && M.losebreath)
From 9d69c3f0f7a5f2e06f85d34fd30767f38767d60f Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 21:32:20 -0700
Subject: [PATCH 21/52] updating progress
---
.../code/Working old chem list C2.dm | 410 ++++++++++++
.../chemistry/code/Working old chem list.dm | 622 ++++++++++++++++++
.../medical_reagents/medicine_reagents.dm | 126 ++--
.../code/recipes/medical_reactions.dm | 66 ++
modular_pentest/~pentest.dme | 1 +
5 files changed, 1151 insertions(+), 74 deletions(-)
create mode 100644 modular_pentest/modules/chemistry/code/Working old chem list C2.dm
create mode 100644 modular_pentest/modules/chemistry/code/Working old chem list.dm
create mode 100644 modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
diff --git a/modular_pentest/modules/chemistry/code/Working old chem list C2.dm b/modular_pentest/modules/chemistry/code/Working old chem list C2.dm
new file mode 100644
index 00000000000..0be955f2df3
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/Working old chem list C2.dm
@@ -0,0 +1,410 @@
+// Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful.
+/datum/reagent/medicine/c2
+ name = "Category two reagent"
+ harmful = TRUE
+ metabolization_rate = 0.2
+
+/******BRUTE******/
+/*Suffix: -bital*/
+
+/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit.
+ name = "Helbital"
+ description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation."
+ color = "#9400D3"
+ taste_description = "cold and lifeless"
+ overdose_threshold = 35
+ reagent_state = SOLID
+ var/helbent = FALSE
+ var/reaping = FALSE
+
+/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M)
+ . = TRUE
+ var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss())
+ var/thou_shall_heal = 0
+ var/good_kind_of_healing = FALSE
+ switch(M.stat)
+ if(CONSCIOUS) //bad
+ thou_shall_heal = death_is_coming/50
+ M.adjustOxyLoss(2, TRUE)
+ if(SOFT_CRIT) //meh convert
+ thou_shall_heal = round(death_is_coming/47,0.1)
+ M.adjustOxyLoss(1, TRUE)
+ else //no convert
+ thou_shall_heal = round(death_is_coming/45,0.1)
+ good_kind_of_healing = TRUE
+ M.adjustBruteLoss(-thou_shall_heal, FALSE)
+
+ if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper!
+ reaping = TRUE
+ var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to
+ if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING))
+ helbent = TRUE
+ to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?"))
+ var/timeisticking = world.time
+ var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors
+ if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time))
+ reaping = FALSE
+ return //good job, you ruined it
+ if(!RPSchoice)
+ to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon."))
+ reaping = FALSE
+ return
+ var/grim = pick(RockPaperScissors)
+ if(grim == RPSchoice) //You Tied!
+ to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now."))
+ reaping = FALSE
+ else if(RockPaperScissors[RPSchoice] == grim) //You lost!
+ to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body."))
+ M.dust()
+ return
+ else //VICTORY ROYALE
+ to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds."))
+ M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M)
+ M.revive(full_heal = TRUE, admin_revive = FALSE)
+ M.reagents.del_reagent(type)
+ return
+
+ ..()
+ return
+
+/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M)
+ if(!helbent)
+ M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING)
+ helbent = TRUE
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L)
+ if(helbent)
+ L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
+ ..()
+
+/datum/reagent/medicine/c2/libital //messes with your liber
+ name = "Libital"
+ description = "A bruise reliever. Does minor liver damage."
+ color = "#ECEC8D" // rgb: 236 236 141
+ taste_description = "bitter with a hint of alcohol"
+ reagent_state = SOLID
+
+/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3*REM)
+ M.adjustBruteLoss(-3*REM)
+ ..()
+ return TRUE
+
+/*WS Begin - Medicine Fixes
+
+/datum/reagent/medicine/c2/probital
+ name = "Probital"
+ description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further."
+ reagent_state = SOLID
+ color = "#FFFF6B"
+ overdose_threshold = 20
+
+/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-2.25*REM, FALSE)
+ var/ooo_youaregettingsleepy = 3.5
+ switch(round(M.getStaminaLoss()))
+ if(10 to 40)
+ ooo_youaregettingsleepy = 3
+ if(41 to 60)
+ ooo_youaregettingsleepy = 2.5
+ if(61 to 200) //you really can only go to 120
+ ooo_youaregettingsleepy = 2
+ M.adjustStaminaLoss(ooo_youaregettingsleepy*REM, FALSE)
+ ..()
+ . = TRUE
+
+/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M)
+ M.adjustStaminaLoss(3*REM, 0)
+ if(M.getStaminaLoss() >= 80)
+ M.drowsyness++
+ if(M.getStaminaLoss() >= 100)
+ to_chat(M,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit..."))
+ M.adjustStaminaLoss(-100, TRUE)
+ M.Sleeping(10 SECONDS)
+ ..()
+ . = TRUE
+
+/datum/reagent/medicine/c2/probital/on_transfer(atom/A, method=INGEST, trans_volume)
+ if(method != INGEST || !iscarbon(A))
+ return
+
+ A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05)
+ A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
+
+ ..()
+
+WS End */
+
+/******BURN******/
+/*Suffix: -uri*/
+/datum/reagent/medicine/c2/lenturi
+ name = "Lenturi"
+ description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system."
+ reagent_state = LIQUID
+ color = "#6171FF"
+ var/resetting_probability = 0
+ var/spammer = 0
+
+/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-3 * REM)
+ M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/c2/lenturi/on_mob_metabolize(mob/living/carbon/M)
+ M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
+ return ..()
+
+/datum/reagent/medicine/c2/lenturi/on_mob_end_metabolize(mob/living/carbon/M)
+ M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
+ return ..()
+
+/datum/reagent/medicine/c2/aiuri
+ name = "Aiuri"
+ description = "Used to treat burns. Does minor eye damage."
+ reagent_state = LIQUID
+ color = "#8C93FF"
+ var/resetting_probability = 0
+ var/message_cd = 0
+
+/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM)
+ M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM)
+ ..()
+ return TRUE
+
+/*WS Begin - Fixes Medicines
+
+/datum/reagent/medicine/c2/hercuri
+ name = "Hercuri"
+ description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia."
+ reagent_state = LIQUID
+ color = "#F7FFA5"
+ overdose_threshold = 25
+ reagent_weight = 0.6
+
+/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M)
+ if(M.getFireLoss() > 50)
+ M.adjustFireLoss(-2*REM, FALSE)
+ else
+ M.adjustFireLoss(-1.25*REM, FALSE)
+ M.adjust_bodytemperature(rand(-25,-5)*(TEMPERATURE_DAMAGE_COEFFICIENT*REM), 50)
+ M.reagents?.chem_temp +=(-10*REM)
+ M.adjust_fire_stacks(-1)
+ ..()
+ . = TRUE
+
+/datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
+ if(method != VAPOR)
+ return
+
+ M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
+ M.adjust_fire_stacks(-reac_volume / 2)
+ if(reac_volume >= metabolization_rate)
+ M.ExtinguishMob()
+
+ ..()
+
+/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M)
+ M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly
+ ..()
+
+WS End*/
+
+/******OXY******/
+/*Suffix: -mol*/
+#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox
+
+/datum/reagent/medicine/c2/convermol
+ name = "Convermol"
+ description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
+ reagent_state = LIQUID
+ color = "#FF6464"
+ overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
+
+/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M)
+ var/oxycalc = 2.5*REM*current_cycle
+ if(!overdosed)
+ oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
+ M.adjustOxyLoss(-oxycalc, 0)
+ M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0)
+ if(prob(current_cycle) && M.losebreath)
+ M.losebreath--
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M)
+ metabolization_rate += 1
+ ..()
+ return TRUE
+
+#undef CONVERMOL_RATIO
+
+/datum/reagent/medicine/c2/tirimol
+ name = "Tirimol"
+ description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes."
+ color = "#FF6464"
+ var/drowsycd = 0
+
+/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M)
+ M.adjustOxyLoss(-3)
+ M.adjustStaminaLoss(2)
+ if(drowsycd && (world.time > drowsycd))
+ M.drowsyness += 10
+ drowsycd = world.time + (45 SECONDS)
+ else if(!drowsycd)
+ drowsycd = world.time + (15 SECONDS)
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L)
+ if(current_cycle > 20)
+ L.Sleeping(10 SECONDS)
+ ..()
+
+/******TOXIN******/
+/*Suffix: -iver*/
+
+/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines
+ name = "Multiver"
+ description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
+
+/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M)
+ var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
+ for(var/r in M.reagents.reagent_list)
+ var/datum/reagent/the_reagent = r
+ if(istype(the_reagent, /datum/reagent/medicine))
+ medibonus += 1
+ M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u
+ for(var/r2 in M.reagents.reagent_list)
+ var/datum/reagent/the_reagent2 = r2
+ if(the_reagent2 == src)
+ continue
+ var/amount2purge = 3
+ if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines
+ continue
+ M.reagents.remove_reagent(the_reagent2.type, amount2purge)
+ ..()
+ return TRUE
+
+#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either
+
+/*WS Begin - Medicine Fixes
+
+/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge
+ name = "Syriniver"
+ description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver."
+ reagent_state = LIQUID
+ color = "#8CDF24" // heavy saturation to make the color blend better
+ metabolization_rate = 0.75 * REAGENTS_METABOLISM
+ overdose_threshold = 6
+ var/conversion_amount
+
+/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume)
+ if(method != INJECT || !iscarbon(A))
+ return
+ var/mob/living/carbon/C = A
+ if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
+ C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
+ var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
+ if((L.organ_flags & ORGAN_FAILING) || !L)
+ return
+ conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
+ C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount)
+ C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount)
+ ..()
+
+/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(issyrinormusc(R))
+ continue
+ M.reagents.remove_reagent(R.type,0.4)
+
+ ..()
+ . = 1
+
+/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/c2/musiver //MUScles
+ name = "Musiver"
+ description = "The active metabolite of syriniver. Causes muscle weakness on overdose"
+ reagent_state = LIQUID
+ color = "#DFD54E"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+ var/datum/brain_trauma/mild/muscle_weakness/U
+
+/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/R in M.reagents.reagent_list)
+ if(issyrinormusc(R))
+ continue
+ M.reagents.remove_reagent(R.type,0.2)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M)
+ U = new()
+ M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
+ ..()
+
+/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M)
+ if(U)
+ QDEL_NULL(U)
+ return ..()
+
+/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ ..()
+ . = 1
+
+#undef issyrinormusc
+
+WS End*/
+
+/******COMBOS******/
+/*Suffix: Combo of healing, prob gonna get wack REAL fast*/
+
+
+
+/* fucking whitesands left this in code while we had the OTHER synthflesh
+/datum/reagent/medicine/c2/instabitaluri
+ name = "Synthflesh (Instabitaluri)"
+ description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only."
+ reagent_state = LIQUID
+ color = "#FFEBEB"
+
+/datum/reagent/medicine/c2/instabitaluri/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
+ if(iscarbon(M))
+ var/mob/living/carbon/carbies = M
+ if (carbies.stat == DEAD)
+ show_message = 0
+ if(method in list(PATCH, TOUCH, SMOKE))
+ var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
+ var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
+ for(var/i in carbies.all_wounds)
+ var/datum/wound/iter_wound = i
+ iter_wound.on_synthflesh(reac_volume)
+ carbies.adjustToxLoss((harmies+burnies)*0.66)
+ if(show_message)
+ to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!"))
+ SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100))
+ carbies.cure_husk("burn")
+ carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something
+ ..()
+ return TRUE
+*/
+
diff --git a/modular_pentest/modules/chemistry/code/Working old chem list.dm b/modular_pentest/modules/chemistry/code/Working old chem list.dm
new file mode 100644
index 00000000000..57e7fb3686e
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/Working old chem list.dm
@@ -0,0 +1,622 @@
+#define PERF_BASE_DAMAGE 0.5
+
+//////////////////////////////////////////////////////////////////////////////////////////
+ // MEDICINE REAGENTS
+//////////////////////////////////////////////////////////////////////////////////////
+
+// where all the reagents related to medicine go.
+
+//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects.
+/datum/reagent/medicine/silver_sulfadiazine
+ name = "Silver Sulfadiazine"
+ description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ overdose_threshold = 45
+
+/datum/reagent/medicine/silver_sulfadiazine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustToxLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You don't feel so good..."))
+ else if(M.getFireLoss())
+ M.adjustFireLoss(-reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your burns healing! It stings like hell!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your burns throbbing."))
+ ..()
+
+/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M)
+ M.adjustFireLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/sal_acid
+ name = "Salicylic Acid"
+ description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
+ reagent_state = LIQUID
+ color = "#D2D2D2"
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+
+/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
+ if(M.getBruteLoss() > 25)
+ M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
+ else
+ M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
+ ..()
+ . = 1
+
+/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
+ if(M.getBruteLoss()) //It only makes existing bruises worse
+ M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
+ . = 1
+ ..()
+
+/datum/reagent/medicine/perfluorodecalin
+ name = "Perfluorodecalin"
+ description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
+ reagent_state = LIQUID
+ color = "#FF6464"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
+
+/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
+ var/oxycalc = 2.5*REM*current_cycle
+ if(!overdosed)
+ oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
+ M.adjustOxyLoss(-oxycalc, 0)
+ M.adjustToxLoss(oxycalc/2.5, 0)
+ if(prob(current_cycle) && M.losebreath)
+ M.losebreath--
+ ..()
+ return TRUE
+
+/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M)
+ metabolization_rate += 1
+ return ..()
+
+//Trek Chems, simple to mix but weak as healing. Second tier trekchems will heal faster.
+/datum/reagent/medicine/bicaridine
+ name = "Bicaridine"
+ description = "Restores bruising. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#bf0000"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-0.5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
+ M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/bicaridinep
+ name = "Bicaridine Plus"
+ description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine."
+ reagent_state = LIQUID
+ color = "#bf0000"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M)
+ M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dexalinp
+ name = "Dexalin Plus"
+ description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin."
+ reagent_state = LIQUID
+ color = "#0040FF"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M)
+ M.adjustOxyLoss(-2*REM, 0)
+ if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
+ M.blood_volume += 1
+ if(holder.has_reagent(/datum/reagent/toxin/lexorin))
+ holder.remove_reagent(/datum/reagent/toxin/lexorin, 3)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M)
+ M.adjustOxyLoss(6*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/kelotane
+ name = "Kelotane"
+ description = "Heals burn damage. Overdose causes it instead."
+ reagent_state = LIQUID
+ color = "#FFa800"
+ overdose_threshold = 30
+
+/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-0.5*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
+ M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dermaline
+ name = "Dermaline"
+ description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity."
+ reagent_state = LIQUID
+ color = "#FF8000"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/dermaline/overdose_process(mob/living/M)
+ M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/antitoxin
+ name = "Dylovene"
+ description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
+ reagent_state = LIQUID
+ color = "#00a000"
+ overdose_threshold = 30
+ taste_description = "a roll of gauze"
+
+/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-0.5*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+ . = ..()
+ if(chems.has_reagent(type, 1))
+ mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
+
+/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
+ M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
+ ..()
+ . = 1
+
+
+/datum/reagent/medicine/tricordrazine
+ name = "Tricordrazine"
+ description = "A weak dilutant that slowly heals brute, burn, and toxin damage."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ taste_description = "water that has been standing still in a glass on a counter overnight"
+
+/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustBruteLoss(-0.25*REM, 0)
+ M.adjustFireLoss(-0.25*REM, 0)
+ M.adjustToxLoss(-0.25*REM, 0)
+ . = 1
+ ..()
+/datum/reagent/medicine/tetracordrazine //WS edit: Yes
+ name = "Tetracordrazine"
+ description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types."
+ reagent_state = LIQUID
+ color = "#C8A5DC"
+ taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it"
+
+/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M)
+ if(prob(80))
+ M.adjustBruteLoss(-0.25*REM, 0)
+ M.adjustFireLoss(-0.25*REM, 0)
+ M.adjustToxLoss(-0.25*REM, 0)
+ M.adjustOxyLoss(-0.5*REM, 0)
+ . = 1
+ ..()
+
+/datum/reagent/medicine/regen_jelly
+ name = "Regenerative Jelly"
+ description = "Gradually regenerates all types of damage, without harming slime anatomy."
+ reagent_state = LIQUID
+ color = "#CC23FF"
+ taste_description = "jelly"
+
+/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
+ if(M && ishuman(M) && reac_volume >= 0.5)
+ var/mob/living/carbon/human/H = M
+ H.hair_color = "C2F"
+ H.facial_hair_color = "C2F"
+ H.update_hair()
+
+/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1.5*REM, 0)
+ M.adjustFireLoss(-1.5*REM, 0)
+ M.adjustOxyLoss(-1.5*REM, 0)
+ M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
+ ..()
+ . = 1
+
+/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
+ name = "Restorative Nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage."
+ reagent_state = SOLID
+ color = "#555555"
+ overdose_threshold = 30
+ process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
+
+/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
+ M.adjustFireLoss(-5*REM, 0)
+ M.adjustOxyLoss(-15, 0)
+ M.adjustToxLoss(-5*REM, 0)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
+ M.adjustCloneLoss(-3*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
+ if(prob(25))
+ M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
+ M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
+ ..()
+ . = 1
+
+/datum/reagent/medicine/cordiolis_hepatico
+ name = "Cordiolis Hepatico"
+ description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
+ color = "#000000"
+ self_consuming = TRUE
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_STABLELIVER, type)
+ ADD_TRAIT(M, TRAIT_STABLEHEART, type)
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
+ ..()
+ REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
+ REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
+
+/datum/reagent/medicine/muscle_stimulant
+ name = "Muscle Stimulant"
+ description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
+ . = ..()
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+/datum/reagent/medicine/carthatoline
+ name = "Carthatoline"
+ description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage."
+ reagent_state = LIQUID
+ color = "#225722"
+ overdose_threshold = 25
+
+/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M)
+ M.adjustToxLoss(-2*REM, 0)
+ if(M.getToxLoss() && prob(10))
+ M.vomit(1)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,2)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M)
+ M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math.
+ ..()
+ . = 1
+
+/datum/reagent/medicine/converbital
+ name = "Converbital"
+ description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns"
+ reagent_state = LIQUID
+ taste_description = "burning"
+ color = "#7a1f13"
+ metabolization_rate = REM * 1
+ overdose_threshold = 25
+
+/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustFireLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You feel a slight burning sensation..."))
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-reac_volume)
+ M.adjustFireLoss(reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
+ ..()
+
+/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(0.25*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/converbital/overdose_process(mob/living/M)
+ M.adjustFireLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/convuri
+ name = "Convuri"
+ description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing"
+ reagent_state = SOLID
+ taste_description = "white-hot pain"
+ color = "#b85505"
+ metabolization_rate = REM * 1
+ overdose_threshold = 25
+
+/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ if(iscarbon(M) && M.stat != DEAD)
+ if(method in list(INGEST, VAPOR, INJECT))
+ M.adjustBruteLoss(0.5*reac_volume)
+ if(show_message)
+ to_chat(M, span_warning("You feel a slight tearing sensation..."))
+ else if(M.getBruteLoss())
+ M.adjustFireLoss(-reac_volume)
+ M.adjustBruteLoss(reac_volume)
+ M.force_scream()
+ if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
+ to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!"))
+ SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
+ else
+ to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
+ ..()
+
+/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(0.25*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/convuri/overdose_process(mob/living/M)
+ M.adjustBruteLoss(2.5*REM, 0)
+ M.adjustToxLoss(0.5, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/trophazole
+ name = "Trophazole"
+ description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides"
+ reagent_state = LIQUID
+ color = "#FFFF6B"
+ overdose_threshold = 20
+
+/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment
+ ..()
+ . = 1
+
+/datum/reagent/medicine/trophazole/overdose_process(mob/living/M)
+ M.adjustBruteLoss(3*REM, 0)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume)
+ if(method != INGEST || !iscarbon(A))
+ return
+
+ A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05)
+ A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
+
+ ..()
+
+
+/datum/reagent/medicine/rhigoxane
+ name = "Rhigoxane"
+ description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires."
+ reagent_state = LIQUID
+ color = "#F7FFA5"
+ overdose_threshold = 25
+ reagent_weight = 0.6
+
+/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM, 0.)
+ M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
+ if(method != VAPOR)
+ return
+
+ M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
+ M.adjust_fire_stacks(-reac_volume / 2)
+ if(reac_volume >= metabolization_rate)
+ M.ExtinguishMob()
+
+ ..()
+
+/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M)
+ M.adjustFireLoss(3*REM, 0.)
+ M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
+ ..()
+
+/datum/reagent/medicine/thializid
+ name = "Thializid"
+ description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid."
+ reagent_state = LIQUID
+ color = "#8CDF24" // heavy saturation to make the color blend better
+ metabolization_rate = 0.75 * REAGENTS_METABOLISM
+ overdose_threshold = 6
+ var/conversion_amount
+
+/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume)
+ if(method != INJECT || !iscarbon(A))
+ return
+ var/mob/living/carbon/C = A
+ if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
+ C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
+ var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
+ if((L.organ_flags & ORGAN_FAILING) || !L)
+ return
+ conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
+ C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount)
+ C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount)
+ ..()
+
+/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+
+ ..()
+ . = 1
+
+/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/oxalizid
+ name = "Oxalizid"
+ description = "The active metabolite of thializid. Causes muscle weakness on overdose"
+ reagent_state = LIQUID
+ color = "#DFD54E"
+ metabolization_rate = 0.25 * REAGENTS_METABOLISM
+ overdose_threshold = 25
+ var/datum/brain_trauma/mild/muscle_weakness/U
+
+/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
+ M.adjustToxLoss(-1*REM, 0)
+ for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
+ M.reagents.remove_reagent(R.type,1)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M)
+ U = new()
+ M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
+ ..()
+
+/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M)
+ if(U)
+ QDEL_NULL(U)
+ return ..()
+
+/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M)
+ M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
+ M.adjust_disgust(3)
+ ..()
+ . = 1
+
+/datum/reagent/medicine/skeletons_boon
+ name = "Skeleton’s Boon"
+ description = "A robust solution of minerals that greatly strengthens the bones."
+ color = "#dbdfa2"
+ metabolization_rate = REAGENTS_METABOLISM * 0.125
+ overdose_threshold = 50
+ var/plasma_armor = 33
+ var/skele_armor = 20
+ var/added_armor = 0
+
+/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ if(isplasmaman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += plasma_armor
+ H.physiology.armor.bullet += plasma_armor
+ added_armor = plasma_armor
+ if(isskeleton(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += skele_armor
+ H.physiology.armor.bullet += skele_armor
+ added_armor = skele_armor
+ ..()
+
+/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee -= added_armor
+ H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
+ ..()
+
+/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
+ ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ ..()
+
+/datum/reagent/medicine/melatonin
+ name = "Human Sleep Hormone"
+ description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to."
+ color = "#e1b1e1" //very light pink ourple
+ overdose_threshold = 0
+ var/regenerating
+ var/rachnid_limb
+
+/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
+ . = ..()
+ if(iscarbon(L))
+ var/mob/living/carbon/imbiber = L
+ if(isspiderperson(imbiber))
+ //we check limbs, if one is missing, we break from the for loop after setting it to heal
+ for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ if(!imbiber.get_bodypart(limb))
+ rachnid_limb = limb
+ break
+
+/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(isspiderperson(L) && regenerating)
+ var/mob/living/carbon/spider
+ spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
+ return
+
+/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(isvox(M))
+ M.adjustToxLoss(1)
+ if(islizard(M))
+ if(prob(10))
+ M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
+ if(isspiderperson(M) && rachnid_limb)
+ if(prob(7))
+ to_chat(M, "Your body aches near [rachnid_limb]")
+ if(current_cycle > 20 && !regenerating)
+ regenerating = TRUE
+
+ else
+ if(M.IsSleeping())
+ if(M.getBruteLoss() && M.getFireLoss())
+ if(prob(50))
+ M.adjustBruteLoss(-0.5)
+ else
+ M.adjustFireLoss(-0.5)
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-0.2)
+ else if(M.getFireLoss())
+ M.adjustFireLoss(-0.2)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index 59012160cf3..d93efe2ab1b 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -1,5 +1,6 @@
/*
- Omnizine is a chemical that heals all damage types, but can cause damage if overdosed. Protozine is a weaker variant of omnizine.
+ Omnizine was reflevored into Panacea. A chemical that heals all damage types, but can cause damage if overdosed.
+ Protozine was reflavored into Effluvial Panacea.
*/
/datum/reagent/medicine/panacea
@@ -76,10 +77,9 @@
results = list(/datum/reagent/medicine/pyroxadone = 2)
required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
-
-
-
-
+/*
+ Oxandrolone is a chemical that rapidly heals burn damage, but only if the burn damage is above a certain threshold. It is made from cryoxadone and plasma.
+*/
/datum/reagent/medicine/oxandrolone
name = "Oxandrolone"
@@ -103,45 +103,9 @@
. = 1
..()
+/*
-
-
-/datum/reagent/medicine/styptic_powder
- name = "Styptic Powder"
- description = "If used in touch-based applications, immediately restores bruising as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#FF9696"
- overdose_threshold = 45
-
-/datum/reagent/medicine/styptic_powder/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustToxLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You don't feel so good..."))
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your bruises healing! It stings like hell!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your bruises throbbing."))
- ..()
-
-
-/datum/reagent/medicine/styptic_powder/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/styptic_powder/overdose_process(mob/living/M)
- M.adjustBruteLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-
+*/
/datum/reagent/medicine/sal_acid
name = "Salicylic Acid"
@@ -165,7 +129,9 @@
. = 1
..()
+/*
+*/
/datum/reagent/medicine/perfluorodecalin
name = "Perfluorodecalin"
@@ -190,7 +156,9 @@
metabolization_rate += 1
return ..()
+/*
+*/
/datum/reagent/medicine/bicaridine
name = "Bicaridine"
@@ -209,7 +177,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/bicaridinep
name = "Bicaridine Plus"
@@ -228,7 +198,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/dexalinp
name = "Dexalin Plus"
@@ -251,7 +223,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/kelotane
name = "Kelotane"
@@ -270,6 +244,9 @@
..()
. = 1
+/*
+
+*/
/datum/reagent/medicine/dermaline
name = "Dermaline"
@@ -288,7 +265,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/antitoxin
name = "Dylovene"
@@ -315,7 +294,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/tricordrazine
name = "Tricordrazine"
@@ -332,7 +313,9 @@
. = 1
..()
+/*
+*/
/datum/reagent/medicine/tetracordrazine //WS edit: Yes
name = "Tetracordrazine"
@@ -350,7 +333,9 @@
. = 1
..()
+/*
+*/
/datum/reagent/medicine/regen_jelly
name = "Regenerative Jelly"
@@ -374,7 +359,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
name = "Restorative Nanites"
@@ -401,7 +388,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/cordiolis_hepatico
name = "Cordiolis Hepatico"
@@ -419,8 +408,9 @@
REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
+/*
-
+*/
/datum/reagent/medicine/muscle_stimulant
name = "Muscle Stimulant"
@@ -434,9 +424,9 @@
. = ..()
L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+/*
-
-
+*/
/datum/reagent/medicine/carthatoline
name = "Carthatoline"
@@ -459,8 +449,9 @@
..()
. = 1
+/*
-
+*/
/datum/reagent/medicine/converbital
name = "Converbital"
@@ -499,8 +490,9 @@
..()
. = 1
+/*
-
+*/
/datum/reagent/medicine/convuri
name = "Convuri"
@@ -539,7 +531,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/trophazole
name = "Trophazole"
@@ -567,7 +561,9 @@
..()
+/*
+*/
/datum/reagent/medicine/rhigoxane
name = "Rhigoxane"
@@ -599,8 +595,9 @@
M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
..()
+/*
-
+*/
/datum/reagent/medicine/thializid
name = "Thializid"
@@ -641,7 +638,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/oxalizid
name = "Oxalizid"
@@ -676,7 +675,9 @@
..()
. = 1
+/*
+*/
/datum/reagent/medicine/skeletons_boon
name = "Skeleton’s Boon"
@@ -716,7 +717,9 @@
REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
..()
+/*
+*/
/datum/reagent/medicine/melatonin
name = "Human Sleep Hormone"
@@ -744,7 +747,6 @@
spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
return
-
/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
. = ..()
if(isvox(M))
@@ -770,27 +772,3 @@
M.adjustBruteLoss(-0.2)
else if(M.getFireLoss())
M.adjustFireLoss(-0.2)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
new file mode 100644
index 00000000000..5a356df5cc8
--- /dev/null
+++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
@@ -0,0 +1,66 @@
+/*
+
+*/
+
+/datum/chemical_reaction/clonexadone
+ results = list(/datum/reagent/medicine/clonexadone = 2)
+ required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/sodium = 1)
+ required_catalysts = list(/datum/reagent/toxin/plasma = 5)
+
+/*
+
+*/
+
+/datum/chemical_reaction/pyroxadone
+ results = list(/datum/reagent/medicine/pyroxadone = 2)
+ required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
+
+/*
+
+*/
+
+/datum/chemical_reaction/oxandrolone
+ results = list(/datum/reagent/medicine/oxandrolone = 6)
+ required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1)
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
+
+/*
+
+*/
+
+x
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index e92c242cd43..f8d9d263419 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -230,6 +230,7 @@
#include "modules\achievements\code\achievements.dm"
#include "modules\bedsheets\code\bedsheets.dm"
#include "modules\chemistry\code\medical_reagents\medicine_reagents.dm"
+#include "modules\chemistry\code\recipes\medical_reactions.dm"
#include "modules\cult\code\_cult_gamemode.dm"
#include "modules\cult\code\construct_spells.dm"
#include "modules\cult\code\constructs.dm"
From 86b0c0a9ec08114e1eb3ef3a3864a8f161eed2e9 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 12 Mar 2026 23:39:56 -0700
Subject: [PATCH 22/52] Saved: Melatonin Skeletons Boom, Rem: Thializid+OD
---
.../medical_reagents/medicine_reagents.dm | 92 ++-----------------
1 file changed, 8 insertions(+), 84 deletions(-)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index d93efe2ab1b..d2c4cc70d8d 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -596,87 +596,9 @@
..()
/*
-
-*/
-
-/datum/reagent/medicine/thializid
- name = "Thializid"
- description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid."
- reagent_state = LIQUID
- color = "#8CDF24" // heavy saturation to make the color blend better
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- overdose_threshold = 6
- var/conversion_amount
-
-/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume)
- if(method != INJECT || !iscarbon(A))
- return
- var/mob/living/carbon/C = A
- if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
- C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
- if((L.organ_flags & ORGAN_FAILING) || !L)
- return
- conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
- C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount)
- C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount)
- ..()
-
-/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
-
- ..()
- . = 1
-
-/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM)
- ..()
- . = 1
-
-/*
-
-*/
-
-/datum/reagent/medicine/oxalizid
- name = "Oxalizid"
- description = "The active metabolite of thializid. Causes muscle weakness on overdose"
- reagent_state = LIQUID
- color = "#DFD54E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 25
- var/datum/brain_trauma/mild/muscle_weakness/U
-
-/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M)
- U = new()
- M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
- ..()
-
-/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M)
- if(U)
- QDEL_NULL(U)
- return ..()
-
-/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- ..()
- . = 1
-
-/*
-
+ Skeleton's Boon is a reagent that provides temporary armor to the user.
+ It provides more protection to plasmamen than it does to skeletons, but it provides some protection to both.
+ Overdose causes brittle bones.
*/
/datum/reagent/medicine/skeletons_boon
@@ -718,12 +640,14 @@
..()
/*
-
+ Melatonin is a chemical that has varying effects on different species.
+ It has no effect on non-carbon life, but in carbon life it promotes healing and regeneration in exchange for a temporary period of discomfort.
+ In spiderpeople, it promotes the regeneration of lost limbs, but causes aching in the remaining ones until the regeneration is complete.
*/
/datum/reagent/medicine/melatonin
- name = "Human Sleep Hormone"
- description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to."
+ name = "Melatonin"
+ description = "A compound typically found within organics. The exact effects vary on the species it is administered to."
color = "#e1b1e1" //very light pink ourple
overdose_threshold = 0
var/regenerating
From 500a6acdf9ed4d57f37fc3322b39ecaab773c947 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Sat, 14 Mar 2026 03:42:21 -0700
Subject: [PATCH 23/52] Final listing selected
---
.../code/Working old chem list C2.dm | 410 ---------
.../chemistry/code/Working old chem list.dm | 622 -------------
.../medical_reagents/medicine_reagents.dm | 855 +++++++-----------
.../code/recipes/medical_reactions.dm | 84 +-
4 files changed, 396 insertions(+), 1575 deletions(-)
delete mode 100644 modular_pentest/modules/chemistry/code/Working old chem list C2.dm
delete mode 100644 modular_pentest/modules/chemistry/code/Working old chem list.dm
diff --git a/modular_pentest/modules/chemistry/code/Working old chem list C2.dm b/modular_pentest/modules/chemistry/code/Working old chem list C2.dm
deleted file mode 100644
index 0be955f2df3..00000000000
--- a/modular_pentest/modules/chemistry/code/Working old chem list C2.dm
+++ /dev/null
@@ -1,410 +0,0 @@
-// Category 2 medicines are medicines that have an ill effect regardless of volume/OD to dissuade doping. Mostly used as emergency chemicals OR to convert damage (and heal a bit in the process). The type is used to prompt borgs that the medicine is harmful.
-/datum/reagent/medicine/c2
- name = "Category two reagent"
- harmful = TRUE
- metabolization_rate = 0.2
-
-/******BRUTE******/
-/*Suffix: -bital*/
-
-/datum/reagent/medicine/c2/helbital //kinda a C2 only if you're not in hardcrit.
- name = "Helbital"
- description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation."
- color = "#9400D3"
- taste_description = "cold and lifeless"
- overdose_threshold = 35
- reagent_state = SOLID
- var/helbent = FALSE
- var/reaping = FALSE
-
-/datum/reagent/medicine/c2/helbital/on_mob_life(mob/living/carbon/M)
- . = TRUE
- var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss())
- var/thou_shall_heal = 0
- var/good_kind_of_healing = FALSE
- switch(M.stat)
- if(CONSCIOUS) //bad
- thou_shall_heal = death_is_coming/50
- M.adjustOxyLoss(2, TRUE)
- if(SOFT_CRIT) //meh convert
- thou_shall_heal = round(death_is_coming/47,0.1)
- M.adjustOxyLoss(1, TRUE)
- else //no convert
- thou_shall_heal = round(death_is_coming/45,0.1)
- good_kind_of_healing = TRUE
- M.adjustBruteLoss(-thou_shall_heal, FALSE)
-
- if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper!
- reaping = TRUE
- var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to
- if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING))
- helbent = TRUE
- to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?"))
- var/timeisticking = world.time
- var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors
- if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time))
- reaping = FALSE
- return //good job, you ruined it
- if(!RPSchoice)
- to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon."))
- reaping = FALSE
- return
- var/grim = pick(RockPaperScissors)
- if(grim == RPSchoice) //You Tied!
- to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now."))
- reaping = FALSE
- else if(RockPaperScissors[RPSchoice] == grim) //You lost!
- to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body."))
- M.dust()
- return
- else //VICTORY ROYALE
- to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds."))
- M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M)
- M.revive(full_heal = TRUE, admin_revive = FALSE)
- M.reagents.del_reagent(type)
- return
-
- ..()
- return
-
-/datum/reagent/medicine/c2/helbital/overdose_process(mob/living/carbon/M)
- if(!helbent)
- M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING)
- helbent = TRUE
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/helbital/on_mob_delete(mob/living/L)
- if(helbent)
- L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
- ..()
-
-/datum/reagent/medicine/c2/libital //messes with your liber
- name = "Libital"
- description = "A bruise reliever. Does minor liver damage."
- color = "#ECEC8D" // rgb: 236 236 141
- taste_description = "bitter with a hint of alcohol"
- reagent_state = SOLID
-
-/datum/reagent/medicine/c2/libital/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.3*REM)
- M.adjustBruteLoss(-3*REM)
- ..()
- return TRUE
-
-/*WS Begin - Medicine Fixes
-
-/datum/reagent/medicine/c2/probital
- name = "Probital"
- description = "Originally developed as a prototype-gym supliment for those looking for quick workout turnover, this oral medication quickly repairs broken muscle tissue but causes lactic acid buildup, tiring the patient. Overdosing can cause extreme drowsiness. An Influx of nutrients promotes the muscle repair even further."
- reagent_state = SOLID
- color = "#FFFF6B"
- overdose_threshold = 20
-
-/datum/reagent/medicine/c2/probital/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2.25*REM, FALSE)
- var/ooo_youaregettingsleepy = 3.5
- switch(round(M.getStaminaLoss()))
- if(10 to 40)
- ooo_youaregettingsleepy = 3
- if(41 to 60)
- ooo_youaregettingsleepy = 2.5
- if(61 to 200) //you really can only go to 120
- ooo_youaregettingsleepy = 2
- M.adjustStaminaLoss(ooo_youaregettingsleepy*REM, FALSE)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/probital/overdose_process(mob/living/M)
- M.adjustStaminaLoss(3*REM, 0)
- if(M.getStaminaLoss() >= 80)
- M.drowsyness++
- if(M.getStaminaLoss() >= 100)
- to_chat(M,span_warning("You feel more tired than you usually do, perhaps if you rest your eyes for a bit..."))
- M.adjustStaminaLoss(-100, TRUE)
- M.Sleeping(10 SECONDS)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/probital/on_transfer(atom/A, method=INGEST, trans_volume)
- if(method != INGEST || !iscarbon(A))
- return
-
- A.reagents.remove_reagent(/datum/reagent/medicine/c2/probital, trans_volume * 0.05)
- A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
-
- ..()
-
-WS End */
-
-/******BURN******/
-/*Suffix: -uri*/
-/datum/reagent/medicine/c2/lenturi
- name = "Lenturi"
- description = "Used to treat burns. Makes you move slower while it is in your system. Applies stomach damage when it leaves your system."
- reagent_state = LIQUID
- color = "#6171FF"
- var/resetting_probability = 0
- var/spammer = 0
-
-/datum/reagent/medicine/c2/lenturi/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-3 * REM)
- M.adjustOrganLoss(ORGAN_SLOT_STOMACH, 0.4 * REM)
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/lenturi/on_mob_metabolize(mob/living/carbon/M)
- M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
- return ..()
-
-/datum/reagent/medicine/c2/lenturi/on_mob_end_metabolize(mob/living/carbon/M)
- M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/lenturi)
- return ..()
-
-/datum/reagent/medicine/c2/aiuri
- name = "Aiuri"
- description = "Used to treat burns. Does minor eye damage."
- reagent_state = LIQUID
- color = "#8C93FF"
- var/resetting_probability = 0
- var/message_cd = 0
-
-/datum/reagent/medicine/c2/aiuri/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM)
- M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM)
- ..()
- return TRUE
-
-/*WS Begin - Fixes Medicines
-
-/datum/reagent/medicine/c2/hercuri
- name = "Hercuri"
- description = "Not to be confused with element Mercury, this medicine excels in reverting effects of dangerous high-temperature environments. Prolonged exposure can cause hypothermia."
- reagent_state = LIQUID
- color = "#F7FFA5"
- overdose_threshold = 25
- reagent_weight = 0.6
-
-/datum/reagent/medicine/c2/hercuri/on_mob_life(mob/living/carbon/M)
- if(M.getFireLoss() > 50)
- M.adjustFireLoss(-2*REM, FALSE)
- else
- M.adjustFireLoss(-1.25*REM, FALSE)
- M.adjust_bodytemperature(rand(-25,-5)*(TEMPERATURE_DAMAGE_COEFFICIENT*REM), 50)
- M.reagents?.chem_temp +=(-10*REM)
- M.adjust_fire_stacks(-1)
- ..()
- . = TRUE
-
-/datum/reagent/medicine/c2/hercuri/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
- if(method != VAPOR)
- return
-
- M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
- M.adjust_fire_stacks(-reac_volume / 2)
- if(reac_volume >= metabolization_rate)
- M.ExtinguishMob()
-
- ..()
-
-/datum/reagent/medicine/c2/hercuri/overdose_process(mob/living/carbon/M)
- M.adjust_bodytemperature(-10*TEMPERATURE_DAMAGE_COEFFICIENT*REM,50) //chilly chilly
- ..()
-
-WS End*/
-
-/******OXY******/
-/*Suffix: -mol*/
-#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox
-
-/datum/reagent/medicine/c2/convermol
- name = "Convermol"
- description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
- reagent_state = LIQUID
- color = "#FF6464"
- overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
-
-/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M)
- var/oxycalc = 2.5*REM*current_cycle
- if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
- M.adjustOxyLoss(-oxycalc, 0)
- M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0)
- if(prob(current_cycle) && M.losebreath)
- M.losebreath--
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M)
- metabolization_rate += 1
- ..()
- return TRUE
-
-#undef CONVERMOL_RATIO
-
-/datum/reagent/medicine/c2/tirimol
- name = "Tirimol"
- description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes."
- color = "#FF6464"
- var/drowsycd = 0
-
-/datum/reagent/medicine/c2/tirimol/on_mob_life(mob/living/carbon/human/M)
- M.adjustOxyLoss(-3)
- M.adjustStaminaLoss(2)
- if(drowsycd && (world.time > drowsycd))
- M.drowsyness += 10
- drowsycd = world.time + (45 SECONDS)
- else if(!drowsycd)
- drowsycd = world.time + (15 SECONDS)
- ..()
- return TRUE
-
-/datum/reagent/medicine/c2/tirimol/on_mob_end_metabolize(mob/living/L)
- if(current_cycle > 20)
- L.Sleeping(10 SECONDS)
- ..()
-
-/******TOXIN******/
-/*Suffix: -iver*/
-
-/datum/reagent/medicine/c2/multiver //enhanced with MULTIple medicines
- name = "Multiver"
- description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
-
-/datum/reagent/medicine/c2/multiver/on_mob_life(mob/living/carbon/human/M)
- var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
- for(var/r in M.reagents.reagent_list)
- var/datum/reagent/the_reagent = r
- if(istype(the_reagent, /datum/reagent/medicine))
- medibonus += 1
- M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work
- M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u
- for(var/r2 in M.reagents.reagent_list)
- var/datum/reagent/the_reagent2 = r2
- if(the_reagent2 == src)
- continue
- var/amount2purge = 3
- if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines
- continue
- M.reagents.remove_reagent(the_reagent2.type, amount2purge)
- ..()
- return TRUE
-
-#define issyrinormusc(A) (istype(A,/datum/reagent/medicine/c2/syriniver) || istype(A,/datum/reagent/medicine/c2/musiver)) //musc is metab of syrin so let's make sure we're not purging either
-
-/*WS Begin - Medicine Fixes
-
-/datum/reagent/medicine/c2/syriniver //Inject >> SYRINge
- name = "Syriniver"
- description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of musiver."
- reagent_state = LIQUID
- color = "#8CDF24" // heavy saturation to make the color blend better
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- overdose_threshold = 6
- var/conversion_amount
-
-/datum/reagent/medicine/c2/syriniver/on_transfer(atom/A, method=INJECT, trans_volume)
- if(method != INJECT || !iscarbon(A))
- return
- var/mob/living/carbon/C = A
- if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
- C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
- if((L.organ_flags & ORGAN_FAILING) || !L)
- return
- conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
- C.reagents.remove_reagent(/datum/reagent/medicine/c2/syriniver, conversion_amount)
- C.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, conversion_amount)
- ..()
-
-/datum/reagent/medicine/c2/syriniver/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(issyrinormusc(R))
- continue
- M.reagents.remove_reagent(R.type,0.4)
-
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/syriniver/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- M.reagents.add_reagent(/datum/reagent/medicine/c2/musiver, 0.225 * REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/musiver //MUScles
- name = "Musiver"
- description = "The active metabolite of syriniver. Causes muscle weakness on overdose"
- reagent_state = LIQUID
- color = "#DFD54E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 25
- var/datum/brain_trauma/mild/muscle_weakness/U
-
-/datum/reagent/medicine/c2/musiver/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/R in M.reagents.reagent_list)
- if(issyrinormusc(R))
- continue
- M.reagents.remove_reagent(R.type,0.2)
- ..()
- . = 1
-
-/datum/reagent/medicine/c2/musiver/overdose_start(mob/living/carbon/M)
- U = new()
- M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
- ..()
-
-/datum/reagent/medicine/c2/musiver/on_mob_delete(mob/living/carbon/M)
- if(U)
- QDEL_NULL(U)
- return ..()
-
-/datum/reagent/medicine/c2/musiver/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- ..()
- . = 1
-
-#undef issyrinormusc
-
-WS End*/
-
-/******COMBOS******/
-/*Suffix: Combo of healing, prob gonna get wack REAL fast*/
-
-
-
-/* fucking whitesands left this in code while we had the OTHER synthflesh
-/datum/reagent/medicine/c2/instabitaluri
- name = "Synthflesh (Instabitaluri)"
- description = "Heals brute and burn damage at the cost of toxicity (66% of damage healed). Touch application only."
- reagent_state = LIQUID
- color = "#FFEBEB"
-
-/datum/reagent/medicine/c2/instabitaluri/expose_mob(mob/living/M, method=TOUCH, reac_volume,show_message = 1)
- if(iscarbon(M))
- var/mob/living/carbon/carbies = M
- if (carbies.stat == DEAD)
- show_message = 0
- if(method in list(PATCH, TOUCH, SMOKE))
- var/harmies = min(carbies.getBruteLoss(),carbies.adjustBruteLoss(-1.25 * reac_volume)*-1)
- var/burnies = min(carbies.getFireLoss(),carbies.adjustFireLoss(-1.25 * reac_volume)*-1)
- for(var/i in carbies.all_wounds)
- var/datum/wound/iter_wound = i
- iter_wound.on_synthflesh(reac_volume)
- carbies.adjustToxLoss((harmies+burnies)*0.66)
- if(show_message)
- to_chat(carbies, span_danger("You feel your burns and bruises healing! It stings like hell!"))
- SEND_SIGNAL(carbies, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- if(HAS_TRAIT_FROM(M, TRAIT_HUSK, "burn") && carbies.getFireLoss() < THRESHOLD_UNHUSK && (carbies.reagents.get_reagent_amount(/datum/reagent/medicine/c2/instabitaluri) + reac_volume >= 100))
- carbies.cure_husk("burn")
- carbies.visible_message("A rubbery liquid coats [carbies]'s burns. [carbies] looks a lot healthier!") //we're avoiding using the phrases "burnt flesh" and "burnt skin" here because carbies could be a skeleton or something
- ..()
- return TRUE
-*/
-
diff --git a/modular_pentest/modules/chemistry/code/Working old chem list.dm b/modular_pentest/modules/chemistry/code/Working old chem list.dm
deleted file mode 100644
index 57e7fb3686e..00000000000
--- a/modular_pentest/modules/chemistry/code/Working old chem list.dm
+++ /dev/null
@@ -1,622 +0,0 @@
-#define PERF_BASE_DAMAGE 0.5
-
-//////////////////////////////////////////////////////////////////////////////////////////
- // MEDICINE REAGENTS
-//////////////////////////////////////////////////////////////////////////////////////
-
-// where all the reagents related to medicine go.
-
-//Goon Chems. Ported mainly from Goonstation. Easily mixable (or not so easily) and provide a variety of effects.
-/datum/reagent/medicine/silver_sulfadiazine
- name = "Silver Sulfadiazine"
- description = "If used in touch-based applications, immediately restores burn wounds as well as restoring more over time. If ingested through other means or overdosed, deals minor toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- overdose_threshold = 45
-
-/datum/reagent/medicine/silver_sulfadiazine/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustToxLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You don't feel so good..."))
- else if(M.getFireLoss())
- M.adjustFireLoss(-reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your burns healing! It stings like hell!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your burns throbbing."))
- ..()
-
-/datum/reagent/medicine/silver_sulfadiazine/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/silver_sulfadiazine/overdose_process(mob/living/M)
- M.adjustFireLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/sal_acid
- name = "Salicylic Acid"
- description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
- reagent_state = LIQUID
- color = "#D2D2D2"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
-
-/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
- if(M.getBruteLoss() > 25)
- M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
- else
- M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
- ..()
- . = 1
-
-/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
- if(M.getBruteLoss()) //It only makes existing bruises worse
- M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
- . = 1
- ..()
-
-/datum/reagent/medicine/perfluorodecalin
- name = "Perfluorodecalin"
- description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
- reagent_state = LIQUID
- color = "#FF6464"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
-
-/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
- var/oxycalc = 2.5*REM*current_cycle
- if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+PERF_BASE_DAMAGE) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
- M.adjustOxyLoss(-oxycalc, 0)
- M.adjustToxLoss(oxycalc/2.5, 0)
- if(prob(current_cycle) && M.losebreath)
- M.losebreath--
- ..()
- return TRUE
-
-/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M)
- metabolization_rate += 1
- return ..()
-
-//Trek Chems, simple to mix but weak as healing. Second tier trekchems will heal faster.
-/datum/reagent/medicine/bicaridine
- name = "Bicaridine"
- description = "Restores bruising. Overdose causes it instead."
- reagent_state = LIQUID
- color = "#bf0000"
- overdose_threshold = 30
-
-/datum/reagent/medicine/bicaridine/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-0.5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridine/overdose_process(mob/living/M)
- M.adjustBruteLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridinep
- name = "Bicaridine Plus"
- description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine."
- reagent_state = LIQUID
- color = "#bf0000"
- overdose_threshold = 25
-
-/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M)
- M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalinp
- name = "Dexalin Plus"
- description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin."
- reagent_state = LIQUID
- color = "#0040FF"
- overdose_threshold = 25
-
-/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-2*REM, 0)
- if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
- M.blood_volume += 1
- if(holder.has_reagent(/datum/reagent/toxin/lexorin))
- holder.remove_reagent(/datum/reagent/toxin/lexorin, 3)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M)
- M.adjustOxyLoss(6*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/kelotane
- name = "Kelotane"
- description = "Heals burn damage. Overdose causes it instead."
- reagent_state = LIQUID
- color = "#FFa800"
- overdose_threshold = 30
-
-/datum/reagent/medicine/kelotane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-0.5*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/kelotane/overdose_process(mob/living/M)
- M.adjustFireLoss(2*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/dermaline
- name = "Dermaline"
- description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity."
- reagent_state = LIQUID
- color = "#FF8000"
- overdose_threshold = 25
-
-/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/dermaline/overdose_process(mob/living/M)
- M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
-
-/datum/reagent/medicine/antitoxin
- name = "Dylovene"
- description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
- reagent_state = LIQUID
- color = "#00a000"
- overdose_threshold = 30
- taste_description = "a roll of gauze"
-
-/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-0.5*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
- ..()
- . = 1
-
-/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
- . = ..()
- if(chems.has_reagent(type, 1))
- mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
-
-/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
- M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
- ..()
- . = 1
-
-
-/datum/reagent/medicine/tricordrazine
- name = "Tricordrazine"
- description = "A weak dilutant that slowly heals brute, burn, and toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "water that has been standing still in a glass on a counter overnight"
-
-/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- . = 1
- ..()
-/datum/reagent/medicine/tetracordrazine //WS edit: Yes
- name = "Tetracordrazine"
- description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it"
-
-/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- . = 1
- ..()
-
-/datum/reagent/medicine/regen_jelly
- name = "Regenerative Jelly"
- description = "Gradually regenerates all types of damage, without harming slime anatomy."
- reagent_state = LIQUID
- color = "#CC23FF"
- taste_description = "jelly"
-
-/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
- if(M && ishuman(M) && reac_volume >= 0.5)
- var/mob/living/carbon/human/H = M
- H.hair_color = "C2F"
- H.facial_hair_color = "C2F"
- H.update_hair()
-
-/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0)
- M.adjustFireLoss(-1.5*REM, 0)
- M.adjustOxyLoss(-1.5*REM, 0)
- M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
- ..()
- . = 1
-
-/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
- name = "Restorative Nanites"
- description = "Miniature medical robots that swiftly restore bodily damage."
- reagent_state = SOLID
- color = "#555555"
- overdose_threshold = 30
- process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
-
-/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
- M.adjustFireLoss(-5*REM, 0)
- M.adjustOxyLoss(-15, 0)
- M.adjustToxLoss(-5*REM, 0)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
- M.adjustCloneLoss(-3*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
- if(prob(25))
- M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
- M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
- ..()
- . = 1
-
-/datum/reagent/medicine/cordiolis_hepatico
- name = "Cordiolis Hepatico"
- description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
- color = "#000000"
- self_consuming = TRUE
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
- ..()
- ADD_TRAIT(M, TRAIT_STABLELIVER, type)
- ADD_TRAIT(M, TRAIT_STABLEHEART, type)
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
- ..()
- REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
- REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
-
-/datum/reagent/medicine/muscle_stimulant
- name = "Muscle Stimulant"
- description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
- . = ..()
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
- . = ..()
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/carthatoline
- name = "Carthatoline"
- description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage."
- reagent_state = LIQUID
- color = "#225722"
- overdose_threshold = 25
-
-/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-2*REM, 0)
- if(M.getToxLoss() && prob(10))
- M.vomit(1)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,2)
- ..()
- . = 1
-
-/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M)
- M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math.
- ..()
- . = 1
-
-/datum/reagent/medicine/converbital
- name = "Converbital"
- description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns"
- reagent_state = LIQUID
- taste_description = "burning"
- color = "#7a1f13"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustFireLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight burning sensation..."))
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume)
- M.adjustFireLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/converbital/overdose_process(mob/living/M)
- M.adjustFireLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/convuri
- name = "Convuri"
- description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing"
- reagent_state = SOLID
- taste_description = "white-hot pain"
- color = "#b85505"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustBruteLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight tearing sensation..."))
- else if(M.getBruteLoss())
- M.adjustFireLoss(-reac_volume)
- M.adjustBruteLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/convuri/overdose_process(mob/living/M)
- M.adjustBruteLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole
- name = "Trophazole"
- description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides"
- reagent_state = LIQUID
- color = "#FFFF6B"
- overdose_threshold = 20
-
-/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole/overdose_process(mob/living/M)
- M.adjustBruteLoss(3*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume)
- if(method != INGEST || !iscarbon(A))
- return
-
- A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05)
- A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
-
- ..()
-
-
-/datum/reagent/medicine/rhigoxane
- name = "Rhigoxane"
- description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires."
- reagent_state = LIQUID
- color = "#F7FFA5"
- overdose_threshold = 25
- reagent_weight = 0.6
-
-/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0.)
- M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
- ..()
- . = 1
-
-/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
- if(method != VAPOR)
- return
-
- M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
- M.adjust_fire_stacks(-reac_volume / 2)
- if(reac_volume >= metabolization_rate)
- M.ExtinguishMob()
-
- ..()
-
-/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M)
- M.adjustFireLoss(3*REM, 0.)
- M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
- ..()
-
-/datum/reagent/medicine/thializid
- name = "Thializid"
- description = "A potent antidote for intravenous use with a narrow therapeutic index, it is considered an active prodrug of oxalizid."
- reagent_state = LIQUID
- color = "#8CDF24" // heavy saturation to make the color blend better
- metabolization_rate = 0.75 * REAGENTS_METABOLISM
- overdose_threshold = 6
- var/conversion_amount
-
-/datum/reagent/medicine/thializid/on_transfer(atom/A, method=INJECT, trans_volume)
- if(method != INJECT || !iscarbon(A))
- return
- var/mob/living/carbon/C = A
- if(trans_volume >= 0.6) //prevents cheesing with ultralow doses.
- C.adjustToxLoss(-1.5 * min(2, trans_volume) * REM, 0) //This is to promote iv pole use for that chemotherapy feel.
- var/obj/item/organ/liver/L = C.internal_organs_slot[ORGAN_SLOT_LIVER]
- if((L.organ_flags & ORGAN_FAILING) || !L)
- return
- conversion_amount = trans_volume * (min(100 -C.getOrganLoss(ORGAN_SLOT_LIVER), 80) / 100) //the more damaged the liver the worse we metabolize.
- C.reagents.remove_reagent(/datum/reagent/medicine/thializid, conversion_amount)
- C.reagents.add_reagent(/datum/reagent/medicine/oxalizid, conversion_amount)
- ..()
-
-/datum/reagent/medicine/thializid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.8)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
-
- ..()
- . = 1
-
-/datum/reagent/medicine/thializid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- M.reagents.add_reagent(/datum/reagent/medicine/oxalizid, 0.225 * REM)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxalizid
- name = "Oxalizid"
- description = "The active metabolite of thializid. Causes muscle weakness on overdose"
- reagent_state = LIQUID
- color = "#DFD54E"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 25
- var/datum/brain_trauma/mild/muscle_weakness/U
-
-/datum/reagent/medicine/oxalizid/on_mob_life(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 0.1)
- M.adjustToxLoss(-1*REM, 0)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,1)
- ..()
- . = 1
-
-/datum/reagent/medicine/oxalizid/overdose_start(mob/living/carbon/M)
- U = new()
- M.gain_trauma(U, TRAUMA_RESILIENCE_ABSOLUTE)
- ..()
-
-/datum/reagent/medicine/oxalizid/on_mob_delete(mob/living/carbon/M)
- if(U)
- QDEL_NULL(U)
- return ..()
-
-/datum/reagent/medicine/oxalizid/overdose_process(mob/living/carbon/M)
- M.adjustOrganLoss(ORGAN_SLOT_LIVER, 1.5)
- M.adjust_disgust(3)
- ..()
- . = 1
-
-/datum/reagent/medicine/skeletons_boon
- name = "Skeleton’s Boon"
- description = "A robust solution of minerals that greatly strengthens the bones."
- color = "#dbdfa2"
- metabolization_rate = REAGENTS_METABOLISM * 0.125
- overdose_threshold = 50
- var/plasma_armor = 33
- var/skele_armor = 20
- var/added_armor = 0
-
-/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- if(isplasmaman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += plasma_armor
- H.physiology.armor.bullet += plasma_armor
- added_armor = plasma_armor
- if(isskeleton(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += skele_armor
- H.physiology.armor.bullet += skele_armor
- added_armor = skele_armor
- ..()
-
-/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee -= added_armor
- H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
- ..()
-
-/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
- ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- ..()
-
-/datum/reagent/medicine/melatonin
- name = "Human Sleep Hormone"
- description = "A compound typically found within Solarians. The exact effects vary on the species it is administered to."
- color = "#e1b1e1" //very light pink ourple
- overdose_threshold = 0
- var/regenerating
- var/rachnid_limb
-
-/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
- . = ..()
- if(iscarbon(L))
- var/mob/living/carbon/imbiber = L
- if(isspiderperson(imbiber))
- //we check limbs, if one is missing, we break from the for loop after setting it to heal
- for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!imbiber.get_bodypart(limb))
- rachnid_limb = limb
- break
-
-/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
- . = ..()
- if(isspiderperson(L) && regenerating)
- var/mob/living/carbon/spider
- spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
- return
-
-/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
- . = ..()
- if(isvox(M))
- M.adjustToxLoss(1)
- if(islizard(M))
- if(prob(10))
- M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
- if(isspiderperson(M) && rachnid_limb)
- if(prob(7))
- to_chat(M, "Your body aches near [rachnid_limb]")
- if(current_cycle > 20 && !regenerating)
- regenerating = TRUE
-
- else
- if(M.IsSleeping())
- if(M.getBruteLoss() && M.getFireLoss())
- if(prob(50))
- M.adjustBruteLoss(-0.5)
- else
- M.adjustFireLoss(-0.5)
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-0.2)
- else if(M.getFireLoss())
- M.adjustFireLoss(-0.2)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index d2c4cc70d8d..9f833db7512 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -1,8 +1,25 @@
/*
- Omnizine was reflevored into Panacea. A chemical that heals all damage types, but can cause damage if overdosed.
- Protozine was reflavored into Effluvial Panacea.
+ Pentest Chem
+
+ - Modularization Changes
+ - Pentest Orginals
+ - Clone Healing
+ - Omni Healing
+ - Misc Medicines
+ - Brute Medicine
+ - Burn Medicine
+ - Toxin Medicine
+ - Oxygen Medicine
+
+*/
+
+/*
+ Modularization
*/
+// Omnizine was reflevored into Panacea.
+// Protozine was reflavored into Effluvial Panacea.
+
/datum/reagent/medicine/panacea
name = "Omnizine Panacea"
description = "A rare bioactive compound first discovered within certain extraterrestrial plant species. Omnizine Panacea rapidly stimulates cellular regeneration, allowing it to slowly repair nearly all forms of bodily damage. Excessive doses can destabilize this process, causing the regenerative effect to reverse."
@@ -11,9 +28,28 @@
name = "Effluvial Panacea"
description = "A degraded or impure form of Omnizine Panacea produced through biomass decay or industrial food processing. While it retains some regenerative properties, contaminants and breakdown products greatly reduce its effectiveness."
+// Tricordazine was reflavored into cure all.
+
+/datum/reagent/medicine/cureall
+ name = "Tricordrazine"
+ description = "A potent stimulant commonly used in resuscitation. Slowly restores all types of damage.
+
+// Dylovene was reflavored into Pancrazine. This corrects their mistake in desc.
+
+/datum/supply_pack/medical/vials/dylo_vial
+ desc = "Contains a spare Pancrazine vial, for usage in a Hypospray."
+
+// Makes Quadrdexane lore accurate.
+
+/datum/reagent/medicine/quardexane
+ description = "A third-generation burn medication. Injection allows it to rapidly re-knit burns, while vaporous application acts as an cooling agent and sanitizing substance. Overdose causes new burns to form on the user's body."
+
/*
+ Clone Healing
+
Clonexadone is a chemical that heals clone damage, but nothing else. It requires very cold temperatures to properly metabolize, and metabolizes quicker than cryoxadone.
Clonexadone is made from cryoxadone and sodium, with plasma as a catalyst.
+
*/
/datum/reagent/medicine/clonexadone
@@ -37,10 +73,36 @@
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
/*
- Pyroxadone is a chemical that heals all damage types, but only if the user is above a certain body temperature.
- It is made from cryoxadone and slime jelly, and apparently inverses the requirement for its activation.
+ Omni Healing
*/
+// Regenerative Jelly is a chemical that heals all types of damage, but only if the user is alive.
+
+/datum/reagent/medicine/regen_jelly
+ name = "Regenerative Jelly"
+ description = "Gradually regenerates all types of damage, without harming slime anatomy."
+ reagent_state = LIQUID
+ color = "#CC23FF"
+ taste_description = "jelly"
+
+/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
+ if(M && ishuman(M) && reac_volume >= 0.5)
+ var/mob/living/carbon/human/H = M
+ H.hair_color = "C2F"
+ H.facial_hair_color = "C2F"
+ H.update_hair()
+
+/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-1.5*REM, 0)
+ M.adjustFireLoss(-1.5*REM, 0)
+ M.adjustOxyLoss(-1.5*REM, 0)
+ M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
+ ..()
+ . = 1
+
+// Pyroxadone is a chemical that heals all damage types, but only if the user is above a certain body temperature.
+// It is made from cryoxadone and slime jelly, and apparently inverses the requirement for its activation.
+
/datum/reagent/medicine/pyroxadone
name = "Pyroxadone"
description = "A mixture of cryoxadone and slime jelly, that apparently inverses the requirement for its activation."
@@ -73,93 +135,140 @@
iter_wound.on_xadone(power)
REMOVE_TRAIT(M, TRAIT_DISFIGURED, TRAIT_GENERIC)
-/datum/chemical_reaction/pyroxadone
- results = list(/datum/reagent/medicine/pyroxadone = 2)
- required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
+// Restorative Nanites
-/*
- Oxandrolone is a chemical that rapidly heals burn damage, but only if the burn damage is above a certain threshold. It is made from cryoxadone and plasma.
-*/
-
-/datum/reagent/medicine/oxandrolone
- name = "Oxandrolone"
- description = "Stimulates the healing of severe burns. Extremely rapidly heals severe burns and slowly heals minor ones. Overdose will worsen existing burns."
- reagent_state = LIQUID
- color = "#1E8BFF"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
+/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
+ name = "Restorative Nanites"
+ description = "Miniature medical robots that swiftly restore bodily damage."
+ reagent_state = SOLID
+ color = "#555555"
+ overdose_threshold = 30
+ process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
-/datum/reagent/medicine/oxandrolone/on_mob_life(mob/living/carbon/M)
- if(M.getFireLoss() > 25)
- M.adjustFireLoss(-4*REM, 0) //Twice as effective as AIURI for severe burns
- else
- M.adjustFireLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
+/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
+ M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
+ M.adjustFireLoss(-5*REM, 0)
+ M.adjustOxyLoss(-15, 0)
+ M.adjustToxLoss(-5*REM, 0)
+ M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
+ M.adjustCloneLoss(-3*REM, 0)
..()
. = 1
-/datum/reagent/medicine/oxandrolone/overdose_process(mob/living/M)
- if(M.getFireLoss()) //It only makes existing burns worse
- M.adjustFireLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
- . = 1
+/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
+ if(prob(25))
+ M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
+ M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
..()
+ . = 1
/*
-
+ Misc Medicines
*/
-/datum/reagent/medicine/sal_acid
- name = "Salicylic Acid"
- description = "Stimulates the healing of severe bruises. Extremely rapidly heals severe bruising and slowly heals minor ones. Overdose will worsen existing bruising."
- reagent_state = LIQUID
- color = "#D2D2D2"
- metabolization_rate = 0.5 * REAGENTS_METABOLISM
- overdose_threshold = 25
+// Melatonin is a chemical that has varying effects on different species.
+// It has no effect on non-carbon life, but in carbon life it promotes healing and regeneration in exchange for a temporary period of discomfort.
+// In spiderpeople, it promotes the regeneration of lost limbs, but causes aching in the remaining ones until the regeneration is complete.
-/datum/reagent/medicine/sal_acid/on_mob_life(mob/living/carbon/M)
- if(M.getBruteLoss() > 25)
- M.adjustBruteLoss(-4*REM, 0) //Twice as effective as styptic powder for severe bruising
- else
- M.adjustBruteLoss(-0.5*REM, 0) //But only a quarter as effective for more minor ones
- ..()
- . = 1
+/datum/reagent/medicine/melatonin
+ name = "Melatonin"
+ description = "A compound typically found within organics. The exact effects vary on the species it is administered to."
+ color = "#e1b1e1" //very light pink ourple
+ overdose_threshold = 0
+ var/regenerating
+ var/rachnid_limb
-/datum/reagent/medicine/sal_acid/overdose_process(mob/living/M)
- if(M.getBruteLoss()) //It only makes existing bruises worse
- M.adjustBruteLoss(4.5*REM, FALSE, FALSE, BODYTYPE_ORGANIC) // it's going to be healing either 4 or 0.5
- . = 1
- ..()
+/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
+ . = ..()
+ if(iscarbon(L))
+ var/mob/living/carbon/imbiber = L
+ if(isspiderperson(imbiber))
+ //we check limbs, if one is missing, we break from the for loop after setting it to heal
+ for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
+ if(!imbiber.get_bodypart(limb))
+ rachnid_limb = limb
+ break
-/*
+/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ if(isspiderperson(L) && regenerating)
+ var/mob/living/carbon/spider
+ spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
+ return
-*/
+/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
+ . = ..()
+ if(isvox(M))
+ M.adjustToxLoss(1)
+ if(islizard(M))
+ if(prob(10))
+ M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
+ M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
+ if(isspiderperson(M) && rachnid_limb)
+ if(prob(7))
+ to_chat(M, "Your body aches near [rachnid_limb]")
+ if(current_cycle > 20 && !regenerating)
+ regenerating = TRUE
-/datum/reagent/medicine/perfluorodecalin
- name = "Perfluorodecalin"
- description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
- reagent_state = LIQUID
- color = "#FF6464"
- metabolization_rate = 0.25 * REAGENTS_METABOLISM
- overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
+ else
+ if(M.IsSleeping())
+ if(M.getBruteLoss() && M.getFireLoss())
+ if(prob(50))
+ M.adjustBruteLoss(-0.5)
+ else
+ M.adjustFireLoss(-0.5)
+ else if(M.getBruteLoss())
+ M.adjustBruteLoss(-0.2)
+ else if(M.getFireLoss())
+ M.adjustFireLoss(-0.2)
-/datum/reagent/medicine/perfluorodecalin/on_mob_life(mob/living/carbon/human/M)
- var/oxycalc = 2.5*REM*current_cycle
- if(!overdosed)
- oxycalc = min(oxycalc,M.getOxyLoss()+ 0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.5. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
- M.adjustOxyLoss(-oxycalc, 0)
- M.adjustToxLoss(oxycalc/2.5, 0)
- if(prob(current_cycle) && M.losebreath)
- M.losebreath--
+// Skeleton's Boon is a reagent that provides temporary armor to the user.
+// It provides more protection to plasmamen than it does to skeletons, but it provides some protection to both. Overdose causes brittle bones.
+
+/datum/reagent/medicine/skeletons_boon
+ name = "Skeleton’s Boon"
+ description = "A robust solution of minerals that greatly strengthens the bones."
+ color = "#dbdfa2"
+ metabolization_rate = REAGENTS_METABOLISM * 0.125
+ overdose_threshold = 50
+ var/plasma_armor = 33
+ var/skele_armor = 20
+ var/added_armor = 0
+
+/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
+ ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ if(isplasmaman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += plasma_armor
+ H.physiology.armor.bullet += plasma_armor
+ added_armor = plasma_armor
+ if(isskeleton(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee += skele_armor
+ H.physiology.armor.bullet += skele_armor
+ added_armor = skele_armor
..()
- return TRUE
-/datum/reagent/medicine/perfluorodecalin/overdose_process(mob/living/M)
- metabolization_rate += 1
- return ..()
+/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ if(ishuman(M))
+ var/mob/living/carbon/human/H = M
+ H.physiology.armor.melee -= added_armor
+ H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
+ ..()
-/*
+/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
+ ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
+ REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
+ ..()
+/*
+ Brute Medicine
*/
+// Bicaridine is a chemical that restores bruising, but overdose causes it instead.
+
/datum/reagent/medicine/bicaridine
name = "Bicaridine"
description = "Restores bruising. Overdose causes it instead."
@@ -177,55 +286,87 @@
..()
. = 1
-/*
-
-*/
+// Helbital
-/datum/reagent/medicine/bicaridinep
- name = "Bicaridine Plus"
- description = "Restores bruising and slowly stems bleeding. Overdose causes it instead. More effective than standardized Bicaridine."
- reagent_state = LIQUID
- color = "#bf0000"
- overdose_threshold = 25
-
-/datum/reagent/medicine/bicaridinep/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-2*REM, 0)
+/datum/reagent/medicine/helbital //kinda a C2 only if you're not in hardcrit.
+ name = "Helbital"
+ description = "Named after the norse goddess Hel, this medicine heals the patient's bruises the closer they are to death. Patients will find the medicine 'aids' their healing if not near death by causing asphyxiation."
+ color = "#9400D3"
+ taste_description = "cold and lifeless"
+ overdose_threshold = 35
+ reagent_state = SOLID
+ var/helbent = FALSE
+ var/reaping = FALSE
+ harmful = TRUE
+ metabolization_rate = 0.2
+
+/datum/reagent/medicine/helbital/on_mob_life(mob/living/carbon/M)
+ . = TRUE
+ var/death_is_coming = (M.getToxLoss() + M.getOxyLoss() + M.getFireLoss() + M.getBruteLoss())
+ var/thou_shall_heal = 0
+ var/good_kind_of_healing = FALSE
+ switch(M.stat)
+ if(CONSCIOUS) //bad
+ thou_shall_heal = death_is_coming/50
+ M.adjustOxyLoss(2, TRUE)
+ if(SOFT_CRIT) //meh convert
+ thou_shall_heal = round(death_is_coming/47,0.1)
+ M.adjustOxyLoss(1, TRUE)
+ else //no convert
+ thou_shall_heal = round(death_is_coming/45,0.1)
+ good_kind_of_healing = TRUE
+ M.adjustBruteLoss(-thou_shall_heal, FALSE)
+
+ if(good_kind_of_healing && !reaping && prob(0.0001)) //janken with the grim reaper!
+ reaping = TRUE
+ var/list/RockPaperScissors = list("rock" = "paper", "paper" = "scissors", "scissors" = "rock") //choice = loses to
+ if(M.apply_status_effect(/datum/status_effect/necropolis_curse,CURSE_BLINDING))
+ helbent = TRUE
+ to_chat(M, span_hierophant("Malevolent spirits appear before you, bartering your life in a 'friendly' game of rock, paper, scissors. Which do you choose?"))
+ var/timeisticking = world.time
+ var/RPSchoice = input(M, "Janken Time! You have 60 Seconds to Choose!", "Rock Paper Scissors",null) as null|anything in RockPaperScissors
+ if(QDELETED(M) || (timeisticking+(1.1 MINUTES) < world.time))
+ reaping = FALSE
+ return //good job, you ruined it
+ if(!RPSchoice)
+ to_chat(M, span_hierophant("You decide to not press your luck, but the spirits remain... hopefully they'll go away soon."))
+ reaping = FALSE
+ return
+ var/grim = pick(RockPaperScissors)
+ if(grim == RPSchoice) //You Tied!
+ to_chat(M, span_hierophant("You tie, and the malevolent spirits disappear... for now."))
+ reaping = FALSE
+ else if(RockPaperScissors[RPSchoice] == grim) //You lost!
+ to_chat(M, span_hierophant("You lose, and the malevolent spirits smirk eerily as they surround your body."))
+ M.dust()
+ return
+ else //VICTORY ROYALE
+ to_chat(M, span_hierophant("You win, and the malevolent spirits fade away as well as your wounds."))
+ M.client.give_award(/datum/award/achievement/misc/helbitaljanken, M)
+ M.revive(full_heal = TRUE, admin_revive = FALSE)
+ M.reagents.del_reagent(type)
+ return
+
+ ..()
+ return
+
+/datum/reagent/medicine/helbital/overdose_process(mob/living/carbon/M)
+ if(!helbent)
+ M.apply_necropolis_curse(CURSE_WASTING | CURSE_BLINDING)
+ helbent = TRUE
..()
- . = 1
+ return TRUE
-/datum/reagent/medicine/bicaridinep/overdose_process(mob/living/M)
- M.adjustBruteLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
+/datum/reagent/medicine/helbital/on_mob_delete(mob/living/L)
+ if(helbent)
+ L.remove_status_effect(STATUS_EFFECT_NECROPOLIS_CURSE)
..()
- . = 1
/*
-
+ Burn Medicine
*/
-/datum/reagent/medicine/dexalinp
- name = "Dexalin Plus"
- description = "Restores oxygen loss and purges Lexorin. Overdose causes it instead. More effective than standardized Dexalin."
- reagent_state = LIQUID
- color = "#0040FF"
- overdose_threshold = 25
-
-/datum/reagent/medicine/dexalinp/on_mob_life(mob/living/carbon/M)
- M.adjustOxyLoss(-2*REM, 0)
- if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL)
- M.blood_volume += 1
- if(holder.has_reagent(/datum/reagent/toxin/lexorin))
- holder.remove_reagent(/datum/reagent/toxin/lexorin, 3)
- ..()
- . = 1
-
-/datum/reagent/medicine/dexalinp/overdose_process(mob/living/M)
- M.adjustOxyLoss(6*REM, 0)
- ..()
- . = 1
-
-/*
-
-*/
+// Kelotane
/datum/reagent/medicine/kelotane
name = "Kelotane"
@@ -244,32 +385,31 @@
..()
. = 1
-/*
-
-*/
+// Aiuri
-/datum/reagent/medicine/dermaline
- name = "Dermaline"
- description = "Heals burn damage. Overdose causes it instead. Superior to standardized Kelotane in healing capacity."
+/datum/reagent/medicine/aiuri
+ name = "Aiuri"
+ description = "Used to treat burns. Does minor eye damage."
reagent_state = LIQUID
- color = "#FF8000"
- overdose_threshold = 25
+ color = "#8C93FF"
+ var/resetting_probability = 0
+ var/message_cd = 0
+ harmful = TRUE
+ metabolization_rate = 0.2
-/datum/reagent/medicine/dermaline/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0)
+/datum/reagent/medicine/aiuri/on_mob_life(mob/living/carbon/M)
+ M.adjustFireLoss(-2*REM)
+ M.adjustOrganLoss(ORGAN_SLOT_EYES,0.25*REM)
..()
- . = 1
-
-/datum/reagent/medicine/dermaline/overdose_process(mob/living/M)
- M.adjustFireLoss(6*REM, FALSE, FALSE, BODYTYPE_ORGANIC)
- ..()
- . = 1
+ return TRUE
/*
-
+ Toxin Medicine
*/
-/datum/reagent/medicine/antitoxin
+// Dylovene
+
+/datum/reagent/medicine/dylovene
name = "Dylovene"
description = "Heals toxin damage and removes toxins in the bloodstream. Overdose causes toxin damage."
reagent_state = LIQUID
@@ -277,422 +417,107 @@
overdose_threshold = 30
taste_description = "a roll of gauze"
-/datum/reagent/medicine/antitoxin/on_mob_life(mob/living/carbon/M)
+/datum/reagent/medicine/dylovine/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-0.5*REM, 0)
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
M.reagents.remove_reagent(R.type,1)
..()
. = 1
-/datum/reagent/medicine/antitoxin/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+/datum/reagent/medicine/dylovine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
. = ..()
if(chems.has_reagent(type, 1))
mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
-/datum/reagent/medicine/antitoxin/overdose_process(mob/living/M)
+/datum/reagent/medicine/dylovine/overdose_process(mob/living/M)
M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
..()
. = 1
-/*
-
-*/
-
-/datum/reagent/medicine/tricordrazine
- name = "Tricordrazine"
- description = "A weak dilutant that slowly heals brute, burn, and toxin damage."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "water that has been standing still in a glass on a counter overnight"
-
-/datum/reagent/medicine/tricordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- . = 1
- ..()
-
-/*
-
-*/
-
-/datum/reagent/medicine/tetracordrazine //WS edit: Yes
- name = "Tetracordrazine"
- description = "A weak dilutant similar to Tricordrazine that slowly heals all damage types."
- reagent_state = LIQUID
- color = "#C8A5DC"
- taste_description = "bottled water that has been sitting out in the sun with a single chili flake in it"
-
-/datum/reagent/medicine/tetracordrazine/on_mob_life(mob/living/carbon/M)
- if(prob(80))
- M.adjustBruteLoss(-0.25*REM, 0)
- M.adjustFireLoss(-0.25*REM, 0)
- M.adjustToxLoss(-0.25*REM, 0)
- M.adjustOxyLoss(-0.5*REM, 0)
- . = 1
- ..()
-
-/*
-
-*/
-
-/datum/reagent/medicine/regen_jelly
- name = "Regenerative Jelly"
- description = "Gradually regenerates all types of damage, without harming slime anatomy."
- reagent_state = LIQUID
- color = "#CC23FF"
- taste_description = "jelly"
-
-/datum/reagent/medicine/regen_jelly/expose_mob(mob/living/M, reac_volume)
- if(M && ishuman(M) && reac_volume >= 0.5)
- var/mob/living/carbon/human/H = M
- H.hair_color = "C2F"
- H.facial_hair_color = "C2F"
- H.update_hair()
-
-/datum/reagent/medicine/regen_jelly/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0)
- M.adjustFireLoss(-1.5*REM, 0)
- M.adjustOxyLoss(-1.5*REM, 0)
- M.adjustToxLoss(-1.5*REM, 0, TRUE) //heals TOXINLOVERs
- ..()
- . = 1
-
-/*
-
-*/
-
-/datum/reagent/medicine/syndicate_nanites //Used exclusively by Syndicate medical cyborgs
- name = "Restorative Nanites"
- description = "Miniature medical robots that swiftly restore bodily damage."
- reagent_state = SOLID
- color = "#555555"
- overdose_threshold = 30
- process_flags = ORGANIC | SYNTHETIC //WS Edit - IPCs //WS Edit - IPCs
-
-/datum/reagent/medicine/syndicate_nanites/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-5*REM, 0) //A ton of healing - this is a 50 telecrystal investment.
- M.adjustFireLoss(-5*REM, 0)
- M.adjustOxyLoss(-15, 0)
- M.adjustToxLoss(-5*REM, 0)
- M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM)
- M.adjustCloneLoss(-3*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/syndicate_nanites/overdose_process(mob/living/carbon/M) //wtb flavortext messages that hint that you're vomitting up robots
- if(prob(25))
- M.reagents.remove_reagent(type, metabolization_rate*15) // ~5 units at a rate of 0.4 but i wanted a nice number in code
- M.vomit(20) // nanite safety protocols make your body expel them to prevent harmies
- ..()
- . = 1
-
-/*
-
-*/
-
-/datum/reagent/medicine/cordiolis_hepatico
- name = "Cordiolis Hepatico"
- description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
- color = "#000000"
- self_consuming = TRUE
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
- ..()
- ADD_TRAIT(M, TRAIT_STABLELIVER, type)
- ADD_TRAIT(M, TRAIT_STABLEHEART, type)
-
-/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
- ..()
- REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
- REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
-
-/*
-
-*/
-
-/datum/reagent/medicine/muscle_stimulant
- name = "Muscle Stimulant"
- description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
- . = ..()
- L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
- . = ..()
- L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
-
-/*
-
-*/
-
-/datum/reagent/medicine/carthatoline
- name = "Carthatoline"
- description = "An evacuant that induces vomiting and purges toxins, as well as healing toxin damage. Superior to Dylovene. Overdose causes toxin damage."
- reagent_state = LIQUID
- color = "#225722"
- overdose_threshold = 25
-
-/datum/reagent/medicine/carthatoline/on_mob_life(mob/living/carbon/M)
- M.adjustToxLoss(-2*REM, 0)
- if(M.getToxLoss() && prob(10))
- M.vomit(1)
- for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
- M.reagents.remove_reagent(R.type,2)
- ..()
- . = 1
-
-/datum/reagent/medicine/carthatoline/overdose_process(mob/living/M)
- M.adjustToxLoss(6*REM, 0) // End result is 4 toxin loss taken. Do your own math.
- ..()
- . = 1
-
-/*
-
-*/
-
-/datum/reagent/medicine/converbital
- name = "Converbital"
- description = "A substance capable of regenerating torn flesh, however, due to its extremely exothermic nature, use may result in burns"
- reagent_state = LIQUID
- taste_description = "burning"
- color = "#7a1f13"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/converbital/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustFireLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight burning sensation..."))
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-reac_volume)
- M.adjustFireLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin bubble and burn as your flesh knits itself together!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/converbital/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/converbital/overdose_process(mob/living/M)
- M.adjustFireLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
+// Multiver
+
+/datum/reagent/medicine/multiver //enhanced with MULTIple medicines
+ name = "Multiver"
+ description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
+ harmful = TRUE
+ metabolization_rate = 0.2
+
+/datum/reagent/medicine/multiver/on_mob_life(mob/living/carbon/human/M)
+ var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
+ for(var/r in M.reagents.reagent_list)
+ var/datum/reagent/the_reagent = r
+ if(istype(the_reagent, /datum/reagent/medicine))
+ medibonus += 1
+ M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work
+ M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u
+ for(var/r2 in M.reagents.reagent_list)
+ var/datum/reagent/the_reagent2 = r2
+ if(the_reagent2 == src)
+ continue
+ var/amount2purge = 3
+ if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines
+ continue
+ M.reagents.remove_reagent(the_reagent2.type, amount2purge)
..()
- . = 1
-
-/*
-
-*/
-
-/datum/reagent/medicine/convuri
- name = "Convuri"
- description = "A substance capable of regenerating burnt skin with ease, however, the speed at which it does this has been known to cause muscular tearing"
- reagent_state = SOLID
- taste_description = "white-hot pain"
- color = "#b85505"
- metabolization_rate = REM * 1
- overdose_threshold = 25
-
-/datum/reagent/medicine/convuri/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- if(iscarbon(M) && M.stat != DEAD)
- if(method in list(INGEST, VAPOR, INJECT))
- M.adjustBruteLoss(0.5*reac_volume)
- if(show_message)
- to_chat(M, span_warning("You feel a slight tearing sensation..."))
- else if(M.getBruteLoss())
- M.adjustFireLoss(-reac_volume)
- M.adjustBruteLoss(reac_volume)
- M.force_scream()
- if(show_message && !HAS_TRAIT(M, TRAIT_ANALGESIA))
- to_chat(M, span_danger("You feel your skin tear as your flesh rapidly regenerates!"))
- SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "painful_medicine", /datum/mood_event/painful_medicine)
- else
- to_chat(M, span_notice("You feel your skin shifting around unnaturally."))
- ..()
-
-/datum/reagent/medicine/convuri/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(0.25*REM, 0)
- ..()
- . = 1
-
-/datum/reagent/medicine/convuri/overdose_process(mob/living/M)
- M.adjustBruteLoss(2.5*REM, 0)
- M.adjustToxLoss(0.5, 0)
- ..()
- . = 1
+ return TRUE
/*
-
+ Oxygen Medicine
*/
-/datum/reagent/medicine/trophazole
- name = "Trophazole"
- description = "Orginally developed as fitness supplement, this chemical accelerates wound healing and if ingested turns nutriment into healing peptides"
- reagent_state = LIQUID
- color = "#FFFF6B"
- overdose_threshold = 20
-
-/datum/reagent/medicine/trophazole/on_mob_life(mob/living/carbon/M)
- M.adjustBruteLoss(-1.5*REM, 0.) // heals 3 brute & 0.5 burn if taken with food. compared to 2.5 brute from bicard + nutriment
- ..()
- . = 1
-
-/datum/reagent/medicine/trophazole/overdose_process(mob/living/M)
- M.adjustBruteLoss(3*REM, 0)
- ..()
- . = 1
+// Convermol
-/datum/reagent/medicine/trophazole/on_transfer(atom/A, method=INGEST, trans_volume)
- if(method != INGEST || !iscarbon(A))
- return
-
- A.reagents.remove_reagent(/datum/reagent/medicine/trophazole, trans_volume * 0.05)
- A.reagents.add_reagent(/datum/reagent/medicine/metafactor, trans_volume * 0.25)
-
- ..()
+#define CONVERMOL_RATIO 5 //# Oxygen damage to result in 1 tox
-/*
-
-*/
-
-/datum/reagent/medicine/rhigoxane
- name = "Rhigoxane"
- description = "A second generation burn treatment agent exhibiting a cooling effect that is especially pronounced when deployed as a spray. Its high halogen content helps extinguish fires."
+/datum/reagent/medicine/convermol
+ name = "Convermol"
+ description = "Restores oxygen deprivation while producing a lesser amount of toxic byproducts. Both scale with exposure to the drug and current amount of oxygen deprivation. Overdose causes toxic byproducts regardless of oxygen deprivation."
reagent_state = LIQUID
- color = "#F7FFA5"
- overdose_threshold = 25
- reagent_weight = 0.6
+ color = "#FF6464"
+ overdose_threshold = 35 // at least 2 full syringes +some, this stuff is nasty if left in for long
+ harmful = TRUE
+ metabolization_rate = 0.2
-/datum/reagent/medicine/rhigoxane/on_mob_life(mob/living/carbon/M)
- M.adjustFireLoss(-2*REM, 0.)
- M.adjust_bodytemperature(-0.6 * TEMPERATURE_DAMAGE_COEFFICIENT, M.dna.species.bodytemp_normal)
+/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M)
+ var/oxycalc = 2.5*REM*current_cycle
+ if(!overdosed)
+ oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
+ M.adjustOxyLoss(-oxycalc, 0)
+ M.adjustToxLoss(oxycalc/CONVERMOL_RATIO, 0)
+ if(prob(current_cycle) && M.losebreath)
+ M.losebreath--
..()
- . = 1
-
-/datum/reagent/medicine/rhigoxane/expose_mob(mob/living/carbon/M, method=VAPOR, reac_volume)
- if(method != VAPOR)
- return
-
- M.adjust_bodytemperature(-reac_volume * TEMPERATURE_DAMAGE_COEFFICIENT * 0.5, 200)
- M.adjust_fire_stacks(-reac_volume / 2)
- if(reac_volume >= metabolization_rate)
- M.ExtinguishMob()
+ return TRUE
+/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M)
+ metabolization_rate += 1
..()
+ return TRUE
-/datum/reagent/medicine/rhigoxane/overdose_process(mob/living/carbon/M)
- M.adjustFireLoss(3*REM, 0.)
- M.adjust_bodytemperature(-5 * TEMPERATURE_DAMAGE_COEFFICIENT, 50)
- ..()
+#undef CONVERMOL_RATIO
-/*
- Skeleton's Boon is a reagent that provides temporary armor to the user.
- It provides more protection to plasmamen than it does to skeletons, but it provides some protection to both.
- Overdose causes brittle bones.
-*/
+// Tirimol
-/datum/reagent/medicine/skeletons_boon
- name = "Skeleton’s Boon"
- description = "A robust solution of minerals that greatly strengthens the bones."
- color = "#dbdfa2"
- metabolization_rate = REAGENTS_METABOLISM * 0.125
- overdose_threshold = 50
- var/plasma_armor = 33
- var/skele_armor = 20
- var/added_armor = 0
-
-/datum/reagent/medicine/skeletons_boon/expose_mob(mob/living/M, method=TOUCH, reac_volume, show_message = 1)
- ADD_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- if(isplasmaman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += plasma_armor
- H.physiology.armor.bullet += plasma_armor
- added_armor = plasma_armor
- if(isskeleton(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee += skele_armor
- H.physiology.armor.bullet += skele_armor
- added_armor = skele_armor
+/datum/reagent/medicine/tirimol
+ name = "Tirimol"
+ description = "An oxygen deprivation medication that causes fatigue. Prolonged exposure causes the patient to fall asleep once the medicine metabolizes."
+ color = "#FF6464"
+ var/drowsycd = 0
+ harmful = TRUE
+ metabolization_rate = 0.2
+
+/datum/reagent/medicine/tirimol/on_mob_life(mob/living/carbon/human/M)
+ M.adjustOxyLoss(-3)
+ M.adjustStaminaLoss(2)
+ if(drowsycd && (world.time > drowsycd))
+ M.drowsyness += 10
+ drowsycd = world.time + (45 SECONDS)
+ else if(!drowsycd)
+ drowsycd = world.time + (15 SECONDS)
..()
+ return TRUE
-/datum/reagent/medicine/skeletons_boon/on_mob_end_metabolize(mob/living/M)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- if(ishuman(M))
- var/mob/living/carbon/human/H = M
- H.physiology.armor.melee -= added_armor
- H.physiology.armor.bullet -= added_armor // No, you can't change species to get a permanant brute resist
+/datum/reagent/medicine/tirimol/on_mob_end_metabolize(mob/living/L)
+ if(current_cycle > 20)
+ L.Sleeping(10 SECONDS)
..()
-
-/datum/reagent/medicine/skeletons_boon/overdose_process(mob/living/M)
- ADD_TRAIT(M, TRAIT_ALLBREAK, TRAIT_GENERIC)
- REMOVE_TRAIT(M, TRAIT_NOBREAK, TRAIT_GENERIC)
- ..()
-
-/*
- Melatonin is a chemical that has varying effects on different species.
- It has no effect on non-carbon life, but in carbon life it promotes healing and regeneration in exchange for a temporary period of discomfort.
- In spiderpeople, it promotes the regeneration of lost limbs, but causes aching in the remaining ones until the regeneration is complete.
-*/
-
-/datum/reagent/medicine/melatonin
- name = "Melatonin"
- description = "A compound typically found within organics. The exact effects vary on the species it is administered to."
- color = "#e1b1e1" //very light pink ourple
- overdose_threshold = 0
- var/regenerating
- var/rachnid_limb
-
-/datum/reagent/medicine/melatonin/on_mob_metabolize(mob/living/L)
- . = ..()
- if(iscarbon(L))
- var/mob/living/carbon/imbiber = L
- if(isspiderperson(imbiber))
- //we check limbs, if one is missing, we break from the for loop after setting it to heal
- for (var/limb in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG))
- if(!imbiber.get_bodypart(limb))
- rachnid_limb = limb
- break
-
-/datum/reagent/medicine/melatonin/on_mob_end_metabolize(mob/living/L)
- . = ..()
- if(isspiderperson(L) && regenerating)
- var/mob/living/carbon/spider
- spider.regenerate_limb(rachnid_limb, TRUE, FALSE)
- return
-
-/datum/reagent/medicine/melatonin/on_mob_life(mob/living/carbon/M)
- . = ..()
- if(isvox(M))
- M.adjustToxLoss(1)
- if(islizard(M))
- if(prob(10))
- M.playsound_local(get_turf(M), 'sound/health/fastbeat2.ogg', 40,0, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
- M.adjustOrganLoss(ORGAN_SLOT_HEART, 0.5)
- if(isspiderperson(M) && rachnid_limb)
- if(prob(7))
- to_chat(M, "Your body aches near [rachnid_limb]")
- if(current_cycle > 20 && !regenerating)
- regenerating = TRUE
-
- else
- if(M.IsSleeping())
- if(M.getBruteLoss() && M.getFireLoss())
- if(prob(50))
- M.adjustBruteLoss(-0.5)
- else
- M.adjustFireLoss(-0.5)
- else if(M.getBruteLoss())
- M.adjustBruteLoss(-0.2)
- else if(M.getFireLoss())
- M.adjustFireLoss(-0.2)
diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
index 5a356df5cc8..6d947b0c196 100644
--- a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
+++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
@@ -1,5 +1,11 @@
/*
+ Modularization
+*/
+
+//
+/*
+ Clone Healing
*/
/datum/chemical_reaction/clonexadone
@@ -8,59 +14,81 @@
required_catalysts = list(/datum/reagent/toxin/plasma = 5)
/*
-
+ Omni Healing
*/
+/datum/chemical_reaction/regen_jelly
+ results = list(/datum/reagent/medicine/regen_jelly = 1)
+ required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1)
+
+/datum/chemical_reaction/regen_jelly2
+ results = list(/datum/reagent/medicine/regen_jelly = 2)
+ required_reagents = list(/datum/reagent/medicine/panacea = 1, /datum/reagent/toxin/slimejelly = 1)
+
/datum/chemical_reaction/pyroxadone
results = list(/datum/reagent/medicine/pyroxadone = 2)
required_reagents = list(/datum/reagent/medicine/cryoxadone = 1, /datum/reagent/toxin/slimejelly = 1)
/*
-
+ Misc Medicines
*/
-/datum/chemical_reaction/oxandrolone
- results = list(/datum/reagent/medicine/oxandrolone = 6)
- required_reagents = list(/datum/reagent/carbon = 3, /datum/reagent/phenol = 1, /datum/reagent/hydrogen = 1, /datum/reagent/oxygen = 1)
+// Melatonin has no recipe. Pills only.
-/*
-
-*/
-
-x
+/datum/chemical_reaction/skele_boon
+ results = list(/datum/reagent/medicine/skeletons_boon = 5)
+ required_reagents = list(/datum/reagent/medicine/lavaland_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5)
/*
-
+ Brute Medicine
*/
-x
+/datum/chemical_reaction/bicaridine
+ results = list(/datum/reagent/medicine/bicaridine = 3)
+ required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
-/*
-
-*/
-
-x
+/datum/chemical_reaction/helbital
+ results = list(/datum/reagent/medicine/c2/helbital = 3)
+ required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1)
+ mix_message = "The mixture turns into a thick, yellow powder."
/*
-
+ Burn Medicine
*/
-x
-
-/*
-
-*/
+/datum/chemical_reaction/kelotane
+ results = list(/datum/reagent/medicine/kelotane = 2)
+ required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1)
-x
+/datum/chemical_reaction/aiuri
+ results = list(/datum/reagent/medicine/c2/aiuri = 4)
+ required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2)
/*
-
+ Toxin Medicine
*/
-x
+/datum/chemical_reaction/dylovine
+ results = list(/datum/reagent/medicine/dylovine = 3)
+ required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
-/*
+/datum/chemical_reaction/multiver
+ results = list(/datum/reagent/medicine/c2/multiver = 2)
+ required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1)
+ mix_message = "The mixture yields a fine black powder."
+ required_temp = 380
+/*
+ Oxygen Medicine
*/
-x
+/datum/chemical_reaction/convermol
+ results = list(/datum/reagent/medicine/c2/convermol = 3)
+ required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1)
+ required_temp = 370
+ mix_message = "The mixture rapidly turns into a dense pink liquid."
+
+/datum/chemical_reaction/tirimol
+ results = list(/datum/reagent/medicine/c2/tirimol = 5)
+ required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2)
+ required_catalysts = list(/datum/reagent/toxin/acid = 1)
From 036534b314ce044a612047d69d9f89b5d5a6b886 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Sat, 14 Mar 2026 03:49:25 -0700
Subject: [PATCH 24/52] Corrects these niche chemicals with their useage
---
.../abductor/equipment/abduction_gear.dm | 16 ++++++++++++++++
modular_pentest/modules/toys/code/hot_potato.dm | 12 ++++++++++++
2 files changed, 28 insertions(+)
diff --git a/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
index b614c915d4b..bcacbda92bc 100644
--- a/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
+++ b/modular_pentest/master_files/code/modules/antagonists/abductor/equipment/abduction_gear.dm
@@ -38,3 +38,19 @@
/obj/structure/table/optable/abductor/Destroy()
STOP_PROCESSING(SSobj, src)
. = ..()
+
+/datum/reagent/medicine/cordiolis_hepatico
+ name = "Cordiolis Hepatico"
+ description = "A strange, pitch-black reagent that seems to absorb all light. Effects unknown."
+ color = "#000000"
+ self_consuming = TRUE
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_add(mob/living/M)
+ ..()
+ ADD_TRAIT(M, TRAIT_STABLELIVER, type)
+ ADD_TRAIT(M, TRAIT_STABLEHEART, type)
+
+/datum/reagent/medicine/cordiolis_hepatico/on_mob_end_metabolize(mob/living/M)
+ ..()
+ REMOVE_TRAIT(M, TRAIT_STABLEHEART, type)
+ REMOVE_TRAIT(M, TRAIT_STABLELIVER, type)
diff --git a/modular_pentest/modules/toys/code/hot_potato.dm b/modular_pentest/modules/toys/code/hot_potato.dm
index befad40b2aa..4e92e8a6f87 100644
--- a/modular_pentest/modules/toys/code/hot_potato.dm
+++ b/modular_pentest/modules/toys/code/hot_potato.dm
@@ -182,3 +182,15 @@
sticky = FALSE
reusable = TRUE
forceful_attachment = FALSE
+
+/datum/reagent/medicine/muscle_stimulant
+ name = "Muscle Stimulant"
+ description = "A potent chemical that allows someone under its influence to be at full physical ability even when under massive amounts of pain."
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_metabolize(mob/living/L)
+ . = ..()
+ L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
+
+/datum/reagent/medicine/muscle_stimulant/on_mob_end_metabolize(mob/living/L)
+ . = ..()
+ L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown)
From 39b05214474f96ada1e4641ee99706333d07e020 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Sat, 14 Mar 2026 03:49:50 -0700
Subject: [PATCH 25/52] corrects to Ship Chem
---
.../master_files/code/game/objects/items/food/misc.dm | 4 ++--
modular_pentest/modules/robots/code/med_borg.dm | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/modular_pentest/master_files/code/game/objects/items/food/misc.dm b/modular_pentest/master_files/code/game/objects/items/food/misc.dm
index 1c6a2fab386..7e89dfe8443 100644
--- a/modular_pentest/master_files/code/game/objects/items/food/misc.dm
+++ b/modular_pentest/master_files/code/game/objects/items/food/misc.dm
@@ -24,8 +24,8 @@
name = "stuffed legion"
desc = "Composed of a whole skull sourced from a parasitic Legion stuffed with prepared goliath meat, served alongside ketchup and hotsauce."
icon_state = "stuffed_legion"
- bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/medicine/tricordrazine = 5)
- food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/medicine/tricordrazine = 10)
+ bonus_reagents = list(/datum/reagent/consumable/nutriment/vitamin = 3, /datum/reagent/consumable/capsaicin = 1, /datum/reagent/medicine/cureall = 5)
+ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/consumable/nutriment/vitamin = 5, /datum/reagent/consumable/capsaicin = 2, /datum/reagent/medicine/cureall = 10)
tastes = list("tough meat" = 2, "calcium" = 1, "bitter chemical aftertaste" = 1, "hot peppers" = 1)
foodtypes = MEAT
filling_color = "#3B342B"
diff --git a/modular_pentest/modules/robots/code/med_borg.dm b/modular_pentest/modules/robots/code/med_borg.dm
index b34765ba052..3bc2dfdb538 100644
--- a/modular_pentest/modules/robots/code/med_borg.dm
+++ b/modular_pentest/modules/robots/code/med_borg.dm
@@ -130,7 +130,7 @@
desc = "An upgrade to the Medical module's hypospray, allowing it \
to treat a wider range of conditions and problems."
additional_reagents = list(/datum/reagent/medicine/mannitol, /datum/reagent/medicine/oculine, /datum/reagent/medicine/inacusiate,
- /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/oxandrolone, /datum/reagent/medicine/sal_acid, /datum/reagent/medicine/rezadone,
+ /datum/reagent/medicine/mutadone, /datum/reagent/medicine/haloperidol, /datum/reagent/medicine/ysiltane, /datum/reagent/medicine/silfrine, /datum/reagent/medicine/rezadone,
/datum/reagent/medicine/pen_acid)
//
From 0ee6f08d50fa8aacfe26c0d9f46930ae043ea463 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Sat, 14 Mar 2026 03:50:01 -0700
Subject: [PATCH 26/52] Final corrections
---
.../code/medical_reagents/medicine_reagents.dm | 2 +-
.../chemistry/code/recipes/medical_reactions.dm | 12 ++++++------
2 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index 9f833db7512..e4f647ff519 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -32,7 +32,7 @@
/datum/reagent/medicine/cureall
name = "Tricordrazine"
- description = "A potent stimulant commonly used in resuscitation. Slowly restores all types of damage.
+ description = "A potent stimulant commonly used in resuscitation. Slowly restores all types of damage."
// Dylovene was reflavored into Pancrazine. This corrects their mistake in desc.
diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
index 6d947b0c196..6d549952ebb 100644
--- a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
+++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
@@ -19,7 +19,7 @@
/datum/chemical_reaction/regen_jelly
results = list(/datum/reagent/medicine/regen_jelly = 1)
- required_reagents = list(/datum/reagent/medicine/tricordrazine = 1, /datum/reagent/toxin/slimejelly = 1)
+ required_reagents = list(/datum/reagent/medicine/cureall = 1, /datum/reagent/toxin/slimejelly = 1)
/datum/chemical_reaction/regen_jelly2
results = list(/datum/reagent/medicine/regen_jelly = 2)
@@ -37,7 +37,7 @@
/datum/chemical_reaction/skele_boon
results = list(/datum/reagent/medicine/skeletons_boon = 5)
- required_reagents = list(/datum/reagent/medicine/lavaland_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5)
+ required_reagents = list(/datum/reagent/medicine/hunter_extract = 1, /datum/reagent/medicine/bonefixingjuice = 1, /datum/reagent/titanium = 5)
/*
Brute Medicine
@@ -48,7 +48,7 @@
required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/oxygen = 1, /datum/reagent/consumable/sugar = 1)
/datum/chemical_reaction/helbital
- results = list(/datum/reagent/medicine/c2/helbital = 3)
+ results = list(/datum/reagent/medicine/helbital = 3)
required_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/fluorine = 1, /datum/reagent/carbon = 1)
mix_message = "The mixture turns into a thick, yellow powder."
@@ -61,7 +61,7 @@
required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1)
/datum/chemical_reaction/aiuri
- results = list(/datum/reagent/medicine/c2/aiuri = 4)
+ results = list(/datum/reagent/medicine/aiuri = 4)
required_reagents = list(/datum/reagent/ammonia = 1, /datum/reagent/toxin/acid = 1, /datum/reagent/hydrogen = 2)
/*
@@ -73,7 +73,7 @@
required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
/datum/chemical_reaction/multiver
- results = list(/datum/reagent/medicine/c2/multiver = 2)
+ results = list(/datum/reagent/medicine/multiver = 2)
required_reagents = list(/datum/reagent/ash = 1, /datum/reagent/consumable/sodiumchloride = 1)
mix_message = "The mixture yields a fine black powder."
required_temp = 380
@@ -89,6 +89,6 @@
mix_message = "The mixture rapidly turns into a dense pink liquid."
/datum/chemical_reaction/tirimol
- results = list(/datum/reagent/medicine/c2/tirimol = 5)
+ results = list(/datum/reagent/medicine/tirimol = 5)
required_reagents = list(/datum/reagent/nitrogen = 3, /datum/reagent/acetone = 2)
required_catalysts = list(/datum/reagent/toxin/acid = 1)
From 133bc174c49561438bd49f301358a1901ebbb7b1 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 00:58:51 -0700
Subject: [PATCH 27/52] Corrects 2 pentest maps while I work on the changelog
---
_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm | 2 +-
_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm | 4 ----
2 files changed, 1 insertion(+), 5 deletions(-)
diff --git a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
index 8681a4a0bb4..d977486b5f8 100644
--- a/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
+++ b/_maps/PentestMaps/LavaRuins/lavaland_surface_codelab.dmm
@@ -2493,7 +2493,7 @@
/obj/structure/closet/crate/medical{
anchored = 1
},
-/obj/item/reagent_containers/syringe/thializid,
+/obj/item/reagent_containers/syringe/pancrazine,
/turf/open/floor/plasteel/tech,
/area/ruin/unpowered/codelab/storage)
"DZ" = (
diff --git a/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm b/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm
index 6f117b97223..6d157b82ddf 100644
--- a/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm
+++ b/_maps/PentestMaps/RockRuins/rockplanet_nomadcrash.dmm
@@ -917,10 +917,6 @@
/obj/effect/turf_decal/techfloor{
dir = 1
},
-/obj/structure/cursed_money{
- pixel_x = 3;
- pixel_y = 10
- },
/turf/open/floor/plasteel/tech,
/area/ruin/rockplanet/nomad)
"Me" = (
From f8f851b071ff779df5c21f202f1b24ad4211340c Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 01:27:41 -0700
Subject: [PATCH 28/52] updated references to non existant chems
---
_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm | 2 +-
code/datums/diseases/tuberculosis.dm | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm b/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm
index 291c80de6a1..7f11e3e9dfc 100644
--- a/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm
+++ b/_maps/PentestMaps/JungleRuins/jungle_medtech_outbreak.dmm
@@ -372,7 +372,7 @@
"hF" = (
/obj/effect/decal/cleanable/dirt/dust,
/obj/item/paper{
- default_raw_text = "Export expectations
By the end of the month facility No.475-24 is expected to provide the following amounts of medicine to be ready for export:
- 300u of Perfluorodecalin
- 270u of Thializid
- 50 Burnpatches
- 65 Synthflesh patches
- 275u of atropine
Production is to be proceeded with imidiately.
";
+ default_raw_text = "Export expectations
By the end of the month facility No.475-24 is expected to provide the following amounts of medicine to be ready for export:
- 300u of Panacea
- 270u of Thializid
- 50 Burnpatches
- 65 Synthflesh patches
- 275u of atropine
Production is to be proceeded with imidiately.
";
name = "Export orders";
pixel_x = 4;
pixel_y = 5
diff --git a/code/datums/diseases/tuberculosis.dm b/code/datums/diseases/tuberculosis.dm
index 007b530d06c..713dada975d 100644
--- a/code/datums/diseases/tuberculosis.dm
+++ b/code/datums/diseases/tuberculosis.dm
@@ -3,7 +3,7 @@
name = "Fungal tuberculosis"
max_stages = 5
spread_text = "Airborne"
- cure_text = "Spaceacillin & Perfluorodecalin"
+ cure_text = "Spaceacillin & Salbutamol"
cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/salbutamol)
agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
From 36dffabccb18ba1c4eb5609a1d2977efb8aa7114 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 02:11:54 -0700
Subject: [PATCH 29/52] fixing more pentest bad paths
---
.../LavaRuins/lavaland_surface_secretnightclub.dmm | 1 -
.../SandRuins/whitesands_surface_medipen_plant.dmm | 4 ++--
2 files changed, 2 insertions(+), 3 deletions(-)
diff --git a/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm b/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm
index 7fecf3bfe5c..05d165c5e4e 100644
--- a/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm
+++ b/_maps/PentestMaps/LavaRuins/lavaland_surface_secretnightclub.dmm
@@ -210,7 +210,6 @@
/area/ruin/unpowered)
"fY" = (
/obj/structure/closet/crate/miningcar,
-/obj/item/storage/pill_bottle/mining,
/obj/item/storage/belt/mining/primitive,
/obj/item/pickaxe/improvised,
/turf/open/floor/plating/asteroid/basalt,
diff --git a/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm b/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm
index 3610147858a..ece9a7b8ea2 100644
--- a/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm
+++ b/_maps/PentestMaps/SandRuins/whitesands_surface_medipen_plant.dmm
@@ -278,7 +278,7 @@
/turf/open/floor/plasteel,
/area/ruin/powered)
"gy" = (
-/obj/item/reagent_containers/hypospray/medipen/oxandrolone,
+/obj/item/reagent_containers/hypospray/medipen/ysiltane,
/turf/open/floor/plating{
icon_state = "platingdmg2"
},
@@ -410,7 +410,7 @@
/area/ruin/powered)
"jh" = (
/obj/structure/rack,
-/obj/item/reagent_containers/hypospray/medipen/salacid{
+/obj/item/reagent_containers/hypospray/medipen/silfrine{
pixel_x = 3;
pixel_y = -3
},
From 5b064e9bda573b671528abb4a202ada5d45f5ccf Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 02:19:05 -0700
Subject: [PATCH 30/52] fixes removed chem
---
_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm | 5 +----
_maps/PentestMaps/Shuttles/independent/independent_box.dmm | 5 +----
.../Shuttles/independent/independent_tranquility.dmm | 5 +----
.../PentestMaps/Shuttles/independent/independent_wyvern.dmm | 4 +---
.../PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm | 5 +----
_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm | 4 +---
_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm | 5 +----
7 files changed, 7 insertions(+), 26 deletions(-)
diff --git a/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm b/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm
index 79e3e5274c7..f5b561bda1e 100644
--- a/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm
+++ b/_maps/PentestMaps/Shuttles/horizon/horizon_apis.dmm
@@ -1247,10 +1247,7 @@
pixel_x = 5;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/item/storage/box/bodybags,
/obj/structure/cable{
icon_state = "1-8"
diff --git a/_maps/PentestMaps/Shuttles/independent/independent_box.dmm b/_maps/PentestMaps/Shuttles/independent/independent_box.dmm
index a03bd80f442..81e836d85b8 100644
--- a/_maps/PentestMaps/Shuttles/independent/independent_box.dmm
+++ b/_maps/PentestMaps/Shuttles/independent/independent_box.dmm
@@ -429,10 +429,7 @@
pixel_x = -3;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/structure/closet/secure_closet{
icon_state = "med";
name = "medicine locker"
diff --git a/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm b/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm
index 9713cc80cc7..5ffd2054739 100644
--- a/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm
+++ b/_maps/PentestMaps/Shuttles/independent/independent_tranquility.dmm
@@ -3404,10 +3404,7 @@
pixel_x = 5;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/item/reagent_containers/syringe,
/obj/effect/turf_decal/borderfloorwhite{
dir = 10
diff --git a/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm b/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm
index 0bb1a9f3516..d0ebc5f1f85 100644
--- a/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm
+++ b/_maps/PentestMaps/Shuttles/independent/independent_wyvern.dmm
@@ -387,9 +387,7 @@
pixel_x = 8;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle";
+/obj/item/reagent_containers/glass/bottle/gjalrazine{
pixel_x = 5
},
/obj/structure/closet/secure_closet/wall/directional/east{
diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm
index cfbe09ef66b..7aad5845d9d 100644
--- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm
+++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_cheyenne.dmm
@@ -8503,10 +8503,7 @@
},
/obj/item/clothing/gloves/color/latex/nitrile,
/obj/item/storage/box/rxglasses,
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid = 30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/item/reagent_containers/glass/bottle{
list_reagents = list(/datum/reagent/medicine/rezadone = 30);
name = "rezadone bottle";
diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm
index ebd19a99f25..f3b112d7391 100644
--- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm
+++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_osprey.dmm
@@ -5136,9 +5136,7 @@
pixel_x = 8;
pixel_y = 8
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle";
+/obj/item/reagent_containers/glass/bottle/gjalrazine{
pixel_x = 5
},
/obj/effect/turf_decal/industrial/warning/corner{
diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm
index 934d78c7f87..b0da4c52f04 100644
--- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm
+++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_skipper.dmm
@@ -1471,10 +1471,7 @@
/obj/item/storage/pill_bottle/charcoal/less{
pixel_x = -9
},
-/obj/item/reagent_containers/glass/bottle{
- list_reagents = list(/datum/reagent/medicine/thializid=30);
- name = "thializid bottle"
- },
+/obj/item/reagent_containers/glass/bottle/gjalrazine,
/obj/item/reagent_containers/glass/bottle/formaldehyde{
pixel_x = 6;
pixel_y = 8
From 3e87ecc8db11c66b22ed847987700fe30995c799 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 02:22:24 -0700
Subject: [PATCH 31/52] another fix, i wish the github would just give me all
of the errors at the same time
---
_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm
index 23206514aac..eadcde18571 100644
--- a/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm
+++ b/_maps/PentestMaps/Shuttles/nanotrasen/nanotrasen_heron.dmm
@@ -4152,7 +4152,7 @@
/obj/effect/decal/cleanable/vomit/old,
/obj/effect/decal/cleanable/dirt/dust,
/obj/structure/closet/wall/directional/west,
-/obj/item/reagent_containers/syringe/contraband/fentanyl{
+/obj/item/reagent_containers/syringe/contraband/morphine{
pixel_x = -3;
pixel_y = 4
},
From b681e9ab7350774e5d2ffc1a4c041947bc05aaad Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Tue, 17 Mar 2026 02:27:41 -0700
Subject: [PATCH 32/52] another fix... god is it over yet?
---
_maps/PentestMaps/SpaceRuins/cryocontainment.dmm | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm b/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm
index 40062ccfb8a..2aa222e06a5 100644
--- a/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm
+++ b/_maps/PentestMaps/SpaceRuins/cryocontainment.dmm
@@ -761,7 +761,7 @@
/area/ruin/unpowered)
"CL" = (
/obj/structure/table/chem,
-/obj/item/reagent_containers/glass/beaker/large/styptic,
+/obj/item/reagent_containers/glass/beaker/large/epinephrine,
/obj/item/stock_parts/micro_laser/high,
/turf/open/floor/plasteel/dark/airless,
/area/ruin/unpowered)
@@ -1374,7 +1374,7 @@
/area/ruin/unpowered)
"WS" = (
/obj/structure/table/chem,
-/obj/item/reagent_containers/glass/beaker/large/silver_sulfadiazine,
+/obj/item/reagent_containers/glass/beaker/large/hadrakine,
/obj/machinery/light/dim/directional/north,
/turf/open/floor/plasteel/dark/airless,
/area/ruin/unpowered)
From 1c4474c4a893c26ec7e1538afc4fadfabb8f1089 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Thu, 19 Mar 2026 03:19:42 -0700
Subject: [PATCH 33/52] corrects me being stupid
---
.../code/medical_reagents/medicine_reagents.dm | 10 +++++-----
.../chemistry/code/recipes/medical_reactions.dm | 6 +++---
2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index e4f647ff519..1cef920afc3 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -417,19 +417,19 @@
overdose_threshold = 30
taste_description = "a roll of gauze"
-/datum/reagent/medicine/dylovine/on_mob_life(mob/living/carbon/M)
+/datum/reagent/medicine/dylovene/on_mob_life(mob/living/carbon/M)
M.adjustToxLoss(-0.5*REM, 0)
for(var/datum/reagent/toxin/R in M.reagents.reagent_list)
M.reagents.remove_reagent(R.type,1)
..()
. = 1
-/datum/reagent/medicine/dylovine/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
+/datum/reagent/medicine/dylovene/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
. = ..()
if(chems.has_reagent(type, 1))
mytray.adjustToxic(-round(chems.get_reagent_amount(type) * 2))
-/datum/reagent/medicine/dylovine/overdose_process(mob/living/M)
+/datum/reagent/medicine/dylovene/overdose_process(mob/living/M)
M.adjustToxLoss(2*REM, 0) // End result is 1.5 toxin loss taken, because it heals 0.5 and then removes 2.
..()
. = 1
@@ -478,7 +478,7 @@
harmful = TRUE
metabolization_rate = 0.2
-/datum/reagent/medicine/c2/convermol/on_mob_life(mob/living/carbon/human/M)
+/datum/reagent/medicine/convermol/on_mob_life(mob/living/carbon/human/M)
var/oxycalc = 2.5*REM*current_cycle
if(!overdosed)
oxycalc = min(oxycalc,M.getOxyLoss()+0.5) //if NOT overdosing, we lower our toxdamage to only the damage we actually healed with a minimum of 0.1*current_cycle. IE if we only heal 10 oxygen damage but we COULD have healed 20, we will only take toxdamage for the 10. We would take the toxdamage for the extra 10 if we were overdosing.
@@ -489,7 +489,7 @@
..()
return TRUE
-/datum/reagent/medicine/c2/convermol/overdose_process(mob/living/carbon/human/M)
+/datum/reagent/medicine/convermol/overdose_process(mob/living/carbon/human/M)
metabolization_rate += 1
..()
return TRUE
diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
index 6d549952ebb..cfde9009f2b 100644
--- a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
+++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
@@ -68,8 +68,8 @@
Toxin Medicine
*/
-/datum/chemical_reaction/dylovine
- results = list(/datum/reagent/medicine/dylovine = 3)
+/datum/chemical_reaction/dylovene
+ results = list(/datum/reagent/medicine/dylovene = 3)
required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
/datum/chemical_reaction/multiver
@@ -83,7 +83,7 @@
*/
/datum/chemical_reaction/convermol
- results = list(/datum/reagent/medicine/c2/convermol = 3)
+ results = list(/datum/reagent/medicine/convermol = 3)
required_reagents = list(/datum/reagent/hydrogen = 1, /datum/reagent/fluorine = 1, /datum/reagent/fuel/oil = 1)
required_temp = 370
mix_message = "The mixture rapidly turns into a dense pink liquid."
From 551536c8a42ebc3ff5339950fbcc16afcd039fad Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Fri, 20 Mar 2026 00:11:19 -0700
Subject: [PATCH 34/52] changed some recipies slightly to try and apease the
linter
---
.../chemistry/code/recipes/medical_reactions.dm | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
index cfde9009f2b..53a23458d4d 100644
--- a/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
+++ b/modular_pentest/modules/chemistry/code/recipes/medical_reactions.dm
@@ -2,7 +2,16 @@
Modularization
*/
-//
+/datum/chemical_reaction/charcoal
+ results = list(/datum/reagent/medicine/charcoal = 1)
+ required_reagents = list(/datum/reagent/ash = 3, /datum/reagent/oxygen = 1)
+ mix_message = "The mixture turns into a fine black powder."
+
+/datum/chemical_reaction/charcoal2
+ results = list(/datum/reagent/medicine/charcoal = 2)
+ required_reagents = list(/datum/reagent/ash = 2, /datum/reagent/water = 5)
+ mix_message = "The mixture turns into a fine black powder."
+ required_temp = 800
/*
Clone Healing
@@ -58,7 +67,7 @@
/datum/chemical_reaction/kelotane
results = list(/datum/reagent/medicine/kelotane = 2)
- required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1)
+ required_reagents = list(/datum/reagent/carbon = 1, /datum/reagent/silicon = 1, /datum/reagent/oxygen = 1)
/datum/chemical_reaction/aiuri
results = list(/datum/reagent/medicine/aiuri = 4)
@@ -70,7 +79,7 @@
/datum/chemical_reaction/dylovene
results = list(/datum/reagent/medicine/dylovene = 3)
- required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/silicon = 1, /datum/reagent/potassium = 1)
+ required_reagents = list(/datum/reagent/nitrogen = 1, /datum/reagent/carbon = 1, /datum/reagent/potassium = 1)
/datum/chemical_reaction/multiver
results = list(/datum/reagent/medicine/multiver = 2)
From c3af4d548b7ddd52b6fc8a35b64541deec72864f Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 02:09:44 -0700
Subject: [PATCH 35/52] Chem, Medical, Drinks, Mecha wikia guides
---
code/modules/reagents/chemistry/reagents.dm | 2 +
modular_pentest/modules/catalog/README.md | 72 +++
modular_pentest/modules/catalog/catalog.dm | 125 +++++
.../modules/catalog/mecha_extraction.dm | 191 ++++++++
.../modules/catalog/reagent_categories.dm | 81 ++++
modular_pentest/~pentest.dme | 3 +
tgui/packages/tgui/interfaces/NtosCatalog.js | 430 ++++++++++++++++++
7 files changed, 904 insertions(+)
create mode 100644 modular_pentest/modules/catalog/README.md
create mode 100644 modular_pentest/modules/catalog/catalog.dm
create mode 100644 modular_pentest/modules/catalog/mecha_extraction.dm
create mode 100644 modular_pentest/modules/catalog/reagent_categories.dm
create mode 100644 tgui/packages/tgui/interfaces/NtosCatalog.js
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index dac196e5e4b..329cdeac585 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -70,6 +70,8 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/metabolizing = FALSE
/// is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default.
var/harmful = FALSE
+ /// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "hidden", etc.
+ var/catalog_category = "chemistry"
/// Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New()
var/datum/material/material
// What can process this? ORGANIC, SYNTHETIC, or ORGANIC | SYNTHETIC?. We'll assume by default that it affects organics.
diff --git a/modular_pentest/modules/catalog/README.md b/modular_pentest/modules/catalog/README.md
new file mode 100644
index 00000000000..35ff8fb5d79
--- /dev/null
+++ b/modular_pentest/modules/catalog/README.md
@@ -0,0 +1,72 @@
+# NanoPedia System
+
+NanoTrasen's comprehensive in-game reference system for Pentest. Provides players with a wiki-like interface accessible through PDAs, laptops, and modular computers.
+
+## Overview
+
+NanoPedia (NanoTrasen Wikipedia) is designed to help players learn about game mechanics when external wiki access is unavailable. It features categorized information with an intuitive search and filter system.
+
+## Current Features
+
+### Chemistry Reference
+- **Organized Categories:**
+ - Medical: Medicines and medical chemicals
+ - Chemistry: Industrial chemicals, toxins, and reagents
+ - Drinks: Alcoholic and non-alcoholic beverages
+ - Hidden: Basic elements and admin-only reagents (not shown)
+- **Chemical Information:**
+ - Name and description
+ - Complete recipes showing required reagents and amounts
+ - Catalyst requirements
+ - Result amounts
+ - Temperature requirements (hot or cold reactions)
+- **Color-coded dividers** between entries by category (blue=medical, green=chemistry, orange=drinks)
+- **Search functionality** to quickly find specific chemicals
+- **Category filtering** to narrow down results
+
+## Files
+
+- `catalog.dm` - Backend program file that collects and formats data
+- `reagent_categories.dm` - Catalog category assignments for reagents
+- `tgui/packages/tgui/interfaces/NtosCatalog.js` - Frontend TGUI interface
+
+## Usage
+
+1. Download and install the "NanoPedia" program (4GQ) from NTNet
+2. Launch the program on any compatible device
+3. Select a category filter (All, Medical, Chemistry, or Drinks)
+4. Use the search bar to find specific chemicals
+5. View detailed recipes and information
+
+## Catalog Categories
+
+Reagents can be assigned one of the following catalog categories:
+- `medical` - Medical chemicals and medicines
+- `chemistry` - Industrial/general chemistry reagents
+- `drinks` - Beverages (alcoholic and non-alcoholic)
+- `hidden` - Not shown in catalog (basic elements, admin reagents, etc.)
+
+To categorize a new reagent, set its `catalog_category` variable in `reagent_categories.dm`.
+
+## Future Expansion
+
+The framework is designed to be extensible. Future catalogs could include:
+- Equipment specifications
+- Job guides and SOPs
+- Ship information
+- Research node details
+- Cooking recipes
+
+To add a new catalog view:
+1. Add a new view button in the TGUI interface
+2. Create a corresponding data collection proc in the backend
+3. Add a new display component in the JS file
+
+## Technical Notes
+
+- Program size: 4GQ (small for fast testing)
+- Works on all device types via `usage_flags = PROGRAM_ALL`
+- Available for download via NTNet
+- Does not require network connectivity to run (`requires_ntnet = FALSE`)
+- Pulls data directly from game globals (`GLOB.chemical_reagents_list` and `GLOB.chemical_reactions_list`)
+- Added `catalog_category` variable to base `/datum/reagent` for categorization system
diff --git a/modular_pentest/modules/catalog/catalog.dm b/modular_pentest/modules/catalog/catalog.dm
new file mode 100644
index 00000000000..0c773aac22a
--- /dev/null
+++ b/modular_pentest/modules/catalog/catalog.dm
@@ -0,0 +1,125 @@
+// NanoPedia - NanoTrasen's comprehensive reference system
+// An in-game wiki providing information on chemicals, equipment, and procedures
+
+/datum/computer_file/program/catalog
+ filename = "nanopedia"
+ filedesc = "NanoPedia"
+ program_icon_state = "generic"
+ extended_desc = "NanoTrasen's comprehensive reference database. Access information on chemistry, equipment specifications, and standard procedures. Your portable wiki for when you can't remember that one recipe."
+ requires_ntnet = FALSE
+ size = 4
+ tgui_id = "NtosCatalog"
+ program_icon = "book"
+ usage_flags = PROGRAM_ALL
+ available_on_ntnet = TRUE
+
+ /// Current catalog view (chemistry, medical, drinks, equipment, etc.)
+ var/current_view = "chemistry"
+ /// Search query
+ var/search_query = ""
+
+/datum/computer_file/program/catalog/ui_data(mob/user)
+ var/list/data = get_header_data()
+
+ data["current_view"] = current_view
+ data["search_query"] = search_query
+
+ // Chemistry catalog data (for chemistry, medical, and drinks views)
+ if(current_view in list("chemistry", "medical", "drinks"))
+ data["chemicals"] = get_chemistry_data()
+
+ // Mecha catalog data
+ if(current_view == "mechs")
+ data["mechas"] = get_mecha_data()
+
+ return data
+
+/datum/computer_file/program/catalog/ui_act(action, params)
+ . = ..()
+ if(.)
+ return
+
+ switch(action)
+ if("change_view")
+ current_view = params["view"]
+ return TRUE
+ if("search")
+ search_query = params["query"]
+ return TRUE
+ if("clear_search")
+ search_query = ""
+ return TRUE
+
+/// Gets all chemistry data including reagents and their recipes
+/datum/computer_file/program/catalog/proc/get_chemistry_data()
+ var/list/chemicals = list()
+
+ // Iterate through all reagents
+ for(var/reagent_type in GLOB.chemical_reagents_list)
+ var/datum/reagent/reagent = GLOB.chemical_reagents_list[reagent_type]
+
+ // Skip if view filter doesn't match the reagent category
+ if(reagent.catalog_category != current_view)
+ continue
+
+ // Skip hidden reagents
+ if(reagent.catalog_category == "hidden")
+ continue
+
+ // Skip if searching and name doesn't match
+ if(search_query && !findtext(lowertext(reagent.name), lowertext(search_query)))
+ continue
+
+ var/list/reagent_data = list()
+ reagent_data["name"] = reagent.name
+ reagent_data["description"] = reagent.description
+ reagent_data["category"] = reagent.catalog_category
+
+ // Find recipes that create this reagent
+ var/list/recipes = list()
+ for(var/reaction_id in GLOB.chemical_reactions_list)
+ var/list/reactions = GLOB.chemical_reactions_list[reaction_id]
+ for(var/datum/chemical_reaction/reaction in reactions)
+ // Check if this reaction produces our reagent
+ if(reagent_type in reaction.results)
+ var/list/recipe_data = list()
+
+ // Required reagents
+ var/list/required = list()
+ for(var/req_type in reaction.required_reagents)
+ var/req_amount = reaction.required_reagents[req_type]
+ var/datum/reagent/req_reagent = GLOB.chemical_reagents_list[req_type]
+ if(req_reagent)
+ required += list(list(
+ "name" = req_reagent.name,
+ "amount" = req_amount
+ ))
+ recipe_data["required"] = required
+
+ // Catalysts
+ var/list/catalysts = list()
+ if(reaction.required_catalysts)
+ for(var/cat_type in reaction.required_catalysts)
+ var/cat_amount = reaction.required_catalysts[cat_type]
+ var/datum/reagent/cat_reagent = GLOB.chemical_reagents_list[cat_type]
+ if(cat_reagent)
+ catalysts += list(list(
+ "name" = cat_reagent.name,
+ "amount" = cat_amount
+ ))
+ recipe_data["catalysts"] = catalysts
+
+ // Result amount
+ recipe_data["produces"] = reaction.results[reagent_type]
+
+ // Temperature requirements
+ if(reaction.required_temp)
+ recipe_data["temperature"] = reaction.required_temp
+ recipe_data["is_cold"] = reaction.is_cold_recipe
+
+ recipes += list(recipe_data)
+
+ reagent_data["recipes"] = recipes
+ chemicals += list(reagent_data)
+
+ return chemicals
diff --git a/modular_pentest/modules/catalog/mecha_extraction.dm b/modular_pentest/modules/catalog/mecha_extraction.dm
new file mode 100644
index 00000000000..975ddb8b1c3
--- /dev/null
+++ b/modular_pentest/modules/catalog/mecha_extraction.dm
@@ -0,0 +1,191 @@
+// NanoPedia - Mecha construction data extraction
+// Automatically extracts mecha build instructions from construction datums and mechfab designs
+
+/// Gets all mecha construction data by parsing construction datums and fabricator designs
+/datum/computer_file/program/catalog/proc/get_mecha_data()
+ var/list/mechas = list()
+
+ // Define mecha types we want to catalog
+ var/list/mecha_constructions = list(
+ /datum/component/construction/mecha/ripley = list("name" = "APLU Ripley MK-I", "category" = "working"),
+ /datum/component/construction/mecha/firefighter = list("name" = "APLU Firefighter", "category" = "working"),
+ /datum/component/construction/mecha/gygax = list("name" = "Gygax 501p Security Exosuit", "category" = "combat"),
+ /datum/component/construction/mecha/durand = list("name" = "Durand Combat Exosuit", "category" = "combat"),
+ /datum/component/construction/mecha/odysseus = list("name" = "Odysseus 200 Series", "category" = "medical"),
+ /datum/component/construction/mecha/phazon = list("name" = "Phazon Exosuit", "category" = "advanced"),
+ /datum/component/construction/mecha/honker = list("name" = "H.O.N.K Mech", "category" = "clown")
+ )
+
+ for(var/construction_type in mecha_constructions)
+ var/list/mecha_info = mecha_constructions[construction_type]
+
+ // Skip if searching and name doesn't match
+ if(search_query && !findtext(lowertext(mecha_info["name"]), lowertext(search_query)))
+ continue
+
+ var/list/mecha_data = list()
+ mecha_data["name"] = mecha_info["name"]
+ mecha_data["category"] = mecha_info["category"]
+ mecha_data["type"] = construction_type
+
+ // Extract construction steps
+ mecha_data["parts"] = get_required_parts(construction_type)
+ mecha_data["assembly_steps"] = get_assembly_steps(construction_type)
+ mecha_data["materials"] = get_materials_breakdown(construction_type)
+
+ mechas += list(mecha_data)
+
+ return mechas
+
+/// Gets the list of parts that need to be fabricated
+/datum/computer_file/program/catalog/proc/get_required_parts(construction_type)
+ var/list/parts = list()
+
+ // Map construction types to their chassis types
+ var/list/chassis_map = list(
+ /datum/component/construction/mecha/ripley = /datum/component/construction/unordered/mecha_chassis/ripley,
+ /datum/component/construction/mecha/firefighter = /datum/component/construction/unordered/mecha_chassis/firefighter,
+ /datum/component/construction/mecha/gygax = /datum/component/construction/unordered/mecha_chassis/gygax,
+ /datum/component/construction/mecha/durand = /datum/component/construction/unordered/mecha_chassis/durand,
+ /datum/component/construction/mecha/odysseus = /datum/component/construction/unordered/mecha_chassis/odysseus,
+ /datum/component/construction/mecha/phazon = /datum/component/construction/unordered/mecha_chassis/phazon,
+ /datum/component/construction/mecha/honker = /datum/component/construction/unordered/mecha_chassis/honker
+ )
+
+ var/chassis_type = chassis_map[construction_type]
+ if(!chassis_type)
+ return parts
+
+ // Get chassis parts from the unordered construction datum
+ var/datum/component/construction/unordered/mecha_chassis/chassis = new chassis_type()
+
+ // Add chassis itself
+ var/list/chassis_data = list()
+ chassis_data["name"] = "Chassis"
+ chassis_data["type"] = "chassis"
+ parts += list(chassis_data)
+
+ // Add required limb parts
+ if(chassis.steps)
+ for(var/part_type in chassis.steps)
+ var/obj/item/mecha_parts/part/part = part_type
+ var/list/part_data = list()
+ part_data["name"] = initial(part.name)
+ part_data["type"] = "part"
+ parts += list(part_data)
+
+ qdel(chassis)
+ return parts
+
+/// Parses assembly steps from the construction datum
+/datum/computer_file/program/catalog/proc/get_assembly_steps(construction_type)
+ var/list/steps = list()
+
+ // Create temporary instance to read step data
+ var/datum/component/construction/mecha/construction = new construction_type()
+
+ var/list/all_steps = construction.get_steps()
+ var/step_num = 1
+
+ for(var/list/step_data in all_steps)
+ var/list/step = list()
+ step["number"] = step_num++
+
+ // Determine what tool or item is needed
+ if(step_data["key"])
+ var/key = step_data["key"]
+
+ // Check if it's a tool define
+ if(key == TOOL_WRENCH)
+ step["tool"] = "Wrench"
+ step["action"] = "Use wrench"
+ else if(key == TOOL_SCREWDRIVER)
+ step["tool"] = "Screwdriver"
+ step["action"] = "Use screwdriver"
+ else if(key == TOOL_WELDER)
+ step["tool"] = "Welding Tool"
+ step["action"] = "Weld"
+ else if(key == TOOL_WIRECUTTER)
+ step["tool"] = "Wirecutter"
+ step["action"] = "Cut wires"
+ else if(key == TOOL_CROWBAR)
+ step["tool"] = "Crowbar"
+ step["action"] = "Pry"
+ else if(ispath(key))
+ // It's an item type
+ var/obj/item/item = key
+ step["item"] = initial(item.name)
+
+ // Special case for bikehorns (H.O.N.K mech)
+ if(ispath(key, /obj/item/bikehorn))
+ step["tool"] = "Bike Horn"
+ step["action"] = "Honk Chassis with Bike Horn"
+ else if(step_data["amount"])
+ step["amount"] = step_data["amount"]
+ step["action"] = "Add [step_data["amount"]]x [initial(item.name)]"
+ else
+ step["action"] = "Add [initial(item.name)]"
+
+ steps += list(step)
+
+ qdel(construction)
+ return steps
+
+/// Calculates total materials needed for all parts
+/datum/computer_file/program/catalog/proc/get_materials_breakdown(construction_type)
+ var/list/materials = list()
+
+ // Map construction types to their design categories
+ // Some mechs have multiple category names (base game vs modular overrides)
+ var/list/category_map = list(
+ /datum/component/construction/mecha/ripley = list("Ripley"),
+ /datum/component/construction/mecha/firefighter = list("Firefighter"),
+ /datum/component/construction/mecha/gygax = list("500 Series", "Gygax 500 Series"),
+ /datum/component/construction/mecha/durand = list("Durand"),
+ /datum/component/construction/mecha/odysseus = list("200 Series", "Odysseus 200 Series"),
+ /datum/component/construction/mecha/phazon = list("Phazon"),
+ /datum/component/construction/mecha/honker = list("H.O.N.K")
+ )
+
+ var/list/categories = category_map[construction_type]
+ if(!categories)
+ return materials
+
+ // Aggregate materials from all designs in this category
+ var/list/material_totals = list()
+
+ for(var/design_id in SSresearch.techweb_designs)
+ var/datum/design/design = SSresearch.techweb_designs[design_id]
+
+ // Check if this design is for our mecha
+ if(design.build_type != MECHFAB)
+ continue
+
+ // Check if any of our category names match
+ var/category_match = FALSE
+ for(var/category in categories)
+ if(category in design.category)
+ category_match = TRUE
+ break
+
+ if(!category_match)
+ continue
+
+ // Add materials from this design
+ for(var/material in design.materials)
+ var/datum/material/mat = material
+ var/mat_name = initial(mat.name)
+
+ if(!material_totals[mat_name])
+ material_totals[mat_name] = 0
+
+ material_totals[mat_name] += design.materials[material]
+
+ // Convert to list format
+ for(var/mat_name in material_totals)
+ var/list/mat_data = list()
+ mat_data["name"] = mat_name
+ mat_data["amount"] = material_totals[mat_name]
+ materials += list(mat_data)
+
+ return materials
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
new file mode 100644
index 00000000000..f653199f480
--- /dev/null
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -0,0 +1,81 @@
+// NanoPedia - Reagent catalog categorization
+// Sets catalog categories for reagents to organize them in the NanoPedia interface
+// Categories: "medical", "chemistry", "drinks", "hidden"
+
+// Medical reagents - things a medical chemist would make
+/datum/reagent/medicine/catalog_category = "medical"
+
+// Drinks - alcoholic and non-alcoholic beverages
+/datum/reagent/consumable/ethanol/catalog_category = "drinks"
+/datum/reagent/consumable/juice/catalog_category = "drinks"
+/datum/reagent/consumable/coffee/catalog_category = "drinks"
+/datum/reagent/consumable/tea/catalog_category = "drinks"
+/datum/reagent/consumable/hot_coco/catalog_category = "drinks"
+/datum/reagent/consumable/sodawater/catalog_category = "drinks"
+/datum/reagent/consumable/space_cola/catalog_category = "drinks"
+/datum/reagent/consumable/nuka_cola/catalog_category = "drinks"
+/datum/reagent/consumable/doctor_delight/catalog_category = "drinks"
+/datum/reagent/consumable/red_queen/catalog_category = "drinks"
+/datum/reagent/consumable/triple_citrus/catalog_category = "drinks"
+/datum/reagent/consumable/grape_soda/catalog_category = "drinks"
+/datum/reagent/consumable/milk/catalog_category = "drinks"
+/datum/reagent/consumable/soymilk/catalog_category = "drinks"
+/datum/reagent/consumable/cafe_latte/catalog_category = "drinks"
+
+// Drugs - recreational/illegal substances
+/datum/reagent/drug/catalog_category = "chemistry"
+
+// Toxins
+/datum/reagent/toxin/catalog_category = "chemistry"
+
+// Basic chemistry reagents that aren't medicines or drinks
+/datum/reagent/fuel/catalog_category = "chemistry"
+/datum/reagent/lube/catalog_category = "chemistry"
+/datum/reagent/space_cleaner/catalog_category = "chemistry"
+/datum/reagent/acetone/catalog_category = "chemistry"
+/datum/reagent/ammonia/catalog_category = "chemistry"
+/datum/reagent/diethylamine/catalog_category = "chemistry"
+/datum/reagent/oil/catalog_category = "chemistry"
+/datum/reagent/phenol/catalog_category = "chemistry"
+/datum/reagent/ash/catalog_category = "chemistry"
+/datum/reagent/saltpetre/catalog_category = "chemistry"
+/datum/reagent/lye/catalog_category = "chemistry"
+
+// Hide basic elements and materials unless they have specific uses
+/datum/reagent/hydrogen/catalog_category = "hidden"
+/datum/reagent/oxygen/catalog_category = "hidden"
+/datum/reagent/nitrogen/catalog_category = "hidden"
+/datum/reagent/carbon/catalog_category = "hidden"
+/datum/reagent/chlorine/catalog_category = "hidden"
+/datum/reagent/fluorine/catalog_category = "hidden"
+/datum/reagent/phosphorus/catalog_category = "hidden"
+/datum/reagent/lithium/catalog_category = "hidden"
+/datum/reagent/sodium/catalog_category = "hidden"
+/datum/reagent/potassium/catalog_category = "hidden"
+/datum/reagent/mercury/catalog_category = "hidden"
+/datum/reagent/sulfur/catalog_category = "hidden"
+/datum/reagent/silicon/catalog_category = "hidden"
+/datum/reagent/aluminium/catalog_category = "hidden"
+/datum/reagent/copper/catalog_category = "hidden"
+/datum/reagent/iron/catalog_category = "hidden"
+/datum/reagent/silver/catalog_category = "hidden"
+/datum/reagent/gold/catalog_category = "hidden"
+/datum/reagent/uranium/catalog_category = "hidden"
+/datum/reagent/bromine/catalog_category = "hidden"
+/datum/reagent/iodine/catalog_category = "hidden"
+
+// Hide water and basic consumables that aren't interesting
+/datum/reagent/water/catalog_category = "hidden"
+/datum/reagent/consumable/nutriment/catalog_category = "hidden"
+/datum/reagent/consumable/nutriment/vitamin/catalog_category = "hidden"
+/datum/reagent/consumable/sugar/catalog_category = "hidden"
+/datum/reagent/consumable/salt/catalog_category = "hidden"
+/datum/reagent/consumable/blackpepper/catalog_category = "hidden"
+
+// Blood and biological fluids
+/datum/reagent/blood/catalog_category = "hidden"
+/datum/reagent/consumable/liquidgibs/catalog_category = "hidden"
+
+// Special/admin only reagents
+/datum/reagent/adminordrazine/catalog_category = "hidden"
+/datum/reagent/magillitis/catalog_category = "hidden"
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index f8d9d263419..ac684c7ff08 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -229,6 +229,9 @@
#include "modules\_pentest_fixes\weapons\gun_jam_removal.dm"
#include "modules\achievements\code\achievements.dm"
#include "modules\bedsheets\code\bedsheets.dm"
+#include "modules\catalog\catalog.dm"
+#include "modules\catalog\reagent_categories.dm"
+#include "modules\catalog\mecha_extraction.dm"
#include "modules\chemistry\code\medical_reagents\medicine_reagents.dm"
#include "modules\chemistry\code\recipes\medical_reactions.dm"
#include "modules\cult\code\_cult_gamemode.dm"
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
new file mode 100644
index 00000000000..cc8f180e6b5
--- /dev/null
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -0,0 +1,430 @@
+import { useBackend } from '../backend';
+import { Box, Button, Input, Section, Stack, Table } from '../components';
+import { NtosWindow } from '../layouts';
+
+export const NtosCatalog = (props, context) => {
+ const { act, data } = useBackend(context);
+ const {
+ PC_device_theme,
+ current_view,
+ current_category,
+ search_query,
+ chemicals = [],
+ mechas = [],
+ } = data;
+
+ return (
+
+
+
+
+
+
+ NanoPedia
+
+
+ NanoTrasen Comprehensive Reference Database
+
+
+
+
+
+
+
+ {(current_view === 'chemistry' ||
+ current_view === 'medical' ||
+ current_view === 'drinks') && (
+
+ )}
+ {current_view === 'mechs' && }
+
+
+ );
+};
+
+const ChemistryCatalog = (props, context) => {
+ const { chemicals = [], view } = props;
+
+ // Determine section title based on view
+ const getSectionTitle = () => {
+ switch (view) {
+ case 'medical':
+ return 'Medical Chemistry';
+ case 'drinks':
+ return 'Drinks & Beverages';
+ case 'chemistry':
+ default:
+ return 'Chemistry';
+ }
+ };
+
+ if (chemicals.length === 0) {
+ return (
+
+
+ No chemicals found matching your search.
+
+
+ );
+ }
+
+ return (
+
+
+ {chemicals.map((chemical) => (
+
+
+
+ ))}
+
+
+ );
+};
+
+const ChemicalEntry = (props, context) => {
+ const { chemical } = props;
+
+ // Determine color based on category
+ const getCategoryColor = (category) => {
+ switch (category) {
+ case 'medical':
+ return '#4a90e2'; // Blue
+ case 'chemistry':
+ return '#50c878'; // Green
+ case 'drinks':
+ return '#e67e22'; // Orange
+ default:
+ return '#95a5a6'; // Gray
+ }
+ };
+
+ return (
+ <>
+
+
+
+
+
+ {chemical.description}
+
+
+
+ {chemical.recipes && chemical.recipes.length > 0 && (
+
+
+ Recipes:
+
+
+ {chemical.recipes.map((recipe, index) => (
+
+
+
+ ))}
+
+
+ )}
+
+ {(!chemical.recipes || chemical.recipes.length === 0) && (
+
+
+ No known chemical recipes. May be found naturally or created
+ through other means.
+
+
+ )}
+
+
+ >
+ );
+};
+
+const RecipeEntry = (props, context) => {
+ const { recipe } = props;
+
+ return (
+
+
+
+
+ Required:
+
+
+ {recipe.required && recipe.required.length > 0 ? (
+ recipe.required.map((req, i) => (
+
+ {req.amount}u {req.name}
+
+ ))
+ ) : (
+ None
+ )}
+
+
+
+ {recipe.catalysts && recipe.catalysts.length > 0 && (
+
+
+ Catalysts:
+
+
+ {recipe.catalysts.map((cat, i) => (
+
+ {cat.amount}u {cat.name}
+
+ ))}
+
+
+ )}
+
+
+
+ Produces:
+
+
+ {recipe.produces}u
+
+
+
+ {recipe.temperature && (
+
+
+ Temperature:
+
+
+
+ {recipe.is_cold ? '< ' : '> '}
+ {recipe.temperature}K
+
+
+
+ )}
+
+
+ );
+};
+
+const MechaCatalog = (props, context) => {
+ const { mechas = [] } = props;
+
+ if (mechas.length === 0) {
+ return (
+
+
+ No exosuits found matching your search.
+
+
+ );
+ }
+
+ return (
+
+
+ {mechas.map((mecha, index) => (
+
+
+
+ ))}
+
+
+ );
+};
+
+const MechaEntry = (props, context) => {
+ const { mecha } = props;
+
+ // Determine color based on category
+ const getCategoryColor = (category) => {
+ switch (category) {
+ case 'working':
+ return '#f39c12'; // Orange for working mechs
+ case 'combat':
+ return '#e74c3c'; // Red for combat mechs
+ case 'medical':
+ return '#3498db'; // Blue for medical mechs
+ case 'advanced':
+ return '#9b59b6'; // Purple for advanced mechs
+ case 'clown':
+ return '#ff69b4'; // Hot pink for H.O.N.K!
+ default:
+ return '#95a5a6'; // Gray
+ }
+ };
+
+ return (
+ <>
+
+
+
+ {/* Materials Required */}
+ {mecha.materials && mecha.materials.length > 0 && (
+
+
+ Total Materials Required:
+
+
+
+ {mecha.materials.map((mat, i) => (
+
+
+
+ {mat.amount}
+ {' '}
+ {mat.name}
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Parts to Fabricate */}
+ {mecha.parts && mecha.parts.length > 0 && (
+
+
+ Step 1: Fabricate Parts (Exosuit Fabricator)
+
+
+
+ {mecha.parts.map((part, i) => (
+
+
+
+ •
+ {' '}
+ {part.name}
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Assembly Steps */}
+ {mecha.assembly_steps && mecha.assembly_steps.length > 0 && (
+
+
+ Step 2: Assembly Instructions
+
+
+ {mecha.assembly_steps.map((step, i) => (
+
+
+
+ ))}
+
+
+ )}
+
+
+ >
+ );
+};
+
+const AssemblyStep = (props, context) => {
+ const { step } = props;
+
+ return (
+
+
+
+
+ {step.number}
+
+
+
+
+ {step.tool && (
+
+ Tool: {step.tool}
+
+ )}
+ {step.item && (
+
+ {step.amount && {step.amount}x }
+ {step.item}
+
+ )}
+ {step.action && {step.action}}
+
+
+
+
+ );
+};
From 8377c4802d3c734710c6082bcdb09cc2545bf07a Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:14:41 -0700
Subject: [PATCH 36/52] updates the reagent categories
---
code/modules/reagents/chemistry/reagents.dm | 2 --
.../modules/catalog/reagent_categories.dm | 22 ++++++++++++++++++-
2 files changed, 21 insertions(+), 3 deletions(-)
diff --git a/code/modules/reagents/chemistry/reagents.dm b/code/modules/reagents/chemistry/reagents.dm
index 329cdeac585..dac196e5e4b 100644
--- a/code/modules/reagents/chemistry/reagents.dm
+++ b/code/modules/reagents/chemistry/reagents.dm
@@ -70,8 +70,6 @@ GLOBAL_LIST_INIT(name2reagent, build_name2reagent())
var/metabolizing = FALSE
/// is it bad for you? Currently only used for borghypo. C2s and Toxins have it TRUE by default.
var/harmful = FALSE
- /// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "hidden", etc.
- var/catalog_category = "chemistry"
/// Are we from a material? We might wanna know that for special stuff. Like metalgen. Is replaced with a ref of the material on New()
var/datum/material/material
// What can process this? ORGANIC, SYNTHETIC, or ORGANIC | SYNTHETIC?. We'll assume by default that it affects organics.
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index f653199f480..f070a0813e0 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -1,6 +1,10 @@
// NanoPedia - Reagent catalog categorization
// Sets catalog categories for reagents to organize them in the NanoPedia interface
-// Categories: "medical", "chemistry", "drinks", "hidden"
+// Categories: "medical", "chemistry", "drinks", "misc", "hidden"
+
+/datum/reagent
+ /// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "misc", "hidden"
+ var/catalog_category = "hidden" // Default to hidden, manually set visible categories below
// Medical reagents - things a medical chemist would make
/datum/reagent/medicine/catalog_category = "medical"
@@ -41,6 +45,22 @@
/datum/reagent/saltpetre/catalog_category = "chemistry"
/datum/reagent/lye/catalog_category = "chemistry"
+// Misc - Biogenerator reagents and special crafting methods
+// Plant nutrients (biogenerator only)
+/datum/reagent/plantnutriment/catalog_category = "misc"
+/datum/reagent/plantnutriment/eznutriment/catalog_category = "misc"
+/datum/reagent/plantnutriment/left4zednutriment/catalog_category = "misc"
+/datum/reagent/plantnutriment/robustharvestnutriment/catalog_category = "misc"
+/datum/reagent/plantnutriment/endurogrow/catalog_category = "misc"
+/datum/reagent/plantnutriment/liquidearthquake/catalog_category = "misc"
+
+// Botany-specific toxins (biogenerator only)
+/datum/reagent/toxin/plantbgone/weedkiller/catalog_category = "misc"
+/datum/reagent/toxin/pestkiller/catalog_category = "misc"
+
+// Special reagents
+/datum/reagent/genesis/catalog_category = "misc"
+
// Hide basic elements and materials unless they have specific uses
/datum/reagent/hydrogen/catalog_category = "hidden"
/datum/reagent/oxygen/catalog_category = "hidden"
From 33fb0e5d9436dd82247898ff6d70c319baeb5ae5 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:15:40 -0700
Subject: [PATCH 37/52] designs portion of the pedia
---
.../modules/catalog/design_visibility.dm | 9 ++
.../modules/catalog/designs_extraction.dm | 137 ++++++++++++++++++
2 files changed, 146 insertions(+)
create mode 100644 modular_pentest/modules/catalog/design_visibility.dm
create mode 100644 modular_pentest/modules/catalog/designs_extraction.dm
diff --git a/modular_pentest/modules/catalog/design_visibility.dm b/modular_pentest/modules/catalog/design_visibility.dm
new file mode 100644
index 00000000000..35a3cf81e4e
--- /dev/null
+++ b/modular_pentest/modules/catalog/design_visibility.dm
@@ -0,0 +1,9 @@
+// NanoPedia - Design visibility control
+// Adds catalog_visible variable to designs for manual filtering in NanoPedia
+
+/datum/design
+ /// Set to FALSE to hide this design from the NanoPedia catalog
+ var/catalog_visible = TRUE
+
+/datum/design/limb_disk
+ catalog_visible = FALSE // Limb disks are generally not useful for players to see in the catalog
diff --git a/modular_pentest/modules/catalog/designs_extraction.dm b/modular_pentest/modules/catalog/designs_extraction.dm
new file mode 100644
index 00000000000..d0eb4e1fde6
--- /dev/null
+++ b/modular_pentest/modules/catalog/designs_extraction.dm
@@ -0,0 +1,137 @@
+// NanoPedia - Designs/blueprints database extraction
+// Automatically extracts design data from fabricator designs
+
+/// Gets all design data from research system
+/datum/computer_file/program/catalog/proc/get_designs_data()
+ var/list/designs = list()
+
+ // Build reverse map of design_id -> techweb nodes that unlock it
+ var/list/design_to_nodes = list()
+ for(var/node_id in SSresearch.techweb_nodes)
+ var/datum/techweb_node/node = SSresearch.techweb_nodes[node_id]
+ if(node.design_ids)
+ for(var/design_id in node.design_ids)
+ if(!design_to_nodes[design_id])
+ design_to_nodes[design_id] = list()
+ var/list/node_info = list()
+ node_info["id"] = node.id
+ node_info["name"] = node.display_name
+ design_to_nodes[design_id] += list(node_info)
+
+ // Iterate through all designs
+ for(var/design_id in SSresearch.techweb_designs)
+ var/datum/design/design = SSresearch.techweb_designs[design_id]
+
+ // Skip ignored designs
+ if(design.id == DESIGN_ID_IGNORE)
+ continue
+
+ // Skip designs marked as hidden from catalog
+ if(!design.catalog_visible)
+ continue
+
+ // Skip if no valid build type
+ if(!design.build_type)
+ continue
+
+ // Skip if no build_path (admin-only or special designs)
+ if(!design.build_path)
+ continue
+
+ // Skip if searching and name doesn't match
+ if(search_query && !findtext(lowertext(design.name), lowertext(search_query)))
+ continue
+
+ // Get fabricator categories (for frontend filtering)
+ var/list/categories = get_fabricator_categories(design.build_type)
+
+ // Skip if this design doesn't belong to any of the 4 main fabricators
+ if(!length(categories))
+ continue
+
+ // Skip if category filter is active and this design doesn't match
+ if(current_category != "all" && !(current_category in categories))
+ continue
+
+ var/list/design_data = list()
+ design_data["name"] = design.name
+ design_data["description"] = design.desc
+ design_data["id"] = design.id
+
+ // Set categories for frontend filtering (lowercase for consistency)
+ design_data["categories"] = categories
+
+ // Get materials
+ var/list/materials = list()
+ if(design.materials)
+ for(var/material in design.materials)
+ var/datum/material/mat = material
+ var/list/mat_data = list()
+ mat_data["name"] = initial(mat.name)
+ mat_data["amount"] = design.materials[material]
+ materials += list(mat_data)
+ design_data["materials"] = materials
+
+ // Get department restrictions
+ design_data["departments"] = get_department_names(design.departmental_flags)
+
+ // Get research requirements (which nodes unlock this)
+ var/list/research_nodes = list()
+ if(design_to_nodes[design.id])
+ research_nodes = design_to_nodes[design.id]
+ design_data["research_nodes"] = research_nodes
+
+ designs += list(design_data)
+
+ // Sort alphabetically by name
+ designs = sort_catalog_items(designs)
+
+ return designs
+
+/// Converts build_type flags to list of fabricator categories (lowercase for frontend)
+/// Only includes the 4 main fabricators (Autolathe, Protolathe, Imprinter, Mechfab)
+/datum/computer_file/program/catalog/proc/get_fabricator_categories(build_type)
+ var/list/categories = list()
+
+ if(build_type & AUTOLATHE)
+ categories += "autolathe"
+ if(build_type & PROTOLATHE)
+ categories += "protolathe"
+ if(build_type & IMPRINTER)
+ categories += "imprinter"
+ if(build_type & MECHFAB)
+ categories += "mechfab"
+
+ // Note: We intentionally exclude LIMBGROWER, BIOGENERATOR, SMELTER, and NANITE_COMPILER
+ // as those are special fabricators not part of the main 4 categories
+
+ return categories
+
+/// Converts departmental_flags to list of department names
+/datum/computer_file/program/catalog/proc/get_department_names(dept_flags)
+ var/list/departments = list()
+
+ // ALL means available to all departments
+ if(dept_flags == ALL)
+ return list("All Departments")
+
+ if(dept_flags & DEPARTMENTAL_FLAG_SECURITY)
+ departments += "Security"
+ if(dept_flags & DEPARTMENTAL_FLAG_MEDICAL)
+ departments += "Medical"
+ if(dept_flags & DEPARTMENTAL_FLAG_CARGO)
+ departments += "Cargo"
+ if(dept_flags & DEPARTMENTAL_FLAG_SCIENCE)
+ departments += "Science"
+ if(dept_flags & DEPARTMENTAL_FLAG_ENGINEERING)
+ departments += "Engineering"
+ if(dept_flags & DEPARTMENTAL_FLAG_SERVICE)
+ departments += "Service"
+ if(dept_flags & DEPARTMENTAL_FLAG_BASIC)
+ departments += "Basic"
+
+ // If no specific flags, it's typically available to all
+ if(!length(departments))
+ departments += "All Departments"
+
+ return departments
From 2a08a93d33dbe23b83122fc19864dde570e990fe Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:17:21 -0700
Subject: [PATCH 38/52] Catalog upgraded to now include designs and misc stuff
that we want
---
modular_pentest/modules/catalog/catalog.dm | 56 ++++++++++++++++++++--
1 file changed, 53 insertions(+), 3 deletions(-)
diff --git a/modular_pentest/modules/catalog/catalog.dm b/modular_pentest/modules/catalog/catalog.dm
index 0c773aac22a..ef0d633fe3e 100644
--- a/modular_pentest/modules/catalog/catalog.dm
+++ b/modular_pentest/modules/catalog/catalog.dm
@@ -13,25 +13,32 @@
usage_flags = PROGRAM_ALL
available_on_ntnet = TRUE
- /// Current catalog view (chemistry, medical, drinks, equipment, etc.)
+ /// Current catalog view (chemistry, medical, drinks, designs, etc.)
var/current_view = "chemistry"
/// Search query
var/search_query = ""
+ /// Current category filter (for designs view: autolathe, protolathe, imprinter, mechfab)
+ var/current_category = "all"
/datum/computer_file/program/catalog/ui_data(mob/user)
var/list/data = get_header_data()
data["current_view"] = current_view
data["search_query"] = search_query
+ data["current_category"] = current_category
- // Chemistry catalog data (for chemistry, medical, and drinks views)
- if(current_view in list("chemistry", "medical", "drinks"))
+ // Chemistry catalog data (for chemistry, medical, drinks, and misc views)
+ if(current_view in list("chemistry", "medical", "drinks", "misc"))
data["chemicals"] = get_chemistry_data()
// Mecha catalog data
if(current_view == "mechs")
data["mechas"] = get_mecha_data()
+ // Designs catalog data
+ if(current_view == "designs")
+ data["designs"] = get_designs_data()
+
return data
/datum/computer_file/program/catalog/ui_act(action, params)
@@ -42,6 +49,10 @@
switch(action)
if("change_view")
current_view = params["view"]
+ current_category = "all" // Reset category when changing views
+ return TRUE
+ if("change_category")
+ current_category = params["category"]
return TRUE
if("search")
search_query = params["query"]
@@ -75,6 +86,18 @@
reagent_data["description"] = reagent.description
reagent_data["category"] = reagent.catalog_category
+ // For misc reagents, check for biogenerator cost
+ if(current_view == "misc")
+ for(var/design_id in SSresearch.techweb_designs)
+ var/datum/design/design = SSresearch.techweb_designs[design_id]
+ if(design.build_type & BIOGENERATOR && design.make_reagents && (reagent_type in design.make_reagents))
+ // Extract biomass cost
+ if(design.materials && design.materials.len)
+ for(var/mat in design.materials)
+ reagent_data["biogenerator_cost"] = design.materials[mat]
+ break
+ break
+
// Find recipes that create this reagent
var/list/recipes = list()
for(var/reaction_id in GLOB.chemical_reactions_list)
@@ -122,4 +145,31 @@
reagent_data["recipes"] = recipes
chemicals += list(reagent_data)
+ // Sort alphabetically by name
+ chemicals = sort_catalog_items(chemicals)
+
return chemicals
+
+/// Sorts a list of catalog items alphabetically by their "name" key
+/datum/computer_file/program/catalog/proc/sort_catalog_items(list/items)
+ if(!items || items.len <= 1)
+ return items
+
+ // Extract names with their data
+ var/list/name_to_data = list()
+ for(var/list/item in items)
+ var/item_name = item["name"]
+ if(!name_to_data[item_name])
+ name_to_data[item_name] = list()
+ name_to_data[item_name] += list(item)
+
+ // Sort names alphabetically
+ var/list/sorted_names = sortList(list() + name_to_data)
+
+ // Rebuild list in sorted order
+ var/list/sorted_items = list()
+ for(var/name in sorted_names)
+ for(var/list/item in name_to_data[name])
+ sorted_items += list(item)
+
+ return sorted_items
From bc1f2776b9850935f6a6266d7fa4c680c1f292f3 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:18:27 -0700
Subject: [PATCH 39/52] enables the files above
---
modular_pentest/~pentest.dme | 2 ++
1 file changed, 2 insertions(+)
diff --git a/modular_pentest/~pentest.dme b/modular_pentest/~pentest.dme
index ac684c7ff08..33b31b7c013 100644
--- a/modular_pentest/~pentest.dme
+++ b/modular_pentest/~pentest.dme
@@ -231,7 +231,9 @@
#include "modules\bedsheets\code\bedsheets.dm"
#include "modules\catalog\catalog.dm"
#include "modules\catalog\reagent_categories.dm"
+#include "modules\catalog\design_visibility.dm"
#include "modules\catalog\mecha_extraction.dm"
+#include "modules\catalog\designs_extraction.dm"
#include "modules\chemistry\code\medical_reagents\medicine_reagents.dm"
#include "modules\chemistry\code\recipes\medical_reactions.dm"
#include "modules\cult\code\_cult_gamemode.dm"
From 06c41044581c7aa35407e615a50132193cc869f8 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:19:43 -0700
Subject: [PATCH 40/52] should get the overall ui stuff fixed
---
tgui/packages/tgui/interfaces/NtosCatalog.js | 259 ++++++++++++++++++-
1 file changed, 252 insertions(+), 7 deletions(-)
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
index cc8f180e6b5..d291934c818 100644
--- a/tgui/packages/tgui/interfaces/NtosCatalog.js
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -11,11 +11,13 @@ export const NtosCatalog = (props, context) => {
search_query,
chemicals = [],
mechas = [],
+ designs = [],
} = data;
return (
-
+
+ {/* Fixed header section */}
@@ -29,6 +31,7 @@ export const NtosCatalog = (props, context) => {
+ {/* Fixed view buttons */}
@@ -57,6 +60,14 @@ export const NtosCatalog = (props, context) => {
onClick={() => act('change_view', { view: 'drinks' })}
/>
+
+
+
+
@@ -91,12 +110,23 @@ export const NtosCatalog = (props, context) => {
- {(current_view === 'chemistry' ||
- current_view === 'medical' ||
- current_view === 'drinks') && (
-
- )}
- {current_view === 'mechs' && }
+ {/* Scrollable content area */}
+
+ {(current_view === 'chemistry' ||
+ current_view === 'medical' ||
+ current_view === 'drinks' ||
+ current_view === 'misc') && (
+
+ )}
+ {current_view === 'mechs' && }
+ {current_view === 'designs' && (
+
+ )}
+
);
@@ -112,6 +142,8 @@ const ChemistryCatalog = (props, context) => {
return 'Medical Chemistry';
case 'drinks':
return 'Drinks & Beverages';
+ case 'misc':
+ return 'Miscellaneous';
case 'chemistry':
default:
return 'Chemistry';
@@ -153,6 +185,8 @@ const ChemicalEntry = (props, context) => {
return '#50c878'; // Green
case 'drinks':
return '#e67e22'; // Orange
+ case 'misc':
+ return '#1abc9c'; // Teal
default:
return '#95a5a6'; // Gray
}
@@ -173,6 +207,14 @@ const ChemicalEntry = (props, context) => {
+ {chemical.biogenerator_cost && (
+
+
+ Biogenerator Cost: {chemical.biogenerator_cost} Biomass
+
+
+ )}
+
{chemical.recipes && chemical.recipes.length > 0 && (
@@ -428,3 +470,206 @@ const AssemblyStep = (props, context) => {
);
};
+
+const DesignsCatalog = (props, context) => {
+ const { designs = [], current_category, act } = props;
+
+ if (designs.length === 0) {
+ return (
+
+ No designs found matching your search.
+
+ );
+ }
+
+ return (
+
+ {/* Title */}
+
+
+ Fabricator Designs ({designs.length} designs)
+
+
+
+ {/* Category buttons */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Design entries */}
+ {designs.map((design, index) => (
+
+
+
+ ))}
+
+ );
+};
+
+const DesignEntry = (props, context) => {
+ const { design } = props;
+
+ return (
+ <>
+
+
+
+ {design.description && (
+
+
+ {design.description}
+
+
+ )}
+
+ {/* Fabricators */}
+ {design.categories && design.categories.length > 0 && (
+
+
+ Available at:
+
+
+
+ {design.categories.map((fab, i) => (
+
+
+ •{' '}
+ {fab.charAt(0).toUpperCase() +
+ fab.slice(1).replace('mechfab', 'Mech Fab')}
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Departments */}
+ {design.departments && design.departments.length > 0 && (
+
+
+ Department Access:
+
+
+
+ {design.departments.map((dept, i) => (
+
+
+ • {dept}
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Materials */}
+ {design.materials && design.materials.length > 0 && (
+
+
+ Materials Required:
+
+
+
+ {design.materials.map((mat, i) => (
+
+
+ {mat.name}
+
+
+
+ {mat.amount}
+
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Research Requirements */}
+ {design.research_nodes && design.research_nodes.length > 0 && (
+
+
+ Requires Research:
+
+
+
+ {design.research_nodes.map((node, i) => (
+
+
+ • {node.name || node.id || 'Unknown Research Node'}
+
+
+ ))}
+
+
+
+ )}
+
+ {/* Categories */}
+ {design.categories && design.categories.length > 0 && (
+
+
+ Categories: {design.categories.join(', ')}
+
+
+ )}
+
+
+ >
+ );
+};
From 0f135d8a6938fcb0537cea7c8f853cfda3e1eb17 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:35:42 -0700
Subject: [PATCH 41/52] corrects the scrolling
---
tgui/packages/tgui/interfaces/NtosCatalog.js | 214 ++++++++++---------
1 file changed, 108 insertions(+), 106 deletions(-)
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
index d291934c818..8b08ce426fc 100644
--- a/tgui/packages/tgui/interfaces/NtosCatalog.js
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -17,116 +17,118 @@ export const NtosCatalog = (props, context) => {
return (
- {/* Fixed header section */}
-
-
-
-
- NanoPedia
-
-
- NanoTrasen Comprehensive Reference Database
-
-
-
-
-
- {/* Fixed view buttons */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- act('search', { query: value })}
- />
-
- {search_query && (
+
+ {/* Fixed header section */}
+
+
+
+
+ NanoPedia
+
+
+ NanoTrasen Comprehensive Reference Database
+
+
+
+
+
+ {/* Fixed view buttons */}
+
+
+
+
- )}
-
-
-
-
-
- {/* Scrollable content area */}
-
- {(current_view === 'chemistry' ||
- current_view === 'medical' ||
- current_view === 'drinks' ||
- current_view === 'misc') && (
-
- )}
- {current_view === 'mechs' && }
- {current_view === 'designs' && (
-
- )}
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ act('search', { query: value })}
+ />
+
+ {search_query && (
+
+
+ )}
+
+
+
+
+
+ {/* Scrollable content area */}
+
+ {(current_view === 'chemistry' ||
+ current_view === 'medical' ||
+ current_view === 'drinks' ||
+ current_view === 'misc') && (
+
+ )}
+ {current_view === 'mechs' && }
+ {current_view === 'designs' && (
+
+ )}
+
+
);
From 35ce663c2352a6e4f490430189197ea56efa1088 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:35:48 -0700
Subject: [PATCH 42/52] updated readme
---
modular_pentest/modules/catalog/README.md | 74 +++++++++++++++++++++--
1 file changed, 68 insertions(+), 6 deletions(-)
diff --git a/modular_pentest/modules/catalog/README.md b/modular_pentest/modules/catalog/README.md
index 35ff8fb5d79..7dc566d4df2 100644
--- a/modular_pentest/modules/catalog/README.md
+++ b/modular_pentest/modules/catalog/README.md
@@ -13,6 +13,7 @@ NanoPedia (NanoTrasen Wikipedia) is designed to help players learn about game me
- Medical: Medicines and medical chemicals
- Chemistry: Industrial chemicals, toxins, and reagents
- Drinks: Alcoholic and non-alcoholic beverages
+ - Misc: Biogenerator reagents (plant nutrients, botany chemicals) and special crafting
- Hidden: Basic elements and admin-only reagents (not shown)
- **Chemical Information:**
- Name and description
@@ -20,34 +21,89 @@ NanoPedia (NanoTrasen Wikipedia) is designed to help players learn about game me
- Catalyst requirements
- Result amounts
- Temperature requirements (hot or cold reactions)
-- **Color-coded dividers** between entries by category (blue=medical, green=chemistry, orange=drinks)
+- **Color-coded dividers** between entries by category (blue=medical, green=chemistry, orange=drinks, teal=misc)
- **Search functionality** to quickly find specific chemicals
- **Category filtering** to narrow down results
+- **Alphabetical sorting** for easy navigation
+
+### Fabricator Designs Reference
+- **Organized by Fabricator Type:**
+ - Autolathe
+ - Protolathe
+ - Circuit Imprinter
+ - Mech Fabricator (Exosuit Fab)
+- **Design Information:**
+ - Name and description
+ - What fabricators can produce it
+ - Material requirements
+ - Department access restrictions
+ - Research node requirements
+- **Search functionality** across all designs
+- **Category filtering** to view designs for specific fabricators
+- **Alphabetical sorting** for easy navigation
+- **Visibility control** - designs can be hidden via `catalog_visible = FALSE`
+
+### Mecha Reference
+- Basic mecha construction information
+- Required parts and assembly steps
+- Material breakdowns
## Files
- `catalog.dm` - Backend program file that collects and formats data
- `reagent_categories.dm` - Catalog category assignments for reagents
+- `design_visibility.dm` - Adds catalog_visible variable to designs
+- `designs_extraction.dm` - Extracts and filters design data from research system
+- `mecha_extraction.dm` - Extracts mecha construction data
- `tgui/packages/tgui/interfaces/NtosCatalog.js` - Frontend TGUI interface
## Usage
1. Download and install the "NanoPedia" program (4GQ) from NTNet
2. Launch the program on any compatible device
-3. Select a category filter (All, Medical, Chemistry, or Drinks)
-4. Use the search bar to find specific chemicals
-5. View detailed recipes and information
+3. Select a view (Chemistry, Medical, Drinks, Exosuits, or Designs)
+4. Use category filters to narrow down results
+5. Use the search bar to find specific items
+6. View detailed information and recipes
+
+## Catalog Configuration
-## Catalog Categories
+### Reagent Categories
Reagents can be assigned one of the following catalog categories:
- `medical` - Medical chemicals and medicines
- `chemistry` - Industrial/general chemistry reagents
- `drinks` - Beverages (alcoholic and non-alcoholic)
+- `misc` - Biogenerator products (plant nutrients, botany chemicals) and special crafting methods
- `hidden` - Not shown in catalog (basic elements, admin reagents, etc.)
To categorize a new reagent, set its `catalog_category` variable in `reagent_categories.dm`.
+### Design Visibility
+
+Designs can be hidden from the catalog by setting `catalog_visible = FALSE`. By default, all designs are visible (`catalog_visible = TRUE`).
+
+**To hide a design:**
+1. Create or edit a design definition in your modular code
+2. Set `catalog_visible = FALSE`
+
+Example:
+```dm
+/datum/design/admin_only_item
+ catalog_visible = FALSE
+```
+
+This is useful for:
+- Admin-only items
+- Debug/testing designs
+- Items players cannot normally access
+- Special event-only fabrications
+
+Designs are also automatically filtered out if they:
+- Have `id = DESIGN_ID_IGNORE`
+- Have no `build_path` set
+- Don't belong to the 4 main fabricator types (Autolathe, Protolathe, Imprinter, Mechfab)
+
## Future Expansion
The framework is designed to be extensible. Future catalogs could include:
@@ -68,5 +124,11 @@ To add a new catalog view:
- Works on all device types via `usage_flags = PROGRAM_ALL`
- Available for download via NTNet
- Does not require network connectivity to run (`requires_ntnet = FALSE`)
-- Pulls data directly from game globals (`GLOB.chemical_reagents_list` and `GLOB.chemical_reactions_list`)
+- Pulls data directly from game globals:
+ - `GLOB.chemical_reagents_list` and `GLOB.chemical_reactions_list` for chemistry
+ - `SSresearch.techweb_designs` for fabricator designs
+ - Hard-coded construction datums for mechas
- Added `catalog_category` variable to base `/datum/reagent` for categorization system
+- Added `catalog_visible` variable to base `/datum/design` for visibility control
+- All catalog views feature alphabetical sorting by name
+- Fixed header and navigation buttons remain visible while scrolling content
From 10f7712de7c7867b055326dc0ebcf70755adbcaf Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 04:39:04 -0700
Subject: [PATCH 43/52] admin drug was pathed wrong... oppsie
---
modular_pentest/modules/catalog/reagent_categories.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index f070a0813e0..ec7fa990f76 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -97,5 +97,5 @@
/datum/reagent/consumable/liquidgibs/catalog_category = "hidden"
// Special/admin only reagents
-/datum/reagent/adminordrazine/catalog_category = "hidden"
+/datum/reagent/medicine/adminordrazine/catalog_category = "hidden"
/datum/reagent/magillitis/catalog_category = "hidden"
From d9fced2741457451103a21a31a73ec4772602809 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 06:58:40 -0700
Subject: [PATCH 44/52] Added another copy of my prettier updater
---
tgui/packages/tgui/interfaces/NtosCatalog.js | 17 ++++++++-------
tools/_pentest_scripts/run_prettier.cmd | 22 ++++++++++++++++++++
2 files changed, 32 insertions(+), 7 deletions(-)
create mode 100644 tools/_pentest_scripts/run_prettier.cmd
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
index 8b08ce426fc..a8c0edc348b 100644
--- a/tgui/packages/tgui/interfaces/NtosCatalog.js
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -500,7 +500,8 @@ const DesignsCatalog = (props, context) => {
@@ -509,7 +510,8 @@ const DesignsCatalog = (props, context) => {
fluid
color="blue"
selected={current_category === 'autolathe'}
- onClick={() => act('change_category', { category: 'autolathe' })}>
+ onClick={() => act('change_category', { category: 'autolathe' })}
+ >
Autolathe
@@ -518,9 +520,8 @@ const DesignsCatalog = (props, context) => {
fluid
color="purple"
selected={current_category === 'protolathe'}
- onClick={() =>
- act('change_category', { category: 'protolathe' })
- }>
+ onClick={() => act('change_category', { category: 'protolathe' })}
+ >
Protolathe
@@ -529,7 +530,8 @@ const DesignsCatalog = (props, context) => {
fluid
color="green"
selected={current_category === 'imprinter'}
- onClick={() => act('change_category', { category: 'imprinter' })}>
+ onClick={() => act('change_category', { category: 'imprinter' })}
+ >
Circuit Imprinter
@@ -538,7 +540,8 @@ const DesignsCatalog = (props, context) => {
fluid
color="orange"
selected={current_category === 'mechfab'}
- onClick={() => act('change_category', { category: 'mechfab' })}>
+ onClick={() => act('change_category', { category: 'mechfab' })}
+ >
Mech Fab
diff --git a/tools/_pentest_scripts/run_prettier.cmd b/tools/_pentest_scripts/run_prettier.cmd
new file mode 100644
index 00000000000..084ab66594a
--- /dev/null
+++ b/tools/_pentest_scripts/run_prettier.cmd
@@ -0,0 +1,22 @@
+@echo off
+setlocal
+REM Script to run prettier on the tgui folder
+REM This fixes formatting issues without needing to update the prettier version
+
+cd /d "%~dp0..\..\tgui"
+echo Running prettier on tgui folder...
+call yarn prettier . --write
+
+if %errorlevel% neq 0 (
+ echo.
+ echo Prettier failed with error code %errorlevel%
+ echo.
+ pause
+ exit /b %errorlevel%
+)
+
+echo.
+echo Prettier formatting complete!
+echo.
+pause
+exit /b 0
From b8def1f95210e8e126c19e70f3b5aaf7c008608e Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 06:59:55 -0700
Subject: [PATCH 45/52] Clears things I though existed but didnt
---
modular_pentest/modules/catalog/reagent_categories.dm | 3 ---
1 file changed, 3 deletions(-)
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index ec7fa990f76..71c57edcf82 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -11,7 +11,6 @@
// Drinks - alcoholic and non-alcoholic beverages
/datum/reagent/consumable/ethanol/catalog_category = "drinks"
-/datum/reagent/consumable/juice/catalog_category = "drinks"
/datum/reagent/consumable/coffee/catalog_category = "drinks"
/datum/reagent/consumable/tea/catalog_category = "drinks"
/datum/reagent/consumable/hot_coco/catalog_category = "drinks"
@@ -89,12 +88,10 @@
/datum/reagent/consumable/nutriment/catalog_category = "hidden"
/datum/reagent/consumable/nutriment/vitamin/catalog_category = "hidden"
/datum/reagent/consumable/sugar/catalog_category = "hidden"
-/datum/reagent/consumable/salt/catalog_category = "hidden"
/datum/reagent/consumable/blackpepper/catalog_category = "hidden"
// Blood and biological fluids
/datum/reagent/blood/catalog_category = "hidden"
-/datum/reagent/consumable/liquidgibs/catalog_category = "hidden"
// Special/admin only reagents
/datum/reagent/medicine/adminordrazine/catalog_category = "hidden"
From cd32aca63ec0e3e77467d3675be7186d2c4d0b07 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 16:13:14 -0700
Subject: [PATCH 46/52] added sub catagory for medical
---
modular_pentest/modules/catalog/catalog.dm | 12 ++
.../modules/catalog/reagent_categories.dm | 60 +++++++++
tgui/packages/tgui/interfaces/NtosCatalog.js | 125 ++++++++++++++++--
3 files changed, 185 insertions(+), 12 deletions(-)
diff --git a/modular_pentest/modules/catalog/catalog.dm b/modular_pentest/modules/catalog/catalog.dm
index ef0d633fe3e..a5a08312acf 100644
--- a/modular_pentest/modules/catalog/catalog.dm
+++ b/modular_pentest/modules/catalog/catalog.dm
@@ -77,6 +77,17 @@
if(reagent.catalog_category == "hidden")
continue
+ // Medical category filtering by medical_type
+ if(current_view == "medical")
+ if(current_category == "all")
+ // "All" excludes omni-healers to show only specific healers
+ if(reagent.medical_type == "omni")
+ continue
+ else if(current_category != "all")
+ // Filter by specific medical type
+ if(reagent.medical_type != current_category)
+ continue
+
// Skip if searching and name doesn't match
if(search_query && !findtext(lowertext(reagent.name), lowertext(search_query)))
continue
@@ -85,6 +96,7 @@
reagent_data["name"] = reagent.name
reagent_data["description"] = reagent.description
reagent_data["category"] = reagent.catalog_category
+ reagent_data["medical_type"] = reagent.medical_type // Include medical_type for frontend
// For misc reagents, check for biogenerator cost
if(current_view == "misc")
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index 71c57edcf82..5eb16b7508d 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -5,10 +5,66 @@
/datum/reagent
/// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "misc", "hidden"
var/catalog_category = "hidden" // Default to hidden, manually set visible categories below
+ /// PENTEST ADDITION - Medical subcategory: "brute", "burn", "toxin", "oxygen", "misc", "omni" (omni/multi healers filtered from "all")
+ var/medical_type = "misc"
// Medical reagents - things a medical chemist would make
/datum/reagent/medicine/catalog_category = "medical"
+// === Medical Type Subcategories ===
+
+// Omni Healers - heal multiple damage types (excluded from "all" filter)
+/datum/reagent/medicine/synthflesh/medical_type = "omni"
+/datum/reagent/medicine/cryoxadone/medical_type = "omni"
+/datum/reagent/medicine/hunter_extract/medical_type = "omni"
+/datum/reagent/medicine/panacea/medical_type = "omni"
+/datum/reagent/medicine/stimulants/medical_type = "omni"
+/datum/reagent/medicine/cureall/medical_type = "omni"
+/datum/reagent/medicine/epinephrine/medical_type = "omni"
+/datum/reagent/medicine/atropine/medical_type = "omni"
+/datum/reagent/medicine/regen_jelly/medical_type = "omni"
+/datum/reagent/medicine/pyroxadone/medical_type = "omni"
+/datum/reagent/medicine/syndicate_nanites/medical_type = "omni"
+
+// Brute Medicine - heals physical damage
+/datum/reagent/medicine/indomide/medical_type = "brute"
+/datum/reagent/medicine/metafactor/medical_type = "brute"
+/datum/reagent/medicine/hadrakine/medical_type = "brute"
+/datum/reagent/medicine/silfrine/medical_type = "brute"
+/datum/reagent/medicine/bicaridine/medical_type = "brute"
+/datum/reagent/medicine/helbital/medical_type = "brute"
+
+// Burn Medicine - heals fire damage
+/datum/reagent/medicine/leporazine/medical_type = "burn"
+/datum/reagent/medicine/alvitane/medical_type = "burn"
+/datum/reagent/medicine/quardexane/medical_type = "burn"
+/datum/reagent/medicine/ysiltane/medical_type = "burn"
+/datum/reagent/medicine/kelotane/medical_type = "burn"
+/datum/reagent/medicine/aiuri/medical_type = "burn"
+
+// Toxin Medicine - heals toxin damage
+/datum/reagent/medicine/calomel/medical_type = "toxin"
+/datum/reagent/medicine/charcoal/medical_type = "toxin"
+/datum/reagent/medicine/pancrazine/medical_type = "toxin"
+/datum/reagent/medicine/gjalrazine/medical_type = "toxin"
+/datum/reagent/medicine/dylovene/medical_type = "toxin"
+/datum/reagent/medicine/multiver/medical_type = "toxin"
+
+// Oxygen Medicine - heals oxygen deprivation
+/datum/reagent/medicine/dexaline/medical_type = "oxygen"
+/datum/reagent/medicine/salbutamol/medical_type = "oxygen"
+/datum/reagent/medicine/inaprovaline/medical_type = "oxygen"
+/datum/reagent/medicine/convermol/medical_type = "oxygen"
+/datum/reagent/medicine/tirimol/medical_type = "oxygen"
+
+// Misc - cloning, bone healing, sleep, antihol, etc.
+/datum/reagent/medicine/clonexadone/medical_type = "misc"
+/datum/reagent/medicine/quardexane/medical_type = "misc"
+/datum/reagent/medicine/melatonin/medical_type = "misc"
+/datum/reagent/medicine/skeletons_boon/medical_type = "misc"
+/datum/reagent/medicine/antihol/medical_type = "misc"
+/datum/reagent/medicine/indomide/medical_type = "misc"
+
// Drinks - alcoholic and non-alcoholic beverages
/datum/reagent/consumable/ethanol/catalog_category = "drinks"
/datum/reagent/consumable/coffee/catalog_category = "drinks"
@@ -93,6 +149,10 @@
// Blood and biological fluids
/datum/reagent/blood/catalog_category = "hidden"
+// Changeling reagents
+/datum/reagent/medicine/changelingadrenaline/catalog_category = "hidden"
+/datum/reagent/medicine/changelinghaste/catalog_category = "hidden"
+
// Special/admin only reagents
/datum/reagent/medicine/adminordrazine/catalog_category = "hidden"
/datum/reagent/magillitis/catalog_category = "hidden"
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
index a8c0edc348b..a703d83901c 100644
--- a/tgui/packages/tgui/interfaces/NtosCatalog.js
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -112,12 +112,17 @@ export const NtosCatalog = (props, context) => {
{/* Scrollable content area */}
-
+
{(current_view === 'chemistry' ||
current_view === 'medical' ||
current_view === 'drinks' ||
current_view === 'misc') && (
-
+
)}
{current_view === 'mechs' && }
{current_view === 'designs' && (
@@ -135,7 +140,7 @@ export const NtosCatalog = (props, context) => {
};
const ChemistryCatalog = (props, context) => {
- const { chemicals = [], view } = props;
+ const { chemicals = [], view, current_category, act } = props;
// Determine section title based on view
const getSectionTitle = () => {
@@ -163,15 +168,111 @@ const ChemistryCatalog = (props, context) => {
}
return (
-
-
- {chemicals.map((chemical) => (
-
-
-
- ))}
-
-
+
+ {/* Medical category filter buttons */}
+ {view === 'medical' && (
+
+
+ {getSectionTitle()} ({chemicals.length} chemicals)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ )}
+
+ {/* Chemical list */}
+
+ {view !== 'medical' && (
+
+
+ {chemicals.map((chemical) => (
+
+
+
+ ))}
+
+
+ )}
+ {view === 'medical' && (
+
+ {chemicals.map((chemical) => (
+
+
+
+ ))}
+
+ )}
+
+
);
};
From 2b870b32c77084225ea123270efcd125dcf7f06d Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 16:30:03 -0700
Subject: [PATCH 47/52] Corrects some spacing
---
tgui/packages/tgui/interfaces/NtosCatalog.js | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/tgui/packages/tgui/interfaces/NtosCatalog.js b/tgui/packages/tgui/interfaces/NtosCatalog.js
index a703d83901c..9f711b5c059 100644
--- a/tgui/packages/tgui/interfaces/NtosCatalog.js
+++ b/tgui/packages/tgui/interfaces/NtosCatalog.js
@@ -252,7 +252,9 @@ const ChemistryCatalog = (props, context) => {
{/* Chemical list */}
{view !== 'medical' && (
-
+
{chemicals.map((chemical) => (
@@ -354,7 +356,7 @@ const RecipeEntry = (props, context) => {
-
+
Required:
@@ -372,7 +374,7 @@ const RecipeEntry = (props, context) => {
{recipe.catalysts && recipe.catalysts.length > 0 && (
-
+
Catalysts:
@@ -386,7 +388,7 @@ const RecipeEntry = (props, context) => {
)}
-
+
Produces:
@@ -396,7 +398,7 @@ const RecipeEntry = (props, context) => {
{recipe.temperature && (
-
+
Temperature:
From ea2beb1aef7ec19cca80c72ab5428a83e8f26031 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 16:36:35 -0700
Subject: [PATCH 48/52] moved the medical subtype down into medical reagents.
Resorted file for a more logical flow.
---
.../modules/catalog/reagent_categories.dm | 114 +++++++++---------
1 file changed, 58 insertions(+), 56 deletions(-)
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index 5eb16b7508d..58a97f05271 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -5,66 +5,10 @@
/datum/reagent
/// PENTEST ADDITION - Catalog category for NanoPedia: "medical", "chemistry", "drinks", "misc", "hidden"
var/catalog_category = "hidden" // Default to hidden, manually set visible categories below
- /// PENTEST ADDITION - Medical subcategory: "brute", "burn", "toxin", "oxygen", "misc", "omni" (omni/multi healers filtered from "all")
- var/medical_type = "misc"
// Medical reagents - things a medical chemist would make
/datum/reagent/medicine/catalog_category = "medical"
-// === Medical Type Subcategories ===
-
-// Omni Healers - heal multiple damage types (excluded from "all" filter)
-/datum/reagent/medicine/synthflesh/medical_type = "omni"
-/datum/reagent/medicine/cryoxadone/medical_type = "omni"
-/datum/reagent/medicine/hunter_extract/medical_type = "omni"
-/datum/reagent/medicine/panacea/medical_type = "omni"
-/datum/reagent/medicine/stimulants/medical_type = "omni"
-/datum/reagent/medicine/cureall/medical_type = "omni"
-/datum/reagent/medicine/epinephrine/medical_type = "omni"
-/datum/reagent/medicine/atropine/medical_type = "omni"
-/datum/reagent/medicine/regen_jelly/medical_type = "omni"
-/datum/reagent/medicine/pyroxadone/medical_type = "omni"
-/datum/reagent/medicine/syndicate_nanites/medical_type = "omni"
-
-// Brute Medicine - heals physical damage
-/datum/reagent/medicine/indomide/medical_type = "brute"
-/datum/reagent/medicine/metafactor/medical_type = "brute"
-/datum/reagent/medicine/hadrakine/medical_type = "brute"
-/datum/reagent/medicine/silfrine/medical_type = "brute"
-/datum/reagent/medicine/bicaridine/medical_type = "brute"
-/datum/reagent/medicine/helbital/medical_type = "brute"
-
-// Burn Medicine - heals fire damage
-/datum/reagent/medicine/leporazine/medical_type = "burn"
-/datum/reagent/medicine/alvitane/medical_type = "burn"
-/datum/reagent/medicine/quardexane/medical_type = "burn"
-/datum/reagent/medicine/ysiltane/medical_type = "burn"
-/datum/reagent/medicine/kelotane/medical_type = "burn"
-/datum/reagent/medicine/aiuri/medical_type = "burn"
-
-// Toxin Medicine - heals toxin damage
-/datum/reagent/medicine/calomel/medical_type = "toxin"
-/datum/reagent/medicine/charcoal/medical_type = "toxin"
-/datum/reagent/medicine/pancrazine/medical_type = "toxin"
-/datum/reagent/medicine/gjalrazine/medical_type = "toxin"
-/datum/reagent/medicine/dylovene/medical_type = "toxin"
-/datum/reagent/medicine/multiver/medical_type = "toxin"
-
-// Oxygen Medicine - heals oxygen deprivation
-/datum/reagent/medicine/dexaline/medical_type = "oxygen"
-/datum/reagent/medicine/salbutamol/medical_type = "oxygen"
-/datum/reagent/medicine/inaprovaline/medical_type = "oxygen"
-/datum/reagent/medicine/convermol/medical_type = "oxygen"
-/datum/reagent/medicine/tirimol/medical_type = "oxygen"
-
-// Misc - cloning, bone healing, sleep, antihol, etc.
-/datum/reagent/medicine/clonexadone/medical_type = "misc"
-/datum/reagent/medicine/quardexane/medical_type = "misc"
-/datum/reagent/medicine/melatonin/medical_type = "misc"
-/datum/reagent/medicine/skeletons_boon/medical_type = "misc"
-/datum/reagent/medicine/antihol/medical_type = "misc"
-/datum/reagent/medicine/indomide/medical_type = "misc"
-
// Drinks - alcoholic and non-alcoholic beverages
/datum/reagent/consumable/ethanol/catalog_category = "drinks"
/datum/reagent/consumable/coffee/catalog_category = "drinks"
@@ -156,3 +100,61 @@
// Special/admin only reagents
/datum/reagent/medicine/adminordrazine/catalog_category = "hidden"
/datum/reagent/magillitis/catalog_category = "hidden"
+
+// === Medical Type Subcategories ===
+
+/datum/reagent/medicine
+ /// PENTEST ADDITION - Medical subcategory: "brute", "burn", "toxin", "oxygen", "misc", "omni" (omni/multi healers filtered from "all")
+ var/medical_type = "misc"
+
+// Omni Healers - heal multiple damage types (excluded from "all" filter)
+/datum/reagent/medicine/synthflesh/medical_type = "omni"
+/datum/reagent/medicine/cryoxadone/medical_type = "omni"
+/datum/reagent/medicine/hunter_extract/medical_type = "omni"
+/datum/reagent/medicine/panacea/medical_type = "omni"
+/datum/reagent/medicine/stimulants/medical_type = "omni"
+/datum/reagent/medicine/cureall/medical_type = "omni"
+/datum/reagent/medicine/epinephrine/medical_type = "omni"
+/datum/reagent/medicine/atropine/medical_type = "omni"
+/datum/reagent/medicine/regen_jelly/medical_type = "omni"
+/datum/reagent/medicine/pyroxadone/medical_type = "omni"
+/datum/reagent/medicine/syndicate_nanites/medical_type = "omni"
+
+// Brute Medicine - heals physical damage
+/datum/reagent/medicine/indomide/medical_type = "brute"
+/datum/reagent/medicine/metafactor/medical_type = "brute"
+/datum/reagent/medicine/hadrakine/medical_type = "brute"
+/datum/reagent/medicine/silfrine/medical_type = "brute"
+/datum/reagent/medicine/bicaridine/medical_type = "brute"
+/datum/reagent/medicine/helbital/medical_type = "brute"
+
+// Burn Medicine - heals fire damage
+/datum/reagent/medicine/leporazine/medical_type = "burn"
+/datum/reagent/medicine/alvitane/medical_type = "burn"
+/datum/reagent/medicine/quardexane/medical_type = "burn"
+/datum/reagent/medicine/ysiltane/medical_type = "burn"
+/datum/reagent/medicine/kelotane/medical_type = "burn"
+/datum/reagent/medicine/aiuri/medical_type = "burn"
+
+// Toxin Medicine - heals toxin damage
+/datum/reagent/medicine/calomel/medical_type = "toxin"
+/datum/reagent/medicine/charcoal/medical_type = "toxin"
+/datum/reagent/medicine/pancrazine/medical_type = "toxin"
+/datum/reagent/medicine/gjalrazine/medical_type = "toxin"
+/datum/reagent/medicine/dylovene/medical_type = "toxin"
+/datum/reagent/medicine/multiver/medical_type = "toxin"
+
+// Oxygen Medicine - heals oxygen deprivation
+/datum/reagent/medicine/dexaline/medical_type = "oxygen"
+/datum/reagent/medicine/salbutamol/medical_type = "oxygen"
+/datum/reagent/medicine/inaprovaline/medical_type = "oxygen"
+/datum/reagent/medicine/convermol/medical_type = "oxygen"
+/datum/reagent/medicine/tirimol/medical_type = "oxygen"
+
+// Misc - cloning, bone healing, sleep, antihol, etc.
+/datum/reagent/medicine/clonexadone/medical_type = "misc"
+/datum/reagent/medicine/quardexane/medical_type = "misc"
+/datum/reagent/medicine/melatonin/medical_type = "misc"
+/datum/reagent/medicine/skeletons_boon/medical_type = "misc"
+/datum/reagent/medicine/antihol/medical_type = "misc"
+/datum/reagent/medicine/indomide/medical_type = "misc"
From 49491164264f19ad1488494ed0640187f7f815d1 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 16:38:08 -0700
Subject: [PATCH 49/52] typo
---
modular_pentest/modules/catalog/reagent_categories.dm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index 58a97f05271..b0e28c5189d 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -145,7 +145,7 @@
/datum/reagent/medicine/multiver/medical_type = "toxin"
// Oxygen Medicine - heals oxygen deprivation
-/datum/reagent/medicine/dexaline/medical_type = "oxygen"
+/datum/reagent/medicine/dexalin/medical_type = "oxygen"
/datum/reagent/medicine/salbutamol/medical_type = "oxygen"
/datum/reagent/medicine/inaprovaline/medical_type = "oxygen"
/datum/reagent/medicine/convermol/medical_type = "oxygen"
From 085be760be4d806d1e040cda98fbbb2f3586f52b Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 16:43:56 -0700
Subject: [PATCH 50/52] Refactor medical reagent categorization to define
medical types at the reagent level for better organization.
---
modular_pentest/modules/catalog/reagent_categories.dm | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/modular_pentest/modules/catalog/reagent_categories.dm b/modular_pentest/modules/catalog/reagent_categories.dm
index b0e28c5189d..23accb320cc 100644
--- a/modular_pentest/modules/catalog/reagent_categories.dm
+++ b/modular_pentest/modules/catalog/reagent_categories.dm
@@ -103,8 +103,9 @@
// === Medical Type Subcategories ===
-/datum/reagent/medicine
+/datum/reagent
/// PENTEST ADDITION - Medical subcategory: "brute", "burn", "toxin", "oxygen", "misc", "omni" (omni/multi healers filtered from "all")
+ /// Because of how I pulled things from the GLOB, we have to define this at the reagent level even though only a small subsets will ever use it.
var/medical_type = "misc"
// Omni Healers - heal multiple damage types (excluded from "all" filter)
From 0bc95e3aac2ff45c10eb23fa112519009923ca27 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Wed, 25 Mar 2026 17:21:29 -0700
Subject: [PATCH 51/52] updates multiver a little
---
.../medical_reagents/medicine_reagents.dm | 35 +++++++++++++++++--
1 file changed, 32 insertions(+), 3 deletions(-)
diff --git a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
index 1cef920afc3..6618815f443 100644
--- a/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
+++ b/modular_pentest/modules/chemistry/code/medical_reagents/medicine_reagents.dm
@@ -439,17 +439,34 @@
/datum/reagent/medicine/multiver //enhanced with MULTIple medicines
name = "Multiver"
description = "A chem-purger that becomes more effective the more unique medicines present. Slightly heals toxicity but causes lung damage (mitigatable by unique medicines)."
+ reagent_state = LIQUID
harmful = TRUE
- metabolization_rate = 0.2
+ metabolization_rate = 0.5 * REAGENTS_METABOLISM
/datum/reagent/medicine/multiver/on_mob_life(mob/living/carbon/human/M)
var/medibonus = 0 //it will always have itself which makes it REALLY start @ 1
+ var/list/medicine_types = list() //track unique medicine types to avoid double-counting
+
+ //Check medicines in bloodstream
for(var/r in M.reagents.reagent_list)
var/datum/reagent/the_reagent = r
- if(istype(the_reagent, /datum/reagent/medicine))
+ if(istype(the_reagent, /datum/reagent/medicine) && !(the_reagent.type in medicine_types))
+ medicine_types += the_reagent.type
medibonus += 1
- M.adjustToxLoss(-0.5 * min(medibonus, 3)) //not great at healing but if you have nothing else it will work
+
+ //Check medicines in stomach (for when multiver is drunk)
+ var/obj/item/organ/stomach/belly = M.getorganslot(ORGAN_SLOT_STOMACH)
+ if(belly)
+ for(var/r in belly.reagents.reagent_list)
+ var/datum/reagent/the_reagent = r
+ if(istype(the_reagent, /datum/reagent/medicine) && !(the_reagent.type in medicine_types))
+ medicine_types += the_reagent.type
+ medibonus += 1
+
+ M.adjustToxLoss(-0.5 * (min(medibonus, 3) + 1)) //1u alone, 1.5u with 1 other med, 2u with 2+ other meds
M.adjustOrganLoss(ORGAN_SLOT_LUNGS, 0.5) //kills at 40u
+
+ //Purge reagents from bloodstream
for(var/r2 in M.reagents.reagent_list)
var/datum/reagent/the_reagent2 = r2
if(the_reagent2 == src)
@@ -458,6 +475,18 @@
if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine)) //3 unique meds (2+multiver) will make it not purge medicines
continue
M.reagents.remove_reagent(the_reagent2.type, amount2purge)
+
+ //Purge reagents from stomach (for when multiver is drunk)
+ if(belly)
+ for(var/r2 in belly.reagents.reagent_list)
+ var/datum/reagent/the_reagent2 = r2
+ if(the_reagent2.type == type) //don't purge ourselves
+ continue
+ var/amount2purge = 3
+ if(medibonus >= 3 && istype(the_reagent2, /datum/reagent/medicine))
+ continue
+ belly.reagents.remove_reagent(the_reagent2.type, amount2purge)
+
..()
return TRUE
From 3f2bdfec8316bd4e8fe055dfdacf144b3a6c8a25 Mon Sep 17 00:00:00 2001
From: "Ossa88 (SYNAPSE)"
Date: Fri, 27 Mar 2026 16:47:29 -0700
Subject: [PATCH 52/52] Add script to run Prettier for formatting the tgui
folder
---
tools/_pentest_scripts/{run_prettier.cmd => run_prettier_v2.cmd} | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename tools/_pentest_scripts/{run_prettier.cmd => run_prettier_v2.cmd} (100%)
diff --git a/tools/_pentest_scripts/run_prettier.cmd b/tools/_pentest_scripts/run_prettier_v2.cmd
similarity index 100%
rename from tools/_pentest_scripts/run_prettier.cmd
rename to tools/_pentest_scripts/run_prettier_v2.cmd