H7n89Tdy~bXBN6_X1saYbx
z)~u%TFw04LM=1XwWIjOjx7G|u1xfOj+
zd@ixt4A2fUrBQ}+txOGkc-W6h_*iPoaI}kb|R~~qgLBy<3P!^i6UpK3|ZXmO^_<@XkEE6dJ3v)SMZZ$r<#u=
z-j|D8(9HM(Zwq(4BWXJan9aq#*jt
z=ENC9)$S@a5f-LR=UUJf?g?9}xR8iZ{h2^xEzEC!W*z9Ujkzl}(ee*JrXn4@3$)oUgozj1{H7=*k5rQt&F&R6f^S%1Zg*b8zN
zuTEHhTfkd{hu82Ezv1WWJvr79*Uh${s|R9N|4R09o7!J9==zD&E4dq&F>A71ir|bR
zg}k|67YkWh>8-?Z53+c(4Fsbq40S1DRA!qBVF6OH)7${^O$vL!BoO_Jpa?JGWztoRU?PW9+n+STAEex7
zjb+tsPyTtha1Z-0Co6nu7;LDi;4D`s^B(gv_BH*-;gw-0RiPa}E21
zRj;i5M7IhFLeG{&Q)|TKAXq(H@@5K7wcsC&LLvkOf*1j?B&*LoE0^4XPV?8PK;e
zOygOk_3rjEG%$gU2*-BJr93rhh8%0&i~~37D&0Rw?;~%C5}17KQhhf8ZggfY$ZZr(
zP09YYDSccZ5U=qfyB@RE)C|xJP`Uav;icc4*cz>L$}NWaD@SqRAs4q`RWJlQ6VSel
zI#?KN2eaz;V5Y{S_#Bmbcll7%BAdHNJI#bMz^KrNOTGWu&~P`@B>>JR{@v+V*Zs81
z7&3Ac>T^ACR6iT+$&jqM35_Gq$2(
zjW+t-jB3}ei=TBjz4sXuCT_(A_hm<_Gh9{#WqhGn)uTv)CQe4b-Nz};XGSryO9XVU
z+JMTbdEg(oP2}I!`1;?}MUKdE48dp!w@Aq(VuCH03g>I_RuZ$Xw61su?pNqtc~wWgTv$J28wo-+6Dbjl-nYZt
zS-~qksENF%tYFPYXghM$nwiOrnwt{@fcbc^KhLHX1m|!#vts~4>(K8R+sSajy%l}f;ei1T&?3Bjnb0F?iQoW1
zK0fs{U9|@SSMw&sN+BAG4lidH0+dRfLa&_sHpK2N{mfYGb_xpL?yCyc(~HkhBseEA
zqpqxj&a>@YL-3g`*WZ5uhgnS#FM5_6&B1_;hK0#h=cl;VVeG1QdsCB1Ke(c%rl$4V
zoYYiq*7m@Y^3(gr|CVMZG`BI}^aUB~{JmEDQ4SyHWqRd7kSB5WJvY+EeV^uHH!)zz
z-Qtq3TmcW8lAPS5kgG7BckZ{hfE5eIO8@!qW;5|aeo
zv=?ihT|7`5-VWbg+55g~uF!Vm?dA1m{0*dI(NX!4WIi~O1Wv<|wZ68tbsJK^gnB@LMlm;H$wibsxL$&1DyzBk)U+26o0FJC0%l1Sm|7+S^en2iqwYsyfO%rtajg7hZ2k;J3TF;TIyw$x#)kO|
z_vmmP8+a&G_UMNraBQDy4c
zcZ>^Y8=J7Ba~*9?!989{wM8C9Uuu-}f_=tJzbN@EaZB5oz6{Ip)yik&q{J$9+&)T5
zBcUp8#$cMINu@>b$593ab8_G3;bOaU|(!zt2gXC7WI+s?bX$UcPT2e+|Xha
z;z4yOQL=%T@FxftO@>UtDBM<7D28~{R{daX{BEtNtsQg9P|r=CdbhB0I=7&p077cX
z{$qIrWJvIAr1J02$HkLCEvaygk0|gaO9a_~w%#Ksk4{7=7O%n)NO3C3utM+vw8f-{Y9)*%PMI11G
z`wW5OI0sUNgDov#gqVBN-7mvRO9e+EMa$aivA3;jQA45jOo
zqNgj`%VZQ$++9@sp))s-levZQieveuHX2cy1Wd#|%RO?X(2=Pu
z_+Uw|<86A8Q50D(*s4`?N=a-%w8+d_Pg%eo5-)0A7Gm8~)ZY71A*h1@?wN0mgz{T8
z?p#;&>+&4F(2G4iXFg8L)uSNR5!s-^eK~3J=;Fgv^N+tFpK|Lb6T5MLXu=&I>`M}E
z8#Z0fL#17?5zm~*t=v0f8N~K~6lmuE&M>MdW~6!|{Ig^HqqoR}ZD$3#1sU?{91%1o
z5OVNTZ->I`8GBQFZrZ`)B5D8*0wmZgogt2}*gVT42cY9l3NNKZR)>S6&8MF{pcTnq
zd5J#{Wxei2)9Pf&5=%n?_Iph(MX@#YPdLTc@xI~8kR^*`Eg|CKH*GOaj3JuSlFMDM
ziGdb9xTnmlC)lOQ)$WThHzSzh15XkkcokU0<-%^sa}gljhk`awZu(~xD0Sm^OOH~H
z!yV`3H~BjE)*-W`icS~fuTpQH3Dilf=j$2yk%J8Y*tb=^I(LHr&zTjnKd=T6PIIYu
zdG2MeERWE5-#wGK68zKr?5+q2ZvFKo`Hl+!V&^fRSB~@YSa^=^Ls8iG1|qBYkbP
zD&oPLB86GVNV(K6vijY-UY#z&0Py>B;c@~w>r&K^UW?Q!L(te}m`yvWmd@rxI9b#V2~##i!A~^$Jnp5WV&E@9&ZeFy$@-ieGv}v9zzLB
z36TQ(%JzJE?^_}*%3eVp>(cI*8U(R7vms@aa?_W#8gB4jM)0Sd8{Oz@4aDqhKVEO%
zm~4v&*}O62_l!iN9IKB1_AT-HUcKlv>hwyj9m}|R%jJjC0)|cfMBZQ=p3CK3O1a;r
zg^fxgJ9m#|j~8O?fukt3moN6dJ(MGfM&u72)I>N5M|oR^=lO<9QT*${mh6`v1;;6X
zo*#%iFmr6H4GbJrwzir|hm8{fSeY&d(;6y@si~{zpS*v@WC87DrM#^Tl|SCkY>Z@5_z%MUH|HX$uF0JuUj`1YEo6cJ
P=m46kdMf2gmSO(`1h~mO
literal 5197
zcmZWtcQ_pHx1U|TWtFH=qJNPn(St=okYKeSdhgLiXNg2vEeL`{FA1VWw|YrYLqgO<
z7rR(xl~wM1pWnUrk9(hIX5MGsdCxoNoH^%wK4;?fbTw!w*(d=3pwZG)GXTeee@}8!
z@QNC9z6}5n(hwt4e>F!xdtX;?e^)P000_!Un&@%s6Q>5o{mvPS&@bzx(Cg#Ug;clX
zJuntV=1DZ3cN|I!BfIVoHTAs=PyhWStyEf3I<_gc&Hcw~xfa(L$|hKfuz4OG6=TMY
z*H3((zYe7*eo+wpV~((0xUg$wEG(H!WTaPt84fB8J*Vj#em=RG0?Cs5xvBiQoLL$Z
zmM2M3oEd*V!>mnPRj){I4XdbbBo~xr;cl=m8{Apm0s|4m_zka)T
z((K^SJN18TVL9b%F}S9C#kLzMQJ>Xtu53c7n!SNiV?AZ<#eo!pg!+Su+xvS<-MRTI
zuY=$J96ywvvaEzdGMl#3=aPw{0Du9irKV~Wl!tvAsdwEuXQ&H3nDoFnu-jHwU2WpU
z?d#HP#dP}q2y{hzsWa5=b)_CEklXEvmN5f@HmN=B?iH=H(1@0>ry4hDO(Kr3oj4LH
zG4Z9q;Tbowh+dJ!*7$k*dLm(wYh>>59B_VlDZLl=p`t9*=`5Il^-|s?bX?#kp)B^}
z463yLjfl;!DTkuKL_0TxzU>~A&;JFn<|ZXY>Nq3)%|a1Am3tuCF$=M^m+87cEbnw!&Bpkmube5Tfo4SueZNNg*2o
zJpb5UL@doDb%{sO;f{ppiO$^d>ACr7y#6HBH>KBU%kIxU6@b!VervY?{lw%drMOyC
z?~OnASApR?G?QeS)7dBGMIH$0G166tYUXf5Kx^?^CYlLc*uub;KnB5hEg$kj@>B1F
z2HDrC%;cuD3c~Cb&*kBPkAo)HNDU2Qd~xAMrX^FJkT_;@9UZj4=<4FOs=G+$r@$A3
ziMcD&xRTOad*0BO^uMzu^f{J6cmA4yTFsK9NWAY#3uz>O>CY=H3>u$`0cY|>wTb-P
z&w>rdUWGnCD0MEq`mx#Fj@osYpcqi9I=2XG6W7^~KwkB(1i431GsIx#(|XoN@}H+h
zJ@@WBteWzNbQcZE98%E?JpXB&-7sDBYa-g)FWdT2WX||o^E)%+=+hP&HoB*7MrItk+kGH#76;Wcp!k
z#0TqRxX>+x-|)9P{$B7rEaRBMqSl`-#pdPPk8!Nbu*LEW)VLm$PwkK?pUu0j?Bf&cGK7XPhL+>gLi@HvgaFJlnkJ$r
zqk3+=9zCS{fZWMo`YD6QPs-z-IZg_S@q&_%a{|}%MOATI^jTPG>7%pjn*0?MGUD~N
z*95pYHnmd8sOfV!Zl|3@-v+iQ6QU_Bxnch={fJd*|8uB`_2xgRCN7jhAHY4hS%jk|
z8db1#9Dk9RNBB^#7dFLNs>(G8{83|#$P1g9BCoadi$!5Lz-eMt*z{TzuY^7RVD8h1
zaumT{(AL+~T4Uy49ypK%i)uWA
zI6a2Uh#H@7I@*}MC9dCHh$!bw-5`1MO3HBJ+*?s6E7Jl#HE~=)$a3^fmhTmq1{&uY
zE5pErohA?&1v9=HXAv>GhikEhlCCMT*Mu%2DM>E_}_DW{y5$)23_`eT~{jB6Q;^2^S}_-b?RL@QEb1vUdi
z75q`dZX=+mlrkHu1zO6=I1koQTFk+4
zdQmuj-xm`zQ#O{XOosHjxa;-4HRGjqz`Wrx6%9$j)3x;QD@^FZ%;N|-(cW}*!IE7<
znxN=Bd)WtaKW%|^><6L(Ezrr`n7}htv#(GA1W{c@-3Y%{VHaZK+Ys>jy6wmb4)bld
ziwxNMFj>F+CE^(4KAZI@?#Af+K_3Yv3_EuQ^ewWb7(TUws#oXSsIN&3?;~Y++XI`I
z3Sqt6+oA(ht`-Eg{2E2_F(U5DE;}TGV#$vC5FO|0pgk&$_-!{6#a|{voqr}9_{Erb
zMNp?gJ^;hA>cJJlim2&>>8XRYCE+EL&Hl2flY}yVb+ZgSi78Z4_tK9Du-P^aXs30s
z4kx^1wE00>%i_-Xb1ae#7`OAvgd4UmLkfafOlOXmJY19^W^-51zLLwFT&Cc1Slec%
z2`2$BbfEURSq&e!ZEn$fSe{LK3>=b=2q5YYpJ2G!Wop-LZBhiX8=J2}DD5Lp5O{0`
z9fr_~L+_l>K<1XX?r*(W6b8>^%SF0>wkFvWTfk(CFbieWyT!<$-xwdbF`4g1y4
zi*{NkNQIb-s}C%K-zOvQu*8qct}YWQYCo^|xkb0%yzK~CL0swNb*hc?mg|VG
zh{8|PGuY{En2k)V)Q4Mwgx;i8cf@&)65?cW!J%pOLloo2R{cB8jsJ*VHxH(phsatd^J%xg2<@usEReH+n4B;wXr`@WK_V$ZuC
zN#iuaRA6n)d0Dw%ocKoi|7JW+K!1mGd&;3$nZ>FPJm`?wZY3xF@pg1ROx^d2iy?7i
zKleW|E&hZQG=99s>nk~daZzoNAFe6=4w>57bRh+lpL9Vl<6xWIP^0@`H48Pe8ypCY
ztM#>IGZx-6VnaOTMqr4#9nppFDb_KKqINm5k=GIsStpG~cd}U*F=-f%7xA@2}w7q;ySySe>Uf-6i#7(n@l9PDDX1u}UF=`|Z5<}Xk3fA`ia__kB8
za5qQY^p>dWOv}ar=tbHPmEerh#*f0*tfQ|SnrA_;~--IlyLxryf>9>$dj(1w6`l9d@;YratSi$zuttmyyXIyr4`1MEm
zB(oRd9t^{|Gpt&Y64-eOMK`zJbT4MM2Vp=e4SA&BT}VsF2RIXIN@L&Ix;h}hrMj|j
zDNlFrYGHaiPnQ|@bhZ<*7s&d#F6742+@?R}xmapAl=KLUO7_cy*sm{K|JCI!{5XI)
zpPgT+kPa8<{fmow8`8QtyR$&jMTNVMH~aUURIrFD=LyBlVFu{(0@-D`$!Xj3oMj^F
zyBs0`3o=n$Ef`NCD%sdV+}fIGIII}dt*R*#&B&GjmP6imDV
zfau34G&=<4)#l`c7{O>Dvr5UYz*PGTHSHSL6S7;YX#@Bq*bHJ87eh+byPZuTP!7qI
zK+i8WiuPTKK5cYgNMown?&34P@TtG^rDJj=W}Vt6A{PDS{HlK-&l&5s?)Csa!dd!CH(@8hbj8Bl
zg=eY6s)|%0*CG@yO+Zc&GjO`F?!6)d>8x&NZ%Oe%$4|0~PNf1$ee%{lfx!W-xf?r6
zL%Gv^srfz(B8$&94VDsh?0`GOJ!egv`1a^CBxU!2b83^0R9Swb)qH{ez
z0w3O^2VE6wOwN~K2Ca?*hcEB9Ejg2<*tUR`WfY4z(51>%WsYP2@RzL{5fL${bG~cM
z*>VUO%aiZxY&%Q(TAJRU1^F$uj~E4K($dodcB5GzfPn;Z$)cNHvc6Z_w1CZG!yr0d
zOwg_y0C9tHtmteour}iMM?W0e;Os5xfrj(M8RH?UUyeb>et#1ueNeqGfKDjswvR~lop8b-v^2qRB5~L%Q
zVpW}aCHC3cL6BW;5=$h~utZ;brIgv`)F>6)02Zi!Cz?9j5=Jz0;tP3`Cb;H7Q`D2=
zAwZtu&>qg&q;@~>eMKjZLr>^hA3N6(6<4_Dyv%;piO(gZyMvKx@5yF|Xd^
zX=L+*j_9X|S#HC#GLIO)Wg|@F$K4wP#*G_s>S1;JvVWvkYRH
zZE;>(%MO;wJ(~XJ$jUBwxthGi%%|}D)aENCpoq+)L)1xNtpRmZb~d)0YUcBVpXb{p
zH9#(p6V!^4;EjkDd-&0I0)so5+!cdvvQ&`X?QagX{>mRb
zc}Ki?8u?h(JN3`qsvjH$j$&&tkME5{jqMdLKRTf~12*HrAa(MiN?{O`Q_9dsL+g<9
zcc|SN9JFf8wERhH(nA&K>T<4k{kVN@TE;Igit|EFwEE{E!gq)Om#=F}q%~VK-EIUh
z5}4l&3fpPMup%pu=Op;phmx6XKoc$6OlKI)TVo(j1;?!CX8ysKFAd$k*`Tww8XCH-vTVUp3yYl
zV0UpjF{{5Cp5l`U9rbX{+r4a(wP~2+hiNV!^gBbKMHPTeuaHjyopoSr| JAe5(t?UsSQ
zFl~lm88PRFl(c&u$&la0y*vZz+1JER`@dg`yc>w@xQ*ZL2!`*l%4?a3rk#X!Z`_Qb
zibuf!;Rr0-KC7MY&U1OR4QzJPs
zdPFptB;pLgTUXp^brTmnRAcVrtBSK(Mc2if(yZ;oob;Aq3B)@T;I|*3j^l~B7atjP
zwc8hUQRl0#_`xeIcDeo`utE#pB$JW~x-3Im4*_+Na&$%0?MBv!-tA~4mv#!8rl+j$
zx}WZwi_F^biQe83+cfg4qXB*uS@q9^h~%>ntuR1b%y!;BQUoR{N@9kzdTCo`PZE8e
z9M3l56T876BwE>T^6aX
z}2N9Cj9hRx~z;5`p2s~@+&3mmx80Q@3SzZDQYEM-e0OAq+*DH;rUs{|y
zg6!{E{U$M!bdxPP;Oz3xI~WB{D`vkiqeNtxI6AUzV87iYtEwJ%$MT4Hcf=**kSi!LD9>D%7B&MIO=`nuuksPwXVk
z=^Fiz*6S|hRWXZ^kN@b`m`xh^n-I`a*H!y?&nEi60GBt~b^rhX
diff --git a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
index d427c433522..32e83fb119c 100644
--- a/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
+++ b/modular_skyrat/modules/clock_cult/code/mobs/clockwork_marauder.dm
@@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(clockwork_marauders)
/obj/item/nullrod/Initialize(mapload)
. = ..()
- AddElement(/datum/element/bane, /mob/living/basic/clockwork_marauder, 1, 15, FALSE)
+ AddComponent(/datum/component/bane, /mob/living/basic/clockwork_marauder, 1, 15, FALSE)
#undef MARAUDER_SHIELD_MAX
#undef WELDER_REPAIR_AMOUNT
diff --git a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
index 0baf3450881..95c445096d3 100644
--- a/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
+++ b/modular_skyrat/modules/customization/modules/mob/dead/new_player/sprite_accessories.dm
@@ -42,6 +42,10 @@
var/color_layer_names
/// If this sprite accessory will be inaccessable if ERP config is disabled
var/erp_accessory = FALSE
+ // If this sprite accessory should use something other than the feature_key to decide its sprite key
+ // For example, if TG has it different in their icon files (e.g. "_fish_tail_" instead of "_tail_")
+ // This should hopefully prevent the need to copy paste TG icons into tails.dmi
+ var/feature_key_override
/datum/sprite_accessory/blank
factual = FALSE
diff --git a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
index f9c36e115dc..d0b393e82d7 100644
--- a/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
+++ b/modular_skyrat/modules/customization/modules/mob/living/carbon/human/species/podweak.dm
@@ -29,8 +29,8 @@
always_customizable = FALSE
-/datum/species/pod/podweak/spec_life(mob/living/carbon/human/H, seconds_per_tick, times_fired)
- . = ..()
+/datum/species/pod/podweak/proc/on_life(mob/living/carbon/human/H, seconds_per_tick)
+ SIGNAL_HANDLER
if(H.stat != CONSCIOUS)
return
diff --git a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
index e9c722e1f22..cabec5734d7 100644
--- a/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
+++ b/modular_skyrat/modules/customization/modules/surgery/organs/tails.dm
@@ -1,5 +1,5 @@
/obj/item/organ/tail
- mutantpart_key = "tail"
+ mutantpart_key = "FEATURE_TAIL"
mutantpart_info = list(MUTANT_INDEX_NAME = "Smooth", MUTANT_INDEX_COLOR_LIST = list("#FFFFFF"))
var/can_wag = TRUE
var/wagging = FALSE
diff --git a/modular_skyrat/modules/delam_emergency_stop/code/scram.dm b/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
index 30b0e2c4199..b2cc36ba926 100644
--- a/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
+++ b/modular_skyrat/modules/delam_emergency_stop/code/scram.dm
@@ -94,7 +94,7 @@
/obj/machinery/atmospherics/components/unary/delam_scram/proc/panic_time(source, trigger_reason)
SIGNAL_HANDLER
- if(!prereq_check(source, trigger_reason))
+ if(!prereq_check())
return
send_warning(source, trigger_reason)
@@ -156,7 +156,8 @@
use_reverb = TRUE,
falloff_distance = 10,
)
- power_fail(duration_min = 27, duration_max = 33)
+ ASYNC
+ power_fail(40, 50)
/// Stop the delamination. Let the fireworks begin
/obj/machinery/atmospherics/components/unary/delam_scram/proc/put_on_a_show()
diff --git a/modular_skyrat/modules/indicators/code/ssd_indicator.dm b/modular_skyrat/modules/indicators/code/ssd_indicator.dm
index d84edb1d569..73cb6e855bf 100644
--- a/modular_skyrat/modules/indicators/code/ssd_indicator.dm
+++ b/modular_skyrat/modules/indicators/code/ssd_indicator.dm
@@ -25,7 +25,7 @@ GLOBAL_VAR_INIT(ssd_indicator_overlay, mutable_appearance('modular_skyrat/module
. = ..()
//Temporary, look below for the reason
-/mob/living/ghostize(can_reenter_corpse = TRUE)
+/mob/living/ghostize(can_reenter_corpse = TRUE, forced = FALSE)
. = ..()
set_ssd_indicator(FALSE)
diff --git a/modular_skyrat/modules/liquids/code/ocean_biomes.dm b/modular_skyrat/modules/liquids/code/ocean_biomes.dm
index d49698f6caf..0ceebb75689 100644
--- a/modular_skyrat/modules/liquids/code/ocean_biomes.dm
+++ b/modular_skyrat/modules/liquids/code/ocean_biomes.dm
@@ -1,37 +1,37 @@
/datum/biome/ocean_sand
- turf_type = /turf/open/misc/ocean
+ open_turf_type = /turf/open/misc/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed)
flora_density = 10
/datum/biome/ocean_sand_flora
- turf_type = /turf/open/misc/ocean
+ open_turf_type = /turf/open/misc/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral)
flora_density = 25
fauna_density = 0.03
fauna_types = list(/mob/living/basic/carp)
/datum/biome/ocean_redsand
- turf_type = /turf/open/misc/ironsand/ocean
+ open_turf_type = /turf/open/misc/ironsand/ocean
flora_types = list(/obj/effect/spawner/ocean_curio, /obj/structure/flora/rock/pile, /obj/structure/flora/ocean/glowweed, /obj/structure/flora/ocean/seaweed, /obj/structure/flora/ocean/longseaweed, /obj/structure/flora/ocean/coral)
flora_density = 40
fauna_density = 0.06
fauna_types = list(/mob/living/basic/carp)
/datum/biome/ocean_rocklight
- turf_type = /turf/open/misc/ocean/rock
+ open_turf_type = /turf/open/misc/ocean/rock
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 3
/datum/biome/ocean_rockmed
- turf_type = /turf/open/misc/ocean/rock/medium
+ open_turf_type = /turf/open/misc/ocean/rock/medium
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 5
/datum/biome/ocean_rockheavy
- turf_type = /turf/open/misc/ocean/rock/heavy
+ open_turf_type = /turf/open/misc/ocean/rock/heavy
flora_types = list(/obj/effect/spawner/ocean_curio/rock, /obj/structure/flora/rock, /obj/structure/flora/rock/pile)
flora_density = 7
/datum/biome/ocean_wall
- turf_type = /turf/closed/mineral/random/stationside/ocean
+ closed_turf_type = /turf/closed/mineral/random/stationside/ocean
flora_density = 0
diff --git a/modular_skyrat/modules/liquids/code/ocean_turfs.dm b/modular_skyrat/modules/liquids/code/ocean_turfs.dm
index e0b94156f50..cb21831a432 100644
--- a/modular_skyrat/modules/liquids/code/ocean_turfs.dm
+++ b/modular_skyrat/modules/liquids/code/ocean_turfs.dm
@@ -21,7 +21,7 @@
if(!ismineralturf(T))
return
var/turf/closed/mineral/M = T
- M.mineralAmt = 0
+ M.mineral_amt = 0
M.gets_drilled()
baseturfs = /turf/open/openspace/ocean //This is to ensure that IF random turf generation produces a openturf, there won't be other turfs assigned other than openspace.
diff --git a/modular_skyrat/modules/mapping/code/planet_turfs.dm b/modular_skyrat/modules/mapping/code/planet_turfs.dm
index 92ec1ce8d7a..750fbe92613 100644
--- a/modular_skyrat/modules/mapping/code/planet_turfs.dm
+++ b/modular_skyrat/modules/mapping/code/planet_turfs.dm
@@ -84,15 +84,15 @@
/turf/closed/mineral/random/asteroid/rockplanet //A version that can be used on the mining planet without destroying atmos - starts with Low_Pressure, along with the rest of the planet.
name = "iron rock"
- icon = MAP_SWITCH('icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi')
- icon = 'icons/turf/mining.dmi'
+ icon = MAP_SWITCH('modular_zubbers/icons/turf/walls/red_wall.dmi', 'icons/turf/mining.dmi')
+ icon = 'modular_zubbers/icons/turf/walls/red_wall.dmi'
icon_state = "redrock"
base_icon_state = "red_wall"
turf_type = /turf/open/misc/asteroid/lowpressure
baseturfs = /turf/open/misc/asteroid/lowpressure
initial_gas_mix = OPENTURF_LOW_PRESSURE
defer_change = TRUE
- mineralChance = 25 //Higher mineral chance than normal
+ mineral_chance = 25 //Higher mineral chance than normal
/turf/closed/mineral/random/asteroid/rockplanet/mineral_chances()
return list(
diff --git a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
index 093e9e566b7..4df966f82b4 100644
--- a/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
+++ b/modular_skyrat/modules/modular_implants/code/nifsofts/soul_poem.dm
@@ -74,10 +74,10 @@
if(message["identifier"] == sender_identifier)
message["sender_name"] = message_name
message["message"] = received_message
- message["timestamp"] = station_time_timestamp()
+ message["timestamp"] = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()]"
return TRUE
- message_list.Insert(1, list(list(identifier = sender_identifier, sender_name = received_name, message = received_message, timestamp = station_time_timestamp())))
+ message_list.Insert(1, list(list(identifier = sender_identifier, sender_name = received_name, message = received_message, timestamp = "[server_timestamp(ic_time = TRUE)] (PT: [round_timestamp()]")))
return TRUE
/// Removes the message_to_remove from the message_list, If the message cannot be found the proc will return FALSE, otherwise it will delete the message_to_remove and return TRUE.
diff --git a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
index ead1d76e3bb..c7d79ad4a3c 100644
--- a/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
+++ b/modular_skyrat/modules/modular_items/lewd_items/code/lewd_machinery/milking_machine.dm
@@ -247,7 +247,6 @@
update_mob_action_buttons() //some of our action buttons might be unusable when we're handcuffed.
update_worn_handcuffs()
- update_hud_handcuffed()
/obj/item/restraints/handcuffs/milker
name = "chair cuffs"
diff --git a/modular_skyrat/modules/mutants/code/mutant_species.dm b/modular_skyrat/modules/mutants/code/mutant_species.dm
index 74a6d678b27..20479bb0e59 100644
--- a/modular_skyrat/modules/mutants/code/mutant_species.dm
+++ b/modular_skyrat/modules/mutants/code/mutant_species.dm
@@ -151,8 +151,8 @@
if(COOLDOWN_FINISHED(src, regen_cooldown))
COOLDOWN_START(src, regen_cooldown, REGENERATION_DELAY)
-/datum/species/mutant/infectious/spec_life(mob/living/carbon/carbon_mob, seconds_per_tick, times_fired)
- . = ..()
+/datum/species/mutant/infectious/proc/on_life(mob/living/carbon/carbon_mob, seconds_per_tick)
+ SIGNAL_HANDLER
//mutants never actually die, they just fall down until they regenerate enough to rise back up.
if(COOLDOWN_FINISHED(src, regen_cooldown))
var/heal_amt = heal_rate
diff --git a/modular_skyrat/modules/officestuff/code/officestuff.dm b/modular_skyrat/modules/officestuff/code/officestuff.dm
index 7b661b24fa5..7c0ae62a8cb 100644
--- a/modular_skyrat/modules/officestuff/code/officestuff.dm
+++ b/modular_skyrat/modules/officestuff/code/officestuff.dm
@@ -8,7 +8,7 @@
// stolen from the wall clock
/obj/structure/grandfatherclock/examine(mob/user)
. = ..()
- . += span_info("The current CST (local) time is: [station_time_timestamp()].")
+ . += span_info("The current CST (local) time is: [round_timestamp()].")
. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss")].")
if(soundloop)
. += span_notice("The hands of the clock are freely ticking away. They could be screwed down.")
diff --git a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
index c5bb5aafa51..822179b32ec 100644
--- a/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
+++ b/modular_skyrat/modules/shotgunrebalance/code/shotgun.dm
@@ -182,10 +182,25 @@
/obj/projectile/bullet/shotgun_slug/hunter
name = "12g hunter slug"
damage = 20
+ range = 12
+ /// How much the damage is multiplied by when we hit a mob with the correct biotype
+ var/biotype_damage_multiplier = 5
+ /// What biotype we look for
+ var/biotype_we_look_for = MOB_BEAST
-/obj/projectile/bullet/shotgun_slug/hunter/Initialize(mapload)
- . = ..()
- AddElement(/datum/element/bane, mob_biotypes = MOB_BEAST, damage_multiplier = 6)
+/obj/projectile/bullet/shotgun_slug/hunter/on_hit(atom/target, blocked, pierce_hit)
+ if(ismineralturf(target))
+ var/turf/closed/mineral/mineral_turf = target
+ mineral_turf.gets_drilled(firer)
+ if(range > 0)
+ return BULLET_ACT_FORCE_PIERCE
+ return ..()
+ if(!isliving(target) || (damage > initial(damage)))
+ return ..()
+ var/mob/living/target_mob = target
+ if(target_mob.mob_biotypes & biotype_we_look_for || istype(target_mob, /mob/living/simple_animal/hostile/megafauna))
+ damage *= biotype_damage_multiplier
+ return ..()
/obj/item/ammo_casing/shotgun/honkshot
name = "confetti shell"
diff --git a/modular_skyrat/modules/synths/code/species/synthetic.dm b/modular_skyrat/modules/synths/code/species/synthetic.dm
index 230cd002fd8..0926103490e 100644
--- a/modular_skyrat/modules/synths/code/species/synthetic.dm
+++ b/modular_skyrat/modules/synths/code/species/synthetic.dm
@@ -69,8 +69,8 @@
MUTANT_SYNTH_HEAD = list("Default Head", FALSE),
)
-/datum/species/synthetic/spec_life(mob/living/carbon/human/human)
- . = ..()
+/datum/species/synthetic/proc/on_life(mob/living/carbon/human/human)
+ SIGNAL_HANDLER
if(human.stat == SOFT_CRIT || human.stat == HARD_CRIT)
human.adjust_fire_loss(1) //Still deal some damage in case a cold environment would be preventing us from the sweet release to robot heaven
diff --git a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
index 6077f63e0e7..401b4456ad7 100644
--- a/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
+++ b/modular_skyrat/modules/xenoarch/code/modules/research/xenoarch/strange_rock.dm
@@ -197,10 +197,10 @@
//turfs
/turf/closed/mineral/strange_rock
- mineralAmt = 1
+ mineral_amt = 1
icon = MAP_SWITCH('modular_zubbers/icons/turf/walls/smoothrocks.dmi', 'modular_skyrat/modules/xenoarch/icons/mining.dmi')
scan_state = "rock_Strange"
- mineralType = /obj/item/xenoarch/strange_rock
+ mineral_type = /obj/item/xenoarch/strange_rock
/turf/closed/mineral/strange_rock/volcanic
turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface
@@ -213,7 +213,7 @@
baseturfs = /turf/open/misc/asteroid/basalt/lava_land_surface
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
defer_change = TRUE
- mineralChance = 10
+ mineral_chance = 7
/turf/closed/mineral/random/volcanic/mineral_chances()
return list(
@@ -261,7 +261,7 @@
/turf/closed/mineral/random/snow/underground
baseturfs = /turf/open/misc/asteroid/snow/icemoon
// abundant ore
- mineralChance = 20
+ mineral_chance = 16
/turf/closed/mineral/random/snow/underground/mineral_chances()
return list(
@@ -302,7 +302,7 @@
/turf/closed/mineral/random/stationside/asteroid/rockplanet
initial_gas_mix = OPENTURF_DEFAULT_ATMOS
turf_type = /turf/open/misc/asteroid
- mineralChance = 30
+ mineral_chance = 25
/turf/closed/mineral/random/stationside/asteroid/rockplanet/mineral_chances()
return list(
diff --git a/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm b/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
index 8e3a9d7ba49..5bd5e4ece37 100644
--- a/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
+++ b/modular_zubbers/code/datums/bodypart_overlays/mutant_bodypart_overlay.dm
@@ -27,7 +27,7 @@
*
* Arguments:
* * dna - The `/datum/dna` datum from which we're going to be extracting the data to set the
- * * accessory_name - instead of using the name from mutant_bodyparts[feature_key][MUTANT_INDEX_NAME] you can optionally pass one explicitly
+ * * accessory_name - instead of using the name from mutant_bodyparts[feature_key] you can optionally pass one explicitly
* * feature_key - same as with accessory_key, you can optionally pass a feature_key explicitly
* appearance.
*/
@@ -40,7 +40,6 @@
sprite_datum = fetch_sprite_datum_from_name(accessory_name ? accessory_name : mutantparts_list[feature_key][MUTANT_INDEX_NAME])
modsuit_affected = sprite_datum.use_custom_mod_icon
draw_color = mutantparts_list[feature_key][MUTANT_INDEX_COLOR_LIST]
- build_emissive_eligibility(mutantparts_list[feature_key][MUTANT_INDEX_EMISSIVE_LIST])
cache_key = jointext(generate_icon_cache(), "_")
return TRUE
@@ -54,12 +53,12 @@
/// Generate a unique key based on our sprites. So that if we've aleady drawn these sprites,
/// they can be found in the cache and wont have to be drawn again (blessing and curse, but mostly curse)
-/datum/bodypart_overlay/mutant/generate_icon_cache()
+/datum/bodypart_overlay/mutant/generate_icon_cache(obj/item/bodypart/limb)
. = list()
. += "[get_base_icon_state()]"
. += "[get_feature_key_for_overlay()]"
-
- . += cache_key_extra_information // We can do it like this because it's meant to be a list of strings anyway. BYOND list operations actually being useful for once.
+ if(LAZYLEN(cache_key_extra_information))
+ . += cache_key_extra_information // We can do it like this because it's meant to be a list of strings anyway. BYOND list operations actually being useful for once.
if(islist(draw_color))
for(var/sub_color in draw_color)
@@ -72,8 +71,8 @@
. += "[alpha]"
if(emissive_eligibility_by_color_index)
- for(var/index in emissive_eligibility_by_color_index)
- . += "[emissive_eligibility_by_color_index[index]]"
+ for(var/emissive_boolean in emissive_eligibility_by_color_index)
+ . += emissive_boolean
return .
@@ -83,11 +82,11 @@
* overriden in the cases where `feature_key` is not what we want to use here.
*/
/datum/bodypart_overlay/mutant/proc/get_feature_key_for_overlay()
- return feature_key
+ return sprite_datum?.feature_key_override || feature_key
/datum/bodypart_overlay/mutant/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner)
- if(!..(bodypart_owner))
+ if(!..())
return FALSE
var/mob/living/carbon/human/human = bodypart_owner.owner
if(!istype(human))
@@ -113,19 +112,19 @@
var/mutable_appearance/mod_overlay
var/icon/custom_mod_icon = sprite_datum.get_custom_mod_icon(owner)
- cache_key_extra_information = list()
last_built_icon_states = list()
+ LAZYCLEARLIST(cache_key_extra_information)
if(custom_mod_icon)
- mod_overlay = get_singular_image(image_layer = image_layer, owner = owner, icon_override = custom_mod_icon)
+ mod_overlay = get_singular_image(image_layer = image_layer, owner = owner, icon_override = custom_mod_icon, limb = limb)
switch(sprite_datum.color_src)
if(USE_MATRIXED_COLORS)
- var/list/color_layer_names = get_color_layer_names(build_icon_state(gender, image_layer))
+ var/list/color_layer_names = get_color_layer_names(build_icon_state_bubber(gender, image_layer))
for (var/color_index in color_layer_names)
- var/mutable_appearance/color_layer_image = get_singular_image(build_icon_state(gender, image_layer, color_layer_names[color_index]), image_layer, owner)
+ var/mutable_appearance/color_layer_image = get_singular_image(build_icon_state_bubber(gender, image_layer, color_layer_names[color_index]), image_layer, owner, limb = limb)
returned_images += color_layer_image
overlay_indexes_to_color += index
@@ -135,7 +134,7 @@
mod_overlay.add_overlay(sprite_datum.get_custom_mod_icon(owner, color_layer_image))
else
- var/mutable_appearance/image_to_return = get_singular_image(build_icon_state(gender, image_layer), image_layer, owner)
+ var/mutable_appearance/image_to_return = get_singular_image(build_icon_state_bubber(gender, image_layer), image_layer, owner, limb = limb)
returned_images = list(image_to_return)
overlay_indexes_to_color += index
@@ -143,16 +142,22 @@
mod_overlay.add_overlay(sprite_datum.get_custom_mod_icon(owner, image_to_return))
if(sprite_datum.has_inner)
- returned_images += get_singular_image(build_icon_state(gender, image_layer, feature_key_suffix = "inner"), image_layer, owner)
+ returned_images += get_singular_image(build_icon_state_bubber(gender, image_layer, feature_key_suffix = "inner"), image_layer, owner, limb = limb)
// Gets the icon_state of a single or matrix colored accessory and overlays it with a texture
if(mod_overlay)
returned_images += mod_overlay
- cache_key_extra_information += "MOD"
+ LAZYADD(cache_key_extra_information, "MOD")
return returned_images
+// Cybernetic cat ears - special case - need a unique version for each inner color.
+/datum/bodypart_overlay/mutant/cat_ears/cybernetic/generate_icon_cache(obj/item/bodypart/limb)
+ . = ..()
+ . += inner_color
+
+
/**
* Returns the color_layer_names of the sprite_datum associated with our datum.
* Mainly here so that it can be overriden elsewhere to have other effects.
@@ -211,7 +216,7 @@
* * feature_key_suffix - A string that will be directly appended to the result
* of `get_feature_key_for_overlay()`. Defaults to `null`.
*/
-/datum/bodypart_overlay/mutant/proc/build_icon_state(gender, image_layer, color_layer = null, feature_key_suffix = null)
+/datum/bodypart_overlay/mutant/proc/build_icon_state_bubber(gender, image_layer, color_layer = null, feature_key_suffix = null)
var/list/icon_state_builder = list()
icon_state_builder += sprite_datum.gender_specific ? gender : "m" //Male is default because sprite accessories are so ancient they predate the concept of not hardcoding gender
@@ -241,7 +246,7 @@
* `sprite_datum.icon`. Default is `null`, and its value will be used if it's
* anything else.
*/
-/datum/bodypart_overlay/mutant/proc/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null)
+/datum/bodypart_overlay/mutant/proc/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null, obj/item/bodypart/limb)
// We get from icon_override if it is filled, and from sprite_datum.icon if not.
var/mutable_appearance/appearance = mutable_appearance(icon_override || sprite_datum.get_special_icon(owner), image_icon_state, layer = image_layer)
@@ -251,6 +256,17 @@
return appearance
+// Special case - fish tail
+/datum/bodypart_overlay/mutant/tail/fish/get_singular_image(image_icon_state, image_layer, mob/living/carbon/human/owner, icon_override = null, obj/item/bodypart/limb)
+ var/mutable_appearance/appearance = ..()
+ // We add all appearances the parent bodypart has to the tail to inherit scales and fancy effects
+ // but most other organs don't want to inherit those so we do it here and not on parent
+ for (var/datum/bodypart_overlay/texture/texture in limb.bodypart_overlays)
+ if(texture.can_draw_on_bodypart(limb, limb.owner, limb.is_husked))
+ texture.modify_bodypart_appearance(appearance)
+ return appearance
+
+
/**
* Helper proc to add the appropriate emissives to the overlays, based on the preferences.
*
@@ -264,33 +280,13 @@
if(!limb || !length(emissive_eligibility_by_color_index))
return overlays
- var/index = 1
- var/list/image/emissives = list()
-
- for(var/image/overlay in overlays)
- if(emissive_eligibility_by_color_index[num2text(index)])
- emissives += emissive_appearance_copy(overlay, limb)
-
- index++
-
- return overlays + emissives
-
-
-/**
- * Builds `emissive_eligibility_by_layer` from the input list of three booleans.
- * Will not do anything if the given argument is `null`.
- */
-/datum/bodypart_overlay/mutant/proc/build_emissive_eligibility(list/emissive_eligibility)
- if(!emissive_eligibility || !islist(emissive_eligibility))
- return
-
- emissive_eligibility_by_color_index = list()
- var/i = 1
-
- for(var/eligibility in emissive_eligibility)
- emissive_eligibility_by_color_index[num2text(i)] = eligibility
- i++
+ var/list/image/emissives
+ var/max = min(3, length(overlays)) // only care about the first 3 indexes
+ for(var/index = 1 to max)
+ if(emissive_eligibility_by_color_index[index])
+ LAZYADD(emissives, emissive_appearance_copy(overlays[index], limb))
+ return emissives ? (overlays + emissives) : overlays
/**
* Helper to set the MOD-related info on the overlay, useful for MODsuit overlays.
diff --git a/modular_zubbers/code/datums/materials/basemats.dm b/modular_zubbers/code/datums/materials/basemats.dm
index 8ff9f118f7d..006d428f81e 100644
--- a/modular_zubbers/code/datums/materials/basemats.dm
+++ b/modular_zubbers/code/datums/materials/basemats.dm
@@ -1,7 +1,10 @@
/datum/material/silver/on_applied(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.AddElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+ source.AddComponent(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
-/datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
+/* /datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.RemoveElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+ source.RemoveComponentSource(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.5)
+
+//this component should be removed when silver is naturally removed, it should be possible for silver to be removed without this proc being called.
+ */
diff --git a/modular_zubbers/code/game/objects/items/holy_weapons.dm b/modular_zubbers/code/game/objects/items/holy_weapons.dm
index 9e46de49bb0..6811635edef 100644
--- a/modular_zubbers/code/game/objects/items/holy_weapons.dm
+++ b/modular_zubbers/code/game/objects/items/holy_weapons.dm
@@ -88,7 +88,7 @@ means that you'll be forced to move carefully while it's on. Fits in pockets, an
on_clear_callback = CALLBACK(src, PROC_REF(on_cult_rune_removed)), \
effects_we_clear = list(/obj/effect/rune, /obj/effect/heretic_rune, /obj/effect/cosmic_rune), \
)
- AddElement(/datum/element/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
+ AddComponent(/datum/component/bane, target_type = /mob/living/basic/revenant, damage_multiplier = 0, added_damage = 25, requires_combat_mode = FALSE)
/obj/item/dualsaber/chaplain/proc/on_cult_rune_removed(obj/effect/target, mob/living/user)
if(!istype(target, /obj/effect/rune))
diff --git a/modular_zubbers/code/game/objects/items/more_pkas.dm b/modular_zubbers/code/game/objects/items/more_pkas.dm
index 1d57117c914..883e0b3d952 100644
--- a/modular_zubbers/code/game/objects/items/more_pkas.dm
+++ b/modular_zubbers/code/game/objects/items/more_pkas.dm
@@ -56,7 +56,7 @@
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_HEAVY
max_mod_capacity = 60
- disabled_modkits = list(/obj/item/borg/upgrade/modkit/aoe) // Should cover all AOE variants
+ disabled_modkits = list(/obj/item/borg/upgrade/modkit/cooldown/aoe/) // Should cover all AOE variants
/obj/item/gun/energy/recharge/kinetic_accelerator/glock
name = "proto-kinetic pistol"
@@ -90,7 +90,7 @@
obj_flags = UNIQUE_RENAME
weapon_weight = WEAPON_LIGHT
max_mod_capacity = 75
- disabled_modkits = list(/obj/item/borg/upgrade/modkit/aoe) // Should cover all AOE variants
+ disabled_modkits = list(/obj/item/borg/upgrade/modkit/cooldown/aoe/) // Should cover all AOE variants
/obj/item/gun/energy/recharge/kinetic_accelerator/shockwave/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0)
target = get_edge_target_turf(user, user.dir)
@@ -154,7 +154,7 @@
fire_sound = 'sound/items/weapons/gun/general/cannon.ogg'
/obj/item/ammo_casing/energy/kinetic/m79
- projectile_type = /obj/projectile/bullet/mining_bomb //uses the mining bomb projectile from the mining modsuit
+ projectile_type = /obj/projectile/bullet/mining_missile //uses the mining bomb projectile from the mining modsuit
select_name = "kinetic"
e_cost = LASER_SHOTS(1, STANDARD_CELL_CHARGE * 0.5)
fire_sound = 'sound/items/weapons/gun/general/grenade_launch.ogg'
diff --git a/modular_zubbers/code/game/objects/structures/lewd_portals.dm b/modular_zubbers/code/game/objects/structures/lewd_portals.dm
index cf90dea5442..f8343caf4a3 100644
--- a/modular_zubbers/code/game/objects/structures/lewd_portals.dm
+++ b/modular_zubbers/code/game/objects/structures/lewd_portals.dm
@@ -179,7 +179,7 @@
/obj/structure/lewd_portal/proc/head_only()
SIGNAL_HANDLER
current_mob.cut_overlays()
- current_mob.update_body_parts_head_only()
+ current_mob.update_body_parts()
var/obj/item/clothing/glasses = current_mob.glasses
if(glasses)
current_mob.update_worn_glasses()
diff --git a/modular_zubbers/code/game/turfs/closed/lunar_cave.dm b/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
index f537aa25eff..9dfe12f278e 100644
--- a/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
+++ b/modular_zubbers/code/game/turfs/closed/lunar_cave.dm
@@ -56,7 +56,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/lunar_cave/mineral_chances()
return list(
@@ -81,7 +81,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/labormineral/lunar_cave/mineral_chances()
return list(
@@ -98,7 +98,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/high_chance/lunar_cave/mineral_chances()
return list(
@@ -121,7 +121,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/low_chance/lunar_cave/mineral_chances()
return list(
diff --git a/modular_zubbers/code/game/turfs/closed/lunar_surface.dm b/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
index c98cd1ca730..87d9c2f46ad 100644
--- a/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
+++ b/modular_zubbers/code/game/turfs/closed/lunar_surface.dm
@@ -56,7 +56,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/lunar/mineral_chances()
return list(
@@ -76,7 +76,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/labormineral/lunar/mineral_chances()
return list(
@@ -93,7 +93,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/high_chance/lunar/mineral_chances()
return list(
@@ -116,7 +116,7 @@
baseturfs = /turf/open/misc/moonstation_rock
defer_change = TRUE
initial_gas_mix = MOONSTATION_ATMOS
- proximity_based = FALSE
+ exposure_based = FALSE
/turf/closed/mineral/random/low_chance/lunar/mineral_chances()
return list(
diff --git a/modular_zubbers/code/modules/client/ssd.dm b/modular_zubbers/code/modules/client/ssd.dm
index 286bb22adce..4bcd17b491c 100644
--- a/modular_zubbers/code/modules/client/ssd.dm
+++ b/modular_zubbers/code/modules/client/ssd.dm
@@ -24,7 +24,7 @@
var/datum/timedevent/logout_timer
// Handles fresh ghosts. This includes cryo chambers
-/mob/living/ghostize(can_reenter_corpse)
+/mob/living/ghostize(can_reenter_corpse = TRUE, forced = FALSE)
. = ..()
var/mob/dead/observer/ghost = .
if(!istype(ghost))
diff --git a/modular_zubbers/code/modules/client/verbs/character_directory.dm b/modular_zubbers/code/modules/client/verbs/character_directory.dm
index 57b6da350ec..573b3587946 100644
--- a/modular_zubbers/code/modules/client/verbs/character_directory.dm
+++ b/modular_zubbers/code/modules/client/verbs/character_directory.dm
@@ -29,7 +29,21 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/attraction/init_possible_values()
- return list("Gay", "Lesbian", "Straight", "Skolio", "Bi", "Pan", "Poly", "Omni", "Ace", "Aro", "Aro/Ace", "Unset", "Check OOC")
+ return list(
+ "Unset",
+ "Check OOC",
+ "Straight",
+ "Lesbian",
+ "Gay",
+ "Bisexual",
+ "Pansexual",
+ "Polysexual",
+ "Asexual",
+ "Aromantic",
+ "Aro/Ace",
+ "Skoliosexual",
+ "Omnisexual",
+ )
/datum/preference/choiced/attraction/create_default_value()
return "Unset"
@@ -43,7 +57,20 @@ GLOBAL_DATUM(character_directory, /datum/character_directory)
savefile_identifier = PREFERENCE_CHARACTER
/datum/preference/choiced/display_gender/init_possible_values()
- return list("Male", "Female", "Null", "Plural", "Nonbinary", "Omni", "Trans", "Transmasc", "Transfem", "Andro", "Gyno", "Fluid", "Unset", "Check OOC")
+ return list(
+ "Unset",
+ "Check OOC",
+ "Male",
+ "Female",
+ "Nonbinary",
+ "Genderfluid",
+ "Trans",
+ "Andromorph",
+ "Gynomorph",
+ "Agender",
+ "Plural",
+ "Omnigender",
+ )
/datum/preference/choiced/display_gender/create_default_value()
return "Unset"
diff --git a/modular_zubbers/code/modules/clothing/accessory/accessory.dm b/modular_zubbers/code/modules/clothing/accessory/accessory.dm
index caf7a98a74c..a30d5b62129 100644
--- a/modular_zubbers/code/modules/clothing/accessory/accessory.dm
+++ b/modular_zubbers/code/modules/clothing/accessory/accessory.dm
@@ -23,7 +23,7 @@
/obj/item/clothing/accessory/pocketwatch/examine(mob/user)
. = ..()
- . += span_info("The current CST (local) time is: [station_time_timestamp()].")
+ . += span_info("The current CST (local) time is: [round_timestamp()].")
. += span_info("The current TCT (galactic) time is: [time2text(world.realtime, "hh:mm:ss")].")
/obj/item/storage/backpack/kanken //Donor item for LT3
diff --git a/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm b/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
index 0cb60af228d..9f008359f1e 100644
--- a/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
+++ b/modular_zubbers/code/modules/customization/eyes_opacity/eyes_opacity.dm
@@ -1,3 +1,5 @@
+var/eyes_opacity = 255
+
/datum/preference/numeric/eyes_opacity
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
savefile_identifier = PREFERENCE_CHARACTER
diff --git a/modular_zubbers/code/modules/customization/species/lycans/materials.dm b/modular_zubbers/code/modules/customization/species/lycans/materials.dm
index ac207b5c8b4..496fa285491 100644
--- a/modular_zubbers/code/modules/customization/species/lycans/materials.dm
+++ b/modular_zubbers/code/modules/customization/species/lycans/materials.dm
@@ -2,9 +2,12 @@
. = ..()
if (isitem(source))
- source.AddElement(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+ source.AddComponent(/datum/component/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
-/datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
+/* /datum/material/silver/on_removed(atom/source, mat_amount, multiplier, from_slot)
. = ..()
- source.RemoveElement(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+ source.RemoveElementSource(/datum/element/bane, /datum/species/lycan, damage_multiplier = 2, requires_combat_mode = FALSE, bane_damage_override = BURN)
+
+//this component should be removed when silver is naturally removed, it should be possible for silver to be removed without this proc being called.
+ */
diff --git a/modular_zubbers/code/modules/jobs/job_types/chaplain.dm b/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
index 9844b018b9d..16024399d7e 100644
--- a/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
+++ b/modular_zubbers/code/modules/jobs/job_types/chaplain.dm
@@ -23,5 +23,5 @@
/obj/item/nullrod/whip/Initialize(mapload)
. = ..()
// 1.3 * 18 = 23.4 per hit
- AddElement(/datum/element/bane, mob_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.3)
+ AddComponent(/datum/component/bane, affected_biotypes = MOB_VAMPIRIC, damage_multiplier = 0.3)
diff --git a/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm b/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
index fba20f5ae56..11896d171a7 100644
--- a/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
+++ b/modular_zubbers/code/modules/mob/living/carbon/human/human_update_icons.dm
@@ -1,4 +1,4 @@
-/mob/living/carbon/human/update_underwear()
+/mob/living/carbon/human/get_underwear_overlays()
remove_overlay(BODY_LAYER)
if(HAS_TRAIT(src, TRAIT_INVISIBLE_MAN))
return
diff --git a/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm b/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
index 9678a23bb82..6f84d9bc1ba 100644
--- a/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
+++ b/modular_zubbers/modules/ammo_workbench/code/ammo_workbench.dm
@@ -98,7 +98,7 @@
return
var/obj/item/ammo_casing/ammo_type = loaded_magazine.ammo_type
var/ammo_caliber = initial(ammo_type.caliber)
- var/obj/item/ammo_casing/ammo_parent_type = type2parent(ammo_type)
+ var/obj/item/ammo_casing/ammo_parent_type = ammo_type::parent_type
if(loaded_magazine.multitype)
if(ammo_caliber == initial(ammo_parent_type.caliber) && ammo_caliber != null)
|