From cafd3ffa6590f717b48e372ca34a56f219bcbbf5 Mon Sep 17 00:00:00 2001 From: Apogee-dev <60533805+Apogee-dev@users.noreply.github.com> Date: Fri, 18 Oct 2024 01:31:44 -0700 Subject: [PATCH 1/4] Makes the Cobra not just a better Mongrel (and fixes a typo) (#3437) ## About The Pull Request Reduces the size of the C-20r and Cobra-20's magazines to 24 rounds, identical to the Mongrel. This also means you get two clean reloads out of a box of .45 ammunition instead of having one mag and _almost_ a second mag. Also, fixed the "civillian" typo in the cargo listings for scarborough guns. ## Why It's Good For The Game not getting two reloads out of a box is just plain irritating and also the cobra shouldn't just be a mongrel but better ## Changelog :cl: balance: Reduced Cobra-20 magazine size to 24 rounds fix: removed a typo from Scarborough cargo catalog entries /:cl: --------- Co-authored-by: FalloutFalcon <86381784+FalloutFalcon@users.noreply.github.com> --- code/modules/cargo/packs/gun.dm | 8 ++++---- .../manufacturer/scarborough/ballistics.dm | 6 +++--- icons/obj/ammo.dmi | Bin 59485 -> 63668 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/code/modules/cargo/packs/gun.dm b/code/modules/cargo/packs/gun.dm index 4074f76194d3..acc0be4e62e8 100644 --- a/code/modules/cargo/packs/gun.dm +++ b/code/modules/cargo/packs/gun.dm @@ -31,7 +31,7 @@ /datum/supply_pack/gun/ringneck name = "Ringneck Pistol Crate" - desc = "Contains a civillian variant of the Ringneck pistol, produced by Scarborough Arms and chambered in 10mm." + desc = "Contains a civilian variant of the Ringneck pistol, produced by Scarborough Arms and chambered in 10mm." cost = 1000 contains = list(/obj/item/storage/pistolcase/ringneck) faction = FACTION_SYNDICATE @@ -66,7 +66,7 @@ /datum/supply_pack/gun/viperrevolver name = "Viper-23 Revolver Crate" - desc = "Contains a a civillian variant of the Viper revolver, chambered in .357 magnum." + desc = "Contains a a civilian variant of the Viper revolver, chambered in .357 magnum." cost = 2500 contains = list(/obj/item/storage/pistolcase/viper) @@ -198,14 +198,14 @@ /datum/supply_pack/gun/boomslang90 name = "Boomslang-90 Rifle Crate" - desc = "Contains a civillian variant of the Boomslang Sniper rifle- modified with a 2x scope, rather than a sniper scope. Chambered in the powerful 6.5x57mm CLIP." + desc = "Contains a civilian variant of the Boomslang Sniper rifle- modified with a 2x scope, rather than a sniper scope. Chambered in the powerful 6.5x57mm CLIP." cost = 5000 contains = list(/obj/item/storage/guncase/boomslang) crate_name = "rifle crate" /datum/supply_pack/gun/cobra20 name = "Cobra-20 SMG Crate" - desc = "Contains a civillian variant of the Cobra SMG, manufactured by Scaraborough Arms and chambered in .45" + desc = "Contains a civilian variant of the Cobra SMG, manufactured by Scaraborough Arms and chambered in .45" cost = 3000 contains = list(/obj/item/storage/guncase/cobra) crate_name = "SMG crate" diff --git a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm index c6755bc808fb..e4054f0ac1bb 100644 --- a/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm +++ b/code/modules/projectiles/guns/manufacturer/scarborough/ballistics.dm @@ -421,12 +421,12 @@ EMPTY_GUN_HELPER(automatic/smg/cobra/indie) /obj/item/ammo_box/magazine/m45_cobra name = "Cobra magazine (.45)" - desc = "A 28-round magazine for the Cobra submachine gun. These rounds do moderate damage, but struggle against armor." - icon_state = "cobra_mag-28" + desc = "A 24-round magazine for the Cobra submachine gun. These rounds do moderate damage, but struggle against armor." + icon_state = "cobra_mag-24" base_icon_state = "cobra_mag" ammo_type = /obj/item/ammo_casing/c45 caliber = ".45" - max_ammo = 28 + max_ammo = 24 /obj/item/ammo_box/magazine/m45_cobra/update_icon_state() . = ..() diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index ec5f147485401833d8ad24fb12c0cf6a26dc9a09..633a49eda54cdda76e267094df7c7ec8c584a34c 100644 GIT binary patch literal 63668 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�*|;MXeLocOIpp9a2hEKsh&{V3eV-oI5oWFL%08;*XZJ;c2XuylNA=(E?6A5q zP(vm&#}E3rB6fO+b~<&eMG6BRy0I{4E`Bj79XY#kBTUHvBj41Kzq7C){zG!M%w$`3 zQFWY63Yr^-Dvy0C3cJ&HG$`iJ+uIkJZdKa+ZSg$+%!5DIRg}@4nmc;*?hphvG5Uan4|zQ3{A7 zvC$(E5*AKcck(8uT~zrF=eqvfX6n-AJs7n1!HFDNT8@(n+TJ|AD(ByDTik6do?G(G zY)$J8j{p2&5eLP>4o@kgu1NbWy%ndnzi8+fw1Q{ML&SB$@<-me3|Q`NJ5*SB7W)R= zSluG;Fgu&T2NV=p7GbK9{+LxAa`gL1Qf43bS!beX@>~8xSHRq6Rv!~b3ZeL_S##Sq z1*m_3G1D=A>CgWY;Kj-?R<G( z&G#JmyPTD}yMm8i{22q(vQ}N3v}Rr>W-fo=c)FX&Hqcc0>{N3}%*@1uKcZQVTRNHu zH7mfyaY+wbH34V%F?eSAUDBs1fXEs1{{7`Ym26nEAAe`hv8=07L*@J?%v01QM`GB8 zfz^DtD3&m_-mVBf?nU(wA;GF|nuPq@4$45-MkU;}+Li$k7xt~6Un{8jqCo{^0u(mOmmnBEWK6w!=)hB&wED8rVs zB{=ckH~97C*M`@@F*}!1$&QZ4sB?$*V38yJnB?JWv|Th}WF%t-7a=I(*0Rm@#X)W* zKLcTZ&P*jVI9#Dq@6bUh7_moA(((XJ4*HO^?tDHkzp>BKGBO#)S6!>VaF#IfjN0BI zn#42tp%$VUhRC4fH41&yJ%B?Gh8N|WKsR&n(YS-%PGZpLjQ6;1P2ZEp2eU+r*shl+ zV_ns8Osg4;Tm5BO-Vh1h{!=#G7p%8m_>Pq-KI1noLOm4+kLy%Mhu}VnX3fG1R|JCT zhmhpaVP&x+91Y49sz-Rf?s5@W6^KoR+_h%)i&G&)(*nN@X0FNX!>^2V*zX>o!))Xx zsV`_49^lzF>BjwSSPY#B`$58mBbK;L$6pQk89C8Vt++lg(oaVs_AR@81$w`Qi%7v| zWgsL5LvI|aME_VY5<*SP&o+PaHqWT#UZRt9?p5l~X82R=Yr*nf$~voJG|R*gc_&4d zxOpKEi~N@R44>ggRyH)qwP7^S^3W6gURUe$pmVyJ^96d$sub1XgOP_U?GkWvNMKS60#|Cx<*~{!2TWgrj-hV)p>DBdwVo;BXg2)A4b&22r7br8WMZbYqF86HX;MrW<7kvNb z*5@yHvCHU6TJy!{-iv*)JYRp`3NFjqX+uMEYiX2_&&rz^!iVViu_24lv8b6ldAg5> z@LlPoi2EPNDr^%?_!wtnP*`M#`Jv=BEj&9`V-RT@X!fc5e$M{0z_E z+$XrAa~I8wMXqJpZu)LRjP?Z`V5?5VB6+@U;Po>za4M&5 zS<_@yteK$An7%^+E&MFlnS8y-{qJ-a{+g$hW71bBoa%cqW9+8Ad+~6v+}yS+E{g{a^2F+lvj;xoG0sKH$w!{k(%Sl)bx%lN zN>p!xNFe}ctvv&V4sE}F73`&D6-BRw1QPjPhn^{yd8`cHBP7}QVEVE(vX()2{N>d+ z8K{Win>O}2H}NcM^FEI>%Z*Of<|?UA^n#c*zsdo!+o4g4{Fv?NRw2B~!%f&u7W*=_ z>$4`B>gkNc?B01aJw5J%+q-jqnu6|7I4*0Cepf}!KAk=L6j{_lNq7b$>3!poJpaF` zg5$zkpRT9k5#t(ZUk4q1plr~*|GS81>~SCCUnnmFa~qmd(s6DPDlo(0^5;bwnd=@P zyD>!Pzs+LL#(J;cXpL*e2bk2qy1NP!{MSfEp86_|C-pDy55{uEd*kppWcsHJoCeYV zd`SczJlu^oAyS7inbkRtR7&=IkkA0SJ z^6l?${dj!a$Iw(oFov4w(YCp<_bQ#>H`(^vyH~l#0Ht?{Uj?+&q#~o=;O{47@yHd)L_lZ%FqoUQXPJL zvA?P0pC+T{VFY}S4}EgR=7$IQwPrC#3OnBHJ;~e!2rlBR z*{EAakW|Uj>sgF-j=!h79krq$vu#p&&%8@?4zqzaH%!UXW5yKW*u)t7y8JQ!L_qZYU8lZFy{S=lm|$=jHrgwXF$T|hzcwSK!6>hKOe%9i=e z+IP=>oAlyiNXt%49pI-+d!e}*ILkxlfCeREltB79Y4pzVvHvcT_2IWlg*|QOdC}^w zfz*MJ)566)NAJ=)BXK($bvRaSVn)$*^=t0_Z1sYvl}Xf#_*@~$Mh@qXww>FEQ@*(# zE*LjgcmRna05Vvt>8rI9Pe{@0$m2iDCA&d?p1;r&6q=8R%#T{bP=0V zyP73Bpb%s@B~)a`B25yd=f5S~A;lZJ+o#u|xl*Q0s3Q#4&|i1!_7d2vZRavFl7DJE zc9;88l>c&hehtAFJt>$f+ro=8Vyy5HylO650Ra=IqzejA7ZxGf)4l7n{?^UhVAiA2 z4LQ!{-L?FVG3r%YQSu`&OkfstJKnWx)5RBagVGObiC-hf9#EmH3b;!_VPcig=M*-( z+}3&bY$Wq+f1hLL>{VC#JEqS;U;tIl#^ka*c3~}r5&{+3ccpCe#V}~-k}OpcE>W;o zO!FBUqX5=eg*Uy=S5N8|pI=PdF!TU9G+2xyy6~3toDO}LW$&(zv)NZd|6ed9*LfU< zwG~iO19aYqTz*VmbR|?l0n5ZKt(mFiff4?UJfwi@*mng^OSTt75QsGo0{jC=^a0=kna@@#;~=PzEPL(Uh3) zifRV=Pdmc;S*aZ?=fp9mj*%-4{cHW&;Vg;Y;-G4lDN@w<{H0(#0uyu199w(y(r@H_ zIKO=NC-@z#;tHQ`?^Vz(t;|7Z+O?nLhdbq&9tbOg0oKP*^cQ^JKSbB(fc7HX4-gT1 zy?E}%dC3Y=ixpXblfdYY(?yG6EB1@-XrZn}%@*A)FRr*wGc5d&3!b5px|o+v&To`6n1W>QX35 z`4A4M0A1|>tNUQ|5Aqw}2KWzsPIS`5w;S>O50C|ivn%M_;`M7CHQU58{Z7ZWi8k-m)!=mwT2=S%hMzv*&QcHCFCW%HC*xdl_fCxn z`2$&?k1V|9_79wk4RQvrAL8$0?y7gyqXJuI1cd>7G&l}>itiUuDn$bTwmK(p?RU60 z(Lp$DPNj-7M*dg`j7AkQ8z7IRZ}w6+s(xv zX4+j+s|pl<-!n8cY^g6&^xI0FzOdN_-r;e;%9^V2_PQBuE$*XU0e1eUSq^yf0n^Jn zYsV;-Lwk72@jbHK2rd#|e$M}7a+m{Mq z7cLNk_so)mS1BT@P`+6&bRlZ&)O|KBC_O2g5?qA+CwJW=8& zXBZ&n52hFIfA6b(0lK_iyt`8+_Tla*z-p@-0=sQI=1N_;i)GBmnji`+Ewrd+&^|c9 zqstN0%#W)fRIL7{pquynyQp!RS)O4Xr0ki-OLOR&Wr7}Hnywk5#?#3eU*@U))=QbeLzC%B)O$kL%+{iWc2otcjJMxQf6 za}!4#-LI$b;}?7WF>6)U>H3(zyvI4&ML)j`w5Xi2K^NYsTm-X`w=euA1CDrF2P>~8 zlmFy_-~$@Cdb2H#-|)fwjPQc?d~daD|LCex9s~jZ=P4;6!8qbh)YUYY_r7{IXlJ{PKx@hFIJliH(xTS(a^B~2&W83?<(q?2JM@$JKX@d$#_N1o z&xO6q#WM3KDm4R1tGKfNN!ts4vpI*YUi{+TfjP=G0QF;G*1)Q>DqkrBpNPQd50$Ha zX|bhy?I^sFz{cFAi__sq70y&;Duba>^IZo?BQ}J)lJKM5{*aipJ7kF

ac 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 jo@1*2Kb7_E_9+R^B^pk%;)x{){M@y zij*WEAPFUq-ndAD-CBd@?dxvtSGB04*1P=jZOv0^EIl$jDxPto~@|yQs(-H8xl)wSehJz9nwN z92dFp(mB7Lea?ts`)l&GehxwXM|wUfM0|0z;AM_O1a{nK#l}w6}qnr$WV$8M}YF*3o}jj{Kzk zRE;@yN5^`vOCn*6qhnY6!EezRj+M7szfJ4Xi7l#*6C8S*rVWN#dsv>2IdR}8d23N$ zAa~k~`}Z^-Q6O$Qn+g+C6f>*HCyZ`x$>ltn^NM3=`Fa_~A5u>ffP~&|7dE6&rJp+E zQscO{(cM(QV<2fBuEUpUM9ow}S=1Bo$V2KAPW?vlFYUxX>QiKNMLm>1rC+KAgwqzu zat{A?hcuL3pR%UfQg``lKnkG9{_{#v`Gd*vqIGDeML0@!+%fnakAY}B&D8l%6A!8C zCK}3YBW7=j3q>t_wyS;h+T0FdGIi=<&iU#nT1N$|RoSODt2W~e*z(r6qPdf7WiDCD z(rfb1g5S{?>3r=*5uU6zy`?c4Snfv2^ml)7Dv%jsWaoc~+I2qe$?plExnyIJUg!C# z1VUnWsYykpr3!ashO~DQZrgNgo4uoF>o14B%vs17M>0`rarcG(;1{LA5*4NMg1*I) zcj*{0ZrMNPQgp7V`Tj<%s=@I_<;~2=8w@2az|WcnGGrQ*ud=I<=r>0UUFV?>yFVr1 zFzT}k;nt;vgB7>9ueG8X)t}c>=zLp;q?|r;nX2PM==Mz1=}J%4>E)5QS8WW)Yg_F zWMI<$j>;WFRfqW4#;13jK!tW?3rZQazfki5AseE?5E$VyB1Jp@_=@x+K44EvI-FxI z*IedX-8XMBY`;yXe*W1R74L0xhuroOn47UiF}PasO||0NYQ^`}Tv^pz1=Ws|>t!3y zE&P=#+WDsKqC6xtaP5Unh)GAm>5;pFDvF(tUK7Z|%j2nl|)L7=)T{zP7lu z`f4VxTh!p}bCN}Y94+IIWbEAICt=U!g!3lZA3c&2{w=e2V3?XG`OAp0&PGNCC(7=X zx}rQuVkzz#UHZDYJ`CyfG&0>VP3Onga3E=B{qinXt*O=841~G1BvP_X_&xE=7lmn3 zWJ}F|aj%01Y+-_;1#Mfxl~TxLXB_W9c?>qAXecFvomG?GLfM3@X48wCx$dg*zBCv! zJ|XWQ`R`ttd%rc)d@Byh|1y*elElT|D0F|bhpo^b6Eh)w=ds$+p9_#~IboCR;_{o1 zRn8g??u;6v3AowCa5w#rwP(E}m5=@QB%eEP&Lb%b z2V1FL;QIz_D`l3~lE>atFaO+D*pw#Yw3Oo;|K=1j+c?;FeuQ2)q}HaQ3<*z){9%zoQT@=($<8Et^rPLX}@9a8VIQ{(#k@)P|x(I}(9tvOa z(yEacA-pJP*^^0K>Uok%Re_E@JELyCe)x)Gm*J5ME!&!|UsD+)nb-|hlL88E4GWqw z<`$Xz5oJ=A+ZjE~kzrq%Zr&90Ok|Jkr;5=I|HZ!XrBGU3=$9g=nNioYvS2*3KT>*| zESB-g_~0t{W9}Evn86xiA%h3p)Ea3qG2m;8!uV%go8JuF{*0VC_1{?nY3G!Fh;cUM z_{K_nnp*lgHlpFaQ-&qSh?i61Z&1qD;Rp3j( zF#B_w_0mmWc-BqV6wfhxLu;F#Ns>{RchuJ+7G7Z{O!6^?T1PQ=$7;K0P0ilIP&>~9 zBZtq*if;%}kjEQgjC#wo7nKlUmH{z2BoK95WzulKZb3g!Hsw7 z4ZzIJxg;TdDibj-Mf*o3ewjK+(vUlHjw>a+)VCOrj<*;>lAD~l{qq(TZ|S#+KDxAZ zJLGB2t)Y1)v$ZT5wc^*0yZOn>f{hv5gr3nl;zixXdY?-6jQz$){cShqr>)`SFzEta z9q0V}>N_P(h!Hw;qWZHCP1D+^{pB6Gx)>g+;GN5K*gxW|FF8%Z_8x}@UB0ZF>nNw& zntyOr_yfLH6AKZW0{85`PB{tO-HX0Or2Hmwc4I_H*@KL1wO>z5-QwlP?N1CJFHL{i zWyyS!5N7(0oaVlh+7%(iH{XO-#f8hbE>p+yI?p{(P{4RJm^S*=N-Ov+a~%cm_HT=H zxcWXHxmFX)Vj(N8Vgs(bN3HYhQUp0wloKm!4A1gh5VZ6}q13YiZ?pL^r)K5oKny*- zj6mmCqOC|I(#I*y;!6S%$v$7I-Z7OAviEPTyKgdD3EfY!#LQNk#^o&JZCqI~XKD*n zXF;3i;)OYtpOWb*G2ZiWL=XF`mPW;Mm(D8G+E*Lxv}cG42ypZ;?R6?R6!?aS?5Ze& z`2$g2U3N0in&yKfJkq!U+N?%7XZS(Zy@8lpS;<>A3wrfiU{m#QRXRTFWmFE>e^sec zR3JdRvAw;0h`6u-4~Bcqn~B5NCsyWX@<(%AEvC=DP8yk>Mx8SF@ARMo21cV#BM z8D;|c6ue5LovyLpL6)lEDh&`>$Crs1$NLwWCDnHfZQc@nBSQDJ)VHS-g}yv#A>C!t5R zS)bl6l9{j6s&treJ7_^WgihGr7HXAj*Jiy`rYwd4IlNuDm@| zU0sbVg;wD&zM|7?TAL|W!IkfV5er)v$s_zcz4-ExSS;Rfh5KE7Op+?$BmQs%G5q-u zgdlOE&rojBu;+zl7_jZi3DLLs(W99RFJV2a-!w6=bOwC*cPfvGL?R^)^p7*MdWzm%qEouu|ZDs1ZS|YGBUD>)&yijfoL0f%*%1un!sUulT?@IkD zV*7b8K`E2srMmWUZ2hCxoBMRI;FBdJj5M(m-22zt$}V%^Ro`$$l@C%(YAu?XGO9d3 zU!AlS_K{D%5T=qy-r*z)y(Cov?9dK>B2}2Il6Ss8jum2|9fY4;E0y{F4j8kG)D2^sGOP&{uAwOteAZP}Z(Ml8>ul}hC3i(rYI^eqLFatJ_e}chCL6A0X`1G$KS(LGYpeZUQPm6kuhE3i;Gb+IXf=9Xz&pER!mmcjd&8NrG zJ&c3a9ZE1tJJg^_cKqSP z{vs~yt5zjc+$}dIXrYA&Z?|~$fBhD)K<|+iJTsFJC03Z>UVo2! zBl-FC!|ZgdDAt_!=yT~O;Y092buFg7=*7s<_a}XOmnq{j>)ecWrctLgU6m2e$)d_i z%t+YfsXM87q-3Nc_OAZaLwXtlRmP=M=d$o|CicwwndIV;M}M))`($|!rlT(x+fTpsYPBbvhH$HH?KmUf2%cRr+ z;*zj{2r{-r4Y69cGp48DRapk|Fo>*zqX)=|dnbT6+OQA8@PJwZ(S<~2v4_Z&WgJ)& zEC1;&Vdusts5XC2bqk9h=4iN?9R+4JIKa!odhnf6Uqaf;NdDEiNkvG~x<}Xp$SJ=4 z(dxrO6@ds{0)I08Zf1R*Mb!u%(T0^_Q`0)6Ib8lQzrQhKpAUNebx*83iahr^YBjv+ z&zahCqf_kVl;4HKu@-2}!duTqhb6H&$?$y_CffE{!(4)WY<1 z66Zv8lX!b&BMy%YQXdcaz$D!f2Nj_xn?i_UhqmYHPnACr6CR`2yDW44PG#6d)NUL zp=Rt;sGB21ADX}=u#MI zo<$AWT3d_Rb>$`O5?)w#5dSo9&*qayHRBPPI2i(&5pjDH8HYLAqIZ?D!gI>{Dw>V4 zQGaw$|X_v2?i;NA<*qa)vbDb0lq{PvFIg=Ml%l;b)_eVl}|}SH-Eb z0w5`Ngxx?~E+X+dN8-4xpWnbk`PcK1WZzY)qKjXX)^}BI>Q4m`KAn3PXF_hsl_)&L zQ|gYreNmypcgRw>;f2`ei}!#Ta`8~CDXf%dY6y-dX(94e_~TiOtc&)uY z1IJSJ=Y!3tSozg67BfHvF}yDjVB~9S(rlVXHE9Y3paR0=#j%iI;oNh@zx4XdRp;>$ ztY+6;y&ZxkB?rkUxY{0{RDwc2Zy{?#zwwj^^xcp8(`rxJe4sj;44#Y5zQV{;;-LAu z^c?jZ?lmSkcPH4Z$lUn;^aUg1_+_=7B6zvWP�|5v&&(+6#QTH|7xXxCio~B9FI+ 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

)AGle|iV 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 Date: Fri, 18 Oct 2024 03:51:36 -0500 Subject: [PATCH 2/4] Automatic changelog generation for PR #3437 [ci skip] --- html/changelogs/AutoChangeLog-pr-3437.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3437.yml diff --git a/html/changelogs/AutoChangeLog-pr-3437.yml b/html/changelogs/AutoChangeLog-pr-3437.yml new file mode 100644 index 000000000000..0c4f39c31eea --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3437.yml @@ -0,0 +1,5 @@ +author: Apogee-dev +changes: + - {balance: Reduced Cobra-20 magazine size to 24 rounds} + - {bugfix: removed a typo from Scarborough cargo catalog entries} +delete-after: true From 18171b5e0d408067f7618ed377486d613a27f2c1 Mon Sep 17 00:00:00 2001 From: Erika Fox <94164348+Erikafox@users.noreply.github.com> Date: Fri, 18 Oct 2024 04:54:47 -0400 Subject: [PATCH 3/4] Kill Xenobio Stuff (#3527) ## About The Pull Request Removes Xenobiology (minus slimes since they're good fluffmobs sometimes). ## Why It's Good For The Game cruft. thgvr said they'd get me a therapist if I did this. ## Changelog :cl: del: Xenobiology (minus slimes) /:cl: --------- Signed-off-by: Erika Fox <94164348+Erikafox@users.noreply.github.com> Co-authored-by: Bjarl <94164348+Bjarl@users.noreply.github.com> --- .../JungleRuins/jungle_cavecrew.dmm | 12 +- .../RockRuins/rockplanet_budgetcuts.dmm | 14 - _maps/RandomRuins/SpaceRuins/power_puzzle.dmm | 4 +- .../shuttles/nanotrasen/nanotrasen_delta.dmm | 3 - check_regex.yaml | 6 +- code/__DEFINES/atmospherics.dm | 2 +- code/__DEFINES/dcs/signals/signals.dm | 8 - code/__DEFINES/flags.dm | 2 - code/__DEFINES/misc.dm | 9 - code/__DEFINES/mobs.dm | 4 +- code/__HELPERS/icons.dm | 7 - code/__HELPERS/mobs.dm | 22 - code/_globalvars/bitfields.dm | 1 - code/_globalvars/lists/flavor_misc.dm | 7 +- code/datums/components/dejavu.dm | 107 -- code/game/gamemodes/objective_items.dm | 11 - code/game/machinery/syndicatebomb.dm | 15 - .../effects/anomalies/anomalies_bluespace.dm | 2 +- .../circuitboards/computer_circuitboards.dm | 5 - .../circuitboards/machine_circuitboards.dm | 28 - code/game/objects/items/devices/scanners.dm | 60 - .../objects/items/grenades/chem_grenade.dm | 28 - .../objects/items/grenades/clusterbuster.dm | 40 - .../objects/items/implants/implant_misc.dm | 7 - code/game/objects/items/storage/bags.dm | 3 +- .../game/objects/items/storage/uplink_kits.dm | 1 - code/game/objects/structures/salvaging.dm | 2 - code/game/turfs/open/floor/misc_floor.dm | 14 - .../antagonists/changeling/changeling.dm | 14 - .../mission_code/moonoutpost19.dm | 121 -- code/modules/cargo/bounties/slime.dm | 39 - code/modules/cargo/bounty.dm | 16 +- .../clothing/outfits/factions/minutemen.dm | 4 +- .../kitchen_machinery/monkeyrecycler.dm | 103 -- .../kitchen_machinery/processor.dm | 59 +- .../kitchen_machinery/smartfridge.dm | 17 - .../recipes/processor_recipes.dm | 5 - .../recipes/tablecraft/recipes_pie.dm | 1 - code/modules/mining/minebot.dm | 24 - .../living/carbon/alien/special/facehugger.dm | 1 - .../living/carbon/human/species_types/IPC.dm | 2 +- .../carbon/human/species_types/abductors.dm | 2 +- .../carbon/human/species_types/android.dm | 2 +- .../carbon/human/species_types/ethereal.dm | 2 +- .../carbon/human/species_types/flypeople.dm | 2 +- .../carbon/human/species_types/humans.dm | 2 +- .../carbon/human/species_types/jellypeople.dm | 134 +-- .../carbon/human/species_types/kepori.dm | 2 +- .../human/species_types/lizardpeople.dm | 2 +- .../carbon/human/species_types/mothmen.dm | 2 +- .../carbon/human/species_types/podpeople.dm | 2 +- .../carbon/human/species_types/spider.dm | 2 +- .../living/carbon/human/species_types/vox.dm | 2 +- .../simple_animal/friendly/butterfly.dm | 1 - .../living/simple_animal/friendly/capybara.dm | 1 - .../mob/living/simple_animal/friendly/cat.dm | 3 - .../mob/living/simple_animal/friendly/crab.dm | 5 - .../mob/living/simple_animal/friendly/dog.dm | 4 - .../simple_animal/friendly/farm_animals.dm | 6 - .../mob/living/simple_animal/friendly/fox.dm | 2 - .../living/simple_animal/friendly/lizard.dm | 1 - .../simple_animal/friendly/mothroach.dm | 1 - .../living/simple_animal/friendly/mouse.dm | 2 - .../living/simple_animal/friendly/penguin.dm | 1 - .../living/simple_animal/friendly/sloth.dm | 3 - .../living/simple_animal/friendly/snake.dm | 1 - .../living/simple_animal/friendly/turtle.dm | 1 - .../mob/living/simple_animal/hostile/alien.dm | 3 - .../mob/living/simple_animal/hostile/bear.dm | 1 - .../mob/living/simple_animal/hostile/bees.dm | 1 - .../mob/living/simple_animal/hostile/carp.dm | 3 - .../living/simple_animal/hostile/cockroach.dm | 2 - .../living/simple_animal/hostile/eyeballs.dm | 1 - .../living/simple_animal/hostile/faithless.dm | 1 - .../simple_animal/hostile/giant_spider.dm | 6 - .../mob/living/simple_animal/hostile/goose.dm | 2 - .../living/simple_animal/hostile/headcrab.dm | 2 - .../living/simple_animal/hostile/hivebot.dm | 1 - .../simple_animal/hostile/human/survivors.dm | 2 +- .../simple_animal/hostile/human/syndicate.dm | 1 - .../simple_animal/hostile/killertomato.dm | 1 - .../hostile/megafauna/colossus.dm | 1 - .../mob/living/simple_animal/hostile/mimic.dm | 97 -- .../hostile/mining_mobs/basilisk.dm | 2 - .../hostile/mining_mobs/goldgrub.dm | 1 - .../hostile/mining_mobs/gutlunch.dm | 2 - .../simple_animal/hostile/netherworld.dm | 2 - .../living/simple_animal/hostile/regalrat.dm | 1 - .../simple_animal/hostile/retaliate/frog.dm | 1 - .../simple_animal/hostile/retaliate/ghost.dm | 1 - .../living/simple_animal/hostile/statue.dm | 1 - .../mob/living/simple_animal/hostile/tree.dm | 1 - .../simple_animal/hostile/wumborian_fugu.dm | 1 - .../mob/living/simple_animal/parrot.dm | 2 - .../mob/living/simple_animal/simple_animal.dm | 2 - .../mob/living/simple_animal/slime/slime.dm | 52 - .../movespeed/modifiers/status_effects.dm | 17 - code/modules/power/cell.dm | 12 - code/modules/reagents/chemistry/holder.dm | 14 - .../reagents/pyrotechnic_reagents.dm | 4 - code/modules/reagents/chemistry/recipes.dm | 32 - .../reagents/chemistry/recipes/others.dm | 20 - .../chemistry/recipes/slime_extracts.dm | 595 --------- .../research/designs/comp_board_designs.dm | 8 - .../research/designs/machine_designs.dm | 9 - code/modules/research/experimentor.dm | 1 - code/modules/research/rdconsole.dm | 23 - code/modules/research/techweb/all_nodes.dm | 4 +- .../xenobiology/crossbreeding/__corecross.dm | 193 --- .../xenobiology/crossbreeding/_clothing.dm | 78 -- .../xenobiology/crossbreeding/_misc.dm | 234 ---- .../xenobiology/crossbreeding/_mobs.dm | 45 - .../xenobiology/crossbreeding/_potions.dm | 217 ---- .../crossbreeding/_status_effects.dm | 971 --------------- .../xenobiology/crossbreeding/_weapons.dm | 38 - .../xenobiology/crossbreeding/burning.dm | 307 ----- .../xenobiology/crossbreeding/charged.dm | 272 ----- .../xenobiology/crossbreeding/chilling.dm | 301 ----- .../xenobiology/crossbreeding/consuming.dm | 460 ------- .../xenobiology/crossbreeding/industrial.dm | 199 --- .../xenobiology/crossbreeding/mutative.dm | 27 - .../xenobiology/crossbreeding/prismatic.dm | 124 -- .../xenobiology/crossbreeding/recurring.dm | 138 --- .../xenobiology/crossbreeding/regenerative.dm | 354 ------ .../xenobiology/crossbreeding/reproductive.dm | 133 -- .../crossbreeding/selfsustaining.dm | 149 --- .../xenobiology/crossbreeding/stabilized.dm | 190 --- .../research/xenobiology/xenobio_camera.dm | 473 -------- .../research/xenobiology/xenobiology.dm | 1072 ----------------- code/modules/surgery/core_removal.dm | 44 - code/modules/unit_tests/create_and_destroy.dm | 2 - code/modules/uplink/uplink_items.dm | 9 - shiptest.dme | 28 - 133 files changed, 41 insertions(+), 7968 deletions(-) delete mode 100644 code/datums/components/dejavu.dm delete mode 100644 code/modules/awaymissions/mission_code/moonoutpost19.dm delete mode 100644 code/modules/cargo/bounties/slime.dm delete mode 100644 code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm delete mode 100644 code/modules/movespeed/modifiers/status_effects.dm delete mode 100644 code/modules/reagents/chemistry/recipes/slime_extracts.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/__corecross.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_clothing.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_misc.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_mobs.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_potions.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_status_effects.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/_weapons.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/burning.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/charged.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/chilling.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/consuming.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/industrial.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/mutative.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/prismatic.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/recurring.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/regenerative.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/reproductive.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/selfsustaining.dm delete mode 100644 code/modules/research/xenobiology/crossbreeding/stabilized.dm delete mode 100644 code/modules/research/xenobiology/xenobio_camera.dm delete mode 100644 code/modules/research/xenobiology/xenobiology.dm delete mode 100644 code/modules/surgery/core_removal.dm diff --git a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm index 557a50d9a11e..923e58b4cb05 100644 --- a/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm +++ b/_maps/RandomRuins/JungleRuins/jungle_cavecrew.dmm @@ -1028,14 +1028,10 @@ pixel_y = 32 }, /obj/structure/closet/secure_closet/freezer/wall/directional/west, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/condiment/enzyme{ pixel_x = -8; pixel_y = 5 diff --git a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm index 183df18879da..3b2b995fd979 100644 --- a/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm +++ b/_maps/RandomRuins/RockRuins/rockplanet_budgetcuts.dmm @@ -960,21 +960,7 @@ /area/overmap_encounter/planetoid/rockplanet/explored) "pj" = ( /obj/structure/table/reinforced, -/obj/item/slime_extract/grey{ - pixel_x = -4; - pixel_y = -1 - }, -/obj/item/slime_extract/grey{ - pixel_x = 8 - }, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/grey, -/obj/item/slime_extract/green{ - pixel_x = 4; - pixel_y = -6 - }, /obj/structure/window/reinforced, -/obj/item/slime_scanner, /turf/open/floor/engine, /area/ruin/rockplanet/nanotrasen) "pl" = ( diff --git a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm index e126234531f2..e02a7e328b28 100644 --- a/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm +++ b/_maps/RandomRuins/SpaceRuins/power_puzzle.dmm @@ -1850,8 +1850,8 @@ /obj/item/reagent_containers/food/drinks/waterbottle/empty, /obj/item/reagent_containers/food/drinks/waterbottle/empty, /obj/item/reagent_containers/food/drinks/waterbottle, -/obj/item/reagent_containers/food/snacks/rationpack, -/obj/item/reagent_containers/food/snacks/rationpack, +/obj/effect/spawner/lootdrop/ration, +/obj/effect/spawner/lootdrop/ration, /obj/item/reagent_containers/food/snacks/sosjerky, /obj/item/reagent_containers/food/snacks/sosjerky, /obj/item/stack/medical/gauze/improvised, diff --git a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm index 351e8e2df037..0d57e0ca165a 100644 --- a/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm +++ b/_maps/shuttles/nanotrasen/nanotrasen_delta.dmm @@ -1874,9 +1874,6 @@ /obj/structure/rack, /obj/item/weldingtool/hugetank/empty, /obj/item/clothing/mask/gas/welding, -/obj/item/slimepotion/slime/sentience/mining, -/obj/item/slimepotion/slime/sentience/mining, -/obj/item/slimepotion/slime/sentience/mining, /obj/machinery/light/small/directional/east, /obj/machinery/button/door{ dir = 4; diff --git a/check_regex.yaml b/check_regex.yaml index 94f37cdcf83e..a4e63a1762f8 100644 --- a/check_regex.yaml +++ b/check_regex.yaml @@ -27,11 +27,11 @@ standards: - exactly: [1, "/atom text paths", '"/atom'] - exactly: [1, "/area text paths", '"/area'] - - exactly: [17, "/datum text paths", '"/datum'] + - exactly: [16, "/datum text paths", '"/datum'] - exactly: [4, "/mob text paths", '"/mob'] - - exactly: [36, "/obj text paths", '"/obj'] + - exactly: [35, "/obj text paths", '"/obj'] - exactly: [0, "/turf text paths", '"/turf'] - - exactly: [115, "text2path uses", "text2path"] + - exactly: [114, "text2path uses", "text2path"] - exactly: [18, "world<< uses", 'world[ \t]*<<'] - exactly: [0, "world.log<< uses", 'world.log[ \t]*<<'] diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 2870e31eff97..9a576932120f 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -200,7 +200,7 @@ /// the default air mix that open turfs spawn #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" #define OPENTURF_LOW_PRESSURE "o2=14;n2=30;TEMP=293.15" -/// -193,15°C telecommunications. also used for xenobiology slime killrooms +/// -193,15°C telecommunications. good fluff for comms areas #define TCOMMS_ATMOS "n2=100;TEMP=80" /// space #define AIRLESS_ATMOS "TEMP=2.7" diff --git a/code/__DEFINES/dcs/signals/signals.dm b/code/__DEFINES/dcs/signals/signals.dm index 9e034edeeb2c..f68655a7a3a4 100644 --- a/code/__DEFINES/dcs/signals/signals.dm +++ b/code/__DEFINES/dcs/signals/signals.dm @@ -677,14 +677,6 @@ #define COMSIG_ACTION_TRIGGER "action_trigger" //from base of datum/action/proc/Trigger(): (datum/action) #define COMPONENT_ACTION_BLOCK_TRIGGER 1 -//Xenobio hotkeys -#define COMSIG_XENO_SLIME_CLICK_CTRL "xeno_slime_click_ctrl" //from slime CtrlClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_ALT "xeno_slime_click_alt" //from slime AltClickOn(): (/mob) -#define COMSIG_XENO_SLIME_CLICK_SHIFT "xeno_slime_click_shift" //from slime ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_SHIFT "xeno_turf_click_shift" //from turf ShiftClickOn(): (/mob) -#define COMSIG_XENO_TURF_CLICK_CTRL "xeno_turf_click_alt" //from turf AltClickOn(): (/mob) -#define COMSIG_XENO_MONKEY_CLICK_CTRL "xeno_monkey_click_ctrl" //from monkey CtrlClickOn(): (/mob) - // /datum/overmap signals /// From overmap Move(): (old_x, old_y) #define COMSIG_OVERMAP_MOVED "overmap_moved" diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index 77e608ac922e..b97972be8a4c 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -97,8 +97,6 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204 #define HIDDEN_AREA (1<<6) /// If false, loading multiple maps with this area type will create multiple instances. #define UNIQUE_AREA (1<<7) -/// Can the Xenobio management console transverse this area by default? -#define XENOBIOLOGY_COMPATIBLE (1<<8) /* These defines are used specifically with the atom/pass_flags bitmask diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index c6fe0591ee27..68ef8b65b127 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -335,15 +335,6 @@ GLOBAL_LIST_INIT(ghost_others_options, list(GHOST_OTHERS_SIMPLE, GHOST_OTHERS_DE #define SYRINGE_DRAW 0 #define SYRINGE_INJECT 1 -//gold slime core spawning -#define NO_SPAWN 0 -#define HOSTILE_SPAWN 1 -#define FRIENDLY_SPAWN 2 - -//slime core activation type -#define SLIME_ACTIVATE_MINOR 1 -#define SLIME_ACTIVATE_MAJOR 2 - #define LUMINESCENT_DEFAULT_GLOW 2 #define RIDING_OFFSET_ALL "ALL" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 7bcca355f34a..0bda789b98d4 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -396,10 +396,8 @@ #define RACE_SWAP (1<<3) //ERT spawn template (avoid races that don't function without correct gear) #define ERT_SPAWN (1<<4) -//xenobio black crossbreed -#define SLIME_EXTRACT (1<<5) //Wabbacjack staff projectiles -#define WABBAJACK (1<<6) +#define WABBAJACK (1<<5) #define SLEEP_CHECK_DEATH(X) sleep(X); if(QDELETED(src) || stat == DEAD) return; diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 38e540e996b9..3e676f289458 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -1028,13 +1028,6 @@ GLOBAL_LIST_EMPTY(friendly_animal_types) // Pick a random animal instead of the icon, and use that instead /proc/getRandomAnimalImage(atom/A) - if(!GLOB.friendly_animal_types.len) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - if(initial(SA.gold_core_spawnable) == FRIENDLY_SPAWN) - GLOB.friendly_animal_types += SA - - var/mob/living/simple_animal/SA = pick(GLOB.friendly_animal_types) var/icon = initial(SA.icon) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ae5a1c1ce929..31ce8dceee49 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -482,28 +482,6 @@ GLOBAL_LIST_EMPTY(species_list) else to_chat(M, message) -//Used in chemical_mob_spawn. Generates a random mob based on a given gold_core_spawnable value. -/proc/create_random_mob(spawn_location, mob_class = HOSTILE_SPAWN) - var/static/list/mob_spawn_meancritters = list() // list of possible hostile mobs - var/static/list/mob_spawn_nicecritters = list() // and possible friendly mobs - - if(mob_spawn_meancritters.len <= 0 || mob_spawn_nicecritters.len <= 0) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - switch(initial(SA.gold_core_spawnable)) - if(HOSTILE_SPAWN) - mob_spawn_meancritters += T - if(FRIENDLY_SPAWN) - mob_spawn_nicecritters += T - - var/chosen - if(mob_class == FRIENDLY_SPAWN) - chosen = pick(mob_spawn_nicecritters) - else - chosen = pick(mob_spawn_meancritters) - var/mob/living/simple_animal/C = new chosen(spawn_location) - return C - /proc/passtable_on(target, source) var/mob/living/L = target if (!HAS_TRAIT(L, TRAIT_PASSTABLE) && L.pass_flags & PASSTABLE) diff --git a/code/_globalvars/bitfields.dm b/code/_globalvars/bitfields.dm index d9957c7db0f1..df6f39cd0bbe 100644 --- a/code/_globalvars/bitfields.dm +++ b/code/_globalvars/bitfields.dm @@ -56,7 +56,6 @@ DEFINE_BITFIELD(area_flags, list( "NOTELEPORT" = NOTELEPORT, "HIDDEN_AREA" = HIDDEN_AREA, "UNIQUE_AREA" = UNIQUE_AREA, - "XENOBIOLOGY_COMPATIBLE" = XENOBIOLOGY_COMPATIBLE, )) DEFINE_BITFIELD(car_traits, list( diff --git a/code/_globalvars/lists/flavor_misc.dm b/code/_globalvars/lists/flavor_misc.dm index f9edbc500142..f45781b014ea 100644 --- a/code/_globalvars/lists/flavor_misc.dm +++ b/code/_globalvars/lists/flavor_misc.dm @@ -247,9 +247,8 @@ GLOBAL_LIST_INIT(scarySounds, list('sound/weapons/thudswoosh.ogg','sound/weapons 25 Toxins 26 Dormitories 27 Virology -28 Xenobiology -29 Law Office -30 Detective's Office +28 Law Office +29 Detective's Office */ //The whole system for the sorttype var is determined based on the order of this list, @@ -265,7 +264,7 @@ GLOBAL_LIST_INIT(TAGGERLOCATIONS, list("Disposals", "Robotics", "Head of Personnel's Office", "Library", "Chapel", "Theatre", "Bar", "Kitchen", "Hydroponics", "Janitor Closet","Genetics", "Experimentor Lab", "Toxins", "Dormitories", "Virology", - "Xenobiology", "Law Office","Detective's Office")) + , "Law Office","Detective's Office")) GLOBAL_LIST_INIT(station_prefixes, world.file2list("strings/station_prefixes.txt")) diff --git a/code/datums/components/dejavu.dm b/code/datums/components/dejavu.dm deleted file mode 100644 index b2a2cddf9c9b..000000000000 --- a/code/datums/components/dejavu.dm +++ /dev/null @@ -1,107 +0,0 @@ -/** - * A component to reset the parent to its previous state after some time passes - */ -/datum/component/dejavu - /// The turf the parent was on when this components was applied, they get moved back here after the duration - var/turf/starting_turf - /// Determined by the type of the parent so different behaviours can happen per type - var/rewind_type - /// How many rewinds will happen before the effect ends - var/rewinds_remaining - /// How long to wait between each rewind - var/rewind_interval - - /// The starting value of clone loss at the beginning of the effect - var/clone_loss = 0 - /// The starting value of toxin loss at the beginning of the effect - var/tox_loss = 0 - /// The starting value of oxygen loss at the beginning of the effect - var/oxy_loss = 0 - /// The starting value of brain loss at the beginning of the effect - var/brain_loss = 0 - /// The starting value of brute loss at the beginning of the effect - /// This only applies to simple animals - var/brute_loss - /// The starting value of integrity at the beginning of the effect - /// This only applies to objects - var/integrity - /// A list of body parts saved at the beginning of the effect - var/list/datum/saved_bodypart/saved_bodyparts - -/datum/component/dejavu/Initialize(rewinds = 1, interval = 10 SECONDS) - if(!isatom(parent)) - return COMPONENT_INCOMPATIBLE - - starting_turf = get_turf(parent) - rewinds_remaining = rewinds - rewind_interval = interval - - if(isliving(parent)) - var/mob/living/L = parent - clone_loss = L.getCloneLoss() - tox_loss = L.getToxLoss() - oxy_loss = L.getOxyLoss() - brain_loss = L.getOrganLoss(ORGAN_SLOT_BRAIN) - rewind_type = PROC_REF(rewind_living) - - if(iscarbon(parent)) - var/mob/living/carbon/C = parent - saved_bodyparts = C.save_bodyparts() - rewind_type = PROC_REF(rewind_carbon) - - else if(isanimal(parent)) - var/mob/living/simple_animal/M = parent - brute_loss = M.bruteloss - rewind_type = PROC_REF(rewind_animal) - - else if(isobj(parent)) - var/obj/O = parent - integrity = O.obj_integrity - rewind_type = PROC_REF(rewind_obj) - - addtimer(CALLBACK(src, rewind_type), rewind_interval) - -/datum/component/dejavu/Destroy() - starting_turf = null - saved_bodyparts = null - return ..() - -/datum/component/dejavu/proc/rewind() - to_chat(parent, "You remember a time not so long ago...") - - //comes after healing so new limbs comically drop to the floor - if(starting_turf) - var/atom/movable/master = parent - master.forceMove(starting_turf) - - rewinds_remaining -- - if(rewinds_remaining) - addtimer(CALLBACK(src, rewind_type), rewind_interval) - else - to_chat(parent, "But the memory falls out of your reach.") - qdel(src) - -/datum/component/dejavu/proc/rewind_living() - var/mob/living/master = parent - master.setCloneLoss(clone_loss) - master.setToxLoss(tox_loss) - master.setOxyLoss(oxy_loss) - master.setOrganLoss(ORGAN_SLOT_BRAIN, brain_loss) - rewind() - -/datum/component/dejavu/proc/rewind_carbon() - if(saved_bodyparts) - var/mob/living/carbon/master = parent - master.apply_saved_bodyparts(saved_bodyparts) - rewind_living() - -/datum/component/dejavu/proc/rewind_animal() - var/mob/living/simple_animal/master = parent - master.bruteloss = brute_loss - master.updatehealth() - rewind_living() - -/datum/component/dejavu/proc/rewind_obj() - var/obj/master = parent - master.obj_integrity = integrity - rewind() diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 6a4787607ef2..405ca316b7d5 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -155,17 +155,6 @@ return TRUE return FALSE -/datum/objective_item/steal/slime - name = "an unused sample of slime extract." - targetitem = /obj/item/slime_extract - difficulty = 3 - excludefromjob = list("Research Director","Scientist") - -/datum/objective_item/steal/slime/check_special_completion(obj/item/slime_extract/E) - if(E.Uses > 0) - return 1 - return 0 - /datum/objective_item/steal/blackbox name = "The Blackbox." targetitem = /obj/item/blackbox diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index b3bd14af5a07..7df56b390f1b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -410,14 +410,6 @@ for(var/obj/item/reagent_containers/glass/G in beakers) reactants += G.reagents - for(var/obj/item/slime_extract/S in beakers) - if(S.Uses) - for(var/obj/item/reagent_containers/glass/G in beakers) - G.reagents.trans_to(S, G.reagents.total_volume) - - if(S && S.reagents && S.reagents.total_volume) - reactants += S.reagents - if(!chem_splash(get_turf(src), spread_range, reactants, temp_boost)) playsound(loc, 'sound/items/screwdriver2.ogg', 50, TRUE) return // The Explosion didn't do anything. No need to log, or disappear. @@ -460,16 +452,9 @@ for(var/obj/item/grenade/chem_grenade/G in src) if(istype(G, /obj/item/grenade/chem_grenade/large)) - var/obj/item/grenade/chem_grenade/large/LG = G max_beakers += 1 // Adding two large grenades only allows for a maximum of 7 beakers. spread_range += 2 // Extra range, reduced density. temp_boost += 50 // maximum of +150K blast using only large beakers. Not enough to self ignite. - for(var/obj/item/slime_extract/S in LG.beakers) // And slime cores. - if(beakers.len < max_beakers) - beakers += S - S.forceMove(src) - else - S.forceMove(drop_location()) if(istype(G, /obj/item/grenade/chem_grenade/cryo)) spread_range -= 1 // Reduced range, but increased density. diff --git a/code/game/objects/effects/anomalies/anomalies_bluespace.dm b/code/game/objects/effects/anomalies/anomalies_bluespace.dm index d5825181295c..19d163f131ee 100644 --- a/code/game/objects/effects/anomalies/anomalies_bluespace.dm +++ b/code/game/objects/effects/anomalies/anomalies_bluespace.dm @@ -63,7 +63,7 @@ if(istype(A, /obj/item/beacon)) continue // don't teleport beacons because that's just insanely stupid if(iscameramob(A)) - continue // Don't mess with AI eye, xenobio or advanced cameras + continue // Don't mess with AI eye, or advanced cameras if(A.anchored) continue diff --git a/code/game/objects/items/circuitboards/computer_circuitboards.dm b/code/game/objects/items/circuitboards/computer_circuitboards.dm index 9aece73946cc..5e82266f186c 100644 --- a/code/game/objects/items/circuitboards/computer_circuitboards.dm +++ b/code/game/objects/items/circuitboards/computer_circuitboards.dm @@ -315,11 +315,6 @@ icon_state = "science" build_path = /obj/machinery/computer/teleporter -/obj/item/circuitboard/computer/xenobiology - name = "circuit board (Xenobiology Console)" - icon_state = "science" - build_path = /obj/machinery/computer/camera_advanced/xenobio - //Security /obj/item/circuitboard/computer/gulag_teleporter_console diff --git a/code/game/objects/items/circuitboards/machine_circuitboards.dm b/code/game/objects/items/circuitboards/machine_circuitboards.dm index 13d6268c1520..896fa3a3e357 100644 --- a/code/game/objects/items/circuitboards/machine_circuitboards.dm +++ b/code/game/objects/items/circuitboards/machine_circuitboards.dm @@ -570,7 +570,6 @@ var/static/list/fridges_name_paths = list(/obj/machinery/smartfridge = "plant produce", /obj/machinery/smartfridge/food = "food", /obj/machinery/smartfridge/drinks = "drinks", - /obj/machinery/smartfridge/extract = "slimes", /obj/machinery/smartfridge/bloodbank = "blood", /obj/machinery/smartfridge/organ = "organs", /obj/machinery/smartfridge/chemistry = "chems", @@ -983,15 +982,6 @@ /obj/item/airlock_painter = 1, /obj/item/stack/sheet/glass = 1) -/obj/item/circuitboard/machine/monkey_recycler - name = "Monkey Recycler (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/monkey_recycler - req_components = list( - /obj/item/stock_parts/matter_bin = 1, - /obj/item/stock_parts/manipulator = 1) - needs_anchored = FALSE - /obj/item/circuitboard/machine/nanite_chamber name = "Nanite Chamber (Machine Board)" icon_state = "science" @@ -1018,11 +1008,6 @@ /obj/item/stock_parts/micro_laser = 2, /obj/item/stock_parts/scanning_module = 1) -/obj/item/circuitboard/machine/processor/slime - name = "Slime Processor (Machine Board)" - icon_state = "science" - build_path = /obj/machinery/processor/slime - /obj/item/circuitboard/machine/protolathe/department/science name = "Protolathe (Machine Board) - Science" icon_state = "science" @@ -1278,19 +1263,6 @@ /obj/item/stock_parts/manipulator = 1) needs_anchored = FALSE -/obj/item/circuitboard/machine/processor/attackby(obj/item/I, mob/user, params) - if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(build_path == /obj/machinery/processor) - name = "Slime Processor (Machine Board)" - build_path = /obj/machinery/processor/slime - to_chat(user, "Name protocols successfully updated.") - else - name = "Food Processor (Machine Board)" - build_path = /obj/machinery/processor - to_chat(user, "Defaulting name protocols.") - else - return ..() - /obj/item/circuitboard/machine/protolathe/department/service name = "Protolathe - Service (Machine Board)" icon_state = "service" diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 1f4b2ae6f6a2..1a9ee8ec3cf4 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -5,7 +5,6 @@ CONTAINS: T-RAY HEALTH ANALYZER GAS ANALYZER -SLIME SCANNER NANITE SCANNER GENE SCANNER @@ -616,65 +615,6 @@ GENE SCANNER to_chat(user, examine_block(jointext(render_list, "\n")), type = MESSAGE_TYPE_INFO) return TRUE -//slime scanner - -/obj/item/slime_scanner - name = "slime scanner" - desc = "A device that analyzes a slime's internal composition and measures its stats." - icon = 'icons/obj/device.dmi' - icon_state = "adv_spectrometer" - item_state = "analyzer" - lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' - pickup_sound = 'sound/items/handling/device_pickup.ogg' - drop_sound = 'sound/items/handling/device_drop.ogg' - w_class = WEIGHT_CLASS_SMALL - flags_1 = CONDUCT_1 - throwforce = 0 - throw_speed = 3 - throw_range = 7 - custom_materials = list(/datum/material/iron=30, /datum/material/glass=20) - -/obj/item/slime_scanner/attack(mob/living/M, mob/living/user) - if(user.stat) - return - if (!isslime(M)) - to_chat(user, "This device can only scan slimes!") - return - var/mob/living/simple_animal/slime/T = M - slime_scan(T, user) - -/proc/slime_scan(mob/living/simple_animal/slime/T, mob/living/user) - var/to_render = "\nSlime scan results:\ - \n[T.colour] [T.is_adult ? "adult" : "baby"] slime\ - \nNutrition: [T.nutrition]/[T.get_max_nutrition()]" - if (T.nutrition < T.get_starve_nutrition()) - to_render += "\nWarning: slime is starving!" - else if (T.nutrition < T.get_hunger_nutrition()) - to_render += "\nWarning: slime is hungry" - to_render += "\nElectric change strength: [T.powerlevel]\nHealth: [round(T.health/T.maxHealth,0.01)*100]%" - if (T.slime_mutation[4] == T.colour) - to_render += "\nThis slime does not evolve any further." - else - if (T.slime_mutation[3] == T.slime_mutation[4]) - if (T.slime_mutation[2] == T.slime_mutation[1]) - to_render += "\nPossible mutation: [T.slime_mutation[3]]\ - \nGenetic destability: [T.mutation_chance/2] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]] (x2)\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - else - to_render += "\nPossible mutations: [T.slime_mutation[1]], [T.slime_mutation[2]], [T.slime_mutation[3]], [T.slime_mutation[4]]\ - \nGenetic destability: [T.mutation_chance] % chance of mutation on splitting" - if (T.cores > 1) - to_render += "\nMultiple cores detected" - to_render += "\nGrowth progress: [T.amount_grown]/[SLIME_EVOLUTION_THRESHOLD]" - if(T.effectmod) - to_render += "\nCore mutation in progress: [T.effectmod]\ - \nProgress in core mutation: [T.applied] / [(SLIME_EXTRACT_CROSSING_REQUIRED * T.crossbreed_modifier)]" - to_chat(user, examine_block(to_render)) - - /obj/item/nanite_scanner name = "nanite scanner" icon = 'icons/obj/device.dmi' diff --git a/code/game/objects/items/grenades/chem_grenade.dm b/code/game/objects/items/grenades/chem_grenade.dm index e8b7e0de487f..58fd68157f08 100644 --- a/code/game/objects/items/grenades/chem_grenade.dm +++ b/code/game/objects/items/grenades/chem_grenade.dm @@ -217,36 +217,8 @@ if(stage != GRENADE_READY) return - for(var/obj/item/slime_extract/S in beakers) - if(S.Uses) - for(var/obj/item/reagent_containers/glass/G in beakers) - G.reagents.trans_to(S, G.reagents.total_volume) - - //If there is still a core (sometimes it's used up) - //and there are reagents left, behave normally, - //otherwise drop it on the ground for timed reactions like gold. - - if(S) - if(S.reagents && S.reagents.total_volume) - for(var/obj/item/reagent_containers/glass/G in beakers) - S.reagents.trans_to(G, S.reagents.total_volume) - else - S.forceMove(get_turf(src)) - no_splash = TRUE ..() - //I tried to just put it in the allowed_containers list but - //if you do that it must have reagents. If you're going to - //make a special case you might as well do it explicitly. -Sayu -/obj/item/grenade/chem_grenade/large/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/slime_extract) && stage == GRENADE_WIRED) - if(!user.transferItemToLoc(I, src)) - return - to_chat(user, "You add [I] to the [initial(name)] assembly.") - beakers += I - else - return ..() - /obj/item/grenade/chem_grenade/cryo // Intended for rare cryogenic mixes. Cools the area moderately upon detonation. name = "cryo grenade" desc = "A custom made cryogenic grenade. Rapidly cools contents upon ignition." diff --git a/code/game/objects/items/grenades/clusterbuster.dm b/code/game/objects/items/grenades/clusterbuster.dm index 5326b303d977..a086cf85b055 100644 --- a/code/game/objects/items/grenades/clusterbuster.dm +++ b/code/game/objects/items/grenades/clusterbuster.dm @@ -84,35 +84,6 @@ for(var/i in 1 to steps) step_away(src,loc) -/obj/effect/payload_spawner/random_slime - var/volatile = FALSE - -/obj/effect/payload_spawner/random_slime/volatile - volatile = TRUE - -/obj/item/slime_extract/proc/activate_slime() - var/list/slime_chems = src.activate_reagents - if(!QDELETED(src)) - var/chem = pick(slime_chems) - var/amount = 5 - if(chem == "lesser plasma") //In the rare case we get another rainbow. - chem = /datum/reagent/toxin/plasma - amount = 4 - if(chem == "holy water and uranium") - chem = /datum/reagent/uranium - reagents.add_reagent(/datum/reagent/water/holywater) - reagents.add_reagent(chem,amount) - -/obj/effect/payload_spawner/random_slime/spawn_payload(type, numspawned) - for(var/loop = numspawned ,loop > 0, loop--) - var/chosen = pick(subtypesof(/obj/item/slime_extract)) - var/obj/item/slime_extract/P = new chosen(loc) - if(volatile) - addtimer(CALLBACK(P, TYPE_PROC_REF(/obj/item/slime_extract, activate_slime)), rand(15,60)) - var/steps = rand(1,4) - for(var/i in 1 to steps) - step_away(src,loc) - ////////////////////////////////// //Custom payload clusterbusters ///////////////////////////////// @@ -180,14 +151,3 @@ var/real_type = pick(subtypesof(/obj/item/grenade/clusterbuster)) new real_type(loc) return INITIALIZE_HINT_QDEL - -//rainbow slime effect -/obj/item/grenade/clusterbuster/slime - name = "Blorble Blorble" - icon_state = "slimebang" - base_state = "slimebang" - payload_spawner = /obj/effect/payload_spawner/random_slime - prime_sound = 'sound/effects/bubbles.ogg' - -/obj/item/grenade/clusterbuster/slime/volatile - payload_spawner = /obj/effect/payload_spawner/random_slime/volatile diff --git a/code/game/objects/items/implants/implant_misc.dm b/code/game/objects/items/implants/implant_misc.dm index d8f871e1ecc4..4379003d57a8 100644 --- a/code/game/objects/items/implants/implant_misc.dm +++ b/code/game/objects/items/implants/implant_misc.dm @@ -122,13 +122,6 @@ radio_key = /obj/item/encryptionkey/syndicate subspace_transmission = TRUE -/obj/item/implant/radio/slime - name = "slime radio" - icon = 'icons/obj/surgery.dmi' - icon_state = "adamantine_resonator" - radio_key = /obj/item/encryptionkey - subspace_transmission = TRUE - /obj/item/implant/radio/get_data() var/dat = {"Implant Specifications:
Name: Internal Radio Implant
diff --git a/code/game/objects/items/storage/bags.dm b/code/game/objects/items/storage/bags.dm index ecee3894ccbb..cfe07df070ba 100644 --- a/code/game/objects/items/storage/bags.dm +++ b/code/game/objects/items/storage/bags.dm @@ -407,7 +407,7 @@ )) /* - * Biowaste bag (mostly for xenobiologists) + * Biowaste bag */ /obj/item/storage/bag/bio @@ -424,7 +424,6 @@ STR.max_items = 20 STR.insert_preposition = "in" STR.set_holdable(list( - /obj/item/slime_extract, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/glass/beaker, diff --git a/code/game/objects/items/storage/uplink_kits.dm b/code/game/objects/items/storage/uplink_kits.dm index 9516c7128090..e8b619b0d712 100644 --- a/code/game/objects/items/storage/uplink_kits.dm +++ b/code/game/objects/items/storage/uplink_kits.dm @@ -282,7 +282,6 @@ /obj/item/storage/firstaid/tactical, /obj/item/encryptionkey/syndicate, /obj/item/clothing/glasses/thermal/syndi, - /obj/item/slimepotion/slime/sentience/nuclear, /obj/item/storage/box/syndie_kit/imp_radio, /obj/item/storage/box/syndie_kit/imp_uplink, /obj/item/clothing/gloves/krav_maga/combatglovesplus, diff --git a/code/game/objects/structures/salvaging.dm b/code/game/objects/structures/salvaging.dm index f4aad715db19..a3b3b2b5763f 100644 --- a/code/game/objects/structures/salvaging.dm +++ b/code/game/objects/structures/salvaging.dm @@ -617,7 +617,6 @@ /obj/item/circuitboard/machine/medical_kiosk = 5, /obj/item/circuitboard/machine/medipen_refiller = 5, /obj/item/circuitboard/machine/microwave = 5, - /obj/item/circuitboard/machine/monkey_recycler = 5, /obj/item/circuitboard/machine/ore_redemption = 5, /obj/item/circuitboard/machine/ore_silo = 5, /obj/item/circuitboard/machine/reagentgrinder = 5, @@ -671,7 +670,6 @@ /obj/item/circuitboard/computer/powermonitor/secret = 5, /obj/item/circuitboard/computer/prototype_cloning = 5, /obj/item/circuitboard/computer/stationalert = 5, - /obj/item/circuitboard/computer/xenobiology = 5, /obj/item/circuitboard/computer/teleporter = 5, /obj/item/circuitboard/computer/operating = 5, /obj/item/circuitboard/computer/crew = 5, diff --git a/code/game/turfs/open/floor/misc_floor.dm b/code/game/turfs/open/floor/misc_floor.dm index 98ad4658add0..97f3772ec208 100644 --- a/code/game/turfs/open/floor/misc_floor.dm +++ b/code/game/turfs/open/floor/misc_floor.dm @@ -126,20 +126,6 @@ /turf/open/floor/noslip/MakeSlippery(wet_setting, min_wet_time, wet_time_to_add, max_wet_time, permanent) return -/turf/open/floor/bluespace - slowdown = -1 - icon_state = "bluespace" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds." - floor_tile = /obj/item/stack/tile/bluespace - - -/turf/open/floor/sepia - slowdown = 2 - icon_state = "sepia" - desc = "Time seems to flow very slowly around these tiles." - floor_tile = /obj/item/stack/tile/sepia - - /turf/open/floor/bronze name = "bronze floor" desc = "Some heavy bronze tiles." diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 7d9279f1390d..7953f3f7021a 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -539,17 +539,6 @@ newprofile.mob_overlay_icon_list = mob_overlay_icon_list.Copy() newprofile.mob_overlay_state_list = mob_overlay_state_list.Copy() //WS EDIT - Mob Overlay State -/datum/antagonist/changeling/xenobio - name = "Xenobio Changeling" - give_objectives = FALSE - show_in_roundend = FALSE //These are here for admin tracking purposes only - you_are_greet = FALSE - - chem_storage = 25 - geneticpoints = 2 - chem_recharge_rate = 0.5 - dna_max = 3 - /datum/antagonist/changeling/roundend_report() var/list/parts = list() @@ -582,6 +571,3 @@ /datum/antagonist/changeling/antag_listing_name() return ..() + "([changelingID])" - -/datum/antagonist/changeling/xenobio/antag_listing_name() - return ..() + "(Xenobio)" diff --git a/code/modules/awaymissions/mission_code/moonoutpost19.dm b/code/modules/awaymissions/mission_code/moonoutpost19.dm deleted file mode 100644 index 4f13e27001ec..000000000000 --- a/code/modules/awaymissions/mission_code/moonoutpost19.dm +++ /dev/null @@ -1,121 +0,0 @@ -// moonoutpost19 - -//Areas -/area/awaymission/moonoutpost19 - name = "space" - icon_state = "awaycontent1" - -/area/awaymission/moonoutpost19/arrivals - name = "MO19 Arrivals" - icon_state = "awaycontent2" - -/area/awaymission/moonoutpost19/research - name = "MO19 Research" - icon_state = "awaycontent3" - -/area/awaymission/moonoutpost19/syndicate - name = "Syndicate Outpost" - icon_state = "awaycontent4" - -/area/awaymission/moonoutpost19/main - name = "Khonsu 19" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - poweralm = FALSE - ambientsounds = list('sound/ambience/ambimine.ogg') - icon_state = "awaycontent5" - -/area/awaymission/moonoutpost19/hive - name = "The Hive" - always_unpowered = TRUE - power_environ = FALSE - power_equip = FALSE - power_light = FALSE - poweralm = FALSE - icon_state = "awaycontent6" - -//Papers - -/obj/item/paper/crumpled/awaymissions/moonoutpost19/hastey_note - name = "Hastily Written Note" - default_raw_text = "19 06 2554

I fucking knew it. There was a major breach, that idiotic force field failed and the xenomorphs rushed out and took out the scientists. I've managed to make it to my office and closed the blast doors. I can hear them trying to pry open the doors. Probably don't have long. I have no clue what has happened to the rest of the crew, for all I know they've been killed to produce more of the fucks." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_social - name = "Larva Xenomorph Social Interactions & Capturing Procedure" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554

Report:
As expected, all that is left of the monkeys we sent in earlier is a group of xenomorph larvae. It is quite clear that the facehuggers are not selective in their hosts, and so far the gestation process has been shown to have a 100% success rate.

The larvae themselves have been behaving very differently from the lone larva we first observed, and despite shying away from humans they are clearly comfortable with others of their kind. Our previous suspicions on larvae have been confirmed with their demonstration of playfulness: they are not nearly as aggressive or violent when young, before molting to adulthood.

The majority of the play we observed involved a sort of hide-and-seek, and occasionally wrestling by tangling themselves and struggling out of it. While normally we would write these off as instinctual play for honing their skills when they molt, their growth period is so incredibly fast and they are still such adept killers that it would serve no practical purpose. The only explanation for this is perhaps to create bonds and friendships with each other, if that is even possible for such an incredibly hostile race. It may be that they are much more reasonable with each other than other life forms.

It had become clear that now was the best time to extract a xenomorph for dissecting, as these were all still larvae and the queen was still attached to its ovipositor and would be immobile. With the approval of the research director, we sent in our medical robot that had been dubbed 'Head Surgeon' into the containment pen, dropping the shields for only a fraction of a second to allow it entry. The larvae were cautious, but the curiosity of one had him within grabbing range of our robot. It was brought out and quickly euthanized through lethal injection, courtesy of our mechanical doctor." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_queen - name = "Queen Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 04/06/2554

Report:
I have studied many interesting and diverse life-forms as a xenobiologist ranging from creatures as large as cows, to specimens too small see with the naked eye. This is by far the largest alien I have ever seen. The alien we were previously studying has molted and has become an absolutely enormous creature. Standing at over 15 feet tall and weighing in at likely two tons or more, the xenomorph queen is an absolutely breathtakingly large and cruel monster. Its behavior has changed drastically from when it was a drone, having become far more comfortable with sitting and staring at us, rather than smashing at the windows.

The queen, physiologically speaking, is fairly similar to the other xenomorphs, with a few key differences. Its enormous size demands large legs, while the back seems to be always hunched forward. The dorsal tubes on the back have changed to several large spikes, and we observed the alien now sports a second pair of smaller arms on its chest. The purpose of these secondary arms is still unknown. Finally, the queen's crown has become incredibly large, with what seems to be a retractable slot to hide its head in. The dome appears to be extremely thick near the front, and will likely be able to resist a lot of trauma. Despite the enormous size it has grown to, it is not that much slower than it used to be.

After two hours of doing relatively nothing but staring, the queen began to produce an unusually large amount of resin and weeds, quickly shaping up a large nest that it then hid behind. It then proceeded to smash out all the lights, leaving us with very little to see with our cameras. When we looked through the back cameras, we had discovered that it had grown a large ovipositor, and was releasing large eggs onto the ground. This had us all in agreement that this stage of the life cycle was the queen.

Over the next few hours, the eggs grew to their full sizes, and we provided the subject with new monkey hosts. When they approached the eggs, they opened to release more facehuggers. It seems that we have observed the full cycle of reproduction for this species. We can expect more larvae in the next few hours." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_adult - name = "Adult Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
The other scientists and I can hardly believe our eyes. The snake-like larva has molted into a 7 foot tall insectoid nightmare in just a few hours. It's obvious now as to why such heavy duty containment was needed. It immediately tried to escape however by flinging itself at the window in a flurry of swipes and stabs. It seems its behavior has returned to a state that is very similar to the facehugger, though I doubt with the same intent! Thankfully, our glass and shields have shown to be more than sturdy enough for such a violent creature, and so far, any attempts at the creature escaping have been in vain.

As for its physiology, the creature has an elongated head with what appears to be have an exoskeleton resembling an external rib-cage on the torso. The alien is also fairly skinny with a lean body. The little amount of meat on the alien appears to be entirely muscle. We assume this makes it deceptively strong, while remaining agile at the same time. One of the most interesting things we have seen is its pharyngeal jaw. It has some what of an inner mouth capable of being fired externally at extremely high speeds. It has already caused many dents in the walls and a few small cracks in the window with it. The alien also has a couple of dorsal tubes on its back, their purpose unknown. Finally, this monster sports a long ridged tail, complete with a large and extremely sharp blade at the tip.

Normally I would be absolutely terrified of something like this, but I'm putting my trust in Nanotrasen with the containment. After all, they wouldn't build a cell that could fail to contain its subject, would they?" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_psych - name = "Larva Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
When the larva first emerged from the chest of the monkey, it seemed very curious. It would wander around aimlessly for awhile and then sit still. We are unable to determine the gender of the larva, or even determine if it has a gender. After some time had passed, it seemed to lose interest in its surroundings and sat mostly still while occasionally wagging its tail. We decided to throw in a live mouse to see if it would consume it. The larva quickly attacked and ate the mouse and seemed to get larger very suddenly, this suggests that the larvae are capable of metabolizing and directing all the energy towards growth at previously thought impossible speeds. It is a shame that we cannot observe the process more closely, as we do not currently know how dangerous or violent this creature is or will become as it matures fully.

It is tempting to imagine the possibilities of utilizing such a mechanism. The capability of skipping years of growth time for children, repairing bodily damage in a matter of moments, even its usage in existing cloning technology." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/facehugger - name = "'Facehugger' Xenomorph Physiology & Behavior Observation" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 03/06/2554

Report:
The test subject we were provided with truly is alien. It is a small spider-like creature with bony legs leading to a smooth body. It has a long tail connected to it, and it has shown extremely aggressive behavior by flinging its entire body at the glass and shields to no avail. While doing so, we noticed there was a small pink hole in the middle of the body.

When we sent in a monkey through the crude but effective disposal tube, the alien immediately jumped at its face and latched on. The monkey was quickly suffocated by its constricting tail, unable to pry off the fingers. The monkey at first seemed to be dead, but was observed to be breathing. The recently named alien 'facehugger' fell off dead and curled its legs up like a spider moments after it had finished with the monkey's body.

While the monkey appeared to be unharmed, we kept it in the cell for a couple more hours until we were horrified to discover it screaming out in pain as a snake-like creature erupted from the monkey's chest! It appears that the 'facehugger' is only the start of this life cycle. The impregnation cycle involving the creatures growing inside the chests of their hosts seems to only be the beginning." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_hivemind - name = "The Hivemind Hypothesis" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 17/06/2554

Report:
Earlier today we have observed a new phenomenon with our subjects. While feeding them our last monkey subject and throwing out the box, the aliens merely looked at us instead of infecting the monkey right away. They looked to be collectively distressed as they would no longer be given hosts, where instead we would move to the next phase of the experiment. When I glanced at the gas tanks and piping leading to their cell, I looked back to see all of them were up against the glass, even the queen! It was as if they all understood what was going to happen, even though we knew only the queen had the cognitive capability to do so.

The only explanation for this is a form of communication between the aliens, but we have seen no such action take place anywhere in the cell until now. We also know that regular drone and hunter xenomorphs have no personality or instinct to survive by themselves. Perhaps the queen has a direct link to them? A form of a commander or overseer that controls their every move? A hivemind?" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_behavior - name = "\improper A Preliminary Study of Alien Behavior" - default_raw_text = "Researcher: Dr. Sakuma Sano
Date: 08/06/2554

Report:
The xenomorphs we have come to study here are a remarkable species. They are almost universally aggressive across all castes, showing no remorse or guilt or pause before or after acts of violence. They appear to be a species entirely designed to kill. Oddly enough, even their method of reproduction is a brutal two-for-one method of birthing a new xenomorph and killing its host.

The lone xenomorph we studied only five days ago showed little sign of intelligence. Only a simple drone that flung itself at the safety glass and shields repeatedly and thankfully without success. Once the drone molted into a queen, it became much more calm and calculating, merely looking at us and waiting while building its nest. As the hive grew in size and in numbers, so too did the intelligence of the common hunter and drone. We are still researching how they can communicate with one another and the relationship between the different castes and the queen. We will continue to update our research as we learn more about the species." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/xeno_castes - name = "The Xenomorph 'Castes'" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 06/06/2554

Report:
While observing the growing number of aliens in the containment cell, we began to notice subtle differences that were consistently repeating. Like ants, these creatures clearly have different specialized variations that determine their roles in the hive. We have dubbed the three currently observed castes as Hunters, Drones, and Sentinels.

Hunters have been observed to be by far the most aggressive and agile of the three, constantly running on every surface and frequently swiping at the windows. They are also remarkably good at camouflaging themselves in darkness and on their resin structures, appearing almost invisible to the unwary observer. They are always the first to reach the monkeys we send in leading us to believe that this caste is primarily used for finding and retrieving hosts.

Drones on the other hand are much more docile and seem more shy by comparison, though not any less aggressive than the other castes. They have been observed to have a much wider head and lack dorsal tubes. They have shown to be less agile and visibly more fragile than any other caste. The drone however has never been observed to interact with the monkeys directly and instead preferring maintenance of the hive by building walls of resin and moving eggs around the nest. As far as we know, we have only ever observed a drone become a queen, and we have no way of knowing if the other castes have that capability.

Lastly, we have the Sentinels, which appear at first glance to be the guards of the hive. They have so far been only observed to remain near the queen and the eggs, frequently curled up against the walls. We have only observed one instance where they have interacted with a monkey who strayed too closely to the queen, and was pounced and held down immediately until it was applied with a facehugger. Their lack of movement makes it difficult to determine their exact purpose as guards, sentries, or other role." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy - name = "Larva Xenomorph Autopsy Report" - default_raw_text = "Researcher: Dr. Mark Douglas
Date: 04/06/2554

Report:
After an extremely dangerous, time consuming and costly dissection, we have managed to record and identify several of the organs inside of the first stage of the xenomorph cycle: the larva. This procedure took an extensive amount of time because these creatures have incredibly, almost-comically acidic blood that can melt through almost anything in a few moments. We had to use over a dozen scalpels and retractors to complete the autopsy.

The larva seems to possess far fewer and quite different organs than that of a human. There is a stomach, with no digestive tract, a heart, which seems to lack any blood-oxygen circulation purpose, and an elongated brain, even though its as dumb as any large cat. It also lacks any liver, kidneys, or other basic organs.

We can't determine the exact nature of how these creatures grow, nor if they gain organs as they become adults. The larger breeds of xenomorph are too dangerous to kill and capture to give us an accurate answer to these questions. All that we can conclude is that being able to function with so little and yet be so deadly means that these creatures are highly evolved and likely to be extremely durable to various hazards that would otherwise be lethal to humans." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/research/evacuation - name = "Evacuation Procedure" - default_raw_text = "

In The Event of Xenobiology Breach: Evacuate staff, Lock down Xenobiology, Notify on-site superiors and/or Central Command immediately.



Current Xenobiology Containment Level:Secure RUN

" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal - name = "Personal Log" - default_raw_text = "Log 1:
We got our promised supply drop today. We were only meant to get it, what, a week ago? This bloody gateway keeps desyncing itself, and that means subsisting off recycled water and carb packs. No clue where the damn thing connects to on its off days, and HQ say we are 'not to touch it if it isn't linking to command.' We dumped off the assload of crates Jim filled, got our boxes of oxygen, food and drink, and closed the portal.

Log 2:
Damn thing is acting up again. Three days no contact this time. I thought I heard clanking noises from it yesterday. Jim is going on about the NT base or some shit. We've been over this before - They don't know we're here, that engineer was too drunk to recognize his suit, especially since I had it painted orange. He's starting to get annoying. We're safe.

Log 3:
Gateway synced itself up automatically today. I opened it for an instant to spy through it, got a glimpse of the inside of a transport container. Either HQ's redecorating or something, or there's more than two of these things." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/personal_2 - name = "Personal Log" - default_raw_text = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station, looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.

Log 2:
Really dumb of me but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't then we might have to pull out before they come looking for us.

Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/engineering - name = "Engineering Instructions" - default_raw_text = "Alright, listen up. If you're reading this, I'm either taking a shit or I've been recalled back to Command. Either way, you'll need to know how to restore power. We've stolen this stuff from Nanotrasen, so all the equipment is jury-rigged. We have generators that work on both plasma and uranium, about 50 sheets should power the outpost for quite a while. If the generators aren't working, which is very likely, take the power cell on the desk and put it into the APC in the hallway. That should get the place running, at least for a little while." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/kenneth - name = "Personal Log - Kenneth Cunningham" - default_raw_text = "Entry One - 27/05/2554:
I just arrived, and already I hate my job. I'm stuck on this shithole of an outpost, trying to avoid these damn eggheads running all over the place preparing for god knows what. There's no crimes to stop, no syndies to kill, and I'm not even allowed to beat the fuckin' assistant senseless! They said I was transferred from Space Station 13 for 'good behavior', but this feels more like a punishment than a reward. All I know is that if I don't get some action soon, I'm going to go insane.

Entry Two - 03/06/2554:
Okay, so get this: we got a fuckin' deathsquad coming in today! I thought the day I saw one of them would be the day my employment was 'terminated', if you get my drift. They're escorting some sort of weird alien creature for the eggheads to study. I heard one of the docs telling the chef that this thing killed a whole security force before it was captured. I sure as hell hope that I don't have to fight it.

Entry Three - 08/06/2554:
My first real bit of 'action' today, if you could call it that. Crazy Ivan got in a fight with Kuester today about his Booze-O-Mat. Apparently one of the crewmembers had stolen a couple bottles of booze from the machine after Ivan disabled the ID lock. Tell you the truth, I don't blame the thief. Everyone is going a little stir-crazy in here, and the bartender is being damn stingy with the alcohol. Either way, once they started to pick a fight, I had to take them down. It's a damn shame that we don't have a brig, though. I had to lock Ivan in a fuckin' freezer, for god's sake. Let's hope that we can keep our sanity together, at least for a while.

Entry Four - 10/06/2554:
Jesus fucking Christ riding on a motorbike. These things the scientists are studying are terrifying! Fucking great huge purple bug things as tall as the ceiling, with blades for arms and drooling at the mouth. I don't think my taser will do jack shit against these damn things, but the eggheads say that they're safely contained. If they do, I have a feeling that it's only a matter of time before we're all screwed. These bastards look like walking death.

Entry Five - 18/06/2554:
Finally caught who stole the booze from Kuester. It was that fuckin' loser assistant Steve! He was in the dorms, chugging his worries away. I took one of the bottles back to the barkeep, but no one has to know about this second one. I think I'm gonna enjoy this while watching tomorrow's Thunderdome match.

Entry Six - 19/06/2554:
Oh, great. The chef is still sleeping, so we get Ivan's gruel for breakfast today. I overheard Sano and Douglas saying something about the aliens being restless, so we might get some action today. As long as it happens after the big game, I'm fine with it. I still got one beer to drink before I'm ready to die." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/ivan - name = "Personal Log - Ivan Volodin" - default_raw_text = "Ivan Volodin Stories:

Entry Won - 28/05/2554:
Hello. I am Crazy Ivan. Boss say I must write. I do good job fixing outpost. Is very good job. Much better than mines. Many nice people. I cause no trouble.

Entry Too - 05/06/2554:
I am finding problem with Booze-O-Mat. Is not problem. I solve very easy. Use yellow tool to make purple light go off. I am good engineer! Bartender will be very happy.

Entry Tree - 08/06/2554:
Bartender is not happy. Security man is not happy. Cannot feel legs, is very cold in freezer. Is not good. Table is jammed into door, have no tools. Is very not good. But, on bright side, found meat! Shall chew to keep spirits up.

Entry Fore - 12/06/2554:
Big nasty purple bug looked at me today. Make nervous. Blue wall wire can be broken, then bad thing happens. Very very bad thing. Man in orange spacesuit wave at me today too. He seem nice. Wonder who was?

Entry Fiv - 15/06/2554:
I eat cornflakes today. Is good day. Sun shine for a while. Was nice. I also take ride on disposals chute. Was fun, but tiny. Get clog out of pipes, was vodka bottle. Is empty. This make many sads.

Entry Sex: 19/06/2554:
Purple bugs jumpy today. When waved, get hiss. Maybe very bad. Maybe just ill. Do not know. Is science problem, is not engineer problem. I eat sandwich. Is glorious job. Wish to never end." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/log/gerald - name = "Personal Log - Gerald Rosswell" - default_raw_text = "Personal Log for Research Director Gerald Rosswell

Entry One - 17/05/2554:
You know, I can't believe I took this position so suddenly. I saw that corporate needed a research director for one of it's outposts and thought it would be a cakewalk, there isn't going to be a lot of research to be done on a tiny outpost. Mainly just running scans on the gas giant we are orbiting or some basic RnD. However, they conveniently forgot to tell me that me and my science staff would have to pull double duty as medical staff and that there is no one higher up on the chain of command here, so I get to pull triple duty as acting captain as well! This shit is probably allowed in some 3 point fine print buried underneath the literally thousands of pages of contracts. Well, at least the research will be easy work.

Entry Two - 25/05/2554:
Well, we all expected it at the outpost, CentCom has decided to completely change what research we are doing. They've decided that we should be research the species known as 'xenomporphs'. They announced this change 4 days ago and along with it, sadly, the termination of our current science staff barring me. Not to mention the constant noise made by the construction detail they sent to staple on an xenobiology lab ensuring no one has been able to sleep decently ever since they announced the shift. To make matters worse our current security guard actually died of a heart attack today. Just goes to show that 75 year old men shouldn't be security guards. Still can't believe that they decided to do this major change less than a month after the outpost was established.

Entry Three - 27/05/2554:
The new security guard arrived today. Apparently transferred here from the research station that also is orbiting the gas giant. He seems to be rather angry about his transfer. Considering the rumors I've heard about the research station he's probably caught off guard by the fact that Steve hasn't tried to force an IED down his throat.

Entry Four - 06/06/2554:
My requests for additional security and containment measures for the 'xenomorph' has been denied. Does Central Command not notice how dangerous these creatures are? The only thing keeping them in is a force field, a minor problem with the power grid and the entire hive is loose. What would stop them then, the lone security guard with a dinky little taser? Kenneth can barely handle a short-tempered engineer. We are under equipped and under staffed, we are inevitably going to be destroyed unless we get the equipment and staff we need.

Entry Five - 10/06/2554:
Cunningham got a good look at the xenomorph in containment. He was frightened for the rest of the day, rather amusing if it wasn't for the fact that we are all trapped on this scrap heap with naught but a force field keeping those xenomorphs in.

Entry Six - 17/06/2554:
The reactions from the specimens today has shown that they possess strange mental properties. Mark hypothesizes that they possibly have a sort of hive mind, while nothing is certain this would explain how xenomorphs seem to have vastly increased intellect when a 'queen' is present. Of course, to test this hypothesis would require many complicated procedures which we will not be able to undertake. But we do not know the full extend of the xenomorph mind, it may or may not be able to find a way to circumvent our containment system. I will resend my request for additional security measures along with this new found information." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/food_specials - name = "Specials This Week" - default_raw_text = "

I Can't Believe It's Not Pasta: Half off on Wednesdays



Burger night every Friday 6PM-10PM, free drinks with purchase of meal!



Premiering Tonight: The comedy stylings of Shoe Snatching Willy! 11AM-7PM

" - -/obj/item/paper/fluff/awaymissions/moonoutpost19/welcome - name = "Welcome Notice" - default_raw_text = "

Welcome to Moon Outpost 19! Property of Nanotrasen Inc.




Staff Roster:
-Dr. Gerald Rosswell: Research Director & Acting Captain
-Dr. Sakuma Sano: Xenobiologist
-Dr. Mark Douglas: Xenobiologist
-Kenneth Cunningham: Security Officer-Ivan Volodin: Engineer
-Mathias Kuester: Bartender
-Sven Edling: Chef
-Steve: Assistant

Please enjoy your stay, and report any abnormalities to an officer." - -/obj/item/paper/fluff/awaymissions/moonoutpost19/goodbye_note - name = "Note" - default_raw_text = "Bugs break out. I run to here and lock door. I hear door next to me break open and screams. All nice people here dead now. I no want to be eaten, and bottle always said to be coward way out, but person who say that is stupid. Mira, there is no escape for me, tell Alexis and Elena that father will never come home, and that I love you all." - - diff --git a/code/modules/cargo/bounties/slime.dm b/code/modules/cargo/bounties/slime.dm deleted file mode 100644 index 4aa0797c7002..000000000000 --- a/code/modules/cargo/bounties/slime.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/bounty/item/slime - reward = 3000 - -/datum/bounty/item/slime/New() - ..() - description = "Nanotrasen's science lead is hunting for the rare and exotic [name]. A bounty has been offered for finding it." - reward += rand(0, 4) * 500 - -/datum/bounty/item/slime/green - name = "Green Slime Extract" - wanted_types = list(/obj/item/slime_extract/green) - -/datum/bounty/item/slime/pink - name = "Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/pink) - -/datum/bounty/item/slime/gold - name = "Gold Slime Extract" - wanted_types = list(/obj/item/slime_extract/gold) - -/datum/bounty/item/slime/oil - name = "Oil Slime Extract" - wanted_types = list(/obj/item/slime_extract/oil) - -/datum/bounty/item/slime/black - name = "Black Slime Extract" - wanted_types = list(/obj/item/slime_extract/black) - -/datum/bounty/item/slime/lightpink - name = "Light Pink Slime Extract" - wanted_types = list(/obj/item/slime_extract/lightpink) - -/datum/bounty/item/slime/adamantine - name = "Adamantine Slime Extract" - wanted_types = list(/obj/item/slime_extract/adamantine) - -/datum/bounty/item/slime/rainbow - name = "Rainbow Slime Extract" - wanted_types = list(/obj/item/slime_extract/rainbow) diff --git a/code/modules/cargo/bounty.dm b/code/modules/cargo/bounty.dm index 3807e9bd6984..96d5218e551e 100644 --- a/code/modules/cargo/bounty.dm +++ b/code/modules/cargo/bounty.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(bounties_list) // Returns a new bounty of random type, but does not add it to GLOB.bounties_list. /proc/random_bounty() - switch(rand(1, 13)) + switch(rand(1, 12)) if(1) var/subtype = pick(subtypesof(/datum/bounty/item/assistant)) return new subtype @@ -103,18 +103,15 @@ GLOBAL_LIST_EMPTY(bounties_list) var/subtype = pick(subtypesof(/datum/bounty/item/science)) return new subtype if(9) - var/subtype = pick(subtypesof(/datum/bounty/item/slime)) - return new subtype - if(10) var/subtype = pick(subtypesof(/datum/bounty/item/engineering)) return new subtype - if(11) + if(10) var/subtype = pick(subtypesof(/datum/bounty/item/mining)) return new subtype - if(12) + if(11) var/subtype = pick(subtypesof(/datum/bounty/item/medical)) return new subtype - if(13) + if(12) var/subtype = pick(subtypesof(/datum/bounty/item/botany)) return new subtype @@ -153,10 +150,7 @@ GLOBAL_LIST_EMPTY(bounties_list) /********************************Dynamic Gens********************************/ for(var/i in 0 to 1) - if(prob(50)) - pick = pick(subtypesof(/datum/bounty/item/slime)) - else - pick = pick(subtypesof(/datum/bounty/item/science)) + pick = pick(subtypesof(/datum/bounty/item/science)) try_add_bounty(new pick) /********************************Cutoff for Non-Low Priority Bounties********************************/ diff --git a/code/modules/clothing/outfits/factions/minutemen.dm b/code/modules/clothing/outfits/factions/minutemen.dm index 36530b20754b..4507d46ea958 100644 --- a/code/modules/clothing/outfits/factions/minutemen.dm +++ b/code/modules/clothing/outfits/factions/minutemen.dm @@ -601,7 +601,7 @@ belt = /obj/item/storage/belt/military/clip/gunner suit_store = /obj/item/gun/ballistic/automatic/hmg/cm40 - backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1) + backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/shredded_beef=1) ///lead, i guess you could reuse this for "Brig Officer" @@ -629,7 +629,7 @@ suit_store = /obj/item/gun/ballistic/automatic/assault/cm82 belt = /obj/item/storage/belt/military/clip/cm82 - backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/reagent_containers/food/snacks/rationpack=1, /obj/item/gun/ballistic/automatic/pistol/cm23=1) + backpack_contents = list(/obj/item/clothing/mask/gas/clip=1, /obj/item/storage/ration/shredded_beef=1, /obj/item/gun/ballistic/automatic/pistol/cm23=1) /datum/outfit/job/clip/minutemen/grunt/commander name = "CLIP Minutemen - Field Commander" diff --git a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm b/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm deleted file mode 100644 index 79382343e1ae..000000000000 --- a/code/modules/food_and_drinks/kitchen_machinery/monkeyrecycler.dm +++ /dev/null @@ -1,103 +0,0 @@ -GLOBAL_LIST_EMPTY(monkey_recyclers) - -/obj/machinery/monkey_recycler - name = "monkey recycler" - desc = "A machine used for recycling dead monkeys into monkey cubes." - icon = 'icons/obj/kitchen.dmi' - icon_state = "grinder" - layer = BELOW_OBJ_LAYER - density = TRUE - use_power = IDLE_POWER_USE - idle_power_usage = IDLE_DRAW_MINIMAL - active_power_usage = ACTIVE_DRAW_MEDIUM - circuit = /obj/item/circuitboard/machine/monkey_recycler - var/stored_matter = 0 - var/cube_production = 0.2 - var/list/connected = list() //Keeps track of connected xenobio consoles, for deletion in /Destroy() - -/obj/machinery/monkey_recycler/Initialize(mapload) - . = ..() - if (mapload) - GLOB.monkey_recyclers += src - -/obj/machinery/monkey_recycler/Destroy() - GLOB.monkey_recyclers -= src - for(var/thing in connected) - var/obj/machinery/computer/camera_advanced/xenobio/console = thing - console.connected_recycler = null - connected.Cut() - return ..() - -/obj/machinery/monkey_recycler/RefreshParts() //Ranges from 0.2 to 0.8 per monkey recycled - cube_production = 0 - for(var/obj/item/stock_parts/manipulator/B in component_parts) - cube_production += B.rating * 0.1 - for(var/obj/item/stock_parts/matter_bin/M in component_parts) - cube_production += M.rating * 0.1 - -/obj/machinery/monkey_recycler/examine(mob/user) - . = ..() - if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Producing [cube_production] cubes for every monkey inserted." - -/obj/machinery/monkey_recycler/attackby(obj/item/O, mob/user, params) - if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) - return - - if(default_pry_open(O)) - return - - if(default_unfasten_wrench(user, O)) - power_change() - return - - if(default_deconstruction_crowbar(O)) - return - - if(machine_stat) //NOPOWER etc - return - else - return ..() - -/obj/machinery/monkey_recycler/MouseDrop_T(mob/living/target, mob/living/user) - if(!istype(target)) - return - if(ismonkey(target)) - stuff_monkey_in(target, user) - -/obj/machinery/monkey_recycler/proc/stuff_monkey_in(mob/living/carbon/monkey/target, mob/living/user) - if(!istype(target)) - return - if(target.stat == CONSCIOUS) - to_chat(user, "The monkey is struggling far too much to put it in the recycler.") - return - if(target.buckled || target.has_buckled_mobs()) - to_chat(user, "The monkey is attached to something.") - return - qdel(target) - to_chat(user, "You stuff the monkey into the machine.") - playsound(src.loc, 'sound/machines/juicer.ogg', 50, TRUE) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = 200) //start shaking - use_power(500) - stored_matter += cube_production - addtimer(VARSET_CALLBACK(src, pixel_x, base_pixel_x)) - addtimer(CALLBACK(GLOBAL_PROC, GLOBAL_PROC_REF(to_chat), user, "The machine now has [stored_matter] monkey\s worth of material stored.")) - -/obj/machinery/monkey_recycler/interact(mob/user) - if(stored_matter >= 1) - to_chat(user, "The machine hisses loudly as it condenses the ground monkey meat. After a moment, it dispenses a brand new monkey cube.") - playsound(src.loc, 'sound/machines/hiss.ogg', 50, TRUE) - for(var/i in 1 to FLOOR(stored_matter, 1)) - new /obj/item/reagent_containers/food/snacks/monkeycube(src.loc) - stored_matter-- - to_chat(user, "The machine's display flashes that it has [stored_matter] monkeys worth of material left.") - else - to_chat(user, "The machine needs at least 1 monkey worth of material to produce a monkey cube. It currently has [stored_matter].") - -/obj/machinery/monkey_recycler/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if(istype(I)) - to_chat(user, "You log [src] in the multitool's buffer.") - I.buffer = src - return TRUE diff --git a/code/modules/food_and_drinks/kitchen_machinery/processor.dm b/code/modules/food_and_drinks/kitchen_machinery/processor.dm index bc17a9fd22af..ef3cceed2afc 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/processor.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/processor.dm @@ -37,7 +37,7 @@ qdel(what) /obj/machinery/processor/proc/select_recipe(X) - for (var/type in subtypesof(/datum/food_processor_process) - /datum/food_processor_process/mob) + for (var/type in subtypesof(/datum/food_processor_process)) var/datum/food_processor_process/recipe = new type() if (!istype(X, recipe.input) || !istype(src, recipe.required_machine)) continue @@ -149,60 +149,3 @@ O.forceMove(drop_location()) for (var/mob/M in src) M.forceMove(drop_location()) - -/obj/machinery/processor/slime - name = "slime processor" - desc = "An industrial grinder with a sticker saying appropriated for science department. Keep hands clear of intake area while operating." - -/obj/machinery/processor/slime/Initialize() - . = ..() - var/obj/item/circuitboard/machine/B = new /obj/item/circuitboard/machine/processor/slime(null) - B.apply_default_parts(src) - -/obj/machinery/processor/slime/adjust_item_drop_location(atom/movable/AM) - var/static/list/slimecores = subtypesof(/obj/item/slime_extract) - var/i = 0 - if(!(i = slimecores.Find(AM.type))) // If the item is not found - return - if (i <= 16) // If in the first 12 slots - AM.pixel_x = AM.base_pixel_x - 12 + ((i%4)*8) - AM.pixel_y = AM.base_pixel_y - 12 + (round(i/4)*8) - return i - var/ii = i - 16 - AM.pixel_x = AM.base_pixel_x - 12 + ((ii%4)*8) - AM.pixel_y = AM.base_pixel_y - 12 + (round(ii/4)*8) - return i - -/obj/machinery/processor/slime/process() - if(processing) - return - var/mob/living/simple_animal/slime/picked_slime - for(var/mob/living/simple_animal/slime/slime in range(1,src)) - if(slime.loc == src) - continue - if(istype(slime, /mob/living/simple_animal/slime)) - if(slime.stat) - picked_slime = slime - break - if(!picked_slime) - return - var/datum/food_processor_process/P = select_recipe(picked_slime) - if (!P) - return - - visible_message("[picked_slime] is sucked into [src].") - picked_slime.forceMove(src) - -/obj/machinery/processor/slime/process_food(datum/food_processor_process/recipe, atom/movable/what) - var/mob/living/simple_animal/slime/S = what - if (istype(S)) - var/C = S.cores - if(S.stat != DEAD) - S.forceMove(drop_location()) - S.visible_message("[C] crawls free of the processor!") - return - for(var/i in 1 to (C+rating_amount-1)) - var/atom/movable/item = new S.coretype(drop_location()) - adjust_item_drop_location(item) - SSblackbox.record_feedback("tally", "slime_core_harvested", 1, S.colour) - ..() diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index 6016def705b5..6d9945337f71 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -382,23 +382,6 @@ return TRUE return FALSE -// ------------------------------------- -// Xenobiology Slime-Extract Smartfridge -// ------------------------------------- -/obj/machinery/smartfridge/extract - name = "smart slime extract storage" - desc = "A refrigerated storage unit for slime extracts." - -/obj/machinery/smartfridge/extract/accept_check(obj/item/O) - if(istype(O, /obj/item/slime_extract)) - return TRUE - if(istype(O, /obj/item/slime_scanner)) - return TRUE - return FALSE - -/obj/machinery/smartfridge/extract/preloaded - initial_contents = list(/obj/item/slime_scanner = 2) - // ------------------------- // Organ Surgery Smartfridge // ------------------------- diff --git a/code/modules/food_and_drinks/recipes/processor_recipes.dm b/code/modules/food_and_drinks/recipes/processor_recipes.dm index c13983c6792d..63ffccdba79c 100644 --- a/code/modules/food_and_drinks/recipes/processor_recipes.dm +++ b/code/modules/food_and_drinks/recipes/processor_recipes.dm @@ -45,11 +45,6 @@ input = /obj/item/reagent_containers/food/snacks/grown/parsnip output = /obj/item/reagent_containers/food/snacks/roastparsnip -/datum/food_processor_process/mob/slime - input = /mob/living/simple_animal/slime - output = null - required_machine = /obj/machinery/processor/slime - /datum/food_processor_process/towercap input = /obj/item/grown/log output = /obj/item/popsicle_stick diff --git a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm index 5c9bcc56cc7d..42afb89c4228 100644 --- a/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm +++ b/code/modules/food_and_drinks/recipes/tablecraft/recipes_pie.dm @@ -150,7 +150,6 @@ /datum/reagent/consumable/sugar = 5, /obj/item/reagent_containers/food/snacks/pie/plain = 1, /obj/item/reagent_containers/food/snacks/chocolatebar = 3, - /obj/item/slime_extract = 1 //The reason you dont know how to make it! ) result = /obj/item/reagent_containers/food/snacks/pie/cocolavatart subcategory = CAT_PIE diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index cc2a9f176c70..45b62eb3897d 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -303,29 +303,5 @@ M.updatehealth() qdel(src) -//AI - -/obj/item/slimepotion/slime/sentience/mining - name = "minebot AI upgrade" - desc = "Can be used to grant sentience to minebots. It's incompatible with minebot armor and melee upgrades, and will override them." - icon_state = "door_electronics" - icon = 'icons/obj/module.dmi' - sentience_type = SENTIENCE_MINEBOT - custom_price = 1000 - var/base_health_add = 5 //sentient minebots are penalized for beign sentient; they have their stats reset to normal plus these values - var/base_damage_add = 1 //this thus disables other minebot upgrades - var/base_speed_add = 1 - var/base_cooldown_add = 10 //base cooldown isn't reset to normal, it's just added on, since it's not practical to disable the cooldown module - -/obj/item/slimepotion/slime/sentience/mining/after_success(mob/living/user, mob/living/simple_animal/SM) - if(istype(SM, /mob/living/simple_animal/hostile/mining_drone)) - var/mob/living/simple_animal/hostile/mining_drone/M = SM - M.maxHealth = initial(M.maxHealth) + base_health_add - M.melee_damage_lower = initial(M.melee_damage_lower) + base_damage_add - M.melee_damage_upper = initial(M.melee_damage_upper) + base_damage_add - M.move_to_delay = initial(M.move_to_delay) + base_speed_add - if(M.stored_gun) - M.stored_gun.overheat_time += base_cooldown_add - #undef MINEDRONE_COLLECT #undef MINEDRONE_ATTACK diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index c9cdcaf8199c..1db46a4d5415 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -35,7 +35,6 @@ initial_language_holder = /datum/language_holder/alien flags_1 = PREVENT_CONTENTS_EXPLOSION_1 footstep_type = FOOTSTEP_MOB_CLAW - gold_core_spawnable = NO_SPAWN pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY environment_smash = ENVIRONMENT_SMASH_NONE diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 20d3f81aa38d..14b8081e7c0c 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -32,7 +32,7 @@ attack_sound = 'sound/items/trayhit1.ogg' deathsound = "sound/voice/borg_deathsound.ogg" wings_icons = list("Robotic") - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/ipc loreblurb = "Integrated Positronic Chassis or \"IPC\" for short, are synthetic lifeforms composed of an Artificial \ Intelligence program encased in a bipedal robotic shell. They are fragile, allergic to EMPs, and the butt of endless toaster jokes. \ diff --git a/code/modules/mob/living/carbon/human/species_types/abductors.dm b/code/modules/mob/living/carbon/human/species_types/abductors.dm index 41bc6721755f..229bdcb21c2f 100644 --- a/code/modules/mob/living/carbon/human/species_types/abductors.dm +++ b/code/modules/mob/living/carbon/human/species_types/abductors.dm @@ -5,7 +5,7 @@ species_traits = list(NOBLOOD,NOEYESPRITES,NO_BONES) inherent_traits = list(TRAIT_VIRUSIMMUNE,TRAIT_CHUNKYFINGERS,TRAIT_NOHUNGER,TRAIT_NOBREATH) mutanttongue = /obj/item/organ/tongue/abductor - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN ass_image = 'icons/ass/assgrey.png' species_chest = /obj/item/bodypart/chest/abductor diff --git a/code/modules/mob/living/carbon/human/species_types/android.dm b/code/modules/mob/living/carbon/human/species_types/android.dm index 623041674516..6bb5956ae0ab 100644 --- a/code/modules/mob/living/carbon/human/species_types/android.dm +++ b/code/modules/mob/living/carbon/human/species_types/android.dm @@ -11,7 +11,7 @@ reagent_tag = PROCESS_SYNTHETIC species_gibs = "robotic" attack_sound = 'sound/items/trayhit1.ogg' - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN /datum/species/android/on_species_gain(mob/living/carbon/C) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index cfbc682f24de..f3c477fefb85 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -20,7 +20,7 @@ damage_overlay_type = "" //We are too cool for regular damage overlays species_age_max = 300 species_traits = list(DYNCOLORS, EYECOLOR, HAIR, FACEHAIR) - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/ethereal inherent_traits = list(TRAIT_NOHUNGER) sexes = FALSE //no fetish content allowed diff --git a/code/modules/mob/living/carbon/human/species_types/flypeople.dm b/code/modules/mob/living/carbon/human/species_types/flypeople.dm index f5de9f873b3b..7cf8d8ee3e45 100644 --- a/code/modules/mob/living/carbon/human/species_types/flypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/flypeople.dm @@ -9,7 +9,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly disliked_food = null liked_food = GORE | RAW // Sure, the raw... the bloody... but I think stuff GROSS, like baseball burgers, are liked - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/fly species_chest = /obj/item/bodypart/chest/fly diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index 882fffc9ff41..b45ec4b05f3e 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -9,7 +9,7 @@ skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW | CLOTH liked_food = JUNKFOOD | FRIED | SUGAR - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Mostly hairless mammalians. Their home system, Sol, lies in a sort of \"bluespace dead-zone\" that blocks anything from entering or exiting Sol's dead-zone through bluespace without a relay. While it leaves Sol extremely well-defended, it meant that they went unnoticed and uncontacted until they were themselves able to breach it." /datum/species/human/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 14526059354d..bd937acaa09f 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -20,7 +20,7 @@ coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage burnmod = 0.5 // = 1/2x generic burn damage - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN inherent_factions = list("slime") species_language_holder = /datum/language_holder/jelly ass_image = 'icons/ass/assslime.png' @@ -222,7 +222,7 @@ species_traits = list(MUTCOLORS,EYECOLOR,HAIR,FACEHAIR,NOBLOOD) hair_color = "mutcolor" hair_alpha = 150 - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN var/datum/action/innate/split_body/slime_split var/list/mob/living/carbon/bodies var/datum/action/innate/swap_body/swap_body @@ -517,50 +517,22 @@ id = SPECIES_LUMINESCENT var/glow_intensity = LUMINESCENT_DEFAULT_GLOW var/obj/effect/dummy/luminescent_glow/glow - var/obj/item/slime_extract/current_extract - var/datum/action/innate/integrate_extract/integrate_extract - var/datum/action/innate/use_extract/extract_minor - var/datum/action/innate/use_extract/major/extract_major - var/extract_cooldown = 0 - examine_limb_id = SPECIES_JELLYPERSON //Species datums don't normally implement destroy, but JELLIES SUCK ASS OUT OF A STEEL STRAW /datum/species/jelly/luminescent/Destroy(force, ...) - current_extract = null QDEL_NULL(glow) - QDEL_NULL(integrate_extract) - QDEL_NULL(extract_major) - QDEL_NULL(extract_minor) return ..() /datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C) ..() - if(current_extract) - current_extract.forceMove(C.drop_location()) - current_extract = null QDEL_NULL(glow) - QDEL_NULL(integrate_extract) - QDEL_NULL(extract_major) - QDEL_NULL(extract_minor) /datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species) ..() glow = new(C) update_glow(C) - integrate_extract = new(src) - integrate_extract.Grant(C) - extract_minor = new(src) - extract_minor.Grant(C) - extract_major = new(src) - extract_major.Grant(C) - -/datum/species/jelly/luminescent/proc/update_slime_actions() - integrate_extract.update_name() - integrate_extract.UpdateButtonIcon() - extract_minor.UpdateButtonIcon() - extract_major.UpdateButtonIcon() /datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity) if(intensity) @@ -581,108 +553,6 @@ if(!isliving(loc)) return INITIALIZE_HINT_QDEL - -/datum/action/innate/integrate_extract - name = "Integrate Extract" - desc = "Eat a slime extract to use its properties." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "slimeconsume" - icon_icon = 'icons/mob/actions/actions_slime.dmi' - background_icon_state = "bg_alien" - -/datum/action/innate/integrate_extract/proc/update_name() - var/datum/species/jelly/luminescent/species = target - if(!species || !species.current_extract) - name = "Integrate Extract" - desc = "Eat a slime extract to use its properties." - else - name = "Eject Extract" - desc = "Eject your current slime extract." - -/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force) - var/datum/species/jelly/luminescent/species = target - if(!species || !species.current_extract) - button_icon_state = "slimeconsume" - else - button_icon_state = "slimeeject" - ..() - -/datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) - ..(current_button, TRUE) - var/datum/species/jelly/luminescent/species = target - if(species?.current_extract) - current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) - -/datum/action/innate/integrate_extract/Activate() - var/mob/living/carbon/human/H = owner - var/datum/species/jelly/luminescent/species = target - if(!is_species(H, /datum/species/jelly/luminescent) || !species) - return - CHECK_DNA_AND_SPECIES(H) - - if(species.current_extract) - var/obj/item/slime_extract/S = species.current_extract - if(!H.put_in_active_hand(S)) - S.forceMove(H.drop_location()) - species.current_extract = null - to_chat(H, "You eject [S].") - species.update_slime_actions() - else - var/obj/item/I = H.get_active_held_item() - if(istype(I, /obj/item/slime_extract)) - var/obj/item/slime_extract/S = I - if(!S.Uses) - to_chat(H, "[I] is spent! You cannot integrate it.") - return - if(!H.temporarilyRemoveItemFromInventory(S)) - return - S.forceMove(H) - species.current_extract = S - to_chat(H, "You consume [I], and you feel it pulse within you...") - species.update_slime_actions() - else - to_chat(H, "You need to hold an unused slime extract in your active hand!") - -/datum/action/innate/use_extract - name = "Extract Minor Activation" - desc = "Pulse the slime extract with energized jelly to activate it." - check_flags = AB_CHECK_CONSCIOUS - button_icon_state = "slimeuse1" - icon_icon = 'icons/mob/actions/actions_slime.dmi' - background_icon_state = "bg_alien" - var/activation_type = SLIME_ACTIVATE_MINOR - -/datum/action/innate/use_extract/IsAvailable() - if(..()) - var/datum/species/jelly/luminescent/species = target - if(species && species.current_extract && (world.time > species.extract_cooldown)) - return TRUE - return FALSE - -/datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) - ..(current_button, TRUE) - var/datum/species/jelly/luminescent/species = owner - if(species?.current_extract) - current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) - -/datum/action/innate/use_extract/Activate() - var/mob/living/carbon/human/H = owner - var/datum/species/jelly/luminescent/species = owner - if(!is_species(H, /datum/species/jelly/luminescent) || !species) - return - CHECK_DNA_AND_SPECIES(H) - - if(species.current_extract) - species.extract_cooldown = world.time + 100 - var/cooldown = species.current_extract.activate(H, species, activation_type) - species.extract_cooldown = world.time + cooldown - -/datum/action/innate/use_extract/major - name = "Extract Major Activation" - desc = "Pulse the slime extract with plasma jelly to activate it." - button_icon_state = "slimeuse2" - activation_type = SLIME_ACTIVATE_MAJOR - ///////////////////////////////////STARGAZERS////////////////////////////////////////// //Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants. diff --git a/code/modules/mob/living/carbon/human/species_types/kepori.dm b/code/modules/mob/living/carbon/human/species_types/kepori.dm index 39e3cbc3d07a..e4677fbc19f5 100644 --- a/code/modules/mob/living/carbon/human/species_types/kepori.dm +++ b/code/modules/mob/living/carbon/human/species_types/kepori.dm @@ -9,7 +9,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = FRIED | GROSS | CLOTH liked_food = MEAT | GORE - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Kepori are a species covered in feathers vaguely reminiscent of earth’s extinct troodontidae. They’re small and sometimes seen as weak by other species due to their hollow bones but make up for that in speed and reflexes. They tend to woop when excited, scared, or for any other reason at all." attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 9d539007df4e..5ee7441e2f54 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -12,7 +12,7 @@ coldmod = 1.5 heatmod = 0.67 default_features = list("mcolor" = "0F0", "tail_lizard" = "Smooth", "face_markings" = "None", "horns" = "None", "frills" = "None", "spines" = "None", "body_markings" = "None", "legs" = "Normal Legs", "body_size" = "Normal") - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/mothmen.dm b/code/modules/mob/living/carbon/human/species_types/mothmen.dm index f8495f783e36..10375f424e82 100644 --- a/code/modules/mob/living/carbon/human/species_types/mothmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/mothmen.dm @@ -16,7 +16,7 @@ toxic_food = MEAT | RAW | GORE mutanteyes = /obj/item/organ/eyes/compound //WS Edit - Compound eyes mutanttongue = /obj/item/organ/tongue/moth //WS Edit - Insectoid language - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/moth loreblurb = "Bug-mammal hybrids resembling Sol's lepidopterans. They share the least DNA with baseline humans of any human-derived geneline, being significant portions insect and modified whole-cloth DNA. Their classification as another human geneline or as something else is highly debated. All evidence that would point to their origin– which is presumably a genelab somewhere– has seemingly disappeared into thin air. Mothpeople themselves have no centralized culture or homeworld, leading to a fractured existence amongst the stars." wings_icons = list("Megamoth", "Mothra") diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index d5ce34ca412f..fe017fdd2a84 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -18,7 +18,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/plant disliked_food = MEAT | DAIRY liked_food = VEGETABLES | FRUIT | GRAIN | CLOTH //cannibals apparentely - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP | ERT_SPAWN species_language_holder = /datum/language_holder/plant species_chest = /obj/item/bodypart/chest/pod diff --git a/code/modules/mob/living/carbon/human/species_types/spider.dm b/code/modules/mob/living/carbon/human/species_types/spider.dm index 764a7166ff2d..1b66c952172d 100644 --- a/code/modules/mob/living/carbon/human/species_types/spider.dm +++ b/code/modules/mob/living/carbon/human/species_types/spider.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_INIT(spider_last, world.file2list("strings/names/spider_last.txt")) toxic_food = VEGETABLES | DAIRY | CLOTH mutanteyes = /obj/item/organ/eyes/night_vision/spider mutanttongue = /obj/item/organ/tongue/spider - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP species_language_holder = /datum/language_holder/spider loreblurb = "Rachnids are aliens with coincidental physiological similarities to Sol's spiders. Despite visible adaptations that would make them excellent hunters, modern Rachnidian culture revolves around honing the skills and talents of oneself, treating them as forms of self-expression. Rachnids tend to focus on their work intensely, priding themselves on a job well done and languishing if they see themselves as underperforming in their field." var/web_cooldown = 30 diff --git a/code/modules/mob/living/carbon/human/species_types/vox.dm b/code/modules/mob/living/carbon/human/species_types/vox.dm index 1a73860ab29f..5c2b91127f27 100644 --- a/code/modules/mob/living/carbon/human/species_types/vox.dm +++ b/code/modules/mob/living/carbon/human/species_types/vox.dm @@ -10,7 +10,7 @@ meat = /obj/item/reagent_containers/food/snacks/meat/slab/chicken disliked_food = GRAIN liked_food = MEAT - changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP loreblurb = "Vox are a big bird-like species with quills, much larger and much more long-lasting than other species. Sadly, not much else is known." attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' diff --git a/code/modules/mob/living/simple_animal/friendly/butterfly.dm b/code/modules/mob/living/simple_animal/friendly/butterfly.dm index bf4f45e28329..9c6ead823bd5 100644 --- a/code/modules/mob/living/simple_animal/friendly/butterfly.dm +++ b/code/modules/mob/living/simple_animal/friendly/butterfly.dm @@ -23,7 +23,6 @@ ventcrawler = VENTCRAWLER_ALWAYS mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BUG - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "flutters" verb_ask = "flutters inquisitively" verb_exclaim = "flutters intensely" diff --git a/code/modules/mob/living/simple_animal/friendly/capybara.dm b/code/modules/mob/living/simple_animal/friendly/capybara.dm index 091bf42993f2..f1366aaa89a4 100644 --- a/code/modules/mob/living/simple_animal/friendly/capybara.dm +++ b/code/modules/mob/living/simple_animal/friendly/capybara.dm @@ -43,7 +43,6 @@ real_name = "Caspar" desc = "It's Caspar, the Capybara Captain, the Capy Cappy." gender = MALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/wear_hat = /obj/item/clothing/head/caphat diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 33c8bbdb3ed2..396dc82202a9 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -33,7 +33,6 @@ var/mob/living/simple_animal/mouse/movement_target ///Limits how often cats can spam chasing mice. var/emote_cooldown = 0 - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "cat" held_state = "cat2" @@ -91,7 +90,6 @@ icon_living = "cat" icon_dead = "cat_dead" gender = FEMALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/list/family = list()//var restored from savefile, has count of each child type var/list/children = list()//Actual mob weak references of children @@ -167,7 +165,6 @@ /mob/living/simple_animal/pet/cat/Proc name = "Proc" gender = MALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index bd16daa567f5..a2556f0cc943 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -23,7 +23,6 @@ ventcrawler = VENTCRAWLER_ALWAYS var/obj/item/inventory_head var/obj/item/inventory_mask - gold_core_spawnable = FRIENDLY_SPAWN /mob/living/simple_animal/crab/Life() ..() @@ -44,7 +43,6 @@ real_name = "Coffee" desc = "It's Coffee, the other pet!" gender = FEMALE - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil name = "Evil Crab" @@ -53,7 +51,6 @@ icon_state = "evilcrab" icon_living = "evilcrab" icon_dead = "evilcrab_dead" - gold_core_spawnable = FRIENDLY_SPAWN /mob/living/simple_animal/crab/kreb name = "Kreb" @@ -62,7 +59,6 @@ icon_state = "kreb" icon_living = "kreb" icon_dead = "kreb_dead" - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/crab/evil/kreb name = "Evil Kreb" @@ -70,4 +66,3 @@ icon_state = "evilkreb" icon_living = "evilkreb" icon_dead = "evilkreb_dead" - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index ebfd85f3ca23..2a47d4f0c220 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -88,7 +88,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/corgi = 3, /obj/item/stack/sheet/animalhide/corgi = 1) childtype = list(/mob/living/simple_animal/pet/dog/corgi/puppy = 95, /mob/living/simple_animal/pet/dog/corgi/puppy/void = 5) animal_species = /mob/living/simple_animal/pet/dog - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "corgi" var/obj/item/inventory_head var/obj/item/inventory_back @@ -121,7 +120,6 @@ icon_living = "pug" icon_dead = "pug_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) - gold_core_spawnable = FRIENDLY_SPAWN collar_type = "pug" held_state = "pug" @@ -394,7 +392,6 @@ response_disarm_simple = "bop" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = NO_SPAWN unique_pet = TRUE var/age = 0 var/record_age = 1 @@ -569,7 +566,6 @@ real_name = "Lisa" gender = FEMALE desc = "She's tearing you apart." - gold_core_spawnable = NO_SPAWN unique_pet = TRUE icon_state = "lisa" icon_living = "lisa" diff --git a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm index 65baddfee360..cc2ab1da9ef6 100644 --- a/code/modules/mob/living/simple_animal/friendly/farm_animals.dm +++ b/code/modules/mob/living/simple_animal/friendly/farm_animals.dm @@ -122,7 +122,6 @@ attack_sound = 'sound/weapons/punch1.ogg' health = 50 maxHealth = 50 - gold_core_spawnable = FRIENDLY_SPAWN blood_volume = BLOOD_VOLUME_NORMAL food_type = list(/obj/item/reagent_containers/food/snacks/grown/wheat) tame_chance = 25 @@ -178,7 +177,6 @@ /mob/living/simple_animal/cow/wisdom name = "wisdom cow" desc = "Known for its wisdom, shares it with all" - gold_core_spawnable = FALSE tame_chance = 0 bonus_tame_chance = 0 speak_chance = 15 @@ -229,8 +227,6 @@ var/amount_grown = 0 pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - gold_core_spawnable = FRIENDLY_SPAWN - footstep_type = FOOTSTEP_MOB_CLAW /mob/living/simple_animal/chick/Initialize() @@ -290,7 +286,6 @@ var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") - gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 footstep_type = FOOTSTEP_MOB_CLAW @@ -386,7 +381,6 @@ var/list/feedMessages = list("It clucks happily.","It clucks happily.") var/list/layMessage = EGG_LAYING_MESSAGES var/list/validColors = list("brown","black","white") - gold_core_spawnable = FRIENDLY_SPAWN var/static/chicken_count = 0 environment_smash = ENVIRONMENT_SMASH_NONE melee_damage_lower = 3 diff --git a/code/modules/mob/living/simple_animal/friendly/fox.dm b/code/modules/mob/living/simple_animal/friendly/fox.dm index 8fc52916fa39..164e412cdd1d 100644 --- a/code/modules/mob/living/simple_animal/friendly/fox.dm +++ b/code/modules/mob/living/simple_animal/friendly/fox.dm @@ -20,7 +20,6 @@ response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = FRIENDLY_SPAWN held_state = "fox" footstep_type = FOOTSTEP_MOB_CLAW @@ -34,5 +33,4 @@ name = "Renault" desc = "Renault, the Captain's trustworthy fox." gender = FEMALE - gold_core_spawnable = NO_SPAWN unique_pet = TRUE diff --git a/code/modules/mob/living/simple_animal/friendly/lizard.dm b/code/modules/mob/living/simple_animal/friendly/lizard.dm index c854936c7d22..e872fdfcefce 100644 --- a/code/modules/mob/living/simple_animal/friendly/lizard.dm +++ b/code/modules/mob/living/simple_animal/friendly/lizard.dm @@ -23,7 +23,6 @@ pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/static/list/edibles = typecacheof(list(/mob/living/simple_animal/butterfly, /mob/living/simple_animal/hostile/cockroach)) //list of atoms, however turfs won't affect AI, but will affect consumption. diff --git a/code/modules/mob/living/simple_animal/friendly/mothroach.dm b/code/modules/mob/living/simple_animal/friendly/mothroach.dm index 881e64d2a70f..083c576e1c17 100644 --- a/code/modules/mob/living/simple_animal/friendly/mothroach.dm +++ b/code/modules/mob/living/simple_animal/friendly/mothroach.dm @@ -17,7 +17,6 @@ health = 25 maxHealth = 25 speed = 1.25 - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "flutters" verb_ask = "flutters inquisitively" verb_exclaim = "flutters loudly" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 7b11d05bcf2c..c647b59f4d49 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -45,7 +45,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) mob_biotypes = MOB_ORGANIC|MOB_BEAST lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE //WS Edit var/body_color //brown, gray and white, leave blank for random - gold_core_spawnable = FRIENDLY_SPAWN move_force = MOVE_FORCE_EXTREMELY_WEAK //WS Edit var/chew_probability = 1 var/full = FALSE //WS Edit @@ -261,7 +260,6 @@ GLOBAL_VAR_INIT(mouse_killed, 0) response_disarm_simple = "gently push aside" response_harm_continuous = "splats" response_harm_simple = "splat" - gold_core_spawnable = NO_SPAWN /obj/item/reagent_containers/food/snacks/deadmouse name = "dead mouse" diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm index 5e39c3c8a51d..50ea0a5003cb 100644 --- a/code/modules/mob/living/simple_animal/friendly/penguin.dm +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -32,7 +32,6 @@ icon_state = "penguin" icon_living = "penguin" icon_dead = "penguin_dead" - gold_core_spawnable = FRIENDLY_SPAWN butcher_results = list(/obj/item/organ/ears/penguin = 1, /obj/item/reagent_containers/food/snacks/meat/slab/penguin = 3) /mob/living/simple_animal/pet/penguin/baby diff --git a/code/modules/mob/living/simple_animal/friendly/sloth.dm b/code/modules/mob/living/simple_animal/friendly/sloth.dm index fa5ab9c9df94..63bc7d76e5dd 100644 --- a/code/modules/mob/living/simple_animal/friendly/sloth.dm +++ b/code/modules/mob/living/simple_animal/friendly/sloth.dm @@ -18,7 +18,6 @@ response_harm_continuous = "kicks" response_harm_simple = "kick" mob_biotypes = MOB_ORGANIC|MOB_BEAST - gold_core_spawnable = FRIENDLY_SPAWN melee_damage_lower = 18 melee_damage_upper = 18 health = 50 @@ -33,7 +32,6 @@ /mob/living/simple_animal/sloth/paperwork name = "Paperwork" desc = "Cargo's pet sloth. About as useful as the rest of the techs." - gold_core_spawnable = NO_SPAWN //Cargo Sloth 2 @@ -45,4 +43,3 @@ icon_dead = "cool_sloth_dead" gender = FEMALE butcher_results = list(/obj/item/toy/spinningtoy = 1) - gold_core_spawnable = NO_SPAWN diff --git a/code/modules/mob/living/simple_animal/friendly/snake.dm b/code/modules/mob/living/simple_animal/friendly/snake.dm index d33fac8f5c00..38fb4ced3d9f 100644 --- a/code/modules/mob/living/simple_animal/friendly/snake.dm +++ b/code/modules/mob/living/simple_animal/friendly/snake.dm @@ -35,7 +35,6 @@ pass_flags = PASSTABLE | PASSMOB mob_size = MOB_SIZE_SMALL mob_biotypes = MOB_ORGANIC|MOB_BEAST|MOB_REPTILE - gold_core_spawnable = FRIENDLY_SPAWN obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE var/glasses_overlay_file = 'icons/mob/pets.dmi' diff --git a/code/modules/mob/living/simple_animal/friendly/turtle.dm b/code/modules/mob/living/simple_animal/friendly/turtle.dm index 97b07424d375..3ef772cc4be0 100644 --- a/code/modules/mob/living/simple_animal/friendly/turtle.dm +++ b/code/modules/mob/living/simple_animal/friendly/turtle.dm @@ -19,7 +19,6 @@ response_harm_continuous = "kicks" response_harm_simple = "kick" mob_biotypes = MOB_ORGANIC|MOB_BEAST - gold_core_spawnable = NO_SPAWN melee_damage_lower = 0.5 melee_damage_upper = 1 health = 2500 diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index ec7c76f5ca61..e7d029467f25 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -30,7 +30,6 @@ see_in_dark = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN deathsound = 'sound/voice/hiss6.ogg' deathmessage = "lets out a waning guttural screech, green blood bubbling from its maw..." @@ -143,7 +142,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/xeno = 10, /obj/item/stack/sheet/animalhide/xeno = 2) mob_size = MOB_SIZE_LARGE - gold_core_spawnable = NO_SPAWN /obj/projectile/neurotox name = "neurotoxin" @@ -169,7 +167,6 @@ friendly_verb_simple = "caress" obj_damage = 0 environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN icon_state = "maid" icon_living = "maid" icon_dead = "maid_dead" diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index b6f5c58b424e..6cf14fd33c9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -98,7 +98,6 @@ health = 120 maxHealth = 120 armored = TRUE - gold_core_spawnable = HOSTILE_SPAWN /mob/living/simple_animal/hostile/bear/cave name = "brown bear" diff --git a/code/modules/mob/living/simple_animal/hostile/bees.dm b/code/modules/mob/living/simple_animal/hostile/bees.dm index 676b58a98520..c56f87178e75 100644 --- a/code/modules/mob/living/simple_animal/hostile/bees.dm +++ b/code/modules/mob/living/simple_animal/hostile/bees.dm @@ -47,7 +47,6 @@ mob_size = MOB_SIZE_TINY mob_biotypes = MOB_ORGANIC|MOB_BUG movement_type = FLYING - gold_core_spawnable = FRIENDLY_SPAWN search_objects = 1 //have to find those plant trays! //Spaceborn beings don't get hurt by space diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 67a80713d8ec..a0986111a4b1 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -43,7 +43,6 @@ faction = list("carp", "mining") movement_type = FLYING pressure_resistance = 200 - gold_core_spawnable = HOSTILE_SPAWN var/random_color = TRUE //if the carp uses random coloring var/rarechance = 1 //chance for rare color variant @@ -159,7 +158,6 @@ icon_state = "holocarp" icon_living = "holocarp" maxbodytemp = INFINITY - gold_core_spawnable = NO_SPAWN del_on_death = 1 random_color = FALSE food_type = list() @@ -229,7 +227,6 @@ desc = "A failed Syndicate experiment in weaponized space carp technology, it now serves as a lovable mascot." gender = FEMALE speak_emote = list("squeaks") - gold_core_spawnable = NO_SPAWN faction = list(ROLE_SYNDICATE) AIStatus = AI_OFF rarechance = 10 diff --git a/code/modules/mob/living/simple_animal/hostile/cockroach.dm b/code/modules/mob/living/simple_animal/hostile/cockroach.dm index c822268a7fe2..5a931b0079b4 100644 --- a/code/modules/mob/living/simple_animal/hostile/cockroach.dm +++ b/code/modules/mob/living/simple_animal/hostile/cockroach.dm @@ -23,7 +23,6 @@ melee_damage_upper = 0 obj_damage = 0 ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN verb_say = "chitters" verb_ask = "chitters inquisitively" verb_exclaim = "chitters loudly" @@ -49,7 +48,6 @@ melee_damage_lower = 5 melee_damage_upper = 5 obj_damage = 20 - gold_core_spawnable = HOSTILE_SPAWN projectilesound = 'sound/weapons/gun/pistol/shot.ogg' projectiletype = /obj/projectile/glockroachbullet casingtype = /obj/item/ammo_casing/glockroach diff --git a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm index 57a33c2ee02a..8a1fe372ee6a 100644 --- a/code/modules/mob/living/simple_animal/hostile/eyeballs.dm +++ b/code/modules/mob/living/simple_animal/hostile/eyeballs.dm @@ -29,7 +29,6 @@ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 maxbodytemp = 1500 - gold_core_spawnable = HOSTILE_SPAWN faction = list("spooky") del_on_death = 1 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE diff --git a/code/modules/mob/living/simple_animal/hostile/faithless.dm b/code/modules/mob/living/simple_animal/hostile/faithless.dm index c9c2e131cc09..a814d67ebc86 100644 --- a/code/modules/mob/living/simple_animal/hostile/faithless.dm +++ b/code/modules/mob/living/simple_animal/hostile/faithless.dm @@ -31,7 +31,6 @@ minbodytemp = 0 faction = list("faithless") - gold_core_spawnable = HOSTILE_SPAWN footstep_type = FOOTSTEP_MOB_SHOE diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 5e3e8d0b34d5..71b31c9568e1 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -50,7 +50,6 @@ attack_verb_simple = "bite" attack_sound = 'sound/weapons/bite.ogg' unique_name = 1 - gold_core_spawnable = HOSTILE_SPAWN lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE footstep_type = FOOTSTEP_MOB_CLAW mob_size = MOB_SIZE_LARGE @@ -122,7 +121,6 @@ var/datum/action/innate/spider/lay_eggs/lay_eggs var/datum/action/innate/spider/set_directive/set_directive var/static/list/consumed_mobs = list() //the refs of mobs that have been consumed by nurse spiders to lay eggs - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/nurse/Initialize() . = ..() @@ -172,7 +170,6 @@ melee_damage_upper = 20 poison_per_bite = 5 move_to_delay = 5 - gold_core_spawnable = NO_SPAWN //vipers are the rare variant of the hunter, no IMMEDIATE damage but so much poison medical care will be needed fast. /mob/living/simple_animal/hostile/poison/giant_spider/hunter/viper @@ -205,7 +202,6 @@ move_to_delay = 8 speed = 9 status_flags = NONE - gold_core_spawnable = NO_SPAWN var/slowed_by_webs = FALSE /mob/living/simple_animal/hostile/poison/giant_spider/tarantula/Moved(atom/oldloc, dir) @@ -225,7 +221,6 @@ maxbodytemp = 1500 poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/nurse/ice name = "giant ice spider" @@ -242,7 +237,6 @@ maxbodytemp = 1500 poison_type = /datum/reagent/consumable/frostoil color = rgb(114,228,250) - gold_core_spawnable = NO_SPAWN /mob/living/simple_animal/hostile/poison/giant_spider/handle_automated_action() if(!..()) //AIStatus is off diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm index a175bb40feca..6a11507beea1 100644 --- a/code/modules/mob/living/simple_animal/hostile/goose.dm +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -29,7 +29,6 @@ speak_emote = list("honks") faction = list("neutral") attack_same = TRUE - gold_core_spawnable = HOSTILE_SPAWN var/random_retaliate = TRUE var/icon_vomit_start = "vomit_start" var/icon_vomit = "vomit" @@ -95,7 +94,6 @@ response_disarm_simple = "gently push aside" response_harm_continuous = "kicks" response_harm_simple = "kick" - gold_core_spawnable = NO_SPAWN random_retaliate = FALSE var/vomiting = FALSE var/vomitCoefficient = 1 diff --git a/code/modules/mob/living/simple_animal/hostile/headcrab.dm b/code/modules/mob/living/simple_animal/hostile/headcrab.dm index 850ff235375f..292a9fee3658 100644 --- a/code/modules/mob/living/simple_animal/hostile/headcrab.dm +++ b/code/modules/mob/living/simple_animal/hostile/headcrab.dm @@ -73,8 +73,6 @@ if(origin && (origin.current ? (origin.current.stat == DEAD) : origin.get_ghost())) origin.transfer_to(M) var/datum/antagonist/changeling/C = origin.has_antag_datum(/datum/antagonist/changeling) - if(!C) - C = origin.add_antag_datum(/datum/antagonist/changeling/xenobio) if(C.can_absorb_dna(owner)) C.add_new_profile(owner) diff --git a/code/modules/mob/living/simple_animal/hostile/hivebot.dm b/code/modules/mob/living/simple_animal/hostile/hivebot.dm index 431229fefc44..b6d7665221af 100644 --- a/code/modules/mob/living/simple_animal/hostile/hivebot.dm +++ b/code/modules/mob/living/simple_animal/hostile/hivebot.dm @@ -120,7 +120,6 @@ maxHealth = 60 ranged = TRUE rapid = 3 - gold_core_spawnable = HOSTILE_SPAWN var/datum/action/innate/hivebot/foamwall/foam /mob/living/simple_animal/hostile/hivebot/mechanic/Initialize(mapload) diff --git a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm index eccb38bee5bd..d03f0be88083 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/survivors.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/survivors.dm @@ -149,7 +149,7 @@ /obj/item/stack/sheet/sinew = 5, /obj/item/stack/sheet/bone = 5, /obj/item/melee/knife/combat = 3, - /obj/item/reagent_containers/food/snacks/rationpack = 30 + /obj/item/storage/ration/shredded_beef = 30 ) ) if (prob(15)) //mayhaps a medkit diff --git a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm index a88a79610b60..4983c53ef88d 100644 --- a/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/human/syndicate.dm @@ -283,7 +283,6 @@ limb_destroyer = 1 speak_emote = list("states") bubble_icon = "syndibot" - gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 deathmessage = "is smashed into pieces!" diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index 8b1de1c2b8a4..1b1dd1d72901 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -28,4 +28,3 @@ atmos_requirements = list("min_oxy" = 5, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 150 maxbodytemp = 500 - gold_core_spawnable = HOSTILE_SPAWN diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index ff06df9c6113..a386758b8e6c 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -659,7 +659,6 @@ GLOBAL_DATUM(blackbox, /obj/machinery/smartfridge/black_box) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB ventcrawler = VENTCRAWLER_ALWAYS mob_size = MOB_SIZE_TINY - gold_core_spawnable = HOSTILE_SPAWN verb_say = "warps" verb_ask = "floats inquisitively" verb_exclaim = "zaps" diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index 0568533c1e0c..ecdc357b8da3 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -267,102 +267,5 @@ GLOBAL_LIST_INIT(protected_objects, list(/obj/structure/table, /obj/structure/ca icon_state = TrueGun.icon_state icon_living = TrueGun.icon_state -/mob/living/simple_animal/hostile/mimic/xenobio - health = 210 - maxHealth = 210 - attack_verb_continuous = "bites" - attack_verb_simple = "bite" - speak_emote = list("clatters") - gold_core_spawnable = HOSTILE_SPAWN - var/opened = FALSE - var/open_sound = 'sound/machines/crate_open.ogg' - var/close_sound = 'sound/machines/crate_close.ogg' - var/max_mob_size = MOB_SIZE_HUMAN - var/locked = FALSE - var/datum/action/innate/mimic/lock/lock - -/mob/living/simple_animal/hostile/mimic/xenobio/Initialize() - . = ..() - lock = new - lock.Grant(src) - -/mob/living/simple_animal/hostile/mimic/xenobio/AttackingTarget() - if(src == target) - toggle_open() - return - return ..() - -/mob/living/simple_animal/hostile/mimic/xenobio/attack_hand(mob/living/carbon/human/M) - . = ..() - if(M.a_intent != "help") - return - toggle_open() - -/mob/living/simple_animal/hostile/mimic/xenobio/death() - var/obj/structure/closet/crate/C = new(get_turf(src)) - // Put loot in crate - for(var/atom/movable/AM as anything in src) - AM.forceMove(C) - return ..() - -/mob/living/simple_animal/hostile/mimic/xenobio/CanAllowThrough(atom/movable/mover, border_dir) - . = ..() - if(istype(mover, /obj/structure/closet)) - return FALSE - -/mob/living/simple_animal/hostile/mimic/xenobio/proc/toggle_open() - if(locked) - return - if(!opened) - density = FALSE - opened = TRUE - icon_state = "crateopen" - playsound(src, open_sound, 50, TRUE) - for(var/atom/movable/AM as anything in src) - AM.forceMove(loc) - else - density = TRUE - opened = FALSE - icon_state = "crate" - playsound(src, close_sound, 50, TRUE) - for(var/atom/movable/AM in get_turf(src)) - if(insertion_allowed(AM)) - AM.forceMove(src) - -/mob/living/simple_animal/hostile/mimic/xenobio/proc/insertion_allowed(atom/movable/AM) - if(ismob(AM)) - if(!isliving(AM)) //Don't let ghosts and such get trapped in the beast. - return FALSE - var/mob/living/L = AM - if(L.anchored || L.buckled || L.incorporeal_move || L.has_buckled_mobs()) - return FALSE - if(L.mob_size > MOB_SIZE_TINY) // Tiny mobs are treated as items. - if(L.density || L.mob_size > max_mob_size) - return FALSE - L.stop_pulling() - - else if(istype(AM, /obj/structure/closet)) - return FALSE - else if(isobj(AM)) - if(AM.anchored || AM.has_buckled_mobs()) - return FALSE - else if(isitem(AM) && !HAS_TRAIT(AM, TRAIT_NODROP)) - return TRUE - else - return FALSE - return TRUE - /datum/action/innate/mimic background_icon_state = "bg_default" - -/datum/action/innate/mimic/lock - name = "Lock/Unlock" - desc = "Toggle preventing yourself from being opened or closed." - -/datum/action/innate/mimic/lock/Activate() - var/mob/living/simple_animal/hostile/mimic/xenobio/M = owner - M.locked = !M.locked - if(!M.locked) - to_chat(M, "You loosen up, allowing yourself to be opened and closed.") - else - to_chat(M, "You stiffen up, preventing anyone from opening or closing you.") diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index b03363e956f1..d3040bc7717c 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -32,7 +32,6 @@ attack_sound = 'sound/weapons/bladeslice.ogg' aggro_vision_range = 9 turns_per_move = 5 - gold_core_spawnable = HOSTILE_SPAWN loot = list(/obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}, /obj/item/stack/ore/diamond{layer = ABOVE_MOB_LAYER}) var/lava_drinker = TRUE @@ -229,7 +228,6 @@ robust_searching = 1 attack_same = TRUE // So we'll fight basilisks //mob_trophy = /obj/item/mob_trophy/watcher_wing - gold_core_spawnable = NO_SPAWN loot = list() butcher_results = list(/obj/item/stack/ore/diamond = 2, /obj/item/stack/sheet/sinew = 2, /obj/item/stack/sheet/bone = 1) lava_drinker = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm index e4eb7122d391..fede2e8753ac 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/goldgrub.dm @@ -29,7 +29,6 @@ throw_message = "sinks in slowly, before being pushed out of " deathmessage = "stops moving as green liquid oozes from the carcass!" status_flags = CANPUSH - gold_core_spawnable = HOSTILE_SPAWN search_objects = 1 wanted_objects = list( /obj/item/stack/ore/diamond, diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm index e7257c7d39c4..a6457306cda7 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/gutlunch.dm @@ -28,7 +28,6 @@ friendly_verb_simple = "pinch" a_intent = INTENT_HELP ventcrawler = VENTCRAWLER_ALWAYS - gold_core_spawnable = FRIENDLY_SPAWN stat_attack = HARD_CRIT gender = NEUTER stop_automated_movement = FALSE @@ -102,7 +101,6 @@ /mob/living/simple_animal/hostile/asteroid/gutlunch/grublunch name = "grublunch" wanted_objects = list() //They don't eat. - gold_core_spawnable = NO_SPAWN var/growth = 0 //Baby gutlunch diff --git a/code/modules/mob/living/simple_animal/hostile/netherworld.dm b/code/modules/mob/living/simple_animal/hostile/netherworld.dm index 25827781b4b8..8ec732defc04 100644 --- a/code/modules/mob/living/simple_animal/hostile/netherworld.dm +++ b/code/modules/mob/living/simple_animal/hostile/netherworld.dm @@ -14,7 +14,6 @@ attack_sound = 'sound/weapons/bladeslice.ogg' faction = list("nether") speak_emote = list("screams") - gold_core_spawnable = HOSTILE_SPAWN atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) minbodytemp = 0 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE @@ -158,7 +157,6 @@ icon_state = "blank-body" icon_living = "blank-body" icon_dead = "blank-dead" - gold_core_spawnable = NO_SPAWN health = 100 maxHealth = 100 melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index cad59e7369b8..f957018dfad1 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -25,7 +25,6 @@ attack_sound = 'sound/weapons/punch1.ogg' ventcrawler = VENTCRAWLER_ALWAYS unique_name = TRUE - gold_core_spawnable = HOSTILE_SPAWN faction = list("rat") var/datum/action/cooldown/coffer var/datum/action/cooldown/riot diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm index e8bee6661a5a..6c23f5cefe23 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/frog.dm @@ -28,7 +28,6 @@ butcher_results = list(/obj/item/reagent_containers/food/snacks/nugget = 1) pass_flags = PASSTABLE | PASSGRILLE | PASSMOB mob_size = MOB_SIZE_TINY - gold_core_spawnable = FRIENDLY_SPAWN var/stepped_sound = 'sound/effects/huuu.ogg' /mob/living/simple_animal/hostile/retaliate/frog/Initialize() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm index 8b9d0d666bfb..d72cdf215e22 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/ghost.dm @@ -30,7 +30,6 @@ maxbodytemp = 1500 movement_type = FLYING pressure_resistance = 300 - gold_core_spawnable = NO_SPAWN //too spooky for science light_system = MOVABLE_LIGHT light_range = 1 // same glowing as visible player ghosts light_power = 2 diff --git a/code/modules/mob/living/simple_animal/hostile/statue.dm b/code/modules/mob/living/simple_animal/hostile/statue.dm index bac0b4b1d51b..d5b56f758cb1 100644 --- a/code/modules/mob/living/simple_animal/hostile/statue.dm +++ b/code/modules/mob/living/simple_animal/hostile/statue.dm @@ -49,7 +49,6 @@ move_force = MOVE_FORCE_EXTREMELY_STRONG move_resist = MOVE_FORCE_EXTREMELY_STRONG pull_force = MOVE_FORCE_EXTREMELY_STRONG - gold_core_spawnable = HOSTILE_SPAWN var/cannot_be_seen = 1 var/mob/living/creator = null diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 41efc6993d9d..c040a2221d0b 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -40,7 +40,6 @@ deathmessage = "is hacked into pieces!" loot = list(/obj/item/stack/sheet/mineral/wood) - gold_core_spawnable = HOSTILE_SPAWN del_on_death = 1 var/is_tree = TRUE diff --git a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm index b77436c09c89..be3242ed5252 100644 --- a/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm +++ b/code/modules/mob/living/simple_animal/hostile/wumborian_fugu.dm @@ -32,7 +32,6 @@ aggro_vision_range = 9 mob_size = MOB_SIZE_SMALL environment_smash = ENVIRONMENT_SMASH_NONE - gold_core_spawnable = HOSTILE_SPAWN var/wumbo = 0 var/inflate_cooldown = 0 var/datum/action/innate/fugu/expand/E diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index bc22f78ae7a3..b39793d9a414 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -64,7 +64,6 @@ friendly_verb_simple = "groom" mob_size = MOB_SIZE_SMALL movement_type = FLYING - gold_core_spawnable = FRIENDLY_SPAWN var/parrot_damage_upper = 10 var/parrot_state = PARROT_WANDER //Hunt for a perch when created @@ -904,7 +903,6 @@ name = "Polly" desc = "Polly the Parrot. An expert on quantum cracker theory." speak = list("Polly wanna cracker!", ":e Check the crystal, you chucklefucks!",":e Wire the solars, you lazy bums!",":e WHO TOOK THE DAMN HARDSUITS?",":e OH GOD ITS ABOUT TO DELAMINATE CALL THE SHUTTLE") - gold_core_spawnable = NO_SPAWN speak_chance = 3 var/memory_saved = FALSE var/rounds_survived = 0 diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 55ea24c81d7d..35e0e535c96d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -98,8 +98,6 @@ var/obj/item/card/id/access_card = null ///In the event that you want to have a buffing effect on the mob, but don't want it to stack with other effects, any outside force that applies a buff to a simple mob should at least set this to 1, so we have something to check against. var/buffed = 0 - ///If the mob can be spawned with a gold slime core. HOSTILE_SPAWN are spawned with plasma, FRIENDLY_SPAWN are spawned with blood. - var/gold_core_spawnable = NO_SPAWN var/datum/component/spawner/nest diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index cb4b76983563..cafb6cb77bd5 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -43,7 +43,6 @@ // for the sake of cleanliness, though, here they are. status_flags = CANUNCONSCIOUS|CANPUSH - var/cores = 1 // the number of /obj/item/slime_extract's the slime has left inside var/mutation_chance = 30 // Chance of mutating, should be between 25 and 35 var/powerlevel = 0 // 1-10 controls how much electricity they are generating @@ -71,7 +70,6 @@ ///////////TIME FOR SUBSPECIES var/colour = "grey" - var/coretype = /obj/item/slime_extract/grey var/list/slime_mutation[4] var/static/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange", @@ -79,13 +77,6 @@ "gold", "green", "adamantine", "oil", "light pink", "bluespace", "cerulean", "sepia", "black", "pyrite") - ///////////CORE-CROSSING CODE - - var/effectmod //What core modification is being used. - var/crossbreed_modifier = 1 // modifies how many extracts are needed - var/applied = 0 //How many extracts of the modtype have been applied. - - /mob/living/simple_animal/slime/Initialize(mapload, new_colour="grey", new_is_adult=FALSE) var/datum/action/innate/slime/feed/F = new F.Grant(src) @@ -119,8 +110,6 @@ colour = new_colour update_name() slime_mutation = mutation_table(colour) - var/sanitizedcolour = replacetext(colour, " ", "") - coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") regenerate_icons() /mob/living/simple_animal/slime/update_name() @@ -354,50 +343,9 @@ force_effect = round(W.force/2) if(prob(10 + force_effect)) discipline_slime(user) - if(istype(W, /obj/item/storage/bag/bio)) - var/obj/item/storage/P = W - if(!effectmod) - to_chat(user, "The slime is not currently being mutated.") - return - var/hasOutput = FALSE //Have we outputted text? - var/hasFound = FALSE //Have we found an extract to be added? - for(var/obj/item/slime_extract/S in P.contents) - if(S.effectmod == effectmod) - SEND_SIGNAL(P, COMSIG_TRY_STORAGE_TAKE, S, get_turf(src), TRUE) - qdel(S) - applied++ - hasFound = TRUE - if(applied >= (SLIME_EXTRACT_CROSSING_REQUIRED * crossbreed_modifier)) - to_chat(user, "You feed the slime as many of the extracts from the bag as you can, and it mutates!") - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - spawn_corecross() - hasOutput = TRUE - break - if(!hasOutput) - if(!hasFound) - to_chat(user, "There are no extracts in the bag that this slime will accept!") - else - to_chat(user, "You feed the slime some extracts from the bag.") - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) return ..() -/mob/living/simple_animal/slime/proc/spawn_corecross() - var/static/list/crossbreeds = subtypesof(/obj/item/slimecross) - visible_message("[src] shudders, its mutated core consuming the rest of its body!") - playsound(src, 'sound/magic/smoke.ogg', 50, TRUE) - var/crosspath - for(var/X in crossbreeds) - var/obj/item/slimecross/S = X - if(initial(S.colour) == colour && initial(S.effect) == effectmod) - crosspath = S - break - if(crosspath) - new crosspath(loc) - else - visible_message("The mutated core shudders, and collapses into a puddle, unable to maintain its form.") - qdel(src) - /mob/living/simple_animal/slime/proc/apply_water() adjustBruteLoss(rand(15,20)) if(!client) diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm deleted file mode 100644 index 25cbcd42e124..000000000000 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ /dev/null @@ -1,17 +0,0 @@ -/datum/movespeed_modifier/status_effect/bloodchill - multiplicative_slowdown = 3 - -/datum/movespeed_modifier/status_effect/bonechill - multiplicative_slowdown = 3 - -/datum/movespeed_modifier/status_effect/lightpink - multiplicative_slowdown = -0.25 - blacklisted_movetypes = (FLYING|FLOATING) - -/datum/movespeed_modifier/status_effect/tarfoot - multiplicative_slowdown = 0.5 - blacklisted_movetypes = (FLYING|FLOATING) - -/datum/movespeed_modifier/status_effect/sepia - variable = TRUE - blacklisted_movetypes = (FLYING|FLOATING) diff --git a/code/modules/power/cell.dm b/code/modules/power/cell.dm index b1847513a941..74f6d8f3fe6f 100644 --- a/code/modules/power/cell.dm +++ b/code/modules/power/cell.dm @@ -342,18 +342,6 @@ custom_materials = null grown_battery = TRUE //it has the overlays for wires -/obj/item/stock_parts/cell/high/slime - name = "charged slime core" - desc = "A yellow slime core infused with plasma, it crackles with power." - icon = 'icons/mob/slimes.dmi' - icon_state = "yellow slime extract" - custom_materials = null - rating = 5 //self-recharge makes these desirable - self_recharge = 1 // Infused slime cores self-recharge, over time - -/*Hypercharged slime cell - located in /code/modules/research/xenobiology/crossbreeding/_misc.dm -/obj/item/stock_parts/cell/high/slime/hypercharged */ - /obj/item/stock_parts/cell/emproof name = "\improper EMP-proof cell" desc = "An EMP-proof cell." diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index 49765fd6747b..a442ee2a11c8 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -519,11 +519,6 @@ if(!C.required_other) matching_other = 1 - else if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/M = cached_my_atom - - if(M.Uses > 0) // added a limit to slime cores -- Muskets requested this - matching_other = 1 else if(!C.required_container) matching_container = 1 @@ -571,15 +566,6 @@ for(var/mob/M in seen) to_chat(M, "[iconhtml] [selected_reaction.mix_message]") - if(istype(cached_my_atom, /obj/item/slime_extract)) - var/obj/item/slime_extract/ME2 = my_atom - ME2.Uses-- - if(ME2.Uses <= 0) // give the notification that the slime core is dead - for(var/mob/M in seen) - to_chat(M, "[iconhtml] \The [my_atom]'s power is consumed in the reaction.") - ME2.name = "used slime extract" - ME2.desc = "This extract has been used up." - selected_reaction.on_reaction(src, multiplier) reaction_occurred = 1 diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index 313fb7475e00..14ded3b571f9 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -299,10 +299,6 @@ shock_timer = 0 //immune to shocks M.AdjustAllImmobility(-40) M.adjustStaminaLoss(-2, 0) - if(isluminescent(M)) - var/mob/living/carbon/human/H = M - var/datum/species/jelly/luminescent/L = H.dna.species - L.extract_cooldown = max(0, L.extract_cooldown - 20) ..() /datum/reagent/firefighting_foam diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 851a9e38a267..d5e74a6766bb 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -18,38 +18,6 @@ return //I recommend you set the result amount to the total volume of all components. -/datum/chemical_reaction/proc/chemical_mob_spawn(datum/reagents/holder, amount_to_spawn, reaction_name, mob_class = HOSTILE_SPAWN, mob_faction = "chemicalsummon", random = TRUE) - if(holder && holder.my_atom) - var/atom/A = holder.my_atom - var/turf/T = get_turf(A) - var/message = "Mobs have been spawned in [ADMIN_VERBOSEJMP(T)] by a [reaction_name] reaction." - message += " (VV)" - - var/mob/M = get(A, /mob) - if(M) - message += " - Carried By: [ADMIN_LOOKUPFLW(M)]" - else - message += " - Last Fingerprint: [(A.fingerprintslast ? A.fingerprintslast : "N/A")]" - - message_admins(message, 0, 1) - log_game("[reaction_name] chemical mob spawn reaction occuring at [AREACOORD(T)] carried by [key_name(M)] with last fingerprint [A.fingerprintslast? A.fingerprintslast : "N/A"]") - - playsound(get_turf(holder.my_atom), 'sound/effects/phasein.ogg', 100, TRUE) - - for(var/mob/living/carbon/C in viewers(get_turf(holder.my_atom), null)) - C.flash_act() - - for(var/i in 1 to amount_to_spawn) - var/mob/living/simple_animal/S - if(random) - S = create_random_mob(get_turf(holder.my_atom), mob_class) - else - S = new mob_class(get_turf(holder.my_atom))//Spawn our specific mob_class - S.faction |= mob_faction - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(S, pick(NORTH,SOUTH,EAST,WEST)) - ///Simulates a vortex that moves nearby movable atoms towards or away from the turf T. Range also determines the strength of the effect. High values cause nearby objects to be thrown. /proc/goonchem_vortex(turf/T, setting_type, range) for(var/atom/movable/X in orange(range, T)) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index d9b6b782115e..c4eaf50e45d0 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -435,18 +435,6 @@ results = list(/datum/reagent/colorful_reagent = 5) required_reagents = list(/datum/reagent/stable_plasma = 1, /datum/reagent/uranium/radium = 1, /datum/reagent/drug/space_drugs = 1, /datum/reagent/medicine/cryoxadone = 1, /datum/reagent/consumable/triple_citrus = 1) -/datum/chemical_reaction/life - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/blood = 1) - -/datum/chemical_reaction/life/on_reaction(datum/reagents/holder, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (hostile)") //defaults to HOSTILE_SPAWN - -/datum/chemical_reaction/life_friendly - required_reagents = list(/datum/reagent/medicine/strange_reagent = 1, /datum/reagent/medicine/synthflesh = 1, /datum/reagent/consumable/sugar = 1) - -/datum/chemical_reaction/life_friendly/on_reaction(datum/reagents/holder, created_volume) - chemical_mob_spawn(holder, rand(1, round(created_volume, 1)), "Life (friendly)", FRIENDLY_SPAWN) - /datum/chemical_reaction/corgium required_reagents = list(/datum/reagent/consumable/nutriment = 1, /datum/reagent/colorful_reagent = 1, /datum/reagent/medicine/strange_reagent = 1, /datum/reagent/blood = 1) required_temp = 374 @@ -560,14 +548,6 @@ required_container = /obj/item/reagent_containers/food/snacks/grown/mushroom/glowshroom mix_message = "The mushroom's insides bubble and pop and it becomes very limp." -/datum/chemical_reaction/slime_extractification - required_reagents = list(/datum/reagent/toxin/slimejelly = 30, /datum/reagent/consumable/frostoil = 5, /datum/reagent/toxin/plasma = 5) - mix_message = "The mixture condenses into a ball." - -/datum/chemical_reaction/slime_extractification/on_reaction(datum/reagents/holder, created_volume) - var/location = get_turf(holder.my_atom) - new /obj/item/slime_extract/grey(location) - /datum/chemical_reaction/metalgen_imprint required_reagents = list(/datum/reagent/metalgen = 1, /datum/reagent/liquid_dark_matter = 1) results = list(/datum/reagent/metalgen = 1) diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm deleted file mode 100644 index 7429db4c1dec..000000000000 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ /dev/null @@ -1,595 +0,0 @@ - -/datum/chemical_reaction/slime - var/deletes_extract = TRUE - -/datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) - use_slime_core(holder) - -/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder) - SSblackbox.record_feedback("tally", "slime_cores_used", 1, "type") - if(deletes_extract) - delete_extract(holder) - -/datum/chemical_reaction/slime/proc/delete_extract(datum/reagents/holder) - var/obj/item/slime_extract/M = holder.my_atom - if(M.Uses <= 0 && !results.len) //if the slime doesn't output chemicals - qdel(M) - -//Grey -/datum/chemical_reaction/slime/slimespawn - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/grey - required_other = TRUE - -/datum/chemical_reaction/slime/slimespawn/on_reaction(datum/reagents/holder) - var/mob/living/simple_animal/slime/S = new(get_turf(holder.my_atom), "grey") - S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") - ..() - -/datum/chemical_reaction/slime/slimeinaprov - results = list(/datum/reagent/medicine/epinephrine = 3) - required_reagents = list(/datum/reagent/water = 5) - required_other = TRUE - required_container = /obj/item/slime_extract/grey - -/datum/chemical_reaction/slime/slimemonkey - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/grey - required_other = TRUE - -/datum/chemical_reaction/slime/slimemonkey/on_reaction(datum/reagents/holder) - for(var/i in 1 to 3) - new /obj/item/reagent_containers/food/snacks/monkeycube(get_turf(holder.my_atom)) - ..() - -//Green -/datum/chemical_reaction/slime/slimemutate - results = list(/datum/reagent/consumable/berryjuice = 1) // Removal of mutation toxins. This used to be jellyperson toxin, but is now just jelly. - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/green - -/datum/chemical_reaction/slime/unstabletoxin - results = list(/datum/reagent/toxin/mutagen = 1) // Removal of mutation toxins. This used to be unstable toxin, but is now unstable mutagen. - required_reagents = list(/datum/reagent/uranium/radium = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/green - - -//Metal -/datum/chemical_reaction/slime/slimemetal - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/metal - required_other = TRUE - -/datum/chemical_reaction/slime/slimemetal/on_reaction(datum/reagents/holder) - var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/plasteel(location, 5) - new /obj/item/stack/sheet/metal(location, 15) - ..() - -/datum/chemical_reaction/slime/slimeglass - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/metal - required_other = TRUE - -/datum/chemical_reaction/slime/slimeglass/on_reaction(datum/reagents/holder) - var/turf/location = get_turf(holder.my_atom) - new /obj/item/stack/sheet/rglass(location, 5) - new /obj/item/stack/sheet/glass(location, 15) - ..() - -//Gold -/datum/chemical_reaction/slime/slimemobspawn - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/gold - required_other = TRUE - deletes_extract = FALSE //we do delete, but we don't do so instantly - -/datum/chemical_reaction/slime/slimemobspawn/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - summon_mobs(holder, T) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimemobspawn/proc/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate violently!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 5, "Gold Slime", HOSTILE_SPAWN), 50) - -/datum/chemical_reaction/slime/slimemobspawn/lesser - required_reagents = list(/datum/reagent/blood = 1) - -/datum/chemical_reaction/slime/slimemobspawn/lesser/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate violently!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Lesser Gold Slime", HOSTILE_SPAWN, "neutral"), 50) - -/datum/chemical_reaction/slime/slimemobspawn/friendly - required_reagents = list(/datum/reagent/water = 1) - -/datum/chemical_reaction/slime/slimemobspawn/friendly/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate adorably!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 1, "Friendly Gold Slime", FRIENDLY_SPAWN, "neutral"), 50) - -/datum/chemical_reaction/slime/slimemobspawn/spider - required_reagents = list(/datum/reagent/spider_extract = 1) - -/datum/chemical_reaction/slime/slimemobspawn/spider/summon_mobs(datum/reagents/holder, turf/T) - T.visible_message("The slime extract begins to vibrate crikey-ingly!") - addtimer(CALLBACK(src, PROC_REF(chemical_mob_spawn), holder, 3, "Traitor Spider Slime", /mob/living/simple_animal/hostile/poison/giant_spider/nurse/midwife, "neutral", FALSE), 50) - - -//Silver -/datum/chemical_reaction/slime/slimebork - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/silver - required_other = TRUE - -/datum/chemical_reaction/slime/slimebork/on_reaction(datum/reagents/holder) - //BORK BORK BORK - var/turf/T = get_turf(holder.my_atom) - - playsound(T, 'sound/effects/phasein.ogg', 100, TRUE) - - for(var/mob/living/carbon/C in viewers(T, null)) - C.flash_act() - - for(var/i in 1 to 4 + rand(1,2)) - var/chosen = getbork() - var/obj/B = new chosen(T) - if(prob(5))//Fry it! - var/obj/item/food/deepfryholder/fried - fried = new(T, B) - fried.fry() // actually set the name and colour it - B = fried - if(prob(50)) - for(var/j in 1 to rand(1, 3)) - step(B, pick(NORTH,SOUTH,EAST,WEST)) - ..() - -/datum/chemical_reaction/slime/slimebork/proc/getbork() - return get_random_food() - -/datum/chemical_reaction/slime/slimebork/drinks - required_reagents = list(/datum/reagent/water = 1) - -/datum/chemical_reaction/slime/slimebork/drinks/getbork() - return get_random_drink() - -//Blue -/datum/chemical_reaction/slime/slimefrost - results = list(/datum/reagent/consumable/frostoil = 10) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimestabilizer - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimestabilizer/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/stabilizer(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimefoam - required_reagents = list(/datum/reagent/water = 5) - required_container = /obj/item/slime_extract/blue - required_other = TRUE - -/datum/chemical_reaction/slime/slimefoam/on_reaction(datum/reagents/holder) - holder.create_foam(/datum/effect_system/foam_spread,80, "[src] spews out foam!") - -//Dark Blue -/datum/chemical_reaction/slime/slimefreeze - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/darkblue - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimefreeze/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract starts to feel extremely cold!") - addtimer(CALLBACK(src, PROC_REF(freeze), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimefreeze/proc/freeze(datum/reagents/holder) - if(holder && holder.my_atom) - var/turf/open/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air("n2=50;TEMP=2.7") - -/datum/chemical_reaction/slime/slimefireproof - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/darkblue - required_other = TRUE - -/datum/chemical_reaction/slime/slimefireproof/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/fireproof(get_turf(holder.my_atom)) - ..() - -//Orange -/datum/chemical_reaction/slime/slimecasp - results = list(/datum/reagent/consumable/capsaicin = 10) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - -/datum/chemical_reaction/slime/slimefire - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimefire/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime extract begins to vibrate adorably!") - addtimer(CALLBACK(src, PROC_REF(slime_burn), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimefire/proc/slime_burn(datum/reagents/holder) - if(holder && holder.my_atom) - var/turf/open/T = get_turf(holder.my_atom) - if(istype(T)) - T.atmos_spawn_air("plasma=50;TEMP=1000") - - -/datum/chemical_reaction/slime/slimesmoke - results = list(/datum/reagent/phosphorus = 10, /datum/reagent/potassium = 10, /datum/reagent/consumable/sugar = 10) - required_reagents = list(/datum/reagent/water = 5) - required_container = /obj/item/slime_extract/orange - required_other = TRUE - -//Yellow -/datum/chemical_reaction/slime/slimeoverload - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimeoverload/on_reaction(datum/reagents/holder, created_volume) - empulse(get_turf(holder.my_atom), 3, 7) - ..() - -/datum/chemical_reaction/slime/slimecell - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimecell/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/stock_parts/cell/high/slime(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimeglow - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/yellow - required_other = TRUE - -/datum/chemical_reaction/slime/slimeglow/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - T.visible_message("The slime begins to emit a soft light. Squeezing it will cause it to grow brightly.") - new /obj/item/flashlight/slime(T) - ..() - -//Purple -/datum/chemical_reaction/slime/slimepsteroid - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/purple - required_other = TRUE - -/datum/chemical_reaction/slime/slimepsteroid/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/steroid(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimeregen - results = list(/datum/reagent/medicine/regen_jelly = 5) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/purple - required_other = TRUE - -//Dark Purple -/datum/chemical_reaction/slime/slimeplasma - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/darkpurple - required_other = TRUE - -/datum/chemical_reaction/slime/slimeplasma/on_reaction(datum/reagents/holder) - new /obj/item/stack/sheet/mineral/plasma(get_turf(holder.my_atom), 3) - ..() - -//Red -/datum/chemical_reaction/slime/slimemutator - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimemutator/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/mutator(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimebloodlust - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimebloodlust/on_reaction(datum/reagents/holder) - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(holder.my_atom), null)) - if(slime.docile) //Undoes docility, but doesn't make rabid. - slime.visible_message("[slime] forgets its training, becoming wild once again!") - slime.docile = FALSE - slime.update_name() - continue - slime.rabid = 1 - slime.visible_message("The [slime] is driven into a frenzy!") - ..() - -/datum/chemical_reaction/slime/slimespeed - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/red - required_other = TRUE - -/datum/chemical_reaction/slime/slimespeed/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/speed(get_turf(holder.my_atom)) - ..() - -//Pink -/datum/chemical_reaction/slime/docility - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/pink - required_other = TRUE - -/datum/chemical_reaction/slime/docility/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/docility(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/gender - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/pink - required_other = TRUE - -/datum/chemical_reaction/slime/gender/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/genderchange(get_turf(holder.my_atom)) - ..() - -//Black -/datum/chemical_reaction/slime/slimemutate2 - results = list(/datum/reagent/aslimetoxin = 1) - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/black - -//Oil -/datum/chemical_reaction/slime/slimeexplosion - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/oil - required_other = TRUE - deletes_extract = FALSE - -/datum/chemical_reaction/slime/slimeexplosion/on_reaction(datum/reagents/holder) - var/turf/T = get_turf(holder.my_atom) - var/lastkey = holder.my_atom.fingerprintslast - var/touch_msg = "N/A" - if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." - message_admins("Slime Explosion reaction started at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") - log_game("Slime Explosion reaction started at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") - T.visible_message("The slime extract begins to vibrate violently !") - addtimer(CALLBACK(src, PROC_REF(boom), holder), 50) - var/obj/item/slime_extract/M = holder.my_atom - deltimer(M.qdel_timer) - ..() - M.qdel_timer = addtimer(CALLBACK(src, PROC_REF(delete_extract), holder), 55, TIMER_STOPPABLE) - -/datum/chemical_reaction/slime/slimeexplosion/proc/boom(datum/reagents/holder) - if(holder && holder.my_atom) - explosion(get_turf(holder.my_atom), 1 ,3, 6) - - -/datum/chemical_reaction/slime/slimecornoil - results = list(/datum/reagent/consumable/cornoil = 10) - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/oil - required_other = TRUE - -//Light Pink -/datum/chemical_reaction/slime/slimepotion2 - required_container = /obj/item/slime_extract/lightpink - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - -/datum/chemical_reaction/slime/slimepotion2/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/sentience(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/renaming - required_container = /obj/item/slime_extract/lightpink - required_reagents = list(/datum/reagent/water = 1) - required_other = TRUE - -/datum/chemical_reaction/slime/renaming/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/slime/renaming(holder.my_atom.drop_location()) - ..() - - -//Adamantine -/datum/chemical_reaction/slime/adamantine - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/adamantine - required_other = TRUE - -/datum/chemical_reaction/slime/adamantine/on_reaction(datum/reagents/holder) - new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(holder.my_atom)) - ..() - -//Bluespace -/datum/chemical_reaction/slime/slimefloor2 - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimefloor2/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/stack/tile/bluespace(get_turf(holder.my_atom), 25) - ..() - - -/datum/chemical_reaction/slime/slimecrystal - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimecrystal/on_reaction(datum/reagents/holder, created_volume) - var/obj/item/stack/ore/bluespace_crystal/BC = new (get_turf(holder.my_atom)) - BC.visible_message("The [BC.name] appears out of thin air!") - ..() - -/datum/chemical_reaction/slime/slimeradio - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/bluespace - required_other = TRUE - -/datum/chemical_reaction/slime/slimeradio/on_reaction(datum/reagents/holder, created_volume) - new /obj/item/slimepotion/slime/slimeradio(get_turf(holder.my_atom)) - ..() - -//Cerulean -/datum/chemical_reaction/slime/slimepsteroid2 - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/cerulean - required_other = TRUE - -/datum/chemical_reaction/slime/slimepsteroid2/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/enhancer(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slime_territory - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/cerulean - required_other = TRUE - -/datum/chemical_reaction/slime/slime_territory/on_reaction(datum/reagents/holder) - new /obj/item/areaeditor/blueprints/slime(get_turf(holder.my_atom)) - ..() - -//Sepia -/datum/chemical_reaction/slime/slimestop - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) - addtimer(CALLBACK(src, PROC_REF(slime_stop), holder), 5 SECONDS) - -/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder) - var/obj/item/slime_extract/sepia/extract = holder.my_atom - var/turf/T = get_turf(holder.my_atom) - new /obj/effect/timestop(T, null, null, null) - if(istype(extract)) - if(extract.Uses > 0) - var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) - if(lastheld && !lastheld.equip_to_slot_if_possible(extract, ITEM_SLOT_HANDS, disable_warning = TRUE)) - extract.forceMove(get_turf(lastheld)) - use_slime_core(holder) - -/datum/chemical_reaction/slime/slimecamera - required_reagents = list(/datum/reagent/water = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimecamera/on_reaction(datum/reagents/holder) - new /obj/item/camera(get_turf(holder.my_atom)) - new /obj/item/camera_film(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimefloor - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/sepia - required_other = TRUE - -/datum/chemical_reaction/slime/slimefloor/on_reaction(datum/reagents/holder) - new /obj/item/stack/tile/sepia(get_turf(holder.my_atom), 25) - ..() - -//Pyrite -/datum/chemical_reaction/slime/slimepaint - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_container = /obj/item/slime_extract/pyrite - required_other = TRUE - -/datum/chemical_reaction/slime/slimepaint/on_reaction(datum/reagents/holder) - var/chosen = pick(subtypesof(/obj/item/paint)) - new chosen(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/slimecrayon - required_reagents = list(/datum/reagent/blood = 1) - required_container = /obj/item/slime_extract/pyrite - required_other = TRUE - -/datum/chemical_reaction/slime/slimecrayon/on_reaction(datum/reagents/holder) - var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) - new chosen(get_turf(holder.my_atom)) - ..() - -//Rainbow :o) -/datum/chemical_reaction/slime/slimeRNG - required_reagents = list(/datum/reagent/toxin/plasma = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slimeRNG/on_reaction(datum/reagents/holder, created_volume) - if(created_volume >= 5) - var/obj/item/grenade/clusterbuster/slime/S = new (get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to expand uncontrollably!") - S.icon_state = "[S.base_state]_active" - S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60)) - else - var/mob/living/simple_animal/slime/random/S = new (get_turf(holder.my_atom)) - S.visible_message("Infused with plasma, the core begins to quiver and grow, and a new baby slime emerges from it!") - ..() - -/datum/chemical_reaction/slime/slimebomb - required_reagents = list(/datum/reagent/toxin/slimejelly = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slimebomb/on_reaction(datum/reagents/holder, created_volume) - var/turf/T = get_turf(holder.my_atom) - var/obj/item/grenade/clusterbuster/slime/volatile/S = new (T) - S.visible_message("Infused with slime jelly, the core begins to expand uncontrollably!") - S.icon_state = "[S.base_state]_active" - S.active = TRUE - addtimer(CALLBACK(S, TYPE_PROC_REF(/obj/item/grenade, prime)), rand(15,60)) - var/lastkey = holder.my_atom.fingerprintslast - var/touch_msg = "N/A" - if(lastkey) - var/mob/toucher = get_mob_by_key(lastkey) - touch_msg = "[ADMIN_LOOKUPFLW(toucher)]." - message_admins("Brorble Brorble primed at [ADMIN_VERBOSEJMP(T)]. Last Fingerprint: [touch_msg]") - log_game("Brorble Brorble primed at [AREACOORD(T)]. Last Fingerprint: [lastkey ? lastkey : "N/A"].") - ..() - -/datum/chemical_reaction/slime/slime_transfer - required_reagents = list(/datum/reagent/blood = 1) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/slime_transfer/on_reaction(datum/reagents/holder) - new /obj/item/slimepotion/transference(get_turf(holder.my_atom)) - ..() - -/datum/chemical_reaction/slime/flight_potion - required_reagents = list(/datum/reagent/water/holywater = 5, /datum/reagent/uranium = 5) - required_other = TRUE - required_container = /obj/item/slime_extract/rainbow - -/datum/chemical_reaction/slime/flight_potion/on_reaction(datum/reagents/holder) - new /obj/item/reagent_containers/glass/bottle/potion/flight(get_turf(holder.my_atom)) - ..() diff --git a/code/modules/research/designs/comp_board_designs.dm b/code/modules/research/designs/comp_board_designs.dm index 2ba8ef1e2d7a..baa48134abbd 100644 --- a/code/modules/research/designs/comp_board_designs.dm +++ b/code/modules/research/designs/comp_board_designs.dm @@ -38,14 +38,6 @@ category = list("Computer Boards") departmental_flags = DEPARTMENTAL_FLAG_SCIENCE -/datum/design/board/xenobiocamera - name = "Computer Design (Xenobiology Console)" - desc = "Allows for the construction of circuit boards used to build xenobiology camera computers." - id = "xenobioconsole" - build_path = /obj/item/circuitboard/computer/xenobiology - category = list("Computer Boards") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE - /datum/design/board/aiupload name = "Computer Design (AI Upload)" desc = "Allows for the construction of circuit boards used to build an AI Upload Console." diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index bbc83dd1e705..737572ef2fc2 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -332,15 +332,6 @@ build_path = /obj/item/circuitboard/machine/smartfridge category = list ("Misc. Machinery") - -/datum/design/board/monkey_recycler - name = "Machine Design (Monkey Recycler Board)" - desc = "The circuit board for a monkey recycler." - id = "monkey_recycler" - build_path = /obj/item/circuitboard/machine/monkey_recycler - category = list ("Misc. Machinery") - departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_SERVICE - /datum/design/board/seed_extractor name = "Machine Design (Seed Extractor Board)" desc = "The circuit board for a seed extractor." diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index ce473ad739cb..64e5a0921b2b 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -82,7 +82,6 @@ /obj/item/grenade, /obj/item/aicard, /obj/item/storage/backpack/holding, - /obj/item/slime_extract, /obj/item/onetankbomb, /obj/item/transfer_valve)) diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index 8b6acd39ae34..c21e3b1e6fcc 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -123,29 +123,6 @@ Nothing else in the console has ID requirements. return ..() /obj/machinery/computer/rdconsole/attackby(obj/item/D, mob/user, params) - if(istype(D, /obj/item/slime_extract)) - var/obj/item/slime_extract/E = D - if(!slime_already_researched[E.type]) - if(!E.research) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - visible_message("[src] buzzes and displays a message: Invalid extract! (You shouldn't be seeing this. If you are, tell someone.)") - return - if(E.Uses <= 0) - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - visible_message("[src] buzzes and displays a message: Extract consumed - no research available.") - return - else - playsound(src, 'sound/machines/ping.ogg', 50, 3, -1) - visible_message("[user] inserts [E] into a slot on the [src]!", "You insert [E] into a slot on the [src], producting [E.research] points from the extract's chemical makeup!") - stored_research.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = E.research)) - slime_already_researched[E.type] = TRUE - qdel(D) - return - else - visible_message("[src] buzzes and displays a message: Slime extract already researched!") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 3, -1) - return - if(istype(D, /obj/item/seeds)) var/obj/item/seeds/E = D if(!plant_already_researched[E.type]) diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 12dee3405a8c..39770fce5c85 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -119,7 +119,7 @@ display_name = "Biological Processing" description = "From slimes to kitchens." prereq_ids = list("biotech") - design_ids = list("smartfridge", "gibber", "deepfryer", "monkey_recycler", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") + design_ids = list("smartfridge", "gibber", "deepfryer", "processor", "gibber", "microwave", "reagentgrinder", "dish_drive") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -230,7 +230,7 @@ display_name = "Basic Bluespace Theory" description = "Basic studies into the mysterious alternate dimension known as bluespace." prereq_ids = list("base") - design_ids = list("beacon", "xenobioconsole", "telesci_gps", "bluespace_crystal") + design_ids = list("beacon", "telesci_gps", "bluespace_crystal") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 diff --git a/code/modules/research/xenobiology/crossbreeding/__corecross.dm b/code/modules/research/xenobiology/crossbreeding/__corecross.dm deleted file mode 100644 index e2cfe4b40871..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/__corecross.dm +++ /dev/null @@ -1,193 +0,0 @@ -////////////////////////////////////////////// -////////// SLIME CROSSBREEDS ////////// -////////////////////////////////////////////// -// A system of combining two extract types. // -// Performed by feeding a slime 10 of an // -// extract color. // -////////////////////////////////////////////// -/*==========================================*\ -To add a crossbreed: - The file name is automatically selected - by the crossbreeding effect, which uses - the format slimecross/[modifier]/[color]. - - If a crossbreed doesn't exist, don't - worry. If no file is found at that - location, it will simple display that - the crossbreed was too unstable. - - As a result, do not feel the need to - try to add all of the crossbred - effects at once, if you're here and - trying to make a new slime type. Just - get your slimetype in the codebase and - get around to the crossbreeds eventually! -\*==========================================*/ - -/obj/item/slimecross //The base type for crossbred extracts. Mostly here for posterity, and to set base case things. - name = "crossbred slime extract" - desc = "An extremely potent slime extract, formed through crossbreeding." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "base" - var/colour = "null" - var/effect = "null" - var/effect_desc = "null" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - -/obj/item/slimecross/examine(mob/user) - . = ..() - if(effect_desc) - . += "[effect_desc]" - -/obj/item/slimecross/Initialize() - . = ..() - name = effect + " " + colour + " extract" - var/itemcolor = "#FFFFFF" - switch(colour) - if("orange") - itemcolor = "#FFA500" - if("purple") - itemcolor = "#B19CD9" - if("blue") - itemcolor = "#ADD8E6" - if("metal") - itemcolor = "#7E7E7E" - if("yellow") - itemcolor = "#FFFF00" - if("dark purple") - itemcolor = "#551A8B" - if("dark blue") - itemcolor = "#0000FF" - if("silver") - itemcolor = "#D3D3D3" - if("bluespace") - itemcolor = "#32CD32" - if("sepia") - itemcolor = "#704214" - if("cerulean") - itemcolor = "#2956B2" - if("pyrite") - itemcolor = "#FAFAD2" - if("red") - itemcolor = "#FF0000" - if("green") - itemcolor = "#00FF00" - if("pink") - itemcolor = "#FF69B4" - if("gold") - itemcolor = "#FFD700" - if("oil") - itemcolor = "#505050" - if("black") - itemcolor = "#000000" - if("light pink") - itemcolor = "#FFB6C1" - if("adamantine") - itemcolor = "#008B8B" - add_atom_colour(itemcolor, FIXED_COLOUR_PRIORITY) - -/obj/item/slimecrossbeaker //To be used as a result for extract reactions that make chemicals. - name = "result extract" - desc = "You shouldn't see this." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "base" - var/del_on_empty = TRUE - var/list/list_reagents - -/obj/item/slimecrossbeaker/Initialize() - . = ..() - create_reagents(50, INJECTABLE | DRAWABLE) - if(list_reagents) - for(var/reagent in list_reagents) - reagents.add_reagent(reagent, list_reagents[reagent]) - if(del_on_empty) - START_PROCESSING(SSobj,src) - -/obj/item/slimecrossbeaker/Destroy() - STOP_PROCESSING(SSobj,src) - return ..() - -/obj/item/slimecrossbeaker/process() - if(!reagents.total_volume) - visible_message("[src] has been drained completely, and melts away.") - qdel(src) - -/obj/item/slimecrossbeaker/bloodpack //Pack of 50u blood. Deletes on empty. - name = "blood extract" - desc = "A sphere of liquid blood, somehow managing to stay together." - color = "#FF0000" - list_reagents = list(/datum/reagent/blood = 50) - -/obj/item/slimecrossbeaker/pax //5u synthpax. - name = "peace-inducing extract" - desc = "A small blob of synthetic pax." - color = "#FFCCCC" - list_reagents = list(/datum/reagent/pax/peaceborg = 5) - -/obj/item/slimecrossbeaker/omnizine //15u omnizine. - name = "healing extract" - desc = "A gelatinous extract of pure omnizine." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/omnizine = 15) - -/obj/item/slimecrossbeaker/autoinjector //As with the above, but automatically injects whomever it is used on with contents. - var/ignore_flags = FALSE - var/self_use_only = FALSE - -/obj/item/slimecrossbeaker/autoinjector/Initialize() - . = ..() - reagents.flags = DRAWABLE // Cannot be refilled, since it's basically an autoinjector! - -/obj/item/slimecrossbeaker/autoinjector/attack(mob/living/M, mob/user) - if(!reagents.total_volume) - to_chat(user, "[src] is empty!") - return - if(!iscarbon(M)) - return - if(self_use_only && M != user) - to_chat(user, "This can only be used on yourself.") - return - if(reagents.total_volume && (ignore_flags || M.can_inject(user, 1))) - reagents.trans_to(M, reagents.total_volume, transfered_by = user) - if(user != M) - to_chat(M, "[user] presses [src] against you!") - to_chat(user, "You press [src] against [M], injecting [M.p_them()].") - else - to_chat(user, "You press [src] against yourself, and it flattens against you!") - else - to_chat(user, "There's no place to stick [src]!") - -/obj/item/slimecrossbeaker/autoinjector/regenpack - ignore_flags = TRUE //It is, after all, intended to heal. - name = "mending solution" - desc = "A strange glob of sweet-smelling semifluid, which seems to stick to skin rather easily." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/regen_jelly = 20) - -/obj/item/slimecrossbeaker/autoinjector/slimejelly //Primarily for slimepeople, but you do you. - self_use_only = TRUE - ignore_flags = TRUE - name = "slime jelly bubble" - desc = "A sphere of slime jelly. It seems to stick to your skin, but avoids other surfaces." - color = "#00FF00" - list_reagents = list(/datum/reagent/toxin/slimejelly = 50) - -/obj/item/slimecrossbeaker/autoinjector/peaceandlove - name = "peaceful distillation" - desc = "A light pink gooey sphere. Simply touching it makes you a little dizzy." - color = "#DDAAAA" - list_reagents = list(/datum/reagent/pax/peaceborg = 10, /datum/reagent/drug/space_drugs = 15) //Peace, dudes - -/obj/item/slimecrossbeaker/autoinjector/peaceandlove/Initialize() - . = ..() - reagents.flags = NONE // It won't be *that* easy to get your hands on pax. - -/obj/item/slimecrossbeaker/autoinjector/slimestimulant - name = "invigorating gel" - desc = "A bubbling purple mixture, designed to heal and boost movement." - color = "#FF00FF" - list_reagents = list(/datum/reagent/medicine/regen_jelly = 30, /datum/reagent/drug/methamphetamine = 9) diff --git a/code/modules/research/xenobiology/crossbreeding/_clothing.dm b/code/modules/research/xenobiology/crossbreeding/_clothing.dm deleted file mode 100644 index 3d466983f430..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_clothing.dm +++ /dev/null @@ -1,78 +0,0 @@ -/* -Slimecrossing Armor - Armor added by the slimecrossing system. - Collected here for clarity. -*/ - -//Rebreather mask - Chilling Blue -/obj/item/clothing/mask/nobreath - name = "rebreather mask" - desc = "A transparent mask, resembling a conventional breath mask, but made of bluish slime. Seems to lack any air supply tube, though." - icon_state = "slime" - item_state = "slime" - body_parts_covered = NONE - w_class = WEIGHT_CLASS_SMALL - gas_transfer_coefficient = 0 - permeability_coefficient = 0.5 - flags_cover = MASKCOVERSMOUTH - resistance_flags = NONE - -/obj/item/clothing/mask/nobreath/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot == ITEM_SLOT_MASK) - ADD_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") - user.failed_last_breath = FALSE - user.clear_alert("not_enough_oxy") - user.apply_status_effect(/datum/status_effect/rebreathing) - -/obj/item/clothing/mask/nobreath/dropped(mob/living/carbon/human/user) - ..() - REMOVE_TRAIT(user, TRAIT_NOBREATH, "breathmask_[REF(src)]") - user.remove_status_effect(/datum/status_effect/rebreathing) - -/obj/item/clothing/head/peaceflower - name = "heroine bud" - desc = "An extremely addictive flower, full of peace magic." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "peaceflower" - item_state = "peaceflower" - slot_flags = ITEM_SLOT_HEAD - body_parts_covered = NONE - force = 0 - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - throw_speed = 1 - throw_range = 3 - -/obj/item/clothing/head/peaceflower/equipped(mob/living/carbon/human/user, slot) - . = ..() - if(slot == ITEM_SLOT_HEAD) - ADD_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") - -/obj/item/clothing/head/peaceflower/dropped(mob/living/carbon/human/user) - ..() - REMOVE_TRAIT(user, TRAIT_PACIFISM, "peaceflower_[REF(src)]") - -/obj/item/clothing/head/peaceflower/attack_hand(mob/user) - if(iscarbon(user)) - var/mob/living/carbon/C = user - if(src == C.head) - to_chat(user, "You feel at peace. Why would you want anything else?") - return - return ..() - -/obj/item/clothing/suit/armor/heavy/adamantine - name = "adamantine armor" - desc = "A full suit of adamantine plate armor. Impressively resistant to damage, but weighs about as much as you do." - icon_state = "adamsuit" - item_state = "adamsuit" - flags_inv = NONE - obj_flags = IMMUTABLE_SLOW - slowdown = 4 - var/hit_reflect_chance = 40 - -/obj/item/clothing/suit/armor/heavy/adamantine/IsReflect(def_zone) - if(def_zone in list(BODY_ZONE_CHEST, BODY_ZONE_R_ARM, BODY_ZONE_L_ARM, BODY_ZONE_R_LEG, BODY_ZONE_L_LEG) && prob(hit_reflect_chance)) - return TRUE - else - return FALSE diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm deleted file mode 100644 index 2af2ecf64689..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ /dev/null @@ -1,234 +0,0 @@ -/* -Slimecrossing Items - General items added by the slimecrossing system. - Collected here for clarity. -*/ - -//Rewind camera - I'm already Burning Sepia -/obj/item/camera/rewind - name = "sepia-tinted camera" - desc = "They say a picture is like a moment stopped in time." - pictures_left = 1 - pictures_max = 1 - can_customise = FALSE - default_picture_name = "A nostalgic picture" - var/used = FALSE - -/datum/saved_bodypart - var/obj/item/bodypart/old_part - var/bodypart_type - var/brute_dam - var/burn_dam - var/stamina_dam - -/datum/saved_bodypart/New(obj/item/bodypart/part) - old_part = part - bodypart_type = part.type - brute_dam = part.brute_dam - burn_dam = part.burn_dam - stamina_dam = part.stamina_dam - -/mob/living/carbon/proc/apply_saved_bodyparts(list/datum/saved_bodypart/parts) - var/list/dont_chop = list() - for(var/zone in parts) - var/datum/saved_bodypart/saved_part = parts[zone] - var/obj/item/bodypart/already = get_bodypart(zone) - if(QDELETED(saved_part.old_part)) - saved_part.old_part = new saved_part.bodypart_type - if(!already || already != saved_part.old_part) - saved_part.old_part.replace_limb(src, TRUE) - saved_part.old_part.heal_damage(INFINITY, INFINITY, INFINITY, null, FALSE) - saved_part.old_part.receive_damage(saved_part.brute_dam, saved_part.burn_dam, saved_part.stamina_dam) - dont_chop[zone] = TRUE - for(var/obj/item/bodypart/BP as anything in bodyparts) - if(dont_chop[BP.body_zone]) - continue - BP.drop_limb(TRUE) - -/mob/living/carbon/proc/save_bodyparts() - var/list/datum/saved_bodypart/ret = list() - for(var/_part in bodyparts) - var/obj/item/bodypart/part = _part - var/datum/saved_bodypart/saved_part = new(part) - - ret[part.body_zone] = saved_part - return ret - -/obj/item/camera/rewind/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || !isturf(target.loc)) - return - if(!used)//selfie time - if(user == target) - to_chat(user, "You take a selfie!") - else - to_chat(user, "You take a photo with [target]!") - to_chat(target, "[user] takes a photo with you!") - to_chat(target, "You'll remember this moment forever!") - - used = TRUE - target.AddComponent(/datum/component/dejavu, 2) - .=..() - -/obj/item/camera/rewind/loot - pictures_left = 5 - pictures_max = 5 - -//Timefreeze camera - Old Burning Sepia result. Kept in case admins want to spawn it -/obj/item/camera/timefreeze - name = "sepia-tinted camera" - desc = "They say a picture is like a moment stopped in time." - pictures_left = 1 - pictures_max = 1 - var/used = FALSE - -/obj/item/camera/timefreeze/afterattack(atom/target, mob/user, flag) - if(!on || !pictures_left || !isturf(target.loc)) - return - if(!used) //refilling the film does not refill the timestop - new /obj/effect/timestop(get_turf(target), 2, 50, list(user)) - used = TRUE - desc = "This camera has seen better days." - . = ..() - - -//Hypercharged slime cell - Charged Yellow -/obj/item/stock_parts/cell/high/slime/hypercharged - name = "hypercharged slime core" - desc = "A charged yellow slime extract, infused with even more plasma. It almost hurts to touch." - rating = 7 //Roughly 1.5 times the original. - maxcharge = 20000 //2 times the normal one. - chargerate = 2250 //1.5 times the normal rate. - -//Barrier cube - Chilling Grey -/obj/item/barriercube - name = "barrier cube" - desc = "A compressed cube of slime. When squeezed, it grows to massive size!" - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "barriercube" - w_class = WEIGHT_CLASS_TINY - -/obj/item/barriercube/attack_self(mob/user) - if(locate(/obj/structure/barricade/slime) in get_turf(loc)) - to_chat(user, "You can't fit more than one barrier in the same space!") - return - to_chat(user, "You squeeze [src].") - var/obj/B = new /obj/structure/barricade/slime(get_turf(loc)) - B.visible_message("[src] suddenly grows into a large, gelatinous barrier!") - qdel(src) - -//Slime barricade - Chilling Grey -/obj/structure/barricade/slime - name = "gelatinous barrier" - desc = "A huge chunk of grey slime. Bullets might get stuck in it." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "slimebarrier" - proj_pass_rate = 40 - max_integrity = 60 - -//Melting Gel Wall - Chilling Metal -/obj/effect/forcefield/slimewall - name = "solidified gel" - desc = "A mass of solidified slime gel - completely impenetrable, but it's melting away!" - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "slimebarrier_thick" - CanAtmosPass = ATMOS_PASS_NO - opacity = TRUE - timeleft = 100 - -//Rainbow barrier - Chilling Rainbow -/obj/effect/forcefield/slimewall/rainbow - name = "rainbow barrier" - desc = "Despite others' urgings, you probably shouldn't taste this." - icon_state = "rainbowbarrier" - -//Ration pack - Chilling Silver -/obj/item/reagent_containers/food/snacks/rationpack - name = "ration pack" - desc = "A square bar that sadly looks like chocolate, packaged in a nondescript grey wrapper. Has saved soldiers' lives before - usually by stopping bullets." - icon_state = "rationpack" - bitesize = 3 - junkiness = 15 - filling_color = "#964B00" - tastes = list("cardboard" = 3, "sadness" = 3) - foodtype = null //Don't ask what went into them. You're better off not knowing. - list_reagents = list(/datum/reagent/consumable/nutriment/stabilized = 10, /datum/reagent/consumable/nutriment = 2) //Won't make you fat. Will make you question your sanity. - -/obj/item/reagent_containers/food/snacks/rationpack/checkLiked(fraction, mob/M) //Nobody likes rationpacks. Nobody. - if(last_check_time + 50 < world.time) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.mind && !HAS_TRAIT(H, TRAIT_AGEUSIA)) - to_chat(H,"That didn't taste very good...") //No disgust, though. It's just not good tasting. - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "gross_food", /datum/mood_event/gross_food) - last_check_time = world.time - return - ..() - -//Ice stasis block - Chilling Dark Blue -/obj/structure/ice_stasis - name = "ice block" - desc = "A massive block of ice. You can see something vaguely humanoid inside." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "frozen" - density = TRUE - max_integrity = 100 - armor = list("melee" = 30, "bullet" = 50, "laser" = -50, "energy" = -50, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = -80, "acid" = 30) - -/obj/structure/ice_stasis/Initialize() - . = ..() - playsound(src, 'sound/magic/ethereal_exit.ogg', 50, TRUE) - -/obj/structure/ice_stasis/Destroy() - for(var/atom/movable/M in contents) - M.forceMove(loc) - playsound(src, 'sound/effects/glassbr3.ogg', 50, TRUE) - return ..() - -//Gold capture device - Chilling Gold -/obj/item/capturedevice - name = "gold capture device" - desc = "Bluespace technology packed into a roughly egg-shaped device, used to store nonhuman creatures. Can't catch them all, though - it only fits one." - w_class = WEIGHT_CLASS_SMALL - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "capturedevice" - -/obj/item/capturedevice/attack(mob/living/M, mob/user) - if(length(contents)) - to_chat(user, "The device already has something inside.") - return - if(!isanimal(M)) - to_chat(user, "The capture device only works on simple creatures.") - return - if(M.mind) - to_chat(user, "You offer the device to [M].") - if(alert(M, "Would you like to enter [user]'s capture device?", "Gold Capture Device", "Yes", "No") == "Yes") - if(user.canUseTopic(src, BE_CLOSE) && user.canUseTopic(M, BE_CLOSE)) - to_chat(user, "You store [M] in the capture device.") - to_chat(M, "The world warps around you, and you're suddenly in an endless void, with a window to the outside floating in front of you.") - store(M, user) - else - to_chat(user, "You were too far away from [M].") - to_chat(M, "You were too far away from [user].") - else - to_chat(user, "[M] refused to enter the device.") - return - else - if(istype(M, /mob/living/simple_animal/hostile) && !("neutral" in M.faction)) - to_chat(user, "This creature is too aggressive to capture.") - return - to_chat(user, "You store [M] in the capture device.") - store(M) - -/obj/item/capturedevice/attack_self(mob/user) - if(contents.len) - to_chat(user, "You open the capture device!") - release() - else - to_chat(user, "The device is empty...") - -/obj/item/capturedevice/proc/store(mob/living/M) - M.forceMove(src) - -/obj/item/capturedevice/proc/release() - for(var/atom/movable/M in contents) - M.forceMove(get_turf(loc)) diff --git a/code/modules/research/xenobiology/crossbreeding/_mobs.dm b/code/modules/research/xenobiology/crossbreeding/_mobs.dm deleted file mode 100644 index 0d155f2f90f7..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_mobs.dm +++ /dev/null @@ -1,45 +0,0 @@ -/* -Slimecrossing Mobs - Mobs and effects added by the slimecrossing system. - Collected here for clarity. -*/ - -//Slime transformation power - Burning Black -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform - name = "Slime Transformation" - desc = "Transform from a human to a slime, or back again!" - action_icon_state = "transformslime" - cooldown_min = 0 - charge_max = 0 - invocation_type = "none" - shapeshift_type = /mob/living/simple_animal/slime/transformedslime - convert_damage = TRUE - convert_damage_type = CLONE - var/remove_on_restore = FALSE - -/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/Restore(mob/living/M) - if(remove_on_restore) - if(M.mind) - M.mind.RemoveSpell(src) - ..() - -//Transformed slime - Burning Black -/mob/living/simple_animal/slime/transformedslime - -/mob/living/simple_animal/slime/transformedslime/Reproduce() //Just in case. - to_chat(src, "I can't reproduce...") - return - -//Slime corgi - Chilling Pink -/mob/living/simple_animal/pet/dog/corgi/puppy/slime - name = "\improper slime corgi puppy" - real_name = "slime corgi puppy" - desc = "An unbearably cute pink slime corgi puppy." - icon_state = "slime_puppy" - icon_living = "slime_puppy" - icon_dead = "slime_puppy_dead" - nofur = TRUE - gold_core_spawnable = NO_SPAWN - speak_emote = list("blorbles", "bubbles", "borks") - emote_hear = list("bubbles!", "splorts.", "splops!") - emote_see = list("gets goop everywhere.", "flops.", "jiggles!") diff --git a/code/modules/research/xenobiology/crossbreeding/_potions.dm b/code/modules/research/xenobiology/crossbreeding/_potions.dm deleted file mode 100644 index fc9d9ef06c6a..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_potions.dm +++ /dev/null @@ -1,217 +0,0 @@ -/* -Slimecrossing Potions - Potions added by the slimecrossing system. - Collected here for clarity. -*/ - -//Extract cloner - Charged Grey -/obj/item/slimepotion/extract_cloner - name = "extract cloning potion" - desc = "An more powerful version of the extract enhancer potion, capable of cloning regular slime extracts." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -/obj/item/slimepotion/extract_cloner/afterattack(obj/item/target, mob/user , proximity) - if(!proximity) - return - if(istype(target, /obj/item/reagent_containers)) - return ..(target, user, proximity) - if(istype(target, /obj/item/slimecross)) - to_chat(user, "[target] is too complex for the potion to clone!") - return - if(!istype(target, /obj/item/slime_extract)) - return - var/obj/item/slime_extract/S = target - if(S.recurring) - to_chat(user, "[target] is too complex for the potion to clone!") - return - var/path = S.type - var/obj/item/slime_extract/C = new path(get_turf(target)) - C.Uses = S.Uses - to_chat(user, "You pour the potion onto [target], and the fluid solidifies into a copy of it!") - qdel(src) - return - -//Peace potion - Charged Light Pink -/obj/item/slimepotion/peacepotion - name = "pacification potion" - desc = "A light pink solution of chemicals, smelling like liquid peace. And mercury salts." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potlightpink" - -/obj/item/slimepotion/peacepotion/attack(mob/living/M, mob/user) - if(!isliving(M) || M.stat == DEAD) - to_chat(user, "[src] only works on the living.") - return ..() - if(istype(M, /mob/living/simple_animal/hostile/megafauna)) - to_chat(user, "[src] does not work on beings of pure evil!") - return ..() - if(M != user) - M.visible_message("[user] starts to feed [M] [src]!", - "[user] starts to feed you [src]!") - else - M.visible_message("[user] starts to drink [src]!", - "You start to drink [src]!") - - if(!do_after(user, 100, target = M)) - return - if(M != user) - to_chat(user, "You feed [M] [src]!") - else - to_chat(user, "You drink [src]!") - if(isanimal(M)) - ADD_TRAIT(M, TRAIT_PACIFISM, MAGIC_TRAIT) - else if(iscarbon(M)) - var/mob/living/carbon/C = M - C.gain_trauma(/datum/brain_trauma/severe/pacifism, TRAUMA_RESILIENCE_SURGERY) - qdel(src) - -//Love potion - Charged Pink -/obj/item/slimepotion/lovepotion - name = "love potion" - desc = "A pink chemical mix thought to inspire feelings of love." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpink" - -/obj/item/slimepotion/lovepotion/attack(mob/living/M, mob/user) - if(!isliving(M) || M.stat == DEAD) - to_chat(user, "The love potion only works on living things, sicko!") - return ..() - if(istype(M, /mob/living/simple_animal/hostile/megafauna)) - to_chat(user, "The love potion does not work on beings of pure evil!") - return ..() - if(user == M) - to_chat(user, "You can't drink the love potion. What are you, a narcissist?") - return ..() - if(M.has_status_effect(STATUS_EFFECT_INLOVE)) - to_chat(user, "[M] is already lovestruck!") - return ..() - - M.visible_message("[user] starts to feed [M] a love potion!", - "[user] starts to feed you a love potion!") - - if(!do_after(user, 50, target = M)) - return - to_chat(user, "You feed [M] the love potion!") - to_chat(M, "You develop feelings for [user], and anyone [user.p_they()] like.") - if(M.mind) - M.mind.store_memory("You are in love with [user].") - M.faction |= "[REF(user)]" - M.apply_status_effect(STATUS_EFFECT_INLOVE, user) - qdel(src) - -//Pressure potion - Charged Dark Blue -/obj/item/slimepotion/spaceproof - name = "slime pressurization potion" - desc = "A potent chemical sealant that will render any article of clothing airtight. Has two uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potblue" - var/uses = 2 - -/obj/item/slimepotion/spaceproof/afterattack(obj/item/clothing/C, mob/user, proximity) - . = ..() - if(!uses) - qdel(src) - return - if(!proximity) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on clothing!") - return - if(C.min_cold_protection_temperature == SPACE_SUIT_MIN_TEMP_PROTECT && C.clothing_flags & STOPSPRESSUREDAMAGE) - to_chat(user, "The [C] is already pressure-resistant!") - return ..() - to_chat(user, "You slather the blue gunk over the [C], making it airtight.") - C.name = "pressure-resistant [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - C.cold_protection = C.body_parts_covered - C.clothing_flags |= STOPSPRESSUREDAMAGE - uses-- - if(!uses) - qdel(src) - -//Enhancer potion - Charged Cerulean -/obj/item/slimepotion/enhancer/max - name = "extract maximizer" - desc = "An extremely potent chemical mix that will maximize a slime extract's uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -//Lavaproofing potion - Charged Red -/obj/item/slimepotion/lavaproof - name = "slime lavaproofing potion" - desc = "A strange, reddish goo said to repel lava as if it were water, without reducing flammability. Has two uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potred" - resistance_flags = LAVA_PROOF | FIRE_PROOF - var/uses = 2 - -/obj/item/slimepotion/lavaproof/afterattack(obj/item/C, mob/user, proximity) - . = ..() - if(!uses) - qdel(src) - return ..() - if(!proximity) - return ..() - if(!istype(C)) - to_chat(user, "You can't coat this with lavaproofing fluid!") - return ..() - to_chat(user, "You slather the red gunk over the [C], making it lavaproof.") - C.name = "lavaproof [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#800000", FIXED_COLOUR_PRIORITY) - C.resistance_flags |= LAVA_PROOF - if (istype(C, /obj/item/clothing)) - var/obj/item/clothing/CL = C - CL.clothing_flags |= LAVAPROTECT - uses-- - if(!uses) - qdel(src) - -//Revival potion - Charged Grey -/obj/item/slimepotion/slime_reviver - name = "slime revival potion" - desc = "Infused with plasma and compressed gel, this brings dead slimes back to life." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potsilver" - -/obj/item/slimepotion/slime_reviver/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The potion only works on slimes!") - return ..() - if(M.stat != DEAD) - to_chat(user, "The slime is still alive!") - return - if(M.maxHealth <= 0) - to_chat(user, "The slime is too unstable to return!") - M.revive(full_heal = TRUE, admin_revive = FALSE) - M.set_stat(CONSCIOUS) - M.visible_message("[M] is filled with renewed vigor and blinks awake!") - M.maxHealth -= 10 //Revival isn't healthy. - M.health -= 10 - M.regenerate_icons() - qdel(src) - -//Stabilizer potion - Charged Blue -/obj/item/slimepotion/slime/chargedstabilizer - name = "slime omnistabilizer" - desc = "An extremely potent chemical mix that will stop a slime from mutating completely." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potcyan" - -/obj/item/slimepotion/slime/chargedstabilizer/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The stabilizer only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutation_chance == 0) - to_chat(user, "The slime already has no chance of mutating!") - return - - to_chat(user, "You feed the slime the omnistabilizer. It will not mutate this cycle!") - M.mutation_chance = 0 - qdel(src) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm deleted file mode 100644 index 651eb2fece14..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ /dev/null @@ -1,971 +0,0 @@ -/atom/movable/screen/alert/status_effect/rainbow_protection - name = "Rainbow Protection" - desc = "You are defended from harm, but so are those you might seek to injure!" - icon_state = "slime_rainbowshield" - -/datum/status_effect/rainbow_protection - id = "rainbow_protection" - duration = 100 - alert_type = /atom/movable/screen/alert/status_effect/rainbow_protection - var/originalcolor - -/datum/status_effect/rainbow_protection/on_apply() - owner.status_flags |= GODMODE - ADD_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) - owner.visible_message("[owner] shines with a brilliant rainbow light.", - "You feel protected by an unknown force!") - originalcolor = owner.color - return ..() - -/datum/status_effect/rainbow_protection/tick() - owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) - return ..() - -/datum/status_effect/rainbow_protection/on_remove() - owner.status_flags &= ~GODMODE - owner.color = originalcolor - REMOVE_TRAIT(owner, TRAIT_PACIFISM, /datum/status_effect/rainbow_protection) - owner.visible_message("[owner] stops glowing, the rainbow light fading away.", - "You no longer feel protected...") - -/atom/movable/screen/alert/status_effect/slimeskin - name = "Adamantine Slimeskin" - desc = "You are covered in a thick, non-neutonian gel." - icon_state = "slime_stoneskin" - -/datum/status_effect/slimeskin - id = "slimeskin" - duration = 300 - alert_type = /atom/movable/screen/alert/status_effect/slimeskin - var/originalcolor - -/datum/status_effect/slimeskin/on_apply() - originalcolor = owner.color - owner.color = "#3070CC" - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 10 - owner.visible_message("[owner] is suddenly covered in a strange, blue-ish gel!", - "You are covered in a thick, rubbery gel.") - return ..() - -/datum/status_effect/slimeskin/on_remove() - owner.color = originalcolor - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 10 - owner.visible_message("[owner]'s gel coating liquefies and dissolves away.", - "Your gel second-skin dissolves!") - -/datum/status_effect/slimerecall - id = "slime_recall" - duration = -1 //Will be removed by the extract. - alert_type = null - var/interrupted = FALSE - var/mob/target - var/icon/bluespace - -/datum/status_effect/slimerecall/on_apply() - RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(resistField)) - to_chat(owner, "You feel a sudden tug from an unknown force, and feel a pull to bluespace!") - to_chat(owner, "Resist if you wish avoid the force!") - bluespace = icon('icons/effects/effects.dmi',"chronofield") - owner.add_overlay(bluespace) - return ..() - -/datum/status_effect/slimerecall/proc/resistField() - interrupted = TRUE - owner.remove_status_effect(src) -/datum/status_effect/slimerecall/on_remove() - UnregisterSignal(owner, COMSIG_LIVING_RESIST) - owner.cut_overlay(bluespace) - if(interrupted || !ismob(target)) - to_chat(owner, "The bluespace tug fades away, and you feel that the force has passed you by.") - return - owner.visible_message("[owner] disappears in a flurry of sparks!", - "The unknown force snatches briefly you from reality, and deposits you next to [target]!") - do_sparks(3, TRUE, owner) - owner.forceMove(target.loc) - -/atom/movable/screen/alert/status_effect/freon/stasis - desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." - -/datum/status_effect/frozenstasis - id = "slime_frozen" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 //Will remove self when block breaks. - alert_type = /atom/movable/screen/alert/status_effect/freon/stasis - var/obj/structure/ice_stasis/cube - -/datum/status_effect/frozenstasis/on_apply() - RegisterSignal(owner, COMSIG_LIVING_RESIST, PROC_REF(breakCube)) - cube = new /obj/structure/ice_stasis(get_turf(owner)) - owner.forceMove(cube) - owner.status_flags |= GODMODE - return ..() - -/datum/status_effect/frozenstasis/tick() - if(!cube || owner.loc != cube) - owner.remove_status_effect(src) - -/datum/status_effect/frozenstasis/proc/breakCube() - owner.remove_status_effect(src) - -/datum/status_effect/frozenstasis/on_remove() - if(cube) - qdel(cube) - owner.status_flags &= ~GODMODE - UnregisterSignal(owner, COMSIG_LIVING_RESIST) - -/datum/status_effect/slime_clone - id = "slime_cloned" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 - alert_type = null - var/mob/living/clone - var/datum/mind/originalmind //For when the clone gibs. - -/datum/status_effect/slime_clone/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - if(owner.mind) - originalmind = owner.mind - owner.mind.transfer_to(clone) - clone.apply_status_effect(/datum/status_effect/slime_clone_decay) - return ..() - -/datum/status_effect/slime_clone/tick() - if(!istype(clone) || clone.stat != CONSCIOUS) - owner.remove_status_effect(src) - -/datum/status_effect/slime_clone/on_remove() - if(clone && clone.mind && owner) - clone.mind.transfer_to(owner) - else - if(owner && originalmind) - originalmind.transfer_to(owner) - if(originalmind.key) - owner.ckey = originalmind.key - if(clone) - clone.unequip_everything() - qdel(clone) - -/atom/movable/screen/alert/status_effect/clone_decay - name = "Clone Decay" - desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall." - icon_state = "slime_clonedecay" - -/datum/status_effect/slime_clone_decay - id = "slime_clonedecay" - status_type = STATUS_EFFECT_UNIQUE - duration = -1 - alert_type = /atom/movable/screen/alert/status_effect/clone_decay - -/datum/status_effect/slime_clone_decay/tick() - owner.adjustToxLoss(1, 0) - owner.adjustOxyLoss(1, 0) - owner.adjustBruteLoss(1, 0) - owner.adjustFireLoss(1, 0) - owner.color = "#007BA7" - -/atom/movable/screen/alert/status_effect/bloodchill - name = "Bloodchilled" - desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" - -/datum/status_effect/bloodchill - id = "bloodchill" - duration = 100 - alert_type = /atom/movable/screen/alert/status_effect/bloodchill - -/datum/status_effect/bloodchill/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) - return ..() - -/datum/status_effect/bloodchill/tick() - if(prob(50)) - owner.adjustFireLoss(2) - -/datum/status_effect/bloodchill/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) - -/datum/status_effect/bonechill - id = "bonechill" - duration = 80 - alert_type = /atom/movable/screen/alert/status_effect/bonechill - -/datum/status_effect/bonechill/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) - return ..() - -/datum/status_effect/bonechill/tick() - if(prob(50)) - owner.adjustFireLoss(1) - owner.Jitter(3) - owner.adjust_bodytemperature(-10) - -/datum/status_effect/bonechill/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) -/atom/movable/screen/alert/status_effect/bonechill - name = "Bonechilled" - desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" - icon_state = "bloodchill" - -/datum/status_effect/rebreathing - id = "rebreathing" - duration = -1 - alert_type = null - -/datum/status_effect/rebreathing/tick() - owner.adjustOxyLoss(-6, 0) //Just a bit more than normal breathing. - -/////////////////////////////////////////////////////// -//////////////////CONSUMING EXTRACTS/////////////////// -/////////////////////////////////////////////////////// - -/datum/status_effect/firecookie - id = "firecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/firecookie/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") - owner.adjust_bodytemperature(110) - return ..() - -/datum/status_effect/firecookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTCOLD,"firecookie") - -/datum/status_effect/watercookie - id = "watercookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/watercookie/on_apply() - ADD_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie") - return ..() - -/datum/status_effect/watercookie/tick() - for(var/turf/open/T in range(get_turf(owner),1)) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) - -/datum/status_effect/watercookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER,"watercookie") - -/datum/status_effect/metalcookie - id = "metalcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/metalcookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod *= 0.9 - return ..() - -/datum/status_effect/metalcookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.brute_mod /= 0.9 - -/datum/status_effect/sparkcookie - id = "sparkcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - var/original_coeff - -/datum/status_effect/sparkcookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - original_coeff = H.physiology.siemens_coeff - H.physiology.siemens_coeff = 0 - return ..() - -/datum/status_effect/sparkcookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.siemens_coeff = original_coeff - -/datum/status_effect/toxincookie - id = "toxincookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 600 - -/datum/status_effect/toxincookie/on_apply() - ADD_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") - return ..() - -/datum/status_effect/toxincookie/on_remove() - REMOVE_TRAIT(owner, TRAIT_TOXINLOVER,"toxincookie") - -/datum/status_effect/timecookie - id = "timecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 600 - -/datum/status_effect/timecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed *= 0.95 - return ..() - -/datum/status_effect/timecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H - H.physiology.do_after_speed /= 0.95 - -/datum/status_effect/lovecookie - id = "lovecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - -/datum/status_effect/lovecookie/tick() - if(owner.stat != CONSCIOUS) - return - if(iscarbon(owner)) - var/mob/living/carbon/C = owner - if(C.handcuffed) - return - var/list/huggables = list() - for(var/mob/living/carbon/L in range(get_turf(owner),1)) - if(L != owner) - huggables += L - if(length(huggables)) - var/mob/living/carbon/hugged = pick(huggables) - owner.visible_message("[owner] hugs [hugged]!", "You hug [hugged]!") - -/datum/status_effect/tarcookie - id = "tarcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/tarcookie/tick() - for(var/mob/living/carbon/human/L in range(get_turf(owner),1)) - if(L != owner) - L.apply_status_effect(/datum/status_effect/tarfoot) - -/datum/status_effect/tarfoot - id = "tarfoot" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 30 - -/datum/status_effect/tarfoot/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) - return ..() - -/datum/status_effect/tarfoot/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/tarfoot) - -/datum/status_effect/spookcookie - id = "spookcookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 300 - -/datum/status_effect/spookcookie/on_apply() - var/image/I = image(icon = 'icons/mob/simple_human.dmi', icon_state = "skeleton", layer = ABOVE_MOB_LAYER, loc = owner) - I.override = 1 - owner.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "spookyscary", I) - return ..() - -/datum/status_effect/spookcookie/on_remove() - owner.remove_alt_appearance("spookyscary") - -/datum/status_effect/peacecookie - id = "peacecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/peacecookie/tick() - for(var/mob/living/L in range(get_turf(owner),1)) - L.apply_status_effect(/datum/status_effect/plur) - -/datum/status_effect/plur - id = "plur" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 30 - -/datum/status_effect/plur/on_apply() - ADD_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") - return ..() - -/datum/status_effect/plur/on_remove() - REMOVE_TRAIT(owner, TRAIT_PACIFISM, "peacecookie") - -/datum/status_effect/adamantinecookie - id = "adamantinecookie" - status_type = STATUS_EFFECT_REPLACE - alert_type = null - duration = 100 - -/datum/status_effect/adamantinecookie/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod *= 0.9 - return ..() - -/datum/status_effect/adamantinecookie/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.burn_mod /= 0.9 - -/////////////////////////////////////////////////////// -//////////////////STABILIZED EXTRACTS////////////////// -/////////////////////////////////////////////////////// - -/datum/status_effect/stabilized //The base stabilized extract effect, has no effect of its' own. - id = "stabilizedbase" - duration = -1 - alert_type = null - var/obj/item/slimecross/stabilized/linked_extract - var/colour = "null" - -/datum/status_effect/stabilized/tick() - if(!linked_extract || !linked_extract.loc) //Sanity checking - qdel(src) - return - if(linked_extract && linked_extract.loc != owner && linked_extract.loc.loc != owner) - linked_extract.linked_effect = null - if(!QDELETED(linked_extract)) - linked_extract.owner = null - START_PROCESSING(SSobj,linked_extract) - qdel(src) - return ..() - -/datum/status_effect/stabilized/null //This shouldn't ever happen, but just in case. - id = "stabilizednull" - - -//Stabilized effects start below. -/datum/status_effect/stabilized/grey - id = "stabilizedgrey" - colour = "grey" - -/datum/status_effect/stabilized/grey/tick() - for(var/mob/living/simple_animal/slime/S in range(1, get_turf(owner))) - if(!(owner in S.Friends)) - to_chat(owner, "[linked_extract] pulses gently as it communicates with [S].") - S.set_friendship(owner, 1) - return ..() - -/datum/status_effect/stabilized/orange - id = "stabilizedorange" - colour = "orange" - -/datum/status_effect/stabilized/orange/tick() - var/body_temperature_difference = owner.get_body_temp_normal(apply_change=FALSE) - owner.bodytemperature - owner.adjust_bodytemperature(min(5,body_temperature_difference)) - return ..() - -/datum/status_effect/stabilized/purple - id = "stabilizedpurple" - colour = "purple" - -/datum/status_effect/stabilized/purple/tick() - var/is_healing = FALSE - if(owner.getBruteLoss() > 0) - owner.adjustBruteLoss(-0.2) - is_healing = TRUE - if(owner.getFireLoss() > 0) - owner.adjustFireLoss(-0.2) - is_healing = TRUE - if(owner.getToxLoss() > 0) - owner.adjustToxLoss(-0.2, forced = TRUE) //Slimepeople should also get healed. - is_healing = TRUE - if(is_healing) - examine_text = "SUBJECTPRONOUN is regenerating slowly, purplish goo filling in small injuries!" - new /obj/effect/temp_visual/heal(get_turf(owner), "#FF0000") - else - examine_text = null - ..() - -/datum/status_effect/stabilized/blue - id = "stabilizedblue" - colour = "blue" - -/datum/status_effect/stabilized/blue/on_apply() - ADD_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") - return ..() - -/datum/status_effect/stabilized/blue/on_remove() - REMOVE_TRAIT(owner, TRAIT_NOSLIPWATER, "slimestatus") - -/datum/status_effect/stabilized/metal - id = "stabilizedmetal" - colour = "metal" - var/cooldown = 30 - var/max_cooldown = 30 - -/datum/status_effect/stabilized/metal/tick() - if(cooldown > 0) - cooldown-- - else - cooldown = max_cooldown - var/list/sheets = list() - for(var/obj/item/stack/sheet/S in owner.GetAllContents()) - if(S.amount < S.max_amount) - sheets += S - - if(sheets.len > 0) - var/obj/item/stack/sheet/S = pick(sheets) - S.amount++ - to_chat(owner, "[linked_extract] adds a layer of slime to [S], which metamorphosizes into another sheet of material!") - return ..() - - -/datum/status_effect/stabilized/yellow - id = "stabilizedyellow" - colour = "yellow" - var/cooldown = 10 - var/max_cooldown = 10 - examine_text = "Nearby electronics seem just a little more charged wherever SUBJECTPRONOUN goes." - -/datum/status_effect/stabilized/yellow/tick() - if(cooldown > 0) - cooldown-- - return ..() - cooldown = max_cooldown - var/list/batteries = list() - for(var/obj/item/stock_parts/cell/C in owner.GetAllContents()) - if(C.charge < C.maxcharge) - batteries += C - if(batteries.len) - var/obj/item/stock_parts/cell/ToCharge = pick(batteries) - ToCharge.charge += min(ToCharge.maxcharge - ToCharge.charge, ToCharge.maxcharge/10) //10% of the cell, or to maximum. - to_chat(owner, "[linked_extract] discharges some energy into a device you have.") - return ..() - -/obj/item/hothands - name = "burning fingertips" - desc = "You shouldn't see this." - -/obj/item/hothands/get_temperature() - return 290 //Below what's required to ignite plasma. - -/datum/status_effect/stabilized/darkpurple - id = "stabilizeddarkpurple" - colour = "dark purple" - var/obj/item/hothands/fire - examine_text = "Their fingertips burn brightly!" - -/datum/status_effect/stabilized/darkpurple/on_apply() - ADD_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") - fire = new(owner) - return ..() - -/datum/status_effect/stabilized/darkpurple/tick() - var/obj/item/I = owner.get_active_held_item() - var/obj/item/reagent_containers/food/snacks/F = I - if(istype(F)) - if(F.cooked_type) - to_chat(owner, "[linked_extract] flares up brightly, and your hands alone are enough cook [F]!") - var/obj/item/result = F.microwave_act() - if(istype(result)) - owner.put_in_hands(result) - else - I.attackby(fire, owner) - return ..() - -/datum/status_effect/stabilized/darkpurple/on_remove() - REMOVE_TRAIT(owner, TRAIT_RESISTHEATHANDS, "slimestatus") - qdel(fire) - -/datum/status_effect/stabilized/darkblue - id = "stabilizeddarkblue" - colour = "dark blue" - -/datum/status_effect/stabilized/darkblue/tick() - if(owner.fire_stacks > 0 && prob(80)) - owner.fire_stacks-- - if(owner.fire_stacks <= 0) - to_chat(owner, "[linked_extract] coats you in a watery goo, extinguishing the flames.") - var/obj/O = owner.get_active_held_item() - if(O) - O.extinguish() //All shamelessly copied from water's expose_obj, since I didn't seem to be able to get it here for some reason. - O.acid_level = 0 - // Monkey cube - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") - var/obj/item/reagent_containers/food/snacks/monkeycube/cube = O - cube.Expand() - - // Dehydrated carp - else if(istype(O, /obj/item/toy/plush/carpplushie/dehy_carp)) - to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") - var/obj/item/toy/plush/carpplushie/dehy_carp/dehy = O - dehy.Swell() // Makes a carp - - else if(istype(O, /obj/item/stack/sheet/hairlesshide)) - to_chat(owner, "[linked_extract] kept your hands wet! It wets [O]!") - var/obj/item/stack/sheet/hairlesshide/HH = O - new /obj/item/stack/sheet/wethide(get_turf(HH), HH.amount) - qdel(HH) - ..() - -/datum/status_effect/stabilized/silver - id = "stabilizedsilver" - colour = "silver" - -/datum/status_effect/stabilized/silver/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.hunger_mod *= 0.8 //20% buff - return ..() - -/datum/status_effect/stabilized/silver/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.hunger_mod /= 0.8 - -//Bluespace has an icon because it's kinda active. -/atom/movable/screen/alert/status_effect/bluespaceslime - name = "Stabilized Bluespace Extract" - desc = "You shouldn't see this, since we set it to change automatically!" - icon_state = "slime_bluespace_on" - -/datum/status_effect/bluespacestabilization - id = "stabilizedbluespacecooldown" - duration = 1200 - alert_type = null - -/datum/status_effect/stabilized/bluespace - id = "stabilizedbluespace" - colour = "bluespace" - alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime - var/healthcheck - -/datum/status_effect/stabilized/bluespace/tick() - if(owner.has_status_effect(/datum/status_effect/bluespacestabilization)) - linked_alert.desc = "The stabilized bluespace extract is still aligning you with the bluespace axis." - linked_alert.icon_state = "slime_bluespace_off" - return ..() - else - linked_alert.desc = "The stabilized bluespace extract will try to redirect you from harm!" - linked_alert.icon_state = "slime_bluespace_on" - - if(healthcheck && (healthcheck - owner.health) > 5) - owner.visible_message("[linked_extract] notices the sudden change in [owner]'s physical health, and activates!") - do_sparks(5,FALSE,owner) - var/F = find_safe_turf(zlevels = owner.z, extended_safety_checks = TRUE) - var/range = 0 - if(!F) - F = get_turf(owner) - range = 50 - if(do_teleport(owner, F, range, channel = TELEPORT_CHANNEL_BLUESPACE)) - to_chat(owner, "[linked_extract] will take some time to re-align you on the bluespace axis.") - do_sparks(5,FALSE,owner) - owner.apply_status_effect(/datum/status_effect/bluespacestabilization) - healthcheck = owner.health - return ..() - -/datum/status_effect/stabilized/sepia - id = "stabilizedsepia" - colour = "sepia" - var/mod = 0 - -/datum/status_effect/stabilized/sepia/tick() - if(prob(50) && mod > -1) - mod-- - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = -0.5) - else if(mod < 1) - mod++ - // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) - return ..() - -/datum/status_effect/stabilized/sepia/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia) - -/datum/status_effect/stabilized/cerulean - id = "stabilizedcerulean" - colour = "cerulean" - var/mob/living/clone - -/datum/status_effect/stabilized/cerulean/on_apply() - var/typepath = owner.type - clone = new typepath(owner.loc) - var/mob/living/carbon/O = owner - var/mob/living/carbon/C = clone - if(istype(C) && istype(O)) - C.real_name = O.real_name - O.dna.transfer_identity(C) - C.updateappearance(mutcolor_update=1) - return ..() - -/datum/status_effect/stabilized/cerulean/tick() - if(owner.stat == DEAD) - if(clone && clone.stat != DEAD) - owner.visible_message("[owner] blazes with brilliant light, [linked_extract] whisking [owner.p_their()] soul away.", - "You feel a warm glow from [linked_extract], and you open your eyes... elsewhere.") - if(owner.mind) - owner.mind.transfer_to(clone) - clone = null - qdel(linked_extract) - if(!clone || clone.stat == DEAD) - to_chat(owner, "[linked_extract] desperately tries to move your soul to a living body, but can't find one!") - qdel(linked_extract) - ..() - -/datum/status_effect/stabilized/cerulean/on_remove() - if(clone) - clone.visible_message("[clone] dissolves into a puddle of goo!") - clone.unequip_everything() - qdel(clone) - -/datum/status_effect/stabilized/pyrite - id = "stabilizedpyrite" - colour = "pyrite" - var/originalcolor - -/datum/status_effect/stabilized/pyrite/on_apply() - originalcolor = owner.color - return ..() - -/datum/status_effect/stabilized/pyrite/tick() - owner.color = rgb(rand(0,255),rand(0,255),rand(0,255)) - return ..() - -/datum/status_effect/stabilized/pyrite/on_remove() - owner.color = originalcolor - -/datum/status_effect/stabilized/red - id = "stabilizedred" - colour = "red" - -/datum/status_effect/stabilized/red/on_apply() - . = ..() - owner.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) - -/datum/status_effect/stabilized/red/on_remove() - owner.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/equipment_speedmod) - return ..() - -/datum/status_effect/stabilized/green - id = "stabilizedgreen" - colour = "green" - var/datum/dna/originalDNA - var/originalname - -/datum/status_effect/stabilized/green/on_apply() - to_chat(owner, "You feel different...") - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - originalDNA = new H.dna.type - originalname = H.real_name - H.dna.copy_dna(originalDNA) - randomize_human(H) - return ..() - -/datum/status_effect/stabilized/green/tick() //Only occasionally give examiners a warning. - if(prob(50)) - examine_text = "SUBJECTPRONOUN looks a bit green and gooey..." - else - examine_text = null - return ..() - -/datum/status_effect/stabilized/green/on_remove() - to_chat(owner, "You feel more like yourself.") - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - originalDNA.transfer_identity(H) - H.real_name = originalname - H.updateappearance(mutcolor_update=1) - -/datum/status_effect/brokenpeace - id = "brokenpeace" - duration = 1200 - alert_type = null - -/datum/status_effect/pinkdamagetracker - id = "pinkdamagetracker" - duration = -1 - alert_type = null - var/damage = 0 - var/lasthealth - -/datum/status_effect/pinkdamagetracker/tick() - if((lasthealth - owner.health) > 0) - damage += (lasthealth - owner.health) - lasthealth = owner.health - -/datum/status_effect/stabilized/pink - id = "stabilizedpink" - colour = "pink" - var/list/mobs = list() - var/faction_name - -/datum/status_effect/stabilized/pink/on_apply() - faction_name = owner.real_name - return ..() - -/datum/status_effect/stabilized/pink/tick() - for(var/mob/living/simple_animal/M in view(7,get_turf(owner))) - if(!(M in mobs)) - mobs += M - M.apply_status_effect(/datum/status_effect/pinkdamagetracker) - M.faction |= faction_name - for(var/mob/living/simple_animal/M in mobs) - if(!(M in view(7,get_turf(owner)))) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - mobs -= M - var/datum/status_effect/pinkdamagetracker/C = M.has_status_effect(/datum/status_effect/pinkdamagetracker) - if(istype(C) && C.damage > 0) - C.damage = 0 - owner.apply_status_effect(/datum/status_effect/brokenpeace) - var/HasFaction = FALSE - for(var/i in owner.faction) - if(i == faction_name) - HasFaction = TRUE - - if(HasFaction && owner.has_status_effect(/datum/status_effect/brokenpeace)) - owner.faction -= faction_name - to_chat(owner, "The peace has been broken! Hostile creatures will now react to you!") - if(!HasFaction && !owner.has_status_effect(/datum/status_effect/brokenpeace)) - to_chat(owner, "[linked_extract] pulses, generating a fragile aura of peace.") - owner.faction |= faction_name - return ..() - -/datum/status_effect/stabilized/pink/on_remove() - for(var/mob/living/simple_animal/M in mobs) - M.faction -= faction_name - M.remove_status_effect(/datum/status_effect/pinkdamagetracker) - for(var/i in owner.faction) - if(i == faction_name) - owner.faction -= faction_name - -/datum/status_effect/stabilized/oil - id = "stabilizedoil" - colour = "oil" - examine_text = "SUBJECTPRONOUN smells of sulfer and oil!" - -/datum/status_effect/stabilized/oil/tick() - if(owner.stat == DEAD) - explosion(get_turf(owner),1,2,4,flame_range = 5) - return ..() - -/datum/status_effect/stabilized/black - id = "stabilizedblack" - colour = "black" - var/messagedelivered = FALSE - var/heal_amount = 1 - -/datum/status_effect/stabilized/black/tick() - if(owner.pulling && isliving(owner.pulling) && owner.grab_state == GRAB_KILL) - var/mob/living/M = owner.pulling - if(M.stat == DEAD) - return - if(!messagedelivered) - to_chat(owner,"You feel your hands melt around [M]'s neck and start to drain [M.p_them()] of life.") - to_chat(owner.pulling, "[owner]'s hands melt around your neck, and you can feel your life starting to drain away!") - messagedelivered = TRUE - examine_text = "SUBJECTPRONOUN is draining health from [owner.pulling]!" - var/list/healing_types = list() - if(owner.getBruteLoss() > 0) - healing_types += BRUTE - if(owner.getFireLoss() > 0) - healing_types += BURN - if(owner.getToxLoss() > 0) - healing_types += TOX - if(owner.getCloneLoss() > 0) - healing_types += CLONE - - owner.apply_damage_type(-heal_amount, damagetype=pick(healing_types)) - owner.adjust_nutrition(3) - M.adjustCloneLoss(heal_amount * 1.2) //This way, two people can't just convert each other's damage away. - else - messagedelivered = FALSE - examine_text = null - return ..() - -/datum/status_effect/stabilized/lightpink - id = "stabilizedlightpink" - colour = "light pink" - -/datum/status_effect/stabilized/lightpink/on_apply() - owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - return ..() - -/datum/status_effect/stabilized/lightpink/tick() - for(var/mob/living/carbon/human/H in range(1, get_turf(owner))) - if(H != owner && H.stat != DEAD && H.health <= 0 && !H.reagents.has_reagent(/datum/reagent/medicine/epinephrine)) - to_chat(owner, "[linked_extract] pulses in sync with [H]'s heartbeat, trying to keep [H.p_them()] alive.") - H.reagents.add_reagent(/datum/reagent/medicine/epinephrine,5) - return ..() - -/datum/status_effect/stabilized/lightpink/on_remove() - owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - -/datum/status_effect/stabilized/adamantine - id = "stabilizedadamantine" - colour = "adamantine" - examine_text = "SUBJECTPRONOUN has a strange metallic coating on their skin." - -/datum/status_effect/stabilized/gold - id = "stabilizedgold" - colour = "gold" - var/mob/living/simple_animal/familiar - -/datum/status_effect/stabilized/gold/tick() - var/obj/item/slimecross/stabilized/gold/linked = linked_extract - if(QDELETED(familiar)) - familiar = new linked.mob_type(get_turf(owner.loc)) - familiar.name = linked.mob_name - familiar.del_on_death = TRUE - familiar.copy_languages(owner, LANGUAGE_MASTER) - if(linked.saved_mind) - linked.saved_mind.transfer_to(familiar) - familiar.update_atom_languages() - familiar.ckey = linked.saved_mind.key - else - if(familiar.mind) - linked.saved_mind = familiar.mind - return ..() - -/datum/status_effect/stabilized/gold/on_remove() - if(familiar) - qdel(familiar) - -/datum/status_effect/stabilized/adamantine/on_apply() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance += 5 - return ..() - -/datum/status_effect/stabilized/adamantine/on_remove() - if(ishuman(owner)) - var/mob/living/carbon/human/H = owner - H.physiology.damage_resistance -= 5 - -/datum/status_effect/stabilized/rainbow - id = "stabilizedrainbow" - colour = "rainbow" - -/datum/status_effect/stabilized/rainbow/tick() - if(owner.health <= 0) - var/obj/item/slimecross/stabilized/rainbow/X = linked_extract - if(istype(X)) - if(X.regencore) - X.regencore.afterattack(owner,owner,TRUE) - X.regencore = null - owner.visible_message("[owner] flashes a rainbow of colors, and [owner.p_their()] skin is coated in a milky regenerative goo!") - qdel(src) - qdel(linked_extract) - return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm deleted file mode 100644 index 2bca49c62913..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ /dev/null @@ -1,38 +0,0 @@ -/* -Slimecrossing Weapons - Weapons added by the slimecrossing system. - Collected here for clarity. -*/ - -//Boneblade - Burning Green -/obj/item/melee/arm_blade/slime - name = "slimy boneblade" - desc = "What remains of the bones in your arm. Incredibly sharp, and painful for both you and your opponents." - force = 22.5 - force_string = "painful" - -/obj/item/melee/arm_blade/slime/attack(mob/living/L, mob/user) - . = ..() - if(prob(20)) - user.force_scream() - -//Adamantine shield - Chilling Adamantine -/obj/item/shield/adamantineshield - name = "adamantine shield" - desc = "A gigantic shield made of solid adamantium." - icon = 'icons/obj/slimecrossing.dmi' - icon_state = "adamshield" - item_state = "adamshield" - w_class = WEIGHT_CLASS_HUGE - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) - slot_flags = ITEM_SLOT_BACK - block_chance = 50 - force = 0 - throw_range = 1 //How far do you think you're gonna throw a solid crystalline shield...? - throw_speed = 2 - attack_verb = list("bashed","pounded","slammed") - item_flags = SLOWS_WHILE_IN_HAND - -/obj/item/shield/adamantineshield/ComponentInitialize() - . = ..() - AddComponent(/datum/component/two_handed, require_twohands=TRUE, force_wielded=15) diff --git a/code/modules/research/xenobiology/crossbreeding/burning.dm b/code/modules/research/xenobiology/crossbreeding/burning.dm deleted file mode 100644 index 7d19fb0f8cfd..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/burning.dm +++ /dev/null @@ -1,307 +0,0 @@ -/* -Burning extracts: - Have a unique, primarily offensive effect when - filled with 10u plasma and activated in-hand. -*/ -/obj/item/slimecross/burning - name = "burning extract" - desc = "It's boiling over with barely-contained energy." - effect = "burning" - icon_state = "burning" - -/obj/item/slimecross/burning/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/burning/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/burning/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/burning/grey - colour = "grey" - effect_desc = "Creates a hungry and speedy slime that will love you forever." - -/obj/item/slimecross/burning/grey/do_effect(mob/user) - var/mob/living/simple_animal/slime/S = new(get_turf(user),"grey") - S.visible_message("A baby slime emerges from [src], and it nuzzles [user] before burbling hungrily!") - S.set_friendship(user, 20) //Gas, gas, gas - S.bodytemperature = T0C + 400 //We gonna step on the gas. - S.set_nutrition(S.get_hunger_nutrition()) //Tonight, we fight! - ..() - -/obj/item/slimecross/burning/orange - colour = "orange" - effect_desc = "Expels pepperspray in a radius when activated." - -/obj/item/slimecross/burning/orange/do_effect(mob/user) - user.visible_message("[src] boils over with a caustic gas!") - var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent(/datum/reagent/consumable/condensedcapsaicin, 100) - - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) - smoke.start() - ..() - -/obj/item/slimecross/burning/purple - colour = "purple" - effect_desc = "Creates a clump of invigorating gel, it has healing properties and makes you feel good." - -/obj/item/slimecross/burning/purple/do_effect(mob/user) - user.visible_message("[src] fills with a bubbling liquid!") - new /obj/item/slimecrossbeaker/autoinjector/slimestimulant(get_turf(user)) - ..() - -/obj/item/slimecross/burning/blue - colour = "blue" - effect_desc = "Freezes the floor around you and chills nearby people." - -/obj/item/slimecross/burning/blue/do_effect(mob/user) - user.visible_message("[src] flash-freezes the area!") - for(var/turf/open/T in range(3, get_turf(user))) - T.MakeSlippery(TURF_WET_PERMAFROST, min_wet_time = 10, wet_time_to_add = 5) - for(var/mob/living/carbon/M in range(5, get_turf(user))) - if(M != user && iscarbon(M)) - var/mob/living/carbon/C = M - M.bodytemperature = C.dna.species.bodytemp_cold_damage_limit + 10 //Not quite cold enough to hurt. - to_chat(M, "You feel a chill run down your spine, and the floor feels a bit slippery with frost...") - ..() - -/obj/item/slimecross/burning/metal - colour = "metal" - effect_desc = "Instantly destroys walls around you." - -/obj/item/slimecross/burning/metal/do_effect(mob/user) - for(var/turf/closed/wall/W in range(1,get_turf(user))) - W.dismantle_wall(devastated = TRUE) - playsound(W, 'sound/effects/break_stone.ogg', 50, TRUE) - user.visible_message("[src] pulses violently, and shatters the walls around it!") - ..() - -/obj/item/slimecross/burning/yellow - colour = "yellow" - effect_desc = "Electrocutes people near you." - -/obj/item/slimecross/burning/yellow/do_effect(mob/user) - user.visible_message("[src] explodes into an electrical field!") - playsound(get_turf(src), 'sound/weapons/zapbang.ogg', 50, TRUE) - for(var/mob/living/M in range(4,get_turf(user))) - if(M != user) - var/mob/living/carbon/C = M - if(istype(C)) - C.electrocute_act(25,src) - else - M.adjustFireLoss(25) - to_chat(M, "You feel a sharp electrical pulse!") - ..() - -/obj/item/slimecross/burning/darkpurple - colour = "dark purple" - effect_desc = "Creates a cloud of plasma." - -/obj/item/slimecross/burning/darkpurple/do_effect(mob/user) - user.visible_message("[src] sublimates into a cloud of plasma!") - var/turf/T = get_turf(user) - T.atmos_spawn_air("plasma=60") - ..() - -/obj/item/slimecross/burning/darkblue - colour = "dark blue" - effect_desc = "Expels a burst of chilling smoke while also filling you with cryoxadone." - -/obj/item/slimecross/burning/darkblue/do_effect(mob/user) - user.visible_message("[src] releases a burst of chilling smoke!") - var/datum/reagents/R = new/datum/reagents(100) - R.add_reagent(/datum/reagent/consumable/frostoil, 40) - user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,10) - var/datum/effect_system/smoke_spread/chem/smoke = new - smoke.set_up(R, 7, get_turf(user)) - smoke.start() - ..() - -/obj/item/slimecross/burning/silver - colour = "silver" - effect_desc = "Creates a few pieces of slime jelly laced food." - -/obj/item/slimecross/burning/silver/do_effect(mob/user) - var/amount = rand(3,6) - var/list/turfs = list() - for(var/turf/open/T in range(1,get_turf(user))) - turfs += T - for(var/i = 0, i < amount, i++) - var/path = get_random_food() - var/obj/item/O = new path(pick(turfs)) - O.reagents.add_reagent(/datum/reagent/toxin/slimejelly,5) //Oh god it burns - if(prob(50)) - O.desc += " It smells strange..." - user.visible_message("[src] produces a few pieces of food!") - ..() - -/obj/item/slimecross/burning/bluespace - colour = "bluespace" - effect_desc = "Teleports anyone directly next to you." - -/obj/item/slimecross/burning/bluespace/do_effect(mob/user) - user.visible_message("[src] sparks, and lets off a shockwave of bluespace energy!") - for(var/mob/living/L in range(1, get_turf(user))) - if(L != user) - do_teleport(L, get_turf(L), 6, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) //Somewhere between the effectiveness of fake and real BS crystal - new /obj/effect/particle_effect/sparks(get_turf(L)) - playsound(get_turf(L), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - ..() - -/obj/item/slimecross/burning/sepia - colour = "sepia" - effect_desc = "Turns into a special camera that rewinds time when used." - -/obj/item/slimecross/burning/sepia/do_effect(mob/user) - user.visible_message("[src] shapes itself into a camera!") - new /obj/item/camera/rewind(get_turf(user)) - ..() - -/obj/item/slimecross/burning/cerulean - colour = "cerulean" - effect_desc = "Produces an extract cloning potion, which copies an extract, as well as its extra uses." - -/obj/item/slimecross/burning/cerulean/do_effect(mob/user) - user.visible_message("[src] produces a potion!") - new /obj/item/slimepotion/extract_cloner(get_turf(user)) - ..() - -/obj/item/slimecross/burning/pyrite - colour = "pyrite" - effect_desc = "Shatters all lights in the current room." - -/obj/item/slimecross/burning/pyrite/do_effect(mob/user) - user.visible_message("[src] releases a colorful wave of energy, which shatters the lights!") - var/area/A = get_area(user.loc) - for(var/obj/machinery/light/L in A) //Shamelessly copied from the APC effect. - L.on = TRUE - L.break_light_tube() - L.on = FALSE - stoplag() - ..() - -/obj/item/slimecross/burning/red - colour = "red" - effect_desc = "Makes nearby slimes rabid, and they'll also attack their friends." - -/obj/item/slimecross/burning/red/do_effect(mob/user) - user.visible_message("[src] pulses a hazy red aura for a moment, which wraps around [user]!") - for(var/mob/living/simple_animal/slime/S in view(7, get_turf(user))) - if(user in S.Friends) - var/friendliness = S.Friends[user] - S.clear_friends() - S.set_friendship(user, friendliness) - else - S.clear_friends() - S.rabid = 1 - S.visible_message("The [S] is driven into a dangerous frenzy!") - ..() - -/obj/item/slimecross/burning/green - colour = "green" - effect_desc = "The user gets a dull arm blade in the hand it is used in." - -/obj/item/slimecross/burning/green/do_effect(mob/user) - var/which_hand = "l_hand" - if(!(user.active_hand_index % 2)) - which_hand = "r_hand" - var/mob/living/L = user - if(!istype(user)) - return - var/obj/item/held = L.get_active_held_item() //This should be itself, but just in case... - L.dropItemToGround(held) - var/obj/item/melee/arm_blade/slime/blade = new(user) - if(!L.put_in_hands(blade)) - qdel(blade) - user.visible_message("[src] melts onto [user]'s arm, boiling the flesh horribly!") - else - user.visible_message("[src] sublimates the flesh around [user]'s arm, transforming the bone into a gruesome blade!") - user.force_scream() - L.apply_damage(30,BURN,which_hand) - ..() - -/obj/item/slimecross/burning/pink - colour = "pink" - effect_desc = "Creates a beaker of synthpax." - -/obj/item/slimecross/burning/pink/do_effect(mob/user) - user.visible_message("[src] shrinks into a small, gel-filled pellet!") - new /obj/item/slimecrossbeaker/pax(get_turf(user)) - ..() - -/obj/item/slimecross/burning/gold - colour = "gold" - effect_desc = "Creates a gank squad of monsters that are friendly to the user." - -/obj/item/slimecross/burning/gold/do_effect(mob/user) - user.visible_message("[src] shudders violently, and summons an army for [user]!") - for(var/i in 1 to 3) //Less than gold normally does, since it's safer and faster. - var/mob/living/simple_animal/S = create_random_mob(get_turf(user), HOSTILE_SPAWN) - S.faction |= "[REF(user)]" - if(prob(50)) - for(var/j = 1, j <= rand(1, 3), j++) - step(S, pick(NORTH,SOUTH,EAST,WEST)) - ..() - -/obj/item/slimecross/burning/oil - colour = "oil" - effect_desc = "Creates an explosion after a few seconds." - -/obj/item/slimecross/burning/oil/do_effect(mob/user) - user.visible_message("[user] activates [src]. It's going to explode!", "You activate [src]. It crackles in anticipation") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/burning/oil/proc/boom() - var/turf/T = get_turf(src) - playsound(T, 'sound/effects/explosion2.ogg', 200, TRUE) - for(var/mob/living/M in range(2, T)) - new /obj/effect/temp_visual/explosion(get_turf(M)) - M.ex_act(EXPLODE_HEAVY) - qdel(src) - -/obj/item/slimecross/burning/black - colour = "black" - effect_desc = "Transforms the user into a slime. They can transform back at will and do not lose any items." - -/obj/item/slimecross/burning/black/do_effect(mob/user) - var/mob/living/L = user - if(!istype(L)) - return - user.visible_message("[src] absorbs [user], transforming [user.p_them()] into a slime!") - var/obj/effect/proc_holder/spell/targeted/shapeshift/slimeform/S = new() - S.remove_on_restore = TRUE - user.mind.AddSpell(S) - S.cast(list(user),user) - ..() - -/obj/item/slimecross/burning/lightpink - colour = "light pink" - effect_desc = "Paxes everyone in sight." - -/obj/item/slimecross/burning/lightpink/do_effect(mob/user) - user.visible_message("[src] lets off a hypnotizing pink glow!") - for(var/mob/living/carbon/C in view(7, get_turf(user))) - C.reagents.add_reagent(/datum/reagent/pax,5) - ..() - -/obj/item/slimecross/burning/adamantine - colour = "adamantine" - effect_desc = "Creates a mighty adamantine shield." - -/obj/item/slimecross/burning/adamantine/do_effect(mob/user) - user.visible_message("[src] crystallizes into a large shield!") - new /obj/item/shield/adamantineshield(get_turf(user)) - ..() - diff --git a/code/modules/research/xenobiology/crossbreeding/charged.dm b/code/modules/research/xenobiology/crossbreeding/charged.dm deleted file mode 100644 index f01b148d4d5e..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/charged.dm +++ /dev/null @@ -1,272 +0,0 @@ -/* -Charged extracts: - Have a unique, effect when filled with - 10u plasma and activated in-hand, related to their - normal extract effect. -*/ -/obj/item/slimecross/charged - name = "charged extract" - desc = "It sparks with electric power." - effect = "charged" - icon_state = "charged" - -/obj/item/slimecross/charged/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/charged/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/effects/light_flicker.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/charged/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/charged/grey - colour = "grey" - effect_desc = "Produces a slime reviver potion, which revives dead slimes." - -/obj/item/slimecross/charged/grey/do_effect(mob/user) - new /obj/item/slimepotion/slime_reviver(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/orange - colour = "orange" - effect_desc = "Instantly makes a large burst of flame for a moment." - -/obj/item/slimecross/charged/orange/do_effect(mob/user) - for(var/turf/turf in range(5,get_turf(user))) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) - ..() - -/obj/item/slimecross/charged/purple - colour = "purple" - effect_desc = "Creates a packet of omnizine." - -/obj/item/slimecross/charged/purple/do_effect(mob/user) - new /obj/item/slimecrossbeaker/omnizine(get_turf(user)) - user.visible_message("[src] sparks, and floods with a regenerative solution!") - ..() - -/obj/item/slimecross/charged/blue - colour = "blue" - effect_desc = "Creates a potion that neuters the mutation chance of a slime, which passes on to new generations." - -/obj/item/slimecross/charged/blue/do_effect(mob/user) - new /obj/item/slimepotion/slime/chargedstabilizer(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/metal - colour = "metal" - effect_desc = "Produces a bunch of metal and plasteel." - -/obj/item/slimecross/charged/metal/do_effect(mob/user) - new /obj/item/stack/sheet/metal(get_turf(user), 25) - new /obj/item/stack/sheet/plasteel(get_turf(user), 10) - user.visible_message("[src] grows into a plethora of metals!") - ..() - -/obj/item/slimecross/charged/yellow - colour = "yellow" - effect_desc = "Creates a hypercharged slime cell battery, which has high capacity and recharges constantly at a very fast rate." - -/obj/item/slimecross/charged/yellow/do_effect(mob/user) - new /obj/item/stock_parts/cell/high/slime/hypercharged(get_turf(user)) - user.visible_message("[src] sparks violently, and swells with electric power!") - ..() - -/obj/item/slimecross/charged/darkpurple - colour = "dark purple" - effect_desc = "Creates several sheets of plasma." - -/obj/item/slimecross/charged/darkpurple/do_effect(mob/user) - new /obj/item/stack/sheet/mineral/plasma(get_turf(user), 10) - user.visible_message("[src] produces a large amount of plasma!") - ..() - -/obj/item/slimecross/charged/darkblue - colour = "dark blue" - effect_desc = "Produces a pressure proofing potion." - -/obj/item/slimecross/charged/darkblue/do_effect(mob/user) - new /obj/item/slimepotion/spaceproof(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/silver - colour = "silver" - effect_desc = "Creates a slime cake and some drinks." - -/obj/item/slimecross/charged/silver/do_effect(mob/user) - new /obj/item/food/cake/slimecake(get_turf(user)) - for(var/i in 1 to 10) - var/drink_type = get_random_drink() - new drink_type(get_turf(user)) - user.visible_message("[src] produces a party's worth of cake and drinks!") - ..() - -/obj/item/slimecross/charged/bluespace - colour = "bluespace" - effect_desc = "Makes a bluespace polycrystal." - -/obj/item/slimecross/charged/bluespace/do_effect(mob/user) - new /obj/item/stack/sheet/bluespace_crystal(get_turf(user), 10) - user.visible_message("[src] produces several sheets of polycrystal!") - ..() - -/obj/item/slimecross/charged/sepia - colour = "sepia" - effect_desc = "Creates a camera obscura." - -/obj/item/slimecross/charged/sepia/do_effect(mob/user) - new /obj/item/camera/spooky(get_turf(user)) - user.visible_message("[src] flickers in a strange, ethereal manner, and produces a camera!") - ..() - -/obj/item/slimecross/charged/cerulean - colour = "cerulean" - effect_desc = "Creates an extract enhancer, giving whatever it's used on five more uses." - -/obj/item/slimecross/charged/cerulean/do_effect(mob/user) - new /obj/item/slimepotion/enhancer/max(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/pyrite - colour = "pyrite" - effect_desc = "Creates bananium. Oh no." - -/obj/item/slimecross/charged/pyrite/do_effect(mob/user) - new /obj/item/stack/sheet/mineral/hidden/hellstone(get_turf(user), 10) - user.visible_message("[src] solidifies with a horrifying banana stench!") - ..() - -/obj/item/slimecross/charged/red - colour = "red" - effect_desc = "Produces a lavaproofing potion" - -/obj/item/slimecross/charged/red/do_effect(mob/user) - new /obj/item/slimepotion/lavaproof(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/green - colour = "green" - effect_desc = "Lets you choose what slime species you want to be." - -/obj/item/slimecross/charged/green/do_effect(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - to_chat(user, "You must be a humanoid to use this!") - return - var/racechoice = input(H, "Choose your slime subspecies.", "Slime Selection") as null|anything in sortList(subtypesof(/datum/species/jelly), /proc/cmp_typepaths_asc) - if(!racechoice) - to_chat(user, "You decide not to become a slime for now.") - return - if(!user.canUseTopic(src, BE_CLOSE)) - return - H.set_species(racechoice, icon_update=1) - H.visible_message("[H] suddenly shifts form as [src] dissolves into [H.p_their()] skin!") - ..() - -/obj/item/slimecross/charged/pink - colour = "pink" - effect_desc = "Produces a... lovepotion... no ERP." - -/obj/item/slimecross/charged/pink/do_effect(mob/user) - new /obj/item/slimepotion/lovepotion(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/gold - colour = "gold" - effect_desc = "Slowly spawns 10 hostile monsters." - var/max_spawn = 10 - var/spawned = 0 - -/obj/item/slimecross/charged/gold/do_effect(mob/user) - user.visible_message("[src] starts shuddering violently!") - addtimer(CALLBACK(src, PROC_REF(startTimer)), 50) - -/obj/item/slimecross/charged/gold/proc/startTimer() - START_PROCESSING(SSobj, src) - -/obj/item/slimecross/charged/gold/process() - visible_message("[src] lets off a spark, and produces a living creature!") - new /obj/effect/particle_effect/sparks(get_turf(src)) - playsound(get_turf(src), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - create_random_mob(get_turf(src), HOSTILE_SPAWN) - spawned++ - if(spawned >= max_spawn) - visible_message("[src] collapses into a puddle of goo.") - qdel(src) - -/obj/item/slimecross/charged/gold/Destroy() - STOP_PROCESSING(SSobj, src) - return ..() - -/obj/item/slimecross/charged/oil - colour = "oil" - effect_desc = "Creates an explosion after a few seconds." - -/obj/item/slimecross/charged/oil/do_effect(mob/user) - user.visible_message("[src] begins to shake with rapidly increasing force!") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/charged/oil/proc/boom() - explosion(get_turf(src), 2, 3, 4) //Much smaller effect than normal oils, but devastatingly strong where it does hit. - qdel(src) - -/obj/item/slimecross/charged/black - colour = "black" - effect_desc = "Randomizes the user's species." - -/obj/item/slimecross/charged/black/do_effect(mob/user) - var/mob/living/carbon/human/H = user - if(!istype(H)) - to_chat(user, "You have to be able to have a species to get your species changed.") - return - var/list/allowed_species = list() - for(var/stype in subtypesof(/datum/species)) - var/datum/species/X = stype - if(initial(X.changesource_flags) & SLIME_EXTRACT) - allowed_species += stype - - var/datum/species/changed = pick(allowed_species) - if(changed) - H.set_species(changed, icon_update = 1) - to_chat(H, "You feel very different!") - ..() - -/obj/item/slimecross/charged/lightpink - colour = "light pink" - effect_desc = "Produces a pacification potion, which works on monsters and humanoids." - -/obj/item/slimecross/charged/lightpink/do_effect(mob/user) - new /obj/item/slimepotion/peacepotion(get_turf(user)) - user.visible_message("[src] distills into a potion!") - ..() - -/obj/item/slimecross/charged/adamantine - colour = "adamantine" - effect_desc = "Does nothing. Sorry :)" - -/obj/item/slimecross/charged/rainbow - colour = "rainbow" - effect_desc = "Produces three living slimes of random colors." - -/obj/item/slimecross/charged/rainbow/do_effect(mob/user) - user.visible_message("[src] swells and splits into three new slimes!") - for(var/i in 1 to 3) - var/mob/living/simple_animal/slime/S = new(get_turf(user)) - S.random_colour() - ..() diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm deleted file mode 100644 index 8b2aa42f0487..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ /dev/null @@ -1,301 +0,0 @@ -/* -Chilling extracts: - Have a unique, primarily defensive effect when - filled with 10u plasma and activated in-hand. -*/ -/obj/item/slimecross/chilling - name = "chilling extract" - desc = "It's cold to the touch, as if frozen solid." - effect = "chilling" - icon_state = "chilling" - -/obj/item/slimecross/chilling/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/chilling/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/effects/glassbr1.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/chilling/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/chilling/grey - colour = "grey" - effect_desc = "Creates some slime barrier cubes. When used they create slimy barricades." - -/obj/item/slimecross/chilling/grey/do_effect(mob/user) - user.visible_message("[src] produces a few small, grey cubes") - for(var/i in 1 to 3) - new /obj/item/barriercube(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/orange - colour = "orange" - effect_desc = "Creates a ring of fire one tile away from the user." - -/obj/item/slimecross/chilling/orange/do_effect(mob/user) - user.visible_message("[src] shatters, and lets out a jet of heat!") - for(var/turf/T in orange(get_turf(user),2)) - if(get_dist(get_turf(user), T) > 1) - new /obj/effect/hotspot(T) - ..() - -/obj/item/slimecross/chilling/purple - colour = "purple" - effect_desc = "Injects everyone in the area with some regenerative jelly." - -/obj/item/slimecross/chilling/purple/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - if(A.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - user.visible_message("[src] shatters, and a healing aura fills the room briefly.") - for(var/mob/living/carbon/C in A) - C.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) - ..() - -/obj/item/slimecross/chilling/blue - colour = "blue" - effect_desc = "Creates a rebreather, a tankless mask." - -/obj/item/slimecross/chilling/blue/do_effect(mob/user) - user.visible_message("[src] cracks, and spills out a liquid goo, which reforms into a mask!") - new /obj/item/clothing/mask/nobreath(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/metal - colour = "metal" - effect_desc = "Temporarily surrounds the user with unbreakable walls." - -/obj/item/slimecross/chilling/metal/do_effect(mob/user) - user.visible_message("[src] melts like quicksilver, and surrounds [user] in a wall!") - for(var/turf/T in orange(get_turf(user),1)) - if(get_dist(get_turf(user), T) > 0) - new /obj/effect/forcefield/slimewall(T) - ..() - -/obj/item/slimecross/chilling/yellow - colour = "yellow" - effect_desc = "Recharges the room's APC by 50%." - -/obj/item/slimecross/chilling/yellow/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - user.visible_message("[src] shatters, and a the air suddenly feels charged for a moment.") - for(var/obj/machinery/power/apc/C in A) - if(C.cell) - C.cell.charge = min(C.cell.charge + C.cell.maxcharge/2, C.cell.maxcharge) - ..() - -/obj/item/slimecross/chilling/darkpurple - colour = "dark purple" - effect_desc = "Removes all plasma gas in the area." - -/obj/item/slimecross/chilling/darkpurple/do_effect(mob/user) - var/area/A = get_area(get_turf(user)) - if(A.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - var/filtered = FALSE - for(var/turf/open/T in A) - var/datum/gas_mixture/G = T.air - if(istype(G)) - G.set_moles(GAS_PLASMA, 0) - filtered = TRUE - T.air_update_turf() - if(filtered) - user.visible_message("Cracks spread throughout [src], and some air is sucked in!") - else - user.visible_message("[src] cracks, but nothing happens.") - ..() - -/obj/item/slimecross/chilling/darkblue - colour = "dark blue" - effect_desc = "Seals the user in a protective block of ice." - -/obj/item/slimecross/chilling/darkblue/do_effect(mob/user) - if(isliving(user)) - user.visible_message("[src] freezes over [user]'s entire body!") - var/mob/living/M = user - M.apply_status_effect(/datum/status_effect/frozenstasis) - ..() - -/obj/item/slimecross/chilling/silver - colour = "silver" - effect_desc = "Creates several ration packs." - -/obj/item/slimecross/chilling/silver/do_effect(mob/user) - user.visible_message("[src] crumbles into icy powder, leaving behind several emergency food supplies!") - var/amount = rand(5, 10) - for(var/i in 1 to amount) - new /obj/item/reagent_containers/food/snacks/rationpack(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/bluespace - colour = "bluespace" - effect_desc = "Touching people with this extract adds them to a list, when it is activated it teleports everyone on that list to the user." - var/list/allies = list() - var/active = FALSE - -/obj/item/slimecross/chilling/bluespace/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target) || active) - return - if(target in allies) - allies -= target - to_chat(user, "You unlink [src] with [target].") - else - allies |= target - to_chat(user, "You link [src] with [target].") - return - -/obj/item/slimecross/chilling/bluespace/do_effect(mob/user) - if(allies.len <= 0) - to_chat(user, "[src] is not linked to anyone!") - return - to_chat(user, "You feel [src] pulse as it begins charging bluespace energies...") - active = TRUE - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.apply_status_effect(/datum/status_effect/slimerecall) - S.target = user - if(do_after(user, 100, target=src)) - to_chat(user, "[src] shatters as it tears a hole in reality, snatching the linked individuals from the void!") - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall) - M.remove_status_effect(S) - else - to_chat(user, "[src] falls dark, dissolving into nothing as the energies fade away.") - for(var/mob/living/M in allies) - var/datum/status_effect/slimerecall/S = M.has_status_effect(/datum/status_effect/slimerecall) - if(istype(S)) - S.interrupted = TRUE - M.remove_status_effect(S) - ..() - -/obj/item/slimecross/chilling/sepia - colour = "sepia" - effect_desc = "Touching someone with it adds/removes them from a list. Activating the extract stops time for 7 seconds, and everyone on the list is immune, except the user." - var/list/allies = list() - -/obj/item/slimecross/chilling/sepia/afterattack(atom/target, mob/user, proximity) - if(!proximity || !isliving(target)) - return - if(target in allies) - allies -= target - to_chat(user, "You unlink [src] with [target].") - else - allies |= target - to_chat(user, "You link [src] with [target].") - return - -/obj/item/slimecross/chilling/sepia/do_effect(mob/user) - user.visible_message("[src] shatters, freezing time itself!") - allies -= user //support class - new /obj/effect/timestop(get_turf(user), 2, 70, allies) - ..() - -/obj/item/slimecross/chilling/cerulean - colour = "cerulean" - effect_desc = "Creates a flimsy copy of the user, that they control." - -/obj/item/slimecross/chilling/cerulean/do_effect(mob/user) - if(isliving(user)) - user.visible_message("[src] creaks and shifts into a clone of [user]!") - var/mob/living/M = user - M.apply_status_effect(/datum/status_effect/slime_clone) - ..() - -/obj/item/slimecross/chilling/pyrite - colour = "pyrite" - effect_desc = "Creates a pair of Prism Glasses, which allow the wearer to place colored light crystals." - -/obj/item/slimecross/chilling/pyrite/do_effect(mob/user) - user.visible_message("[src] does nothing sorry lol!") - ..() - -/obj/item/slimecross/chilling/red - colour = "red" - effect_desc = "Pacifies every slime in your vacinity." - -/obj/item/slimecross/chilling/red/do_effect(mob/user) - var/slimesfound = FALSE - for(var/mob/living/simple_animal/slime/S in view(get_turf(user), 7)) - slimesfound = TRUE - S.docile = TRUE - if(slimesfound) - user.visible_message("[src] lets out a peaceful ring as it shatters, and nearby slimes seem calm.") - else - user.visible_message("[src] lets out a peaceful ring as it shatters, but nothing happens...") - ..() - -/obj/item/slimecross/chilling/pink - colour = "pink" - effect_desc = "Creates a slime corgi puppy." - -/obj/item/slimecross/chilling/pink/do_effect(mob/user) - user.visible_message("[src] cracks like an egg, and an adorable puppy comes tumbling out!") - new /mob/living/simple_animal/pet/dog/corgi/puppy/slime(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/gold - colour = "gold" - effect_desc = "Produces a golden capture device" - -/obj/item/slimecross/chilling/gold/do_effect(mob/user) - user.visible_message("[src] lets off golden light as it melts and reforms into an egg-like device!") - new /obj/item/capturedevice(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/oil - colour = "oil" - effect_desc = "It creates a weak, but wide-ranged explosion." - -/obj/item/slimecross/chilling/oil/do_effect(mob/user) - user.visible_message("[src] begins to shake with muted intensity!") - addtimer(CALLBACK(src, PROC_REF(boom)), 50) - -/obj/item/slimecross/chilling/oil/proc/boom() - explosion(get_turf(src), -1, -1, 10, 0) //Large radius, but mostly light damage, and no flash. - qdel(src) - -/obj/item/slimecross/chilling/black - colour = "black" - effect_desc = "Does nothing. :)" - -/obj/item/slimecross/chilling/lightpink - colour = "light pink" - effect_desc = "Creates a Heroine Bud, a special flower that pacifies whoever wears it on their head. They will not be able to take it off without help." - -/obj/item/slimecross/chilling/lightpink/do_effect(mob/user) - user.visible_message("[src] blooms into a beautiful flower!") - new /obj/item/clothing/head/peaceflower(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/adamantine - colour = "adamantine" - effect_desc = "Solidifies into a set of adamantine armor." - -/obj/item/slimecross/chilling/adamantine/do_effect(mob/user) - user.visible_message("[src] creaks and breaks as it shifts into a heavy set of armor!") - new /obj/item/clothing/suit/armor/heavy/adamantine(get_turf(user)) - ..() - -/obj/item/slimecross/chilling/rainbow - colour = "rainbow" - effect_desc = "Makes an unpassable wall in every door in the area." - -/obj/item/slimecross/chilling/rainbow/do_effect(mob/user) - var/area/area = get_area(user) - if(area.outdoors) - to_chat(user, "[src] can't affect such a large area.") - return - user.visible_message("[src] reflects an array of dazzling colors and light, energy rushing to nearby doors!") - for(var/obj/machinery/door/airlock/door in area) - new /obj/effect/forcefield/slimewall/rainbow(door.loc) - return ..() diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm deleted file mode 100644 index f2a162af3aac..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ /dev/null @@ -1,460 +0,0 @@ -/* -Consuming extracts: - Can eat food items. - After consuming enough, produces special cookies. -*/ -/obj/item/slimecross/consuming - name = "consuming extract" - desc = "It hungers... for more." //My slimecross has finally decided to eat... my buffet! - icon_state = "consuming" - effect = "consuming" - var/nutriment_eaten = 0 - var/nutriment_required = 10 - var/cooldown = 600 //1 minute. - var/last_produced = 0 - var/cookies = 5 //Number of cookies to spawn - var/cookietype = /obj/item/slime_cookie - -/obj/item/slimecross/consuming/attackby(obj/item/O, mob/user) - if(istype(O,/obj/item/reagent_containers/food/snacks)) - if(last_produced + cooldown > world.time) - to_chat(user, "[src] is still digesting after its last meal!") - return - var/datum/reagent/N = O.reagents.has_reagent(/datum/reagent/consumable/nutriment) - if(N) - nutriment_eaten += N.volume - to_chat(user, "[src] opens up and swallows [O] whole!") - qdel(O) - playsound(src, 'sound/items/eatfood.ogg', 20, TRUE) - else - to_chat(user, "[src] burbles unhappily at the offering.") - if(nutriment_eaten >= nutriment_required) - nutriment_eaten = 0 - user.visible_message("[src] swells up and produces a small pile of cookies!") - playsound(src, 'sound/effects/splat.ogg', 40, TRUE) - last_produced = world.time - for(var/i in 1 to cookies) - var/obj/item/S = spawncookie() - S.pixel_x = base_pixel_x + rand(-5, 5) - S.pixel_y = base_pixel_y + rand(-5, 5) - return - ..() - -/obj/item/slimecross/consuming/proc/spawncookie() - return new cookietype(get_turf(src)) - -/obj/item/slime_cookie //While this technically acts like food, it's so removed from it that I made it its' own type. - name = "error cookie" - desc = "A weird slime cookie. You shouldn't see this." - icon = 'icons/obj/food/slimecookies.dmi' - var/taste = "error" - var/nutrition = 5 - icon_state = "base" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - -/obj/item/slime_cookie/proc/do_effect(mob/living/M, mob/user) - return - -/obj/item/slime_cookie/attack(mob/living/M, mob/user) - var/fed = FALSE - if(M == user) - M.visible_message("[user] eats [src]!", "You eat [src].") - fed = TRUE - else - M.visible_message("[user] tries to force [M] to eat [src]!", "[user] tries to force you to eat [src]!") - if(do_after(user, 20, target = M)) - fed = TRUE - M.visible_message("[user] forces [M] to eat [src]!", "[user] forces you to eat [src].") - if(fed) - var/mob/living/carbon/human/H = M - - if(!istype(H) || !HAS_TRAIT(H, TRAIT_AGEUSIA)) - to_chat(M, "Tastes like [taste].") - playsound(get_turf(M), 'sound/items/eatfood.ogg', 20, TRUE) - if(nutrition) - M.reagents.add_reagent(/datum/reagent/consumable/nutriment,nutrition) - do_effect(M, user) - qdel(src) - return - ..() - -/obj/item/slimecross/consuming/grey - colour = "grey" - effect_desc = "Creates a slime cookie." - cookietype = /obj/item/slime_cookie/grey - -/obj/item/slime_cookie/grey - name = "slime cookie" - desc = "A grey-ish transparent cookie. Nutritious, probably." - icon_state = "grey" - taste = "goo" - nutrition = 15 - -/obj/item/slimecross/consuming/orange - colour = "orange" - effect_desc = "Creates a slime cookie that heats the target up and grants cold immunity for a short time." - cookietype = /obj/item/slime_cookie/orange - -/obj/item/slime_cookie/orange - name = "fiery cookie" - desc = "A orange cookie with a fiery pattern. Feels warm." - icon_state = "orange" - taste = "cinnamon and burning" - -/obj/item/slime_cookie/orange/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/firecookie) - -/obj/item/slimecross/consuming/purple - colour = "purple" - effect_desc = "Creates a slime cookie that heals the target from every type of damage." - cookietype = /obj/item/slime_cookie/purple - -/obj/item/slime_cookie/purple - name = "health cookie" - desc = "A purple cookie with a cross pattern. Soothing." - icon_state = "purple" - taste = "fruit jam and cough medicine" - -/obj/item/slime_cookie/purple/do_effect(mob/living/M, mob/user) - M.adjustBruteLoss(-5) - M.adjustFireLoss(-5) - M.adjustToxLoss(-5, forced=1) //To heal slimepeople. - M.adjustOxyLoss(-5) - M.adjustCloneLoss(-5) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -5) - -/obj/item/slimecross/consuming/blue - colour = "blue" - effect_desc = "Creates a slime cookie that wets the floor around you and makes you immune to water based slipping for a short time." - cookietype = /obj/item/slime_cookie/blue - -/obj/item/slime_cookie/blue - name = "water cookie" - desc = "A transparent blue cookie. Constantly dripping wet." - icon_state = "blue" - taste = /datum/reagent/water - -/obj/item/slime_cookie/blue/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/watercookie) - -/obj/item/slimecross/consuming/metal - colour = "metal" - effect_desc = "Creates a slime cookie that increases the target's resistance to brute damage." - cookietype = /obj/item/slime_cookie/metal - -/obj/item/slime_cookie/metal - name = "metallic cookie" - desc = "A shiny grey cookie. Hard to the touch." - icon_state = "metal" - taste = /datum/reagent/copper - -/obj/item/slime_cookie/metal/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/metalcookie) - -/obj/item/slimecross/consuming/yellow - colour = "yellow" - effect_desc = "Creates a slime cookie that makes the target immune to electricity for a short time." - cookietype = /obj/item/slime_cookie/yellow - -/obj/item/slime_cookie/yellow - name = "sparking cookie" - desc = "A yellow cookie with a lightning pattern. Has a rubbery texture." - icon_state = "yellow" - taste = "lemon cake and rubber gloves" - -/obj/item/slime_cookie/yellow/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/sparkcookie) - -/obj/item/slimecross/consuming/darkpurple - colour = "dark purple" - effect_desc = "Creates a slime cookie that reverses how the target's body treats toxins." - cookietype = /obj/item/slime_cookie/darkpurple - -/obj/item/slime_cookie/darkpurple - name = "toxic cookie" - desc = "A dark purple cookie, stinking of plasma." - icon_state = "darkpurple" - taste = "slime jelly and toxins" - -/obj/item/slime_cookie/darkpurple/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/toxincookie) - -/obj/item/slimecross/consuming/darkblue - colour = "dark blue" - effect_desc = "Creates a slime cookie that chills the target and extinguishes them." - cookietype = /obj/item/slime_cookie/darkblue - -/obj/item/slime_cookie/darkblue - name = "frosty cookie" - desc = "A dark blue cookie with a snowflake pattern. Feels cold." - icon_state = "darkblue" - taste = "mint and bitter cold" - -/obj/item/slime_cookie/darkblue/do_effect(mob/living/M, mob/user) - M.adjust_bodytemperature(-110) - M.ExtinguishMob() - -/obj/item/slimecross/consuming/silver - colour = "silver" - effect_desc = "Creates a slime cookie that never gets the target fat." - cookietype = /obj/item/slime_cookie/silver - -/obj/item/slime_cookie/silver - name = "waybread cookie" - desc = "A warm, crispy cookie, sparkling silver in the light. Smells wonderful." - icon_state = "silver" - taste = "masterful elven baking" - nutrition = 0 //We don't want normal nutriment - -/obj/item/slime_cookie/silver/do_effect(mob/living/M, mob/user) - M.reagents.add_reagent(/datum/reagent/consumable/nutriment/stabilized,10) - -/obj/item/slimecross/consuming/bluespace - colour = "bluespace" - effect_desc = "Creates a slime cookie that teleports the target to a random place in the area." - cookietype = /obj/item/slime_cookie/bluespace - -/obj/item/slime_cookie/bluespace - name = "space cookie" - desc = "A white cookie with green icing. Surprisingly hard to hold." - icon_state = "bluespace" - taste = "sugar and starlight" - -/obj/item/slime_cookie/bluespace/do_effect(mob/living/M, mob/user) - var/list/L = get_area_turfs(get_area(M)) - var/turf/target - while (L.len && !target) - var/I = rand(1, L.len) - var/turf/T = L[I] - if (is_centcom_level(T)) - L.Cut(I,I+1) - continue - if(!T.density) - var/clear = TRUE - for(var/obj/O in T) - if(O.density) - clear = FALSE - break - if(clear) - target = T - if (!target) - L.Cut(I,I+1) - - if(target) - do_teleport(M, target, 0, asoundin = 'sound/effects/phasein.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - new /obj/effect/particle_effect/sparks(get_turf(M)) - playsound(get_turf(M), "sparks", 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/obj/item/slimecross/consuming/sepia - colour = "sepia" - effect_desc = "Creates a slime cookie that makes the target do things slightly faster." - cookietype = /obj/item/slime_cookie/sepia - -/obj/item/slime_cookie/sepia - name = "time cookie" - desc = "A light brown cookie with a clock pattern. Takes some time to chew." - icon_state = "sepia" - taste = "brown sugar and a metronome" - -/obj/item/slime_cookie/sepia/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/timecookie) - -/obj/item/slimecross/consuming/cerulean - colour = "cerulean" - effect_desc = "Creates a slime cookie that has a chance to make another once you eat it." - cookietype = /obj/item/slime_cookie/cerulean - cookies = 3 //You're gonna get more. - -/obj/item/slime_cookie/cerulean - name = "duplicookie" - desc = "A cerulean cookie with strange proportions. It feels like it could break apart easily." - icon_state = "cerulean" - taste = "a sugar cookie" - -/obj/item/slime_cookie/cerulean/do_effect(mob/living/M, mob/user) - if(prob(50)) - to_chat(M, "A piece of [src] breaks off while you chew, and falls to the ground.") - var/obj/item/slime_cookie/cerulean/C = new(get_turf(M)) - C.taste = taste + " and a sugar cookie" - -/obj/item/slimecross/consuming/pyrite - colour = "pyrite" - effect_desc = "Creates a slime cookie that randomly colors the target." - cookietype = /obj/item/slime_cookie/pyrite - -/obj/item/slime_cookie/pyrite - name = "color cookie" - desc = "A yellow cookie with rainbow-colored icing. Reflects the light strangely." - icon_state = "pyrite" - taste = "vanilla and " //Randomly selected color dye. - var/colour = "#FFFFFF" - -/obj/item/slime_cookie/pyrite/Initialize() - . = ..() - var/tastemessage = "paint remover" - switch(rand(1,7)) - if(1) - tastemessage = "red dye" - colour = "#FF0000" - if(2) - tastemessage = "orange dye" - colour = "#FFA500" - if(3) - tastemessage = "yellow dye" - colour = "#FFFF00" - if(4) - tastemessage = "green dye" - colour = "#00FF00" - if(5) - tastemessage = "blue dye" - colour = "#0000FF" - if(6) - tastemessage = "indigo dye" - colour = "#4B0082" - if(7) - tastemessage = "violet dye" - colour = "#FF00FF" - taste += tastemessage - -/obj/item/slime_cookie/pyrite/do_effect(mob/living/M, mob/user) - M.add_atom_colour(colour,WASHABLE_COLOUR_PRIORITY) - -/obj/item/slimecross/consuming/red - colour = "red" - effect_desc = "Creates a slime cookie that creates a spatter of blood on the floor, while also restoring some of the target's blood." - cookietype = /obj/item/slime_cookie/red - -/obj/item/slime_cookie/red - name = "blood cookie" - desc = "A red cookie, oozing a thick red fluid. Vampires might enjoy it." - icon_state = "red" - taste = "red velvet and iron" - -/obj/item/slime_cookie/red/do_effect(mob/living/M, mob/user) - new /obj/effect/decal/cleanable/blood(get_turf(M)) - playsound(get_turf(M), 'sound/effects/splat.ogg', 10, TRUE) - if(iscarbon(M)) - var/mob/living/carbon/C = M - C.blood_volume += 25 //Half a vampire drain. - -/obj/item/slimecross/consuming/green - colour = "green" - effect_desc = "Creates a slime cookie that is absolutely disgusting, makes the target vomit, however all reagent in their body are also removed." - cookietype = /obj/item/slime_cookie/green - -/obj/item/slime_cookie/green - name = "gross cookie" - desc = "A disgusting green cookie, seeping with pus. You kind of feel ill just looking at it." - icon_state = "green" - taste = "the contents of your stomach" - -/obj/item/slime_cookie/green/do_effect(mob/living/M, mob/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.vomit(25) - M.reagents.remove_all() - -/obj/item/slimecross/consuming/pink - colour = "pink" - effect_desc = "Creates a slime cookie that makes the target want to spread the love." - cookietype = /obj/item/slime_cookie/pink - -/obj/item/slime_cookie/pink - name = "love cookie" - desc = "A pink cookie with an icing heart. D'aww." - icon_state = "pink" - taste = "love and hugs" - -/obj/item/slime_cookie/pink/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/lovecookie) - -/obj/item/slimecross/consuming/gold - colour = "gold" - effect_desc = "Creates a slime cookie that has a gold coin inside." - cookietype = /obj/item/slime_cookie/gold - -/obj/item/slime_cookie/gold - name = "gilded cookie" - desc = "A buttery golden cookie, closer to a bread than anything. May good fortune find you." - icon_state = "gold" - taste = "sweet cornbread and wealth" - -/obj/item/slime_cookie/gold/do_effect(mob/living/M, mob/user) - var/obj/item/held = M.get_active_held_item() //This should be itself, but just in case... - M.dropItemToGround(held) - var/newcoin = /obj/item/coin/gold - var/obj/item/coin/C = new newcoin(get_turf(M)) - playsound(get_turf(C), 'sound/items/coinflip.ogg', 50, TRUE) - M.put_in_hand(C) - -/obj/item/slimecross/consuming/oil - colour = "oil" - effect_desc = "Creates a slime cookie that slows anyone next to the user." - cookietype = /obj/item/slime_cookie/oil - -/obj/item/slime_cookie/oil - name = "tar cookie" - desc = "An oily black cookie, which sticks to your hands. Smells like chocolate." - icon_state = "oil" - taste = "rich molten chocolate and tar" - -/obj/item/slime_cookie/oil/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/tarcookie) - -/obj/item/slimecross/consuming/black - colour = "black" - effect_desc = "Creates a slime cookie that makes the target look like a spooky skeleton for a little bit." - cookietype = /obj/item/slime_cookie/black - -/obj/item/slime_cookie/black - name = "spooky cookie" - desc = "A pitch black cookie with an icing ghost on the front. Spooky!" - icon_state = "black" - taste = "ghosts and stuff" - -/obj/item/slime_cookie/black/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/spookcookie) - -/obj/item/slimecross/consuming/lightpink - colour = "light pink" - effect_desc = "Creates a slime cookie that makes the target, and anyone next to the target, pacifistic for a small amount of time." - cookietype = /obj/item/slime_cookie/lightpink - -/obj/item/slime_cookie/lightpink - name = "peace cookie" - desc = "A light pink cookie with a peace symbol in the icing. Lovely!" - icon_state = "lightpink" - taste = "strawberry icing and P.L.U.R" //Literal candy raver. - -/obj/item/slime_cookie/lightpink/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/peacecookie) - -/obj/item/slimecross/consuming/adamantine - colour = "adamantine" - effect_desc = "Creates a slime cookie that increases the target's resistance to burn damage." - cookietype = /obj/item/slime_cookie/adamantine - -/obj/item/slime_cookie/adamantine - name = "crystal cookie" - desc = "A translucent rock candy in the shape of a cookie. Surprisingly chewy." - icon_state = "adamantine" - taste = "crystalline sugar and metal" - -/obj/item/slime_cookie/adamantine/do_effect(mob/living/M, mob/user) - M.apply_status_effect(/datum/status_effect/adamantinecookie) - -/obj/item/slimecross/consuming/rainbow - colour = "rainbow" - effect_desc = "Creates a slime cookie that has the effect of a random cookie." - -/obj/item/slimecross/consuming/rainbow/spawncookie() - var/cookie_type = pick(subtypesof(/obj/item/slime_cookie)) - var/obj/item/slime_cookie/S = new cookie_type(get_turf(src)) - S.name = "rainbow cookie" - S.desc = "A beautiful rainbow cookie, constantly shifting colors in the light." - S.icon_state = "rainbow" - return S diff --git a/code/modules/research/xenobiology/crossbreeding/industrial.dm b/code/modules/research/xenobiology/crossbreeding/industrial.dm deleted file mode 100644 index da9387883f0c..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/industrial.dm +++ /dev/null @@ -1,199 +0,0 @@ -/* -Industrial extracts: - Slowly consume plasma, produce items with it. -*/ -/obj/item/slimecross/industrial - name = "industrial extract" - desc = "A gel-like, sturdy extract, fond of plasma and industry." - effect = "industrial" - icon_state = "industrial_still" - var/plasmarequired = 2 //Units of plasma required to be consumed to produce item. - var/itempath = /obj/item //The item produced by the extract. - var/plasmaabsorbed = 0 //Units of plasma aborbed by the extract already. Absorbs at a rate of 2u/obj tick. - var/itemamount = 1 //How many items to spawn - -/obj/item/slimecross/industrial/examine(mob/user) - . = ..() - . += "It currently has [plasmaabsorbed] units of plasma floating inside the outer shell, out of [plasmarequired] units." - -/obj/item/slimecross/industrial/proc/do_after_spawn(obj/item/spawned) - return - -/obj/item/slimecross/industrial/Initialize() - . = ..() - create_reagents(100, INJECTABLE | DRAWABLE) - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/industrial/Destroy() - STOP_PROCESSING(SSobj,src) - return ..() - -/obj/item/slimecross/industrial/process() - var/IsWorking = FALSE - if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 2) && plasmarequired > 1) //Can absorb as much as 2 - IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,2) - plasmaabsorbed += 2 - else if(reagents.has_reagent(/datum/reagent/toxin/plasma,amount = 1)) //Can absorb as little as 1 - IsWorking = TRUE - reagents.remove_reagent(/datum/reagent/toxin/plasma,1) - plasmaabsorbed += 1 - - if(plasmaabsorbed >= plasmarequired) - playsound(src, 'sound/effects/attackblob.ogg', 50, TRUE) - plasmaabsorbed -= plasmarequired - for(var/i = 0, i < itemamount, i++) - do_after_spawn(new itempath(get_turf(src))) - else if(IsWorking) - playsound(src, 'sound/effects/bubbles.ogg', 5, TRUE) - if(IsWorking) - icon_state = "industrial" - else - icon_state = "industrial_still" - -/obj/item/slimecross/industrial/grey - colour = "grey" - effect_desc = "Produces monkey cubes." - itempath = /obj/item/reagent_containers/food/snacks/monkeycube - itemamount = 5 - -/obj/item/slimecross/industrial/orange - colour = "orange" - effect_desc = "Produces slime zippo lighters." - plasmarequired = 6 - itempath = /obj/item/lighter/slime - -/obj/item/slimecross/industrial/purple - colour = "purple" - effect_desc = "Produces autoinjectors with regen jelly inside." - plasmarequired = 5 - itempath = /obj/item/slimecrossbeaker/autoinjector/regenpack - -/obj/item/slimecross/industrial/blue - colour = "blue" - effect_desc = "Produces full fire extinguishers." - plasmarequired = 10 - itempath = /obj/item/extinguisher - -/obj/item/slimecross/industrial/metal - colour = "metal" - effect_desc = "Produces metal sheets." - plasmarequired = 3 - itempath = /obj/item/stack/sheet/metal/ten - -/obj/item/slimecross/industrial/yellow - colour = "yellow" - effect_desc = "Produces high capacity power cells, which are not fully charged on creation." - plasmarequired = 5 - itempath = /obj/item/stock_parts/cell/high - -/obj/item/slimecross/industrial/yellow/do_after_spawn(obj/item/spawned) - var/obj/item/stock_parts/cell/high/C = spawned - if(istype(C)) - C.charge = rand(0,C.maxcharge/2) - -/obj/item/slimecross/industrial/darkpurple - colour = "dark purple" - effect_desc = "Produces plasma... for plasma." - plasmarequired = 10 - itempath = /obj/item/stack/sheet/mineral/plasma - -/obj/item/slimecross/industrial/darkblue - colour = "dark blue" - effect_desc = "Produces one-use fireproofing potions." - plasmarequired = 6 - itempath = /obj/item/slimepotion/fireproof - -/obj/item/slimecross/industrial/darkblue/do_after_spawn(obj/item/spawned) - var/obj/item/slimepotion/fireproof/potion = spawned - if(istype(potion)) - potion.uses = 1 - -/obj/item/slimecross/industrial/silver - colour = "silver" - effect_desc = "Produces random food and drink items." - plasmarequired = 1 - //Item picked below. - -/obj/item/slimecross/industrial/silver/process() - itempath = pick(list(get_random_food(), get_random_drink())) - ..() - -/obj/item/slimecross/industrial/bluespace - colour = "bluespace" - effect_desc = "Produces synthetic bluespace crystals." - plasmarequired = 7 - itempath = /obj/item/stack/ore/bluespace_crystal/artificial - -/obj/item/slimecross/industrial/sepia - colour = "sepia" - effect_desc = "Produces cameras." - plasmarequired = 2 - itempath = /obj/item/camera - -/obj/item/slimecross/industrial/cerulean - colour = "cerulean" - effect_desc = "Produces normal slime extract enhancers." - plasmarequired = 5 - itempath = /obj/item/slimepotion/enhancer - -/obj/item/slimecross/industrial/pyrite - colour = "pyrite" - effect_desc = "Produces cans of spraypaint." - plasmarequired = 2 - itempath = /obj/item/toy/crayon/spraycan - -/obj/item/slimecross/industrial/red - colour = "red" - effect_desc = "Produces blood orbs." - plasmarequired = 5 - itempath = /obj/item/slimecrossbeaker/bloodpack - -/obj/item/slimecross/industrial/green - colour = "green" - effect_desc = "Produces self-use-only slime jelly autoinjectors." - plasmarequired = 7 - itempath = /obj/item/slimecrossbeaker/autoinjector/slimejelly - -/obj/item/slimecross/industrial/pink - colour = "pink" - effect_desc = "Produces synthpax and space drug autoinjectors." - plasmarequired = 6 - itempath = /obj/item/slimecrossbeaker/autoinjector/peaceandlove - -/obj/item/slimecross/industrial/gold - colour = "gold" - effect_desc = "Produces random coins." - plasmarequired = 10 - -/obj/item/slimecross/industrial/gold/process() - itempath = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - ..() - -/obj/item/slimecross/industrial/oil - colour = "oil" - effect_desc = "Produces IEDs." - plasmarequired = 4 - itempath = /obj/item/grenade/iedcasing/spawned - -/obj/item/slimecross/industrial/black //What does this have to do with black slimes? No clue! Fun, though - colour = "black" - effect_desc = "Produces slime brand regenerative cigarettes." - plasmarequired = 6 - itempath = /obj/item/storage/fancy/cigarettes/cigpack_xeno - -/obj/item/slimecross/industrial/lightpink - colour = "light pink" - effect_desc = "Produces heart shaped boxes that have candies in them." - plasmarequired = 3 - itempath = /obj/item/storage/fancy/heart_box - -/obj/item/slimecross/industrial/rainbow - colour = "rainbow" - effect_desc = "Produces random slime extracts." - plasmarequired = 5 - //Item picked below. - -/obj/item/slimecross/industrial/rainbow/process() - itempath = pick(subtypesof(/obj/item/slime_extract)) - ..() diff --git a/code/modules/research/xenobiology/crossbreeding/mutative.dm b/code/modules/research/xenobiology/crossbreeding/mutative.dm deleted file mode 100644 index 043e124641ab..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/mutative.dm +++ /dev/null @@ -1,27 +0,0 @@ -/obj/item/slimecross/mutative - name = "mutative extract" - desc = "It's softly pulsing with mutagenic energy." - effect = "mutative" - icon_state = "mutative" - -/obj/item/slimecross/mutative/Initialize() - . = ..() - create_reagents(10, INJECTABLE | DRAWABLE) - -/obj/item/slimecross/mutative/attack_self(mob/user) - if(!reagents.has_reagent(/datum/reagent/toxin/plasma,10)) - to_chat(user, "This extract needs to be full of plasma to activate!") - return - reagents.remove_reagent(/datum/reagent/toxin/plasma,10) - to_chat(user, "You squeeze the extract, and it absorbs the plasma!") - playsound(src, 'sound/effects/bubbles.ogg', 50, TRUE) - playsound(src, 'sound/magic/fireball.ogg', 50, TRUE) - do_effect(user) - -/obj/item/slimecross/mutative/proc/do_effect(mob/user) //If, for whatever reason, you don't want to delete the extract, don't do ..() - qdel(src) - return - -/obj/item/slimecross/mutative/rainbow - colour = "rainbow" - effect_desc = "Hardens into a shard of slimy crystal. Prick yourself with it to bring forth a Slime Guardian." diff --git a/code/modules/research/xenobiology/crossbreeding/prismatic.dm b/code/modules/research/xenobiology/crossbreeding/prismatic.dm deleted file mode 100644 index 9cfc4542d526..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/prismatic.dm +++ /dev/null @@ -1,124 +0,0 @@ -/* -Prismatic extracts: - Becomes an infinite-use paintbrush. -*/ -/obj/item/slimecross/prismatic - name = "prismatic extract" - desc = "It's constantly wet with a semi-transparent, colored goo." - effect = "prismatic" - effect_desc = "When used it paints whatever it hits." - icon_state = "prismatic" - var/paintcolor = "#FFFFFF" - -/obj/item/slimecross/prismatic/afterattack(turf/target, mob/user, proximity) - if(!proximity) - return - if(!istype(target) || isspaceturf(target)) - return - target.add_atom_colour(paintcolor, WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) - -/obj/item/slimecross/prismatic/grey/ - colour = "grey" - desc = "It's constantly wet with a pungent-smelling, clear chemical." - -/obj/item/slimecross/prismatic/grey/afterattack(turf/target, mob/user, proximity) - . = ..() - if(!proximity) - return - if(istype(target) && target.color != initial(target.color)) - target.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - playsound(target, 'sound/effects/slosh.ogg', 20, TRUE) - -/obj/item/slimecross/prismatic/orange - paintcolor = "#FFA500" - colour = "orange" - -/obj/item/slimecross/prismatic/purple - paintcolor = "#B19CD9" - colour = "purple" - -/obj/item/slimecross/prismatic/blue - paintcolor = "#ADD8E6" - colour = "blue" - -/obj/item/slimecross/prismatic/metal - paintcolor = "#7E7E7E" - colour = "metal" - -/obj/item/slimecross/prismatic/yellow - paintcolor = "#FFFF00" - colour = "yellow" - -/obj/item/slimecross/prismatic/darkpurple - paintcolor = "#551A8B" - colour = "dark purple" - -/obj/item/slimecross/prismatic/darkblue - paintcolor = "#0000FF" - colour = "dark blue" - -/obj/item/slimecross/prismatic/silver - paintcolor = "#D3D3D3" - colour = "silver" - -/obj/item/slimecross/prismatic/bluespace - paintcolor = "#32CD32" - colour = "bluespace" - -/obj/item/slimecross/prismatic/sepia - paintcolor = "#704214" - colour = "sepia" - -/obj/item/slimecross/prismatic/cerulean - paintcolor = "#2956B2" - colour = "cerulean" - -/obj/item/slimecross/prismatic/pyrite - paintcolor = "#FAFAD2" - colour = "pyrite" - -/obj/item/slimecross/prismatic/red - paintcolor = "#FF0000" - colour = "red" - -/obj/item/slimecross/prismatic/green - paintcolor = "#00FF00" - colour = "green" - -/obj/item/slimecross/prismatic/pink - paintcolor = "#FF69B4" - colour = "pink" - -/obj/item/slimecross/prismatic/gold - paintcolor = "#FFD700" - colour = "gold" - -/obj/item/slimecross/prismatic/oil - paintcolor = "#505050" - colour = "oil" - -/obj/item/slimecross/prismatic/black - paintcolor = "#000000" - colour = "black" - -/obj/item/slimecross/prismatic/lightpink - paintcolor = "#FFB6C1" - colour = "light pink" - -/obj/item/slimecross/prismatic/adamantine - paintcolor = "#008B8B" - colour = "adamantine" - -/obj/item/slimecross/prismatic/rainbow - paintcolor = "#FFFFFF" - colour = "rainbow" - -/obj/item/slimecross/prismatic/rainbow/attack_self(mob/user) - var/newcolor = input(user, "Choose the slime color:", "Color change",paintcolor) as color|null - if(user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - return - if(!newcolor) - return - paintcolor = newcolor - return diff --git a/code/modules/research/xenobiology/crossbreeding/recurring.dm b/code/modules/research/xenobiology/crossbreeding/recurring.dm deleted file mode 100644 index 4a094744f7f8..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/recurring.dm +++ /dev/null @@ -1,138 +0,0 @@ -/* -Recurring extracts: - Generates a new charge every few seconds. - If depleted of its' last charge, stops working. -*/ -/obj/item/slimecross/recurring - name = "recurring extract" - desc = "A tiny, glowing core, wrapped in several layers of goo." - effect = "recurring" - icon_state = "recurring" - var/extract_type - var/obj/item/slime_extract/extract - var/cooldown = 0 - var/max_cooldown = 5 //In sets of 2 seconds. - -/obj/item/slimecross/recurring/Initialize() - . = ..() - extract = new extract_type(src.loc) - visible_message("[src] wraps a layer of goo around itself!") - extract.name = name - extract.desc = desc - extract.icon = icon - extract.icon_state = icon_state - extract.color = color - extract.recurring = TRUE - src.forceMove(extract) - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/recurring/process() - if(cooldown > 0) - cooldown-- - else if(extract.Uses < 10 && extract.Uses > 0) - extract.Uses++ - cooldown = max_cooldown - else if(extract.Uses <= 0) - extract.visible_message("The light inside [extract] flickers and dies out.") - extract.desc = "A tiny, inert core, bleeding dark, cerulean-colored goo." - extract.icon_state = "prismatic" - qdel(src) - -/obj/item/slimecross/recurring/Destroy() - . = ..() - STOP_PROCESSING(SSobj,src) - -/obj/item/slimecross/recurring/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/recurring/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/recurring/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/recurring/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/recurring/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - max_cooldown = 10 - -/obj/item/slimecross/recurring/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - max_cooldown = 10 - -/obj/item/slimecross/recurring/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - max_cooldown = 10 - -/obj/item/slimecross/recurring/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/recurring/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/recurring/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/recurring/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - max_cooldown = 18 //No infinite timestop for you! - -/obj/item/slimecross/recurring/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/recurring/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/recurring/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/recurring/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/recurring/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/recurring/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - max_cooldown = 15 - -/obj/item/slimecross/recurring/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" //Why would you want this? - -/obj/item/slimecross/recurring/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/recurring/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/recurring/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - max_cooldown = 10 - -/obj/item/slimecross/recurring/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" - max_cooldown = 20 //It's pretty powerful. diff --git a/code/modules/research/xenobiology/crossbreeding/regenerative.dm b/code/modules/research/xenobiology/crossbreeding/regenerative.dm deleted file mode 100644 index 75a1201d924a..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/regenerative.dm +++ /dev/null @@ -1,354 +0,0 @@ -/* -Regenerative extracts: - Work like a legion regenerative core. - Has a unique additional effect. -*/ -/obj/item/slimecross/regenerative - name = "regenerative extract" - desc = "It's filled with a milky substance, and pulses like a heartbeat." - effect = "regenerative" - icon_state = "regenerative" - - var/oxy_loss = 0 - var/tox_loss = 0 - var/fire_loss = 0 - var/brute_loss = 0 - var/stamina_loss = 0 - var/blood_loss = 100 - var/organ_loss = 3 - var/slime_heal_modifier = 1 //Specialised types only heal half - var/jelly_amount = 7.5 - var/bone_loss = FALSE - var/life_loss = FALSE - var/slime_delay = 10 - -/obj/item/slimecross/regenerative/proc/core_effect(mob/living/carbon/human/target, mob/user) - return -/obj/item/slimecross/regenerative/proc/core_effect_before(mob/living/carbon/human/target, mob/user) - return - -/obj/item/slimecross/regenerative/afterattack(atom/target,mob/user,prox) - . = ..() - if(!prox || !isliving(target)) - return - var/mob/living/H = target - if(H.stat == DEAD && life_loss) - slime_delay = 200 //Reviving the dead takes a while, 20 seconds to be exact - to_chat(user, "You begin using the [src] to try and bring [H] back from the dead...") - else - slime_delay = 10 - if(H.stat == DEAD && !life_loss) // Won't revive the dead, except for specific extracts - to_chat(user, "[src] will not work on the dead!") - return - if(H != user) - if(!do_after(user, slime_delay, H)) // 1 second delay - return FALSE - user.visible_message("[user] crushes the [src] over [H], the milky goo quickly regenerating some of [H.p_their()] injuries!", - "You squeeze the [src], and it bursts over [H], the milky goo regenerating some of [H.p_their()] injuries.") - else - if(!do_after(user, (slime_delay * 1.5), H)) // 1.5 second delay - return FALSE - user.visible_message("[user] crushes the [src] over [user.p_them()]self, the milky goo quickly regenerating some of [user.p_their()] injuries!", - "You squeeze the [src], and it bursts in your hand, splashing you with milky goo which quickly regenerates some of your injuries!") -// Slimes are good at healing clone damage, but don't heal other damage types as much. Additionally heals 15 organ damage. - core_effect_before(H, user) // can affect heal multiplier - oxy_loss = (12.5 + (H.getOxyLoss() * 0.4 * slime_heal_modifier)) - tox_loss = (12.5 + (H.getToxLoss() * 0.4 * slime_heal_modifier)) - fire_loss = (12.5 + (H.getFireLoss() * 0.4 * slime_heal_modifier)) - brute_loss = (12.5 + (H.getBruteLoss() * 0.4 * slime_heal_modifier)) - stamina_loss = (12.5 + (H.getStaminaLoss() * 0.5 * slime_heal_modifier)) - core_effect(H, user) // can affect specific healing values - H.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,jelly_amount) // Splits the healing effect across an instant heal, and a smaller heal after. - H.specific_heal(brute_amt = brute_loss, fire_amt = fire_loss, tox_amt = tox_loss, oxy_amt = oxy_loss, stam_amt = stamina_loss, organ_amt = organ_loss, clone_amt = 100, blood_amt = blood_loss, specific_bones = bone_loss, specific_revive = life_loss) - playsound(target, 'sound/effects/splat.ogg', 40, TRUE) - qdel(src) - -/obj/item/slimecross/regenerative/grey - colour = "grey" //Has no bonus effect. - effect_desc = "Partially heals the target and does nothing else." - -/obj/item/slimecross/regenerative/orange - colour = "orange" - -/obj/item/slimecross/regenerative/orange/core_effect_before(mob/living/target, mob/user) - target.visible_message("The [src] boils over!") - for(var/turf/turf in range(1,target)) - if(!locate(/obj/effect/hotspot) in turf) - new /obj/effect/hotspot(turf) - -/obj/item/slimecross/regenerative/purple - colour = "purple" - effect_desc = "Weakly heals the target, but treats toxin damage especially well. Additionally injects them with some additional regen jelly." - -/obj/item/slimecross/regenerative/purple/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.75 - -/obj/item/slimecross/regenerative/purple/core_effect(mob/living/target, mob/user) - tox_loss = (10 + (target.getBruteLoss() * 0.8)) - jelly_amount += 10 - -/obj/item/slimecross/regenerative/blue - colour = "blue" - effect_desc = "Weakly heals the target, but extra effective at treating burns. Additionally makes the floor wet." - -/obj/item/slimecross/regenerative/blue/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/blue/core_effect(mob/living/target, mob/user) - if(isturf(target.loc)) - var/turf/open/T = get_turf(target) - T.MakeSlippery(TURF_WET_WATER, min_wet_time = 10, wet_time_to_add = 5) - target.visible_message("The milky goo in the extract gets all over the floor!") - fire_loss = (10 + (target.getFireLoss() * 0.8)) - jelly_amount *= 0.2 - -/obj/item/slimecross/regenerative/metal - colour = "metal" - effect_desc = "Barely heals the target, but fixes their bones .Additionally encases the target in a locker." - -/obj/item/slimecross/regenerative/metal/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.1 - -/obj/item/slimecross/regenerative/metal/core_effect(mob/living/target, mob/user) - target.visible_message("The milky goo hardens and reshapes itself, encasing [target]!") - var/obj/structure/closet/C = new /obj/structure/closet(target.loc) - C.name = "slimy closet" - C.desc = "Looking closer, it seems to be made of a sort of solid, opaque, metal-like goo." - target.forceMove(C) - bone_loss = TRUE - jelly_amount *= 0.2 - -/obj/item/slimecross/regenerative/yellow - colour = "yellow" - effect_desc = "Partially heals the target, can revive the dead. additionally Partially recharges a single item on the target." - life_loss = TRUE //Will revive the dead. Heals normally unless target is dead, in which case it heals less. - -/obj/item/slimecross/regenerative/yellow/core_effect_before(mob/living/target, mob/user) - if(target.stat == DEAD) - slime_heal_modifier = 0.1 //use surgery to fix wounds - else - slime_heal_modifier = 0.75 //discourages spamming these to revive a target, combine with other cores - -/obj/item/slimecross/regenerative/yellow/core_effect(mob/living/target, mob/user) - var/list/batteries = list() - for(var/obj/item/stock_parts/cell/C in target.GetAllContents()) - if(C.charge < C.maxcharge) - batteries += C - if(batteries.len) - var/obj/item/stock_parts/cell/ToCharge = pick(batteries) - ToCharge.charge = ToCharge.maxcharge - to_chat(target, "You feel a strange electrical pulse, and one of your electrical items was recharged.") - if(target.stat == DEAD) - blood_loss = 100 - organ_loss = 30 // More effective at fixing organs if the target is dead - jelly_amount *= 0.2 - target.visible_message("The [src] sparks as it tries to revive [target]!") - -/obj/item/slimecross/regenerative/darkpurple - colour = "dark purple" - effect_desc = "Partially heals the target and gives them purple clothing if they are naked." - -/obj/item/slimecross/regenerative/darkpurple/core_effect(mob/living/target, mob/user) - var/equipped = 0 - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/shoes/sneakers/purple(null), ITEM_SLOT_FEET) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/under/color/lightpurple(null), ITEM_SLOT_ICLOTHING) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/gloves/color/purple(null), ITEM_SLOT_GLOVES) - equipped += target.equip_to_slot_or_del(new /obj/item/clothing/head/soft/purple(null), ITEM_SLOT_HEAD) - if(equipped > 0) - target.visible_message("The milky goo congeals into clothing!") - -/obj/item/slimecross/regenerative/darkblue - colour = "dark blue" - effect_desc = "Partially heals the target and fireproofs their clothes." - -/obj/item/slimecross/regenerative/darkblue/core_effect(mob/living/target, mob/user) - if(!ishuman(target)) - return - var/mob/living/carbon/human/H = target - var/fireproofed = FALSE - if(H.get_item_by_slot(ITEM_SLOT_OCLOTHING)) - fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_OCLOTHING) - fireproof(C) - if(H.get_item_by_slot(ITEM_SLOT_HEAD)) - fireproofed = TRUE - var/obj/item/clothing/C = H.get_item_by_slot(ITEM_SLOT_HEAD) - fireproof(C) - if(fireproofed) - target.visible_message("Some of [target]'s clothing gets coated in the goo, and turns blue!") - -/obj/item/slimecross/regenerative/darkblue/proc/fireproof(obj/item/clothing/C) - C.name = "fireproofed [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - C.resistance_flags |= FIRE_PROOF - -/obj/item/slimecross/regenerative/silver - colour = "silver" - effect_desc = "Partially heals the target and makes their belly feel round and full." - -/obj/item/slimecross/regenerative/silver/core_effect(mob/living/target, mob/user) - target.set_nutrition(NUTRITION_LEVEL_FULL - 1) - to_chat(target, "You feel satiated.") - -/obj/item/slimecross/regenerative/bluespace - colour = "bluespace" - effect_desc = "Partially heals the target and teleports them to where this core was created." - var/turf/open/T - -/obj/item/slimecross/regenerative/bluespace/core_effect(mob/living/target, mob/user) - target.visible_message("[src] disappears in a shower of sparks!","The milky goo teleports you somewhere it remembers!") - do_sparks(5,FALSE,target) - target.forceMove(T) - do_sparks(5,FALSE,target) - -/obj/item/slimecross/regenerative/bluespace/Initialize() - . = ..() - T = get_turf(src) - -/obj/item/slimecross/regenerative/sepia - colour = "sepia" - effect_desc = "Partially heals the target and stops time." - -/obj/item/slimecross/regenerative/sepia/core_effect_before(mob/living/target, mob/user) - to_chat(target, "You try to forget how you feel.") - target.AddComponent(/datum/component/dejavu) - -/obj/item/slimecross/regenerative/cerulean - colour = "cerulean" - effect_desc = "Slightly heals the target, but provides a boost of oxygen for a while. Additionally makes a second regenerative core with no special effects." - -/obj/item/slimecross/regenerative/cerulean/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/cerulean/core_effect(mob/living/target, mob/user) - src.forceMove(user.loc) - var/obj/item/slimecross/X = new /obj/item/slimecross/regenerative(user.loc) - X.name = name - X.desc = desc - user.put_in_active_hand(X) - oxy_loss = 150 - target.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) //Similar to the luminescent effect, lets you breathe without oxygen for a while. - to_chat(user, "Some of the milky goo congeals in your hand!") - -/obj/item/slimecross/regenerative/pyrite - colour = "pyrite" - effect_desc = "Partially heals and randomly colors the target." - -/obj/item/slimecross/regenerative/pyrite/core_effect(mob/living/target, mob/user) - target.visible_message("The milky goo coating [target] leaves [target.p_them()] a different color!") - target.add_atom_colour(rgb(rand(0,255),rand(0,255),rand(0,255)),WASHABLE_COLOUR_PRIORITY) - -/obj/item/slimecross/regenerative/red - colour = "red" - effect_desc = "Slightly heals the target and injects them with a lot of blood, what a rush!" - -/obj/item/slimecross/regenerative/red/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/red/core_effect(mob/living/target, mob/user) - to_chat(target, "You feel... faster.") - target.reagents.add_reagent(/datum/reagent/medicine/ephedrine,3) - blood_loss += 700 - -/obj/item/slimecross/regenerative/green - colour = "green" - effect_desc = "Weakly heals the target, but fixes their organs .Additionally changes the spieces or color of a slime or jellyperson." - -/obj/item/slimecross/regenerative/green/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.5 - -/obj/item/slimecross/regenerative/green/core_effect(mob/living/target, mob/user) - if(isslime(target)) - target.visible_message("The [target] suddenly changes color!") - var/mob/living/simple_animal/slime/S = target - S.random_colour() - organ_loss += 17 - - -/obj/item/slimecross/regenerative/pink - colour = "pink" - effect_desc = "Partially heals the target and injects them with some krokodil." - -/obj/item/slimecross/regenerative/pink/core_effect(mob/living/target, mob/user) - to_chat(target, "You feel more calm.") - target.reagents.add_reagent(/datum/reagent/drug/krokodil,4) - -/obj/item/slimecross/regenerative/gold - colour = "gold" - effect_desc = "Partially heals the target and produces a random coin." - -/obj/item/slimecross/regenerative/gold/core_effect(mob/living/target, mob/user) - var/newcoin = pick(/obj/item/coin/silver, /obj/item/coin/iron, /obj/item/coin/gold, /obj/item/coin/diamond, /obj/item/coin/plasma, /obj/item/coin/uranium) - var/obj/item/coin/C = new newcoin(target.loc) - playsound(C, 'sound/items/coinflip.ogg', 50, TRUE) - target.put_in_hand(C) - -/obj/item/slimecross/regenerative/oil - colour = "oil" - effect_desc = "Partially heals the target and flashes everyone in sight." - -/obj/item/slimecross/regenerative/oil/core_effect(mob/living/target, mob/user) - playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) - for(var/mob/living/L in view(user,7)) - L.flash_act() - -/obj/item/slimecross/regenerative/black - colour = "black" - effect_desc = "Partially heals the target and creates a duplicate of them, that drops dead soon after." - -/obj/item/slimecross/regenerative/black/core_effect_before(mob/living/target, mob/user) - var/dummytype = target.type - var/mob/living/dummy = new dummytype(target.loc) - to_chat(target, "The milky goo flows from your skin, forming an imperfect copy of you.") - if(iscarbon(target)) - var/mob/living/carbon/T = target - var/mob/living/carbon/D = dummy - T.dna.transfer_identity(D) - D.updateappearance(mutcolor_update=1) - D.real_name = T.real_name - dummy.adjustBruteLoss(target.getBruteLoss()) - dummy.adjustFireLoss(target.getFireLoss()) - dummy.adjustToxLoss(target.getToxLoss()) - dummy.adjustOxyLoss(200) - -/obj/item/slimecross/regenerative/lightpink - colour = "light pink" - effect_desc = "Partially heals the target and also heals the user." - -// Doesn't heal the user as much as the target -/obj/item/slimecross/regenerative/lightpink/core_effect(mob/living/target, mob/user) - if(!isliving(user)) - return - if(target == user) - return - var/mob/living/U = user - var/oxy_loss = (10 + (U.getOxyLoss() * 0.3)) - var/tox_loss = (10 + (U.getToxLoss() * 0.3)) - var/fire_loss = (10 + (U.getFireLoss() * 0.3)) - var/brute_loss = (10 + (U.getBruteLoss() * 0.3)) - var/stamina_loss = (10 + (U.getStaminaLoss() * 0.35)) - U.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) // Splits the healing effect across an instant heal, and a smaller heal after. - U.specific_heal(brute_amt = brute_loss, fire_amt = fire_loss, tox_amt = tox_loss, oxy_amt = oxy_loss, stam_amt = stamina_loss, organ_amt = 2, clone_amt = 100) - to_chat(U, "Some of the milky goo sprays onto you, as well!") - -/obj/item/slimecross/regenerative/adamantine - colour = "adamantine" - effect_desc = "weakly heals the target, but extra effective at treating brute trauma. Additionally boosts their armor." - -/obj/item/slimecross/regenerative/adamantine/core_effect_before(mob/living/target, mob/user) - slime_heal_modifier = 0.3 - -/obj/item/slimecross/regenerative/adamantine/core_effect(mob/living/target, mob/user) //WIP - Find out why this doesn't work. - target.apply_status_effect(STATUS_EFFECT_SLIMESKIN) - brute_loss = (10 + (target.getBruteLoss() * 0.65)) //most common damage type, let's not go overboard - jelly_amount *= 0.5 - -/obj/item/slimecross/regenerative/rainbow - colour = "rainbow" - effect_desc = "Partially heals the target and temporarily makes them immortal, but pacifistic." - -/obj/item/slimecross/regenerative/rainbow/core_effect(mob/living/target, mob/user) - target.apply_status_effect(STATUS_EFFECT_RAINBOWPROTECTION) diff --git a/code/modules/research/xenobiology/crossbreeding/reproductive.dm b/code/modules/research/xenobiology/crossbreeding/reproductive.dm deleted file mode 100644 index f51c5a271177..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/reproductive.dm +++ /dev/null @@ -1,133 +0,0 @@ -/* -Reproductive extracts: - When fed three monkey cubes, produces between - 1 and 4 normal slime extracts of the same colour. -*/ -/obj/item/slimecross/reproductive - name = "reproductive extract" - desc = "It pulses with a strange hunger." - icon_state = "reproductive" - effect = "reproductive" - effect_desc = "When fed monkey cubes it produces more extracts. Bio bag compatible as well." - var/extract_type = /obj/item/slime_extract/ - var/cubes_eaten = 0 - var/last_produce = 0 - var/cooldown = 30 // 3 seconds. - -/obj/item/slimecross/reproductive/attackby(obj/item/O, mob/user) - if((last_produce + cooldown) > world.time) - to_chat(user, "[src] is still digesting!") - return - if(istype(O, /obj/item/storage/bag/bio)) - var/list/inserted = list() - SEND_SIGNAL(O, COMSIG_TRY_STORAGE_TAKE_TYPE, /obj/item/reagent_containers/food/snacks/monkeycube, src, 1, null, null, user, inserted) - if(inserted.len) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = inserted[1] - if(istype(M)) - eat_cube(M, user) - else - to_chat(user, "There are no monkey cubes in the bio bag!") - if(istype(O,/obj/item/reagent_containers/food/snacks/monkeycube)) - eat_cube(O, user) - if(cubes_eaten >= 3) - var/cores = rand(1,4) - visible_message("[src] briefly swells to a massive size, and expels [cores] extract[cores > 1 ? "s":""]!") - playsound(src, 'sound/effects/splat.ogg', 40, TRUE) - last_produce = world.time - for(var/i = 0, i < cores, i++) - new extract_type(get_turf(loc)) - cubes_eaten = 0 - -/obj/item/slimecross/reproductive/proc/eat_cube(obj/item/reagent_containers/food/snacks/monkeycube, mob/user) - qdel(monkeycube) - cubes_eaten++ - to_chat(user, "You feed [monkeycube] to [src], and it pulses gently.") - playsound(src, 'sound/items/eatfood.ogg', 20, TRUE) - -/obj/item/slimecross/reproductive/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/reproductive/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/reproductive/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/reproductive/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/reproductive/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - -/obj/item/slimecross/reproductive/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - -/obj/item/slimecross/reproductive/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - -/obj/item/slimecross/reproductive/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/reproductive/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/reproductive/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/reproductive/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - -/obj/item/slimecross/reproductive/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/reproductive/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/reproductive/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/reproductive/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/reproductive/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/reproductive/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - -/obj/item/slimecross/reproductive/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" - -/obj/item/slimecross/reproductive/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/reproductive/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/reproductive/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - -/obj/item/slimecross/reproductive/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm b/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm deleted file mode 100644 index 814083c3bb50..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/selfsustaining.dm +++ /dev/null @@ -1,149 +0,0 @@ -/* -Self-sustaining extracts: - Produces 4 extracts that do not need reagents. -*/ -/obj/item/slimecross/selfsustaining - name = "self-sustaining extract" - effect = "self-sustaining" - icon_state = "selfsustaining" - var/extract_type = /obj/item/slime_extract - -/obj/item/autoslime - name = "autoslime" - desc = "It resembles a normal slime extract, but seems filled with a strange, multi-colored fluid." - var/obj/item/slime_extract/extract - var/effect_desc = "A self-sustaining slime extract. When used, lets you choose which reaction you want." - -//Just divides into the actual item. -/obj/item/slimecross/selfsustaining/Initialize() - ..() - visible_message("The [src] shudders, and splits into four smaller extracts.") - for(var/i = 0, i < 4, i++) - var/obj/item/autoslime/A = new /obj/item/autoslime(src.loc) - var/obj/item/slime_extract/X = new extract_type(A) - A.extract = X - A.icon = icon - A.icon_state = icon_state - A.color = color - A.name = "self-sustaining " + colour + " extract" - return INITIALIZE_HINT_QDEL - -/obj/item/autoslime/Initialize() - return ..() - -/obj/item/autoslime/attack_self(mob/user) - var/reagentselect = input(user, "Choose the reagent the extract will produce.", "Self-sustaining Reaction") as null|anything in sortList(extract.activate_reagents, /proc/cmp_typepaths_asc) - var/amount = 5 - var/secondary - - if (user.get_active_held_item() != src || user.stat != CONSCIOUS || HAS_TRAIT(user, TRAIT_HANDS_BLOCKED)) - return - if(!reagentselect) - return - if(reagentselect == "lesser plasma") - amount = 4 - reagentselect = /datum/reagent/toxin/plasma - if(reagentselect == "holy water and uranium") - reagentselect = /datum/reagent/water/holywater - secondary = /datum/reagent/uranium - extract.forceMove(user.drop_location()) - qdel(src) - user.put_in_active_hand(extract) - extract.reagents.add_reagent(reagentselect,amount) - if(secondary) - extract.reagents.add_reagent(secondary,amount) - -/obj/item/autoslime/examine(mob/user) - . = ..() - if(effect_desc) - . += "[effect_desc]" - -//Different types. - -/obj/item/slimecross/selfsustaining/grey - extract_type = /obj/item/slime_extract/grey - colour = "grey" - -/obj/item/slimecross/selfsustaining/orange - extract_type = /obj/item/slime_extract/orange - colour = "orange" - -/obj/item/slimecross/selfsustaining/purple - extract_type = /obj/item/slime_extract/purple - colour = "purple" - -/obj/item/slimecross/selfsustaining/blue - extract_type = /obj/item/slime_extract/blue - colour = "blue" - -/obj/item/slimecross/selfsustaining/metal - extract_type = /obj/item/slime_extract/metal - colour = "metal" - -/obj/item/slimecross/selfsustaining/yellow - extract_type = /obj/item/slime_extract/yellow - colour = "yellow" - -/obj/item/slimecross/selfsustaining/darkpurple - extract_type = /obj/item/slime_extract/darkpurple - colour = "dark purple" - -/obj/item/slimecross/selfsustaining/darkblue - extract_type = /obj/item/slime_extract/darkblue - colour = "dark blue" - -/obj/item/slimecross/selfsustaining/silver - extract_type = /obj/item/slime_extract/silver - colour = "silver" - -/obj/item/slimecross/selfsustaining/bluespace - extract_type = /obj/item/slime_extract/bluespace - colour = "bluespace" - -/obj/item/slimecross/selfsustaining/sepia - extract_type = /obj/item/slime_extract/sepia - colour = "sepia" - -/obj/item/slimecross/selfsustaining/cerulean - extract_type = /obj/item/slime_extract/cerulean - colour = "cerulean" - -/obj/item/slimecross/selfsustaining/pyrite - extract_type = /obj/item/slime_extract/pyrite - colour = "pyrite" - -/obj/item/slimecross/selfsustaining/red - extract_type = /obj/item/slime_extract/red - colour = "red" - -/obj/item/slimecross/selfsustaining/green - extract_type = /obj/item/slime_extract/green - colour = "green" - -/obj/item/slimecross/selfsustaining/pink - extract_type = /obj/item/slime_extract/pink - colour = "pink" - -/obj/item/slimecross/selfsustaining/gold - extract_type = /obj/item/slime_extract/gold - colour = "gold" - -/obj/item/slimecross/selfsustaining/oil - extract_type = /obj/item/slime_extract/oil - colour = "oil" - -/obj/item/slimecross/selfsustaining/black - extract_type = /obj/item/slime_extract/black - colour = "black" - -/obj/item/slimecross/selfsustaining/lightpink - extract_type = /obj/item/slime_extract/lightpink - colour = "light pink" - -/obj/item/slimecross/selfsustaining/adamantine - extract_type = /obj/item/slime_extract/adamantine - colour = "adamantine" - -/obj/item/slimecross/selfsustaining/rainbow - extract_type = /obj/item/slime_extract/rainbow - colour = "rainbow" diff --git a/code/modules/research/xenobiology/crossbreeding/stabilized.dm b/code/modules/research/xenobiology/crossbreeding/stabilized.dm deleted file mode 100644 index eee23636f780..000000000000 --- a/code/modules/research/xenobiology/crossbreeding/stabilized.dm +++ /dev/null @@ -1,190 +0,0 @@ -/* -Stabilized extracts: - Provides a passive buff to the holder. -*/ - -//To add: Create an effect in crossbreeding/_status_effects.dm with the name "/datum/status_effect/stabilized/[color]" -//Status effect will automatically be applied while held, and lost on drop. - -/obj/item/slimecross/stabilized - name = "stabilized extract" - desc = "It seems inert, but anything it touches glows softly..." - effect = "stabilized" - icon_state = "stabilized" - var/datum/status_effect/linked_effect - var/mob/living/owner - -/obj/item/slimecross/stabilized/Initialize() - . = ..() - START_PROCESSING(SSobj,src) - -/obj/item/slimecross/stabilized/Destroy() - STOP_PROCESSING(SSobj,src) - qdel(linked_effect) - return ..() - -/obj/item/slimecross/stabilized/process() - var/humanfound = null - if(ishuman(loc)) - humanfound = loc - if(ishuman(loc.loc)) //Check if in backpack. - humanfound = (loc.loc) - if(!humanfound) - return - var/mob/living/carbon/human/H = humanfound - var/effectpath = /datum/status_effect/stabilized - var/static/list/effects = subtypesof(/datum/status_effect/stabilized) - for(var/X in effects) - var/datum/status_effect/stabilized/S = X - if(initial(S.colour) == colour) - effectpath = S - break - if(!H.has_status_effect(effectpath)) - var/datum/status_effect/stabilized/S = H.apply_status_effect(effectpath) - owner = H - S.linked_extract = src - STOP_PROCESSING(SSobj,src) - - - -//Colors and subtypes: -/obj/item/slimecross/stabilized/grey - colour = "grey" - effect_desc = "Makes slimes friendly to the owner" - -/obj/item/slimecross/stabilized/orange - colour = "orange" - effect_desc = "Passively tries to increase or decrease the owner's body temperature to normal" - -/obj/item/slimecross/stabilized/purple - colour = "purple" - effect_desc = "Provides a regeneration effect" - -/obj/item/slimecross/stabilized/blue - colour = "blue" - effect_desc = "Makes the owner immune to slipping on water, soap or foam. Space lube and ice are still too slippery." - -/obj/item/slimecross/stabilized/metal - colour = "metal" - effect_desc = "Every 30 seconds, adds a sheet of material to a random stack in the owner's backpack." - -/obj/item/slimecross/stabilized/yellow - colour = "yellow" - effect_desc = "Every ten seconds it recharges a device on the owner by 10%." - -/obj/item/slimecross/stabilized/darkpurple - colour = "dark purple" - effect_desc = "Gives you burning fingertips, automatically cooking any microwavable food you hold." - -/obj/item/slimecross/stabilized/darkblue - colour = "dark blue" - effect_desc = "Slowly extinguishes the owner if they are on fire, also wets items like monkey cubes, creating a monkey." - -/obj/item/slimecross/stabilized/silver - colour = "silver" - effect_desc = "Slows the rate at which the owner loses nutrition" - -/obj/item/slimecross/stabilized/bluespace - colour = "bluespace" - effect_desc = "On a two minute cooldown, when the owner has taken enough damage, they are teleported to a safe place." - -/obj/item/slimecross/stabilized/sepia - colour = "sepia" - effect_desc = "Randomly adjusts the owner's speed." - -/obj/item/slimecross/stabilized/cerulean - colour = "cerulean" - effect_desc = "Creates a duplicate of the owner. If the owner dies they will take control of the duplicate, unless the death was from beheading or gibbing." - -/obj/item/slimecross/stabilized/pyrite - colour = "pyrite" - effect_desc = "Randomly colors the owner every few seconds." - -/obj/item/slimecross/stabilized/red - colour = "red" - effect_desc = "Nullifies all equipment based slowdowns." - -/obj/item/slimecross/stabilized/green - colour = "green" - effect_desc = "Changes the owner's name and appearance while holding this extract." - -/obj/item/slimecross/stabilized/pink - colour = "pink" - effect_desc = "As long as no creatures are harmed in the owner's presense, they will not attack you. If the peace is broken it takes two minutes to restore." - -/obj/item/slimecross/stabilized/gold - colour = "gold" - effect_desc = "Creates a pet when held." - var/mob_type - var/datum/mind/saved_mind - var/mob_name = "Familiar" - -/obj/item/slimecross/stabilized/gold/proc/generate_mobtype() - var/static/list/mob_spawn_pets = list() - if(mob_spawn_pets.len <= 0) - for(var/T in typesof(/mob/living/simple_animal)) - var/mob/living/simple_animal/SA = T - switch(initial(SA.gold_core_spawnable)) - if(FRIENDLY_SPAWN) - mob_spawn_pets += T - mob_type = pick(mob_spawn_pets) - -/obj/item/slimecross/stabilized/gold/Initialize() - . = ..() - generate_mobtype() - -/obj/item/slimecross/stabilized/gold/attack_self(mob/user) - var/choice = input(user, "Which do you want to reset?", "Familiar Adjustment") as null|anything in sortList(list("Familiar Location", "Familiar Species", "Familiar Sentience", "Familiar Name")) - if(!user.canUseTopic(src, BE_CLOSE)) - return - if(isliving(user)) - var/mob/living/L = user - if(L.has_status_effect(/datum/status_effect/stabilized/gold)) - L.remove_status_effect(/datum/status_effect/stabilized/gold) - if(choice == "Familiar Location") - to_chat(user, "You prod [src], and it shudders slightly.") - START_PROCESSING(SSobj, src) - if(choice == "Familiar Species") - to_chat(user, "You squeeze [src], and a shape seems to shift around inside.") - generate_mobtype() - START_PROCESSING(SSobj, src) - if(choice == "Familiar Sentience") - to_chat(user, "You poke [src], and it lets out a glowing pulse.") - saved_mind = null - START_PROCESSING(SSobj, src) - if(choice == "Familiar Name") - var/newname = sanitize_name(stripped_input(user, "Would you like to change the name of [mob_name]", "Name change", mob_name, MAX_NAME_LEN)) - if(newname) - mob_name = newname - to_chat(user, "You speak softly into [src], and it shakes slightly in response.") - START_PROCESSING(SSobj, src) - -/obj/item/slimecross/stabilized/oil - colour = "oil" - effect_desc = "The owner will violently explode when they die while holding this extract." - -/obj/item/slimecross/stabilized/black - colour = "black" - effect_desc = "While strangling someone, the owner's hands melt around their neck, draining their life in exchange for food and healing." - -/obj/item/slimecross/stabilized/lightpink - colour = "light pink" - effect_desc = "The owner moves at high speeds while holding this extract, also stabilizes anyone in critical condition around you using Epinephrine." - -/obj/item/slimecross/stabilized/adamantine - colour = "adamantine" - effect_desc = "Owner gains a slight boost in damage resistance to all types." - -/obj/item/slimecross/stabilized/rainbow - colour = "rainbow" - effect_desc = "Accepts a regenerative extract and automatically uses it if the owner enters a critical condition." - var/obj/item/slimecross/regenerative/regencore - -/obj/item/slimecross/stabilized/rainbow/attackby(obj/item/O, mob/user) - var/obj/item/slimecross/regenerative/regen = O - if(istype(regen) && !regencore) - to_chat(user, "You place [O] in [src], prepping the extract for automatic application!") - regencore = regen - regen.forceMove(src) - return - return ..() diff --git a/code/modules/research/xenobiology/xenobio_camera.dm b/code/modules/research/xenobiology/xenobio_camera.dm deleted file mode 100644 index 81ac7db98b01..000000000000 --- a/code/modules/research/xenobiology/xenobio_camera.dm +++ /dev/null @@ -1,473 +0,0 @@ -//Xenobio control console -/mob/camera/aiEye/remote/xenobio - visible_icon = TRUE - icon = 'icons/mob/cameramob.dmi' - icon_state = "generic_camera" - var/allowed_area = null - -/mob/camera/aiEye/remote/xenobio/Initialize() - var/area/A = get_area(loc) - allowed_area = A.name - . = ..() - -/mob/camera/aiEye/remote/xenobio/setLoc(t) - var/area/new_area = get_area(t) - if(new_area && new_area.name == allowed_area || new_area && (new_area.area_flags & XENOBIOLOGY_COMPATIBLE)) - return ..() - else - return - -/obj/machinery/computer/camera_advanced/xenobio - name = "Slime management console" - desc = "A computer used for remotely handling slimes." - networks = list("ss13") - circuit = /obj/item/circuitboard/computer/xenobiology - var/datum/action/innate/slime_place/slime_place_action - var/datum/action/innate/slime_pick_up/slime_up_action - var/datum/action/innate/feed_slime/feed_slime_action - var/datum/action/innate/monkey_recycle/monkey_recycle_action - var/datum/action/innate/slime_scan/scan_action - var/datum/action/innate/feed_potion/potion_action - var/datum/action/innate/hotkey_help/hotkey_help - - var/obj/machinery/monkey_recycler/connected_recycler - var/list/stored_slimes - var/obj/item/slimepotion/slime/current_potion - var/max_slimes = 5 - var/monkeys = 0 - - icon_screen = "slime_comp" - icon_keyboard = "rd_key" - - light_color = LIGHT_COLOR_PINK - -/obj/machinery/computer/camera_advanced/xenobio/Initialize(mapload) - . = ..() - slime_place_action = new - slime_up_action = new - feed_slime_action = new - monkey_recycle_action = new - scan_action = new - potion_action = new - hotkey_help = new - stored_slimes = list() - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/Destroy() - QDEL_NULL(current_potion) - for(var/thing in stored_slimes) - var/mob/living/simple_animal/slime/S = thing - S.forceMove(drop_location()) - stored_slimes.Cut() - if(connected_recycler) - connected_recycler.connected -= src - connected_recycler = null - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/handle_atom_del(atom/A) - if(A == current_potion) - current_potion = null - if(A in stored_slimes) - stored_slimes -= A - return ..() - -/obj/machinery/computer/camera_advanced/xenobio/CreateEye() - eyeobj = new /mob/camera/aiEye/remote/xenobio(get_turf(src)) - eyeobj.origin = src - eyeobj.visible_icon = TRUE - eyeobj.icon = 'icons/mob/cameramob.dmi' - eyeobj.icon_state = "generic_camera" - -/obj/machinery/computer/camera_advanced/xenobio/GrantActions(mob/living/user) - ..() - - if(slime_up_action) - slime_up_action.target = src - slime_up_action.Grant(user) - actions += slime_up_action - - if(slime_place_action) - slime_place_action.target = src - slime_place_action.Grant(user) - actions += slime_place_action - - if(feed_slime_action) - feed_slime_action.target = src - feed_slime_action.Grant(user) - actions += feed_slime_action - - if(monkey_recycle_action) - monkey_recycle_action.target = src - monkey_recycle_action.Grant(user) - actions += monkey_recycle_action - - if(scan_action) - scan_action.target = src - scan_action.Grant(user) - actions += scan_action - - if(potion_action) - potion_action.target = src - potion_action.Grant(user) - actions += potion_action - - if(hotkey_help) - hotkey_help.target = src - hotkey_help.Grant(user) - actions += hotkey_help - - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL, PROC_REF(XenoSlimeClickCtrl)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT, PROC_REF(XenoSlimeClickAlt)) - RegisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT, PROC_REF(XenoSlimeClickShift)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT, PROC_REF(XenoTurfClickShift)) - RegisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL, PROC_REF(XenoTurfClickCtrl)) - RegisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL, PROC_REF(XenoMonkeyClickCtrl)) - - //Checks for recycler on every interact, prevents issues with load order on certain maps. - if(!connected_recycler) - for(var/obj/machinery/monkey_recycler/recycler in GLOB.monkey_recyclers) - if(get_area(recycler.loc) == get_area(loc)) - connected_recycler = recycler - connected_recycler.connected += src - -/obj/machinery/computer/camera_advanced/xenobio/remove_eye_control(mob/living/user) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_ALT) - UnregisterSignal(user, COMSIG_XENO_SLIME_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_SHIFT) - UnregisterSignal(user, COMSIG_XENO_TURF_CLICK_CTRL) - UnregisterSignal(user, COMSIG_XENO_MONKEY_CLICK_CTRL) - ..() - -/obj/machinery/computer/camera_advanced/xenobio/attackby(obj/item/O, mob/user, params) - if(istype(O, /obj/item/reagent_containers/food/snacks/monkeycube)) - monkeys++ - to_chat(user, "You feed [O] to [src]. It now has [monkeys] monkey cubes stored.") - qdel(O) - return - else if(istype(O, /obj/item/storage/bag)) - var/obj/item/storage/P = O - var/loaded = FALSE - for(var/obj/G in P.contents) - if(istype(G, /obj/item/reagent_containers/food/snacks/monkeycube)) - loaded = TRUE - monkeys++ - qdel(G) - if(loaded) - to_chat(user, "You fill [src] with the monkey cubes stored in [O]. [src] now has [monkeys] monkey cubes stored.") - return - else if(istype(O, /obj/item/slimepotion/slime)) - var/replaced = FALSE - if(user && !user.transferItemToLoc(O, src)) - return - if(!QDELETED(current_potion)) - current_potion.forceMove(drop_location()) - replaced = TRUE - current_potion = O - to_chat(user, "You load [O] in the console's potion slot[replaced ? ", replacing the one that was there before" : ""].") - return - ..() - -/obj/machinery/computer/camera_advanced/xenobio/multitool_act(mob/living/user, obj/item/multitool/I) - . = ..() - if (istype(I) && istype(I.buffer,/obj/machinery/monkey_recycler)) - to_chat(user, "You link [src] with [I.buffer] in [I] buffer.") - connected_recycler = I.buffer - connected_recycler.connected += src - return TRUE - -/datum/action/innate/slime_place - name = "Place Slimes" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_down" - -/datum/action/innate/slime_place/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(remote_eye.loc) - S.visible_message("[S] warps in!") - X.stored_slimes -= S - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/slime_pick_up - name = "Pick up Slime" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_up" - -/datum/action/innate/slime_pick_up/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - if(X.stored_slimes.len >= X.max_slimes) - break - if(!S.ckey) - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - - -/datum/action/innate/feed_slime - name = "Feed Slimes" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_down" - -/datum/action/innate/feed_slime/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - if(X.monkeys >= 1) - var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(remote_eye.loc, TRUE, owner) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - to_chat(owner, "[X] now has [X.monkeys] monkeys stored.") - else - to_chat(owner, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - - -/datum/action/innate/monkey_recycle - name = "Recycle Monkeys" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "monkey_up" - -/datum/action/innate/monkey_recycle/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - var/obj/machinery/monkey_recycler/recycler = X.connected_recycler - - if(!recycler) - to_chat(owner, "There is no connected monkey recycler. Use a multitool to link one.") - return - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/carbon/monkey/M in remote_eye.loc) - if(M.stat) - M.visible_message("[M] vanishes as [M.p_theyre()] reclaimed for recycling!") - recycler.use_power(500) - X.monkeys += recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(owner, "[X] now has [X.monkeys] monkeys available.") - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/slime_scan - name = "Scan Slime" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_scan" - -/datum/action/innate/slime_scan/Activate() - if(!target || !isliving(owner)) - return - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - slime_scan(S, C) - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/feed_potion - name = "Apply Potion" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "slime_potion" - -/datum/action/innate/feed_potion/Activate() - if(!target || !isliving(owner)) - return - - var/mob/living/C = owner - var/mob/camera/aiEye/remote/xenobio/remote_eye = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = target - - if(QDELETED(X.current_potion)) - to_chat(owner, "No potion loaded.") - return - - if(GLOB.cameranet.checkTurfVis(remote_eye.loc)) - for(var/mob/living/simple_animal/slime/S in remote_eye.loc) - X.current_potion.attack(S, C) - break - else - to_chat(owner, "Target is not near a camera. Cannot proceed.") - -/datum/action/innate/hotkey_help - name = "Hotkey Help" - icon_icon = 'icons/mob/actions/actions_silicon.dmi' - button_icon_state = "hotkey_help" - -/datum/action/innate/hotkey_help/Activate() - if(!target || !isliving(owner)) - return - to_chat(owner, "Click shortcuts:") - to_chat(owner, "Shift-click a slime to pick it up, or the floor to drop all held slimes.") - to_chat(owner, "Ctrl-click a slime to scan it.") - to_chat(owner, "Alt-click a slime to feed it a potion.") - to_chat(owner, "Ctrl-click or a dead monkey to recycle it, or the floor to place a new monkey.") - -// -// Alternate clicks for slime, monkey and open turf if using a xenobio console - -// Scans slime -/mob/living/simple_animal/slime/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_CTRL, src) - ..() - -//Feeds a potion to slime -/mob/living/simple_animal/slime/AltClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_ALT, src) - ..() - -//Picks up slime -/mob/living/simple_animal/slime/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_SLIME_CLICK_SHIFT, src) - ..() - -//Place slimes -/turf/open/ShiftClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_SHIFT, src) - ..() - -//Place monkey -/turf/open/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_TURF_CLICK_CTRL, src) - ..() - -//Pick up monkey -/mob/living/carbon/monkey/CtrlClick(mob/user) - SEND_SIGNAL(user, COMSIG_XENO_MONKEY_CLICK_CTRL, src) - ..() - -// Scans slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickCtrl(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - slime_scan(S, C) - -//Feeds a potion to slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickAlt(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(QDELETED(X.current_potion)) - to_chat(C, "No potion loaded.") - return - if(mobarea.name == E.allowed_area ||(mobarea & XENOBIOLOGY_COMPATIBLE)) - X.current_potion.attack(S, C) - -//Picks up slime -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoSlimeClickShift(mob/living/user, mob/living/simple_animal/slime/S) - if(!GLOB.cameranet.checkTurfVis(S.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(S.loc) - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - if(X.stored_slimes.len >= X.max_slimes) - to_chat(C, "Slime storage is full.") - return - if(S.ckey) - to_chat(C, "The slime wiggled free!") - return - if(S.buckled) - S.Feedstop(silent = TRUE) - S.visible_message("[S] vanishes in a flash of light!") - S.forceMove(X) - X.stored_slimes += S - -//Place slimes -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickShift(mob/living/user, turf/open/T) - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) - for(var/mob/living/simple_animal/slime/S in X.stored_slimes) - S.forceMove(T) - S.visible_message("[S] warps in!") - X.stored_slimes -= S - -//Place monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoTurfClickCtrl(mob/living/user, turf/open/T) - if(!GLOB.cameranet.checkTurfVis(T)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/turfarea = get_area(T) - if(turfarea.name == E.allowed_area || (turfarea & XENOBIOLOGY_COMPATIBLE)) - if(X.monkeys >= 1) - var/mob/living/carbon/monkey/food = new /mob/living/carbon/monkey(T, TRUE, C) - if (!QDELETED(food)) - food.LAssailant = WEAKREF(C) - X.monkeys-- - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - to_chat(C, "[X] now has [X.monkeys] monkeys stored.") - else - to_chat(C, "[X] needs to have at least 1 monkey stored. Currently has [X.monkeys] monkeys stored.") - -//Pick up monkey -/obj/machinery/computer/camera_advanced/xenobio/proc/XenoMonkeyClickCtrl(mob/living/user, mob/living/carbon/monkey/M) - if(!isturf(M.loc) || !GLOB.cameranet.checkTurfVis(M.loc)) - to_chat(user, "Target is not near a camera. Cannot proceed.") - return - var/mob/living/C = user - var/mob/camera/aiEye/remote/xenobio/E = C.remote_control - var/obj/machinery/computer/camera_advanced/xenobio/X = E.origin - var/area/mobarea = get_area(M.loc) - if(!X.connected_recycler) - to_chat(C, "There is no connected monkey recycler. Use a multitool to link one.") - return - if(mobarea.name == E.allowed_area || (mobarea & XENOBIOLOGY_COMPATIBLE)) - if(!M.stat) - return - M.visible_message("[M] vanishes as [p_theyre()] reclaimed for recycling!") - X.connected_recycler.use_power(500) - X.monkeys += connected_recycler.cube_production - X.monkeys = round(X.monkeys, 0.1) //Prevents rounding errors - qdel(M) - to_chat(C, "[X] now has [X.monkeys] monkeys available.") diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm deleted file mode 100644 index c907f11c1cfa..000000000000 --- a/code/modules/research/xenobiology/xenobiology.dm +++ /dev/null @@ -1,1072 +0,0 @@ -/// Slime Extracts /// - -/obj/item/slime_extract - name = "slime extract" - desc = "Goo extracted from a slime. Legends claim these to have \"magical powers\"." - icon = 'icons/mob/slimes.dmi' - icon_state = "grey slime extract" - force = 0 - w_class = WEIGHT_CLASS_TINY - throwforce = 0 - throw_speed = 3 - throw_range = 6 - grind_results = list() - var/Uses = 1 ///uses before it goes inert - var/qdel_timer = null ///deletion timer, for delayed reactions - var/effectmod ///Which type of crossbred - var/crossbreed_modifier = 1 //Modifies how many extracts are needed to cross a core. - var/list/activate_reagents = list() ///Reagents required for activation - var/recurring = FALSE - var/research ///Research point value for slime cores. These are defines stored in [/__DEFINES/research] - the actual values are updated there. - -/obj/item/slime_extract/examine(mob/user) - . = ..() - if(Uses > 1) - . += "It has [Uses] uses remaining." - -/obj/item/slime_extract/attackby(obj/item/O, mob/user) - if(istype(O, /obj/item/slimepotion/enhancer)) - if(Uses >= 5 || recurring) - to_chat(user, "You cannot enhance this extract further!") - return ..() - if(O.type == /obj/item/slimepotion/enhancer) //Seriously, why is this defined here...? - to_chat(user, "You apply the enhancer to the slime extract. It may now be reused one more time.") - Uses++ - if(O.type == /obj/item/slimepotion/enhancer/max) - to_chat(user, "You dump the maximizer on the slime extract. It can now be used a total of 5 times!") - Uses = 5 - qdel(O) - ..() - -/obj/item/slime_extract/Initialize() - . = ..() - create_reagents(100, INJECTABLE | DRAWABLE) - -/obj/item/slime_extract/on_grind() - if(Uses) - grind_results[/datum/reagent/toxin/slimejelly] = 20 - -/** -* Effect when activated by a Luminescent. -* -* This proc is called whenever a Luminescent consumes a slime extract. Each one is separated into major and minor effects depending on the extract. Cooldown is measured in deciseconds. -* -* * arg1 - The mob absorbing the slime extract. -* * arg2 - The valid species for the absorbtion. Should always be a Luminescent unless something very major has changed. -* * arg3 - Whether or not the activation is major or minor. Major activations have large, complex effects, minor are simple. -*/ -/obj/item/slime_extract/proc/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - to_chat(user, "Nothing happened... This slime extract cannot be activated this way.") - return 0 - -/** -* Core-crossing: Feeding adult slimes extracts to obtain a much more powerful, single extract. -* -* By using a valid core on a living adult slime, then feeding it nine more of the same type, you can mutate it into more useful items. Not every slime type has an implemented core cross. -*/ -/obj/item/slime_extract/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(!M.is_adult) - to_chat(user, "The slime must be an adult to cross its core!") - return - if(M.effectmod && M.effectmod != effectmod) - to_chat(user, "The slime is already being crossed with a different extract!") - return - - if(!M.effectmod) - M.effectmod = effectmod - M.crossbreed_modifier = crossbreed_modifier - - M.applied++ - qdel(src) - to_chat(user, "You feed the slime [src], [M.applied == 1 ? "starting to mutate its core." : "further mutating its core."]") - playsound(M, 'sound/effects/attackblob.ogg', 50, TRUE) - - if(M.applied >= (SLIME_EXTRACT_CROSSING_REQUIRED * crossbreed_modifier)) - M.spawn_corecross() - -/obj/item/slime_extract/grey - name = "grey slime extract" - icon_state = "grey slime extract" - effectmod = "reproductive" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_0 - custom_price = 1000 - -/obj/item/slime_extract/grey/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/reagent_containers/food/snacks/monkeycube/M = new - if(!user.put_in_active_hand(M)) - M.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - to_chat(user, "You spit out a monkey cube.") - return 120 - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "Your [name] starts pulsing...") - if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/slime/S = new(get_turf(user), "grey") - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - to_chat(user, "You spit out [S].") - return 350 - else - return 0 - -/obj/item/slime_extract/gold - name = "gold slime extract" - icon_state = "gold slime extract" - effectmod = "symbiont" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/gold/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.visible_message("[user] starts shaking!","Your [name] starts pulsing gently...") - if(do_after(user, 40, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), FRIENDLY_SPAWN) - S.faction |= "neutral" - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") - return 300 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user] starts shaking violently!","Your [name] starts pulsing violently...") - if(do_after(user, 50, target = user)) - var/mob/living/simple_animal/S = create_random_mob(user.drop_location(), HOSTILE_SPAWN) - if(user.a_intent != INTENT_HARM) - S.faction |= "neutral" - else - S.faction |= "slime" - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [S]!", "You spit out [S]!") - return 600 - -/obj/item/slime_extract/silver - name = "silver slime extract" - icon_state = "silver slime extract" - effectmod = "consuming" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/silver/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/food_type = get_random_food() - var/obj/O = new food_type - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - if(SLIME_ACTIVATE_MAJOR) - var/drink_type = get_random_drink() - var/obj/O = new drink_type - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - -/obj/item/slime_extract/metal - name = "metal slime extract" - icon_state = "metal slime extract" - effectmod = "industrial" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/metal/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/stack/sheet/glass/O = new(null, 5) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/obj/item/stack/sheet/metal/O = new(null, 5) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 200 - -/obj/item/slime_extract/purple - name = "purple slime extract" - icon_state = "purple slime extract" - effectmod = "regenerative" - crossbreed_modifier = 0.3 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/purple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.adjust_nutrition(50) - user.blood_volume += 50 - to_chat(user, "You activate [src], and your body is refilled with fresh slime jelly!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You activate [src], and it releases regenerative chemicals!") - user.reagents.add_reagent(/datum/reagent/medicine/regen_jelly,10) - return 600 - -/obj/item/slime_extract/darkpurple - name = "dark purple slime extract" - icon_state = "dark purple slime extract" - effectmod = "self-sustaining" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/darkpurple/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/stack/sheet/mineral/plasma/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("plasma=20") - to_chat(user, "You activate [src], and a cloud of plasma bursts out of your skin!") - return 900 - -/obj/item/slime_extract/orange - name = "orange slime extract" - icon_state = "orange slime extract" - effectmod = "burning" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/orange/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling hot!") - user.reagents.add_reagent(/datum/reagent/consumable/capsaicin,10) - return 150 - - if(SLIME_ACTIVATE_MAJOR) - user.reagents.add_reagent(/datum/reagent/phosphorus,5)// - user.reagents.add_reagent(/datum/reagent/potassium,5) // = smoke, along with any reagents inside mr. slime - user.reagents.add_reagent(/datum/reagent/consumable/sugar,5) // - to_chat(user, "You activate [src], and a cloud of smoke bursts out of your skin!") - return 450 - -/obj/item/slime_extract/yellow - name = "yellow slime extract" - icon_state = "yellow slime extract" - effectmod = "charged" - crossbreed_modifier = 0.8 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/yellow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(species.glow_intensity != LUMINESCENT_DEFAULT_GLOW) - to_chat(user, "Your glow is already enhanced!") - return - species.update_glow(user, 5) - addtimer(CALLBACK(species, TYPE_PROC_REF(/datum/species/jelly/luminescent, update_glow), user, LUMINESCENT_DEFAULT_GLOW), 600) - to_chat(user, "You start glowing brighter.") - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts flashing intermittently...", "Your skin starts flashing intermittently...") - if(do_after(user, 25, target = user)) - empulse(user, 1, 2) - user.visible_message("[user]'s skin flashes!", "Your skin flashes as you emit an electromagnetic pulse!") - return 600 - -/obj/item/slime_extract/red - name = "red slime extract" - icon_state = "red slime extract" - effectmod = "sanguine" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/red/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling fast!") - user.reagents.add_reagent(/datum/reagent/medicine/ephedrine,5) - return 450 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin flashes red for a moment...", "Your skin flashes red as you emit rage-inducing pheromones...") - for(var/mob/living/simple_animal/slime/slime in viewers(get_turf(user), null)) - slime.rabid = TRUE - slime.visible_message("The [slime] is driven into a frenzy!") - return 600 - -/obj/item/slime_extract/blue - name = "blue slime extract" - icon_state = "blue slime extract" - effectmod = "stabilized" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_1 - -/obj/item/slime_extract/blue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. Your genome feels more stable!") - user.adjustCloneLoss(-15) - user.reagents.add_reagent(/datum/reagent/medicine/mutadone, 10) - user.reagents.add_reagent(/datum/reagent/medicine/potass_iodide, 10) - return 250 - - if(SLIME_ACTIVATE_MAJOR) - user.reagents.create_foam(/datum/effect_system/foam_spread,20) - user.visible_message("Foam spews out from [user]'s skin!", "You activate [src], and foam bursts out of your skin!") - return 600 - -/obj/item/slime_extract/darkblue - name = "dark blue slime extract" - icon_state = "dark blue slime extract" - effectmod = "chilling" - activate_reagents = list(/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_2 - -/obj/item/slime_extract/darkblue/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You activate [src]. You start feeling colder!") - user.ExtinguishMob() - user.adjust_fire_stacks(-20) - user.reagents.add_reagent(/datum/reagent/consumable/frostoil,4) - user.reagents.add_reagent(/datum/reagent/medicine/cryoxadone,5) - return 100 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("nitrogen=40;TEMP=2.7") - to_chat(user, "You activate [src], and icy air bursts out of your skin!") - return 900 - -/obj/item/slime_extract/pink - name = "pink slime extract" - icon_state = "pink slime extract" - effectmod = "gentle" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/pink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(user.gender != MALE && user.gender != FEMALE) - to_chat(user, "You can't swap your gender!") - return - - if(user.gender == MALE) - user.gender = FEMALE - user.visible_message("[user] suddenly looks more feminine!", "You suddenly feel more feminine!") - else - user.gender = MALE - user.visible_message("[user] suddenly looks more masculine!", "You suddenly feel more masculine!") - return 100 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts flashing hypnotically...", "Your skin starts forming odd patterns, pacifying creatures around you.") - for(var/mob/living/carbon/C in viewers(user, null)) - if(C != user) - C.reagents.add_reagent(/datum/reagent/pax,2) - return 600 - -/obj/item/slime_extract/green - name = "green slime extract" - icon_state = "green slime extract" - effectmod = "mutative" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/uranium/radium) - research = SLIME_RESEARCH_TIER_4 - -/obj/item/slime_extract/green/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel yourself reverting to human form...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel human again!") - user.set_species(/datum/species/human) - return - to_chat(user, "You stop the transformation.") - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel yourself radically changing your slime type...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel different!") - user.set_species(pick(/datum/species/jelly/slime, /datum/species/jelly/stargazer)) - return - to_chat(user, "You stop the transformation.") - -/obj/item/slime_extract/lightpink - name = "light pink slime extract" - icon_state = "light pink slime extract" - effectmod = "loyal" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/lightpink/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/slimepotion/slime/renaming/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/obj/item/slimepotion/slime/sentience/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 450 - -/obj/item/slime_extract/black - name = "black slime extract" - icon_state = "black slime extract" - effectmod = "transformative" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/black/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel something wrong inside you...") - user.ForceContractDisease(new /datum/disease/transformation/slime(), FALSE, TRUE) - return 100 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel your own light turning dark...") - if(do_after(user, 120, target = user)) - to_chat(user, "You feel a longing for darkness.") - user.set_species(pick(/datum/species/shadow)) - return - to_chat(user, "You stop feeding [src].") - -/obj/item/slime_extract/oil - name = "oil slime extract" - icon_state = "oil slime extract" - effectmod = "detonating" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/oil/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You vomit slippery oil.") - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - new /obj/effect/decal/cleanable/oil/slippery(get_turf(user)) - return 450 - - if(SLIME_ACTIVATE_MAJOR) - user.visible_message("[user]'s skin starts pulsing and glowing ominously...", "You feel unstable...") - if(do_after(user, 60, target = user)) - to_chat(user, "You explode!") - explosion(get_turf(user), 1 ,3, 6) - user.gib() - return - to_chat(user, "You stop feeding [src], and the feeling passes.") - -/obj/item/slime_extract/adamantine - name = "adamantine slime extract" - icon_state = "adamantine slime extract" - effectmod = "crystalline" - activate_reagents = list(/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_5 - -/obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - if(species.armor > 0) - to_chat(user, "Your skin is already hardened!") - return - to_chat(user, "You feel your skin harden and become more resistant.") - species.armor += 25 - addtimer(CALLBACK(src, PROC_REF(reset_armor), species), 1200) - return 450 - -/obj/item/slime_extract/adamantine/proc/reset_armor(datum/species/jelly/luminescent/species) - if(istype(species)) - species.armor -= 25 - -/obj/item/slime_extract/bluespace - name = "bluespace slime extract" - icon_state = "bluespace slime extract" - effectmod = "warping" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - var/teleport_ready = FALSE - var/teleport_x = 0 - var/teleport_y = 0 - var/teleport_z = 0 - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/bluespace/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - to_chat(user, "You feel your body vibrating...") - if(do_after(user, 25, target = user)) - to_chat(user, "You teleport!") - do_teleport(user, get_turf(user), 6, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - return 300 - - if(SLIME_ACTIVATE_MAJOR) - if(!teleport_ready) - to_chat(user, "You feel yourself anchoring to this spot...") - var/turf/T = get_turf(user) - teleport_x = T.x - teleport_y = T.y - teleport_z = T.z - teleport_ready = TRUE - else - teleport_ready = FALSE - if(teleport_x && teleport_y && teleport_z) - var/turf/T = locate(teleport_x, teleport_y, teleport_z) - to_chat(user, "You snap back to your anchor point!") - do_teleport(user, T, asoundin = 'sound/weapons/emitter2.ogg', channel = TELEPORT_CHANNEL_BLUESPACE) - return 450 - - -/obj/item/slime_extract/pyrite - name = "pyrite slime extract" - icon_state = "pyrite slime extract" - effectmod = "prismatic" - crossbreed_modifier = 0.5 - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/pyrite/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/chosen = pick(difflist(subtypesof(/obj/item/toy/crayon),typesof(/obj/item/toy/crayon/spraycan))) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/blacklisted_cans = list(/obj/item/toy/crayon/spraycan/borg, /obj/item/toy/crayon/spraycan/infinite) - var/chosen = pick(subtypesof(/obj/item/toy/crayon/spraycan) - blacklisted_cans) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 250 - -/obj/item/slime_extract/cerulean - name = "cerulean slime extract" - icon_state = "cerulean slime extract" - effectmod = "recurring" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/cerulean/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.reagents.add_reagent(/datum/reagent/medicine/salbutamol,15) - to_chat(user, "You feel like you don't need to breathe!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - var/turf/open/T = get_turf(user) - if(istype(T)) - T.atmos_spawn_air("o2=11;n2=41;TEMP=293.15") - to_chat(user, "You activate [src], and fresh air bursts out of your skin!") - return 600 - -/obj/item/slime_extract/sepia - name = "sepia slime extract" - icon_state = "sepia slime extract" - effectmod = "lengthened" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,/datum/reagent/water) - research = SLIME_RESEARCH_TIER_3 - -/obj/item/slime_extract/sepia/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - var/obj/item/camera/O = new(null, 1) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - - if(SLIME_ACTIVATE_MAJOR) - to_chat(user, "You feel time slow down...") - if(do_after(user, 30, target = user)) - new /obj/effect/timestop(get_turf(user), 2, 50, list(user)) - return 900 - -/obj/item/slime_extract/rainbow - name = "rainbow slime extract" - icon_state = "rainbow slime extract" - effectmod = "hyperchromatic" - activate_reagents = list(/datum/reagent/blood,/datum/reagent/toxin/plasma,"lesser plasma",/datum/reagent/toxin/slimejelly,"holy water and uranium") //Curse this snowflake reagent list. - research = SLIME_RESEARCH_TIER_RAINBOW - -/obj/item/slime_extract/rainbow/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) - switch(activation_type) - if(SLIME_ACTIVATE_MINOR) - user.dna.features["mcolor"] = pick("FFFFFF","7F7F7F", "7FFF7F", "7F7FFF", "FF7F7F", "7FFFFF", "FF7FFF", "FFFF7F") - user.updateappearance(mutcolor_update=1) - species.update_glow(user) - to_chat(user, "You feel different...") - return 100 - - if(SLIME_ACTIVATE_MAJOR) - var/chosen = pick(subtypesof(/obj/item/slime_extract)) - var/obj/item/O = new chosen(null) - if(!user.put_in_active_hand(O)) - O.forceMove(user.drop_location()) - playsound(user, 'sound/effects/splat.ogg', 50, TRUE) - user.visible_message("[user] spits out [O]!", "You spit out [O]!") - return 150 - -////Slime-derived potions/// - -/** -* #Slime potions -* -* Feed slimes potions either by hand or using the slime console. -* -* Slime potions either augment the slime's behavior, its extract output, or its intelligence. These all come either from extract effects or cross cores. -* A few of the more powerful ones can modify someone's equipment or gender. -* New ones should probably be accessible only through cross cores as all the normal core types already have uses. Rule of thumb is 'stronger effects go in cross cores'. -*/ - -/obj/item/slimepotion - name = "slime potion" - desc = "A hard yet gelatinous capsule excreted by a slime, containing mysterious substances." - w_class = WEIGHT_CLASS_BULKY - -/obj/item/slimepotion/afterattack(obj/item/reagent_containers/target, mob/user , proximity) - . = ..() - if(!proximity) - return - if (istype(target)) - to_chat(user, "You cannot transfer [src] to [target]! It appears the potion must be given directly to a slime to absorb." ) - return - -/obj/item/slimepotion/slime/docility - name = "docility potion" - desc = "A potent chemical mix that nullifies a slime's hunger, causing it to become docile and tame." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potsilver" - -/obj/item/slimepotion/slime/docility/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The potion only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.rabid) //Stops being rabid, but doesn't become truly docile. - to_chat(M, "You absorb the potion, and your rabid hunger finally settles to a normal desire to feed.") - to_chat(user, "You feed the slime the potion, calming its rabid rage.") - M.rabid = FALSE - qdel(src) - return - M.docile = 1 - M.set_nutrition(700) - to_chat(M, "You absorb the potion and feel your intense desire to feed melt away.") - to_chat(user, "You feed the slime the potion, removing its hunger and calming it.") - var/newname = sanitize_name(stripped_input(user, "Would you like to give the slime a name?", "Name your new pet", "pet slime", MAX_NAME_LEN)) - - if (!newname) - newname = "pet slime" - M.name = newname - M.real_name = newname - qdel(src) - -/obj/item/slimepotion/slime/sentience - name = "intelligence potion" - desc = "A miraculous chemical mix that grants human like intelligence to living beings." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpink" - var/list/not_interested = list() - var/being_used = FALSE - var/sentience_type = SENTIENCE_ORGANIC - -/obj/item/slimepotion/slime/sentience/attack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!isanimal(M) || M.ckey) //only works on animals that aren't player controlled - to_chat(user, "[M] is already too intelligent for this to work!") - return - if(M.stat) - to_chat(user, "[M] is dead!") - return - var/mob/living/simple_animal/SM = M - if(SM.sentience_type != sentience_type) - to_chat(user, "[src] won't work on [SM].") - return - - to_chat(user, "You offer [src] to [SM]...") - being_used = TRUE - - var/list/candidates = pollCandidatesForMob("Do you want to play as [SM.name]?", ROLE_SENTIENCE, null, ROLE_SENTIENCE, 50, SM, POLL_IGNORE_SENTIENCE_POTION) // see poll_ignore.dm - if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) - SM.key = C.key - SM.mind.enslave_mind_to_creator(user) - SM.sentience_act() - to_chat(SM, "All at once it makes sense: you know what you are and who you are! Self awareness is yours!") - to_chat(SM, "You are grateful to be self aware and owe [user.real_name] a great debt. Serve [user.real_name], and assist [user.p_them()] in completing [user.p_their()] goals at any cost.") - if(SM.flags_1 & HOLOGRAM_1) //Check to see if it's a holodeck creature - to_chat(SM, "You also become depressingly aware that you are not a real creature, but instead a holoform. Your existence is limited to the parameters of the holodeck.") - to_chat(user, "[SM] accepts [src] and suddenly becomes attentive and aware. It worked!") - SM.copy_languages(user) - after_success(user, SM) - qdel(src) - else - to_chat(user, "[SM] looks interested for a moment, but then looks back down. Maybe you should try again later.") - being_used = FALSE - ..() - -/obj/item/slimepotion/slime/sentience/proc/after_success(mob/living/user, mob/living/simple_animal/SM) - return - -/obj/item/slimepotion/slime/sentience/nuclear - name = "syndicate intelligence potion" - desc = "A miraculous chemical mix that grants human like intelligence to living beings. It has been modified with Syndicate technology to also grant an internal radio implant to the target and authenticate with identification systems." - -/obj/item/slimepotion/slime/sentience/nuclear/after_success(mob/living/user, mob/living/simple_animal/SM) - var/obj/item/implant/radio/syndicate/imp = new(src) - imp.implant(SM, user) - - SM.access_card = new /obj/item/card/id/syndicate(SM) - ADD_TRAIT(SM.access_card, TRAIT_NODROP, ABSTRACT_ITEM_TRAIT) - -/obj/item/slimepotion/transference - name = "consciousness transference potion" - desc = "A strange slime-based chemical that, when used, allows the user to transfer their consciousness to a lesser being." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potorange" - var/prompted = 0 - var/animal_type = SENTIENCE_ORGANIC - -/obj/item/slimepotion/transference/afterattack(mob/living/M, mob/user, proximity) - if(!proximity) - return - if(prompted || !ismob(M)) - return - if(!isanimal(M) || M.ckey) //much like sentience, these will not work on something that is already player controlled - to_chat(user, "[M] already has a higher consciousness!") - return ..() - if(M.stat) - to_chat(user, "[M] is dead!") - return ..() - var/mob/living/simple_animal/SM = M - if(SM.sentience_type != animal_type) - to_chat(user, "You cannot transfer your consciousness to [SM]." ) - return ..() - var/jb = is_banned_from(user.ckey, ROLE_MIND_TRANSFER) - if(QDELETED(src) || QDELETED(M) || QDELETED(user)) - return - - if(jb) - to_chat(user, "Your mind goes blank as you attempt to use the potion.") - return - - prompted = 1 - if(alert("This will permanently transfer your consciousness to [SM]. Are you sure you want to do this?",,"Yes","No")=="No") - prompted = 0 - return - - to_chat(user, "You drink the potion then place your hands on [SM]...") - - - user.mind.transfer_to(SM) - SM.faction = user.faction.Copy() - SM.sentience_act() //Same deal here as with sentience - user.death() - to_chat(SM, "In a quick flash, you feel your consciousness flow into [SM]!") - to_chat(SM, "You are now [SM]. Your allegiances, alliances, and role is still the same as it was prior to consciousness transfer!") - SM.name = "[user.real_name]" - qdel(src) - -/obj/item/slimepotion/slime/steroid - name = "slime steroid" - desc = "A potent chemical mix that will cause a baby slime to generate more extract." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potred" - -/obj/item/slimepotion/slime/steroid/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M))//If target is not a slime. - to_chat(user, "The steroid only works on baby slimes!") - return ..() - if(M.is_adult) //Can't steroidify adults - to_chat(user, "Only baby slimes can use the steroid!") - return - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.cores >= 5) - to_chat(user, "The slime already has the maximum amount of extract!") - return - - to_chat(user, "You feed the slime the steroid. It will now produce one more extract.") - M.cores++ - qdel(src) - -/obj/item/slimepotion/enhancer - name = "extract enhancer" - desc = "A potent chemical mix that will give a slime extract an additional use." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potpurple" - -/obj/item/slimepotion/slime/stabilizer - name = "slime stabilizer" - desc = "A potent chemical mix that will reduce the chance of a slime mutating." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potcyan" - -/obj/item/slimepotion/slime/stabilizer/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The stabilizer only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutation_chance == 0) - to_chat(user, "The slime already has no chance of mutating!") - return - - to_chat(user, "You feed the slime the stabilizer. It is now less likely to mutate.") - M.mutation_chance = clamp(M.mutation_chance-15,0,100) - qdel(src) - -/obj/item/slimepotion/slime/mutator - name = "slime mutator" - desc = "A potent chemical mix that will increase the chance of a slime mutating." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgreen" - -/obj/item/slimepotion/slime/mutator/attack(mob/living/simple_animal/slime/M, mob/user) - if(!isslime(M)) - to_chat(user, "The mutator only works on slimes!") - return ..() - if(M.stat) - to_chat(user, "The slime is dead!") - return - if(M.mutator_used) - to_chat(user, "This slime has already consumed a mutator, any more would be far too unstable!") - return - if(M.mutation_chance == 100) - to_chat(user, "The slime is already guaranteed to mutate!") - return - - to_chat(user, "You feed the slime the mutator. It is now more likely to mutate.") - M.mutation_chance = clamp(M.mutation_chance+12,0,100) - M.mutator_used = TRUE - qdel(src) - -/obj/item/slimepotion/speed - name = "slime speed potion" - desc = "A potent chemical mix that will reduce the slowdown from any item." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potyellow" - -/obj/item/slimepotion/speed/afterattack(obj/C, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on items or vehicles!") - return - if(isitem(C)) - var/obj/item/I = C - if(I.slowdown <= 0.25 || I.obj_flags & IMMUTABLE_SLOW) - to_chat(user, "The [C] can't be made any faster!") - return ..() - I.slowdown = 0.25 - - if(istype(C, /obj/vehicle)) - var/obj/vehicle/V = C - var/datum/component/riding/R = V.GetComponent(/datum/component/riding) - if(R) - var/vehicle_speed_mod = round(CONFIG_GET(number/movedelay/run_delay) * 0.85, 0.01) - if(R.vehicle_move_delay <= vehicle_speed_mod) - to_chat(user, "The [C] can't be made any faster!") - return ..() - R.vehicle_move_delay = vehicle_speed_mod - - to_chat(user, "You slather the red gunk over the [C], making it faster.") - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#FF0000", FIXED_COLOUR_PRIORITY) - qdel(src) - -/obj/item/slimepotion/fireproof - name = "slime chill potion" - desc = "A potent chemical mix that will fireproof any article of clothing. Has three uses." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potblue" - resistance_flags = FIRE_PROOF - var/uses = 3 - -/obj/item/slimepotion/fireproof/afterattack(obj/item/clothing/C, mob/user, proximity) - . = ..() - if(!proximity) - return - if(!uses) - qdel(src) - return - if(!istype(C)) - to_chat(user, "The potion can only be used on clothing!") - return - if(C.max_heat_protection_temperature >= FIRE_IMMUNITY_MAX_TEMP_PROTECT) - to_chat(user, "The [C] is already fireproof!") - return - to_chat(user, "You slather the blue gunk over the [C], fireproofing it.") - C.name = "fireproofed [C.name]" - C.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - C.add_atom_colour("#000080", FIXED_COLOUR_PRIORITY) - C.max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT - C.heat_protection = C.body_parts_covered - C.resistance_flags |= FIRE_PROOF - uses -- - if(!uses) - qdel(src) - -/obj/item/slimepotion/genderchange - name = "gender change potion" - desc = "An interesting chemical mix that changes the biological gender of what its applied to. Cannot be used on things that lack gender entirely." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potlightpink" - -/obj/item/slimepotion/genderchange/attack(mob/living/L, mob/user) - if(!istype(L) || L.stat == DEAD) - to_chat(user, "The potion can only be used on living things!") - return - - if(L.gender != MALE && L.gender != FEMALE) - to_chat(user, "The potion can only be used on gendered things!") - return - - if(L.gender == MALE) - L.gender = FEMALE - L.visible_message("[L] suddenly looks more feminine!", "You suddenly feel more feminine!") - else - L.gender = MALE - L.visible_message("[L] suddenly looks more masculine!", "You suddenly feel more masculine!") - L.regenerate_icons() - qdel(src) - -/obj/item/slimepotion/slime/renaming - name = "renaming potion" - desc = "A potion that allows a self-aware being to change what name it subconciously presents to the world." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgreen" - - var/being_used = FALSE - -/obj/item/slimepotion/slime/renaming/attack(mob/living/M, mob/user) - if(being_used || !ismob(M)) - return - if(!M.ckey) //only works on animals that aren't player controlled - to_chat(user, "[M] is not self aware, and cannot pick its own name.") - return - - being_used = TRUE - - to_chat(user, "You offer [src] to [user]...") - - var/new_name = stripped_input(M, "What would you like your name to be?", "Input a name", M.real_name, MAX_NAME_LEN) - - if(!new_name || QDELETED(src) || QDELETED(M) || new_name == M.real_name || !M.Adjacent(user)) - being_used = FALSE - return - - M.visible_message("[M] has a new name, [new_name].", "Your old name of [M.real_name] fades away, and your new name [new_name] anchors itself in your mind.") - message_admins("[ADMIN_LOOKUPFLW(user)] used [src] on [ADMIN_LOOKUPFLW(M)], letting them rename themselves into [new_name].") - - // pass null as first arg to not update records or ID/PDA - M.fully_replace_character_name(null, new_name) - - qdel(src) - -/obj/item/slimepotion/slime/slimeradio - name = "bluespace radio potion" - desc = "A strange chemical that grants those who ingest it the ability to broadcast and receive subscape radio waves." - icon = 'icons/obj/chemical/misc.dmi' - icon_state = "potgrey" - -/obj/item/slimepotion/slime/slimeradio/attack(mob/living/M, mob/user) - if(!ismob(M)) - return - if(!isanimal(M)) - to_chat(user, "[M] is too complex for the potion!") - return - if(M.stat) - to_chat(user, "[M] is dead!") - return - - to_chat(user, "You feed the potion to [M].") - to_chat(M, "Your mind tingles as you are fed the potion. You can hear radio waves now!") - var/obj/item/implant/radio/slime/imp = new(src) - imp.implant(M, user) - qdel(src) - -///Definitions for slime products that don't have anywhere else to go (Floor tiles, blueprints). - -/obj/item/stack/tile/bluespace - name = "bluespace floor tile" - singular_name = "floor tile" - desc = "Through a series of micro-teleports these tiles let people move at incredible speeds." - icon_state = "tile-bluespace" - item_state = "tile-bluespace" - w_class = WEIGHT_CLASS_NORMAL - force = 6 - custom_materials = list(/datum/material/iron=500) - throwforce = 10 - throw_speed = 3 - throw_range = 7 - flags_1 = CONDUCT_1 - max_amount = 60 - turf_type = /turf/open/floor/bluespace - - -/obj/item/stack/tile/sepia - name = "sepia floor tile" - singular_name = "floor tile" - desc = "Time seems to flow very slowly around these tiles." - icon_state = "tile-sepia" - item_state = "tile-sepia" - w_class = WEIGHT_CLASS_NORMAL - force = 6 - custom_materials = list(/datum/material/iron=500) - throwforce = 10 - throw_speed = 0.1 - throw_range = 28 - flags_1 = CONDUCT_1 - max_amount = 60 - turf_type = /turf/open/floor/sepia - - -/obj/item/areaeditor/blueprints/slime - name = "cerulean prints" - desc = "A one use yet of blueprints made of jelly like organic material. Extends the reach of the management console." - color = "#2956B2" - -/obj/item/areaeditor/blueprints/slime/edit_area() - ..() - var/area/A = get_area(src) - for(var/turf/T in A) - T.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - T.add_atom_colour("#2956B2", FIXED_COLOUR_PRIORITY) - A.area_flags |= XENOBIOLOGY_COMPATIBLE - qdel(src) diff --git a/code/modules/surgery/core_removal.dm b/code/modules/surgery/core_removal.dm deleted file mode 100644 index c5bfd1108202..000000000000 --- a/code/modules/surgery/core_removal.dm +++ /dev/null @@ -1,44 +0,0 @@ -/datum/surgery/core_removal - name = "Core removal" - steps = list(/datum/surgery_step/incise, /datum/surgery_step/extract_core) - target_mobtypes = list(/mob/living/simple_animal/slime) - possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) - lying_required = FALSE - ignore_clothes = TRUE - -/datum/surgery/core_removal/can_start(mob/user, mob/living/target) - if(target.stat == DEAD) - return 1 - return 0 - -//extract brain -/datum/surgery_step/extract_core - name = "extract core" - implements = list( - TOOL_HEMOSTAT = 100, - TOOL_CROWBAR = 100) - time = 16 - -/datum/surgery_step/extract_core/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery) - display_results(user, target, "You begin to extract a core from [target]...", - "[user] begins to extract a core from [target].", - "[user] begins to extract a core from [target].") - -/datum/surgery_step/extract_core/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results = FALSE) - var/mob/living/simple_animal/slime/slime = target - if(slime.cores > 0) - slime.cores-- - display_results(user, target, "You successfully extract a core from [target]. [slime.cores] core\s remaining.", - "[user] successfully extracts a core from [target]!", - "[user] successfully extracts a core from [target]!") - - new slime.coretype(slime.loc) - - if(slime.cores <= 0) - slime.icon_state = "[slime.colour] baby slime dead-nocore" - return ..() - else - return 0 - else - to_chat(user, "There aren't any cores left in [target]!") - return ..() diff --git a/code/modules/unit_tests/create_and_destroy.dm b/code/modules/unit_tests/create_and_destroy.dm index 0e0248162fc8..f16ad0055056 100644 --- a/code/modules/unit_tests/create_and_destroy.dm +++ b/code/modules/unit_tests/create_and_destroy.dm @@ -13,8 +13,6 @@ /turf/template_noop, //Never meant to be created, errors out the ass for mobcode reasons /mob/living/carbon, - //And another - /obj/item/slimecross/recurring, //This should be obvious /obj/machinery/doomsday_device, //Template type diff --git a/code/modules/uplink/uplink_items.dm b/code/modules/uplink/uplink_items.dm index 4bfe534940f1..ef38d21a7740 100644 --- a/code/modules/uplink/uplink_items.dm +++ b/code/modules/uplink/uplink_items.dm @@ -1506,15 +1506,6 @@ GLOBAL_LIST_INIT(uplink_items, subtypesof(/datum/uplink_item)) item = /obj/item/clothing/glasses/thermal/syndi cost = 4 -/datum/uplink_item/device_tools/potion - name = "Syndicate Sentience Potion" - item = /obj/item/slimepotion/slime/sentience/nuclear - desc = "A potion recovered at great risk by undercover Syndicate operatives and then subsequently modified with Syndicate technology. \ - Using it will make any animal sentient, and bound to serve you, as well as implanting an internal radio for communication and an internal ID card for opening doors." - cost = 4 - include_modes = list(/datum/game_mode/nuclear, /datum/game_mode/nuclear/clown_ops) - restricted = TRUE - /datum/uplink_item/device_tools/guerillagloves name = "Guerilla Gloves" desc = "A pair of highly robust combat gripper gloves that excels at performing takedowns at close range, with an added lining of insulation. Careful not to hit a wall!" diff --git a/shiptest.dme b/shiptest.dme index 87d8ceed34a0..529ab2cfb100 100644 --- a/shiptest.dme +++ b/shiptest.dme @@ -497,7 +497,6 @@ #include "code\datums\components\construction.dm" #include "code\datums\components\creamed.dm" #include "code\datums\components\deadchat_control.dm" -#include "code\datums\components\dejavu.dm" #include "code\datums\components\deployable.dm" #include "code\datums\components\dooropendeathproc.dm" #include "code\datums\components\earprotection.dm" @@ -1839,7 +1838,6 @@ #include "code\modules\awaymissions\mission_code\caves.dm" #include "code\modules\awaymissions\mission_code\centcomAway.dm" #include "code\modules\awaymissions\mission_code\challenge.dm" -#include "code\modules\awaymissions\mission_code\moonoutpost19.dm" #include "code\modules\awaymissions\mission_code\murderdome.dm" #include "code\modules\awaymissions\mission_code\research.dm" #include "code\modules\awaymissions\mission_code\snowdin.dm" @@ -1900,7 +1898,6 @@ #include "code\modules\cargo\bounties\reagent.dm" #include "code\modules\cargo\bounties\science.dm" #include "code\modules\cargo\bounties\security.dm" -#include "code\modules\cargo\bounties\slime.dm" #include "code\modules\cargo\bounties\special.dm" #include "code\modules\cargo\bounties\virus.dm" #include "code\modules\cargo\exports\gear.dm" @@ -2179,7 +2176,6 @@ #include "code\modules\food_and_drinks\kitchen_machinery\grill.dm" #include "code\modules\food_and_drinks\kitchen_machinery\icecream_vat.dm" #include "code\modules\food_and_drinks\kitchen_machinery\microwave.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\monkeyrecycler.dm" #include "code\modules\food_and_drinks\kitchen_machinery\processor.dm" #include "code\modules\food_and_drinks\kitchen_machinery\smartfridge.dm" #include "code\modules\food_and_drinks\recipes\drinks_recipes.dm" @@ -2853,7 +2849,6 @@ #include "code\modules\movespeed\modifiers\misc.dm" #include "code\modules\movespeed\modifiers\mobs.dm" #include "code\modules\movespeed\modifiers\reagent.dm" -#include "code\modules\movespeed\modifiers\status_effects.dm" #include "code\modules\ninja\__ninjaDefines.dm" #include "code\modules\ninja\energy_katana.dm" #include "code\modules\ninja\ninja_event.dm" @@ -3142,7 +3137,6 @@ #include "code\modules\reagents\chemistry\recipes\medicine.dm" #include "code\modules\reagents\chemistry\recipes\others.dm" #include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#include "code\modules\reagents\chemistry\recipes\slime_extracts.dm" #include "code\modules\reagents\chemistry\recipes\special.dm" #include "code\modules\reagents\chemistry\recipes\toxins.dm" #include "code\modules\reagents\reagent_containers\blood_pack.dm" @@ -3241,27 +3235,6 @@ #include "code\modules\research\techweb\_techweb.dm" #include "code\modules\research\techweb\_techweb_node.dm" #include "code\modules\research\techweb\all_nodes.dm" -#include "code\modules\research\xenobiology\xenobio_camera.dm" -#include "code\modules\research\xenobiology\xenobiology.dm" -#include "code\modules\research\xenobiology\crossbreeding\__corecross.dm" -#include "code\modules\research\xenobiology\crossbreeding\_clothing.dm" -#include "code\modules\research\xenobiology\crossbreeding\_misc.dm" -#include "code\modules\research\xenobiology\crossbreeding\_mobs.dm" -#include "code\modules\research\xenobiology\crossbreeding\_potions.dm" -#include "code\modules\research\xenobiology\crossbreeding\_status_effects.dm" -#include "code\modules\research\xenobiology\crossbreeding\_weapons.dm" -#include "code\modules\research\xenobiology\crossbreeding\burning.dm" -#include "code\modules\research\xenobiology\crossbreeding\charged.dm" -#include "code\modules\research\xenobiology\crossbreeding\chilling.dm" -#include "code\modules\research\xenobiology\crossbreeding\consuming.dm" -#include "code\modules\research\xenobiology\crossbreeding\industrial.dm" -#include "code\modules\research\xenobiology\crossbreeding\mutative.dm" -#include "code\modules\research\xenobiology\crossbreeding\prismatic.dm" -#include "code\modules\research\xenobiology\crossbreeding\recurring.dm" -#include "code\modules\research\xenobiology\crossbreeding\regenerative.dm" -#include "code\modules\research\xenobiology\crossbreeding\reproductive.dm" -#include "code\modules\research\xenobiology\crossbreeding\selfsustaining.dm" -#include "code\modules\research\xenobiology\crossbreeding\stabilized.dm" #include "code\modules\ruins\rockplanet_ruin_code.dm" #include "code\modules\ruins\icemoonruin_code\hydroponicslab.dm" #include "code\modules\ruins\icemoonruin_code\library.dm" @@ -3335,7 +3308,6 @@ #include "code\modules\surgery\bone_repair.dm" #include "code\modules\surgery\brain_surgery.dm" #include "code\modules\surgery\cavity_implant.dm" -#include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" #include "code\modules\surgery\dental_implant.dm" #include "code\modules\surgery\experimental_dissection.dm" From cd88cfe298a12c116aed69e8e142cfcf888a96bd Mon Sep 17 00:00:00 2001 From: Changelogs Date: Fri, 18 Oct 2024 04:05:17 -0500 Subject: [PATCH 4/4] Automatic changelog generation for PR #3527 [ci skip] --- html/changelogs/AutoChangeLog-pr-3527.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-3527.yml diff --git a/html/changelogs/AutoChangeLog-pr-3527.yml b/html/changelogs/AutoChangeLog-pr-3527.yml new file mode 100644 index 000000000000..bdcc4553c462 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-3527.yml @@ -0,0 +1,4 @@ +author: Erikafox +changes: + - {rscdel: Xenobiology (minus slimes)} +delete-after: true