From 7eb73ca9030b02d6f8279902337b7d3f951ac9d7 Mon Sep 17 00:00:00 2001 From: Chloe Carver-Brown Date: Thu, 27 May 2021 16:40:15 +0100 Subject: [PATCH 01/14] pog --- code/game/objects/items/storage/fancy.dm | 6 ++++++ code/modules/clothing/gloves/ring.dm | 8 +++++++- icons/obj/ring.dmi | Bin 815 -> 1105 bytes .../code/modules/client/loadout/__donator.dm | 6 +++--- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 8754a2cc..2d1b0b57 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -392,3 +392,9 @@ icon_type = "silver ring" spawn_type = /obj/item/clothing/gloves/ring/silver +/obj/item/storage/fancy/ringbox/lyricalpaws + name = "Ornate Ring Box" + desc = "A rich royal blue felted box, the inside lined with a beautiful black silk. It was clearly designed to hold a ring of sorts." + icon_state = "paws ringbox" + icon_type = "ornate ring" + spawn_type = /obj/item/clothing/gloves/ring/lyricalpaws diff --git a/code/modules/clothing/gloves/ring.dm b/code/modules/clothing/gloves/ring.dm index 430469a0..245ed606 100644 --- a/code/modules/clothing/gloves/ring.dm +++ b/code/modules/clothing/gloves/ring.dm @@ -29,4 +29,10 @@ name = "silver ring" item_state = "sring" icon_state = "ringsilver" - desc = "A tiny silver ring, sized to wrap around a finger." \ No newline at end of file + desc = "A tiny silver ring, sized to wrap around a finger." + +/obj/item/clothing/gloves/ring/lyricalpaws + name = "Ornate Wedding Ring" + item_state = "dring" + icon_state = "ringpaws" + desc = "A worn golden ring emblazoned with a finely cut Emerald and Ruby alongside each other. The inside of the ring has the phrase 'Per aspera ad astra.' engraved in to it." \ No newline at end of file diff --git a/icons/obj/ring.dmi b/icons/obj/ring.dmi index 3b985fa262eb6be016f49edbf2d4c7b702283790..ef564a9a71cc7e55b33dd53a375fff1ee552e518 100644 GIT binary patch literal 1105 zcmV-X1g`suP)004jp0{{R3ySfFDZ*Bkp zc$}5fu?~YE5C-5Go`UG!Xxp_*qiG!KJJ3M!5)}ia_VEkVG&(dK+d)2#pG(NuwZ1hi ztL_bbNn=5e?8456f|418>-^$$q@jFxKyslspX|vhE2yxgE67G zISfJxfzo9+E}|L#|BuZk?KdA=3d>Ta_d!ZOyaqivvQLzwG6nzu0Q^7nYML)-J-^e~ zzF#k(RwT2af!~Hh%jDf)CoDY3`iQb)9#< z$8LZ8*0liUg8%>k000000NTX!91EPUeZwK=-0}mXkr2X?kH^06(|(gjF9-sgpkqE4 zMq#KN$vjTtSUFO$OyzW{94SBVi!z)IXhYYVeI%nOwA3(>i83T>DCcsX`94)cZ}FrI zz1f^L)Z;Uc9-l=^DI?DFJU1IAD=8BpilQ(Zrc%mO|6Lmmy`D0hctMuUDZ{?@^GLyP zxm+r>P5x{aj906bQri|UX2DAZwcuBxguTT=osu#mOK6|Z4Wmf=vCXqtaFit4k8NMf zg5z&ls{JUzS>#<#arvDTwC}-T81aqr~=`~rP# zCK&P`n~mCmlwd4=ZntU&S_Rb(qy)3zS6S|MO$8Yb`F_98bF&{~A{K|kp(xCLjQLYP zP1E(-?8lfo9>?QxwzrOS7C}c|U1;wHs^2wL)BJSSR8)R7r?-Ev zqe`Iji6yVjmkOV|6fD(;7JRK~Pw-?v1+Kh$r!7HO1+L8@*tsBcZJ}#(00000+#G)Z XU4~fPv0}V`00000NkvXXu0mjfzElx& literal 815 zcmV+~1JL}5P)C0001cP)t-sz`($n z05kspGt2-pGXOIH003qHGv&ES;;I|v!fF54b^rhWX8-^H%mCKr^Z((rLyO@60004WQchCV=- z0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pSoZ^zi zl2jm5sVFlqJt@CJiHkEOv#1y-V#vjrR+N~V3Sq<5rDP`N=I5m-5Uaj8GY9AtqLruT z=MZl;RGk5-jwY-D)zyU6BRiX9=NOV?JYm(Sjwh@hq!45SQ3@f36QvaDOp$pCz6do0004|Nkl@E^6h-l)hCpo+n-K{_Lt@+f|6f>W>@MKy z4KD6k#KqOzGYs>_#~1(rfR|#kkTKr|qTis-*=D;7Y@;tA&e>+S5Pbo0&h~E$`%HQM z6M#VWIRF3v00000$p5$eu|DU^b8kk6$M$;2l)r$$Kbi9UcK`zU2N3`O00000fc$TF zQE<*v0>t}&Daz72#D7n``3NaQnL2~8KEFR%ua8gik9aOBDFx?sUB?U#;r+*C!L$4$ z7)0{2sw!XI)TgKb>Hc2`5&BtkiVD!)fua<=@%=nJ^9YpuvuXSd$Rxmc$=kNA>u5jq zAmV-mv~_Y25yN?U4gvrG0002+3Y^bMsYHIcXsrqRJJWUEAr?z3``$Z{^&4rtLG%pd zRbFpe)184Cq%=x7=hh9Zl+uRJk;tGMhQU`)?!GSYcLG7+i$>sVOz3CReO=)4eY2sT zPM|Yt^8G42*97{d*J?}B?*%&bGfn;mBnA8pAQE7zQ}aAKx8Bc~?zOdc9I5)5@*`k& t@j;~h2yi3iAW|wl2PtO&004k&`~vyvAc>o51DpT=002ovPDHLkV1ixUh${d9 diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index b715a8b3..e2df1e45 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -112,10 +112,10 @@ cost = 0 ckeywhitelist = list("lyricalpaws") -datum/gear/darksabresheath - name = "Dark Sabre Sheath" +datum/gear/lyricalpawsring + name = "Ornate Ring Box" category = SLOT_IN_BACKPACK - path = /obj/item/storage/belt/sabre/chloesabre + path = /obj/item/storage/fancy/ringbox/lyricalpaws ckeywhitelist = list("lyricalpaws") /datum/gear/cherostavikmask From 6ea19bb7d2a10bf875eefd88875f37c11f1a43fd Mon Sep 17 00:00:00 2001 From: Kabra_men <46802162+Kabramen@users.noreply.github.com> Date: Wed, 2 Jun 2021 18:20:06 -0300 Subject: [PATCH 02/14] Engislut --- code/modules/cargo/packs/emergency.dm | 15 +++++++++++++++ code/modules/clothing/masks/gasmask.dm | 11 +++++++++++ .../clothing/under/jobs/engineering.dm | 13 ++++++++++++- code/modules/vending/engineering.dm | 4 +++- code/modules/vending/wardrobes.dm | 4 +++- icons/mob/mask.dmi | Bin 46098 -> 46393 bytes icons/mob/uniform.dmi | Bin 385899 -> 386337 bytes icons/obj/clothing/masks.dmi | Bin 36083 -> 36185 bytes icons/obj/clothing/uniforms.dmi | Bin 110342 -> 110811 bytes modular_citadel/icons/mob/muzzled_mask.dmi | Bin 47369 -> 47613 bytes modular_citadel/icons/mob/uniform_digi.dmi | Bin 341950 -> 342393 bytes 11 files changed, 44 insertions(+), 3 deletions(-) diff --git a/code/modules/cargo/packs/emergency.dm b/code/modules/cargo/packs/emergency.dm index 0676e74e..0f888b4d 100644 --- a/code/modules/cargo/packs/emergency.dm +++ b/code/modules/cargo/packs/emergency.dm @@ -59,6 +59,21 @@ crate_name = "radiation protection crate" crate_type = /obj/structure/closet/crate/radiation +/datum/supply_pack/emergency/radiatione_emergency_bikini + name = "Emergenc Beach Radiation Protection Crate" + desc = "Survive(?) the Nuclear Summer and Supermatter Engine alike with two sets of Radkinis. Each set contains a mask, bikini, and Geiger counter. We'll even throw in a few pill bottles that are able to handles radiation and the affects of the poisoning." + cost = 2000 + contains = list(/obj/item/clothing/mask/gas/radmask, + /obj/item/clothing/mask/gas/radmask, + /obj/item/clothing/under/radkini, + /obj/item/clothing/under/radkini, + /obj/item/geiger_counter, + /obj/item/geiger_counter, + /obj/item/storage/pill_bottle/mutarad, + /obj/item/storage/firstaid/radbgone) + crate_name = "beach radiation protection crate" + crate_type = /obj/structure/closet/crate/radiation + /datum/supply_pack/emergency/rcds name = "Emergency RCDs" desc = "Bombs going off on station? SME blown and now you need to fix the hole it left behind? Well this crate has a pare of Rcds to be able to easily fix up any problem you may have!" diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 6ac07940..107350fc 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -216,3 +216,14 @@ A.UpdateButtonIcon() to_chat(M, "The Tiki Mask has now changed into the [choice] Mask!") return 1 + +//lewd(?) masks + +/obj/item/clothing/mask/gas/radmask + name = "radiation mask" + desc = "An mask that somewhat protects the user from ratiation. Not as effective like a radiation hood, but is better than nothing." + icon_state = "radmask" + item_state = "radmask" + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 30, "fire" = 10, "acid" = 10) + + diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index 7dde0367..6f9fe993 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -80,4 +80,15 @@ item_color = "robotics_skirt" body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE - fitted = FEMALE_UNIFORM_TOP + fitted = FEMALE_UNIFORM_TOP + +/obj/item/clothing/under/radkini + name = "radkini" + desc = "A bikini that protects against radiation. It's surprisingly effective thanks to bluespace fabric, however is still recommended to wear it with a radiation suit." + icon_state = "radkini" + item_state = "radkini" + item_color = "radkini" + can_adjust = FALSE + body_parts_covered = CHEST|GROIN + armor = list("melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 50, "fire" = 10, "acid" = 10) + fitted = FEMALE_UNIFORM_TOP diff --git a/code/modules/vending/engineering.dm b/code/modules/vending/engineering.dm index d36f4a48..dd51ba62 100644 --- a/code/modules/vending/engineering.dm +++ b/code/modules/vending/engineering.dm @@ -26,6 +26,8 @@ /obj/item/stock_parts/scanning_module = 5, /obj/item/stock_parts/micro_laser = 5, /obj/item/stock_parts/matter_bin = 5, - /obj/item/stock_parts/manipulator = 5) + /obj/item/stock_parts/manipulator = 5, + /obj/item/clothing/under/radkini = 2, + /obj/item/clothing/mask/gas/radmask = 2) armor = list("melee" = 100, "bullet" = 100, "laser" = 100, "energy" = 100, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 100, "acid" = 50) resistance_flags = FIRE_PROOF diff --git a/code/modules/vending/wardrobes.dm b/code/modules/vending/wardrobes.dm index 125aa5b2..96d9ec1d 100644 --- a/code/modules/vending/wardrobes.dm +++ b/code/modules/vending/wardrobes.dm @@ -86,7 +86,9 @@ /obj/item/clothing/suit/hazardvest = 5, /obj/item/clothing/shoes/workboots = 5, /obj/item/clothing/head/hardhat = 5, - /obj/item/clothing/head/hardhat/weldhat = 3) + /obj/item/clothing/head/hardhat/weldhat = 3, + /obj/item/clothing/under/radkini = 2, + /obj/item/clothing/mask/gas/radmask = 2) refill_canister = /obj/item/vending_refill/wardrobe/engi_wardrobe /obj/item/vending_refill/wardrobe/engi_wardrobe diff --git a/icons/mob/mask.dmi b/icons/mob/mask.dmi index 0b07349a92364c0a7f11e2e602b9260cdd8f284b..0ea51ae50239881107e9364b3ea12146bf64d3df 100644 GIT binary patch delta 11145 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 delta 10735 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 A4*&oF delta 14610 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 XJ%62mej(=s0srKr-bt2882JAm+j_BH diff --git a/icons/obj/clothing/masks.dmi b/icons/obj/clothing/masks.dmi index 178fed625289106aaaf7bafafe79a7174ae71e7b..dd7c9792ea5348f1f68283a43811f5cb95d030ca 100644 GIT binary patch delta 15942 zcmZ|0byyW&)HXbXbV_%qbT`tdptN*{Af1Xd3>|`ml!SzUbR*p@-JR0ib%^r~zvubh z_pkR{bFMjaruM$~+AHq0*I5$cY%*f>bMV$fUEBHf$IqsptQ?)K9P9zWEw%WESk!_5 zUhv+c5#5ZP?K%g?n5}6lzP?GKRS>=~y*qhKXSDv$yFIl9b34?TWBwtPN=#Am??+y$ z4k1zL4<2_sqFz3tX*%+6orJJymf$|3wr!dcslgJ5QK-XhH?Y%O^#akje8VGT_hjbXa(0js(HvnN-tJZxm) z8;2(0S9$NY`E+{utN%`9dxJqly{WF;os7Gm42*vVEf?p<%XK5|Z5r!n?G~zCyZ2P& z9iQP)c_=!qQWZ!Mpp#{OHlnlYj(u`R4-UHRGM4eJ!GlvY6_T_}5)BZMUAgmuM z$}d&H@$P11-%qk_F=kl(BX7qh@EWyi$dygSUp|3rxD;QDAjwCzz6eQZm6?43S271L zx5^Kjz)B`j3Q?+bC#*FQ0g#?`!$72j%SoH(XiOXubvcJ>&bC`}Wea4Q)7gJV0pHzn zV)}8Qdod*<&*!UcqUmXD`s^h!%`t0y6=9PqAiOf7SRr_$m%w1Wt8YAFYDT=!WCq(9 zjW$1~U-|o6F}l1ax@(jARUhd~^m|3JRq{^ZkHM|kIR8GWg{oEK)!YD1BA85ANgqW6 z$a!R%pK}MY=wU7BJhvllxKU{<-UNT^ND45&L9MXpOXcZ#?|bPPq?M6oWJ044{&JJM zfBC!hiMP`5Jzzo`O8O&((fE~|MaHE>jE?UxwVGb;1N*Pw7ZHtT*}lp)+U?uSTg?yr zY$klnL&d;DsR{bCH@V&&N_lbIA$lhspzG&PP4`|F)Hd(CqANzLzCE!Lv(b~ArrHzZ zc$1QSR7ukMi5`u>Po&4?RArzF+)4{AT;$ zc&ESP`1t1J8uuCN-9f7UKikUZNU@5dI_T)~V|0ORZ0Mw&PY@AA0&F?ZO0q)xw~st} zs1jHE@~&1{vaSkT%@4D(KEH3wiug(qYOMQhpFT82H)#8ut6C^n$ zrGyu^Pxs)kf8l^{7DFr-e44}vIn7O4z}ufTyQi43ErLQY(r&h*t7Lyl&mlh6_B{nc zS8V8eZe-ZS-bQTGdp49?r&S3D)Yzl<@>=pY@e(CmV^`_X30>hN4foI1QSZ;UdeY$i zuGK?C2rYwaxw#5S^rkmuvqj!&kG@h3{tWXm-}VFZlYM=rH`s=Vy?Q1k(czci0#-)7N^YN=*0Np=2aP^7585b#m+`8;B%Rm_h)ct__f}YyzAW_ zeCOc-Rfr7O89h0=(w5Q^a*|HIXGD6A7Idf<-RMmxHUpe)@WZd5?H#w$Bj9@n{NSI=3#gD zy-T~X2v5Pl_KC^Kx~3sNBvi@-EmGFh(($pHAvI;O7kq1;zm4+Cnk#ON3d?-P{p8+U zh!8Hpd7GlZbIs)}DK2CwJY?<#r(9=P!_NSG3&W8~P zop=2CY+9H`IO%?)%;PQEH^djvxnOfHaBXjxi(8sU(w`QsUHFjH2)tWB%g2p=ydy$z zld%iN^9toH9G&U z{1_-waM_600stK9JN$3h-$)4rQAS7KxAP1RvP;*w>1ZiL|4&2d8gJ@8c!}Os42#AE zpr$P{ykoHBBgdzr3fkUg>g?)50O;xIjiG-?NEk_fjat5b{W`FJK1ck&UIsJWo^{@J zDx~5u|HuHd4jR5f7rc6f1fXs9B%U2_U}IyuY`l{C55-ly@*C{QmMzQX+|9pg>e`(j z%|G%qhsDa;1~v+xDrQ0rn?QYpr#37WYmg&+?~SehtHGL%j+8atN}eRQGI<%9mr7}D z)fB*5!O4lre^3f-loTkUbz3epS)+i!iuPY&N>-~fJq9L~fLUIG=v3o9(DQ1|$Wd#O z!FH-RhApx?SjHsI0(#PQijkPRM9(UMfBqqa}S5l!2utPjD8xQn;LXQRC0w zq0Yukc=hJc&;FC(Jr1aA?Nx47xwQ*a{|OcvLVkop*@4Fg|BH(YeW(>&+d;XRnF!E0 z*;|0X1;SHg?g+QrgBn!zU?`v&PA_HqI5jf{r7dU`6)A<6%MTPfiSbv4wa^Q{1F&IQf& zH*%otJo2Kq-g<={CkVBAwGeEyyggmHk*evs67eAKU&w#CFJ>52r}kyWd+vTTUDSsc z!+BJ$Ojyn6+?t}_K|8X7ISi>!O-X&;J6-rQxao`3V);V5^JVG!30tH`j>N~aFNQnI z8mInRum=C5b2<3-T9julydn`s(l`!3rC}&NS56gLjejUKyzEU$zc{>`|B|xAdY|>T z)UD`$qX|qcT>)6#)$%79=UBSz%5id6v zoTXWjB{P=eIbLgfWoT!5sZoi5D$)Az^S6lWp&8(K@MjtWmE#4O+fl04X>HHkO8mni zwcy+gRaxGuQR7%oLqp@3L+u*Q(fK#S-Sji1n)VlezEdzj3=2OVHS?4&0Ex;i7!wA)k{ja(@%~P7-LDmmKvJAC4H7IUYb@KPV z)f6k!Li@@Kjr76u4J3vZ21`HENL#pDD?Vl1=y!}@;p_u#oJLmTMdnJUo}9?y+v1hubYK8tx>zx!=_sT&gbr`}q(_CDJ%nT2yon%E5iR z8qSnG2O7?f%-o{1U_H8`5)UQcd5=5+HH7JOS2pIxhtEyRi*AP%Y_MJg7tcCHpVtiO z@fU(pC*EFn;|BWfr~T$Xo6zS5h8un>=dY5Q3hDLM9rUsz^iUeXx<;6x@H03Vn$LqrQP1vgAvVD&1F|FApUi8wQ^HRF zkdb=PAia7=zSOzEEsdLgwPO=E00faPOfoC9ymx;=%l z*}o8+{&e-d?mIQgTe-NDLXexfo1c64Px7$=&Vd&Gea0%_C;NFdKEUyJ$$@^fL%0? zh@S){JhL;hK{WG)bhJ-M>EK&tBvtbN)T~6SF;`>1^4RAtv$1`sfma^DUT6^B%wRgNv=)*JU@%_%8E@Mw|IQ zK0XhwcReXT2nYyfLuh<@0WQF{>no8V6{hRjcik3{O?9^+9ziKZ;2V_)=rWL>g2N9A zRebO%Fqk^o!OcxQOc&{|?;HHgGb?+$UrFxma_Xzl>zKV@PbRzfF6i2B;67&eO?+f% zc=)T&pTm33LY}?E=HgTh@GSXi5kJV_e5vhN)@awtZJ3Hbs9QhqgNFl4D=n3!V648~C`QD94c*D+p4{-UH2{Z?k zKWgaQxx8&fy)CaGdQ;l>f4ZM} zxA4Zq@X&1Dot6WPl{2#CDM`+(J&g*D=*)@|_1{e<&&Td%{DY*KL(ZMXL5thUjzp^u)TlX%OfxGQg^Hsqt>Ywt?GY$;9Bx&M0&2=K0d;}m_13A`l-sUrK%>|FMaH+xDMUo_sl zk(EXN$f!*G?B&b85(R650Z3l|9pK71JIC32`!$}tv789S!lvYE`P1>7?O8njE}x{v z8%%nFXVK&&7>-yZ4eV$tg{?(cl&A`nR9KPRmV7M8mO^}K_6dAQ^xi2CzpS#J+!vU~ zDxdoynD?H0fcL(i3&9NsTe~-Q22?mS;t>S}ETuzl0@`RNTqCPC#hg;rKll^+*;q@Hnms4wn7DJSjlQ%0s3-5{L641;j z;_o#*NZB&0Xh_)j)!2UN^6k;YY3XwOFap~Hsx0@w-EPSC0g~=-o_uFiiu=Q?j?Tj~ zMuijnxA$$Lh9INxcQGIEr4O@xSH$_-J8v~+fR=|3ub7GfXl=4#z&!i>{aF$rL$3v` zW;hW!QHJX0l?-VQeKa;r)(I9O7b+V>fNk(A0xGTf2fhN9g zYl#tvx{I18{KJE7#JX1A9`269i)0ZG&wLfq$RnYJ{T9dDLWc8CvmT1u@MON5hZExb z^_M~4Z{kftev6;K6o{mpg)Z;e=`0;x#A<8KX%i--67|7tqo;syjPP2bGc}!;FvAmd z{pGK{cq!;PJ+c_Td*DxOb&Q?tSifS3IXt9-A{vZ8NP#xAuJhpsx6Zxe;B9uV%Nkl% zVn9XPl)6ko(;ww+XxCNHDPIuzw`$CyhzRF~O{L~kI4i&K-xviFeE(t^4J1H`4f=ugCsq|OlRc})kZ_JWXE54yL$^bgFmZ` zzpaD6B5TXB^f{yrYL-WF+q^bWn3z?n_+C#wu=7)iBHb7Im8sv@IFZdbkFqKXGo+bjZMydfv7!ZQdhv>*FT(nPjOM!W!cApkW0dO$!DYm4 zii7-NC3AwF*BQS?nc@~Jj9EP4DGp9s4kZY*b|`3oL?XZGWW@~@AZM++54&&X6txgk zmisT5S)pi6cyhYwdTLg#vNSWoH2-$OB7IP5DBuS06?52Jod9=O6#B4Sg_KzcCaio5 z$e+;@*u|GULt2@A|0p8e8BN_xb|@2t;Qau1S^L*RYRn01A|asPqSK$db;2}Qro#_G zd=hm(Dr^B}MES>HhJDBGkkH7NZ73o^!HD_nbG-bU3ayIp%29-}6egP7S;E`{%d69myVD zwcOh!?z{GptmBc)7+!EYBY?-xU3VS_IAAox{g7;tKvPKFIGvhtUn6kVVQ%(cYG+O1 z5Eyz`;a)Z-p#pBOWvp7)K{GleFX&f$BP2)9&M`gYOSiC4kox=k1D?V}n`gj8EJrJUe5*CJ zla^a$zazNkZ3)trQ7!<`0`Fc+slUVe!f&}2!{#Z98=^ z5lMVpJ{^xa0#HoHLvKyExZotXLIpkgWN*I;`Osnk`>gD!BZ7#|9_`3LYwF+C>p#Dz z>aavvUv^0m#cl(qub|cCCe&5 zAkjmq^4hf2w#)T#*t7`X?oB|r2U83>)g7xIOR7+;d!j=KW;ImK(*haAg%pZ*Bql9fso;m|hnJK*px4g%(eD;7h9v5AKm7=rAlhPb zXjTQ+T_pgKm1K0JBa?Q1a$T8=W-%|2>PaQ6eGz!gm)RODblLon2~|V?Gg_WG@+k#Gb3mA~@O0xt#W=M5ghY(ETCzS*Okl=ygLNr`#C!SB;wRVQ4s1N^Snltc>L8{KmJk zXLK0&ncin23JL;iYgV?Fgw!ol>5y1S843LAX`k^TF11@gv|aeXx_6Z**b)(k{MW2- z00`d^n`zQON=HYKTq4wqt^A5Kv(2UcGx7J$aLmKW98O$%L+D3dPzLkF_O{E#QwBC; zJbTgROVuQp#hJpbJA&%_B5Cw=4+*KFMYNbG-C54{t_A+!8M!9ZhJ1aQ;~S)9de#B9 z*8O(r><*-3vQ^)a-7^$_0;C9t#$o_AQ%zo9(;4nF-(xq0e*0!L?f7xa)>{vfGN;J} z{&q&|PXa*3zP=zxx%ixuC|5as^HHQ8*0vk;=X{HGD*secY$*}_yS-~c0-A^6B11n} zUfWpIJReLe8CkxAklGK=;()*zO#|ak`CWshGz6m=8u-60p+{tjF28ks`eX zG1(ZVrFH09g9ZVQk=1^U-bn`uP5;#Sj`A^X?@$B%E2e(<$#b8(n>^dubkb(#Dv3}0 z-Y*~B9X7t`SFiKPyKyjIDqzt#z@=QgAL=r?7;j&Cj`NOCa)n~uP3SzxpbrTNNEeN1l%Di>&9o7bk#6-yK77xaBq)12ooDj$#N_gt2y z{di^s-a|8rvUIPk;fe!_nqxl%jOg0M8MH79;q9zR11N;)2grcJPrR=jv0aQXFWx*i z!foXPO~_7tSCC+5|0Z_QNl@#xB(2RxoXu$v_^;H3&U=SmUjo#y0xXgiI>3n>;CN{d zLn*M*5(|7kU#!<$O_3JCjWg!1{x?pN@E<%Eeos?l%6G=oR}}5n zOl#2Mm&Z%*$1QHz?J*9F4hu#{WwA3drD!g)=Pzr<{d zwG9a{ibrMi4Ki^?#R#bVIs{0Y!nA2N*=FR{}Q zsYjOaLoluJz4rSOK?%Hv;ewB6Nu>kI5!Ze*50}Jl;z*4nv)rwGO{<)VvX#j{-j@mJ zOJ;Lm=wgRZW4@CAh^ei>^gV*A!b~FjNbkO?if^7EUQVv|C^A*(;;vgl+2;lqm+mb1 zqnl&bPwi?)@udgQO^X?Lt`ypKUsK#UPvhgitDC~is1$ng5{ZHtMoj@FC5Gw_>V*~L z&en89c$0VdnuhaI@%$on^(yt^$=o*byr71&=E6^g5Ua1-8s4AZxHL9x@QONb4PNh| zrpGUV^K#Bf_2sKAg0t-K1JBa8Fin4XopgvF4yN-;2jld;4YQAEU{+REY=VL$@H!ik zgaN|{)T2iHl$yg%kNEdIB)Rv5hW`_|-J(cG@%FQx50ty^D8 z7imdzSZ^P$ZA9gIew~LE1d5YIJ5%k|L9lq?60zt2Dc16B=ubW5j~ z*>mz3uhm3RpyL;&D$>i-Jw`=atcv9&PvJ)Y)3{q3tUJCg9=v?GtkNL;80obY7_sqPM3&6d-uv|ItmX5^y3Wqm2|s@H zY8Gj?Elft!qvV4ZXV9573CO!IPb*AT-S#YC3~DBli-BmW6+L6|IOGAx#ej~OXi37a?3wIud9wh!<6$4G9iS?&c_Au2> z+Kn63S`Y`Kq!igy_e8#SP4*dCdpl7MeW+ExFc8Ddp1A7teSUrKY38xCEy5=m(AIkH z(WHku5aaepa8bQnSK3&shI+GPX@mh=0=sF0#A%Qu4wTqbcRb0%DPfTxoQOjfVE=?D zyBwMK8a`3KEj~Itl7yfWNmkuu)qrDLB2tBIZn3Lw?_GEdjhoU=KAdrfw%n?=wEQkC z@4bM#5{9eBOO)b#kvYVLQu>&ynD9(_BMaE z|3cf#{q*+L<|^*yv&go@L7%%S&MTvQb1kh1Woz#oPM`RxEz_0U_}Xh1L1N}}u_0h% z#@)39QAV|rgeH6}zU4ZxSr}IWoJ%}y$hS}hz-k*}4Q_je%VI21C>V&4? zLYBolH^3O6<>bVztE*#TVggJDw&F|MjEyM-Y*iG}*Mt&MQo_INP2HUL=@q4?r{lKP zXgz%J&bdmTM)k50Z-nS@@zc{&FP{f8ER^39M^UAY*K0@e-cBF4Z0;Yx_~xg#oRM#K zVADoE@F!26^bQXvZd@I4A+5u2pwGzB-wwoe|23g*(lsxG8!w4cNp2|m<61B32*##} zPE5@0eGt4qYFQbqTq7FQ@_={2n&N$j2RWU?i=Uoe+@J!sV!-vo-Bu<3i}S9ekq1w| z!tPt87H}$a;sn+9FBmd*QQC6%FkP(IV-zU&aO-+4;}*F#^WbSW&Y71+(l;ObeWt?G zC+e=9XV!Iz<{bOK_$r+qW?N`iFLZ$O<{VP-ITt!dyjv~r+zj#WN7&uD*4J5G9$53! z6B9$A!|mEHW``{j6QG`b%D!L=9GgO*_xI5VfUr_<0=71L->Rsn7;7y}PCkj33nGt2 z8AOPw_*19lszf~sW6EAD-98!qwN{!fJ}J?+%NQIN8G7$JgIa6chS<>V?~kZIvU9xn z8yCOq*t+2(N%-9F9RKro>Hlp;_TITs(rZFWKgy9LBb7qLG&E-Jj%gfA@~O(XP0%nX zH2Of!N~;due4xyHu|N0Psub~=_ZZ`UTjKj=D*{VvYnDqIv0%u-qm#|;s9;T`g?3q2 z_r&I(amn=>b1X590i=Dv_5 zxb3&yMmIa-6A$YKwlqW6uRLgkGlVDV-EU)RL*H$lFY*;<*~+m0*&r6c+V{-4`P&gdW`9R1(SI8PxVtx7?(r&HIn$RnTfA+0`HBN zp@bd>84AB7H|W(R@}1Qr=h9#&92ZIvf~)H>&ybSYc`GW#JUBD@QJAFvVr?5d+SRA^ zz>2(`;rMhtg6L>ebX!k(Tb1lnBC>tUaAUut2KAnAl)+bbOHJvgdi}Pdtmbgdvvk_a4 z{D}ZT%k${Bi zc^cN|=gw`m)%4WWAya8xLO^TniP77Kwd;e%*Q>JEU_+sInw_}geJVnHtDe#R**nTY zbLB5?XNNr@k+=Ioc}7c%bPx9K=7xEtRkAFNCspK}SU*U}xG~HtpBzyATq|JdAMVSM zVBte{GVRW|mo~xzO|oP%e-)4u7fxEpFj1rL?x3l(E&)k~rB`mRB3YK_>R(d6bne~g zn>OY`6WOq5gFG~X@Cn#qH+{&%PQ{+~r%$8`22y3(?AzP5zAG7c&R5O>NT~60*neb# zqBG8FXNbZN4>``yf0*zj#o(#n0!&8{D7hF_49YOo3WZ~^ZCSxACbJD~9VkS}bJ*#e zzlj&WSv~1atl9TaNKXESy9DEmi2Q~G#3d&5TKhMiEXMFIuHJ$BH$=X7GI>7kuCg$q zvwfD?e>AR97eVMle?41wVnxh{fBL`jR5mtx&=YUKTUlG>-&z-IT^||l>-*4M?IPsi z7^X>qtOtTWp3M0IsX}!3aPV>?u`=)Y{fat^9dWhm%a}z`#5_Vhk^z z4D^gJ7EGjN$~c}`|I`j*z1Eyr|l|~we*nT4<@^$>U;*Rp3CunPuD!J zFS~3nHMEcbb3=Zbqn4YOPo3Yj-_4z>zV7a9|8OXy@g^vnp*MvlikF~B+=1|S4#+39 zbS*OvZqv7T=f0Qx>2-$77U(kO*1IIZJq6wc^w=D`%9i-&80UW|4LoAr2cTA z>@VWaNJJv7s^%gugRmg@;od+Y$kxmU8kwgdkat@lRSBGle776dt;7D3ZiM@Wlg2JK)fgF^yL#QGq zc)Io{&+@x!epHBq(ZCoFkFl+tlpIWbLNg8#p!PUy*}puP?dF8>v_@%e zrE0V^HgxC_IGg)O8lm)BfMDg85`IN_kD*%tzkoBHm^WLR=QT&^Ff=OA6#nPf9HCgs ztGFm;j5T6C8TyS1JHGD{CjhVmKJ-8XTAq=U|6~O)m1m@HmwiVrY3s~a@1d}wUZBcF z+%8lUNg)PHiHy8lhM=A6P}j$@Fds)0x+tfvboW?ivbxyl%mJtAb}l@WN~b^nQ&0#S zkViiw*kdvAx&PvwJzQU3Z>u&dYnyK9?;l`XuI(u6VBSmd92n5^Bpv9Z<5CHaj;6Kz zlO}4}D?A4fS?>ZnmNf%Khz4{iWa6 z-=y4EwupIN(t=`Q-mRZ@c6MeeEuxOa7@v*q7?WwO4jye@T}BXDICn`LQun9O81qUr z-;AFQG^+ITo=HQ3Ijp^eEH+6qa0jgwVZr!@ZP4!O11l$4GWH#$O@|PSgdZwWK4Lpi zTApds%4qfJGq!1`JdW?szl1PksGa#=&<1sC9HmkLn2n7aEs&A_B2<*7G(5Ebv z5&)K96$sh`#E=cln;d#EG*v@OFG{$$C>9!ub|OxQ?{M_8ORUigL*!TK*mhK*m^Cj{!FyhbG`OG$`j4MxHIZ@9G88zKHDTUHl6&ToneVG48f6cd zc6M%5*O1+9V8z3|U+Mh`e$+7L(%rS)*IQZyy~@JWJatM^Qx%&DV=TzSN5jEskJlRN z9+sd9lFN}+al{h>5d3tJQ9@Rv3-Oa_cQ{alhlr7od{p#iTDXWnEd<)RDb%p%j{2Bu zBfUCFL_n3UodY}@zBT~}N1ED-8TaahK;b1F6o5u>r>CU*C{q*f54|xoq&AIkYUY!; zPZQnVLcol+5up~JKn1F)0SvDa8dA&K+i{Xg$D504Pc--`EWX_8jIJvVy#M^0wR^Kr?^&{*E=ViD+&ZOxGlS_+ww=fHE?M$s zU%7~m!vg$x9JVdI`8*3Ntr~X?XFGppz=b(^$1~i)oj<$+1Nr zn?Jglla_cH*!uHUJ2QhiI!+yRXD#C|o@e~3f62iiUL9CT`-%b&&qg4{WS6JyWv|WU z9ePM2Iwjaset(4+oa(hdUxN!p^Z-!B_@eyd)gARs(8r3D<^K~0d*{>CzrYPny~EFU z5cr(OHyeDpwZ*u$#vYEqwNQJ?ng@9eNQihuycn~-i(4r_YiOT8$IB%7+Lo^l1(BTJ zSr`EAVw#?(zd0oJUJGq>N9(ut01#*jXW`} znUz!bZaXXHdkD2b?7rV~I>?z>umQaSMIaLnVYi}4u-$xDQw#Yyk4j+l{rgyM|7YNS zV`!y?ElJ8dW~(yYK{OSc=VXE3v-U{DEl$UWmxMw5l2{5zr)b&&@->S-fo4Wy(mo9_5V&T-n}&vzVFNi z?eukaK535f6aQT!`|*)ba}mZL3H(TGAX^4KMXG@2S*t?JNpfr^GlOSpDjvI@$S*cC#6Aeq+Xg7LMHHhIJWxA4^jutjx>t8u3_o2! zz3OG3E~C7s-)ClO<)7w|Qv4`<3Fn>!0RVmHaXA2wg~7)fg;xgH55vdd>oCy!-n6Lk zGycC1?N739FJeLvW>P-9Qlk)e2NSdB-(5+s&tlNv#>&YZN)Oi2ySo>1S1PpyD|3^g^0 zS=rduA;6DMri%5ULre@DDLorZ4i^_=bxWpt1qMf8V3WG@wM<6SAX+zR)tsch&~ji? zQ;Jfs;T`5eX1k6VaGnA7|_U-wtNyPgm^O8;Wl8 z+*fi4I|QuUB2w){hGDiR(s+Lx?{V$>RV**3iLm`HIa`fC-Ju&QPib?aWXR2-eaS#B zi$m2Fk4f??I}h!P#^h8%->1@fiCYRS2*ngGdp0&Pu`=yq%cJ^G$!{nuc^RWK>kxVq zlhbS4oMT2nUl2Hc3n@+l^L-#XYurRxgGfN)4mH)rTGm#9)W2OO{37%H%@W+7e$a4@00t(t6f2NZsXexC){wGDMHc0@)JD^sI2g#F*py%(4ElArf7<;z z`r<{3P~`Y&mNY`E^`D=?O-LF88u1$yP2V2Pa#v?(Ms5ySLD_rDqy5(z0zeE4j-NIE z5cxcaM&V!{ zUgH&v=47D|L>SSc^TgO;EyM*{C?_jNvtEr%cC|WD4v2}NVPU*}8(JL2Dj>@Li>U8v`SGVSF#;sOdo#ko;mGrYQkKe9Bnsnj;5$ z$Q{la%`@3WL`2e95yGCZ{&LjhP2Aayl37xMNzNZa&DvU|si1T#bNSVHt)~TpJjy^K zsOho`{jhGi_;_B)CI9+*#3{0+6dX>%Pb;u_ns8xYcIpVbRL7f!@ubnOTz_1KUQ5kYHB zd_}6h$TH`uu0H5FAcKG{{1A1a=~Gyl{=Y!dyW2U`L`^;Q$+M)fM0f*;jCz)%hSy5w7f7^D}M1(D9 zUaXNzZH7>xbPP)_*CKb5cB2-Q-fzx397U;=s{@(P`I!#!FEkWgm%@r_F_Cc8+ z4Gr%N3~(!FrwIFh5dAK(*Dl7g{(~WAUP-8m%+0n^*&6e~M^pq0rQzP&P}Ez;gWNYK zYv8vSINyAKXpxSx`Qnv$5jT_q-`L#z!0l`CuvY4JJVbHgP}&&eYUqid+gJFQ6h-eZ zG5kYlp+qD{P7CExCHB59w!Z@%;gdyqc?c}=cLR?c)Ijibyd~& zc!(i2iI3Nxuj7>#mVh}zbSfZO-IoZB3RHVgt4{WRxzYC6$glJudJP!|XC%Zd)=p$R z)-U;!#zaF^LsEFpo<=20Mo|k38?O%x>|3HZ zMKiN_OGN=CVWoP5=WC==MLz{5$tZRYRH1R9I8r)Rb%wTL=JfUs{bn0cw8X=b!VBba zn?MzM#!o4*Yz7(+T>gBllnW-XCtJbfY-|Nu&-+*b($+!5R*#me!N-aTG_WU&K?Q)G z5xf(xg;(psu0$>DzrOC5k4fn}SZVdkg!&ym6o8Fro(Oe`N2+42o5V zkNv+Tcqe*D`j9LxR}ThmLrVZER&I zMH2PdSX<}4ih|0!esI}hAG^tYjsBv@&idI}6qAI*jGdjm{VGc~%HyM|Ocs8^>1V+A zq;$W(SWhI^m-Dd$!MHvm7;%CevcX?OUj)5T{NbB0r<*wtgN_4MV>_VX;#xql8aFpL zhR>`wu6tTyoU!K6&1UegT1|shDLlg z4gnR_U~)=|@Dj57*;@bNBK2dTTp-W&0WGPq@#mac=1PglMQ*_McMq5?(6V$OvhbU6 zQx+OB8>SE=3*Sh*tNXD0!^pOOyEGv`(ceE-#ARan{6u)!{@!TWkzWED18L!41C-vg zFaL<7S2||zm>!eoD#0c;zKIzB13A}zvLpmFnl#4$qvkO-BZ7hWL1O);=%yhcx)^{y O@7^fAE|E6&|Nj8j0~QSc delta 15820 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 leJ6|<| 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 H+tB|783Rio delta 16309 zcmchec{r5O|M%}PSwfbSC9+gf*@{A0Mw|9Xg@_?p%1(CXCZVFV$Ph&&$};wCFrqBk zcNvU*ANyEleU84*_50^}uIKmr>$$F(dpq}X*3aj4-sc?R2uIiu#~TqoOD+xwg7&@W z_yR#3Ik~b)9HNX86&7P+1BF8Cu$Cv5U4|%sRwdYKRYOKOibpvR+_rFghusX)@G5cY zuEOwbLCu4>!a#+OlwyGX<#ab?t!O3*q(3c6{WXhd3_**^Cp zW(^{+YjbsZIzHlXqVN3kSFbL5c&O^E_T@6~@7Gy9V*S+G+Il&z?sX>rQ0+SmLqU6| z!o9o;&CJq4X9=AE(QtmLS}Yp#z0w;$=!zdKnfmOn(8{(DsJP=iruzq`GUte%?~T{D zNFHJIAA9}L`RgOQwKgMOyw$&V5H~?HpsxpD6Bo@ zl6Ne;wPM4&|I8j-CG%U3jX*Hke>NDY`(q)Y7XJVmZd(*nBcZuw;ZAMZ?;#b5i)h&SJKQU4nUihj{qjnrY9IEwGh+YMujuIBlljsv zmkCD#Ry<2nnV+VDK9^ZHCXn`F$ztE4i=z+Hf&~^SI7+^pRCQ`*QN-&vuBqjr30WFH zI6O~bA1^Nx2)~?)U+ZBPoe|=2;IvSf4Jf2b7dpkRF=*E|YCL{-TKS#3b1wYRXL-qa zuk>}#5-}e)9PY)hCCP8$pj5|Cmb@<3heQ>~Cu&RbW9&EngY^fKHAZdDz5jjaO97>~W={Ft!o8~%k@Wtp1HRNa z5d_3Zpc|GR*_=ZC?TK2q9Gm>)11<{+A6DYp8;nLsH-?g3b61$7za#cf;s>2QsUr_k z%RM8w=Fx@qM$6>hZ+y&d0-fK}?{_iUn)Tx%R?Zb61@Cn!`sAd=3#DggFB~T%C!hO- zDOx_R1}=B8>WcY^uPxGz7)RB8qYxd`D2w!3DUy!kcUD71&W9t*yR=^IpE5>2PP8!0 zh%WAEwTQQ?`R#$(a$8O?96DEoS$;=${C%tIj$d1b_aWyS`}$;%ecMVqw>@SA zp9VviV7KZj&ObYQ%PY$>A=2$AmH17YnUJmH z^oSM}_3HPBG?C#yojk|YFYK(Aa(P~r_iSW(eO}%q=D0+Z`UMD@4EvRCGiIH|^X!|Q z9kD0#UI>~#Dq>RX{K-mWsmyaO=V8Nc8=vbYUPY;Mu!1G6=*LyYdyQl=oTUpHx_S(~$8t**W)OWCdSwLJU5?egPbR`F=TpmVv9R79zx^VU*yY=gCJTef$gQ6f(MEbP3KacfYg6@k&qD1Xjs=NN;^A-7-8Z=|YyewLgAc4gE z^o6xSB-CX1UsV7B)FkJ?(%qZO+30+Cqc5oMS!Tt2d-v{r+>1Tw4ys+LNKub@l?cH| z2b2|z__Ky%byA0;YCv(t`}>~eC@=omh8nKeCAu-;-WY;v=~1@GqrA+OAEWozLbIwt z6%XcPIAMuEgALZ}@~j;gCv$@BMCLhC_Mo#mW((ikxAddgu5=OEIvO~cYfT%MYs)fI z?<0HBu_=N)`ta>n^7_hE)t%@ug2byFB6+$eOT0)Q!v^f213~1Po*hNd$kO|^J^pjQ;wkd!M|0g z;I*RQn9V41x+&*hlD9kY?9QdD^2fTalWIO+Ete7sAyiO*kP}1v zj|N*iD!BeEi*5p@Bv^gO2RYZ1wYrbTcX{-p=jHk*jgFPy+a8Vy*m$PdX==?Cd)s9@ z&HKP28JRz3+a?^0T8=Ha@H{TGre!}1{bJ^k|B=y&EqwQ5qKU&NihOPJ2yYtP5&0~t znz!-g__x`|0sDl*+=86+O+>|SnZM!=cG7KaNHiY%=4s_>S0fyL+$-S0DQC>Ja=86A z;pcO~gTqwxpUuS6`F0037XMf-r6u|Dn>tWc&4&-0Uj|buH(^m-reBHS40khYIdD7t5Nm=xLzw-0F{#Bz zWNB@t^X-QZp*w{ROUujibf)PWo7O1ug9N3G&lb_os*f#t51LM znY!hda!ssCNbV*CaW5PTB9irtjAG8X(ALQsZlgOE%C5DAOrK%Q`G$su+Jme2Sw167H|-C( zn4QIit?x%zWdrQvQx7&-J9L=Bu`0-t6sI9-fDJQJ(<79&LAR9TlZp#JstVC{UlVFO zBR^i{=a$z`289NrDc-oPP|lmjTrw*VeGx>{Z^N6*6e#HU2CRqkov0IcGi%%vz4q6B z4HvUiEAC=h6Six!4#h-N(UgYK%oS{UX66O^>ARkfMOS`}<(KCj%@D2mQM8PC@#4ki zM0CSu9hKj}(6Gbk>BwowfxCyhp?ZmmyO+-qNG%}EVnBnEp>ReID~tWv)NhS62#80A zy9kCIz1`0Sv+zNbx%0v5AGXTpJ=V?ocDELj9JJ^AD~L-h%01n{BA1QN+P!zx2PoC% zPCpad%Pnr*D#HKBh^u#8nwe7GT1(8%wlz^|f$R2rr+XujRWqGwx9;70A@Ujhbx6X! zqCGX`_j`Sv7lU~3j6weXTsc8OL7$ZdIk(LvD+lZnyl(}0RbbOxOhBAtk3+U!@}aL) zb&+BrWo2h5Hwo3%=RAkr$eeFWxx}BKL;2(i-)#^P6|lxGz+PvShKQvS;e@*!W7#e+ z{h%qQLS4S<-)b_Ky=s?`XKNW?P#~%GO%xBXv@J2LgpkH&iaC#2j81%O8%{D(b z*NQB2)Hf@xtJ&Xp{gxDzMOVxrcC+&L>9oKuT~T49avM<>ZSLMpvqoNQGckX)-~`)v z!EAqgir)(noy)}K(r7|KkCrAD>2rhp5UBf-)z#I@^Qr;g;H}%Yktfv;Dk$*MW!e>CMaAly zx)Xav-n=;}y1cynJSwX03yv?Pe3T8e2qb*j!_%{HWO2=ue2IQef;xM=O}Z7{G#l<| zuWH(Pb;;8{N=1<(JTcN(rRB5l!y{BBf^q7D} zi=V$P7|Cg1Y#d(b(0kzI$vxVBYq~x@8XrG?eD=C7D984hb*Fssf+vyti0jBb-CKxZ+n|dG(N{%E z!wZAA(CDb==||?_@D1{7Wtuzh&)LJAeba)+B`~Vb z(-oxoA?uO-J02y5$Q^`u$-O6_cY+Xg)gOOA^-b_P>A8u2qv%7+UGR!MBQax%)eJ z-AWVOarQpH!GE%%0rcpI{KrtCz9XZ)NyjY}Z`uxpGzL<~#G#r?-w;u)-1Fyl?>M`; z^VN1tq`97Qshnf0fOeb}0KaGVv0uUwN3iCNqJ<6Mq&X>j z)~iY;R_jcIJBmFB6c_tVxyI+$I3UNrdF;TyU(oYA6R+WRpvdtr8&v=NT3C9Bfsx_9 z#uxV7a4dND!@rHS>`hUxl)^ZTJ!h3&&-~sLo9iNIxd}Y`w1d8c+q6tGfbED<1~(1Q z(Z$VYH$HAn-IP?$WHRSjp$iYJn3-P-ZZe>!{mOm}Wqpb9PX6Z^aBydXQ9w?oJDgq^ zaYaD=ugYKAxwjz1za4L#C1OQoO#lBxrN1A@Kx9 zeDmSK*5y`M!Ic^6A7stO5I6ruBv_6}j-LucrtQdvh2YB07v;6C^CV-1rcV`)36E&4 z*RR$v1Al`Q3LC<|cg2!faaSIZL)kaCnEFhJCc>ubK0(XJzC!k|FW%>2?16S)faR9v z&3;yE&lV_}75SL^KAQRovZL*ejZeHzBwTZK{kn&@9kcxF$s$IV%r(Z}vPZT| z@L@;N^n=)Fhd6Y6;L3!t((c+XmNE+FEX&N>aL?1gKITjJclCKb3kihMD`YYQ#KpHW9cTOVB1n$5bw@5Av)%gLPt_*}=)NBr{+vy{FqRQ%v6hT&HU8F- z)u8ge!=$paVdaCfp0JcuE0o^pQ~EpV<^v;Y%7=o=S*xqMqZ6&y;j7l=_Y1T;3{f}{ z?>WXmg~<#vf1tHjefy+&u2rq<8I?jz#1|49I@J1%&Sg#qJ`Hdl=l<$Dd5)3?|jf zIW$ov$b1<7$th|1Pc333!r6L#DVJV7KyvUxP(aC}_nyX|&*+r!M-rk6i}i6!1%yPp zKG&+$y|hiv^*N2j0rrW-woAXZmTCL1GW?%;CK&f-(itA#j>BK@qR+4C-Mk>Q^66%i zh8OSFO*v@dPc%9-YtvHhv(Rv>121Rmg_UfLAw|l!3by;7HR?N@FO$7R3T)VX8LIC) z%4Zd;TXEDE<56yMU`XT^HIlBc}l7~ zhxXp@&1?$4ai2|TRw-CSV}n&wN(J7W#=XZ@*$d%NS#LxunPcASs=BMWhrf4D z+Pyedfrd6z^8~MhJS0Tk`6#Rk52H0b8rSCrlkp?8ceLDo2o-cF{;Ja32)7e#B=&@m{*xgpFa8mQ8oNCq#e|iurLk{2|n-(0JsYU zjowb%p{E5cv-;f^s1j&^yuB$r;T_3cS zlg&8c(YV6dkp)kgx;HkR+gEC{g`AmW>XsIoOnifKc&057TD5xYtNHkJR1&DYFXZmORHpuagJX&mc9Si?`C0% z#qdFOv`#y?o1ki1Kx*3c90%JPe*A70LuyjAW;nnMzwJz=JqC8%D|oCfDy6*qeudaG zJ7{Z@08TmGm$`N>AuWLw*ltD^)+N1Hj=pgg`}^F|6C@~}#x}vx_T5ZR?U2dfz+$7e z_lnQaMz^f8!m-hMvefoF>+3JyF)|w6TprWF&@~=AICO7(`0(L*C#`<#ky{ETLV^(u*j1X%VCdtMlh>sJ8p?TwroSQMynoIywi_Bn=?=3`a6!%VW(K35+{_qI z^ka1v7ar5k!kXa|4$!IaBYLhT$&Qs0uUl516pXxK{P(ZN)Ocjb!GF}TDQN)te6UBJ z<);5TFZrCLG@S8_GjIh=;;0eFbDQIz}PEFAop^^+_TNLO?{gDhitPS)ue>-NGqG-M!sFIoR) z^V*EJMlw#5Ktd#~4;R@q3SUpq5EPr4aUA{iqA$;e2TE!)=e@=G6GS0i)3;oofH|G@ zup#BW$rpUdZJ3a*H{D7_f7akizRAYiT-{d_O4T%D0nS07S?YO&dN#5%lJRW&@dFI@n`tm6m&x-@kr~(q(3{)806h4x+YsrkV(YmSh_{4-?TNWONr5c3~qM!70h@yNtuI!LPx&kDo4%3<^d_KiZ!Qnw{`N5D*RJcocRguXG=^e7MAsH6iz5{V zkmS3uYAX|e5pW^>`*}42Hd$4z%;a?~xv>>jogcM7zX?73MCGKPeM*`Tg{>`b0c#=t&<#@I^ z_4BKe|5MnN*uJjg@KfhJVRrJKMtpMz1I2m6f)@KWk#naJjVIw|Oxhq} z7v17{I>DBuwxZr;T+~|NL)+%hj|^fxPT6H^OFti8TpAI{Wj!iJxlHL{D59`qE({t& z4pn=JH{mU7=pw%r(QslBC(@lyko7KZT6DdjYCoXIe17Y6iFf;XC`hK>?h+|sBr$Po z`K3`AY8ws#BZ{&lw&^ejSY0Yx6}S+KBF$}FyW)_s&_V|`8#sK~tihit8+ONn_gRaZ z$56L6s4Jk7!6(S>rZZDIssQ}R1)J?x3>gDiigKN;gAr1nzGm~sVHRTU!b6g!iTJH2 zZz;V+9)UCwfDus+01cg3{nUt+Ib!Kwrt<7&ipvz0fsRJ|-|sB)ATx1;N=CH8x>G6Z zt%KzW>13SCRR37iWx{%i?Hzbwl6YmE**cgEx4>RDj{Ea9lkXWmK0KCKiaL7g{b{?2 z{H@;#{i(aHFxCF zpFJ-Rs2;sRnVU0D!kZR+1Wl!oxt)?S-wOHOnd<7S3uXC||NSwiSG{OFE8^Vt;SGO!H@Ke)GORpnrk7A}UD@t- z1J9b9bD|WrN%g`7G|*~iCMH+2F2IiM3oOT!YbF(xU#Sm=gZWVx?qB7Ye{CNf6Z69y zca_5x38lwrWQ;gNKS-zL(ViZJ{=M`3Oud(MMFRJ*@p)<{1UcX;pKN>Es{&+o;Ns&; zZDyB(l?$9Wi4?jgj*+p*(kH)u+h9DPCS(?iogbj?~G7myq# zV@A|HRux`FQo*OGuK?QEI*Vb@;143jEes;Hn(-u#jGl|}r2__m*X9OQqELDZv5y?S zZZ;3(6%mw+dH?GVqOd+S28|i22w>j@gGO-Vo+`hr!{n9a_)+%Rn?`q>LZcq z3`2;29AQ1Kw(r|vHm9WtrDJ!HsG(ExH7?^8ryPgx1}47RGRsjEnxT~J-LKg%NjPwT z`!H%NaEoW~clt^f$FJ5!i2nkk&^xhl-C+>)3uE2pV^0!>cIkd3)qkqE?yD7U4}-p0 zn|Y3FR2K#3-70@t-if8^-q_FDjD^)J#NXtzjz$q@r(+6P%O|}3yn$gVpo*8;bfak{ ziGN86HQzX;?&LrH9CqvxrUH%*EA5LAoj-D1aM5?}Ef6%V;Qn^v%w-ljW6 zRUVu1N&XqWXfs>kfqF%G9*HCBU?l0Unv?KNJ+(G0?QyLP^%G*p8D@(!=xI?iFQ=v% z)tet5C#*9(;e$km555!9K6xfXcM@)5ipzRIc)q-Lh45_BJq zP7%$_U`dIHbq8P$9F!w3P=Pe_;t|pGLt0Ty>>aT=7D)EcXWh-h3hg`wbx1M}!&s#M zS=Wrdl;vYXEVx%%63x3uYDlIF*GzrH2=F_9{w|ho{!gUZ=C!%RjIy22w$Y6Xep-V0 z0=@Zne4sw*|N9ZV9f|+$!_$V4#zP~W|0~6LXe7tQ{ys!NF~_^Ef5C(wJd;FOY-&wo z|06X`eb1_0mrJwd@MPHG@1He?SKgBzZ^K%RVDr_UCM1xz;Qv$KdVZ}TC|&x3*=aQ9 zmbg`YW`NgXa(Doh()dW0pp?DXwWxG#&#Znz&BTN8_Lunr5&Q%9<^ zy;(RwnozRDAKX`3S_%cNtv!Ksot>2u@>c{;981eU_sW8JhX6D9UCLlz@R5z8RPpPK zE8pWloCPLHMNg1Lii1JGf9Wu^E(?tifZNuYQ~t9H+EDW2deMnJ2t3);y2!=RwF&UV z@hrk1EU4He^&k88iMn;R`Z3@q=?8aS&rpjslS4~OrGmbbCfpGQN>48cV&9GAGZ&K2 zElFQ|hRACS%h>(l$2S(*2M){kYTZ| z6SyU}UusrgCMDgyF-Fnitz7F(Co`D)5HfRfiH~?!@s=FMN!W0aRJ6yQuEl@eb|OE; zr6p&e6%Z7#zT4LXQ`~=b5t=KSf8oqIWGHA=eqvJQl(oypUX&ZvU8ASTde^SIF;pQU zTbt80gv3z$&(=X;v44&{FY0Q|ClF&k_5zkzF`Z#~x@kw)XP}_-Fly>k_u|O@vlLFt zGG?i`z-^X4ao|)ErOmTA8^BCP6O*Qs0Hh!GGiZJB zs@EA&%?aFfvl|LHf)|S;a*oy4^xemf;(z&ObHUnXe8R_u-IpddwU{2>z^h7J4DE4Y zsTHg7{J_ER{i|X9JP#?$#&c>b9_q?2rD$)rgC49^IcEC<3bS`FjNL#@)-`4;Kmb(Y z1_hh%UsdOfh>Eg<`sky6YJ`%{r$0EKvGu;73Rm`$jNiR8G8zo3`EBmXGmv(_NkAME?+jHHDXZk>!PN+Ou7WSs4I;>jHLAgF@Wkb{lwNB}+3;K<-q+aY(WCFi zv+)3LoP8{$oHRk0SK#xx(8=6$B+wQilW0TR7+sINL&8298iMg9&^yxfKL3;!9zhA`}3$ZDNvy zffFYtzBQZN>aADAGiC-P{1QZ0oFBV>)LDrz~a-jb&f-% zzcurMZX(j%IPL()%$sfx+ld*7QPkZV`E)4@x)Q8cDoMZ{7dKIWj^vB5ALskEb!jdp zklu^8ffHF-+*SBPQ#{8BB|4TzeE>4-0m!hON5M-DgL!2T$gJB-AP43^-2G{22lF7h z9#BR=eiRXU_CIF;o+E=d{Rj9KbU(ol6JhZ1ipREo1q4PXC-l(KqN0f$ao#hZ8O^6N z_o)d0psD;CGsrdw$0Y(Wa>HTJ?WmZBr%yPbr~N06an=nb$o&4NW}*lsLv7}Hwx7Gm zIPb;*rk*qCZAMe&Qf>E@Ax_hz2s4)#V`e~FS60a`Pg1a%WEZdZ_oQF5#^q33xFJ$1 z=UL*7h0Xr8;SflgZdL9TqFGrIk24=RG#%+tEXK3vdi1n=Vs$U}TO| zPgXh>-N9@cptqcSy9A`I$ws+%phJ6myOe>7d0L*-wOx5Qeo3*`>d=ZR{e*jrhlOy; zBK9wnLQ=*v;(tr!F>IX-!brV?mBwR>h8za*f$cRS^IaqRs}ES_bGxgz!cXhhfVM01 z{U0wqZTQDa*Z-+yE-;W$iBc#;Tj&L@MpRD!b42tzofpa@15)fx8OjtPG?w*vZ%m( zD+Vu-ah|Qp*^7CkMPBKDBGnEz*t#wC#Q#>1eo^@U=jzq}NPhb7)iC&fD3<-_b2|0= z)ZZ!AZ=F#6SS&qNr{FMfxyH9Qk8tfD(l|oI@<&4PWcL$LEZIG`IbQ9Ac$LI!`!DiI zs<8Xx!&}H{DHZud`q_Dr3f49jbxF;`hYlag!7r9Y3{JRuX@gL11; zQ8>EWy7P9I?sb~CqaSye>_rQ23<0T&sbUWTgI$(DFsi?-ZwJN)f5j-8b-5?=RrfER zTE$0jH%RHi4Ih04_CC{)Xjf2@tx1!DFy{A_f8lmzH`4)(Tn4a2fdN;+&$59C0x*Kd z2?l79h+(+z?s*&grYdZgc-Y`)^jLnYPEE@v&0L3GrTKwUp~S#-F)x42E32BY;HSEy zdK2-t3;X<&xU$19RZ%wY@LqfQY;O6xtF{)KKmVQ)5ZL>Pv_k9-uW~e#@vs76-*RYv!;ZE1oxjc}S za|EXu4lB&-IMDc{h%wGp6%mpEcYtyt1Nh_1_S5HCz$+iRiB@_dm7rpah$IU37?hv3>F_An?#dvkb(bQ1^^f+I>VLO(V9;^mHOxyZ$;H)h;y{?8}+teI!wvdWW3BVu1+d? zuz*uG?Pl&qPnPxe-dLS{_Tj@rVf<1`zY;-xQBgTbgRd#pMoIBQe@HRwP3QIW!rmwh zZ)e_w7Ukf;M-6Vy7CKLg2lY54`l&N~zs9Qaz(-hv`?NlTEBR?vnn-2M;p?Iy#Doxm zz1>JHuKQcFw!+}3_%x?g^|KQKf;$#YdxX7;;IH`t-{9oQh8+uF(( zjfX!UFg@DjvTEmaTB5zF(_rGm#OldAGCDevsi~>^zX27~-ab9goMITL52)qvOa4W! zSd;-J>RLn9_Zm&MQE(81Pv7=uCHIvw|1^J?)W6z%2N|N9%>uoNyZO0!M3S{?+9+rM zKRXTB0c=SGdW4+>oL;S&LAp(ZNua*c6-)8QQ5(}l^sjUY34f2U3FdZmf$)^tB+keUcfB% zn0oO0&xe>YU#NsR3?)tMc1@MMUHfc%P8X>4a~p+hgJsAs6(?Yuhhp43Jh$Ab1vZUU zAp{0mqHbE#`TP)1;&4?Q{3TVAi_G_xw03)Xim)Eu9kb=TRCn}@uP|g_ZXTYVE(rxi z$8&yPEp{FZx5H}N&ZuehwpIC|OWADmW%4dX@sZ5UjO!dDM+}RdMW3D?wv?elfLE*13t?9EI#a$gDSx6->>6)t5u z+tE7(`a>17IAys!rk2pV=#PJ8HuKAdY!^zRBl%z=3y5uZ=9Wp`=?716os_By|9A1HU zAW-9IV3Oy>>5x`$Z?Z^C==G93_S*|fQ0@i<&Cbq7i{)-u{@E{i=>ANf_)_39H#1?T zkM-Ma9JH%v7rigpdrK>nX+}<(ec0K>0q^~Qg^v8Rc=F^>atdu>DpM}9x$D{8r-hGXedJ9vg7C?`rO@8x< z$llTJ@db;Cto5nMNk1o-1#gkP4?08me^5jwHcsC0b#lQUH1%AaKWNFIPW`>UEiMOa zK_(vqkKKD|wT^}D%FJ2?^O!6+eFyR<;kMa+J3*2e0(ODap>CHw5Te$j{5eMJ2? z7TA+^_;r4}QIp7m>2{G~svJU}??=9Sw|jmNFCr!+sR!<)&orMhQe+z%ER@>$$hytW z#9vy+ssH35Sy`+8f=8lix9%+lhS^BVIPn(zOx_!vpyMR3aHsz-)y26k+RO_99g~+w zK)0R$hEhlad{B%XD`AXwU@=txcz@h$AVgP#MpnaAehniHo}wUf9HAFw_@`oNC%DVB zkPC_)&i*=H-diwjzlc}5cC{trY!cV#`E#zPPwttju5nY+k_h$mj3f{w_PyK`IHB)3 z_LI~Ur@Gvk$lRk$psOhLc8^y5RCX)P7B(w({;dyFZx6sM#<{1ux(&1DW#bjj%Aav- z)PR`|SXM&Ir|og!KFbe@D5BL+-`buvGAg~(z4r%cQMd*Y58?|c-$L9&w>*xlH2&YD zEneDN5ij=}4Cx0yxBn;D0!_H#;nqL3S-q9{Vm-cetNGG@8iY{^B``s!fFI=I(o9++ zThKnPY_M(tm()u=YLSy}JTI4HqdkU!PeSshY6MhXlC`TNu(0No@; z$&+ndp3kdu1Z~3L?%fC#?+^Qif7h-Vp@Viy$CPFm+=cH(y!>-5#v6guy;va*3Hv zE$CJ~Pb5t6)f^BzJ9~Xgi_w%zAj20&;OxoHVSunxmkXZml{fCkfQ*ZLvHV(&wy_xH zQZ$Z)D*wKVI&p#*h4(L*u!i6Yd#8o|Cp@vLvo=Hr*u)9%w8T{yZ_KmEtN=&lz~-xE zJVmtx^1sfrL1CiMq&UW=b`ecdLiQmet@beSgj)+x@$JOlpomq$w?I>1%9RE?^Zv|)axp)DwA@Sy{EPH1s8!H)^7@R*x zpC3};*fH+z?(V*PJO0DhV}mq1R9$K0Vrx;b_(S=1hv@9N)IYD##7ctVUZj7f&WAy#td` ze6%Earz<7Vn7=v|<>eC4aR{9(sO#X6kz-Q=ij-HvJiJ^)XZhpjjcPejjWWI}E+{;7 z3z78Ws+fH%9)n1wVfFt$s1=7GPJYkrDFGtCd+j2`_63zxV&A4Agb_p7^fbhw6KODS zTN`FI{Bjt}@)*x|Vz(6)SPxvh^7c86+PI;B=DatirxF{9=%Q}pFP4#pxDKB^i{R$w zeuKq^Uy}6Q;p^)=dom**V>;OqS5tsU7iQiY_uxWUwk4h2M$h*C{+E4yCX{Zlk9VoO z7pN6})X?x0F#Vs6fWiJrN8E+AOMKNICJm^l-s(*@t7VF1F2r{%Jgm5BTr-rf zu7y?pY4ND0OqrQa_Mok8huHB29y`R7Og0_LwdR!c9T(JEZBhmE;h%DS5>bmclnt*5 zW-@3 zAN#*IH2jj%j;lkNzKddO(?k2c@cX^Ok#0^HeKW6u>`KX2?j=lMQLOCm^$@v3ypX_t z;jrUgU|Ce*^;c>IX72OGK%xnt5?Y_Dtl($<8p8vVSyji9M2fNKCR4@Q`?U%`++zD<9{0s=VHYA zHhUgsnlB5L=lN*#WN+?Nt2`wZMQPM6HgWqY2R$oTyMS9d^sKn{OJTNp%idE-U{`H6 z)+VpDQ%3Otn}OMLx0qLUEG6~7ZH?JlZ>Z<4ozybU=DNq%0_Iz}jsDu{NG#eVcQavo z`c){kDLpGDK5!o8c<41Op>*CM3V&;?^!ME2+Zvl`l;guG^oq7<%$^q&oG;soS<=cd zi5Zf!p(_|B>#2>L?^O;4b9#5ktEUb&_zjK+u7-cy=}5~+ooqU4@`-(3_2j41=MJ{H z*b~pYopScqx6$ekJ;>SK*6}>z65qg^vrCi3-*O{0J0K{lo7_4M^Sm%ru?j^?R5MU$ z`OJml!;zK@+L50(&CkC&QxTpb0u9rDFS?Gd8OPB0KYX@)(Z0O&>{+25>l`%$A#I}W zX$p$7sEuolmnT2qwBMzRx#{Ugwi6q)azuED-G8xSBN;&2v}o1u2;p3r^I_>xn4|LY ztA1Q-V4<#JAWV<=951x6#*IB-&FMA0qU~#XeO(ID8|uL#bYD%y@G&jcT@YO5Jh5QJ zNA$GE^ljn|CvTZm-L@l}8K*t2D!NcqwmTVKxBEZMR|__WIJ;au*Bo~{z5PRee_+2I&xlseyT@Z zCJ*-a?(&(9hTar%HL%UXe9pjzX!sWeHr)d&oeC~h3H0b9{>e`FL+p`NT(ts{h-b<1 zX9&5KI|s|WLy&?cU_F3Q{I2yL+Yy8%SS8TU-sH053$#QHVf#1Hs-#xqj^ERZ>yhUZ z4dNd`eNW|GrO#FHh(hyO&0N+p2TC0Cza-XJ`3lsNR_&0FQD!p-ex0}8P88SZzTZN- z!!TH87DAL?-JGdt`ETadub=s_HdZzptj{f}o&NdJihuF-QjgJn=h?8&#@R_fuEg27 z(8v?E`~n?bW0ypE&R#ST4La@v=?=H92&!{{`OiR?`gN+BnS4;;L>@m>Rci`8OR^)@ zeDWO@sqNQXtTvGk66gwjCVgLM?Gw&Dg;6)gm3;7t5ZAWsbsssee5P7r@Vr%o!4-E^ z?P^-`@`}x!-sluk)x(n(m66|!`1d_lt`Ynzw5t%S8BjNjQU6lyvGe~oe+{}*!YCI|ok diff --git a/modular_citadel/icons/mob/muzzled_mask.dmi b/modular_citadel/icons/mob/muzzled_mask.dmi index cb12318fcb12ae6d26722de1c7e989287eee2621..d96e32f8cece498db79b8c1c06e2d0e5185d0348 100644 GIT binary patch delta 9381 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 XX+(xS24y-xs6$y^O|DYLB;bDm*y6lk delta 9140 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 T2X(bv_LY|ZDW4|`fP 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 delta 12057 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 o$f5w Date: Wed, 2 Jun 2021 22:40:49 -0300 Subject: [PATCH 03/14] Dynamic Nonvoter Factor --- code/controllers/subsystem/vote.dm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index d6673894..ede48a07 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -1,5 +1,6 @@ #define DYNAMIC_DEFAULT_CHAOS 1.0 //The default chaos value for low pop low vote rounds #define DYNAMIC_VOTE_NORMALIZATION 5 //If there are fewer than this many votes, the average will be skewed towards the default +#define DYNAMIC_NONVOTER_FACTOR 0.5 // 1 means they count for a full vote SUBSYSTEM_DEF(vote) name = "Vote" @@ -155,8 +156,9 @@ SUBSYSTEM_DEF(vote) v += 1 else if (voted.len < GLOB.clients.len) //Have non-voters "vote" 2, if we're not lowpop for(var/I in 1 to (GLOB.clients.len - voted.len)) - v += 1 + v += DYNAMIC_NONVOTER_FACTOR //Instead of a fixed value, this will now factor how much non-voter votes are 'worth' in the system. numbers += 2 + v = round(v) //This rounds the value to the nearest multiple, to make sure no calculations go fucky wucky. var/total = 0 for (var/i in numbers) total += i @@ -451,4 +453,4 @@ SUBSYSTEM_DEF(vote) else if(owner.ckey) var/datum/player_details/P = GLOB.player_details[owner.ckey] if(P) - P.player_actions -= src \ No newline at end of file + P.player_actions -= src From d5f50d094a5b0010077c1b23880a44ca2c9991c0 Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Tue, 17 Dec 2019 11:26:36 -0800 Subject: [PATCH 04/14] Merge pull request #10209 from Ghommie/Ghommie-cit470 ports "Standardize obj/updateicon() and update_icons() to update_icon()" --- code/_onclick/hud/action_button.dm | 6 +- code/game/area/areas.dm | 6 +- code/game/machinery/Beacon.dm | 96 +- code/game/machinery/cell_charger.dm | 260 +++--- code/game/machinery/lightswitch.dm | 134 +-- code/game/machinery/magnet.dm | 772 ++++++++-------- code/game/machinery/navbeacon.dm | 428 ++++----- code/game/objects/items/pneumaticCannon.dm | 7 +- code/game/objects/items/robot/robot_parts.dm | 826 +++++++++--------- code/game/objects/structures/divine.dm | 6 +- .../modules/mob/living/silicon/robot/robot.dm | 2 +- code/modules/power/singularity/collector.dm | 462 +++++----- 12 files changed, 1502 insertions(+), 1503 deletions(-) diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index d2508b3e..858b8dbd 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -113,7 +113,7 @@ name = "Show Buttons" else name = "Hide Buttons" - UpdateIcon() + update_icon() usr.update_action_buttons() /obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) @@ -135,9 +135,9 @@ hide_icon = settings["toggle_icon"] hide_state = settings["toggle_hide"] show_state = settings["toggle_show"] - UpdateIcon() + update_icon() -/obj/screen/movable/action_button/hide_toggle/proc/UpdateIcon() +/obj/screen/movable/action_button/hide_toggle/update_icon() cut_overlays() add_overlay(mutable_appearance(hide_icon, hidden ? show_state : hide_state)) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 544d7983..db7ad9f0 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -335,7 +335,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) for(var/obj/machinery/light/L in src) L.update() -/area/proc/updateicon() +/area/proc/update_icon() var/weather_icon for(var/V in SSweather.processing) var/datum/weather/W = V @@ -345,7 +345,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(!weather_icon) icon_state = null -/area/space/updateicon() +/area/space/update_icon() icon_state = null /* @@ -378,7 +378,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) /area/proc/power_change() for(var/obj/machinery/M in src) // for each machine in the area M.power_change() // reverify power status (to update icons etc.) - updateicon() + update_icon() /area/proc/usage(chan) var/used = 0 diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index 8d849c8c..c98795c9 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -1,48 +1,48 @@ -/obj/machinery/bluespace_beacon - - icon = 'icons/obj/objects.dmi' - icon_state = "floor_beaconf" - name = "bluespace gigabeacon" - desc = "A device that draws power from bluespace and creates a permanent tracking beacon." - level = 1 // underfloor - layer = LOW_OBJ_LAYER - use_power = IDLE_POWER_USE - idle_power_usage = 0 - var/obj/item/beacon/Beacon - -/obj/machinery/bluespace_beacon/Initialize() - . = ..() - var/turf/T = loc - Beacon = new(T) - Beacon.invisibility = INVISIBILITY_MAXIMUM - - hide(T.intact) - -/obj/machinery/bluespace_beacon/Destroy() - QDEL_NULL(Beacon) - return ..() - -// update the invisibility and icon -/obj/machinery/bluespace_beacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - updateicon() - -// update the icon_state -/obj/machinery/bluespace_beacon/proc/updateicon() - var/state="floor_beacon" - - if(invisibility) - icon_state = "[state]f" - - else - icon_state = "[state]" - -/obj/machinery/bluespace_beacon/process() - if(!Beacon) - var/turf/T = loc - Beacon = new(T) - Beacon.invisibility = INVISIBILITY_MAXIMUM - else if (Beacon.loc != loc) - Beacon.forceMove(loc) - - updateicon() +/obj/machinery/bluespace_beacon + + icon = 'icons/obj/objects.dmi' + icon_state = "floor_beaconf" + name = "bluespace gigabeacon" + desc = "A device that draws power from bluespace and creates a permanent tracking beacon." + level = 1 // underfloor + layer = LOW_OBJ_LAYER + use_power = IDLE_POWER_USE + idle_power_usage = 0 + var/obj/item/beacon/Beacon + +/obj/machinery/bluespace_beacon/Initialize() + . = ..() + var/turf/T = loc + Beacon = new(T) + Beacon.invisibility = INVISIBILITY_MAXIMUM + + hide(T.intact) + +/obj/machinery/bluespace_beacon/Destroy() + QDEL_NULL(Beacon) + return ..() + +// update the invisibility and icon +/obj/machinery/bluespace_beacon/hide(intact) + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 + update_icon() + +// update the icon_state +/obj/machinery/bluespace_beacon/update_icon() + var/state="floor_beacon" + + if(invisibility) + icon_state = "[state]f" + + else + icon_state = "[state]" + +/obj/machinery/bluespace_beacon/process() + if(!Beacon) + var/turf/T = loc + Beacon = new(T) + Beacon.invisibility = INVISIBILITY_MAXIMUM + else if (Beacon.loc != loc) + Beacon.forceMove(loc) + + update_icon() diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 1969fe8b..1c0635fd 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -1,130 +1,130 @@ -/obj/machinery/cell_charger - name = "cell charger" - desc = "It charges power cells." - icon = 'icons/obj/power.dmi' - icon_state = "ccharger" - use_power = IDLE_POWER_USE - idle_power_usage = 5 - active_power_usage = 60 - power_channel = EQUIP - circuit = /obj/item/circuitboard/machine/cell_charger - pass_flags = PASSTABLE - var/obj/item/stock_parts/cell/charging = null - var/chargelevel = -1 - var/charge_rate = 500 - -/obj/machinery/cell_charger/proc/updateicon() - cut_overlays() - if(charging) - add_overlay(image(charging.icon, charging.icon_state)) - add_overlay("ccharger-on") - if(!(stat & (BROKEN|NOPOWER))) - var/newlevel = round(charging.percent() * 4 / 100) - chargelevel = newlevel - add_overlay("ccharger-o[newlevel]") - -/obj/machinery/cell_charger/examine(mob/user) - . = ..() - . += "There's [charging ? "a" : "no"] cell in the charger." - if(charging) - . += "Current charge: [round(charging.percent(), 1)]%." - -/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/stock_parts/cell) && !panel_open) - if(stat & BROKEN) - to_chat(user, "[src] is broken!") - return - if(!anchored) - to_chat(user, "[src] isn't attached to the ground!") - return - if(charging) - to_chat(user, "There is already a cell in the charger!") - return - else - var/area/a = loc.loc // Gets our locations location, like a dream within a dream - if(!isarea(a)) - return - if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! - to_chat(user, "[src] blinks red as you try to insert the cell!") - return - if(!user.transferItemToLoc(W,src)) - return - - charging = W - user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].") - chargelevel = -1 - updateicon() - else - if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W)) - return - if(default_deconstruction_crowbar(W)) - return - if(!charging && default_unfasten_wrench(user, W)) - return - return ..() - -/obj/machinery/cell_charger/deconstruct() - if(charging) - charging.forceMove(drop_location()) - return ..() - -/obj/machinery/cell_charger/Destroy() - QDEL_NULL(charging) - return ..() - -/obj/machinery/cell_charger/proc/removecell() - charging.update_icon() - charging = null - chargelevel = -1 - updateicon() - -/obj/machinery/cell_charger/attack_hand(mob/user) - . = ..() - if(.) - return - if(!charging) - return - - user.put_in_hands(charging) - charging.add_fingerprint(user) - - user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") - - removecell() - -/obj/machinery/cell_charger/attack_tk(mob/user) - if(!charging) - return - - charging.forceMove(loc) - to_chat(user, "You telekinetically remove [charging] from [src].") - - removecell() - -/obj/machinery/cell_charger/attack_ai(mob/user) - return - -/obj/machinery/cell_charger/emp_act(severity) - . = ..() - - if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS) - return - - if(charging) - charging.emp_act(severity) - -/obj/machinery/cell_charger/RefreshParts() - charge_rate = 500 - for(var/obj/item/stock_parts/capacitor/C in component_parts) - charge_rate *= C.rating - -/obj/machinery/cell_charger/process() - if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) - return - - if(charging.percent() >= 100) - return - use_power(charge_rate) - charging.give(charge_rate) //this is 2558, efficient batteries exist - - updateicon() +/obj/machinery/cell_charger + name = "cell charger" + desc = "It charges power cells." + icon = 'icons/obj/power.dmi' + icon_state = "ccharger" + use_power = IDLE_POWER_USE + idle_power_usage = 5 + active_power_usage = 60 + power_channel = EQUIP + circuit = /obj/item/circuitboard/machine/cell_charger + pass_flags = PASSTABLE + var/obj/item/stock_parts/cell/charging = null + var/chargelevel = -1 + var/charge_rate = 500 + +/obj/machinery/cell_charger/update_icon() + cut_overlays() + if(charging) + add_overlay(image(charging.icon, charging.icon_state)) + add_overlay("ccharger-on") + if(!(stat & (BROKEN|NOPOWER))) + var/newlevel = round(charging.percent() * 4 / 100) + chargelevel = newlevel + add_overlay("ccharger-o[newlevel]") + +/obj/machinery/cell_charger/examine(mob/user) + . = ..() + . += "There's [charging ? "a" : "no"] cell in the charger." + if(charging) + . += "Current charge: [round(charging.percent(), 1)]%." + +/obj/machinery/cell_charger/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/stock_parts/cell) && !panel_open) + if(stat & BROKEN) + to_chat(user, "[src] is broken!") + return + if(!anchored) + to_chat(user, "[src] isn't attached to the ground!") + return + if(charging) + to_chat(user, "There is already a cell in the charger!") + return + else + var/area/a = loc.loc // Gets our locations location, like a dream within a dream + if(!isarea(a)) + return + if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power! + to_chat(user, "[src] blinks red as you try to insert the cell!") + return + if(!user.transferItemToLoc(W,src)) + return + + charging = W + user.visible_message("[user] inserts a cell into [src].", "You insert a cell into [src].") + chargelevel = -1 + update_icon() + else + if(!charging && default_deconstruction_screwdriver(user, icon_state, icon_state, W)) + return + if(default_deconstruction_crowbar(W)) + return + if(!charging && default_unfasten_wrench(user, W)) + return + return ..() + +/obj/machinery/cell_charger/deconstruct() + if(charging) + charging.forceMove(drop_location()) + return ..() + +/obj/machinery/cell_charger/Destroy() + QDEL_NULL(charging) + return ..() + +/obj/machinery/cell_charger/proc/removecell() + charging.update_icon() + charging = null + chargelevel = -1 + update_icon() + +/obj/machinery/cell_charger/attack_hand(mob/user) + . = ..() + if(.) + return + if(!charging) + return + + user.put_in_hands(charging) + charging.add_fingerprint(user) + + user.visible_message("[user] removes [charging] from [src].", "You remove [charging] from [src].") + + removecell() + +/obj/machinery/cell_charger/attack_tk(mob/user) + if(!charging) + return + + charging.forceMove(loc) + to_chat(user, "You telekinetically remove [charging] from [src].") + + removecell() + +/obj/machinery/cell_charger/attack_ai(mob/user) + return + +/obj/machinery/cell_charger/emp_act(severity) + . = ..() + + if(stat & (BROKEN|NOPOWER) || . & EMP_PROTECT_CONTENTS) + return + + if(charging) + charging.emp_act(severity) + +/obj/machinery/cell_charger/RefreshParts() + charge_rate = 500 + for(var/obj/item/stock_parts/capacitor/C in component_parts) + charge_rate *= C.rating + +/obj/machinery/cell_charger/process() + if(!charging || !anchored || (stat & (BROKEN|NOPOWER))) + return + + if(charging.percent() >= 100) + return + use_power(charge_rate) + charging.give(charge_rate) //this is 2558, efficient batteries exist + + update_icon() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 20b59e7a..2a4b9039 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -1,67 +1,67 @@ -// the light switch -// can have multiple per area -// can also operate on non-loc area through "otherarea" var -/obj/machinery/light_switch - name = "light switch" - icon = 'icons/obj/power.dmi' - icon_state = "light1" - desc = "Make dark." - var/on = TRUE - var/area/area = null - var/otherarea = null - -/obj/machinery/light_switch/Initialize() - . = ..() - area = get_area(src) - - if(otherarea) - area = locate(text2path("/area/[otherarea]")) - - if(!name) - name = "light switch ([area.name])" - - on = area.lightswitch - updateicon() - -/obj/machinery/light_switch/proc/updateicon() - if(stat & NOPOWER) - icon_state = "light-p" - else - if(on) - icon_state = "light1" - else - icon_state = "light0" - -/obj/machinery/light_switch/examine(mob/user) - . = ..() - . += "It is [on? "on" : "off"]." - -/obj/machinery/light_switch/interact(mob/user) - . = ..() - on = !on - - area.lightswitch = on - area.updateicon() - - for(var/obj/machinery/light_switch/L in area) - L.on = on - L.updateicon() - - area.power_change() - -/obj/machinery/light_switch/power_change() - - if(!otherarea) - if(powered(LIGHT)) - stat &= ~NOPOWER - else - stat |= NOPOWER - - updateicon() - -/obj/machinery/light_switch/emp_act(severity) - . = ..() - if (. & EMP_PROTECT_SELF) - return - if(!(stat & (BROKEN|NOPOWER))) - power_change() +// the light switch +// can have multiple per area +// can also operate on non-loc area through "otherarea" var +/obj/machinery/light_switch + name = "light switch" + icon = 'icons/obj/power.dmi' + icon_state = "light1" + desc = "Make dark." + var/on = TRUE + var/area/area = null + var/otherarea = null + +/obj/machinery/light_switch/Initialize() + . = ..() + area = get_area(src) + + if(otherarea) + area = locate(text2path("/area/[otherarea]")) + + if(!name) + name = "light switch ([area.name])" + + on = area.lightswitch + update_icon() + +/obj/machinery/light_switch/update_icon() + if(stat & NOPOWER) + icon_state = "light-p" + else + if(on) + icon_state = "light1" + else + icon_state = "light0" + +/obj/machinery/light_switch/examine(mob/user) + . = ..() + . += "It is [on? "on" : "off"]." + +/obj/machinery/light_switch/interact(mob/user) + . = ..() + on = !on + + area.lightswitch = on + area.update_icon() + + for(var/obj/machinery/light_switch/L in area) + L.on = on + L.update_icon() + + area.power_change() + +/obj/machinery/light_switch/power_change() + + if(!otherarea) + if(powered(LIGHT)) + stat &= ~NOPOWER + else + stat |= NOPOWER + + update_icon() + +/obj/machinery/light_switch/emp_act(severity) + . = ..() + if (. & EMP_PROTECT_SELF) + return + if(!(stat & (BROKEN|NOPOWER))) + power_change() diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index cd5482d7..c1d53293 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -1,386 +1,386 @@ -// Magnetic attractor, creates variable magnetic fields and attraction. -// Can also be used to emit electron/proton beams to create a center of magnetism on another tile - -// tl;dr: it's magnets lol -// This was created for firing ranges, but I suppose this could have other applications - Doohl - -/obj/machinery/magnetic_module - icon = 'icons/obj/objects.dmi' - icon_state = "floor_magnet-f" - name = "electromagnetic generator" - desc = "A device that uses station power to create points of magnetic energy." - level = 1 // underfloor - layer = LOW_OBJ_LAYER - use_power = IDLE_POWER_USE - idle_power_usage = 50 - - var/freq = FREQ_MAGNETS // radio frequency - var/electricity_level = 1 // intensity of the magnetic pull - var/magnetic_field = 1 // the range of magnetic attraction - var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something - var/turf/center // the center of magnetic attraction - var/on = FALSE - var/magneting = FALSE - - // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down - var/center_x = 0 - var/center_y = 0 - var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - -/obj/machinery/magnetic_module/Initialize() - ..() - var/turf/T = loc - hide(T.intact) - center = T - SSradio.add_object(src, freq, RADIO_MAGNETS) - return INITIALIZE_HINT_LATELOAD - -/obj/machinery/magnetic_module/LateInitialize() - magnetic_process() - -/obj/machinery/magnetic_module/Destroy() - SSradio.remove_object(src, freq) - center = null - return ..() - -// update the invisibility and icon -/obj/machinery/magnetic_module/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - updateicon() - -// update the icon_state -/obj/machinery/magnetic_module/proc/updateicon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" - - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" - -/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) - - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) - - Cmd(command, modifier) - - - -/obj/machinery/magnetic_module/proc/Cmd(command, modifier) - - if(command) - switch(command) - if("set-electriclevel") - if(modifier) - electricity_level = modifier - if("set-magneticfield") - if(modifier) - magnetic_field = modifier - - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 - - if("set-x") - if(modifier) - center_x = modifier - if("set-y") - if(modifier) - center_y = modifier - - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) - - if("set-code") - if(modifier) - code = modifier - if("toggle-power") - on = !on - - if(on) - INVOKE_ASYNC(src, .proc/magnetic_process) - - - -/obj/machinery/magnetic_module/process() - if(stat & NOPOWER) - on = FALSE - - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 - - - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 - - // Update power usage: - if(on) - use_power = ACTIVE_POWER_USE - active_power_usage = electricity_level*15 - else - use_power = NO_POWER_USE - - updateicon() - - -/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the magneting - if(magneting) - return - while(on) - - magneting = TRUE - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.flags_1 & CONDUCT_1)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(isAI(S)) - continue - step_towards(S, center) - - use_power(electricity_level * 5) - sleep(13 - electricity_level) - - magneting = FALSE - - - - -/obj/machinery/magnetic_controller - name = "magnetic control console" - icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING! - icon_state = "airlock_control_standby" - density = FALSE - use_power = IDLE_POWER_USE - idle_power_usage = 45 - var/frequency = FREQ_MAGNETS - var/code = 0 - var/list/magnets = list() - var/title = "Magnetic Control Console" - var/autolink = 0 // if set to 1, can't probe for other magnets! - - var/pathpos = 1 // position in the path - var/path = "w;e;e;w;s;n;n;s" // text path of the magnet - var/speed = 1 // lowest = 1, highest = 10 - var/list/rpath = list() // real path of the magnet, used in iterator - - var/moving = 0 // 1 if scheduled to loop - var/looping = 0 // 1 if looping - - var/datum/radio_frequency/radio_connection - - -/obj/machinery/magnetic_controller/Initialize() - . = ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in GLOB.machines) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - - if(path) // check for default path - filter_path() // renders rpath - radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS) - -/obj/machinery/magnetic_controller/Destroy() - SSradio.remove_object(src, frequency) - magnets = null - rpath = null - return ..() - -/obj/machinery/magnetic_controller/process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in GLOB.machines) - if(M.freq == frequency && M.code == code) - magnets.Add(M) - -/obj/machinery/magnetic_controller/ui_interact(mob/user) - . = ..() - var/dat = "Magnetic Control Console

" - if(!autolink) - dat += {" - Frequency: [frequency]
- Code: [code]
- Probe Generators
- "} - - if(magnets.len >= 1) - - dat += "Magnets confirmed:
" - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" - - dat += "
Speed: - [speed] +
" - dat += "Path: {[path]}
" - dat += "Moving: [moving ? "Enabled":"Disabled"]" - - - user << browse(dat, "window=magnet;size=400x500") - onclose(user, "magnet") - -/obj/machinery/magnetic_controller/Topic(href, href_list) - if(..()) - return - usr.set_machine(src) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new(list("code" = code)) - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal - - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness - - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() - - - updateUsrDialog() - -/obj/machinery/magnetic_controller/proc/MagnetMove() - if(looping) - return - - while(moving && rpath.len >= 1) - - if(stat & (BROKEN|NOPOWER)) - break - - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new(list("code" = code)) - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - -/obj/machinery/magnetic_controller/proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_characters = 50 - - var/lentext = length(path) - var/nextchar = "" - var/charcount = 0 - - for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path - nextchar = path[i] // find next character - - if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore - continue - rpath += nextchar // else, add to list - // there doesn't HAVE to be separators but it makes paths syntatically visible - charcount++ - if(charcount >= maximum_characters) - break +// Magnetic attractor, creates variable magnetic fields and attraction. +// Can also be used to emit electron/proton beams to create a center of magnetism on another tile + +// tl;dr: it's magnets lol +// This was created for firing ranges, but I suppose this could have other applications - Doohl + +/obj/machinery/magnetic_module + icon = 'icons/obj/objects.dmi' + icon_state = "floor_magnet-f" + name = "electromagnetic generator" + desc = "A device that uses station power to create points of magnetic energy." + level = 1 // underfloor + layer = LOW_OBJ_LAYER + use_power = IDLE_POWER_USE + idle_power_usage = 50 + + var/freq = FREQ_MAGNETS // radio frequency + var/electricity_level = 1 // intensity of the magnetic pull + var/magnetic_field = 1 // the range of magnetic attraction + var/code = 0 // frequency code, they should be different unless you have a group of magnets working together or something + var/turf/center // the center of magnetic attraction + var/on = FALSE + var/magneting = FALSE + + // x, y modifiers to the center turf; (0, 0) is centered on the magnet, whereas (1, -1) is one tile right, one tile down + var/center_x = 0 + var/center_y = 0 + var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer + +/obj/machinery/magnetic_module/Initialize() + ..() + var/turf/T = loc + hide(T.intact) + center = T + SSradio.add_object(src, freq, RADIO_MAGNETS) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/magnetic_module/LateInitialize() + magnetic_process() + +/obj/machinery/magnetic_module/Destroy() + SSradio.remove_object(src, freq) + center = null + return ..() + +// update the invisibility and icon +/obj/machinery/magnetic_module/hide(intact) + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 + update_icon() + +// update the icon_state +/obj/machinery/magnetic_module/update_icon() + var/state="floor_magnet" + var/onstate="" + if(!on) + onstate="0" + + if(invisibility) + icon_state = "[state][onstate]-f" // if invisible, set icon to faded version + // in case of being revealed by T-scanner + else + icon_state = "[state][onstate]" + +/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) + + var/command = signal.data["command"] + var/modifier = signal.data["modifier"] + var/signal_code = signal.data["code"] + if(command && (signal_code == code)) + + Cmd(command, modifier) + + + +/obj/machinery/magnetic_module/proc/Cmd(command, modifier) + + if(command) + switch(command) + if("set-electriclevel") + if(modifier) + electricity_level = modifier + if("set-magneticfield") + if(modifier) + magnetic_field = modifier + + if("add-elec") + electricity_level++ + if(electricity_level > 12) + electricity_level = 12 + if("sub-elec") + electricity_level-- + if(electricity_level <= 0) + electricity_level = 1 + if("add-mag") + magnetic_field++ + if(magnetic_field > 4) + magnetic_field = 4 + if("sub-mag") + magnetic_field-- + if(magnetic_field <= 0) + magnetic_field = 1 + + if("set-x") + if(modifier) + center_x = modifier + if("set-y") + if(modifier) + center_y = modifier + + if("N") // NORTH + center_y++ + if("S") // SOUTH + center_y-- + if("E") // EAST + center_x++ + if("W") // WEST + center_x-- + if("C") // CENTER + center_x = 0 + center_y = 0 + if("R") // RANDOM + center_x = rand(-max_dist, max_dist) + center_y = rand(-max_dist, max_dist) + + if("set-code") + if(modifier) + code = modifier + if("toggle-power") + on = !on + + if(on) + INVOKE_ASYNC(src, .proc/magnetic_process) + + + +/obj/machinery/magnetic_module/process() + if(stat & NOPOWER) + on = FALSE + + // Sanity checks: + if(electricity_level <= 0) + electricity_level = 1 + if(magnetic_field <= 0) + magnetic_field = 1 + + + // Limitations: + if(abs(center_x) > max_dist) + center_x = max_dist + if(abs(center_y) > max_dist) + center_y = max_dist + if(magnetic_field > 4) + magnetic_field = 4 + if(electricity_level > 12) + electricity_level = 12 + + // Update power usage: + if(on) + use_power = ACTIVE_POWER_USE + active_power_usage = electricity_level*15 + else + use_power = NO_POWER_USE + + update_icon() + + +/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the magneting + if(magneting) + return + while(on) + + magneting = TRUE + center = locate(x+center_x, y+center_y, z) + if(center) + for(var/obj/M in orange(magnetic_field, center)) + if(!M.anchored && (M.flags_1 & CONDUCT_1)) + step_towards(M, center) + + for(var/mob/living/silicon/S in orange(magnetic_field, center)) + if(isAI(S)) + continue + step_towards(S, center) + + use_power(electricity_level * 5) + sleep(13 - electricity_level) + + magneting = FALSE + + + + +/obj/machinery/magnetic_controller + name = "magnetic control console" + icon = 'icons/obj/airlock_machines.dmi' // uses an airlock machine icon, THINK GREEN HELP THE ENVIRONMENT - RECYCLING! + icon_state = "airlock_control_standby" + density = FALSE + use_power = IDLE_POWER_USE + idle_power_usage = 45 + var/frequency = FREQ_MAGNETS + var/code = 0 + var/list/magnets = list() + var/title = "Magnetic Control Console" + var/autolink = 0 // if set to 1, can't probe for other magnets! + + var/pathpos = 1 // position in the path + var/path = "w;e;e;w;s;n;n;s" // text path of the magnet + var/speed = 1 // lowest = 1, highest = 10 + var/list/rpath = list() // real path of the magnet, used in iterator + + var/moving = 0 // 1 if scheduled to loop + var/looping = 0 // 1 if looping + + var/datum/radio_frequency/radio_connection + + +/obj/machinery/magnetic_controller/Initialize() + . = ..() + if(autolink) + for(var/obj/machinery/magnetic_module/M in GLOB.machines) + if(M.freq == frequency && M.code == code) + magnets.Add(M) + + if(path) // check for default path + filter_path() // renders rpath + radio_connection = SSradio.add_object(src, frequency, RADIO_MAGNETS) + +/obj/machinery/magnetic_controller/Destroy() + SSradio.remove_object(src, frequency) + magnets = null + rpath = null + return ..() + +/obj/machinery/magnetic_controller/process() + if(magnets.len == 0 && autolink) + for(var/obj/machinery/magnetic_module/M in GLOB.machines) + if(M.freq == frequency && M.code == code) + magnets.Add(M) + +/obj/machinery/magnetic_controller/ui_interact(mob/user) + . = ..() + var/dat = "Magnetic Control Console

" + if(!autolink) + dat += {" + Frequency: [frequency]
+ Code: [code]
+ Probe Generators
+ "} + + if(magnets.len >= 1) + + dat += "Magnets confirmed:
" + var/i = 0 + for(var/obj/machinery/magnetic_module/M in magnets) + i++ + dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
" + + dat += "
Speed: - [speed] +
" + dat += "Path: {[path]}
" + dat += "Moving: [moving ? "Enabled":"Disabled"]" + + + user << browse(dat, "window=magnet;size=400x500") + onclose(user, "magnet") + +/obj/machinery/magnetic_controller/Topic(href, href_list) + if(..()) + return + usr.set_machine(src) + + if(href_list["radio-op"]) + + // Prepare signal beforehand, because this is a radio operation + var/datum/signal/signal = new(list("code" = code)) + + // Apply any necessary commands + switch(href_list["radio-op"]) + if("togglepower") + signal.data["command"] = "toggle-power" + + if("minuselec") + signal.data["command"] = "sub-elec" + if("pluselec") + signal.data["command"] = "add-elec" + + if("minusmag") + signal.data["command"] = "sub-mag" + if("plusmag") + signal.data["command"] = "add-mag" + + + // Broadcast the signal + + radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + + spawn(1) + updateUsrDialog() // pretty sure this increases responsiveness + + if(href_list["operation"]) + switch(href_list["operation"]) + if("plusspeed") + speed ++ + if(speed > 10) + speed = 10 + if("minusspeed") + speed -- + if(speed <= 0) + speed = 1 + if("setpath") + var/newpath = stripped_input(usr, "Please define a new path!", "New Path", path, MAX_MESSAGE_LEN) + if(newpath && newpath != "") + moving = 0 // stop moving + path = newpath + pathpos = 1 // reset position + filter_path() // renders rpath + + if("togglemoving") + moving = !moving + if(moving) + spawn() MagnetMove() + + + updateUsrDialog() + +/obj/machinery/magnetic_controller/proc/MagnetMove() + if(looping) + return + + while(moving && rpath.len >= 1) + + if(stat & (BROKEN|NOPOWER)) + break + + looping = 1 + + // Prepare the radio signal + var/datum/signal/signal = new(list("code" = code)) + + if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! + pathpos = 1 + + var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive + + if(!(nextmove in list("N","S","E","W","C","R"))) + // N, S, E, W are directional + // C is center + // R is random (in magnetic field's bounds) + qdel(signal) + break // break the loop if the character located is invalid + + signal.data["command"] = nextmove + + + pathpos++ // increase iterator + + // Broadcast the signal + spawn() + radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + + if(speed == 10) + sleep(1) + else + sleep(12-speed) + + looping = 0 + + +/obj/machinery/magnetic_controller/proc/filter_path() + // Generates the rpath variable using the path string, think of this as "string2list" + // Doesn't use params2list() because of the akward way it stacks entities + rpath = list() // clear rpath + var/maximum_characters = 50 + + var/lentext = length(path) + var/nextchar = "" + var/charcount = 0 + + for(var/i = 1, i <= lentext, i += length(nextchar)) // iterates through all characters in path + nextchar = path[i] // find next character + + if(nextchar in list(";", "&", "*", " ")) // if char is a separator, ignore + continue + rpath += nextchar // else, add to list + // there doesn't HAVE to be separators but it makes paths syntatically visible + charcount++ + if(charcount >= maximum_characters) + break diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 38416e94..7dc651e3 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -1,214 +1,214 @@ -// Navigation beacon for AI robots -// No longer exists on the radio controller, it is managed by a global list. - -/obj/machinery/navbeacon - - icon = 'icons/obj/objects.dmi' - icon_state = "navbeacon0-f" - name = "navigation beacon" - desc = "A radio beacon used for bot navigation." - level = 1 // underfloor - layer = LOW_OBJ_LAYER - max_integrity = 500 - armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) - - var/open = FALSE // true if cover is open - var/locked = TRUE // true if controls are locked - var/freq = FREQ_NAV_BEACON - var/location = "" // location response text - var/list/codes // assoc. list of transponder codes - var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" - - req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) - -/obj/machinery/navbeacon/Initialize() - . = ..() - - set_codes() - - var/turf/T = loc - hide(T.intact) - if(codes["patrol"]) - if(!GLOB.navbeacons["[z]"]) - GLOB.navbeacons["[z]"] = list() - GLOB.navbeacons["[z]"] += src //Register with the patrol list! - if(codes["delivery"]) - GLOB.deliverybeacons += src - GLOB.deliverybeacontags += location - -/obj/machinery/navbeacon/Destroy() - if (GLOB.navbeacons["[z]"]) - GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one. - GLOB.deliverybeacons -= src - return ..() - -/obj/machinery/navbeacon/onTransitZ(old_z, new_z) - if (GLOB.navbeacons["[old_z]"]) - GLOB.navbeacons["[old_z]"] -= src - if (GLOB.navbeacons["[new_z]"]) - GLOB.navbeacons["[new_z]"] += src - ..() - -// set the transponder codes assoc list from codes_txt -/obj/machinery/navbeacon/proc/set_codes() - if(!codes_txt) - return - - codes = new() - - var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - - for(var/e in entries) - var/index = findtext(e, "=") // format is "key=value" - if(index) - var/key = copytext(e, 1, index) - var/val = copytext(e, index + length(e[index])) - codes[key] = val - else - codes[e] = "1" - - -// called when turf state changes -// hide the object if turf is intact -/obj/machinery/navbeacon/hide(intact) - invisibility = intact ? INVISIBILITY_MAXIMUM : 0 - updateicon() - -// update the icon_state -/obj/machinery/navbeacon/proc/updateicon() - var/state="navbeacon[open]" - - if(invisibility) - icon_state = "[state]-f" // if invisible, set icon to faded version - // in case revealed by T-scanner - else - icon_state = "[state]" - -/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params) - var/turf/T = loc - if(T.intact) - return // prevent intraction when T-scanner revealed - - if(istype(I, /obj/item/screwdriver)) - open = !open - - user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") - - updateicon() - - else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) - if(open) - if (src.allowed(user)) - src.locked = !src.locked - to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].") - else - to_chat(user, "Access denied.") - updateDialog() - else - to_chat(user, "You must open the cover first!") - else - return ..() - -/obj/machinery/navbeacon/attack_ai(mob/user) - interact(user, 1) - -/obj/machinery/navbeacon/attack_paw() - return - -/obj/machinery/navbeacon/ui_interact(mob/user) - . = ..() - var/ai = isAI(user) - var/turf/T = loc - if(T.intact) - return // prevent intraction when T-scanner revealed - - if(!open && !ai) // can't alter controls if not open, unless you're an AI - to_chat(user, "The beacon's control cover is closed!") - return - - - var/t - - if(locked && !ai) - t = {"Navigation Beacon

-(swipe card to unlock controls)
-Location: [location ? location : "(none)"]
-Transponder Codes:
    "} - - for(var/key in codes) - t += "
  • [key] ... [codes[key]]" - t+= "
      " - - else - - t = {"Navigation Beacon

      -(swipe card to lock controls)
      - -
      -Location: [location ? location : "None"]
      -Transponder Codes:
        "} - - for(var/key in codes) - t += "
      • [key] ... [codes[key]]" - t += " Edit" - t += " Delete
        " - t += " Add New
        " - t+= "
          " - - var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400) - popup.set_content(t) - popup.open() - return - -/obj/machinery/navbeacon/Topic(href, href_list) - if(..()) - return - if(open && !locked) - usr.set_machine(src) - - if(href_list["locedit"]) - var/newloc = stripped_input(usr, "Enter New Location", "Navigation Beacon", location, MAX_MESSAGE_LEN) - if(newloc) - location = newloc - updateDialog() - - else if(href_list["edit"]) - var/codekey = href_list["code"] - - var/newkey = stripped_input(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey) - if(!newkey) - return - - var/codeval = codes[codekey] - var/newval = stripped_input(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval) - if(!newval) - newval = codekey - return - - codes.Remove(codekey) - codes[newkey] = newval - - updateDialog() - - else if(href_list["delete"]) - var/codekey = href_list["code"] - codes.Remove(codekey) - updateDialog() - - else if(href_list["add"]) - - var/newkey = stripped_input(usr, "Enter New Transponder Code Key", "Navigation Beacon") - if(!newkey) - return - - var/newval = stripped_input(usr, "Enter New Transponder Code Value", "Navigation Beacon") - if(!newval) - newval = "1" - return - - if(!codes) - codes = new() - - codes[newkey] = newval - - updateDialog() +// Navigation beacon for AI robots +// No longer exists on the radio controller, it is managed by a global list. + +/obj/machinery/navbeacon + + icon = 'icons/obj/objects.dmi' + icon_state = "navbeacon0-f" + name = "navigation beacon" + desc = "A radio beacon used for bot navigation." + level = 1 // underfloor + layer = LOW_OBJ_LAYER + max_integrity = 500 + armor = list("melee" = 70, "bullet" = 70, "laser" = 70, "energy" = 70, "bomb" = 0, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) + + var/open = FALSE // true if cover is open + var/locked = TRUE // true if controls are locked + var/freq = FREQ_NAV_BEACON + var/location = "" // location response text + var/list/codes // assoc. list of transponder codes + var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" + + req_one_access = list(ACCESS_ENGINE, ACCESS_ROBOTICS) + +/obj/machinery/navbeacon/Initialize() + . = ..() + + set_codes() + + var/turf/T = loc + hide(T.intact) + if(codes["patrol"]) + if(!GLOB.navbeacons["[z]"]) + GLOB.navbeacons["[z]"] = list() + GLOB.navbeacons["[z]"] += src //Register with the patrol list! + if(codes["delivery"]) + GLOB.deliverybeacons += src + GLOB.deliverybeacontags += location + +/obj/machinery/navbeacon/Destroy() + if (GLOB.navbeacons["[z]"]) + GLOB.navbeacons["[z]"] -= src //Remove from beacon list, if in one. + GLOB.deliverybeacons -= src + return ..() + +/obj/machinery/navbeacon/onTransitZ(old_z, new_z) + if (GLOB.navbeacons["[old_z]"]) + GLOB.navbeacons["[old_z]"] -= src + if (GLOB.navbeacons["[new_z]"]) + GLOB.navbeacons["[new_z]"] += src + ..() + +// set the transponder codes assoc list from codes_txt +/obj/machinery/navbeacon/proc/set_codes() + if(!codes_txt) + return + + codes = new() + + var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons + + for(var/e in entries) + var/index = findtext(e, "=") // format is "key=value" + if(index) + var/key = copytext(e, 1, index) + var/val = copytext(e, index + length(e[index])) + codes[key] = val + else + codes[e] = "1" + + +// called when turf state changes +// hide the object if turf is intact +/obj/machinery/navbeacon/hide(intact) + invisibility = intact ? INVISIBILITY_MAXIMUM : 0 + update_icon() + +// update the icon_state +/obj/machinery/navbeacon/update_icon() + var/state="navbeacon[open]" + + if(invisibility) + icon_state = "[state]-f" // if invisible, set icon to faded version + // in case revealed by T-scanner + else + icon_state = "[state]" + +/obj/machinery/navbeacon/attackby(obj/item/I, mob/user, params) + var/turf/T = loc + if(T.intact) + return // prevent intraction when T-scanner revealed + + if(istype(I, /obj/item/screwdriver)) + open = !open + + user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") + + update_icon() + + else if (istype(I, /obj/item/card/id)||istype(I, /obj/item/pda)) + if(open) + if (src.allowed(user)) + src.locked = !src.locked + to_chat(user, "Controls are now [src.locked ? "locked" : "unlocked"].") + else + to_chat(user, "Access denied.") + updateDialog() + else + to_chat(user, "You must open the cover first!") + else + return ..() + +/obj/machinery/navbeacon/attack_ai(mob/user) + interact(user, 1) + +/obj/machinery/navbeacon/attack_paw() + return + +/obj/machinery/navbeacon/ui_interact(mob/user) + . = ..() + var/ai = isAI(user) + var/turf/T = loc + if(T.intact) + return // prevent intraction when T-scanner revealed + + if(!open && !ai) // can't alter controls if not open, unless you're an AI + to_chat(user, "The beacon's control cover is closed!") + return + + + var/t + + if(locked && !ai) + t = {"Navigation Beacon

          +(swipe card to unlock controls)
          +Location: [location ? location : "(none)"]
          +Transponder Codes:
            "} + + for(var/key in codes) + t += "
          • [key] ... [codes[key]]" + t+= "
              " + + else + + t = {"Navigation Beacon

              +(swipe card to lock controls)
              + +
              +Location: [location ? location : "None"]
              +Transponder Codes:
                "} + + for(var/key in codes) + t += "
              • [key] ... [codes[key]]" + t += " Edit" + t += " Delete
                " + t += " Add New
                " + t+= "
                  " + + var/datum/browser/popup = new(user, "navbeacon", "Navigation Beacon", 300, 400) + popup.set_content(t) + popup.open() + return + +/obj/machinery/navbeacon/Topic(href, href_list) + if(..()) + return + if(open && !locked) + usr.set_machine(src) + + if(href_list["locedit"]) + var/newloc = stripped_input(usr, "Enter New Location", "Navigation Beacon", location, MAX_MESSAGE_LEN) + if(newloc) + location = newloc + updateDialog() + + else if(href_list["edit"]) + var/codekey = href_list["code"] + + var/newkey = stripped_input(usr, "Enter Transponder Code Key", "Navigation Beacon", codekey) + if(!newkey) + return + + var/codeval = codes[codekey] + var/newval = stripped_input(usr, "Enter Transponder Code Value", "Navigation Beacon", codeval) + if(!newval) + newval = codekey + return + + codes.Remove(codekey) + codes[newkey] = newval + + updateDialog() + + else if(href_list["delete"]) + var/codekey = href_list["code"] + codes.Remove(codekey) + updateDialog() + + else if(href_list["add"]) + + var/newkey = stripped_input(usr, "Enter New Transponder Code Key", "Navigation Beacon") + if(!newkey) + return + + var/newval = stripped_input(usr, "Enter New Transponder Code Value", "Navigation Beacon") + if(!newval) + newval = "1" + return + + if(!codes) + codes = new() + + codes[newkey] = newval + + updateDialog() diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index 72d27ae5..e63b4d7a 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -213,7 +213,7 @@ loadedWeightClass -= I.w_class else if (A == tank) tank = null - update_icons() + update_icon() /obj/item/pneumatic_cannon/ghetto //Obtainable by improvised methods; more gas per use, less capacity, but smaller name = "improvised pneumatic cannon" @@ -239,14 +239,13 @@ return to_chat(user, "You hook \the [thetank] up to \the [src].") tank = thetank - update_icons() + update_icon() -/obj/item/pneumatic_cannon/proc/update_icons() +/obj/item/pneumatic_cannon/update_icon() cut_overlays() if(!tank) return add_overlay(tank.icon_state) - update_icon() /obj/item/pneumatic_cannon/proc/fill_with_type(type, amount) if(!ispath(type, /obj) && !ispath(type, /mob)) diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 811d5f24..91b8021d 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -1,413 +1,413 @@ - - -//The robot bodyparts have been moved to code/module/surgery/bodyparts/robot_bodyparts.dm - - -/obj/item/robot_suit - name = "cyborg endoskeleton" - desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." - icon = 'icons/mob/augmentation/augments.dmi' - icon_state = "robo_suit" - var/obj/item/bodypart/l_arm/robot/l_arm = null - var/obj/item/bodypart/r_arm/robot/r_arm = null - var/obj/item/bodypart/l_leg/robot/l_leg = null - var/obj/item/bodypart/r_leg/robot/r_leg = null - var/obj/item/bodypart/chest/robot/chest = null - var/obj/item/bodypart/head/robot/head = null - - var/created_name = "" - var/mob/living/silicon/ai/forced_ai - var/locomotion = 1 - var/lawsync = 1 - var/aisync = 1 - var/panel_locked = TRUE - -/obj/item/robot_suit/New() - ..() - updateicon() - -/obj/item/robot_suit/prebuilt/New() - l_arm = new(src) - r_arm = new(src) - l_leg = new(src) - r_leg = new(src) - head = new(src) - head.flash1 = new(head) - head.flash2 = new(head) - chest = new(src) - chest.wired = TRUE - chest.cell = new /obj/item/stock_parts/cell/high/plus(chest) - ..() - -/obj/item/robot_suit/proc/updateicon() - cut_overlays() - if(l_arm) - add_overlay("[l_arm.icon_state]+o") - if(r_arm) - add_overlay("[r_arm.icon_state]+o") - if(chest) - add_overlay("[chest.icon_state]+o") - if(l_leg) - add_overlay("[l_leg.icon_state]+o") - if(r_leg) - add_overlay("[r_leg.icon_state]+o") - if(head) - add_overlay("[head.icon_state]+o") - -/obj/item/robot_suit/proc/check_completion() - if(src.l_arm && src.r_arm) - if(src.l_leg && src.r_leg) - if(src.chest && src.head) - SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) - return 1 - return 0 - -/obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet - var/turf/T = get_turf(src) - if(l_leg || r_leg || chest || l_arm || r_arm || head) - if(I.use_tool(src, user, 5, volume=50)) - if(l_leg) - l_leg.forceMove(T) - l_leg = null - if(r_leg) - r_leg.forceMove(T) - r_leg = null - if(chest) - if (chest.cell) //Sanity check. - chest.cell.forceMove(T) - chest.cell = null - chest.forceMove(T) - new /obj/item/stack/cable_coil(T, 1) - chest.wired = FALSE - chest = null - if(l_arm) - l_arm.forceMove(T) - l_arm = null - if(r_arm) - r_arm.forceMove(T) - r_arm = null - if(head) - head.forceMove(T) - head.flash1.forceMove(T) - head.flash1 = null - head.flash2.forceMove(T) - head.flash2 = null - head = null - to_chat(user, "You disassemble the cyborg shell.") - else - to_chat(user, "There is nothing to remove from the endoskeleton.") - updateicon() - -/obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc - if(!user.put_in_hands(I)) - I.forceMove(drop_location()) - return FALSE - return TRUE - -/obj/item/robot_suit/screwdriver_act(mob/living/user, obj/item/I) //Swaps the power cell if you're holding a new one in your other hand. - . = ..() - if(.) - return TRUE - - if(!chest) //can't remove a cell if there's no chest to remove it from. - to_chat(user, "[src] has no attached torso.") - return - - var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell) - var/swap_failed - if(!temp_cell) //if we're not holding a cell - swap_failed = TRUE - else if(!user.transferItemToLoc(temp_cell, chest)) - swap_failed = TRUE - to_chat(user, "[temp_cell] is stuck to your hand, you can't put it in [src]!") - - if(chest.cell) //drop the chest's current cell no matter what. - put_in_hand_or_drop(user, chest.cell) - - if(swap_failed) //we didn't transfer any new items. - if(chest.cell) //old cell ejected, nothing inserted. - to_chat(user, "You remove [chest.cell] from [src].") - chest.cell = null - else - to_chat(user, "The power cell slot in [src]'s torso is empty.") - return - - to_chat(user, "You [chest.cell ? "replace [src]'s [chest.cell.name] with [temp_cell]" : "insert [temp_cell] into [src]"].") - chest.cell = temp_cell - return TRUE - -/obj/item/robot_suit/attackby(obj/item/W, mob/user, params) - - if(istype(W, /obj/item/stack/sheet/metal)) - var/obj/item/stack/sheet/metal/M = W - if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) - if (M.use(1)) - var/obj/item/bot_assembly/ed209/B = new - B.forceMove(drop_location()) - to_chat(user, "You arm the robot frame.") - var/holding_this = user.get_inactive_held_item()==src - qdel(src) - if (holding_this) - user.put_in_inactive_hand(B) - else - to_chat(user, "You need one sheet of metal to start building ED-209!") - return - else if(istype(W, /obj/item/bodypart/l_leg/robot)) - if(src.l_leg) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - src.l_leg = W - src.updateicon() - - else if(istype(W, /obj/item/bodypart/r_leg/robot)) - if(src.r_leg) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - src.r_leg = W - src.updateicon() - - else if(istype(W, /obj/item/bodypart/l_arm/robot)) - if(src.l_arm) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state) - W.cut_overlays() - src.l_arm = W - src.updateicon() - - else if(istype(W, /obj/item/bodypart/r_arm/robot)) - if(src.r_arm) - return - if(!user.transferItemToLoc(W, src)) - return - W.icon_state = initial(W.icon_state)//in case it is a dismembered robotic limb - W.cut_overlays() - src.r_arm = W - src.updateicon() - - else if(istype(W, /obj/item/bodypart/chest/robot)) - var/obj/item/bodypart/chest/robot/CH = W - if(src.chest) - return - if(CH.wired && CH.cell) - if(!user.transferItemToLoc(CH, src)) - return - CH.icon_state = initial(CH.icon_state) //in case it is a dismembered robotic limb - CH.cut_overlays() - src.chest = CH - src.updateicon() - else if(!CH.wired) - to_chat(user, "You need to attach wires to it first!") - else - to_chat(user, "You need to attach a cell to it first!") - - else if(istype(W, /obj/item/bodypart/head/robot)) - var/obj/item/bodypart/head/robot/HD = W - for(var/X in HD.contents) - if(istype(X, /obj/item/organ)) - to_chat(user, "There are organs inside [HD]!") - return - if(src.head) - return - if(HD.flash2 && HD.flash1) - if(!user.transferItemToLoc(HD, src)) - return - HD.icon_state = initial(HD.icon_state)//in case it is a dismembered robotic limb - HD.cut_overlays() - src.head = HD - src.updateicon() - else - to_chat(user, "You need to attach a flash to it first!") - - else if (istype(W, /obj/item/multitool)) - if(check_completion()) - Interact(user) - else - to_chat(user, "The endoskeleton must be assembled before debugging can begin!") - - else if(istype(W, /obj/item/mmi)) - var/obj/item/mmi/M = W - if(check_completion()) - if(!chest.cell) - to_chat(user, "The endoskeleton still needs a power cell!") - return - if(!isturf(loc)) - to_chat(user, "You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!") - return - if(!M.brainmob) - to_chat(user, "Sticking an empty [M.name] into the frame would sort of defeat the purpose!") - return - - var/mob/living/brain/BM = M.brainmob - if(!BM.key || !BM.mind) - to_chat(user, "The MMI indicates that their mind is completely unresponsive; there's no point!") - return - - if(!BM.client) //braindead - to_chat(user, "The MMI indicates that their mind is currently inactive; it might change!") - return - - if(BM.stat == DEAD || (M.brain && M.brain.organ_flags & ORGAN_FAILING)) - to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!") - return - - if(jobban_isbanned(BM, "Cyborg") || QDELETED(src) || QDELETED(BM) || QDELETED(user) || QDELETED(M) || !Adjacent(user)) - if(!QDELETED(M)) - to_chat(user, "This [M.name] does not seem to fit!") - return - - if(!user.temporarilyRemoveItemFromInventory(W)) - return - - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) - if(!O) - return - - if(M.laws && M.laws.id != DEFAULT_AI_LAWID) - aisync = 0 - lawsync = 0 - O.laws = M.laws - M.laws.associate(O) - - O.invisibility = 0 - //Transfer debug settings to new mob - O.custom_name = created_name - O.locked = panel_locked - if(!aisync) - lawsync = 0 - O.set_connected_ai(null) - else - O.notify_ai(NEW_BORG) - if(forced_ai) - O.set_connected_ai(forced_ai) - if(!lawsync) - O.lawupdate = 0 - if(M.laws.id == DEFAULT_AI_LAWID) - O.make_laws() - - SSticker.mode.remove_antag_for_borging(BM.mind) - if(!istype(M.laws, /datum/ai_laws/ratvar)) - remove_servant_of_ratvar(BM, TRUE) - BM.mind.transfer_to(O) - - if(O.mind && O.mind.special_role) - O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") - to_chat(O, "You have been robotized!") - to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") - - O.job = "Cyborg" - - O.cell = chest.cell - chest.cell.forceMove(O) - chest.cell = null - W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. - if(O.mmi) //we delete the mmi created by robot/New() - qdel(O.mmi) - O.mmi = W //and give the real mmi to the borg. - O.updatename() - SSblackbox.record_feedback("amount", "cyborg_birth", 1) - forceMove(O) - O.robot_suit = src - - if(!locomotion) - O.lockcharge = 1 - O.update_canmove() - to_chat(O, "Error: Servo motors unresponsive.") - - else - to_chat(user, "The MMI must go in after everything else!") - - else if(istype(W, /obj/item/borg/upgrade/ai)) - var/obj/item/borg/upgrade/ai/M = W - if(check_completion()) - if(!isturf(loc)) - to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") - return - if(!user.temporarilyRemoveItemFromInventory(M)) - to_chat(user, "[M] is stuck to your hand!") - return - qdel(M) - var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/shell(get_turf(src)) - - if(!aisync) - lawsync = FALSE - O.set_connected_ai(null) - else - if(forced_ai) - O.set_connected_ai(forced_ai) - O.notify_ai(AI_SHELL) - if(!lawsync) - O.lawupdate = FALSE - O.make_laws() - - - O.cell = chest.cell - chest.cell.forceMove(O) - chest.cell = null - O.locked = panel_locked - O.job = "Cyborg" - forceMove(O) - O.robot_suit = src - if(!locomotion) - O.lockcharge = TRUE - O.update_canmove() - - else if(istype(W, /obj/item/pen)) - to_chat(user, "You need to use a multitool to name [src]!") - else - return ..() - -/obj/item/robot_suit/proc/Interact(mob/user) - var/t1 = "Designation: [(created_name ? "[created_name]" : "Default Cyborg")]
                  \n" - t1 += "Master AI: [(forced_ai ? "[forced_ai.name]" : "Automatic")]

                  \n" - - t1 += "LawSync Port: [(lawsync ? "Open" : "Closed")]
                  \n" - t1 += "AI Connection Port: [(aisync ? "Open" : "Closed")]
                  \n" - t1 += "Servo Motor Functions: [(locomotion ? "Unlocked" : "Locked")]
                  \n" - t1 += "Panel Lock: [(panel_locked ? "Engaged" : "Disengaged")]
                  \n" - var/datum/browser/popup = new(user, "robotdebug", "Cyborg Boot Debug", 310, 220) - popup.set_content(t1) - popup.open() - -/obj/item/robot_suit/Topic(href, href_list) - if(usr.incapacitated() || !Adjacent(usr)) - return - - var/mob/living/living_user = usr - var/obj/item/item_in_hand = living_user.get_active_held_item() - if(!istype(item_in_hand, /obj/item/multitool)) - to_chat(living_user, "You need a multitool!") - return - - if(href_list["Name"]) - var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name), TRUE) - if(!in_range(src, usr) && src.loc != usr) - return - if(new_name) - created_name = new_name - else - created_name = "" - - else if(href_list["Master"]) - forced_ai = select_active_ai(usr) - if(!forced_ai) - to_chat(usr, "No active AIs detected.") - - else if(href_list["Law"]) - lawsync = !lawsync - else if(href_list["AI"]) - aisync = !aisync - else if(href_list["Loco"]) - locomotion = !locomotion - else if(href_list["Panel"]) - panel_locked = !panel_locked - - add_fingerprint(usr) - Interact(usr) + + +//The robot bodyparts have been moved to code/module/surgery/bodyparts/robot_bodyparts.dm + + +/obj/item/robot_suit + name = "cyborg endoskeleton" + desc = "A complex metal backbone with standard limb sockets and pseudomuscle anchors." + icon = 'icons/mob/augmentation/augments.dmi' + icon_state = "robo_suit" + var/obj/item/bodypart/l_arm/robot/l_arm = null + var/obj/item/bodypart/r_arm/robot/r_arm = null + var/obj/item/bodypart/l_leg/robot/l_leg = null + var/obj/item/bodypart/r_leg/robot/r_leg = null + var/obj/item/bodypart/chest/robot/chest = null + var/obj/item/bodypart/head/robot/head = null + + var/created_name = "" + var/mob/living/silicon/ai/forced_ai + var/locomotion = 1 + var/lawsync = 1 + var/aisync = 1 + var/panel_locked = TRUE + +/obj/item/robot_suit/New() + ..() + update_icon() + +/obj/item/robot_suit/prebuilt/New() + l_arm = new(src) + r_arm = new(src) + l_leg = new(src) + r_leg = new(src) + head = new(src) + head.flash1 = new(head) + head.flash2 = new(head) + chest = new(src) + chest.wired = TRUE + chest.cell = new /obj/item/stock_parts/cell/high/plus(chest) + ..() + +/obj/item/robot_suit/update_icon() + cut_overlays() + if(l_arm) + add_overlay("[l_arm.icon_state]+o") + if(r_arm) + add_overlay("[r_arm.icon_state]+o") + if(chest) + add_overlay("[chest.icon_state]+o") + if(l_leg) + add_overlay("[l_leg.icon_state]+o") + if(r_leg) + add_overlay("[r_leg.icon_state]+o") + if(head) + add_overlay("[head.icon_state]+o") + +/obj/item/robot_suit/proc/check_completion() + if(src.l_arm && src.r_arm) + if(src.l_leg && src.r_leg) + if(src.chest && src.head) + SSblackbox.record_feedback("amount", "cyborg_frames_built", 1) + return 1 + return 0 + +/obj/item/robot_suit/wrench_act(mob/living/user, obj/item/I) //Deconstucts empty borg shell. Flashes remain unbroken because they haven't been used yet + var/turf/T = get_turf(src) + if(l_leg || r_leg || chest || l_arm || r_arm || head) + if(I.use_tool(src, user, 5, volume=50)) + if(l_leg) + l_leg.forceMove(T) + l_leg = null + if(r_leg) + r_leg.forceMove(T) + r_leg = null + if(chest) + if (chest.cell) //Sanity check. + chest.cell.forceMove(T) + chest.cell = null + chest.forceMove(T) + new /obj/item/stack/cable_coil(T, 1) + chest.wired = FALSE + chest = null + if(l_arm) + l_arm.forceMove(T) + l_arm = null + if(r_arm) + r_arm.forceMove(T) + r_arm = null + if(head) + head.forceMove(T) + head.flash1.forceMove(T) + head.flash1 = null + head.flash2.forceMove(T) + head.flash2 = null + head = null + to_chat(user, "You disassemble the cyborg shell.") + else + to_chat(user, "There is nothing to remove from the endoskeleton.") + update_icon() + +/obj/item/robot_suit/proc/put_in_hand_or_drop(mob/living/user, obj/item/I) //normal put_in_hands() drops the item ontop of the player, this drops it at the suit's loc + if(!user.put_in_hands(I)) + I.forceMove(drop_location()) + return FALSE + return TRUE + +/obj/item/robot_suit/screwdriver_act(mob/living/user, obj/item/I) //Swaps the power cell if you're holding a new one in your other hand. + . = ..() + if(.) + return TRUE + + if(!chest) //can't remove a cell if there's no chest to remove it from. + to_chat(user, "[src] has no attached torso.") + return + + var/obj/item/stock_parts/cell/temp_cell = user.is_holding_item_of_type(/obj/item/stock_parts/cell) + var/swap_failed + if(!temp_cell) //if we're not holding a cell + swap_failed = TRUE + else if(!user.transferItemToLoc(temp_cell, chest)) + swap_failed = TRUE + to_chat(user, "[temp_cell] is stuck to your hand, you can't put it in [src]!") + + if(chest.cell) //drop the chest's current cell no matter what. + put_in_hand_or_drop(user, chest.cell) + + if(swap_failed) //we didn't transfer any new items. + if(chest.cell) //old cell ejected, nothing inserted. + to_chat(user, "You remove [chest.cell] from [src].") + chest.cell = null + else + to_chat(user, "The power cell slot in [src]'s torso is empty.") + return + + to_chat(user, "You [chest.cell ? "replace [src]'s [chest.cell.name] with [temp_cell]" : "insert [temp_cell] into [src]"].") + chest.cell = temp_cell + return TRUE + +/obj/item/robot_suit/attackby(obj/item/W, mob/user, params) + + if(istype(W, /obj/item/stack/sheet/metal)) + var/obj/item/stack/sheet/metal/M = W + if(!l_arm && !r_arm && !l_leg && !r_leg && !chest && !head) + if (M.use(1)) + var/obj/item/bot_assembly/ed209/B = new + B.forceMove(drop_location()) + to_chat(user, "You arm the robot frame.") + var/holding_this = user.get_inactive_held_item()==src + qdel(src) + if (holding_this) + user.put_in_inactive_hand(B) + else + to_chat(user, "You need one sheet of metal to start building ED-209!") + return + else if(istype(W, /obj/item/bodypart/l_leg/robot)) + if(src.l_leg) + return + if(!user.transferItemToLoc(W, src)) + return + W.icon_state = initial(W.icon_state) + W.cut_overlays() + src.l_leg = W + update_icon() + + else if(istype(W, /obj/item/bodypart/r_leg/robot)) + if(src.r_leg) + return + if(!user.transferItemToLoc(W, src)) + return + W.icon_state = initial(W.icon_state) + W.cut_overlays() + src.r_leg = W + update_icon() + + else if(istype(W, /obj/item/bodypart/l_arm/robot)) + if(src.l_arm) + return + if(!user.transferItemToLoc(W, src)) + return + W.icon_state = initial(W.icon_state) + W.cut_overlays() + src.l_arm = W + update_icon() + + else if(istype(W, /obj/item/bodypart/r_arm/robot)) + if(src.r_arm) + return + if(!user.transferItemToLoc(W, src)) + return + W.icon_state = initial(W.icon_state)//in case it is a dismembered robotic limb + W.cut_overlays() + src.r_arm = W + update_icon() + + else if(istype(W, /obj/item/bodypart/chest/robot)) + var/obj/item/bodypart/chest/robot/CH = W + if(src.chest) + return + if(CH.wired && CH.cell) + if(!user.transferItemToLoc(CH, src)) + return + CH.icon_state = initial(CH.icon_state) //in case it is a dismembered robotic limb + CH.cut_overlays() + src.chest = CH + update_icon() + else if(!CH.wired) + to_chat(user, "You need to attach wires to it first!") + else + to_chat(user, "You need to attach a cell to it first!") + + else if(istype(W, /obj/item/bodypart/head/robot)) + var/obj/item/bodypart/head/robot/HD = W + for(var/X in HD.contents) + if(istype(X, /obj/item/organ)) + to_chat(user, "There are organs inside [HD]!") + return + if(src.head) + return + if(HD.flash2 && HD.flash1) + if(!user.transferItemToLoc(HD, src)) + return + HD.icon_state = initial(HD.icon_state)//in case it is a dismembered robotic limb + HD.cut_overlays() + src.head = HD + update_icon() + else + to_chat(user, "You need to attach a flash to it first!") + + else if (istype(W, /obj/item/multitool)) + if(check_completion()) + Interact(user) + else + to_chat(user, "The endoskeleton must be assembled before debugging can begin!") + + else if(istype(W, /obj/item/mmi)) + var/obj/item/mmi/M = W + if(check_completion()) + if(!chest.cell) + to_chat(user, "The endoskeleton still needs a power cell!") + return + if(!isturf(loc)) + to_chat(user, "You can't put [M] in, the frame has to be standing on the ground to be perfectly precise!") + return + if(!M.brainmob) + to_chat(user, "Sticking an empty [M.name] into the frame would sort of defeat the purpose!") + return + + var/mob/living/brain/BM = M.brainmob + if(!BM.key || !BM.mind) + to_chat(user, "The MMI indicates that their mind is completely unresponsive; there's no point!") + return + + if(!BM.client) //braindead + to_chat(user, "The MMI indicates that their mind is currently inactive; it might change!") + return + + if(BM.stat == DEAD || (M.brain && M.brain.organ_flags & ORGAN_FAILING)) + to_chat(user, "Sticking a dead brain into the frame would sort of defeat the purpose!") + return + + if(jobban_isbanned(BM, "Cyborg") || QDELETED(src) || QDELETED(BM) || QDELETED(user) || QDELETED(M) || !Adjacent(user)) + if(!QDELETED(M)) + to_chat(user, "This [M.name] does not seem to fit!") + return + + if(!user.temporarilyRemoveItemFromInventory(W)) + return + + var/mob/living/silicon/robot/O = new /mob/living/silicon/robot(get_turf(loc)) + if(!O) + return + + if(M.laws && M.laws.id != DEFAULT_AI_LAWID) + aisync = 0 + lawsync = 0 + O.laws = M.laws + M.laws.associate(O) + + O.invisibility = 0 + //Transfer debug settings to new mob + O.custom_name = created_name + O.locked = panel_locked + if(!aisync) + lawsync = 0 + O.set_connected_ai(null) + else + O.notify_ai(NEW_BORG) + if(forced_ai) + O.set_connected_ai(forced_ai) + if(!lawsync) + O.lawupdate = 0 + if(M.laws.id == DEFAULT_AI_LAWID) + O.make_laws() + + SSticker.mode.remove_antag_for_borging(BM.mind) + if(!istype(M.laws, /datum/ai_laws/ratvar)) + remove_servant_of_ratvar(BM, TRUE) + BM.mind.transfer_to(O) + + if(O.mind && O.mind.special_role) + O.mind.store_memory("As a cyborg, you must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") + to_chat(O, "You have been robotized!") + to_chat(O, "You must obey your silicon laws and master AI above all else. Your objectives will consider you to be dead.") + + O.job = "Cyborg" + + O.cell = chest.cell + chest.cell.forceMove(O) + chest.cell = null + W.forceMove(O)//Should fix cybros run time erroring when blown up. It got deleted before, along with the frame. + if(O.mmi) //we delete the mmi created by robot/New() + qdel(O.mmi) + O.mmi = W //and give the real mmi to the borg. + O.updatename() + SSblackbox.record_feedback("amount", "cyborg_birth", 1) + forceMove(O) + O.robot_suit = src + + if(!locomotion) + O.lockcharge = 1 + O.update_canmove() + to_chat(O, "Error: Servo motors unresponsive.") + + else + to_chat(user, "The MMI must go in after everything else!") + + else if(istype(W, /obj/item/borg/upgrade/ai)) + var/obj/item/borg/upgrade/ai/M = W + if(check_completion()) + if(!isturf(loc)) + to_chat(user, "You cannot install[M], the frame has to be standing on the ground to be perfectly precise!") + return + if(!user.temporarilyRemoveItemFromInventory(M)) + to_chat(user, "[M] is stuck to your hand!") + return + qdel(M) + var/mob/living/silicon/robot/O = new /mob/living/silicon/robot/shell(get_turf(src)) + + if(!aisync) + lawsync = FALSE + O.set_connected_ai(null) + else + if(forced_ai) + O.set_connected_ai(forced_ai) + O.notify_ai(AI_SHELL) + if(!lawsync) + O.lawupdate = FALSE + O.make_laws() + + + O.cell = chest.cell + chest.cell.forceMove(O) + chest.cell = null + O.locked = panel_locked + O.job = "Cyborg" + forceMove(O) + O.robot_suit = src + if(!locomotion) + O.lockcharge = TRUE + O.update_canmove() + + else if(istype(W, /obj/item/pen)) + to_chat(user, "You need to use a multitool to name [src]!") + else + return ..() + +/obj/item/robot_suit/proc/Interact(mob/user) + var/t1 = "Designation: [(created_name ? "[created_name]" : "Default Cyborg")]
                  \n" + t1 += "Master AI: [(forced_ai ? "[forced_ai.name]" : "Automatic")]

                  \n" + + t1 += "LawSync Port: [(lawsync ? "Open" : "Closed")]
                  \n" + t1 += "AI Connection Port: [(aisync ? "Open" : "Closed")]
                  \n" + t1 += "Servo Motor Functions: [(locomotion ? "Unlocked" : "Locked")]
                  \n" + t1 += "Panel Lock: [(panel_locked ? "Engaged" : "Disengaged")]
                  \n" + var/datum/browser/popup = new(user, "robotdebug", "Cyborg Boot Debug", 310, 220) + popup.set_content(t1) + popup.open() + +/obj/item/robot_suit/Topic(href, href_list) + if(usr.incapacitated() || !Adjacent(usr)) + return + + var/mob/living/living_user = usr + var/obj/item/item_in_hand = living_user.get_active_held_item() + if(!istype(item_in_hand, /obj/item/multitool)) + to_chat(living_user, "You need a multitool!") + return + + if(href_list["Name"]) + var/new_name = reject_bad_name(input(usr, "Enter new designation. Set to blank to reset to default.", "Cyborg Debug", src.created_name), TRUE) + if(!in_range(src, usr) && src.loc != usr) + return + if(new_name) + created_name = new_name + else + created_name = "" + + else if(href_list["Master"]) + forced_ai = select_active_ai(usr) + if(!forced_ai) + to_chat(usr, "No active AIs detected.") + + else if(href_list["Law"]) + lawsync = !lawsync + else if(href_list["AI"]) + aisync = !aisync + else if(href_list["Loco"]) + locomotion = !locomotion + else if(href_list["Panel"]) + panel_locked = !panel_locked + + add_fingerprint(usr) + Interact(usr) diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 91836b83..5ce34d44 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -40,11 +40,11 @@ last_process = world.time to_chat(user, "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.") user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20) - update_icons() - addtimer(CALLBACK(src, .proc/update_icons), time_between_uses) + update_icon() + addtimer(CALLBACK(src, .proc/update_icon), time_between_uses) -/obj/structure/healingfountain/proc/update_icons() +/obj/structure/healingfountain/update_icon() if(last_process + time_between_uses > world.time) icon_state = "fountain" else diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 32af8888..f75607df 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -820,7 +820,7 @@ robot_suit.head.flash2.burn_out() robot_suit.head.flash2 = null robot_suit.head = null - robot_suit.updateicon() + robot_suit.update_icon() else new /obj/item/robot_suit(T) new /obj/item/bodypart/l_leg/robot(T) diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 018a16e4..a4cd9d92 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -1,231 +1,231 @@ -// stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT -#define RAD_COLLECTOR_EFFICIENCY 60 // radiation needs to be over this amount to get power -#define RAD_COLLECTOR_COEFFICIENT 100 -#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source -#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process() -#define RAD_COLLECTOR_OUTPUT min(stored_power, (stored_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored - -/obj/machinery/power/rad_collector - name = "Radiation Collector Array" - desc = "A device which uses Hawking Radiation and plasma to produce power." - icon = 'icons/obj/singularity.dmi' - icon_state = "ca" - anchored = FALSE - density = TRUE - req_access = list(ACCESS_ENGINE_EQUIP) -// use_power = NO_POWER_USE - max_integrity = 350 - integrity_failure = 80 - circuit = /obj/item/circuitboard/machine/rad_collector - var/obj/item/tank/internals/plasma/loaded_tank = null - var/stored_power = 0 - var/active = 0 - var/locked = FALSE - var/drainratio = 1 - var/powerproduction_drain = 0.001 - - var/bitcoinproduction_drain = 0.15 - var/bitcoinmining = FALSE - rad_insulation = RAD_EXTREME_INSULATION - -/obj/machinery/power/rad_collector/anchored - anchored = TRUE - -/obj/machinery/power/rad_collector/Destroy() - return ..() - -/obj/machinery/power/rad_collector/process() - if(!loaded_tank) - return - if(!bitcoinmining) - if(!loaded_tank.air_contents.gases[/datum/gas/plasma]) - investigate_log("out of fuel.", INVESTIGATE_SINGULO) - playsound(src, 'sound/machines/ding.ogg', 50, 1) - eject() - else - var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma]) - loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained - loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained - GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) - - var/power_produced = RAD_COLLECTOR_OUTPUT - add_avail(power_produced) - stored_power-=power_produced - else if(is_station_level(z) && SSresearch.science_tech) - if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen]) - playsound(src, 'sound/machines/ding.ogg', 50, 1) - eject() - else - var/gasdrained = bitcoinproduction_drain*drainratio - loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained - loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained - loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2 - GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) - var/bitcoins_mined = RAD_COLLECTOR_OUTPUT - SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE) - stored_power-=bitcoins_mined - -/obj/machinery/power/rad_collector/interact(mob/user) - if(anchored) - if(!src.locked) - toggle_power() - user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ - "You turn the [src.name] [active? "on":"off"].") - var/fuel - if(loaded_tank) - fuel = loaded_tank.air_contents.gases[/datum/gas/plasma] - investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) - return - else - to_chat(user, "The controls are locked!") - return - -/obj/machinery/power/rad_collector/can_be_unfasten_wrench(mob/user, silent) - if(loaded_tank) - if(!silent) - to_chat(user, "Remove the plasma tank first!") - return FAILED_UNFASTEN - return ..() - -/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20) - . = ..() - if(. == SUCCESSFUL_UNFASTEN) - if(anchored) - connect_to_network() - else - disconnect_from_network() - -/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/tank/internals/plasma)) - if(!anchored) - to_chat(user, "[src] needs to be secured to the floor first!") - return TRUE - if(loaded_tank) - to_chat(user, "There's already a plasma tank loaded!") - return TRUE - if(panel_open) - to_chat(user, "Close the maintenance panel first!") - return TRUE - if(!user.transferItemToLoc(W, src)) - return - loaded_tank = W - update_icons() - else if(W.GetID()) - if(allowed(user)) - if(active) - locked = !locked - to_chat(user, "You [locked ? "lock" : "unlock"] the controls.") - else - to_chat(user, "The controls can only be locked when \the [src] is active!") - else - to_chat(user, "Access denied.") - return TRUE - else - return ..() - -/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/I) - default_unfasten_wrench(user, I) - return TRUE - -/obj/machinery/power/rad_collector/screwdriver_act(mob/living/user, obj/item/I) - if(..()) - return TRUE - if(loaded_tank) - to_chat(user, "Remove the plasma tank first!") - else - default_deconstruction_screwdriver(user, icon_state, icon_state, I) - return TRUE - -/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/I) - if(loaded_tank) - if(locked) - to_chat(user, "The controls are locked!") - return TRUE - eject() - return TRUE - if(default_deconstruction_crowbar(I)) - return TRUE - to_chat(user, "There isn't a tank loaded!") - return TRUE - -/obj/machinery/power/rad_collector/multitool_act(mob/living/user, obj/item/I) - if(!is_station_level(z) && !SSresearch.science_tech) - to_chat(user, "[src] isn't linked to a research system!") - return TRUE - if(locked) - to_chat(user, "[src] is locked!") - return TRUE - if(active) - to_chat(user, "[src] is currently active, producing [bitcoinmining ? "research points":"power"].") - return TRUE - bitcoinmining = !bitcoinmining - to_chat(user, "You [bitcoinmining ? "enable":"disable"] the research point production feature of [src].") - return TRUE - -/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I) - if(loaded_tank) - loaded_tank.analyzer_act(user, I) - -/obj/machinery/power/rad_collector/examine(mob/user) - . = ..() - if(active) - if(!bitcoinmining) - . += "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute.
                  The plasma within it's tank is being irradiated into tritium.
                  " - else - . += "[src]'s display states that it's producing a total of [(stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute.
                  The tritium and oxygen within it's tank is being combusted into carbon dioxide.
                  " - else - if(!bitcoinmining) - . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"" - else - . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\"" - -/obj/machinery/power/rad_collector/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) - eject() - stat |= BROKEN - -/obj/machinery/power/rad_collector/proc/eject() - locked = FALSE - var/obj/item/tank/internals/plasma/Z = src.loaded_tank - if (!Z) - return - Z.forceMove(drop_location()) - Z.layer = initial(Z.layer) - Z.plane = initial(Z.plane) - src.loaded_tank = null - if(active) - toggle_power() - else - update_icons() - -/obj/machinery/power/rad_collector/rad_act(pulse_strength) - . = ..() - if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY) - stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT - -/obj/machinery/power/rad_collector/proc/update_icons() - cut_overlays() - if(loaded_tank) - add_overlay("ptank") - if(stat & (NOPOWER|BROKEN)) - return - if(active) - add_overlay("on") - - -/obj/machinery/power/rad_collector/proc/toggle_power() - active = !active - if(active) - icon_state = "ca_on" - flick("ca_active", src) - else - icon_state = "ca" - flick("ca_deactive", src) - update_icons() - return - -#undef RAD_COLLECTOR_EFFICIENCY -#undef RAD_COLLECTOR_COEFFICIENT -#undef RAD_COLLECTOR_STORED_OUT -#undef RAD_COLLECTOR_MINING_CONVERSION_RATE -#undef RAD_COLLECTOR_OUTPUT +// stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT +#define RAD_COLLECTOR_EFFICIENCY 60 // radiation needs to be over this amount to get power +#define RAD_COLLECTOR_COEFFICIENT 100 +#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source +#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process() +#define RAD_COLLECTOR_OUTPUT min(stored_power, (stored_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored + +/obj/machinery/power/rad_collector + name = "Radiation Collector Array" + desc = "A device which uses Hawking Radiation and plasma to produce power." + icon = 'icons/obj/singularity.dmi' + icon_state = "ca" + anchored = FALSE + density = TRUE + req_access = list(ACCESS_ENGINE_EQUIP) +// use_power = NO_POWER_USE + max_integrity = 350 + integrity_failure = 80 + circuit = /obj/item/circuitboard/machine/rad_collector + var/obj/item/tank/internals/plasma/loaded_tank = null + var/stored_power = 0 + var/active = 0 + var/locked = FALSE + var/drainratio = 1 + var/powerproduction_drain = 0.001 + + var/bitcoinproduction_drain = 0.15 + var/bitcoinmining = FALSE + rad_insulation = RAD_EXTREME_INSULATION + +/obj/machinery/power/rad_collector/anchored + anchored = TRUE + +/obj/machinery/power/rad_collector/Destroy() + return ..() + +/obj/machinery/power/rad_collector/process() + if(!loaded_tank) + return + if(!bitcoinmining) + if(!loaded_tank.air_contents.gases[/datum/gas/plasma]) + investigate_log("out of fuel.", INVESTIGATE_SINGULO) + playsound(src, 'sound/machines/ding.ogg', 50, 1) + eject() + else + var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma]) + loaded_tank.air_contents.gases[/datum/gas/plasma] -= gasdrained + loaded_tank.air_contents.gases[/datum/gas/tritium] += gasdrained + GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) + + var/power_produced = RAD_COLLECTOR_OUTPUT + add_avail(power_produced) + stored_power-=power_produced + else if(is_station_level(z) && SSresearch.science_tech) + if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen]) + playsound(src, 'sound/machines/ding.ogg', 50, 1) + eject() + else + var/gasdrained = bitcoinproduction_drain*drainratio + loaded_tank.air_contents.gases[/datum/gas/tritium] -= gasdrained + loaded_tank.air_contents.gases[/datum/gas/oxygen] -= gasdrained + loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide] += gasdrained*2 + GAS_GARBAGE_COLLECT(loaded_tank.air_contents.gases) + var/bitcoins_mined = RAD_COLLECTOR_OUTPUT + SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE) + stored_power-=bitcoins_mined + +/obj/machinery/power/rad_collector/interact(mob/user) + if(anchored) + if(!src.locked) + toggle_power() + user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ + "You turn the [src.name] [active? "on":"off"].") + var/fuel + if(loaded_tank) + fuel = loaded_tank.air_contents.gases[/datum/gas/plasma] + investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) + return + else + to_chat(user, "The controls are locked!") + return + +/obj/machinery/power/rad_collector/can_be_unfasten_wrench(mob/user, silent) + if(loaded_tank) + if(!silent) + to_chat(user, "Remove the plasma tank first!") + return FAILED_UNFASTEN + return ..() + +/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20) + . = ..() + if(. == SUCCESSFUL_UNFASTEN) + if(anchored) + connect_to_network() + else + disconnect_from_network() + +/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/tank/internals/plasma)) + if(!anchored) + to_chat(user, "[src] needs to be secured to the floor first!") + return TRUE + if(loaded_tank) + to_chat(user, "There's already a plasma tank loaded!") + return TRUE + if(panel_open) + to_chat(user, "Close the maintenance panel first!") + return TRUE + if(!user.transferItemToLoc(W, src)) + return + loaded_tank = W + update_icon() + else if(W.GetID()) + if(allowed(user)) + if(active) + locked = !locked + to_chat(user, "You [locked ? "lock" : "unlock"] the controls.") + else + to_chat(user, "The controls can only be locked when \the [src] is active!") + else + to_chat(user, "Access denied.") + return TRUE + else + return ..() + +/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/I) + default_unfasten_wrench(user, I) + return TRUE + +/obj/machinery/power/rad_collector/screwdriver_act(mob/living/user, obj/item/I) + if(..()) + return TRUE + if(loaded_tank) + to_chat(user, "Remove the plasma tank first!") + else + default_deconstruction_screwdriver(user, icon_state, icon_state, I) + return TRUE + +/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/I) + if(loaded_tank) + if(locked) + to_chat(user, "The controls are locked!") + return TRUE + eject() + return TRUE + if(default_deconstruction_crowbar(I)) + return TRUE + to_chat(user, "There isn't a tank loaded!") + return TRUE + +/obj/machinery/power/rad_collector/multitool_act(mob/living/user, obj/item/I) + if(!is_station_level(z) && !SSresearch.science_tech) + to_chat(user, "[src] isn't linked to a research system!") + return TRUE + if(locked) + to_chat(user, "[src] is locked!") + return TRUE + if(active) + to_chat(user, "[src] is currently active, producing [bitcoinmining ? "research points":"power"].") + return TRUE + bitcoinmining = !bitcoinmining + to_chat(user, "You [bitcoinmining ? "enable":"disable"] the research point production feature of [src].") + return TRUE + +/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I) + if(loaded_tank) + loaded_tank.analyzer_act(user, I) + +/obj/machinery/power/rad_collector/examine(mob/user) + . = ..() + if(active) + if(!bitcoinmining) + . += "[src]'s display states that it has stored [DisplayPower(stored_power)], and is processing [DisplayPower((RAD_COLLECTOR_OUTPUT)*((60 SECONDS)/SSmachines.wait))] per minute.
                  The plasma within it's tank is being irradiated into tritium.
                  " + else + . += "[src]'s display states that it's producing a total of [(stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE)*((60 SECONDS)/SSmachines.wait)] research points per minute.
                  The tritium and oxygen within it's tank is being combusted into carbon dioxide.
                  " + else + if(!bitcoinmining) + . += "[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"" + else + . += "[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\"" + +/obj/machinery/power/rad_collector/obj_break(damage_flag) + if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + eject() + stat |= BROKEN + +/obj/machinery/power/rad_collector/proc/eject() + locked = FALSE + var/obj/item/tank/internals/plasma/Z = src.loaded_tank + if (!Z) + return + Z.forceMove(drop_location()) + Z.layer = initial(Z.layer) + Z.plane = initial(Z.plane) + src.loaded_tank = null + if(active) + toggle_power() + else + update_icon() + +/obj/machinery/power/rad_collector/rad_act(pulse_strength) + . = ..() + if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY) + stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT + +/obj/machinery/power/rad_collector/update_icon() + cut_overlays() + if(loaded_tank) + add_overlay("ptank") + if(stat & (NOPOWER|BROKEN)) + return + if(active) + add_overlay("on") + + +/obj/machinery/power/rad_collector/proc/toggle_power() + active = !active + if(active) + icon_state = "ca_on" + flick("ca_active", src) + else + icon_state = "ca" + flick("ca_deactive", src) + update_icon() + return + +#undef RAD_COLLECTOR_EFFICIENCY +#undef RAD_COLLECTOR_COEFFICIENT +#undef RAD_COLLECTOR_STORED_OUT +#undef RAD_COLLECTOR_MINING_CONVERSION_RATE +#undef RAD_COLLECTOR_OUTPUT From a5cf94ab29cc1de6ccdc69a2734cc9b7fe6d8cfe Mon Sep 17 00:00:00 2001 From: Lin Date: Sat, 28 Dec 2019 04:07:03 +0000 Subject: [PATCH 05/14] Merge pull request #10212 from Ghommie/Ghommie-cit471 Ports some hud and update_icon code updates. --- code/_onclick/hud/ai.dm | 18 + code/_onclick/hud/alien.dm | 23 +- code/_onclick/hud/alien_larva.dm | 18 +- code/_onclick/hud/blob_overmind.dm | 9 + code/_onclick/hud/blobbernauthud.dm | 2 + code/_onclick/hud/constructs.dm | 4 +- code/_onclick/hud/devil.dm | 12 +- code/_onclick/hud/generic_dextrous.dm | 11 +- code/_onclick/hud/ghost.dm | 184 +- code/_onclick/hud/guardian.dm | 6 + code/_onclick/hud/hud.dm | 593 +- code/_onclick/hud/hud_cit.dm | 2 - code/_onclick/hud/human.dm | 1009 +-- code/_onclick/hud/lavaland_elite.dm | 16 + code/_onclick/hud/monkey.dm | 316 +- code/_onclick/hud/revenanthud.dm | 1 + code/_onclick/hud/robot.dm | 559 +- code/_onclick/hud/screen_objects.dm | 1409 ++-- code/_onclick/hud/swarmer.dm | 6 + code/datums/martial/sleeping_carp.dm | 3 +- code/game/area/areas.dm | 14 +- code/game/atoms.dm | 1828 ++--- code/game/machinery/buttons.dm | 531 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/defibrillator_mount.dm | 26 +- .../temporary_visuals/miscellaneous.dm | 2 +- code/game/objects/items/defib.dm | 22 +- .../objects/items/devices/transfer_valve.dm | 474 +- code/game/objects/objs.dm | 507 +- code/game/objects/structures/divine.dm | 2 +- code/game/turfs/simulated/floor.dm | 4 +- code/game/turfs/simulated/wall/reinf_walls.dm | 9 +- code/game/turfs/space/transit.dm | 7 +- code/modules/assembly/flash.dm | 726 +- code/modules/cargo/gondolapod.dm | 2 +- .../food_and_drinks/food/customizables.dm | 6 +- code/modules/food_and_drinks/food/snacks.dm | 2 +- .../food_and_drinks/food/snacks_pastry.dm | 6 +- code/modules/holodeck/turfs.dm | 5 +- code/modules/mob/dead/observer/observer.dm | 3 +- .../living/simple_animal/bot/SuperBeepsky.dm | 2 +- .../mob/living/simple_animal/bot/bot.dm | 2 +- .../mob/living/simple_animal/bot/honkbot.dm | 4 +- .../mob/living/simple_animal/bot/secbot.dm | 2 +- code/modules/mob/mob.dm | 8 +- code/modules/mob/mob_defines.dm | 2 +- code/modules/mob/mob_movement.dm | 816 +- .../code/_onclick/hud/screen_objects.dm | 14 +- modular_citadel/code/_onclick/hud/sprint.dm | 7 +- modular_citadel/code/_onclick/hud/stamina.dm | 86 +- .../code/modules/mob/living/carbon/carbon.dm | 10 +- .../mob/living/carbon/human/human_movement.dm | 12 +- .../code/modules/mob/living/living.dm | 1 + .../living/silicon/robot/robot_movement.dm | 12 +- tgstation.dme | 6715 ++++++++--------- 55 files changed, 8120 insertions(+), 7952 deletions(-) delete mode 100644 code/_onclick/hud/hud_cit.dm create mode 100644 code/_onclick/hud/lavaland_elite.dm diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 49bdd3f3..93c3b63d 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -195,89 +195,107 @@ // Language menu using = new /obj/screen/language_menu using.screen_loc = ui_borg_language_menu + using.hud = src static_inventory += using //AI core using = new /obj/screen/ai/aicore() using.screen_loc = ui_ai_core + using.hud = src static_inventory += using //Camera list using = new /obj/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list + using.hud = src static_inventory += using //Track using = new /obj/screen/ai/camera_track() using.screen_loc = ui_ai_track_with_camera + using.hud = src static_inventory += using //Camera light using = new /obj/screen/ai/camera_light() using.screen_loc = ui_ai_camera_light + using.hud = src static_inventory += using //Crew Monitoring using = new /obj/screen/ai/crew_monitor() using.screen_loc = ui_ai_crew_monitor + using.hud = src static_inventory += using //Crew Manifest using = new /obj/screen/ai/crew_manifest() using.screen_loc = ui_ai_crew_manifest + using.hud = src static_inventory += using //Alerts using = new /obj/screen/ai/alerts() using.screen_loc = ui_ai_alerts + using.hud = src static_inventory += using //Announcement using = new /obj/screen/ai/announcement() using.screen_loc = ui_ai_announcement + using.hud = src static_inventory += using //Shuttle using = new /obj/screen/ai/call_shuttle() using.screen_loc = ui_ai_shuttle + using.hud = src static_inventory += using //Laws using = new /obj/screen/ai/state_laws() using.screen_loc = ui_ai_state_laws + using.hud = src static_inventory += using //PDA message using = new /obj/screen/ai/pda_msg_send() using.screen_loc = ui_ai_pda_send + using.hud = src static_inventory += using //PDA log using = new /obj/screen/ai/pda_msg_show() using.screen_loc = ui_ai_pda_log + using.hud = src static_inventory += using //Take image using = new /obj/screen/ai/image_take() using.screen_loc = ui_ai_take_picture + using.hud = src static_inventory += using //View images using = new /obj/screen/ai/image_view() using.screen_loc = ui_ai_view_images + using.hud = src static_inventory += using //Medical/Security sensors using = new /obj/screen/ai/sensors() using.screen_loc = ui_ai_sensor + using.hud = src static_inventory += using //Multicamera mode using = new /obj/screen/ai/multicam() using.screen_loc = ui_ai_multicam + using.hud = src static_inventory += using //Add multicamera camera using = new /obj/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam + using.hud = src static_inventory += using diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 1f6ba283..94585cbd 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -43,18 +43,20 @@ using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) + using.hud = src static_inventory += using using = new /obj/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) + using.hud = src static_inventory += using - using = new /obj/screen/act_intent/alien() - using.icon_state = mymob.a_intent - static_inventory += using - action_intent = using + action_intent = new /obj/screen/act_intent/alien() + action_intent.icon_state = mymob.a_intent + action_intent.hud = src + static_inventory += action_intent if(isalienhunter(mymob)) var/mob/living/carbon/alien/humanoid/hunter/H = mymob @@ -64,43 +66,52 @@ using = new/obj/screen/language_menu using.screen_loc = ui_alien_language_menu + using.hud = src static_inventory += using using = new /obj/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw + using.hud = src static_inventory += using using = new /obj/screen/resist() using.icon = ui_style using.screen_loc = ui_pull_resist + using.hud = src hotkeybuttons += using throw_icon = new /obj/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw + throw_icon.hud = src hotkeybuttons += throw_icon pull_icon = new /obj/screen/pull() pull_icon.icon = ui_style - pull_icon.update_icon(mymob) + pull_icon.hud = src + pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist static_inventory += pull_icon //begin indicators healths = new /obj/screen/healths/alien() + healths.hud = src infodisplay += healths alien_plasma_display = new /obj/screen/alien/plasma_display() + alien_plasma_display.hud = src infodisplay += alien_plasma_display if(!isalienqueen(mymob)) alien_queen_finder = new /obj/screen/alien/alien_queen_finder + alien_queen_finder.hud = src infodisplay += alien_queen_finder zone_select = new /obj/screen/zone_sel/alien() - zone_select.update_icon(mymob) + zone_select.hud = src + zone_select.update_icon() static_inventory += zone_select for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 3ffdd66f..0f3c6ccf 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -5,26 +5,32 @@ ..() var/obj/screen/using - using = new /obj/screen/act_intent/alien() - using.icon_state = mymob.a_intent - static_inventory += using - action_intent = using + action_intent = new /obj/screen/act_intent/alien() + action_intent.icon_state = mymob.a_intent + action_intent.hud = src + static_inventory += action_intent healths = new /obj/screen/healths/alien() + healths.hud = src infodisplay += healths alien_queen_finder = new /obj/screen/alien/alien_queen_finder() + alien_queen_finder.hud = src infodisplay += alien_queen_finder + pull_icon = new /obj/screen/pull() pull_icon.icon = 'icons/mob/screen_alien.dmi' - pull_icon.update_icon(mymob) + pull_icon.hud = src + pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist hotkeybuttons += pull_icon using = new/obj/screen/language_menu using.screen_loc = ui_alien_language_menu + using.hud = src static_inventory += using zone_select = new /obj/screen/zone_sel/alien() - zone_select.update_icon(mymob) + zone_select.hud = src + zone_select.update_icon() static_inventory += zone_select diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index ab8bc459..8257b744 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -133,17 +133,21 @@ blobpwrdisplay.mouse_opacity = MOUSE_OPACITY_TRANSPARENT blobpwrdisplay.layer = ABOVE_HUD_LAYER blobpwrdisplay.plane = ABOVE_HUD_PLANE + blobpwrdisplay.hud = src infodisplay += blobpwrdisplay healths = new /obj/screen/healths/blob() + healths.hud = src infodisplay += healths using = new /obj/screen/blob/BlobHelp() using.screen_loc = "WEST:6,NORTH:-3" + using.hud = src static_inventory += using using = new /obj/screen/blob/JumpToNode() using.screen_loc = ui_inventory + using.hud = src static_inventory += using using = new /obj/screen/blob/JumpToCore() @@ -153,18 +157,22 @@ using = new /obj/screen/blob/Blobbernaut() using.screen_loc = ui_belt + using.hud = src static_inventory += using using = new /obj/screen/blob/ResourceBlob() using.screen_loc = ui_back + using.hud = src static_inventory += using using = new /obj/screen/blob/NodeBlob() using.screen_loc = ui_hand_position(2) + using.hud = src static_inventory += using using = new /obj/screen/blob/FactoryBlob() using.screen_loc = ui_hand_position(1) + using.hud = src static_inventory += using using = new /obj/screen/blob/ReadaptChemical() @@ -174,4 +182,5 @@ using = new /obj/screen/blob/RelocateCore() using.screen_loc = ui_storage2 + using.hud = src static_inventory += using diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm index 17d3b11a..ed45d5b1 100644 --- a/code/_onclick/hud/blobbernauthud.dm +++ b/code/_onclick/hud/blobbernauthud.dm @@ -3,7 +3,9 @@ ..() blobpwrdisplay = new /obj/screen/healths/blob/naut/core() + blobpwrdisplay.hud = src infodisplay += blobpwrdisplay healths = new /obj/screen/healths/blob/naut() + healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm index 182495c2..06e657d1 100644 --- a/code/_onclick/hud/constructs.dm +++ b/code/_onclick/hud/constructs.dm @@ -5,9 +5,11 @@ ..() pull_icon = new /obj/screen/pull() pull_icon.icon = ui_style - pull_icon.update_icon(mymob) + pull_icon.hud = src + pull_icon.update_icon() pull_icon.screen_loc = ui_construct_pull static_inventory += pull_icon healths = new /obj/screen/healths/construct() + healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index 40fdc37d..fd214642 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -9,11 +9,13 @@ using = new /obj/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop + using.hud = src static_inventory += using pull_icon = new /obj/screen/pull() pull_icon.icon = ui_style - pull_icon.update_icon(mymob) + pull_icon.hud = src + pull_icon.update_icon() pull_icon.screen_loc = ui_drone_pull static_inventory += pull_icon @@ -26,6 +28,7 @@ using.screen_loc = ui_swaphand_position(owner,1) using.layer = HUD_LAYER using.plane = HUD_PLANE + using.hud = src static_inventory += using using = new /obj/screen/inventory() @@ -35,14 +38,19 @@ using.screen_loc = ui_swaphand_position(owner,2) using.layer = HUD_LAYER using.plane = HUD_PLANE + using.hud = src static_inventory += using zone_select = new /obj/screen/zone_sel() zone_select.icon = ui_style - zone_select.update_icon(mymob) + zone_select.hud = src + zone_select.update_icon() lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay.hud = src + devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay.hud = src infodisplay += devilsouldisplay diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index ad8eb775..e9f325fb 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -6,11 +6,13 @@ using = new /obj/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop + using.hud = src static_inventory += using pull_icon = new /obj/screen/pull() pull_icon.icon = ui_style - pull_icon.update_icon(mymob) + pull_icon.hud = src + pull_icon.update_icon() pull_icon.screen_loc = ui_drone_pull static_inventory += pull_icon @@ -20,12 +22,14 @@ using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand_position(owner,1) + using.hud = src static_inventory += using using = new /obj/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) + using.hud = src static_inventory += using if(mymob.possible_a_intents) @@ -36,16 +40,19 @@ action_intent = new /obj/screen/act_intent action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent + action_intent.hud = src static_inventory += action_intent zone_select = new /obj/screen/zone_sel() zone_select.icon = ui_style - zone_select.update_icon(mymob) + zone_select.hud = src + zone_select.update_icon() static_inventory += zone_select using = new /obj/screen/area_creator using.icon = ui_style + using.hud = src static_inventory += using mymob.client.screen = list() diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 87c590bb..549b6346 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -1,89 +1,95 @@ -/obj/screen/ghost - icon = 'icons/mob/screen_ghost.dmi' - -/obj/screen/ghost/MouseEntered() - flick(icon_state + "_anim", src) - -/obj/screen/ghost/jumptomob - name = "Jump to mob" - icon_state = "jumptomob" - -/obj/screen/ghost/jumptomob/Click() - var/mob/dead/observer/G = usr - G.jumptomob() - -/obj/screen/ghost/orbit - name = "Orbit" - icon_state = "orbit" - -/obj/screen/ghost/orbit/Click() - var/mob/dead/observer/G = usr - G.follow() - -/obj/screen/ghost/reenter_corpse - name = "Reenter corpse" - icon_state = "reenter_corpse" - -/obj/screen/ghost/reenter_corpse/Click() - var/mob/dead/observer/G = usr - G.reenter_corpse() - -/obj/screen/ghost/teleport - name = "Teleport" - icon_state = "teleport" - -/obj/screen/ghost/teleport/Click() - var/mob/dead/observer/G = usr - G.dead_tele() - -/obj/screen/ghost/pai - name = "pAI Candidate" - icon_state = "pai" - -/obj/screen/ghost/pai/Click() - var/mob/dead/observer/G = usr - G.register_pai() - -/datum/hud/ghost/New(mob/owner) - ..() - var/obj/screen/using - - using = new /obj/screen/ghost/jumptomob() - using.screen_loc = ui_ghost_jumptomob - static_inventory += using - - using = new /obj/screen/ghost/orbit() - using.screen_loc = ui_ghost_orbit - static_inventory += using - - using = new /obj/screen/ghost/reenter_corpse() - using.screen_loc = ui_ghost_reenter_corpse - static_inventory += using - - using = new /obj/screen/ghost/teleport() - using.screen_loc = ui_ghost_teleport - static_inventory += using - - using = new /obj/screen/ghost/pai() - using.screen_loc = ui_ghost_pai - static_inventory += using - - using = new /obj/screen/language_menu - using.icon = ui_style - static_inventory += using - -/datum/hud/ghost/show_hud(version = 0, mob/viewmob) - // don't show this HUD if observing; show the HUD of the observee - var/mob/dead/observer/O = mymob - if (istype(O) && O.observetarget) - plane_masters_update() - return FALSE - - . = ..() - if(!.) - return - var/mob/screenmob = viewmob || mymob - if(!screenmob.client.prefs.ghost_hud) - screenmob.client.screen -= static_inventory - else - screenmob.client.screen += static_inventory +/obj/screen/ghost + icon = 'icons/mob/screen_ghost.dmi' + +/obj/screen/ghost/MouseEntered() + flick(icon_state + "_anim", src) + +/obj/screen/ghost/jumptomob + name = "Jump to mob" + icon_state = "jumptomob" + +/obj/screen/ghost/jumptomob/Click() + var/mob/dead/observer/G = usr + G.jumptomob() + +/obj/screen/ghost/orbit + name = "Orbit" + icon_state = "orbit" + +/obj/screen/ghost/orbit/Click() + var/mob/dead/observer/G = usr + G.follow() + +/obj/screen/ghost/reenter_corpse + name = "Reenter corpse" + icon_state = "reenter_corpse" + +/obj/screen/ghost/reenter_corpse/Click() + var/mob/dead/observer/G = usr + G.reenter_corpse() + +/obj/screen/ghost/teleport + name = "Teleport" + icon_state = "teleport" + +/obj/screen/ghost/teleport/Click() + var/mob/dead/observer/G = usr + G.dead_tele() + +/obj/screen/ghost/pai + name = "pAI Candidate" + icon_state = "pai" + +/obj/screen/ghost/pai/Click() + var/mob/dead/observer/G = usr + G.register_pai() + +/datum/hud/ghost/New(mob/owner) + ..() + var/obj/screen/using + + using = new /obj/screen/ghost/jumptomob() + using.screen_loc = ui_ghost_jumptomob + using.hud = src + static_inventory += using + + using = new /obj/screen/ghost/orbit() + using.screen_loc = ui_ghost_orbit + using.hud = src + static_inventory += using + + using = new /obj/screen/ghost/reenter_corpse() + using.screen_loc = ui_ghost_reenter_corpse + using.hud = src + static_inventory += using + + using = new /obj/screen/ghost/teleport() + using.screen_loc = ui_ghost_teleport + using.hud = src + static_inventory += using + + using = new /obj/screen/ghost/pai() + using.screen_loc = ui_ghost_pai + using.hud = src + static_inventory += using + + using = new /obj/screen/language_menu + using.icon = ui_style + using.hud = src + static_inventory += using + +/datum/hud/ghost/show_hud(version = 0, mob/viewmob) + // don't show this HUD if observing; show the HUD of the observee + var/mob/dead/observer/O = mymob + if (istype(O) && O.observetarget) + plane_masters_update() + return FALSE + + . = ..() + if(!.) + return + var/mob/screenmob = viewmob || mymob + if(!screenmob.client.prefs.ghost_hud) + screenmob.client.screen -= static_inventory + else + screenmob.client.screen += static_inventory diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index a6655895..35b40ee5 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -4,26 +4,32 @@ var/obj/screen/using healths = new /obj/screen/healths/guardian() + healths.hud = src infodisplay += healths using = new /obj/screen/guardian/Manifest() using.screen_loc = ui_hand_position(2) + using.hud = src static_inventory += using using = new /obj/screen/guardian/Recall() using.screen_loc = ui_hand_position(1) + using.hud = src static_inventory += using using = new owner.toggle_button_type() using.screen_loc = ui_storage1 + using.hud = src static_inventory += using using = new /obj/screen/guardian/ToggleLight() using.screen_loc = ui_inventory + using.hud = src static_inventory += using using = new /obj/screen/guardian/Communicate() using.screen_loc = ui_back + using.hud = src static_inventory += using /datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 02e7ff06..5f233437 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -1,295 +1,298 @@ -/* - The hud datum - Used to show and hide huds for all the different mob types, - including inventories and item quick actions. -*/ - -// The default UI style is the first one in the list -GLOBAL_LIST_INIT(available_ui_styles, list( - "Midnight" = 'icons/mob/screen_midnight.dmi', - "Retro" = 'icons/mob/screen_retro.dmi', - "Plasmafire" = 'icons/mob/screen_plasmafire.dmi', - "Slimecore" = 'icons/mob/screen_slimecore.dmi', - "Operative" = 'icons/mob/screen_operative.dmi', - "Clockwork" = 'icons/mob/screen_clockwork.dmi', - "Kinaris" = 'icons/mob/screen_kinaris.dmi', -)) - -/proc/ui_style2icon(ui_style) - return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] - -/datum/hud - var/mob/mymob - - var/hud_shown = TRUE //Used for the HUD toggle (F12) - var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD - var/inventory_shown = FALSE //Equipped item inventory - var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - - var/obj/screen/ling/chems/lingchemdisplay - var/obj/screen/ling/sting/lingstingdisplay - - var/obj/screen/blobpwrdisplay - - var/obj/screen/alien_plasma_display - var/obj/screen/alien_queen_finder - - var/obj/screen/devil/soul_counter/devilsouldisplay - - var/obj/screen/action_intent - var/obj/screen/zone_select - var/obj/screen/pull_icon - var/obj/screen/rest_icon - var/obj/screen/throw_icon - var/obj/screen/module_store_icon - - var/list/static_inventory = list() //the screen objects which are static - var/list/toggleable_inventory = list() //the screen objects which can be hidden - var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys - var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) - var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) - var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. - var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object - var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object - - var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle - var/action_buttons_hidden = FALSE - - var/obj/screen/healths - var/obj/screen/healthdoll - var/obj/screen/internals - - // subtypes can override this to force a specific UI style - var/ui_style - -/datum/hud/New(mob/owner) - mymob = owner - - if (!ui_style) - // will fall back to the default if any of these are null - ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) - - hide_actions_toggle = new - hide_actions_toggle.InitialiseIcon(src) - if(mymob.client) - hide_actions_toggle.locked = mymob.client.prefs.buttons_locked - - hand_slots = list() - - for(var/mytype in subtypesof(/obj/screen/plane_master)) - var/obj/screen/plane_master/instance = new mytype() - plane_masters["[instance.plane]"] = instance - instance.backdrop(mymob) - -/datum/hud/Destroy() - if(mymob.hud_used == src) - mymob.hud_used = null - - QDEL_NULL(hide_actions_toggle) - QDEL_NULL(module_store_icon) - QDEL_LIST(static_inventory) - - inv_slots.Cut() - action_intent = null - zone_select = null - pull_icon = null - - QDEL_LIST(toggleable_inventory) - QDEL_LIST(hotkeybuttons) - throw_icon = null - QDEL_LIST(infodisplay) - - healths = null - healthdoll = null - internals = null - lingchemdisplay = null - devilsouldisplay = null - lingstingdisplay = null - blobpwrdisplay = null - alien_plasma_display = null - alien_queen_finder = null - - QDEL_LIST_ASSOC_VAL(plane_masters) - QDEL_LIST(screenoverlays) - mymob = null - - return ..() - -/mob - var/hud_type = /datum/hud - -/mob/proc/create_mob_hud() - if(!client || hud_used) - return - hud_used = new hud_type(src) - update_sight() - SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED) - -//Version denotes which style should be displayed. blank or 0 means "next version" -/datum/hud/proc/show_hud(version = 0, mob/viewmob) - if(!ismob(mymob)) - return FALSE - var/mob/screenmob = viewmob || mymob - if(!screenmob.client) - return FALSE - - screenmob.client.screen = list() - screenmob.client.apply_clickcatcher() - - var/display_hud_version = version - if(!display_hud_version) //If 0 or blank, display the next hud version - display_hud_version = hud_version + 1 - if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version - display_hud_version = 1 - - switch(display_hud_version) - if(HUD_STYLE_STANDARD) //Default HUD - hud_shown = TRUE //Governs behavior of other procs - if(static_inventory.len) - screenmob.client.screen += static_inventory - if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown) - screenmob.client.screen += toggleable_inventory - if(hotkeybuttons.len && !hotkey_ui_hidden) - screenmob.client.screen += hotkeybuttons - if(infodisplay.len) - screenmob.client.screen += infodisplay - - screenmob.client.screen += hide_actions_toggle - - if(action_intent) - action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position - - if(HUD_STYLE_REDUCED) //Reduced HUD - hud_shown = FALSE //Governs behavior of other procs - if(static_inventory.len) - screenmob.client.screen -= static_inventory - if(toggleable_inventory.len) - screenmob.client.screen -= toggleable_inventory - if(hotkeybuttons.len) - screenmob.client.screen -= hotkeybuttons - if(infodisplay.len) - screenmob.client.screen += infodisplay - - //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay - for(var/h in hand_slots) - var/obj/screen/hand = hand_slots[h] - if(hand) - screenmob.client.screen += hand - if(action_intent) - screenmob.client.screen += action_intent //we want the intent switcher visible - action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. - - if(HUD_STYLE_NOHUD) //No HUD - hud_shown = FALSE //Governs behavior of other procs - if(static_inventory.len) - screenmob.client.screen -= static_inventory - if(toggleable_inventory.len) - screenmob.client.screen -= toggleable_inventory - if(hotkeybuttons.len) - screenmob.client.screen -= hotkeybuttons - if(infodisplay.len) - screenmob.client.screen -= infodisplay - - hud_version = display_hud_version - persistent_inventory_update(screenmob) - screenmob.update_action_buttons(1) - reorganize_alerts() - screenmob.reload_fullscreen() - update_parallax_pref(screenmob) - - // ensure observers get an accurate and up-to-date view - if (!viewmob) - plane_masters_update() - for(var/M in mymob.observers) - show_hud(hud_version, M) - else if (viewmob.hud_used) - viewmob.hud_used.plane_masters_update() - - return TRUE - -/datum/hud/proc/plane_masters_update() - // Plane masters are always shown to OUR mob, never to observers - for(var/thing in plane_masters) - var/obj/screen/plane_master/PM = plane_masters[thing] - PM.backdrop(mymob) - mymob.client.screen += PM - -/datum/hud/human/show_hud(version = 0,mob/viewmob) - . = ..() - if(!.) - return - var/mob/screenmob = viewmob || mymob - hidden_inventory_update(screenmob) - -/datum/hud/robot/show_hud(version = 0, mob/viewmob) - . = ..() - if(!.) - return - update_robot_modules_display() - -/datum/hud/proc/hidden_inventory_update() - return - -/datum/hud/proc/persistent_inventory_update(mob/viewer) - if(!mymob) - return - -/datum/hud/proc/update_ui_style(new_ui_style) - // do nothing if overridden by a subtype or already on that style - if (initial(ui_style) || ui_style == new_ui_style) - return - - for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) - if (item.icon == ui_style) - item.icon = new_ui_style - - ui_style = new_ui_style - build_hand_slots() - hide_actions_toggle.InitialiseIcon(src) - -//Triggered when F12 is pressed (Unless someone changed something in the DMF) -/mob/verb/button_pressed_F12() - set name = "F12" - set hidden = TRUE - - if(hud_used && client) - hud_used.show_hud() //Shows the next hud preset - to_chat(usr, "Switched HUD mode. Press F12 to toggle.") - else - to_chat(usr, "This mob type does not use a HUD.") - - -//(re)builds the hand ui slots, throwing away old ones -//not really worth jugglying existing ones so we just scrap+rebuild -//9/10 this is only called once per mob and only for 2 hands -/datum/hud/proc/build_hand_slots() - for(var/h in hand_slots) - var/obj/screen/inventory/hand/H = hand_slots[h] - if(H) - static_inventory -= H - hand_slots = list() - var/obj/screen/inventory/hand/hand_box - for(var/i in 1 to mymob.held_items.len) - hand_box = new /obj/screen/inventory/hand() - hand_box.name = mymob.get_held_index_name(i) - hand_box.icon = ui_style - hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" - hand_box.screen_loc = ui_hand_position(i) - hand_box.held_index = i - hand_slots["[i]"] = hand_box - hand_box.hud = src - static_inventory += hand_box - hand_box.update_icon() - - var/i = 1 - for(var/obj/screen/swap_hand/SH in static_inventory) - SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) - i++ - for(var/obj/screen/human/equip/E in static_inventory) - E.screen_loc = ui_equip_position(mymob) - - if(ismob(mymob) && mymob.hud_used == src) - show_hud(hud_version) - -/datum/hud/proc/update_locked_slots() - return +/* + The hud datum + Used to show and hide huds for all the different mob types, + including inventories and item quick actions. +*/ + +// The default UI style is the first one in the list +GLOBAL_LIST_INIT(available_ui_styles, list( + "Midnight" = 'icons/mob/screen_midnight.dmi', + "Retro" = 'icons/mob/screen_retro.dmi', + "Plasmafire" = 'icons/mob/screen_plasmafire.dmi', + "Slimecore" = 'icons/mob/screen_slimecore.dmi', + "Operative" = 'icons/mob/screen_operative.dmi', + "Clockwork" = 'icons/mob/screen_clockwork.dmi', + "Kinaris" = 'icons/mob/screen_kinaris.dmi', +)) + +/proc/ui_style2icon(ui_style) + return GLOB.available_ui_styles[ui_style] || GLOB.available_ui_styles[GLOB.available_ui_styles[1]] + +/datum/hud + var/mob/mymob + + var/hud_shown = TRUE //Used for the HUD toggle (F12) + var/hud_version = HUD_STYLE_STANDARD //Current displayed version of the HUD + var/inventory_shown = FALSE //Equipped item inventory + var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) + + var/obj/screen/ling/chems/lingchemdisplay + var/obj/screen/ling/sting/lingstingdisplay + + var/obj/screen/blobpwrdisplay + + var/obj/screen/alien_plasma_display + var/obj/screen/alien_queen_finder + + var/obj/screen/devil/soul_counter/devilsouldisplay + + var/obj/screen/action_intent + var/obj/screen/zone_select + var/obj/screen/pull_icon + var/obj/screen/rest_icon + var/obj/screen/throw_icon + var/obj/screen/module_store_icon + + var/list/static_inventory = list() //the screen objects which are static + var/list/toggleable_inventory = list() //the screen objects which can be hidden + var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys + var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) + var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) + var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. + var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object + var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + + var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/action_buttons_hidden = FALSE + + var/obj/screen/healths + var/obj/screen/healthdoll + var/obj/screen/internals + + // subtypes can override this to force a specific UI style + var/ui_style + + //Citadel stuff + var/obj/screen/arousal + +/datum/hud/New(mob/owner) + mymob = owner + + if (!ui_style) + // will fall back to the default if any of these are null + ui_style = ui_style2icon(owner.client && owner.client.prefs && owner.client.prefs.UI_style) + + hide_actions_toggle = new + hide_actions_toggle.InitialiseIcon(src) + if(mymob.client) + hide_actions_toggle.locked = mymob.client.prefs.buttons_locked + + hand_slots = list() + + for(var/mytype in subtypesof(/obj/screen/plane_master)) + var/obj/screen/plane_master/instance = new mytype() + plane_masters["[instance.plane]"] = instance + instance.backdrop(mymob) + +/datum/hud/Destroy() + if(mymob.hud_used == src) + mymob.hud_used = null + + QDEL_NULL(hide_actions_toggle) + QDEL_NULL(module_store_icon) + QDEL_LIST(static_inventory) + + inv_slots.Cut() + action_intent = null + zone_select = null + pull_icon = null + + QDEL_LIST(toggleable_inventory) + QDEL_LIST(hotkeybuttons) + throw_icon = null + QDEL_LIST(infodisplay) + + healths = null + healthdoll = null + internals = null + lingchemdisplay = null + devilsouldisplay = null + lingstingdisplay = null + blobpwrdisplay = null + alien_plasma_display = null + alien_queen_finder = null + + QDEL_LIST_ASSOC_VAL(plane_masters) + QDEL_LIST(screenoverlays) + mymob = null + + return ..() + +/mob + var/hud_type = /datum/hud + +/mob/proc/create_mob_hud() + if(!client || hud_used) + return + hud_used = new hud_type(src) + update_sight() + SEND_SIGNAL(src, COMSIG_MOB_HUD_CREATED) + +//Version denotes which style should be displayed. blank or 0 means "next version" +/datum/hud/proc/show_hud(version = 0, mob/viewmob) + if(!ismob(mymob)) + return FALSE + var/mob/screenmob = viewmob || mymob + if(!screenmob.client) + return FALSE + + screenmob.client.screen = list() + screenmob.client.apply_clickcatcher() + + var/display_hud_version = version + if(!display_hud_version) //If 0 or blank, display the next hud version + display_hud_version = hud_version + 1 + if(display_hud_version > HUD_VERSIONS) //If the requested version number is greater than the available versions, reset back to the first version + display_hud_version = 1 + + switch(display_hud_version) + if(HUD_STYLE_STANDARD) //Default HUD + hud_shown = TRUE //Governs behavior of other procs + if(static_inventory.len) + screenmob.client.screen += static_inventory + if(toggleable_inventory.len && screenmob.hud_used && screenmob.hud_used.inventory_shown) + screenmob.client.screen += toggleable_inventory + if(hotkeybuttons.len && !hotkey_ui_hidden) + screenmob.client.screen += hotkeybuttons + if(infodisplay.len) + screenmob.client.screen += infodisplay + + screenmob.client.screen += hide_actions_toggle + + if(action_intent) + action_intent.screen_loc = initial(action_intent.screen_loc) //Restore intent selection to the original position + + if(HUD_STYLE_REDUCED) //Reduced HUD + hud_shown = FALSE //Governs behavior of other procs + if(static_inventory.len) + screenmob.client.screen -= static_inventory + if(toggleable_inventory.len) + screenmob.client.screen -= toggleable_inventory + if(hotkeybuttons.len) + screenmob.client.screen -= hotkeybuttons + if(infodisplay.len) + screenmob.client.screen += infodisplay + + //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay + for(var/h in hand_slots) + var/obj/screen/hand = hand_slots[h] + if(hand) + screenmob.client.screen += hand + if(action_intent) + screenmob.client.screen += action_intent //we want the intent switcher visible + action_intent.screen_loc = ui_acti_alt //move this to the alternative position, where zone_select usually is. + + if(HUD_STYLE_NOHUD) //No HUD + hud_shown = FALSE //Governs behavior of other procs + if(static_inventory.len) + screenmob.client.screen -= static_inventory + if(toggleable_inventory.len) + screenmob.client.screen -= toggleable_inventory + if(hotkeybuttons.len) + screenmob.client.screen -= hotkeybuttons + if(infodisplay.len) + screenmob.client.screen -= infodisplay + + hud_version = display_hud_version + persistent_inventory_update(screenmob) + screenmob.update_action_buttons(1) + reorganize_alerts() + screenmob.reload_fullscreen() + update_parallax_pref(screenmob) + + // ensure observers get an accurate and up-to-date view + if (!viewmob) + plane_masters_update() + for(var/M in mymob.observers) + show_hud(hud_version, M) + else if (viewmob.hud_used) + viewmob.hud_used.plane_masters_update() + + return TRUE + +/datum/hud/proc/plane_masters_update() + // Plane masters are always shown to OUR mob, never to observers + for(var/thing in plane_masters) + var/obj/screen/plane_master/PM = plane_masters[thing] + PM.backdrop(mymob) + mymob.client.screen += PM + +/datum/hud/human/show_hud(version = 0,mob/viewmob) + . = ..() + if(!.) + return + var/mob/screenmob = viewmob || mymob + hidden_inventory_update(screenmob) + +/datum/hud/robot/show_hud(version = 0, mob/viewmob) + . = ..() + if(!.) + return + update_robot_modules_display() + +/datum/hud/proc/hidden_inventory_update() + return + +/datum/hud/proc/persistent_inventory_update(mob/viewer) + if(!mymob) + return + +/datum/hud/proc/update_ui_style(new_ui_style) + // do nothing if overridden by a subtype or already on that style + if (initial(ui_style) || ui_style == new_ui_style) + return + + for(var/atom/item in static_inventory + toggleable_inventory + hotkeybuttons + infodisplay + screenoverlays + inv_slots) + if (item.icon == ui_style) + item.icon = new_ui_style + + ui_style = new_ui_style + build_hand_slots() + hide_actions_toggle.InitialiseIcon(src) + +//Triggered when F12 is pressed (Unless someone changed something in the DMF) +/mob/verb/button_pressed_F12() + set name = "F12" + set hidden = TRUE + + if(hud_used && client) + hud_used.show_hud() //Shows the next hud preset + to_chat(usr, "Switched HUD mode. Press F12 to toggle.") + else + to_chat(usr, "This mob type does not use a HUD.") + + +//(re)builds the hand ui slots, throwing away old ones +//not really worth jugglying existing ones so we just scrap+rebuild +//9/10 this is only called once per mob and only for 2 hands +/datum/hud/proc/build_hand_slots() + for(var/h in hand_slots) + var/obj/screen/inventory/hand/H = hand_slots[h] + if(H) + static_inventory -= H + hand_slots = list() + var/obj/screen/inventory/hand/hand_box + for(var/i in 1 to mymob.held_items.len) + hand_box = new /obj/screen/inventory/hand() + hand_box.name = mymob.get_held_index_name(i) + hand_box.icon = ui_style + hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" + hand_box.screen_loc = ui_hand_position(i) + hand_box.held_index = i + hand_slots["[i]"] = hand_box + hand_box.hud = src + static_inventory += hand_box + hand_box.update_icon() + + var/i = 1 + for(var/obj/screen/swap_hand/SH in static_inventory) + SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) + i++ + for(var/obj/screen/human/equip/E in static_inventory) + E.screen_loc = ui_equip_position(mymob) + + if(ismob(mymob) && mymob.hud_used == src) + show_hud(hud_version) + +/datum/hud/proc/update_locked_slots() + return diff --git a/code/_onclick/hud/hud_cit.dm b/code/_onclick/hud/hud_cit.dm deleted file mode 100644 index 18ecf2e9..00000000 --- a/code/_onclick/hud/hud_cit.dm +++ /dev/null @@ -1,2 +0,0 @@ -/datum/hud - var/obj/screen/arousal \ No newline at end of file diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 79c7651f..e54ede38 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,490 +1,519 @@ -/obj/screen/human - icon = 'icons/mob/screen_midnight.dmi' - -/obj/screen/human/toggle - name = "toggle" - icon_state = "toggle" - -/obj/screen/human/toggle/Click() - - var/mob/targetmob = usr - - if(isobserver(usr)) - if(ishuman(usr.client.eye) && (usr.client.eye != usr)) - var/mob/M = usr.client.eye - targetmob = M - - if(usr.hud_used.inventory_shown && targetmob.hud_used) - usr.hud_used.inventory_shown = FALSE - usr.client.screen -= targetmob.hud_used.toggleable_inventory - else - usr.hud_used.inventory_shown = TRUE - usr.client.screen += targetmob.hud_used.toggleable_inventory - - targetmob.hud_used.hidden_inventory_update(usr) - -/obj/screen/human/equip - name = "equip" - icon_state = "act_equip" - -/obj/screen/human/equip/Click() - if(ismecha(usr.loc)) // stops inventory actions in a mech - return 1 - var/mob/living/carbon/human/H = usr - H.quick_equip() - -/obj/screen/devil - invisibility = INVISIBILITY_ABSTRACT - -/obj/screen/devil/soul_counter - icon = 'icons/mob/screen_gen.dmi' - name = "souls owned" - icon_state = "Devil-6" - screen_loc = ui_devilsouldisplay - -/obj/screen/devil/soul_counter/proc/update_counter(souls = 0) - invisibility = 0 - maptext = "
                  [souls]
                  " - switch(souls) - if(0,null) - icon_state = "Devil-1" - if(1,2) - icon_state = "Devil-2" - if(3 to 5) - icon_state = "Devil-3" - if(6 to 8) - icon_state = "Devil-4" - if(9 to INFINITY) - icon_state = "Devil-5" - else - icon_state = "Devil-6" - -/obj/screen/devil/soul_counter/proc/clear() - invisibility = INVISIBILITY_ABSTRACT - -/obj/screen/ling - invisibility = INVISIBILITY_ABSTRACT - -/obj/screen/ling/sting - name = "current sting" - screen_loc = ui_lingstingdisplay - -/obj/screen/ling/sting/Click() - if(isobserver(usr)) - return - var/mob/living/carbon/U = usr - U.unset_sting() - -/obj/screen/ling/chems - name = "chemical storage" - icon_state = "power_display" - screen_loc = ui_lingchemdisplay - -/datum/hud/human/New(mob/living/carbon/human/owner) - ..() - owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) - - var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref - if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto - widescreenlayout = FALSE // CIT CHANGE - ditto - - var/obj/screen/using - var/obj/screen/inventory/inv_box - - using = new/obj/screen/language_menu - using.icon = ui_style - if(!widescreenlayout) // CIT CHANGE - using.screen_loc = ui_boxlang // CIT CHANGE - static_inventory += using - - using = new /obj/screen/area_creator - using.icon = ui_style - if(!widescreenlayout) // CIT CHANGE - using.screen_loc = ui_boxarea // CIT CHANGE - static_inventory += using - - using = new /obj/screen/voretoggle() //We fancy Vore now - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.screen_loc = ui_voremode - if(!widescreenlayout) - using.screen_loc = ui_boxvore - static_inventory += using - - action_intent = new /obj/screen/act_intent/segmented - action_intent.icon_state = mymob.a_intent - static_inventory += action_intent - - using = new /obj/screen/mov_intent - using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon - using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") - using.screen_loc = ui_movi - static_inventory += using - -/* //CITADEL CHANGES - sprint button - using = new /obj/screen/sprintbutton - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint") - using.screen_loc = ui_movi - static_inventory += using - //END OF CITADEL CHANGES - - //same as above but buffer. - using = new /obj/screen/sprint_buffer - using.screen_loc = ui_sprintbufferloc - sprint_buffer = using - static_inventory += using -*/ - - using = new /obj/screen/drop() - using.icon = ui_style - using.screen_loc = ui_drop_throw - static_inventory += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "i_clothing" - inv_box.icon = ui_style - inv_box.slot_id = SLOT_W_UNIFORM - inv_box.icon_state = "uniform" - inv_box.screen_loc = ui_iclothing - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "o_clothing" - inv_box.icon = ui_style - inv_box.slot_id = SLOT_WEAR_SUIT - inv_box.icon_state = "suit" - inv_box.screen_loc = ui_oclothing - toggleable_inventory += inv_box - - build_hand_slots() - - using = new /obj/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_1" - using.screen_loc = ui_swaphand_position(owner,1) - static_inventory += using - - using = new /obj/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand_position(owner,2) - static_inventory += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "id" - inv_box.icon = ui_style - inv_box.icon_state = "id" - inv_box.screen_loc = ui_id - inv_box.slot_id = SLOT_WEAR_ID - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.icon = ui_style - inv_box.icon_state = "mask" - inv_box.screen_loc = ui_mask - inv_box.slot_id = SLOT_WEAR_MASK - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "neck" - inv_box.icon = ui_style - inv_box.icon_state = "neck" - inv_box.screen_loc = ui_neck - inv_box.slot_id = SLOT_NECK - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.icon = ui_style - inv_box.icon_state = "back" - inv_box.screen_loc = ui_back - inv_box.slot_id = SLOT_BACK - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage1" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage1 - inv_box.slot_id = SLOT_L_STORE - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "storage2" - inv_box.icon = ui_style - inv_box.icon_state = "pocket" - inv_box.screen_loc = ui_storage2 - inv_box.slot_id = SLOT_R_STORE - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "suit storage" - inv_box.icon = ui_style - inv_box.icon_state = "suit_storage" - inv_box.screen_loc = ui_sstore1 - inv_box.slot_id = SLOT_S_STORE - static_inventory += inv_box - - using = new /obj/screen/resist() - using.icon = ui_style - using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist - hotkeybuttons += using - - //CIT CHANGES - rest and combat mode buttons - using = new /obj/screen/restbutton() - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.screen_loc = ui_pull_resist - static_inventory += using - - using = new /obj/screen/combattoggle() - using.icon = tg_ui_icon_to_cit_ui(ui_style) - using.screen_loc = ui_combat_toggle - static_inventory += using - //END OF CIT CHANGES - - using = new /obj/screen/human/toggle() - using.icon = ui_style - using.screen_loc = ui_inventory - static_inventory += using - - using = new /obj/screen/human/equip() - using.icon = ui_style - using.screen_loc = ui_equip_position(mymob) - static_inventory += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "gloves" - inv_box.icon = ui_style - inv_box.icon_state = "gloves" - inv_box.screen_loc = ui_gloves - inv_box.slot_id = SLOT_GLOVES - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "eyes" - inv_box.icon = ui_style - inv_box.icon_state = "glasses" - inv_box.screen_loc = ui_glasses - inv_box.slot_id = SLOT_GLASSES - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "ears" - inv_box.icon = ui_style - inv_box.icon_state = "ears" - inv_box.screen_loc = ui_ears - inv_box.slot_id = SLOT_EARS - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = ui_style - inv_box.icon_state = "head" - inv_box.screen_loc = ui_head - inv_box.slot_id = SLOT_HEAD - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "shoes" - inv_box.icon = ui_style - inv_box.icon_state = "shoes" - inv_box.screen_loc = ui_shoes - inv_box.slot_id = SLOT_SHOES - toggleable_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "belt" - inv_box.icon = ui_style - inv_box.icon_state = "belt" -// inv_box.icon_full = "template_small" - inv_box.screen_loc = ui_belt - inv_box.slot_id = SLOT_BELT - static_inventory += inv_box - - throw_icon = new /obj/screen/throw_catch() - throw_icon.icon = ui_style - throw_icon.screen_loc = ui_drop_throw - hotkeybuttons += throw_icon - - internals = new /obj/screen/internals() - infodisplay += internals - - healths = new /obj/screen/healths() - infodisplay += healths - //CIT CHANGE - adds arousal and stamina to hud - arousal = new /obj/screen/arousal() - arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "") - infodisplay += arousal - -// staminas = new /obj/screen/staminas() -// infodisplay += staminas - -// if(!CONFIG_GET(flag/disable_stambuffer)) -// staminabuffer = new /obj/screen/staminabuffer() -// infodisplay += staminabuffer - //END OF CIT CHANGES - - healthdoll = new /obj/screen/healthdoll() - infodisplay += healthdoll - - pull_icon = new /obj/screen/pull() - pull_icon.icon = ui_style - pull_icon.update_icon(mymob) - pull_icon.screen_loc = ui_pull_resist - static_inventory += pull_icon - - lingchemdisplay = new /obj/screen/ling/chems() - infodisplay += lingchemdisplay - - lingstingdisplay = new /obj/screen/ling/sting() - infodisplay += lingstingdisplay - - devilsouldisplay = new /obj/screen/devil/soul_counter - infodisplay += devilsouldisplay - - blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume - infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank - infodisplay += vamprank_display - sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight - infodisplay += sunlight_display - - zone_select = new /obj/screen/zone_sel() - zone_select.icon = ui_style - zone_select.update_icon(mymob) - static_inventory += zone_select - - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) - if(inv.slot_id) - inv.hud = src - inv_slots[inv.slot_id] = inv - inv.update_icon() - - update_locked_slots() - -/datum/hud/human/update_locked_slots() - if(!mymob) - return - var/mob/living/carbon/human/H = mymob - if(!istype(H) || !H.dna.species) - return - var/datum/species/S = H.dna.species - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) - if(inv.slot_id) - if(inv.slot_id in S.no_equip) - inv.alpha = 128 - else - inv.alpha = initial(inv.alpha) - -/datum/hud/human/hidden_inventory_update(mob/viewer) - if(!mymob) - return - var/mob/living/carbon/human/H = mymob - - var/mob/screenmob = viewer || H - - if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown) - if(H.shoes) - H.shoes.screen_loc = ui_shoes - screenmob.client.screen += H.shoes - if(H.gloves) - H.gloves.screen_loc = ui_gloves - screenmob.client.screen += H.gloves - if(H.ears) - H.ears.screen_loc = ui_ears - screenmob.client.screen += H.ears - if(H.glasses) - H.glasses.screen_loc = ui_glasses - screenmob.client.screen += H.glasses - if(H.w_uniform) - H.w_uniform.screen_loc = ui_iclothing - screenmob.client.screen += H.w_uniform - if(H.wear_suit) - H.wear_suit.screen_loc = ui_oclothing - screenmob.client.screen += H.wear_suit - if(H.wear_mask) - H.wear_mask.screen_loc = ui_mask - screenmob.client.screen += H.wear_mask - if(H.wear_neck) - H.wear_neck.screen_loc = ui_neck - screenmob.client.screen += H.wear_neck - if(H.head) - H.head.screen_loc = ui_head - screenmob.client.screen += H.head - else - if(H.shoes) screenmob.client.screen -= H.shoes - if(H.gloves) screenmob.client.screen -= H.gloves - if(H.ears) screenmob.client.screen -= H.ears - if(H.glasses) screenmob.client.screen -= H.glasses - if(H.w_uniform) screenmob.client.screen -= H.w_uniform - if(H.wear_suit) screenmob.client.screen -= H.wear_suit - if(H.wear_mask) screenmob.client.screen -= H.wear_mask - if(H.wear_neck) screenmob.client.screen -= H.wear_neck - if(H.head) screenmob.client.screen -= H.head - - - -/datum/hud/human/persistent_inventory_update(mob/viewer) - if(!mymob) - return - ..() - var/mob/living/carbon/human/H = mymob - - var/mob/screenmob = viewer || H - - if(screenmob.hud_used) - if(screenmob.hud_used.hud_shown) - if(H.s_store) - H.s_store.screen_loc = ui_sstore1 - screenmob.client.screen += H.s_store - if(H.wear_id) - H.wear_id.screen_loc = ui_id - screenmob.client.screen += H.wear_id - if(H.belt) - H.belt.screen_loc = ui_belt - screenmob.client.screen += H.belt - if(H.back) - H.back.screen_loc = ui_back - screenmob.client.screen += H.back - if(H.l_store) - H.l_store.screen_loc = ui_storage1 - screenmob.client.screen += H.l_store - if(H.r_store) - H.r_store.screen_loc = ui_storage2 - screenmob.client.screen += H.r_store - else - if(H.s_store) - screenmob.client.screen -= H.s_store - if(H.wear_id) - screenmob.client.screen -= H.wear_id - if(H.belt) - screenmob.client.screen -= H.belt - if(H.back) - screenmob.client.screen -= H.back - if(H.l_store) - screenmob.client.screen -= H.l_store - if(H.r_store) - screenmob.client.screen -= H.r_store - - if(hud_version != HUD_STYLE_NOHUD) - for(var/obj/item/I in H.held_items) - I.screen_loc = ui_hand_position(H.get_held_index_of_item(I)) - screenmob.client.screen += I - else - for(var/obj/item/I in H.held_items) - I.screen_loc = null - screenmob.client.screen -= I - - -/mob/living/carbon/human/verb/toggle_hotkey_verbs() - set category = "OOC" - set name = "Toggle hotkey buttons" - set desc = "This disables or enables the user interface buttons which can be used with hotkeys." - - if(hud_used.hotkey_ui_hidden) - client.screen += hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = FALSE - else - client.screen -= hud_used.hotkeybuttons - hud_used.hotkey_ui_hidden = TRUE +/obj/screen/human + icon = 'icons/mob/screen_midnight.dmi' + +/obj/screen/human/toggle + name = "toggle" + icon_state = "toggle" + +/obj/screen/human/toggle/Click() + + var/mob/targetmob = usr + + if(isobserver(usr)) + if(ishuman(usr.client.eye) && (usr.client.eye != usr)) + var/mob/M = usr.client.eye + targetmob = M + + if(usr.hud_used.inventory_shown && targetmob.hud_used) + usr.hud_used.inventory_shown = FALSE + usr.client.screen -= targetmob.hud_used.toggleable_inventory + else + usr.hud_used.inventory_shown = TRUE + usr.client.screen += targetmob.hud_used.toggleable_inventory + + targetmob.hud_used.hidden_inventory_update(usr) + +/obj/screen/human/equip + name = "equip" + icon_state = "act_equip" + +/obj/screen/human/equip/Click() + if(ismecha(usr.loc)) // stops inventory actions in a mech + return 1 + var/mob/living/carbon/human/H = usr + H.quick_equip() + +/obj/screen/devil + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/devil/soul_counter + icon = 'icons/mob/screen_gen.dmi' + name = "souls owned" + icon_state = "Devil-6" + screen_loc = ui_devilsouldisplay + +/obj/screen/devil/soul_counter/proc/update_counter(souls = 0) + invisibility = 0 + maptext = "
                  [souls]
                  " + switch(souls) + if(0,null) + icon_state = "Devil-1" + if(1,2) + icon_state = "Devil-2" + if(3 to 5) + icon_state = "Devil-3" + if(6 to 8) + icon_state = "Devil-4" + if(9 to INFINITY) + icon_state = "Devil-5" + else + icon_state = "Devil-6" + +/obj/screen/devil/soul_counter/proc/clear() + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/ling + invisibility = INVISIBILITY_ABSTRACT + +/obj/screen/ling/sting + name = "current sting" + screen_loc = ui_lingstingdisplay + +/obj/screen/ling/sting/Click() + if(isobserver(usr)) + return + var/mob/living/carbon/U = usr + U.unset_sting() + +/obj/screen/ling/chems + name = "chemical storage" + icon_state = "power_display" + screen_loc = ui_lingchemdisplay + +/datum/hud/human/New(mob/living/carbon/human/owner) + ..() + owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + + var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref + if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto + widescreenlayout = FALSE // CIT CHANGE - ditto + + var/obj/screen/using + var/obj/screen/inventory/inv_box + + using = new/obj/screen/language_menu + using.icon = ui_style + if(!widescreenlayout) // CIT CHANGE + using.screen_loc = ui_boxlang // CIT CHANGE + using.hud = src + static_inventory += using + + using = new /obj/screen/area_creator + using.icon = ui_style + if(!widescreenlayout) // CIT CHANGE + using.screen_loc = ui_boxarea // CIT CHANGE + using.hud = src + static_inventory += using + + using = new /obj/screen/voretoggle() //We fancy Vore now + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_voremode + if(!widescreenlayout) + using.screen_loc = ui_boxvore + using.hud = src + static_inventory += using + + action_intent = new /obj/screen/act_intent/segmented + action_intent.icon_state = mymob.a_intent + action_intent.hud = src + static_inventory += action_intent + + using = new /obj/screen/mov_intent + using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") + using.screen_loc = ui_movi + using.hud = src + static_inventory += using + +/* //CITADEL CHANGES - sprint button + using = new /obj/screen/sprintbutton + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.icon_state = (owner.sprinting ? "act_sprint_on" : "act_sprint") + using.screen_loc = ui_movi + using.hud = src + static_inventory += using + //END OF CITADEL CHANGES + + //same as above but buffer. + using = new /obj/screen/sprint_buffer + using.screen_loc = ui_sprintbufferloc + sprint_buffer = using + static_inventory += using +*/ + + using = new /obj/screen/drop() + using.icon = ui_style + using.screen_loc = ui_drop_throw + using.hud = src + static_inventory += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "i_clothing" + inv_box.icon = ui_style + inv_box.slot_id = SLOT_W_UNIFORM + inv_box.icon_state = "uniform" + inv_box.screen_loc = ui_iclothing + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "o_clothing" + inv_box.icon = ui_style + inv_box.slot_id = SLOT_WEAR_SUIT + inv_box.icon_state = "suit" + inv_box.screen_loc = ui_oclothing + toggleable_inventory += inv_box + + build_hand_slots() + + using = new /obj/screen/swap_hand() + using.icon = ui_style + using.icon_state = "swap_1" + using.screen_loc = ui_swaphand_position(owner,1) + using.hud = src + static_inventory += using + + using = new /obj/screen/swap_hand() + using.icon = ui_style + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand_position(owner,2) + using.hud = src + static_inventory += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "id" + inv_box.icon = ui_style + inv_box.icon_state = "id" + inv_box.screen_loc = ui_id + inv_box.slot_id = SLOT_WEAR_ID + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "mask" + inv_box.icon = ui_style + inv_box.icon_state = "mask" + inv_box.screen_loc = ui_mask + inv_box.slot_id = SLOT_WEAR_MASK + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "neck" + inv_box.icon = ui_style + inv_box.icon_state = "neck" + inv_box.screen_loc = ui_neck + inv_box.slot_id = SLOT_NECK + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "back" + inv_box.icon = ui_style + inv_box.icon_state = "back" + inv_box.screen_loc = ui_back + inv_box.slot_id = SLOT_BACK + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage1" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage1 + inv_box.slot_id = SLOT_L_STORE + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "storage2" + inv_box.icon = ui_style + inv_box.icon_state = "pocket" + inv_box.screen_loc = ui_storage2 + inv_box.slot_id = SLOT_R_STORE + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "suit storage" + inv_box.icon = ui_style + inv_box.icon_state = "suit_storage" + inv_box.screen_loc = ui_sstore1 + inv_box.slot_id = SLOT_S_STORE + static_inventory += inv_box + + using = new /obj/screen/resist() + using.icon = ui_style + using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist + using.hud = src + hotkeybuttons += using + + //CIT CHANGES - rest and combat mode buttons + using = new /obj/screen/restbutton() + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_pull_resist + using.hud = src + static_inventory += using + + using = new /obj/screen/combattoggle() + using.icon = tg_ui_icon_to_cit_ui(ui_style) + using.screen_loc = ui_combat_toggle + using.hud = src + static_inventory += using + //END OF CIT CHANGES + + using = new /obj/screen/human/toggle() + using.icon = ui_style + using.screen_loc = ui_inventory + using.hud = src + static_inventory += using + + using = new /obj/screen/human/equip() + using.icon = ui_style + using.screen_loc = ui_equip_position(mymob) + using.hud = src + static_inventory += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "gloves" + inv_box.icon = ui_style + inv_box.icon_state = "gloves" + inv_box.screen_loc = ui_gloves + inv_box.slot_id = SLOT_GLOVES + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "eyes" + inv_box.icon = ui_style + inv_box.icon_state = "glasses" + inv_box.screen_loc = ui_glasses + inv_box.slot_id = SLOT_GLASSES + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "ears" + inv_box.icon = ui_style + inv_box.icon_state = "ears" + inv_box.screen_loc = ui_ears + inv_box.slot_id = SLOT_EARS + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "head" + inv_box.icon = ui_style + inv_box.icon_state = "head" + inv_box.screen_loc = ui_head + inv_box.slot_id = SLOT_HEAD + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "shoes" + inv_box.icon = ui_style + inv_box.icon_state = "shoes" + inv_box.screen_loc = ui_shoes + inv_box.slot_id = SLOT_SHOES + toggleable_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "belt" + inv_box.icon = ui_style + inv_box.icon_state = "belt" +// inv_box.icon_full = "template_small" + inv_box.screen_loc = ui_belt + inv_box.slot_id = SLOT_BELT + static_inventory += inv_box + + throw_icon = new /obj/screen/throw_catch() + throw_icon.icon = ui_style + throw_icon.screen_loc = ui_drop_throw + throw_icon.hud = src + hotkeybuttons += throw_icon + + internals = new /obj/screen/internals() + internals.hud = src + infodisplay += internals + + healths = new /obj/screen/healths() + healths.hud = src + infodisplay += healths + //CIT CHANGE - adds arousal and stamina to hud + arousal = new /obj/screen/arousal() + arousal.icon_state = (owner.canbearoused == 1 ? "arousal0" : "") + arousal.hud = src + infodisplay += arousal + +// staminas = new /obj/screen/staminas() +// infodisplay += staminas + +// if(!CONFIG_GET(flag/disable_stambuffer)) +// staminabuffer = new /obj/screen/staminabuffer() +// infodisplay += staminabuffer + //END OF CIT CHANGES + + healthdoll = new /obj/screen/healthdoll() + healthdoll.hud = src + infodisplay += healthdoll + + pull_icon = new /obj/screen/pull() + pull_icon.icon = ui_style + pull_icon.hud = src + pull_icon.update_icon() + pull_icon.screen_loc = ui_pull_resist + static_inventory += pull_icon + + lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay.hud = src + infodisplay += lingchemdisplay + + lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay.hud = src + infodisplay += lingstingdisplay + + devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay.hud = src + infodisplay += devilsouldisplay + + blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume + blood_display.hud = src + infodisplay += blood_display + + vamprank_display = new /obj/screen/bloodsucker/rank_counter // Vampire Rank + vamprank_display.hud = src + infodisplay += vamprank_display + + sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight + sunlight_display.hud = src + infodisplay += sunlight_display + + zone_select = new /obj/screen/zone_sel() + zone_select.icon = ui_style + zone_select.hud = src + zone_select.update_icon() + static_inventory += zone_select + + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + if(inv.slot_id) + inv.hud = src + inv_slots[inv.slot_id] = inv + inv.update_icon() + + update_locked_slots() + +/datum/hud/human/update_locked_slots() + if(!mymob) + return + var/mob/living/carbon/human/H = mymob + if(!istype(H) || !H.dna.species) + return + var/datum/species/S = H.dna.species + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + if(inv.slot_id) + if(inv.slot_id in S.no_equip) + inv.alpha = 128 + else + inv.alpha = initial(inv.alpha) + +/datum/hud/human/hidden_inventory_update(mob/viewer) + if(!mymob) + return + var/mob/living/carbon/human/H = mymob + + var/mob/screenmob = viewer || H + + if(screenmob.hud_used.inventory_shown && screenmob.hud_used.hud_shown) + if(H.shoes) + H.shoes.screen_loc = ui_shoes + screenmob.client.screen += H.shoes + if(H.gloves) + H.gloves.screen_loc = ui_gloves + screenmob.client.screen += H.gloves + if(H.ears) + H.ears.screen_loc = ui_ears + screenmob.client.screen += H.ears + if(H.glasses) + H.glasses.screen_loc = ui_glasses + screenmob.client.screen += H.glasses + if(H.w_uniform) + H.w_uniform.screen_loc = ui_iclothing + screenmob.client.screen += H.w_uniform + if(H.wear_suit) + H.wear_suit.screen_loc = ui_oclothing + screenmob.client.screen += H.wear_suit + if(H.wear_mask) + H.wear_mask.screen_loc = ui_mask + screenmob.client.screen += H.wear_mask + if(H.wear_neck) + H.wear_neck.screen_loc = ui_neck + screenmob.client.screen += H.wear_neck + if(H.head) + H.head.screen_loc = ui_head + screenmob.client.screen += H.head + else + if(H.shoes) screenmob.client.screen -= H.shoes + if(H.gloves) screenmob.client.screen -= H.gloves + if(H.ears) screenmob.client.screen -= H.ears + if(H.glasses) screenmob.client.screen -= H.glasses + if(H.w_uniform) screenmob.client.screen -= H.w_uniform + if(H.wear_suit) screenmob.client.screen -= H.wear_suit + if(H.wear_mask) screenmob.client.screen -= H.wear_mask + if(H.wear_neck) screenmob.client.screen -= H.wear_neck + if(H.head) screenmob.client.screen -= H.head + + + +/datum/hud/human/persistent_inventory_update(mob/viewer) + if(!mymob) + return + ..() + var/mob/living/carbon/human/H = mymob + + var/mob/screenmob = viewer || H + + if(screenmob.hud_used) + if(screenmob.hud_used.hud_shown) + if(H.s_store) + H.s_store.screen_loc = ui_sstore1 + screenmob.client.screen += H.s_store + if(H.wear_id) + H.wear_id.screen_loc = ui_id + screenmob.client.screen += H.wear_id + if(H.belt) + H.belt.screen_loc = ui_belt + screenmob.client.screen += H.belt + if(H.back) + H.back.screen_loc = ui_back + screenmob.client.screen += H.back + if(H.l_store) + H.l_store.screen_loc = ui_storage1 + screenmob.client.screen += H.l_store + if(H.r_store) + H.r_store.screen_loc = ui_storage2 + screenmob.client.screen += H.r_store + else + if(H.s_store) + screenmob.client.screen -= H.s_store + if(H.wear_id) + screenmob.client.screen -= H.wear_id + if(H.belt) + screenmob.client.screen -= H.belt + if(H.back) + screenmob.client.screen -= H.back + if(H.l_store) + screenmob.client.screen -= H.l_store + if(H.r_store) + screenmob.client.screen -= H.r_store + + if(hud_version != HUD_STYLE_NOHUD) + for(var/obj/item/I in H.held_items) + I.screen_loc = ui_hand_position(H.get_held_index_of_item(I)) + screenmob.client.screen += I + else + for(var/obj/item/I in H.held_items) + I.screen_loc = null + screenmob.client.screen -= I + + +/mob/living/carbon/human/verb/toggle_hotkey_verbs() + set category = "OOC" + set name = "Toggle hotkey buttons" + set desc = "This disables or enables the user interface buttons which can be used with hotkeys." + + if(hud_used.hotkey_ui_hidden) + client.screen += hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = FALSE + else + client.screen -= hud_used.hotkeybuttons + hud_used.hotkey_ui_hidden = TRUE diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm new file mode 100644 index 00000000..a36d9a0f --- /dev/null +++ b/code/_onclick/hud/lavaland_elite.dm @@ -0,0 +1,16 @@ +/datum/hud/lavaland_elite + ui_style = 'icons/mob/screen_elite.dmi' + +/datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) + ..() + + pull_icon = new /obj/screen/pull() + pull_icon.icon = ui_style + pull_icon.hud = src + pull_icon.update_icon() + pull_icon.screen_loc = ui_living_pull + static_inventory += pull_icon + + healths = new /obj/screen/healths/lavaland_elite() + healths.hud = src + infodisplay += healths diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index 454f762f..3d3c3cf6 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -1,151 +1,165 @@ -/datum/hud/monkey/New(mob/living/carbon/monkey/owner) - ..() - var/obj/screen/using - var/obj/screen/inventory/inv_box - - action_intent = new /obj/screen/act_intent() - action_intent.icon = ui_style - action_intent.icon_state = mymob.a_intent - action_intent.screen_loc = ui_acti - static_inventory += action_intent - - using = new /obj/screen/mov_intent() - using.icon = ui_style - using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") - using.screen_loc = ui_movi - static_inventory += using - - using = new/obj/screen/language_menu - using.icon = ui_style - static_inventory += using - - using = new /obj/screen/drop() - using.icon = ui_style - using.screen_loc = ui_drop_throw - static_inventory += using - - build_hand_slots() - - using = new /obj/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_1_m" //extra wide! - using.screen_loc = ui_swaphand_position(owner,1) - static_inventory += using - - using = new /obj/screen/swap_hand() - using.icon = ui_style - using.icon_state = "swap_2" - using.screen_loc = ui_swaphand_position(owner,2) - static_inventory += using - - inv_box = new /obj/screen/inventory() - inv_box.name = "mask" - inv_box.icon = ui_style - inv_box.icon_state = "mask" -// inv_box.icon_full = "template" - inv_box.screen_loc = ui_monkey_mask - inv_box.slot_id = SLOT_WEAR_MASK - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "neck" - inv_box.icon = ui_style - inv_box.icon_state = "neck" -// inv_box.icon_full = "template" - inv_box.screen_loc = ui_monkey_neck - inv_box.slot_id = SLOT_NECK - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "head" - inv_box.icon = ui_style - inv_box.icon_state = "head" -// inv_box.icon_full = "template" - inv_box.screen_loc = ui_monkey_head - inv_box.slot_id = SLOT_HEAD - static_inventory += inv_box - - inv_box = new /obj/screen/inventory() - inv_box.name = "back" - inv_box.icon = ui_style - inv_box.icon_state = "back" - inv_box.screen_loc = ui_monkey_back - inv_box.slot_id = SLOT_BACK - static_inventory += inv_box - - throw_icon = new /obj/screen/throw_catch() - throw_icon.icon = ui_style - throw_icon.screen_loc = ui_drop_throw - hotkeybuttons += throw_icon - - internals = new /obj/screen/internals() - infodisplay += internals - - healths = new /obj/screen/healths() - infodisplay += healths - - pull_icon = new /obj/screen/pull() - pull_icon.icon = ui_style - pull_icon.update_icon(mymob) - pull_icon.screen_loc = ui_pull_resist - static_inventory += pull_icon - - lingchemdisplay = new /obj/screen/ling/chems() - infodisplay += lingchemdisplay - - lingstingdisplay = new /obj/screen/ling/sting() - infodisplay += lingstingdisplay - - - zone_select = new /obj/screen/zone_sel() - zone_select.icon = ui_style - zone_select.update_icon(mymob) - static_inventory += zone_select - - mymob.client.screen = list() - - using = new /obj/screen/resist() - using.icon = ui_style - using.screen_loc = ui_pull_resist - hotkeybuttons += using - - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) - if(inv.slot_id) - inv.hud = src - inv_slots[inv.slot_id] = inv - inv.update_icon() - -/datum/hud/monkey/persistent_inventory_update() - if(!mymob) - return - var/mob/living/carbon/monkey/M = mymob - - if(hud_shown) - if(M.back) - M.back.screen_loc = ui_monkey_back - M.client.screen += M.back - if(M.wear_mask) - M.wear_mask.screen_loc = ui_monkey_mask - M.client.screen += M.wear_mask - if(M.wear_neck) - M.wear_neck.screen_loc = ui_monkey_neck - M.client.screen += M.wear_neck - if(M.head) - M.head.screen_loc = ui_monkey_head - M.client.screen += M.head - else - if(M.back) - M.back.screen_loc = null - if(M.wear_mask) - M.wear_mask.screen_loc = null - if(M.head) - M.head.screen_loc = null - - if(hud_version != HUD_STYLE_NOHUD) - for(var/obj/item/I in M.held_items) - I.screen_loc = ui_hand_position(M.get_held_index_of_item(I)) - M.client.screen += I - else - for(var/obj/item/I in M.held_items) - I.screen_loc = null - M.client.screen -= I +/datum/hud/monkey/New(mob/living/carbon/monkey/owner) + ..() + var/obj/screen/using + var/obj/screen/inventory/inv_box + + action_intent = new /obj/screen/act_intent() + action_intent.icon = ui_style + action_intent.icon_state = mymob.a_intent + action_intent.screen_loc = ui_acti + action_intent.hud = src + static_inventory += action_intent + + using = new /obj/screen/mov_intent() + using.icon = ui_style + using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") + using.screen_loc = ui_movi + using.hud = src + static_inventory += using + + using = new/obj/screen/language_menu + using.icon = ui_style + using.hud = src + static_inventory += using + + using = new /obj/screen/drop() + using.icon = ui_style + using.screen_loc = ui_drop_throw + using.hud = src + static_inventory += using + + build_hand_slots() + + using = new /obj/screen/swap_hand() + using.icon = ui_style + using.icon_state = "swap_1_m" //extra wide! + using.screen_loc = ui_swaphand_position(owner,1) + using.hud = src + static_inventory += using + + using = new /obj/screen/swap_hand() + using.icon = ui_style + using.icon_state = "swap_2" + using.screen_loc = ui_swaphand_position(owner,2) + using.hud = src + static_inventory += using + + inv_box = new /obj/screen/inventory() + inv_box.name = "mask" + inv_box.icon = ui_style + inv_box.icon_state = "mask" +// inv_box.icon_full = "template" + inv_box.screen_loc = ui_monkey_mask + inv_box.slot_id = SLOT_WEAR_MASK + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "neck" + inv_box.icon = ui_style + inv_box.icon_state = "neck" +// inv_box.icon_full = "template" + inv_box.screen_loc = ui_monkey_neck + inv_box.slot_id = SLOT_NECK + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "head" + inv_box.icon = ui_style + inv_box.icon_state = "head" +// inv_box.icon_full = "template" + inv_box.screen_loc = ui_monkey_head + inv_box.slot_id = SLOT_HEAD + static_inventory += inv_box + + inv_box = new /obj/screen/inventory() + inv_box.name = "back" + inv_box.icon = ui_style + inv_box.icon_state = "back" + inv_box.screen_loc = ui_monkey_back + inv_box.slot_id = SLOT_BACK + static_inventory += inv_box + + throw_icon = new /obj/screen/throw_catch() + throw_icon.icon = ui_style + throw_icon.screen_loc = ui_drop_throw + throw_icon.hud = src + hotkeybuttons += throw_icon + + internals = new /obj/screen/internals() + internals.hud = src + infodisplay += internals + + healths = new /obj/screen/healths() + healths.hud = src + infodisplay += healths + + pull_icon = new /obj/screen/pull() + pull_icon.icon = ui_style + pull_icon.screen_loc = ui_pull_resist + pull_icon.hud = src + pull_icon.update_icon() + static_inventory += pull_icon + + lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay.hud = src + infodisplay += lingchemdisplay + + lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay.hud = src + infodisplay += lingstingdisplay + + + zone_select = new /obj/screen/zone_sel() + zone_select.icon = ui_style + zone_select.hud = src + zone_select.update_icon() + static_inventory += zone_select + + mymob.client.screen = list() + + using = new /obj/screen/resist() + using.icon = ui_style + using.screen_loc = ui_pull_resist + using.hud = src + hotkeybuttons += using + + for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + if(inv.slot_id) + inv.hud = src + inv_slots[inv.slot_id] = inv + inv.update_icon() + +/datum/hud/monkey/persistent_inventory_update() + if(!mymob) + return + var/mob/living/carbon/monkey/M = mymob + + if(hud_shown) + if(M.back) + M.back.screen_loc = ui_monkey_back + M.client.screen += M.back + if(M.wear_mask) + M.wear_mask.screen_loc = ui_monkey_mask + M.client.screen += M.wear_mask + if(M.wear_neck) + M.wear_neck.screen_loc = ui_monkey_neck + M.client.screen += M.wear_neck + if(M.head) + M.head.screen_loc = ui_monkey_head + M.client.screen += M.head + else + if(M.back) + M.back.screen_loc = null + if(M.wear_mask) + M.wear_mask.screen_loc = null + if(M.head) + M.head.screen_loc = null + + if(hud_version != HUD_STYLE_NOHUD) + for(var/obj/item/I in M.held_items) + I.screen_loc = ui_hand_position(M.get_held_index_of_item(I)) + M.client.screen += I + else + for(var/obj/item/I in M.held_items) + I.screen_loc = null + M.client.screen -= I diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index bc8a2bde..93693139 100644 --- a/code/_onclick/hud/revenanthud.dm +++ b/code/_onclick/hud/revenanthud.dm @@ -3,4 +3,5 @@ ..() healths = new /obj/screen/healths/revenant() + healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index ee18f147..61b10c4f 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,272 +1,287 @@ -/obj/screen/robot - icon = 'icons/mob/screen_cyborg.dmi' - -/obj/screen/robot/module - name = "cyborg module" - icon_state = "nomod" - -/obj/screen/robot/Click() - if(isobserver(usr)) - return 1 - -/obj/screen/robot/module/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - if(R.module.type != /obj/item/robot_module) - R.hud_used.toggle_show_robot_modules() - return 1 - R.pick_module() - -/obj/screen/robot/module1 - name = "module1" - icon_state = "inv1" - -/obj/screen/robot/module1/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(1) - -/obj/screen/robot/module2 - name = "module2" - icon_state = "inv2" - -/obj/screen/robot/module2/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(2) - -/obj/screen/robot/module3 - name = "module3" - icon_state = "inv3" - -/obj/screen/robot/module3/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_module(3) - -/obj/screen/robot/radio - name = "radio" - icon_state = "radio" - -/obj/screen/robot/radio/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.radio.interact(R) - -/obj/screen/robot/store - name = "store" - icon_state = "store" - -/obj/screen/robot/store/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.uneq_active() - -/obj/screen/robot/lamp - name = "headlamp" - icon_state = "lamp0" - -/obj/screen/robot/lamp/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.control_headlamp() - -/obj/screen/robot/thrusters - name = "ion thrusters" - icon_state = "ionpulse0" - -/obj/screen/robot/thrusters/Click() - if(..()) - return - var/mob/living/silicon/robot/R = usr - R.toggle_ionpulse() - -/datum/hud/robot - ui_style = 'icons/mob/screen_cyborg.dmi' - -/datum/hud/robot/New(mob/owner) - ..() - var/mob/living/silicon/robot/mymobR = mymob - var/obj/screen/using - - using = new/obj/screen/language_menu - using.screen_loc = ui_borg_language_menu - static_inventory += using - -//Radio - using = new /obj/screen/robot/radio() - using.screen_loc = ui_borg_radio - static_inventory += using - -//Module select - using = new /obj/screen/robot/module1() - using.screen_loc = ui_inv1 - static_inventory += using - mymobR.inv1 = using - - using = new /obj/screen/robot/module2() - using.screen_loc = ui_inv2 - static_inventory += using - mymobR.inv2 = using - - using = new /obj/screen/robot/module3() - using.screen_loc = ui_inv3 - static_inventory += using - mymobR.inv3 = using - -//End of module select - -//Photography stuff - using = new /obj/screen/ai/image_take() - using.screen_loc = ui_borg_camera - static_inventory += using - - using = new /obj/screen/ai/image_view() - using.screen_loc = ui_borg_album - static_inventory += using - -//Sec/Med HUDs - using = new /obj/screen/ai/sensors() - using.screen_loc = ui_borg_sensor - static_inventory += using - -//Headlamp control - using = new /obj/screen/robot/lamp() - using.screen_loc = ui_borg_lamp - static_inventory += using - mymobR.lamp_button = using - -//Thrusters - using = new /obj/screen/robot/thrusters() - using.screen_loc = ui_borg_thrusters - static_inventory += using - mymobR.thruster_button = using - -//Intent - action_intent = new /obj/screen/act_intent/robot() - action_intent.icon_state = mymob.a_intent - static_inventory += action_intent - -//Health - healths = new /obj/screen/healths/robot() - infodisplay += healths - -//Installed Module - mymobR.hands = new /obj/screen/robot/module() - mymobR.hands.screen_loc = ui_borg_module - static_inventory += mymobR.hands - -//Store - module_store_icon = new /obj/screen/robot/store() - module_store_icon.screen_loc = ui_borg_store - - pull_icon = new /obj/screen/pull() - pull_icon.icon = 'icons/mob/screen_cyborg.dmi' - pull_icon.update_icon(mymob) - pull_icon.screen_loc = ui_borg_pull - hotkeybuttons += pull_icon - - - zone_select = new /obj/screen/zone_sel/robot() - zone_select.update_icon(mymob) - static_inventory += zone_select - - -/datum/hud/proc/toggle_show_robot_modules() - if(!iscyborg(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - R.shown_robot_modules = !R.shown_robot_modules - update_robot_modules_display() - -/datum/hud/proc/update_robot_modules_display(mob/viewer) - if(!iscyborg(mymob)) - return - - var/mob/living/silicon/robot/R = mymob - - var/mob/screenmob = viewer || R - - if(!R.module) - return - - if(!R.client) - return - - if(R.shown_robot_modules && screenmob.hud_used.hud_shown) - //Modules display is shown - screenmob.client.screen += module_store_icon //"store" icon - - if(!R.module.modules) - to_chat(usr, "Selected module has no modules to select") - return - - if(!R.robot_modules_background) - return - - var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1) - R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" - screenmob.client.screen += R.robot_modules_background - - var/x = -4 //Start at CENTER-4,SOUTH+1 - var/y = 1 - - for(var/atom/movable/A in R.module.get_inactive_modules()) - //Module is not currently active - screenmob.client.screen += A - if(x < 0) - A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" - else - A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" - A.layer = ABOVE_HUD_LAYER - A.plane = ABOVE_HUD_PLANE - - x++ - if(x == 4) - x = -4 - y++ - - else - //Modules display is hidden - screenmob.client.screen -= module_store_icon //"store" icon - - for(var/atom/A in R.module.get_inactive_modules()) - //Module is not currently active - screenmob.client.screen -= A - R.shown_robot_modules = 0 - screenmob.client.screen -= R.robot_modules_background - -/datum/hud/robot/persistent_inventory_update(mob/viewer) - if(!mymob) - return - var/mob/living/silicon/robot/R = mymob - - var/mob/screenmob = viewer || R - - if(screenmob.hud_used) - if(screenmob.hud_used.hud_shown) - for(var/i in 1 to R.held_items.len) - var/obj/item/I = R.held_items[i] - if(I) - switch(i) - if(1) - I.screen_loc = ui_inv1 - if(2) - I.screen_loc = ui_inv2 - if(3) - I.screen_loc = ui_inv3 - else - return - screenmob.client.screen += I - else - for(var/obj/item/I in R.held_items) - screenmob.client.screen -= I +/obj/screen/robot + icon = 'icons/mob/screen_cyborg.dmi' + +/obj/screen/robot/module + name = "cyborg module" + icon_state = "nomod" + +/obj/screen/robot/Click() + if(isobserver(usr)) + return 1 + +/obj/screen/robot/module/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + if(R.module.type != /obj/item/robot_module) + R.hud_used.toggle_show_robot_modules() + return 1 + R.pick_module() + +/obj/screen/robot/module1 + name = "module1" + icon_state = "inv1" + +/obj/screen/robot/module1/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(1) + +/obj/screen/robot/module2 + name = "module2" + icon_state = "inv2" + +/obj/screen/robot/module2/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(2) + +/obj/screen/robot/module3 + name = "module3" + icon_state = "inv3" + +/obj/screen/robot/module3/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_module(3) + +/obj/screen/robot/radio + name = "radio" + icon_state = "radio" + +/obj/screen/robot/radio/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.radio.interact(R) + +/obj/screen/robot/store + name = "store" + icon_state = "store" + +/obj/screen/robot/store/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.uneq_active() + +/obj/screen/robot/lamp + name = "headlamp" + icon_state = "lamp0" + +/obj/screen/robot/lamp/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.control_headlamp() + +/obj/screen/robot/thrusters + name = "ion thrusters" + icon_state = "ionpulse0" + +/obj/screen/robot/thrusters/Click() + if(..()) + return + var/mob/living/silicon/robot/R = usr + R.toggle_ionpulse() + +/datum/hud/robot + ui_style = 'icons/mob/screen_cyborg.dmi' + +/datum/hud/robot/New(mob/owner) + ..() + var/mob/living/silicon/robot/mymobR = mymob + var/obj/screen/using + + using = new/obj/screen/language_menu + using.screen_loc = ui_borg_language_menu + using.hud = src + static_inventory += using + +//Radio + using = new /obj/screen/robot/radio() + using.screen_loc = ui_borg_radio + using.hud = src + static_inventory += using + +//Module select + using = new /obj/screen/robot/module1() + using.screen_loc = ui_inv1 + using.hud = src + static_inventory += using + mymobR.inv1 = using + + using = new /obj/screen/robot/module2() + using.screen_loc = ui_inv2 + using.hud = src + static_inventory += using + mymobR.inv2 = using + + using = new /obj/screen/robot/module3() + using.screen_loc = ui_inv3 + using.hud = src + static_inventory += using + mymobR.inv3 = using + +//End of module select + +//Photography stuff + using = new /obj/screen/ai/image_take() + using.screen_loc = ui_borg_camera + using.hud = src + static_inventory += using + + using = new /obj/screen/ai/image_view() + using.screen_loc = ui_borg_album + using.hud = src + static_inventory += using + +//Sec/Med HUDs + using = new /obj/screen/ai/sensors() + using.screen_loc = ui_borg_sensor + using.hud = src + static_inventory += using + +//Headlamp control + using = new /obj/screen/robot/lamp() + using.screen_loc = ui_borg_lamp + using.hud = src + static_inventory += using + mymobR.lamp_button = using + +//Thrusters + using = new /obj/screen/robot/thrusters() + using.screen_loc = ui_borg_thrusters + using.hud = src + static_inventory += using + mymobR.thruster_button = using + +//Intent + action_intent = new /obj/screen/act_intent/robot() + action_intent.icon_state = mymob.a_intent + action_intent.hud = src + static_inventory += action_intent + +//Health + healths = new /obj/screen/healths/robot() + healths.hud = src + infodisplay += healths + +//Installed Module + mymobR.hands = new /obj/screen/robot/module() + mymobR.hands.screen_loc = ui_borg_module + static_inventory += mymobR.hands + +//Store + module_store_icon = new /obj/screen/robot/store() + module_store_icon.hud = src + module_store_icon.screen_loc = ui_borg_store + + pull_icon = new /obj/screen/pull() + pull_icon.icon = 'icons/mob/screen_cyborg.dmi' + pull_icon.hud = src + pull_icon.update_icon() + pull_icon.screen_loc = ui_borg_pull + hotkeybuttons += pull_icon + + + zone_select = new /obj/screen/zone_sel/robot() + zone_select.hud = src + zone_select.update_icon() + static_inventory += zone_select + + +/datum/hud/proc/toggle_show_robot_modules() + if(!iscyborg(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + + R.shown_robot_modules = !R.shown_robot_modules + update_robot_modules_display() + +/datum/hud/proc/update_robot_modules_display(mob/viewer) + if(!iscyborg(mymob)) + return + + var/mob/living/silicon/robot/R = mymob + + var/mob/screenmob = viewer || R + + if(!R.module) + return + + if(!R.client) + return + + if(R.shown_robot_modules && screenmob.hud_used.hud_shown) + //Modules display is shown + screenmob.client.screen += module_store_icon //"store" icon + + if(!R.module.modules) + to_chat(usr, "Selected module has no modules to select") + return + + if(!R.robot_modules_background) + return + + var/display_rows = CEILING(length(R.module.get_inactive_modules()) / 8, 1) + R.robot_modules_background.screen_loc = "CENTER-4:16,SOUTH+1:7 to CENTER+3:16,SOUTH+[display_rows]:7" + screenmob.client.screen += R.robot_modules_background + + var/x = -4 //Start at CENTER-4,SOUTH+1 + var/y = 1 + + for(var/atom/movable/A in R.module.get_inactive_modules()) + //Module is not currently active + screenmob.client.screen += A + if(x < 0) + A.screen_loc = "CENTER[x]:16,SOUTH+[y]:7" + else + A.screen_loc = "CENTER+[x]:16,SOUTH+[y]:7" + A.layer = ABOVE_HUD_LAYER + A.plane = ABOVE_HUD_PLANE + + x++ + if(x == 4) + x = -4 + y++ + + else + //Modules display is hidden + screenmob.client.screen -= module_store_icon //"store" icon + + for(var/atom/A in R.module.get_inactive_modules()) + //Module is not currently active + screenmob.client.screen -= A + R.shown_robot_modules = 0 + screenmob.client.screen -= R.robot_modules_background + +/datum/hud/robot/persistent_inventory_update(mob/viewer) + if(!mymob) + return + var/mob/living/silicon/robot/R = mymob + + var/mob/screenmob = viewer || R + + if(screenmob.hud_used) + if(screenmob.hud_used.hud_shown) + for(var/i in 1 to R.held_items.len) + var/obj/item/I = R.held_items[i] + if(I) + switch(i) + if(1) + I.screen_loc = ui_inv1 + if(2) + I.screen_loc = ui_inv2 + if(3) + I.screen_loc = ui_inv3 + else + return + screenmob.client.screen += I + else + for(var/obj/item/I in R.held_items) + screenmob.client.screen -= I diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 5c946dc5..00f84851 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -1,705 +1,704 @@ -/* - Screen objects - Todo: improve/re-implement - - Screen objects are only used for the hud and should not appear anywhere "in-game". - They are used with the client/screen list and the screen_loc var. - For more information, see the byond documentation on the screen_loc and screen vars. -*/ -/obj/screen - name = "" - icon = 'icons/mob/screen_gen.dmi' - layer = HUD_LAYER - plane = HUD_PLANE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - appearance_flags = APPEARANCE_UI - var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. - var/datum/hud/hud = null // A reference to the owner HUD, if any. - -/obj/screen/take_damage() - return - -/obj/screen/Destroy() - master = null - hud = null - return ..() - -/obj/screen/examine(mob/user) - return list() - -/obj/screen/orbit() - return - -/obj/screen/proc/component_click(obj/screen/component_button/component, params) - return - -/obj/screen/text - icon = null - icon_state = null - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - screen_loc = "CENTER-7,CENTER-7" - maptext_height = 480 - maptext_width = 480 - -/obj/screen/swap_hand - layer = HUD_LAYER - plane = HUD_PLANE - name = "swap hand" - -/obj/screen/swap_hand/Click() - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - - if(usr.incapacitated()) - return 1 - - if(ismob(usr)) - var/mob/M = usr - M.swap_hand() - return 1 - -/obj/screen/craft - name = "crafting menu" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "craft" - screen_loc = ui_crafting - -/obj/screen/area_creator - name = "create new area" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "area_edit" - screen_loc = ui_building - -/obj/screen/area_creator/Click() - if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr))) - return TRUE - var/area/A = get_area(usr) - if(!A.outdoors) - to_chat(usr, "There is already a defined structure here.") - return TRUE - create_area(usr) - -/obj/screen/language_menu - name = "language menu" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "talk_wheel" - screen_loc = ui_language_menu - -/obj/screen/language_menu/Click() - var/mob/M = usr - var/datum/language_holder/H = M.get_language_holder() - H.open_language_menu(usr) - -/obj/screen/inventory - var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. - var/icon_empty // Icon when empty. For now used only by humans. - var/icon_full // Icon when contains an item. For now used only by humans. - var/list/object_overlays = list() - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/inventory/Click(location, control, params) - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - - if(usr.incapacitated()) - return 1 - if(ismecha(usr.loc)) // stops inventory actions in a mech - return 1 - - if(hud && hud.mymob && slot_id) - var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) - if(inv_item) - return inv_item.Click(location, control, params) - - if(usr.attack_ui(slot_id)) - usr.update_inv_hands() - return 1 - -/obj/screen/inventory/MouseEntered() - ..() - add_overlays() - -/obj/screen/inventory/MouseExited() - ..() - cut_overlay(object_overlays) - object_overlays.Cut() - -/obj/screen/inventory/update_icon() - if(!icon_empty) - icon_empty = icon_state - - if(hud && hud.mymob && slot_id && icon_full) - if(hud.mymob.get_item_by_slot(slot_id)) - icon_state = icon_full - else - icon_state = icon_empty - -/obj/screen/inventory/proc/add_overlays() - var/mob/user = hud.mymob - - if(hud && user && slot_id) - var/obj/item/holding = user.get_active_held_item() - - if(!holding || user.get_item_by_slot(slot_id)) - return - - var/image/item_overlay = image(holding) - item_overlay.alpha = 92 - - if(!user.can_equip(holding, slot_id, disable_warning = TRUE)) - item_overlay.color = "#FF0000" - else - item_overlay.color = "#00ff00" - - object_overlays += item_overlay - add_overlay(object_overlays) - -/obj/screen/inventory/hand - var/mutable_appearance/handcuff_overlay - var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") - var/held_index = 0 - -/obj/screen/inventory/hand/update_icon() - ..() - - if(!handcuff_overlay) - var/state = (!(held_index % 2)) ? "markus" : "gabrielle" - handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) - - cut_overlays() - - if(hud && hud.mymob) - if(iscarbon(hud.mymob)) - var/mob/living/carbon/C = hud.mymob - if(C.handcuffed) - add_overlay(handcuff_overlay) - - if(held_index) - if(!C.has_hand_for_held_index(held_index)) - add_overlay(blocked_overlay) - - if(held_index == hud.mymob.active_hand_index) - add_overlay("hand_active") - - -/obj/screen/inventory/hand/Click(location, control, params) - // At this point in client Click() code we have passed the 1/10 sec check and little else - // We don't even know if it's a middle click - if(world.time <= usr.next_move) - return 1 - if(usr.incapacitated() || isobserver(usr)) - return 1 - if (ismecha(usr.loc)) // stops inventory actions in a mech - return 1 - - if(hud.mymob.active_hand_index == held_index) - var/obj/item/I = hud.mymob.get_active_held_item() - if(I) - I.Click(location, control, params) - else - hud.mymob.swap_hand(held_index) - return 1 - -/obj/screen/close - name = "close" - layer = ABOVE_HUD_LAYER - plane = ABOVE_HUD_PLANE - icon_state = "backpack_close" - -/obj/screen/close/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/close/Click() - var/datum/component/storage/S = master - S.hide_from(usr) - return TRUE - -/obj/screen/drop - name = "drop" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_drop" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/drop/Click() - if(usr.stat == CONSCIOUS) - usr.dropItemToGround(usr.get_active_held_item()) - -/obj/screen/act_intent - name = "intent" - icon_state = "help" - screen_loc = ui_acti - -/obj/screen/act_intent/Click(location, control, params) - usr.a_intent_change(INTENT_HOTKEY_RIGHT) - -/obj/screen/act_intent/segmented/Click(location, control, params) - if(usr.client.prefs.toggles & INTENT_STYLE) - var/_x = text2num(params2list(params)["icon-x"]) - var/_y = text2num(params2list(params)["icon-y"]) - - if(_x<=16 && _y<=16) - usr.a_intent_change(INTENT_HARM) - - else if(_x<=16 && _y>=17) - usr.a_intent_change(INTENT_HELP) - - else if(_x>=17 && _y<=16) - usr.a_intent_change(INTENT_GRAB) - - else if(_x>=17 && _y>=17) - usr.a_intent_change(INTENT_DISARM) - else - return ..() - -/obj/screen/act_intent/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_movi - -/obj/screen/act_intent/robot - icon = 'icons/mob/screen_cyborg.dmi' - screen_loc = ui_borg_intents - -/obj/screen/internals - name = "toggle internals" - icon_state = "internal0" - screen_loc = ui_internal - -/obj/screen/internals/Click() - if(!iscarbon(usr)) - return - var/mob/living/carbon/C = usr - if(C.incapacitated()) - return - - if(C.internal) - C.internal = null - to_chat(C, "You are no longer running on internals.") - icon_state = "internal0" - else - if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - var/obj/item/clothing/check - var/internals = FALSE - - for(check in GET_INTERNAL_SLOTS(C)) - if(istype(check, /obj/item/clothing/mask)) - var/obj/item/clothing/mask/M = check - if(M.mask_adjusted) - M.adjustmask(C) - if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) - internals = TRUE - if(!internals) - to_chat(C, "You are not wearing an internals mask!") - return - - var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank) - if(I) - to_chat(C, "You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))].") - C.internal = I - else if(ishuman(C)) - var/mob/living/carbon/human/H = C - if(istype(H.s_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from [H.s_store] on your [H.wear_suit.name].") - H.internal = H.s_store - else if(istype(H.belt, /obj/item/tank)) - to_chat(H, "You are now running on internals from [H.belt] on your belt.") - H.internal = H.belt - else if(istype(H.l_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from [H.l_store] in your left pocket.") - H.internal = H.l_store - else if(istype(H.r_store, /obj/item/tank)) - to_chat(H, "You are now running on internals from [H.r_store] in your right pocket.") - H.internal = H.r_store - - //Separate so CO2 jetpacks are a little less cumbersome. - if(!C.internal && istype(C.back, /obj/item/tank)) - to_chat(C, "You are now running on internals from [C.back] on your back.") - C.internal = C.back - - if(C.internal) - icon_state = "internal1" - else - to_chat(C, "You don't have an oxygen tank!") - return - C.update_action_buttons_icon() - -/obj/screen/mov_intent - name = "run/walk toggle" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "running" - -/obj/screen/mov_intent/Click() - toggle(usr) - -/obj/screen/mov_intent/update_icon(mob/user) - if(!user && hud) - user = hud.mymob - if(!user) - return - switch(user.m_intent) - if(MOVE_INTENT_WALK) - icon_state = "walking" - - if(MOVE_INTENT_RUN) - icon_state = "running" - -/obj/screen/mov_intent/proc/toggle(mob/user) - if(isobserver(user)) - return - user.toggle_move_intent(user) - -/obj/screen/pull - name = "stop pulling" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "pull" - -/obj/screen/pull/Click() - if(isobserver(usr)) - return - usr.stop_pulling() - -/obj/screen/pull/update_icon(mob/mymob) - if(!mymob) - return - if(mymob.pulling) - icon_state = "pull" - else - icon_state = "pull0" - -/obj/screen/resist - name = "resist" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_resist" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/resist/Click() - if(isliving(usr)) - var/mob/living/L = usr - L.resist() - -/obj/screen/rest - name = "rest" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_rest" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/rest/Click() - if(isliving(usr)) - var/mob/living/L = usr - L.lay_down() - -/obj/screen/rest/update_icon(mob/mymob) - if(!isliving(mymob)) - return - var/mob/living/L = mymob - if(!L.resting) - icon_state = "act_rest" - else - icon_state = "act_rest0" - -/obj/screen/storage - name = "storage" - icon_state = "block" - screen_loc = "7,7 to 10,8" - layer = HUD_LAYER - plane = HUD_PLANE - -/obj/screen/storage/Initialize(mapload, new_master) - . = ..() - master = new_master - -/obj/screen/storage/Click(location, control, params) - if(world.time <= usr.next_move) - return TRUE - if(usr.incapacitated()) - return TRUE - if (ismecha(usr.loc)) // stops inventory actions in a mech - return TRUE - if(master) - var/obj/item/I = usr.get_active_held_item() - if(I) - master.attackby(null, I, usr, params) - return TRUE - -/obj/screen/throw_catch - name = "throw/catch" - icon = 'icons/mob/screen_midnight.dmi' - icon_state = "act_throw_off" - -/obj/screen/throw_catch/Click() - if(iscarbon(usr)) - var/mob/living/carbon/C = usr - C.toggle_throw_mode() - -/obj/screen/zone_sel - name = "damage zone" - icon_state = "zone_sel" - screen_loc = ui_zonesel - var/selecting = BODY_ZONE_CHEST - var/static/list/hover_overlays_cache = list() - var/hovering - -/obj/screen/zone_sel/Click(location, control,params) - if(isobserver(usr)) - return - - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/choice = get_zone_at(icon_x, icon_y) - if (!choice) - return 1 - - return set_selected_zone(choice, usr) - -/obj/screen/zone_sel/MouseEntered(location, control, params) - MouseMove(location, control, params) - -/obj/screen/zone_sel/MouseMove(location, control, params) - if(isobserver(usr)) - return - - var/list/PL = params2list(params) - var/icon_x = text2num(PL["icon-x"]) - var/icon_y = text2num(PL["icon-y"]) - var/choice = get_zone_at(icon_x, icon_y) - - if(hovering == choice) - return - vis_contents -= hover_overlays_cache[hovering] - hovering = choice - - var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice] - if(!overlay_object) - overlay_object = new - overlay_object.icon_state = "[choice]" - hover_overlays_cache[choice] = overlay_object - vis_contents += overlay_object - -/obj/effect/overlay/zone_sel - icon = 'icons/mob/screen_gen.dmi' - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - alpha = 128 - anchored = TRUE - layer = ABOVE_HUD_LAYER - plane = ABOVE_HUD_PLANE - -/obj/screen/zone_sel/MouseExited(location, control, params) - if(!isobserver(usr) && hovering) - vis_contents -= hover_overlays_cache[hovering] - hovering = null - -/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) - switch(icon_y) - if(1 to 9) //Legs - switch(icon_x) - if(10 to 15) - return BODY_ZONE_R_LEG - if(17 to 22) - return BODY_ZONE_L_LEG - if(10 to 13) //Hands and groin - switch(icon_x) - if(8 to 11) - return BODY_ZONE_R_ARM - if(12 to 20) - return BODY_ZONE_PRECISE_GROIN - if(21 to 24) - return BODY_ZONE_L_ARM - if(14 to 22) //Chest and arms to shoulders - switch(icon_x) - if(8 to 11) - return BODY_ZONE_R_ARM - if(12 to 20) - return BODY_ZONE_CHEST - if(21 to 24) - return BODY_ZONE_L_ARM - if(23 to 30) //Head, but we need to check for eye or mouth - if(icon_x in 12 to 20) - switch(icon_y) - if(23 to 24) - if(icon_x in 15 to 17) - return BODY_ZONE_PRECISE_MOUTH - if(26) //Eyeline, eyes are on 15 and 17 - if(icon_x in 14 to 18) - return BODY_ZONE_PRECISE_EYES - if(25 to 27) - if(icon_x in 15 to 17) - return BODY_ZONE_PRECISE_EYES - return BODY_ZONE_HEAD - -/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) - if(isobserver(user)) - return - - if(choice != selecting) - selecting = choice - update_icon(usr) - return 1 - -/obj/screen/zone_sel/update_icon(mob/user) - cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_gen.dmi', "[selecting]")) - user.zone_selected = selecting - -/obj/screen/zone_sel/alien - icon = 'icons/mob/screen_alien.dmi' - -/obj/screen/zone_sel/alien/update_icon(mob/user) - cut_overlays() - add_overlay(mutable_appearance('icons/mob/screen_alien.dmi', "[selecting]")) - user.zone_selected = selecting - -/obj/screen/zone_sel/robot - icon = 'icons/mob/screen_cyborg.dmi' - - -/obj/screen/flash - name = "flash" - icon_state = "blank" - blend_mode = BLEND_ADD - screen_loc = "WEST,SOUTH to EAST,NORTH" - layer = FLASH_LAYER - plane = FULLSCREEN_PLANE - -/obj/screen/damageoverlay - icon = 'icons/mob/screen_full.dmi' - icon_state = "oxydamageoverlay0" - name = "dmg" - blend_mode = BLEND_MULTIPLY - screen_loc = "CENTER-7,CENTER-7" - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - layer = UI_DAMAGE_LAYER - plane = FULLSCREEN_PLANE - -/obj/screen/healths - name = "health" - icon_state = "health0" - screen_loc = ui_health - -/obj/screen/healths/alien - icon = 'icons/mob/screen_alien.dmi' - screen_loc = ui_alien_health - -/obj/screen/healths/robot - icon = 'icons/mob/screen_cyborg.dmi' - screen_loc = ui_borg_health - -/obj/screen/healths/blob - name = "blob health" - icon_state = "block" - screen_loc = ui_internal - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/blob/naut - name = "health" - icon = 'icons/mob/blob.dmi' - icon_state = "nauthealth" - -/obj/screen/healths/blob/naut/core - name = "overmind health" - screen_loc = ui_health - icon_state = "corehealth" - -/obj/screen/healths/guardian - name = "summoner health" - icon = 'icons/mob/guardian.dmi' - icon_state = "base" - screen_loc = ui_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/clock - icon = 'icons/mob/actions.dmi' - icon_state = "bg_clock" - screen_loc = ui_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/clock/gear - icon = 'icons/mob/clockwork_mobs.dmi' - icon_state = "bg_gear" - screen_loc = ui_internal - -/obj/screen/healths/revenant - name = "essence" - icon = 'icons/mob/actions.dmi' - icon_state = "bg_revenant" - screen_loc = ui_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healths/construct - icon = 'icons/mob/screen_construct.dmi' - icon_state = "artificer_health0" - screen_loc = ui_construct_health - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - -/obj/screen/healthdoll - name = "health doll" - screen_loc = ui_healthdoll - -/obj/screen/mood - name = "mood" - icon_state = "mood5" - screen_loc = ui_mood - -/obj/screen/splash - icon = 'icons/blank_title.png' - icon_state = "" - screen_loc = "1,1" - layer = SPLASHSCREEN_LAYER - plane = SPLASHSCREEN_PLANE - var/client/holder - -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy - . = ..() - - holder = C - - if(!visible) - alpha = 0 - - if(!use_previous_title) - if(SStitle.icon) - icon = SStitle.icon - else - if(!SStitle.previous_icon) - qdel(src) - return - icon = SStitle.previous_icon - - holder.screen += src - -/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) - if(QDELETED(src)) - return - if(out) - animate(src, alpha = 0, time = 30) - else - alpha = 0 - animate(src, alpha = 255, time = 30) - if(qdel_after) - QDEL_IN(src, 30) - -/obj/screen/splash/Destroy() - if(holder) - holder.screen -= src - holder = null - return ..() - - -/obj/screen/component_button - var/obj/screen/parent - -/obj/screen/component_button/Initialize(mapload, obj/screen/parent) - . = ..() - src.parent = parent - -/obj/screen/component_button/Click(params) - if(parent) - parent.component_click(src, params) +/* + Screen objects + Todo: improve/re-implement + + Screen objects are only used for the hud and should not appear anywhere "in-game". + They are used with the client/screen list and the screen_loc var. + For more information, see the byond documentation on the screen_loc and screen vars. +*/ +/obj/screen + name = "" + icon = 'icons/mob/screen_gen.dmi' + layer = HUD_LAYER + plane = HUD_PLANE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + appearance_flags = APPEARANCE_UI + var/obj/master = null //A reference to the object in the slot. Grabs or items, generally. + var/datum/hud/hud = null // A reference to the owner HUD, if any. + +/obj/screen/take_damage() + return + +/obj/screen/Destroy() + master = null + hud = null + return ..() + +/obj/screen/examine(mob/user) + return list() + +/obj/screen/orbit() + return + +/obj/screen/proc/component_click(obj/screen/component_button/component, params) + return + +/obj/screen/text + icon = null + icon_state = null + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + screen_loc = "CENTER-7,CENTER-7" + maptext_height = 480 + maptext_width = 480 + +/obj/screen/swap_hand + layer = HUD_LAYER + plane = HUD_PLANE + name = "swap hand" + +/obj/screen/swap_hand/Click() + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return 1 + + if(usr.incapacitated()) + return 1 + + if(ismob(usr)) + var/mob/M = usr + M.swap_hand() + return 1 + +/obj/screen/craft + name = "crafting menu" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "craft" + screen_loc = ui_crafting + +/obj/screen/area_creator + name = "create new area" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "area_edit" + screen_loc = ui_building + +/obj/screen/area_creator/Click() + if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr))) + return TRUE + var/area/A = get_area(usr) + if(!A.outdoors) + to_chat(usr, "There is already a defined structure here.") + return TRUE + create_area(usr) + +/obj/screen/language_menu + name = "language menu" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "talk_wheel" + screen_loc = ui_language_menu + +/obj/screen/language_menu/Click() + var/mob/M = usr + var/datum/language_holder/H = M.get_language_holder() + H.open_language_menu(usr) + +/obj/screen/inventory + var/slot_id // The indentifier for the slot. It has nothing to do with ID cards. + var/icon_empty // Icon when empty. For now used only by humans. + var/icon_full // Icon when contains an item. For now used only by humans. + var/list/object_overlays = list() + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/inventory/Click(location, control, params) + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + if(world.time <= usr.next_move) + return TRUE + + if(usr.incapacitated()) + return TRUE + if(ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE + + if(hud?.mymob && slot_id) + var/obj/item/inv_item = hud.mymob.get_item_by_slot(slot_id) + if(inv_item) + return inv_item.Click(location, control, params) + + if(usr.attack_ui(slot_id)) + usr.update_inv_hands() + return TRUE + +/obj/screen/inventory/MouseEntered() + ..() + add_overlays() + +/obj/screen/inventory/MouseExited() + ..() + cut_overlay(object_overlays) + object_overlays.Cut() + +/obj/screen/inventory/update_icon_state() + if(!icon_empty) + icon_empty = icon_state + + if(hud?.mymob && slot_id && icon_full) + if(hud.mymob.get_item_by_slot(slot_id)) + icon_state = icon_full + else + icon_state = icon_empty + +/obj/screen/inventory/proc/add_overlays() + var/mob/user = hud?.mymob + + if(!user || !slot_id) + return + + var/obj/item/holding = user.get_active_held_item() + + if(!holding || user.get_item_by_slot(slot_id)) + return + + var/image/item_overlay = image(holding) + item_overlay.alpha = 92 + + if(!user.can_equip(holding, slot_id, TRUE)) + item_overlay.color = "#FF0000" + else + item_overlay.color = "#00ff00" + + object_overlays += item_overlay + add_overlay(object_overlays) + +/obj/screen/inventory/hand + var/mutable_appearance/handcuff_overlay + var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") + var/held_index = 0 + +/obj/screen/inventory/hand/update_icon() + . = ..() + + if(!handcuff_overlay) + var/state = (!(held_index % 2)) ? "markus" : "gabrielle" + handcuff_overlay = mutable_appearance('icons/mob/screen_gen.dmi', state) + + cut_overlay(list(handcuff_overlay, blocked_overlay, "hand_active")) + + if(!hud?.mymob) + return + + if(iscarbon(hud.mymob)) + var/mob/living/carbon/C = hud.mymob + if(C.handcuffed) + add_overlay(handcuff_overlay) + + if(held_index) + if(!C.has_hand_for_held_index(held_index)) + add_overlay(blocked_overlay) + + if(held_index == hud.mymob.active_hand_index) + add_overlay("hand_active") + + +/obj/screen/inventory/hand/Click(location, control, params) + // At this point in client Click() code we have passed the 1/10 sec check and little else + // We don't even know if it's a middle click + var/mob/user = hud?.mymob + if(usr != user) + return TRUE + if(world.time <= user.next_move) + return TRUE + if(user.incapacitated()) + return TRUE + if (ismecha(user.loc)) // stops inventory actions in a mech + return TRUE + + if(user.active_hand_index == held_index) + var/obj/item/I = user.get_active_held_item() + if(I) + I.Click(location, control, params) + else + user.swap_hand(held_index) + return TRUE + +/obj/screen/close + name = "close" + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + icon_state = "backpack_close" + +/obj/screen/close/Initialize(mapload, new_master) + . = ..() + master = new_master + +/obj/screen/close/Click() + var/datum/component/storage/S = master + S.hide_from(usr) + return TRUE + +/obj/screen/drop + name = "drop" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_drop" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/drop/Click() + if(usr.stat == CONSCIOUS) + usr.dropItemToGround(usr.get_active_held_item()) + +/obj/screen/act_intent + name = "intent" + icon_state = "help" + screen_loc = ui_acti + +/obj/screen/act_intent/Click(location, control, params) + usr.a_intent_change(INTENT_HOTKEY_RIGHT) + +/obj/screen/act_intent/segmented/Click(location, control, params) + if(usr.client.prefs.toggles & INTENT_STYLE) + var/_x = text2num(params2list(params)["icon-x"]) + var/_y = text2num(params2list(params)["icon-y"]) + + if(_x<=16 && _y<=16) + usr.a_intent_change(INTENT_HARM) + + else if(_x<=16 && _y>=17) + usr.a_intent_change(INTENT_HELP) + + else if(_x>=17 && _y<=16) + usr.a_intent_change(INTENT_GRAB) + + else if(_x>=17 && _y>=17) + usr.a_intent_change(INTENT_DISARM) + else + return ..() + +/obj/screen/act_intent/alien + icon = 'icons/mob/screen_alien.dmi' + screen_loc = ui_movi + +/obj/screen/act_intent/robot + icon = 'icons/mob/screen_cyborg.dmi' + screen_loc = ui_borg_intents + +/obj/screen/internals + name = "toggle internals" + icon_state = "internal0" + screen_loc = ui_internal + +/obj/screen/internals/Click() + if(!iscarbon(usr)) + return + var/mob/living/carbon/C = usr + if(C.incapacitated()) + return + + if(C.internal) + C.internal = null + to_chat(C, "You are no longer running on internals.") + icon_state = "internal0" + else + if(!C.getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + var/obj/item/clothing/check + var/internals = FALSE + + for(check in GET_INTERNAL_SLOTS(C)) + if(istype(check, /obj/item/clothing/mask)) + var/obj/item/clothing/mask/M = check + if(M.mask_adjusted) + M.adjustmask(C) + if(CHECK_BITFIELD(check.clothing_flags, ALLOWINTERNALS)) + internals = TRUE + if(!internals) + to_chat(C, "You are not wearing an internals mask!") + return + + var/obj/item/I = C.is_holding_item_of_type(/obj/item/tank) + if(I) + to_chat(C, "You are now running on internals from [I] in your [C.get_held_index_name(C.get_held_index_of_item(I))].") + C.internal = I + else if(ishuman(C)) + var/mob/living/carbon/human/H = C + if(istype(H.s_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from [H.s_store] on your [H.wear_suit.name].") + H.internal = H.s_store + else if(istype(H.belt, /obj/item/tank)) + to_chat(H, "You are now running on internals from [H.belt] on your belt.") + H.internal = H.belt + else if(istype(H.l_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from [H.l_store] in your left pocket.") + H.internal = H.l_store + else if(istype(H.r_store, /obj/item/tank)) + to_chat(H, "You are now running on internals from [H.r_store] in your right pocket.") + H.internal = H.r_store + + //Separate so CO2 jetpacks are a little less cumbersome. + if(!C.internal && istype(C.back, /obj/item/tank)) + to_chat(C, "You are now running on internals from [C.back] on your back.") + C.internal = C.back + + if(C.internal) + icon_state = "internal1" + else + to_chat(C, "You don't have an oxygen tank!") + return + C.update_action_buttons_icon() + +/obj/screen/mov_intent + name = "run/walk toggle" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "running" + +/obj/screen/mov_intent/Click() + toggle(usr) + +/obj/screen/mov_intent/update_icon_state() + switch(hud?.mymob?.m_intent) + if(MOVE_INTENT_WALK) + icon_state = "walking" + + if(MOVE_INTENT_RUN) + icon_state = "running" + +/obj/screen/mov_intent/proc/toggle(mob/user) + if(isobserver(user)) + return + user.toggle_move_intent(user) + +/obj/screen/pull + name = "stop pulling" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "pull" + +/obj/screen/pull/Click() + if(isobserver(usr)) + return + usr.stop_pulling() + +/obj/screen/pull/update_icon_state() + if(hud?.mymob?.pulling) + icon_state = "pull" + else + icon_state = "pull0" + +/obj/screen/resist + name = "resist" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_resist" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/resist/Click() + if(isliving(usr)) + var/mob/living/L = usr + L.resist() + +/obj/screen/rest + name = "rest" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_rest" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/rest/Click() + if(isliving(usr)) + var/mob/living/L = usr + L.lay_down() + +/obj/screen/rest/update_icon_state() + var/mob/living/user = hud?.mymob + if(!istype(user)) + return + if(!user.resting) + icon_state = "act_rest" + else + icon_state = "act_rest0" + +/obj/screen/storage + name = "storage" + icon_state = "block" + screen_loc = "7,7 to 10,8" + layer = HUD_LAYER + plane = HUD_PLANE + +/obj/screen/storage/Initialize(mapload, new_master) + . = ..() + master = new_master + +/obj/screen/storage/Click(location, control, params) + if(world.time <= usr.next_move) + return TRUE + if(usr.incapacitated()) + return TRUE + if (ismecha(usr.loc)) // stops inventory actions in a mech + return TRUE + if(master) + var/obj/item/I = usr.get_active_held_item() + if(I) + master.attackby(null, I, usr, params) + return TRUE + +/obj/screen/throw_catch + name = "throw/catch" + icon = 'icons/mob/screen_midnight.dmi' + icon_state = "act_throw_off" + +/obj/screen/throw_catch/Click() + if(iscarbon(usr)) + var/mob/living/carbon/C = usr + C.toggle_throw_mode() + +/obj/screen/zone_sel + name = "damage zone" + icon_state = "zone_sel" + screen_loc = ui_zonesel + var/overlay_icon = 'icons/mob/screen_gen.dmi' + var/static/list/hover_overlays_cache = list() + var/hovering + +/obj/screen/zone_sel/Click(location, control,params) + if(isobserver(usr)) + return + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/choice = get_zone_at(icon_x, icon_y) + if (!choice) + return 1 + + return set_selected_zone(choice, usr) + +/obj/screen/zone_sel/MouseEntered(location, control, params) + MouseMove(location, control, params) + +/obj/screen/zone_sel/MouseMove(location, control, params) + if(isobserver(usr)) + return + + var/list/PL = params2list(params) + var/icon_x = text2num(PL["icon-x"]) + var/icon_y = text2num(PL["icon-y"]) + var/choice = get_zone_at(icon_x, icon_y) + + if(hovering == choice) + return + vis_contents -= hover_overlays_cache[hovering] + hovering = choice + + var/obj/effect/overlay/zone_sel/overlay_object = hover_overlays_cache[choice] + if(!overlay_object) + overlay_object = new + overlay_object.icon_state = "[choice]" + hover_overlays_cache[choice] = overlay_object + vis_contents += overlay_object + +/obj/effect/overlay/zone_sel + icon = 'icons/mob/screen_gen.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + alpha = 128 + anchored = TRUE + layer = ABOVE_HUD_LAYER + plane = ABOVE_HUD_PLANE + +/obj/screen/zone_sel/MouseExited(location, control, params) + if(!isobserver(usr) && hovering) + vis_contents -= hover_overlays_cache[hovering] + hovering = null + +/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) + switch(icon_y) + if(1 to 9) //Legs + switch(icon_x) + if(10 to 15) + return BODY_ZONE_R_LEG + if(17 to 22) + return BODY_ZONE_L_LEG + if(10 to 13) //Hands and groin + switch(icon_x) + if(8 to 11) + return BODY_ZONE_R_ARM + if(12 to 20) + return BODY_ZONE_PRECISE_GROIN + if(21 to 24) + return BODY_ZONE_L_ARM + if(14 to 22) //Chest and arms to shoulders + switch(icon_x) + if(8 to 11) + return BODY_ZONE_R_ARM + if(12 to 20) + return BODY_ZONE_CHEST + if(21 to 24) + return BODY_ZONE_L_ARM + if(23 to 30) //Head, but we need to check for eye or mouth + if(icon_x in 12 to 20) + switch(icon_y) + if(23 to 24) + if(icon_x in 15 to 17) + return BODY_ZONE_PRECISE_MOUTH + if(26) //Eyeline, eyes are on 15 and 17 + if(icon_x in 14 to 18) + return BODY_ZONE_PRECISE_EYES + if(25 to 27) + if(icon_x in 15 to 17) + return BODY_ZONE_PRECISE_EYES + return BODY_ZONE_HEAD + +/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) + if(user != hud?.mymob) + return + + if(choice != hud.mymob.zone_selected) + hud.mymob.zone_selected = choice + update_icon() + + return TRUE + +/obj/screen/zone_sel/update_overlays() + . = ..() + if(!hud?.mymob) + return + . += mutable_appearance(overlay_icon, "[hud.mymob.zone_selected]") + +/obj/screen/zone_sel/alien + icon = 'icons/mob/screen_alien.dmi' + overlay_icon = 'icons/mob/screen_alien.dmi' + +/obj/screen/zone_sel/robot + icon = 'icons/mob/screen_cyborg.dmi' + + +/obj/screen/flash + name = "flash" + icon_state = "blank" + blend_mode = BLEND_ADD + screen_loc = "WEST,SOUTH to EAST,NORTH" + layer = FLASH_LAYER + plane = FULLSCREEN_PLANE + +/obj/screen/damageoverlay + icon = 'icons/mob/screen_full.dmi' + icon_state = "oxydamageoverlay0" + name = "dmg" + blend_mode = BLEND_MULTIPLY + screen_loc = "CENTER-7,CENTER-7" + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + layer = UI_DAMAGE_LAYER + plane = FULLSCREEN_PLANE + +/obj/screen/healths + name = "health" + icon_state = "health0" + screen_loc = ui_health + +/obj/screen/healths/alien + icon = 'icons/mob/screen_alien.dmi' + screen_loc = ui_alien_health + +/obj/screen/healths/robot + icon = 'icons/mob/screen_cyborg.dmi' + screen_loc = ui_borg_health + +/obj/screen/healths/blob + name = "blob health" + icon_state = "block" + screen_loc = ui_internal + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/healths/blob/naut + name = "health" + icon = 'icons/mob/blob.dmi' + icon_state = "nauthealth" + +/obj/screen/healths/blob/naut/core + name = "overmind health" + screen_loc = ui_health + icon_state = "corehealth" + +/obj/screen/healths/guardian + name = "summoner health" + icon = 'icons/mob/guardian.dmi' + icon_state = "base" + screen_loc = ui_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/healths/clock + icon = 'icons/mob/actions.dmi' + icon_state = "bg_clock" + screen_loc = ui_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/healths/clock/gear + icon = 'icons/mob/clockwork_mobs.dmi' + icon_state = "bg_gear" + screen_loc = ui_internal + +/obj/screen/healths/revenant + name = "essence" + icon = 'icons/mob/actions.dmi' + icon_state = "bg_revenant" + screen_loc = ui_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/healths/construct + icon = 'icons/mob/screen_construct.dmi' + icon_state = "artificer_health0" + screen_loc = ui_construct_health + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + +/obj/screen/healthdoll + name = "health doll" + screen_loc = ui_healthdoll + +/obj/screen/mood + name = "mood" + icon_state = "mood5" + screen_loc = ui_mood + +/obj/screen/splash + icon = 'icons/blank_title.png' + icon_state = "" + screen_loc = "1,1" + layer = SPLASHSCREEN_LAYER + plane = SPLASHSCREEN_PLANE + var/client/holder + +/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy + . = ..() + + holder = C + + if(!visible) + alpha = 0 + + if(!use_previous_title) + if(SStitle.icon) + icon = SStitle.icon + else + if(!SStitle.previous_icon) + qdel(src) + return + icon = SStitle.previous_icon + + holder.screen += src + +/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) + if(QDELETED(src)) + return + if(out) + animate(src, alpha = 0, time = 30) + else + alpha = 0 + animate(src, alpha = 255, time = 30) + if(qdel_after) + QDEL_IN(src, 30) + +/obj/screen/splash/Destroy() + if(holder) + holder.screen -= src + holder = null + return ..() + + +/obj/screen/component_button + var/obj/screen/parent + +/obj/screen/component_button/Initialize(mapload, obj/screen/parent) + . = ..() + src.parent = parent + +/obj/screen/component_button/Click(params) + if(parent) + parent.component_click(src, params) diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 6cf4c73e..80cc01c3 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -69,24 +69,30 @@ using = new /obj/screen/swarmer/FabricateTrap() using.screen_loc = ui_hand_position(2) + using.hud = src static_inventory += using using = new /obj/screen/swarmer/Barricade() using.screen_loc = ui_hand_position(1) + using.hud = src static_inventory += using using = new /obj/screen/swarmer/Replicate() using.screen_loc = ui_zonesel + using.hud = src static_inventory += using using = new /obj/screen/swarmer/RepairSelf() using.screen_loc = ui_storage1 + using.hud = src static_inventory += using using = new /obj/screen/swarmer/ToggleLight() using.screen_loc = ui_back + using.hud = src static_inventory += using using = new /obj/screen/swarmer/ContactSwarmers() using.screen_loc = ui_inventory + using.hud = src static_inventory += using diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 801e8c8c..3a5feabb 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -175,9 +175,8 @@ righthand_file = 'icons/mob/inhands/weapons/staves_righthand.dmi' block_chance = 50 -/obj/item/twohanded/bostaff/update_icon() +/obj/item/twohanded/bostaff/update_icon_state() icon_state = "bostaff[wielded]" - return /obj/item/twohanded/bostaff/attack(mob/target, mob/living/user) add_fingerprint(user) diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index db7ad9f0..142d38db 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -334,8 +334,13 @@ GLOBAL_LIST_EMPTY(teleportlocs) F.update_fire_light(fire) for(var/obj/machinery/light/L in src) L.update() - -/area/proc/update_icon() +/** + * Update the icon state of the area + * + * Im not sure what the heck this does, somethign to do with weather being able to set icon + * states on areas?? where the heck would that even display? + */ +/area/update_icon_state() var/weather_icon for(var/V in SSweather.processing) var/datum/weather/W = V @@ -345,7 +350,10 @@ GLOBAL_LIST_EMPTY(teleportlocs) if(!weather_icon) icon_state = null -/area/space/update_icon() +/** + * Update the icon of the area (overridden to always be null for space + */ +/area/space/update_icon_state() icon_state = null /* diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 575c65fa..5661ad71 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -1,901 +1,927 @@ -/atom - layer = TURF_LAYER - plane = GAME_PLANE - var/level = 2 - var/article // If non-null, overrides a/an/some in all cases - - var/flags_1 = NONE - var/interaction_flags_atom = NONE - var/datum/reagents/reagents = null - - //This atom's HUD (med/sec, etc) images. Associative list. - var/list/image/hud_list = null - //HUD images that this atom can provide. - var/list/hud_possible - - /// Last name used to calculate a color for the chatmessage overlays - var/chat_color_name - /// Last color calculated for the the chatmessage overlays - var/chat_color - /// A luminescence-shifted value of the last color calculated for chatmessage overlays - var/chat_color_darkened - - //Value used to increment ex_act() if reactionary_explosions is on - var/explosion_block = 0 - - var/list/atom_colours //used to store the different colors on an atom - //its inherent color, the colored paint applied on it, special color effect etc... - - var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. - var/list/remove_overlays // a very temporary list of overlays to remove - var/list/add_overlays // a very temporary list of overlays to add - - var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays - var/list/managed_overlays - var/datum/proximity_monitor/proximity_monitor - var/buckle_message_cooldown = 0 - var/fingerprintslast - - var/list/filter_data //For handling persistent filters - - var/datum/component/orbiter/orbiters - - var/rad_flags = NONE // Will move to flags_1 when i can be arsed to - var/rad_insulation = RAD_NO_INSULATION - - var/icon/blood_splatter_icon - var/icon/cum_splatter_icon - var/list/fingerprints - var/list/fingerprintshidden - var/list/blood_DNA - var/list/suit_fibers - -/atom/New(loc, ...) - //atom creation method that preloads variables at creation - if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() - world.preloader_load(src) - - if(datum_flags & DF_USE_TAG) - GenerateTag() - - var/do_initialize = SSatoms.initialized - if(do_initialize != INITIALIZATION_INSSATOMS) - args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD - if(SSatoms.InitAtom(src, args)) - //we were deleted - return - -//Called after New if the map is being loaded. mapload = TRUE -//Called from base of New if the map is not being loaded. mapload = FALSE -//This base must be called or derivatives must set initialized to TRUE -//must not sleep -//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE -//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm - -//Note: the following functions don't call the base for optimization and must copypasta: -// /turf/Initialize -// /turf/open/space/Initialize - -/atom/proc/Initialize(mapload, ...) - if(flags_1 & INITIALIZED_1) - stack_trace("Warning: [src]([type]) initialized multiple times!") - flags_1 |= INITIALIZED_1 - - //atom color stuff - if(color) - add_atom_colour(color, FIXED_COLOUR_PRIORITY) - - if (light_power && light_range) - update_light() - - if (opacity && isturf(loc)) - var/turf/T = loc - T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. - - if (canSmoothWith) - canSmoothWith = typelist("canSmoothWith", canSmoothWith) - - ComponentInitialize() - - return INITIALIZE_HINT_NORMAL - -//called if Initialize returns INITIALIZE_HINT_LATELOAD -/atom/proc/LateInitialize() - return - -// Put your AddComponent() calls here -/atom/proc/ComponentInitialize() - return - -/atom/Destroy() - if(alternate_appearances) - for(var/K in alternate_appearances) - var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] - AA.remove_from_hud(src) - - if(reagents) - qdel(reagents) - - LAZYCLEARLIST(overlays) - LAZYCLEARLIST(priority_overlays) - - QDEL_NULL(light) - - return ..() - -/atom/proc/handle_ricochet(obj/item/projectile/P) - return - -/atom/proc/CanPass(atom/movable/mover, turf/target) - return !density - -/atom/proc/onCentCom() - var/turf/T = get_turf(src) - if(!T) - return FALSE - - if(is_reserved_level(T.z)) - for(var/A in SSshuttle.mobile) - var/obj/docking_port/mobile/M = A - if(M.launch_status == ENDGAME_TRANSIT) - for(var/place in M.shuttle_areas) - var/area/shuttle/shuttle_area = place - if(T in shuttle_area) - return TRUE - - if(!is_centcom_level(T.z))//if not, don't bother - return FALSE - - //Check for centcom itself - if(istype(T.loc, /area/centcom)) - return TRUE - - //Check for centcom shuttles - for(var/A in SSshuttle.mobile) - var/obj/docking_port/mobile/M = A - if(M.launch_status == ENDGAME_LAUNCHED) - for(var/place in M.shuttle_areas) - var/area/shuttle/shuttle_area = place - if(T in shuttle_area) - return TRUE - -/atom/proc/onSyndieBase() - var/turf/T = get_turf(src) - if(!T) - return FALSE - - if(!is_centcom_level(T.z))//if not, don't bother - return FALSE - - if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod)) - return TRUE - - return FALSE - -/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) - SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) - if(does_attack_animation) - user.changeNext_move(CLICK_CD_MELEE) - log_combat(user, src, "punched", "hulk powers") - user.do_attack_animation(src, ATTACK_EFFECT_SMASH) - -/atom/proc/CheckParts(list/parts_list) - for(var/A in parts_list) - if(istype(A, /datum/reagent)) - if(!reagents) - reagents = new() - reagents.reagent_list.Add(A) - reagents.conditional_update() - else if(ismovableatom(A)) - var/atom/movable/M = A - if(isliving(M.loc)) - var/mob/living/L = M.loc - L.transferItemToLoc(M, src) - else - M.forceMove(src) - -//common name -/atom/proc/update_multiz(prune_on_fail = FALSE) - return FALSE - -/atom/proc/assume_air(datum/gas_mixture/giver) - qdel(giver) - return null - -/atom/proc/remove_air(amount) - return null - -/atom/proc/return_air() - if(loc) - return loc.return_air() - else - return null - -/atom/proc/check_eye(mob/user) - return - -/atom/proc/Bumped(atom/movable/AM) - set waitfor = FALSE - -// Convenience procs to see if a container is open for chemistry handling -/atom/proc/is_open_container() - return is_refillable() && is_drainable() - -/atom/proc/is_injectable(allowmobs = TRUE) - return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE)) - -/atom/proc/is_drawable(allowmobs = TRUE) - return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE)) - -/atom/proc/is_refillable() - return reagents && (reagents.reagents_holder_flags & REFILLABLE) - -/atom/proc/is_drainable() - return reagents && (reagents.reagents_holder_flags & DRAINABLE) - - -/atom/proc/AllowDrop() - return FALSE - -/atom/proc/CheckExit() - return TRUE - -/atom/proc/HasProximity(atom/movable/AM as mob|obj) - return - -/atom/proc/emp_act(severity) - var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) - if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) - wires.emp_pulse() - return protection // Pass the protection value collected here upwards - -/atom/proc/bullet_act(obj/item/projectile/P, def_zone) - SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) - . = P.on_hit(src, 0, def_zone) - -//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. -// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. -/atom/proc/shove_act(mob/living/target, mob/living/user) - return FALSE - -/atom/proc/in_contents_of(container)//can take class or object instance as argument - if(ispath(container)) - if(istype(src.loc, container)) - return TRUE - else if(src in container) - return TRUE - return FALSE - -/atom/proc/update_icon_state() - -/atom/proc/update_overlaysb() - SHOULD_CALL_PARENT(1) - . = list() - SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) - -/atom/proc/update_iconb() - var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) - update_icon_state() - - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - var/list/new_overlays = update_overlaysb() - if(managed_overlays) - cut_overlay(managed_overlays) - managed_overlays = null - if(length(new_overlays)) - managed_overlays = new_overlays - add_overlay(new_overlays) - -/atom/proc/get_examine_name(mob/user) - . = "\a [src]" - var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") - if(article) - . = "[article] [src]" - override[EXAMINE_POSITION_ARTICLE] = article - - var/should_override = FALSE - - if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) - should_override = TRUE - - - if(blood_DNA && !istype(src, /obj/effect/decal)) - override[EXAMINE_POSITION_BEFORE] = " blood-stained " - should_override = TRUE - - if(should_override) - . = override.Join("") - -///Generate the full examine string of this atom (including icon for goonchat) -/atom/proc/get_examine_string(mob/user, thats = FALSE) - return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" - -/atom/proc/examine(mob/user) - . = list("[get_examine_string(user, TRUE)].") - - if(!isliving(src)) - user.visible_message("[user] examines [src].",\ - "You examine [src].") - if(desc) - . += desc - - if(reagents) - if(reagents.reagents_holder_flags & TRANSPARENT) - . += "It contains:" - if(length(reagents.reagent_list)) - if(user.can_see_reagents()) //Show each individual reagent - for(var/datum/reagent/R in reagents.reagent_list) - . += "[R.volume] units of [R.name]" - else //Otherwise, just show the total volume - var/total_volume = 0 - for(var/datum/reagent/R in reagents.reagent_list) - total_volume += R.volume - . += "[total_volume] units of various reagents" - else - . += "Nothing." - else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE) - if(reagents.total_volume) - . += "It has [reagents.total_volume] unit\s left." - else - . += "It's empty." - SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) - -/atom/proc/relaymove(mob/user) - if(buckle_message_cooldown <= world.time) - buckle_message_cooldown = world.time + 50 - to_chat(user, "You can't move while buckled to [src]!") - return - -/atom/proc/contents_explosion(severity, target) - return //For handling the effects of explosions on contents that would not normally be effected - -/atom/proc/ex_act(severity, target) - set waitfor = FALSE - contents_explosion(severity, target) - SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) - -/atom/proc/blob_act(obj/structure/blob/B) - SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) - return - -/atom/proc/fire_act(exposed_temperature, exposed_volume) - SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) - return - -/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) - if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). - addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) - -/atom/proc/hitby_react(atom/movable/AM) - if(AM && isturf(AM.loc)) - step(AM, turn(AM.dir, 180)) - -/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) - return - -//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list -/mob/living/proc/get_blood_dna_list() - var/blood_id = get_blood_id() - if(!(blood_id in GLOB.blood_reagent_types)) - return - return list("ANIMAL DNA" = "Y-") - -/mob/living/carbon/get_blood_dna_list() - var/blood_id = get_blood_id() - if(!(blood_id in GLOB.blood_reagent_types)) - return - var/list/blood_dna = list() - if(dna) - blood_dna[dna.unique_enzymes] = dna.blood_type - else - blood_dna["UNKNOWN DNA"] = "X*" - return blood_dna - -/mob/living/carbon/alien/get_blood_dna_list() - return list("UNKNOWN DNA" = "X*") - -//to add a mob's dna info into an object's blood_DNA list. -/atom/proc/transfer_mob_blood_dna(mob/living/L) - // Returns 0 if we have that blood already - var/new_blood_dna = L.get_blood_dna_list() - if(!new_blood_dna) - return FALSE - LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. - var/old_length = blood_DNA.len - blood_DNA |= new_blood_dna - if(blood_DNA.len == old_length) - return FALSE - return TRUE - -//to add blood dna info to the object's blood_DNA list -/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) - LAZYINITLIST(blood_DNA) - var/old_length = blood_DNA.len - blood_DNA |= blood_dna - if(blood_DNA.len > old_length) - return TRUE - //some new blood DNA was added - -//to add blood from a mob onto something, and transfer their dna info -/atom/proc/add_mob_blood(mob/living/M) - var/list/blood_dna = M.get_blood_dna_list() - if(!blood_dna) - return FALSE - return add_blood_DNA(blood_dna, M.diseases) - -//to add blood onto something, with blood dna info to include. -/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - return FALSE - -/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - return transfer_blood_dna(blood_dna, diseases) - -/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - if(!.) - return - add_blood_overlay() - -/obj/item/proc/add_blood_overlay() - if(!blood_DNA.len) - return - if(initial(icon) && initial(icon_state)) - blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object - blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) - blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant - blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) - add_overlay(blood_splatter_icon) - -/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - . = ..() - transfer_blood = rand(2, 4) - -/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src - if(!B) - B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) - B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. - return TRUE //we bloodied the floor - -/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) - if(head) - head.add_blood_DNA(blood_dna, diseases) - update_inv_head() - else if(wear_mask) - wear_mask.add_blood_DNA(blood_dna, diseases) - update_inv_wear_mask() - if(wear_neck) - wear_neck.add_blood_DNA(blood_dna, diseases) - update_inv_neck() - if(wear_suit) - wear_suit.add_blood_DNA(blood_dna, diseases) - update_inv_wear_suit() - else if(w_uniform) - w_uniform.add_blood_DNA(blood_dna, diseases) - update_inv_w_uniform() - if(gloves) - var/obj/item/clothing/gloves/G = gloves - G.add_blood_DNA(blood_dna, diseases) - else - transfer_blood_dna(blood_dna, diseases) - bloody_hands = rand(2, 4) - update_inv_gloves() //handles bloody hands overlays and updating - return TRUE - -/atom/proc/blood_DNA_to_color() - var/list/colors = list()//first we make a list of all bloodtypes present - for(var/bloop in blood_DNA) - if(colors[blood_DNA[bloop]]) - colors[blood_DNA[bloop]]++ - else - colors[blood_DNA[bloop]] = 1 - - var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up - - if(colors.len) - var/sum = 0 //this is all shitcode, but it works; trust me - final_rgb = bloodtype_to_color(colors[1]) - sum = colors[colors[1]] - if(colors.len > 1) - var/i = 2 - while(i <= colors.len) - var/tmp = colors[colors[i]] - final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) - sum += tmp - i++ - - return final_rgb - -/atom/proc/clean_blood() - . = blood_DNA? TRUE : FALSE - blood_DNA = null - -/atom/proc/wash_cream() - return TRUE - -/atom/proc/isinspace() - if(isspaceturf(get_turf(src))) - return TRUE - else - return FALSE - -/atom/proc/handle_fall() - return - -/atom/proc/singularity_act() - return - -/atom/proc/singularity_pull(obj/singularity/S, current_size) - SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) - -/atom/proc/acid_act(acidpwr, acid_volume) - SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) - -/atom/proc/emag_act() - SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) - -/atom/proc/rad_act(strength) - if(istype(get_turf(src), /turf/open/pool)) - var/turf/open/pool/PL = get_turf(src) - if(PL.filled == TRUE) - strength *= 0.15 - SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) - -/atom/proc/narsie_act() - SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) - -/atom/proc/ratvar_act() - SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) - -/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) - return FALSE - -/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) - SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) - return FALSE - -/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) - if(GetComponent(/datum/component/storage)) - return component_storage_contents_dump_act(src_object, user) - return FALSE - -/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user) - var/list/things = src_object.contents() - var/datum/progressbar/progress = new(user, things.len, src) - var/datum/component/storage/STR = GetComponent(/datum/component/storage) - while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) - stoplag(1) - qdel(progress) - to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") - STR.orient2hud(user) - src_object.orient2hud(user) - if(user.active_storage) //refresh the HUD to show the transfered contents - user.active_storage.close(user) - user.active_storage.show_to(user) - return TRUE - -/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) - return null - -//This proc is called on the location of an atom when the atom is Destroy()'d -/atom/proc/handle_atom_del(atom/A) - SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) - -//called when the turf the atom resides on is ChangeTurfed -/atom/proc/HandleTurfChange(turf/T) - for(var/a in src) - var/atom/A = a - A.HandleTurfChange(T) - -//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) -/atom/proc/get_remote_view_fullscreens(mob/user) - return - -//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) -/atom/proc/update_remote_sight(mob/living/user) - return - - -//Hook for running code when a dir change occurs -/atom/proc/setDir(newdir) - SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) - dir = newdir - -/atom/proc/mech_melee_attack(obj/mecha/M) - return - -//If a mob logouts/logins in side of an object you can use this proc -/atom/proc/on_log(login) - if(loc) - loc.on_log(login) - - -/* - Atom Colour Priority System - A System that gives finer control over which atom colour to colour the atom with. - The "highest priority" one is always displayed as opposed to the default of - "whichever was set last is displayed" -*/ - - -/* - Adds an instance of colour_type to the atom's atom_colours list -*/ -/atom/proc/add_atom_colour(coloration, colour_priority) - if(!atom_colours || !atom_colours.len) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(!coloration) - return - if(colour_priority > atom_colours.len) - return - atom_colours[colour_priority] = coloration - update_atom_colour() - - -/* - Removes an instance of colour_type from the atom's atom_colours list -*/ -/atom/proc/remove_atom_colour(colour_priority, coloration) - if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - if(colour_priority > atom_colours.len) - return - if(coloration && atom_colours[colour_priority] != coloration) - return //if we don't have the expected color (for a specific priority) to remove, do nothing - atom_colours[colour_priority] = null - update_atom_colour() - - -/* - Resets the atom's color to null, and then sets it to the highest priority - colour available -*/ -/atom/proc/update_atom_colour() - if(!atom_colours) - atom_colours = list() - atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. - color = null - for(var/C in atom_colours) - if(islist(C)) - var/list/L = C - if(L.len) - color = L - return - else if(C) - color = C - return - -/atom/vv_edit_var(var_name, var_value) - if(!GLOB.Debug2) - flags_1 |= ADMIN_SPAWNED_1 - . = ..() - switch(var_name) - if("color") - add_atom_colour(color, ADMIN_COLOUR_PRIORITY) - -/atom/vv_get_dropdown() - . = ..() - . += "---" - var/turf/curturf = get_turf(src) - if (curturf) - .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" - .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]" - .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]" - .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]" - .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]" - -/atom/proc/drop_location() - var/atom/L = loc - if(!L) - return null - return L.AllowDrop() ? L : L.drop_location() - -/atom/Entered(atom/movable/AM, atom/oldLoc) - SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) - -/atom/Exit(atom/movable/AM, atom/newLoc) - . = ..() - if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT) - return FALSE - -/atom/Exited(atom/movable/AM, atom/newLoc) - SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) - -/atom/proc/return_temperature() - return - -// Tool behavior procedure. Redirects to tool-specific procs by default. -// You can override it to catch all tool interactions, for use in complex deconstruction procs. -// Just don't forget to return ..() in the end. -/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) - switch(tool_type) - if(TOOL_CROWBAR) - return crowbar_act(user, I) - if(TOOL_MULTITOOL) - return multitool_act(user, I) - if(TOOL_SCREWDRIVER) - return screwdriver_act(user, I) - if(TOOL_WRENCH) - return wrench_act(user, I) - if(TOOL_WIRECUTTER) - return wirecutter_act(user, I) - if(TOOL_WELDER) - return welder_act(user, I) - if(TOOL_ANALYZER) - return analyzer_act(user, I) - -// Tool-specific behavior procs. To be overridden in subtypes. -/atom/proc/crowbar_act(mob/living/user, obj/item/I) - return - -/atom/proc/multitool_act(mob/living/user, obj/item/I) - return - -/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) - if(!istype(I, /obj/item/multitool)) - if(user && !silent) - to_chat(user, "[I] has no data buffer!") - return FALSE - return TRUE - -/atom/proc/screwdriver_act(mob/living/user, obj/item/I) - SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) - -/atom/proc/wrench_act(mob/living/user, obj/item/I) - return - -/atom/proc/wirecutter_act(mob/living/user, obj/item/I) - return - -/atom/proc/welder_act(mob/living/user, obj/item/I) - return - -/atom/proc/analyzer_act(mob/living/user, obj/item/I) - return - -/atom/proc/GenerateTag() - return - -// Generic logging helper -/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) - if(!log_globally) - return - - var/log_text = "[key_name(src)] [message] [loc_name(src)]" - switch(message_type) - if(LOG_ATTACK) - log_attack(log_text) - if(LOG_SAY) - log_say(log_text) - if(LOG_WHISPER) - log_whisper(log_text) - if(LOG_EMOTE) - log_emote(log_text) - if(LOG_DSAY) - log_dsay(log_text) - if(LOG_PDA) - log_pda(log_text) - if(LOG_CHAT) - log_chat(log_text) - if(LOG_COMMENT) - log_comment(log_text) - if(LOG_TELECOMMS) - log_telecomms(log_text) - if(LOG_OOC) - log_ooc(log_text) - if(LOG_ADMIN) - log_admin(log_text) - if(LOG_ADMIN_PRIVATE) - log_admin_private(log_text) - if(LOG_ASAY) - log_adminsay(log_text) - if(LOG_OWNERSHIP) - log_game(log_text) - if(LOG_GAME) - log_game(log_text) - else - stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") - log_game(log_text) - -// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) -/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) - var/prefix = tag ? "([tag]) " : "" - var/suffix = forced_by ? " FORCED by [forced_by]" : "" - log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) - -// Helper for logging of messages with only one sender and receiver -/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) - if(!tag) - stack_trace("Unspecified tag for private message") - tag = "UNKNOWN" - - source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") - if(source != target) - target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) - -/* -Proc for attack log creation, because really why not -1 argument is the actor performing the action -2 argument is the target of the action -3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) -4 is a tool with which the action was made (usually an item) -5 is any additional text, which will be appended to the rest of the log line -*/ - -/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) - var/ssource = key_name(user) - var/starget = key_name(target) - - var/mob/living/living_target = target - var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" - - var/sobject = "" - if(object) - sobject = " with [key_name(object)]" - var/saddition = "" - if(addition) - saddition = " [addition]" - - var/postfix = "[sobject][saddition][hp]" - - var/message = "has [what_done] [starget][postfix]" - user.log_message(message, LOG_ATTACK, color="red") - - if(user != target) - var/reverse_message = "has been [what_done] by [ssource][postfix]" - target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) - -// Filter stuff -/atom/movable/proc/add_filter(name,priority,list/params) - if(!filter_data) - filter_data = list() - var/list/p = params.Copy() - p["priority"] = priority - filter_data[name] = p - update_filters() - -/atom/movable/proc/update_filters() - filters = null - sortTim(filter_data,associative = TRUE) - for(var/f in filter_data) - var/list/data = filter_data[f] - var/list/arguments = data.Copy() - arguments -= "priority" - filters += filter(arglist(arguments)) - -/atom/movable/proc/get_filter(name) - if(filter_data) - if(filter_data[name]) - return filters[filter_data.Find(name)] - -/atom/movable/proc/remove_filter(name) - if(filter_data) - if(filter_data[name]) - filter_data -= name - update_filters() - return TRUE - -/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) - . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) - -///Passes Stat Browser Panel clicks to the game and calls client click on an atom -/atom/Topic(href, list/href_list) - . = ..() - if(!usr?.client) - return - var/client/usr_client = usr.client - var/list/paramslist = list() - if(href_list["statpanel_item_shiftclick"]) - paramslist["shift"] = "1" - if(href_list["statpanel_item_ctrlclick"]) - paramslist["ctrl"] = "1" - if(href_list["statpanel_item_altclick"]) - paramslist["alt"] = "1" - if(href_list["statpanel_item_click"]) - // first of all make sure we valid - var/mouseparams = list2params(paramslist) - usr_client.Click(src, loc, null, mouseparams) +/atom + layer = TURF_LAYER + plane = GAME_PLANE + var/level = 2 + var/article // If non-null, overrides a/an/some in all cases + + var/flags_1 = NONE + var/interaction_flags_atom = NONE + var/datum/reagents/reagents = null + + //This atom's HUD (med/sec, etc) images. Associative list. + var/list/image/hud_list = null + //HUD images that this atom can provide. + var/list/hud_possible + + /// Last name used to calculate a color for the chatmessage overlays + var/chat_color_name + /// Last color calculated for the the chatmessage overlays + var/chat_color + /// A luminescence-shifted value of the last color calculated for chatmessage overlays + var/chat_color_darkened + + //Value used to increment ex_act() if reactionary_explosions is on + var/explosion_block = 0 + + var/list/atom_colours //used to store the different colors on an atom + //its inherent color, the colored paint applied on it, special color effect etc... + + var/list/priority_overlays //overlays that should remain on top and not normally removed when using cut_overlay functions, like c4. + var/list/remove_overlays // a very temporary list of overlays to remove + var/list/add_overlays // a very temporary list of overlays to add + + var/list/managed_vis_overlays //vis overlays managed by SSvis_overlays to automaticaly turn them like other overlays + ///overlays managed by update_overlays() to prevent removing overlays that weren't added by the same proc + var/list/managed_overlays + + var/datum/proximity_monitor/proximity_monitor + var/buckle_message_cooldown = 0 + var/fingerprintslast + + var/list/filter_data //For handling persistent filters + + var/datum/component/orbiter/orbiters + + var/rad_flags = NONE // Will move to flags_1 when i can be arsed to + var/rad_insulation = RAD_NO_INSULATION + + var/icon/blood_splatter_icon + var/icon/cum_splatter_icon + var/list/fingerprints + var/list/fingerprintshidden + var/list/blood_DNA + var/list/suit_fibers + +/atom/New(loc, ...) + //atom creation method that preloads variables at creation + if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() + world.preloader_load(src) + + if(datum_flags & DF_USE_TAG) + GenerateTag() + + var/do_initialize = SSatoms.initialized + if(do_initialize != INITIALIZATION_INSSATOMS) + args[1] = do_initialize == INITIALIZATION_INNEW_MAPLOAD + if(SSatoms.InitAtom(src, args)) + //we were deleted + return + +//Called after New if the map is being loaded. mapload = TRUE +//Called from base of New if the map is not being loaded. mapload = FALSE +//This base must be called or derivatives must set initialized to TRUE +//must not sleep +//Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +//Must return an Initialize hint. Defined in __DEFINES/subsystems.dm + +//Note: the following functions don't call the base for optimization and must copypasta: +// /turf/Initialize +// /turf/open/space/Initialize + +/atom/proc/Initialize(mapload, ...) + if(flags_1 & INITIALIZED_1) + stack_trace("Warning: [src]([type]) initialized multiple times!") + flags_1 |= INITIALIZED_1 + + //atom color stuff + if(color) + add_atom_colour(color, FIXED_COLOUR_PRIORITY) + + if (light_power && light_range) + update_light() + + if (opacity && isturf(loc)) + var/turf/T = loc + T.has_opaque_atom = TRUE // No need to recalculate it in this case, it's guaranteed to be on afterwards anyways. + + if (canSmoothWith) + canSmoothWith = typelist("canSmoothWith", canSmoothWith) + + ComponentInitialize() + + return INITIALIZE_HINT_NORMAL + +//called if Initialize returns INITIALIZE_HINT_LATELOAD +/atom/proc/LateInitialize() + return + +// Put your AddComponent() calls here +/atom/proc/ComponentInitialize() + return + +/atom/Destroy() + if(alternate_appearances) + for(var/K in alternate_appearances) + var/datum/atom_hud/alternate_appearance/AA = alternate_appearances[K] + AA.remove_from_hud(src) + + if(reagents) + qdel(reagents) + + LAZYCLEARLIST(overlays) + LAZYCLEARLIST(priority_overlays) + + QDEL_NULL(light) + + return ..() + +/atom/proc/handle_ricochet(obj/item/projectile/P) + return + +/atom/proc/CanPass(atom/movable/mover, turf/target) + return !density + +/atom/proc/onCentCom() + var/turf/T = get_turf(src) + if(!T) + return FALSE + + if(is_reserved_level(T.z)) + for(var/A in SSshuttle.mobile) + var/obj/docking_port/mobile/M = A + if(M.launch_status == ENDGAME_TRANSIT) + for(var/place in M.shuttle_areas) + var/area/shuttle/shuttle_area = place + if(T in shuttle_area) + return TRUE + + if(!is_centcom_level(T.z))//if not, don't bother + return FALSE + + //Check for centcom itself + if(istype(T.loc, /area/centcom)) + return TRUE + + //Check for centcom shuttles + for(var/A in SSshuttle.mobile) + var/obj/docking_port/mobile/M = A + if(M.launch_status == ENDGAME_LAUNCHED) + for(var/place in M.shuttle_areas) + var/area/shuttle/shuttle_area = place + if(T in shuttle_area) + return TRUE + +/atom/proc/onSyndieBase() + var/turf/T = get_turf(src) + if(!T) + return FALSE + + if(!is_centcom_level(T.z))//if not, don't bother + return FALSE + + if(istype(T.loc, /area/shuttle/syndicate) || istype(T.loc, /area/syndicate_mothership) || istype(T.loc, /area/shuttle/assault_pod)) + return TRUE + + return FALSE + +/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) + if(does_attack_animation) + user.changeNext_move(CLICK_CD_MELEE) + log_combat(user, src, "punched", "hulk powers") + user.do_attack_animation(src, ATTACK_EFFECT_SMASH) + +/atom/proc/CheckParts(list/parts_list) + for(var/A in parts_list) + if(istype(A, /datum/reagent)) + if(!reagents) + reagents = new() + reagents.reagent_list.Add(A) + reagents.conditional_update() + else if(ismovableatom(A)) + var/atom/movable/M = A + if(isliving(M.loc)) + var/mob/living/L = M.loc + L.transferItemToLoc(M, src) + else + M.forceMove(src) + +//common name +/atom/proc/update_multiz(prune_on_fail = FALSE) + return FALSE + +/atom/proc/assume_air(datum/gas_mixture/giver) + qdel(giver) + return null + +/atom/proc/remove_air(amount) + return null + +/atom/proc/return_air() + if(loc) + return loc.return_air() + else + return null + +/atom/proc/check_eye(mob/user) + return + +/atom/proc/Bumped(atom/movable/AM) + set waitfor = FALSE + +// Convenience procs to see if a container is open for chemistry handling +/atom/proc/is_open_container() + return is_refillable() && is_drainable() + +/atom/proc/is_injectable(allowmobs = TRUE) + return reagents && (reagents.reagents_holder_flags & (INJECTABLE | REFILLABLE)) + +/atom/proc/is_drawable(allowmobs = TRUE) + return reagents && (reagents.reagents_holder_flags & (DRAWABLE | DRAINABLE)) + +/atom/proc/is_refillable() + return reagents && (reagents.reagents_holder_flags & REFILLABLE) + +/atom/proc/is_drainable() + return reagents && (reagents.reagents_holder_flags & DRAINABLE) + + +/atom/proc/AllowDrop() + return FALSE + +/atom/proc/CheckExit() + return TRUE + +/atom/proc/HasProximity(atom/movable/AM as mob|obj) + return + +/atom/proc/emp_act(severity) + var/protection = SEND_SIGNAL(src, COMSIG_ATOM_EMP_ACT, severity) + if(!(protection & EMP_PROTECT_WIRES) && istype(wires)) + wires.emp_pulse() + return protection // Pass the protection value collected here upwards + +/atom/proc/bullet_act(obj/item/projectile/P, def_zone) + SEND_SIGNAL(src, COMSIG_ATOM_BULLET_ACT, P, def_zone) + . = P.on_hit(src, 0, def_zone) + +//used on altdisarm() for special interactions between the shoved victim (target) and the src, with user being the one shoving the target on it. +// IMPORTANT: if you wish to add a new own shove_act() to a certain object, remember to add SHOVABLE_ONTO to its obj_flags bitfied var first. +/atom/proc/shove_act(mob/living/target, mob/living/user) + return FALSE + +/atom/proc/in_contents_of(container)//can take class or object instance as argument + if(ispath(container)) + if(istype(src.loc, container)) + return TRUE + else if(src in container) + return TRUE + return FALSE + +/atom/proc/update_overlaysb() + SHOULD_CALL_PARENT(1) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + +/atom/proc/update_iconb() + var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + update_icon_state() + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) + var/list/new_overlays = update_overlaysb() + if(managed_overlays) + cut_overlay(managed_overlays) + managed_overlays = null + if(length(new_overlays)) + managed_overlays = new_overlays + add_overlay(new_overlays) + +/atom/proc/get_examine_name(mob/user) + . = "\a [src]" + var/list/override = list(gender == PLURAL ? "some" : "a", " ", "[name]") + if(article) + . = "[article] [src]" + override[EXAMINE_POSITION_ARTICLE] = article + + var/should_override = FALSE + + if(SEND_SIGNAL(src, COMSIG_ATOM_GET_EXAMINE_NAME, user, override) & COMPONENT_EXNAME_CHANGED) + should_override = TRUE + + + if(blood_DNA && !istype(src, /obj/effect/decal)) + override[EXAMINE_POSITION_BEFORE] = " blood-stained " + should_override = TRUE + + if(should_override) + . = override.Join("") + +///Generate the full examine string of this atom (including icon for goonchat) +/atom/proc/get_examine_string(mob/user, thats = FALSE) + return "[icon2html(src, user)] [thats? "That's ":""][get_examine_name(user)]" + +/atom/proc/examine(mob/user) + . = list("[get_examine_string(user, TRUE)].") + + if(!isliving(src)) + user.visible_message("[user] examines [src].",\ + "You examine [src].") + if(desc) + . += desc + + if(reagents) + if(reagents.reagents_holder_flags & TRANSPARENT) + . += "It contains:" + if(length(reagents.reagent_list)) + if(user.can_see_reagents()) //Show each individual reagent + for(var/datum/reagent/R in reagents.reagent_list) + . += "[R.volume] units of [R.name]" + else //Otherwise, just show the total volume + var/total_volume = 0 + for(var/datum/reagent/R in reagents.reagent_list) + total_volume += R.volume + . += "[total_volume] units of various reagents" + else + . += "Nothing." + else if(reagents.reagents_holder_flags & AMOUNT_VISIBLE) + if(reagents.total_volume) + . += "It has [reagents.total_volume] unit\s left." + else + . += "It's empty." + SEND_SIGNAL(src, COMSIG_PARENT_EXAMINE, user, .) + +/// Updates the icon of the atom +/atom/proc/update_icon() + // I expect we're going to need more return flags and options in this proc + var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + update_icon_state() + + if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) + var/list/new_overlays = update_overlays() + if(managed_overlays) + cut_overlay(managed_overlays) + managed_overlays = null + if(length(new_overlays)) + managed_overlays = new_overlays + add_overlay(new_overlays) + +/// Updates the icon state of the atom +/atom/proc/update_icon_state() + +/// Updates the overlays of the atom +/atom/proc/update_overlays() + SHOULD_CALL_PARENT(1) + . = list() + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + +/atom/proc/relaymove(mob/user) + if(buckle_message_cooldown <= world.time) + buckle_message_cooldown = world.time + 50 + to_chat(user, "You can't move while buckled to [src]!") + return + +/atom/proc/contents_explosion(severity, target) + return //For handling the effects of explosions on contents that would not normally be effected + +/atom/proc/ex_act(severity, target) + set waitfor = FALSE + contents_explosion(severity, target) + SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) + +/atom/proc/blob_act(obj/structure/blob/B) + SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) + return + +/atom/proc/fire_act(exposed_temperature, exposed_volume) + SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) + return + +/atom/proc/hitby(atom/movable/AM, skipcatch, hitpush, blocked, datum/thrownthing/throwingdatum) + if(density && !has_gravity(AM)) //thrown stuff bounces off dense stuff in no grav, unless the thrown stuff ends up inside what it hit(embedding, bola, etc...). + addtimer(CALLBACK(src, .proc/hitby_react, AM), 2) + +/atom/proc/hitby_react(atom/movable/AM) + if(AM && isturf(AM.loc)) + step(AM, turn(AM.dir, 180)) + +/atom/proc/handle_slip(mob/living/carbon/C, knockdown_amount, obj/O, lube) + return + +//returns the mob's dna info as a list, to be inserted in an object's blood_DNA list +/mob/living/proc/get_blood_dna_list() + var/blood_id = get_blood_id() + if(!(blood_id in GLOB.blood_reagent_types)) + return + return list("ANIMAL DNA" = "Y-") + +/mob/living/carbon/get_blood_dna_list() + var/blood_id = get_blood_id() + if(!(blood_id in GLOB.blood_reagent_types)) + return + var/list/blood_dna = list() + if(dna) + blood_dna[dna.unique_enzymes] = dna.blood_type + else + blood_dna["UNKNOWN DNA"] = "X*" + return blood_dna + +/mob/living/carbon/alien/get_blood_dna_list() + return list("UNKNOWN DNA" = "X*") + +//to add a mob's dna info into an object's blood_DNA list. +/atom/proc/transfer_mob_blood_dna(mob/living/L) + // Returns 0 if we have that blood already + var/new_blood_dna = L.get_blood_dna_list() + if(!new_blood_dna) + return FALSE + LAZYINITLIST(blood_DNA) //if our list of DNA doesn't exist yet, initialise it. + var/old_length = blood_DNA.len + blood_DNA |= new_blood_dna + if(blood_DNA.len == old_length) + return FALSE + return TRUE + +//to add blood dna info to the object's blood_DNA list +/atom/proc/transfer_blood_dna(list/blood_dna, list/datum/disease/diseases) + LAZYINITLIST(blood_DNA) + var/old_length = blood_DNA.len + blood_DNA |= blood_dna + if(blood_DNA.len > old_length) + return TRUE + //some new blood DNA was added + +//to add blood from a mob onto something, and transfer their dna info +/atom/proc/add_mob_blood(mob/living/M) + var/list/blood_dna = M.get_blood_dna_list() + if(!blood_dna) + return FALSE + return add_blood_DNA(blood_dna, M.diseases) + +//to add blood onto something, with blood dna info to include. +/atom/proc/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return FALSE + +/obj/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + return transfer_blood_dna(blood_dna, diseases) + +/obj/item/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + if(!.) + return + add_blood_overlay() + +/obj/item/proc/add_blood_overlay() + if(!blood_DNA.len) + return + if(initial(icon) && initial(icon_state)) + blood_splatter_icon = icon(initial(icon), initial(icon_state), , 1) //we only want to apply blood-splatters to the initial icon_state for each object + blood_splatter_icon.Blend("#fff", ICON_ADD) //fills the icon_state with white (except where it's transparent) + blood_splatter_icon.Blend(icon('icons/effects/blood.dmi', "itemblood"), ICON_MULTIPLY) //adds blood and the remaining white areas become transparant + blood_splatter_icon.Blend(blood_DNA_to_color(), ICON_MULTIPLY) + add_overlay(blood_splatter_icon) + +/obj/item/clothing/gloves/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + . = ..() + transfer_blood = rand(2, 4) + +/turf/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + var/obj/effect/decal/cleanable/blood/splatter/B = locate() in src + if(!B) + B = new /obj/effect/decal/cleanable/blood/splatter(src, diseases) + B.transfer_blood_dna(blood_dna, diseases) //give blood info to the blood decal. + return TRUE //we bloodied the floor + +/mob/living/carbon/human/add_blood_DNA(list/blood_dna, list/datum/disease/diseases) + if(head) + head.add_blood_DNA(blood_dna, diseases) + update_inv_head() + else if(wear_mask) + wear_mask.add_blood_DNA(blood_dna, diseases) + update_inv_wear_mask() + if(wear_neck) + wear_neck.add_blood_DNA(blood_dna, diseases) + update_inv_neck() + if(wear_suit) + wear_suit.add_blood_DNA(blood_dna, diseases) + update_inv_wear_suit() + else if(w_uniform) + w_uniform.add_blood_DNA(blood_dna, diseases) + update_inv_w_uniform() + if(gloves) + var/obj/item/clothing/gloves/G = gloves + G.add_blood_DNA(blood_dna, diseases) + else + transfer_blood_dna(blood_dna, diseases) + bloody_hands = rand(2, 4) + update_inv_gloves() //handles bloody hands overlays and updating + return TRUE + +/atom/proc/blood_DNA_to_color() + var/list/colors = list()//first we make a list of all bloodtypes present + for(var/bloop in blood_DNA) + if(colors[blood_DNA[bloop]]) + colors[blood_DNA[bloop]]++ + else + colors[blood_DNA[bloop]] = 1 + + var/final_rgb = BLOOD_COLOR_HUMAN //a default so we don't have white blood graphics if something messed up + + if(colors.len) + var/sum = 0 //this is all shitcode, but it works; trust me + final_rgb = bloodtype_to_color(colors[1]) + sum = colors[colors[1]] + if(colors.len > 1) + var/i = 2 + while(i <= colors.len) + var/tmp = colors[colors[i]] + final_rgb = BlendRGB(final_rgb, bloodtype_to_color(colors[i]), tmp/(tmp+sum)) + sum += tmp + i++ + + return final_rgb + +/atom/proc/clean_blood() + . = blood_DNA? TRUE : FALSE + blood_DNA = null + +/atom/proc/wash_cream() + return TRUE + +/atom/proc/isinspace() + if(isspaceturf(get_turf(src))) + return TRUE + else + return FALSE + +/atom/proc/handle_fall() + return + +/atom/proc/singularity_act() + return + +/atom/proc/singularity_pull(obj/singularity/S, current_size) + SEND_SIGNAL(src, COMSIG_ATOM_SING_PULL, S, current_size) + +/atom/proc/acid_act(acidpwr, acid_volume) + SEND_SIGNAL(src, COMSIG_ATOM_ACID_ACT, acidpwr, acid_volume) + +/atom/proc/emag_act() + SEND_SIGNAL(src, COMSIG_ATOM_EMAG_ACT) + +/atom/proc/rad_act(strength) + if(istype(get_turf(src), /turf/open/pool)) + var/turf/open/pool/PL = get_turf(src) + if(PL.filled == TRUE) + strength *= 0.15 + SEND_SIGNAL(src, COMSIG_ATOM_RAD_ACT, strength) + +/atom/proc/narsie_act() + SEND_SIGNAL(src, COMSIG_ATOM_NARSIE_ACT) + +/atom/proc/ratvar_act() + SEND_SIGNAL(src, COMSIG_ATOM_RATVAR_ACT) + +/atom/proc/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) + return FALSE + +/atom/proc/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) + SEND_SIGNAL(src, COMSIG_ATOM_RCD_ACT, user, the_rcd, passed_mode) + return FALSE + +/atom/proc/storage_contents_dump_act(obj/item/storage/src_object, mob/user) + if(GetComponent(/datum/component/storage)) + return component_storage_contents_dump_act(src_object, user) + return FALSE + +/atom/proc/component_storage_contents_dump_act(datum/component/storage/src_object, mob/user) + var/list/things = src_object.contents() + var/datum/progressbar/progress = new(user, things.len, src) + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + while (do_after(user, 10, TRUE, src, FALSE, CALLBACK(STR, /datum/component/storage.proc/handle_mass_item_insertion, things, src_object, user, progress))) + stoplag(1) + qdel(progress) + to_chat(user, "You dump as much of [src_object.parent]'s contents into [STR.insert_preposition]to [src] as you can.") + STR.orient2hud(user) + src_object.orient2hud(user) + if(user.active_storage) //refresh the HUD to show the transfered contents + user.active_storage.close(user) + user.active_storage.show_to(user) + return TRUE + +/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) + return null + +//This proc is called on the location of an atom when the atom is Destroy()'d +/atom/proc/handle_atom_del(atom/A) + SEND_SIGNAL(src, COMSIG_ATOM_CONTENTS_DEL, A) + +//called when the turf the atom resides on is ChangeTurfed +/atom/proc/HandleTurfChange(turf/T) + for(var/a in src) + var/atom/A = a + A.HandleTurfChange(T) + +//the vision impairment to give to the mob whose perspective is set to that atom (e.g. an unfocused camera giving you an impaired vision when looking through it) +/atom/proc/get_remote_view_fullscreens(mob/user) + return + +//the sight changes to give to the mob whose perspective is set to that atom (e.g. A mob with nightvision loses its nightvision while looking through a normal camera) +/atom/proc/update_remote_sight(mob/living/user) + return + + +//Hook for running code when a dir change occurs +/atom/proc/setDir(newdir) + SEND_SIGNAL(src, COMSIG_ATOM_DIR_CHANGE, dir, newdir) + dir = newdir + +/atom/proc/mech_melee_attack(obj/mecha/M) + return + +//If a mob logouts/logins in side of an object you can use this proc +/atom/proc/on_log(login) + if(loc) + loc.on_log(login) + + +/* + Atom Colour Priority System + A System that gives finer control over which atom colour to colour the atom with. + The "highest priority" one is always displayed as opposed to the default of + "whichever was set last is displayed" +*/ + + +/* + Adds an instance of colour_type to the atom's atom_colours list +*/ +/atom/proc/add_atom_colour(coloration, colour_priority) + if(!atom_colours || !atom_colours.len) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(!coloration) + return + if(colour_priority > atom_colours.len) + return + atom_colours[colour_priority] = coloration + update_atom_colour() + + +/* + Removes an instance of colour_type from the atom's atom_colours list +*/ +/atom/proc/remove_atom_colour(colour_priority, coloration) + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + if(colour_priority > atom_colours.len) + return + if(coloration && atom_colours[colour_priority] != coloration) + return //if we don't have the expected color (for a specific priority) to remove, do nothing + atom_colours[colour_priority] = null + update_atom_colour() + + +/* + Resets the atom's color to null, and then sets it to the highest priority + colour available +*/ +/atom/proc/update_atom_colour() + if(!atom_colours) + atom_colours = list() + atom_colours.len = COLOUR_PRIORITY_AMOUNT //four priority levels currently. + color = null + for(var/C in atom_colours) + if(islist(C)) + var/list/L = C + if(L.len) + color = L + return + else if(C) + color = C + return + +/atom/vv_edit_var(var_name, var_value) + if(!GLOB.Debug2) + flags_1 |= ADMIN_SPAWNED_1 + . = ..() + switch(var_name) + if("color") + add_atom_colour(color, ADMIN_COLOUR_PRIORITY) + +/atom/vv_get_dropdown() + . = ..() + . += "---" + var/turf/curturf = get_turf(src) + if (curturf) + .["Jump to"] = "?_src_=holder;[HrefToken()];adminplayerobservecoodjump=1;X=[curturf.x];Y=[curturf.y];Z=[curturf.z]" + .["Modify Transform"] = "?_src_=vars;[HrefToken()];modtransform=[REF(src)]" + .["Add reagent"] = "?_src_=vars;[HrefToken()];addreagent=[REF(src)]" + .["Trigger EM pulse"] = "?_src_=vars;[HrefToken()];emp=[REF(src)]" + .["Trigger explosion"] = "?_src_=vars;[HrefToken()];explode=[REF(src)]" + +/atom/proc/drop_location() + var/atom/L = loc + if(!L) + return null + return L.AllowDrop() ? L : L.drop_location() + +/atom/Entered(atom/movable/AM, atom/oldLoc) + SEND_SIGNAL(src, COMSIG_ATOM_ENTERED, AM, oldLoc) + +/atom/Exit(atom/movable/AM, atom/newLoc) + . = ..() + if(SEND_SIGNAL(src, COMSIG_ATOM_EXIT, AM, newLoc) & COMPONENT_ATOM_BLOCK_EXIT) + return FALSE + +/atom/Exited(atom/movable/AM, atom/newLoc) + SEND_SIGNAL(src, COMSIG_ATOM_EXITED, AM, newLoc) + +/atom/proc/return_temperature() + return + +// Tool behavior procedure. Redirects to tool-specific procs by default. +// You can override it to catch all tool interactions, for use in complex deconstruction procs. +// Just don't forget to return ..() in the end. +/atom/proc/tool_act(mob/living/user, obj/item/I, tool_type) + switch(tool_type) + if(TOOL_CROWBAR) + return crowbar_act(user, I) + if(TOOL_MULTITOOL) + return multitool_act(user, I) + if(TOOL_SCREWDRIVER) + return screwdriver_act(user, I) + if(TOOL_WRENCH) + return wrench_act(user, I) + if(TOOL_WIRECUTTER) + return wirecutter_act(user, I) + if(TOOL_WELDER) + return welder_act(user, I) + if(TOOL_ANALYZER) + return analyzer_act(user, I) + +// Tool-specific behavior procs. To be overridden in subtypes. +/atom/proc/crowbar_act(mob/living/user, obj/item/I) + return + +/atom/proc/multitool_act(mob/living/user, obj/item/I) + return + +/atom/proc/multitool_check_buffer(user, obj/item/I, silent = FALSE) + if(!istype(I, /obj/item/multitool)) + if(user && !silent) + to_chat(user, "[I] has no data buffer!") + return FALSE + return TRUE + +/atom/proc/screwdriver_act(mob/living/user, obj/item/I) + SEND_SIGNAL(src, COMSIG_ATOM_SCREWDRIVER_ACT, user, I) + +/atom/proc/wrench_act(mob/living/user, obj/item/I) + return + +/atom/proc/wirecutter_act(mob/living/user, obj/item/I) + return + +/atom/proc/welder_act(mob/living/user, obj/item/I) + return + +/atom/proc/analyzer_act(mob/living/user, obj/item/I) + return + +/atom/proc/GenerateTag() + return + +// Generic logging helper +/atom/proc/log_message(message, message_type, color=null, log_globally=TRUE) + if(!log_globally) + return + + var/log_text = "[key_name(src)] [message] [loc_name(src)]" + switch(message_type) + if(LOG_ATTACK) + log_attack(log_text) + if(LOG_SAY) + log_say(log_text) + if(LOG_WHISPER) + log_whisper(log_text) + if(LOG_EMOTE) + log_emote(log_text) + if(LOG_DSAY) + log_dsay(log_text) + if(LOG_PDA) + log_pda(log_text) + if(LOG_CHAT) + log_chat(log_text) + if(LOG_COMMENT) + log_comment(log_text) + if(LOG_TELECOMMS) + log_telecomms(log_text) + if(LOG_OOC) + log_ooc(log_text) + if(LOG_ADMIN) + log_admin(log_text) + if(LOG_ADMIN_PRIVATE) + log_admin_private(log_text) + if(LOG_ASAY) + log_adminsay(log_text) + if(LOG_OWNERSHIP) + log_game(log_text) + if(LOG_GAME) + log_game(log_text) + else + stack_trace("Invalid individual logging type: [message_type]. Defaulting to [LOG_GAME] (LOG_GAME).") + log_game(log_text) + +// Helper for logging chat messages or other logs with arbitrary inputs (e.g. announcements) +/atom/proc/log_talk(message, message_type, tag=null, log_globally=TRUE, forced_by=null) + var/prefix = tag ? "([tag]) " : "" + var/suffix = forced_by ? " FORCED by [forced_by]" : "" + log_message("[prefix]\"[message]\"[suffix]", message_type, log_globally=log_globally) + +// Helper for logging of messages with only one sender and receiver +/proc/log_directed_talk(atom/source, atom/target, message, message_type, tag) + if(!tag) + stack_trace("Unspecified tag for private message") + tag = "UNKNOWN" + + source.log_talk(message, message_type, tag="[tag] to [key_name(target)]") + if(source != target) + target.log_talk(message, message_type, tag="[tag] from [key_name(source)]", log_globally=FALSE) + +/* +Proc for attack log creation, because really why not +1 argument is the actor performing the action +2 argument is the target of the action +3 is a verb describing the action (e.g. punched, throwed, kicked, etc.) +4 is a tool with which the action was made (usually an item) +5 is any additional text, which will be appended to the rest of the log line +*/ + +/proc/log_combat(atom/user, atom/target, what_done, atom/object=null, addition=null) + var/ssource = key_name(user) + var/starget = key_name(target) + + var/mob/living/living_target = target + var/hp = istype(living_target) ? " (NEWHP: [living_target.health]) " : "" + + var/sobject = "" + if(object) + sobject = " with [key_name(object)]" + var/saddition = "" + if(addition) + saddition = " [addition]" + + var/postfix = "[sobject][saddition][hp]" + + var/message = "has [what_done] [starget][postfix]" + user.log_message(message, LOG_ATTACK, color="red") + + if(user != target) + var/reverse_message = "has been [what_done] by [ssource][postfix]" + target.log_message(reverse_message, LOG_ATTACK, color="orange", log_globally=FALSE) + +// Filter stuff +/atom/movable/proc/add_filter(name,priority,list/params) + if(!filter_data) + filter_data = list() + var/list/p = params.Copy() + p["priority"] = priority + filter_data[name] = p + update_filters() + +/atom/movable/proc/update_filters() + filters = null + sortTim(filter_data,associative = TRUE) + for(var/f in filter_data) + var/list/data = filter_data[f] + var/list/arguments = data.Copy() + arguments -= "priority" + filters += filter(arglist(arguments)) + +/atom/movable/proc/get_filter(name) + if(filter_data) + if(filter_data[name]) + return filters[filter_data.Find(name)] + +/atom/movable/proc/remove_filter(name) + if(filter_data) + if(filter_data[name]) + filter_data -= name + update_filters() + return TRUE + +/atom/proc/intercept_zImpact(atom/movable/AM, levels = 1) + . |= SEND_SIGNAL(src, COMSIG_ATOM_INTERCEPT_Z_FALL, AM, levels) + +///Passes Stat Browser Panel clicks to the game and calls client click on an atom +/atom/Topic(href, list/href_list) + . = ..() + if(!usr?.client) + return + var/client/usr_client = usr.client + var/list/paramslist = list() + if(href_list["statpanel_item_shiftclick"]) + paramslist["shift"] = "1" + if(href_list["statpanel_item_ctrlclick"]) + paramslist["ctrl"] = "1" + if(href_list["statpanel_item_altclick"]) + paramslist["alt"] = "1" + if(href_list["statpanel_item_click"]) + // first of all make sure we valid + var/mouseparams = list2params(paramslist) + usr_client.Click(src, loc, null, mouseparams) diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 5e170058..f8aad894 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -1,265 +1,266 @@ -/obj/machinery/button - name = "button" - desc = "A remote control switch." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "doorctrl" - var/skin = "doorctrl" - power_channel = ENVIRON - var/obj/item/assembly/device - var/obj/item/electronics/airlock/board - var/device_type = null - var/id = null - var/initialized_button = 0 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70) - use_power = IDLE_POWER_USE - idle_power_usage = 2 - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF - -/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0) - . = ..() - if(built) - setDir(ndir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) - pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 - panel_open = TRUE - update_icon() - - - if(!built && !device && device_type) - device = new device_type(src) - - src.check_access(null) - - if(req_access.len || req_one_access.len) - board = new(src) - if(req_access.len) - board.accesses = req_access - else - board.one_access = 1 - board.accesses = req_one_access - - -/obj/machinery/button/update_icon() - cut_overlays() - if(panel_open) - icon_state = "button-open" - if(device) - add_overlay("button-device") - if(board) - add_overlay("button-board") - - else - if(stat & (NOPOWER|BROKEN)) - icon_state = "[skin]-p" - else - icon_state = skin - -/obj/machinery/button/attackby(obj/item/W, mob/user, params) - if(istype(W, /obj/item/screwdriver)) - if(panel_open || allowed(user)) - default_deconstruction_screwdriver(user, "button-open", "[skin]",W) - update_icon() - else - to_chat(user, "Maintenance Access Denied") - flick("[skin]-denied", src) - return - - if(panel_open) - if(!device && istype(W, /obj/item/assembly)) - if(!user.transferItemToLoc(W, src)) - to_chat(user, "\The [W] is stuck to you!") - return - device = W - to_chat(user, "You add [W] to the button.") - - if(!board && istype(W, /obj/item/electronics/airlock)) - if(!user.transferItemToLoc(W, src)) - to_chat(user, "\The [W] is stuck to you!") - return - board = W - if(board.one_access) - req_one_access = board.accesses - else - req_access = board.accesses - to_chat(user, "You add [W] to the button.") - - if(!device && !board && istype(W, /obj/item/wrench)) - to_chat(user, "You start unsecuring the button frame...") - W.play_tool_sound(src) - if(W.use_tool(src, user, 40)) - to_chat(user, "You unsecure the button frame.") - transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) - playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) - qdel(src) - - update_icon() - return - - if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON)) - return attack_hand(user) - else - return ..() - -/obj/machinery/button/emag_act(mob/user) - if(obj_flags & EMAGGED) - return - req_access = list() - req_one_access = list() - playsound(src, "sparks", 100, 1) - obj_flags |= EMAGGED - -/obj/machinery/button/attack_ai(mob/user) - if(!panel_open) - return attack_hand(user) - -/obj/machinery/button/attack_robot(mob/user) - return attack_ai(user) - -/obj/machinery/button/proc/setup_device() - if(id && istype(device, /obj/item/assembly/control)) - var/obj/item/assembly/control/A = device - A.id = id - initialized_button = 1 - -/obj/machinery/button/attack_hand(mob/user) - . = ..() - if(.) - return - if(!initialized_button) - setup_device() - add_fingerprint(user) - if(panel_open) - if(device || board) - if(device) - device.forceMove(drop_location()) - device = null - if(board) - board.forceMove(drop_location()) - req_access = list() - req_one_access = list() - board = null - update_icon() - to_chat(user, "You remove electronics from the button frame.") - - else - if(skin == "doorctrl") - skin = "launcher" - else - skin = "doorctrl" - to_chat(user, "You change the button frame's front panel.") - return - - if((stat & (NOPOWER|BROKEN))) - return - - if(device && device.next_activate > world.time) - return - - if(!allowed(user)) - to_chat(user, "Access Denied") - flick("[skin]-denied", src) - return - - use_power(5) - icon_state = "[skin]1" - - if(device) - device.pulsed() - - addtimer(CALLBACK(src, .proc/update_icon), 15) - -/obj/machinery/button/power_change() - ..() - update_icon() - - -/obj/machinery/button/door - name = "door button" - desc = "A door remote control switch." - var/normaldoorcontrol = FALSE - var/specialfunctions = OPEN // Bitflag, see assembly file - -/obj/machinery/button/door/setup_device() - if(!device) - if(normaldoorcontrol) - var/obj/item/assembly/control/airlock/A = new(src) - device = A - A.specialfunctions = specialfunctions - else - device = new /obj/item/assembly/control(src) - ..() - -/obj/machinery/button/door/incinerator_vent_toxmix - name = "combustion chamber vent control" - id = INCINERATOR_TOXMIX_VENT - req_access = list(ACCESS_TOX) - -/obj/machinery/button/door/incinerator_vent_atmos_main - name = "turbine vent control" - id = INCINERATOR_ATMOS_MAINVENT - req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) - -/obj/machinery/button/door/incinerator_vent_atmos_aux - name = "combustion chamber vent control" - id = INCINERATOR_ATMOS_AUXVENT - req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) - -/obj/machinery/button/door/incinerator_vent_syndicatelava_main - name = "turbine vent control" - id = INCINERATOR_SYNDICATELAVA_MAINVENT - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/button/door/incinerator_vent_syndicatelava_aux - name = "combustion chamber vent control" - id = INCINERATOR_SYNDICATELAVA_AUXVENT - req_access = list(ACCESS_SYNDICATE) - -/obj/machinery/button/massdriver - name = "mass driver button" - desc = "A remote control switch for a mass driver." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/massdriver - -/obj/machinery/button/ignition - name = "ignition switch" - desc = "A remote control switch for a mounted igniter." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/igniter - -/obj/machinery/button/ignition/incinerator - name = "combustion chamber ignition switch" - desc = "A remote control switch for the combustion chamber's igniter." - -/obj/machinery/button/ignition/incinerator/toxmix - id = INCINERATOR_TOXMIX_IGNITER - -/obj/machinery/button/ignition/incinerator/atmos - id = INCINERATOR_ATMOS_IGNITER - -/obj/machinery/button/ignition/incinerator/syndicatelava - id = INCINERATOR_SYNDICATELAVA_IGNITER - -/obj/machinery/button/flasher - name = "flasher button" - desc = "A remote control switch for a mounted flasher." - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/flasher - -/obj/machinery/button/crematorium - name = "crematorium igniter" - desc = "Burn baby burn!" - icon_state = "launcher" - skin = "launcher" - device_type = /obj/item/assembly/control/crematorium - req_access = list() - id = 1 - -/obj/item/wallframe/button - name = "button frame" - desc = "Used for building buttons." - icon_state = "button" - result_path = /obj/machinery/button - materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT) +/obj/machinery/button + name = "button" + desc = "A remote control switch." + icon = 'icons/obj/stationobjs.dmi' + icon_state = "doorctrl" + var/skin = "doorctrl" + power_channel = ENVIRON + var/obj/item/assembly/device + var/obj/item/electronics/airlock/board + var/device_type = null + var/id = null + var/initialized_button = 0 + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 50, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 70) + use_power = IDLE_POWER_USE + idle_power_usage = 2 + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + +/obj/machinery/button/Initialize(mapload, ndir = 0, built = 0) + . = ..() + if(built) + setDir(ndir) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) + pixel_y = (dir & 3)? (dir ==1 ? -24 : 24) : 0 + panel_open = TRUE + update_icon() + + + if(!built && !device && device_type) + device = new device_type(src) + + src.check_access(null) + + if(req_access.len || req_one_access.len) + board = new(src) + if(req_access.len) + board.accesses = req_access + else + board.one_access = 1 + board.accesses = req_one_access + +/obj/machinery/button/update_icon_state() + if(panel_open) + icon_state = "button-open" + else if(stat & (NOPOWER|BROKEN)) + icon_state = "[skin]-p" + else + icon_state = skin + +/obj/machinery/button/update_overlays() + . = ..() + if(!panel_open) + return + if(device) + . += "button-device" + if(board) + . += "button-board" + +/obj/machinery/button/attackby(obj/item/W, mob/user, params) + if(istype(W, /obj/item/screwdriver)) + if(panel_open || allowed(user)) + default_deconstruction_screwdriver(user, "button-open", "[skin]",W) + update_icon() + else + to_chat(user, "Maintenance Access Denied") + flick("[skin]-denied", src) + return + + if(panel_open) + if(!device && istype(W, /obj/item/assembly)) + if(!user.transferItemToLoc(W, src)) + to_chat(user, "\The [W] is stuck to you!") + return + device = W + to_chat(user, "You add [W] to the button.") + + if(!board && istype(W, /obj/item/electronics/airlock)) + if(!user.transferItemToLoc(W, src)) + to_chat(user, "\The [W] is stuck to you!") + return + board = W + if(board.one_access) + req_one_access = board.accesses + else + req_access = board.accesses + to_chat(user, "You add [W] to the button.") + + if(!device && !board && istype(W, /obj/item/wrench)) + to_chat(user, "You start unsecuring the button frame...") + W.play_tool_sound(src) + if(W.use_tool(src, user, 40)) + to_chat(user, "You unsecure the button frame.") + transfer_fingerprints_to(new /obj/item/wallframe/button(get_turf(src))) + playsound(loc, 'sound/items/deconstruct.ogg', 50, 1) + qdel(src) + + update_icon() + return + + if(user.a_intent != INTENT_HARM && !(W.item_flags & NOBLUDGEON)) + return attack_hand(user) + else + return ..() + +/obj/machinery/button/emag_act(mob/user) + if(obj_flags & EMAGGED) + return + req_access = list() + req_one_access = list() + playsound(src, "sparks", 100, 1) + obj_flags |= EMAGGED + +/obj/machinery/button/attack_ai(mob/user) + if(!panel_open) + return attack_hand(user) + +/obj/machinery/button/attack_robot(mob/user) + return attack_ai(user) + +/obj/machinery/button/proc/setup_device() + if(id && istype(device, /obj/item/assembly/control)) + var/obj/item/assembly/control/A = device + A.id = id + initialized_button = 1 + +/obj/machinery/button/attack_hand(mob/user) + . = ..() + if(.) + return + if(!initialized_button) + setup_device() + add_fingerprint(user) + if(panel_open) + if(device || board) + if(device) + device.forceMove(drop_location()) + device = null + if(board) + board.forceMove(drop_location()) + req_access = list() + req_one_access = list() + board = null + update_icon() + to_chat(user, "You remove electronics from the button frame.") + + else + if(skin == "doorctrl") + skin = "launcher" + else + skin = "doorctrl" + to_chat(user, "You change the button frame's front panel.") + return + + if((stat & (NOPOWER|BROKEN))) + return + + if(device && device.next_activate > world.time) + return + + if(!allowed(user)) + to_chat(user, "Access Denied") + flick("[skin]-denied", src) + return + + use_power(5) + icon_state = "[skin]1" + + if(device) + device.pulsed() + + addtimer(CALLBACK(src, /atom/.proc/update_icon), 15) + +/obj/machinery/button/power_change() + ..() + update_icon() + + +/obj/machinery/button/door + name = "door button" + desc = "A door remote control switch." + var/normaldoorcontrol = FALSE + var/specialfunctions = OPEN // Bitflag, see assembly file + +/obj/machinery/button/door/setup_device() + if(!device) + if(normaldoorcontrol) + var/obj/item/assembly/control/airlock/A = new(src) + device = A + A.specialfunctions = specialfunctions + else + device = new /obj/item/assembly/control(src) + ..() + +/obj/machinery/button/door/incinerator_vent_toxmix + name = "combustion chamber vent control" + id = INCINERATOR_TOXMIX_VENT + req_access = list(ACCESS_TOX) + +/obj/machinery/button/door/incinerator_vent_atmos_main + name = "turbine vent control" + id = INCINERATOR_ATMOS_MAINVENT + req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) + +/obj/machinery/button/door/incinerator_vent_atmos_aux + name = "combustion chamber vent control" + id = INCINERATOR_ATMOS_AUXVENT + req_one_access = list(ACCESS_ATMOSPHERICS, ACCESS_MAINT_TUNNELS) + +/obj/machinery/button/door/incinerator_vent_syndicatelava_main + name = "turbine vent control" + id = INCINERATOR_SYNDICATELAVA_MAINVENT + req_access = list(ACCESS_SYNDICATE) + +/obj/machinery/button/door/incinerator_vent_syndicatelava_aux + name = "combustion chamber vent control" + id = INCINERATOR_SYNDICATELAVA_AUXVENT + req_access = list(ACCESS_SYNDICATE) + +/obj/machinery/button/massdriver + name = "mass driver button" + desc = "A remote control switch for a mass driver." + icon_state = "launcher" + skin = "launcher" + device_type = /obj/item/assembly/control/massdriver + +/obj/machinery/button/ignition + name = "ignition switch" + desc = "A remote control switch for a mounted igniter." + icon_state = "launcher" + skin = "launcher" + device_type = /obj/item/assembly/control/igniter + +/obj/machinery/button/ignition/incinerator + name = "combustion chamber ignition switch" + desc = "A remote control switch for the combustion chamber's igniter." + +/obj/machinery/button/ignition/incinerator/toxmix + id = INCINERATOR_TOXMIX_IGNITER + +/obj/machinery/button/ignition/incinerator/atmos + id = INCINERATOR_ATMOS_IGNITER + +/obj/machinery/button/ignition/incinerator/syndicatelava + id = INCINERATOR_SYNDICATELAVA_IGNITER + +/obj/machinery/button/flasher + name = "flasher button" + desc = "A remote control switch for a mounted flasher." + icon_state = "launcher" + skin = "launcher" + device_type = /obj/item/assembly/control/flasher + +/obj/machinery/button/crematorium + name = "crematorium igniter" + desc = "Burn baby burn!" + icon_state = "launcher" + skin = "launcher" + device_type = /obj/item/assembly/control/crematorium + req_access = list() + id = 1 + +/obj/item/wallframe/button + name = "button frame" + desc = "Used for building buttons." + icon_state = "button" + result_path = /obj/machinery/button + materials = list(MAT_METAL=MINERAL_MATERIAL_AMOUNT) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 17136d3c..bef5effb 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -292,7 +292,7 @@ new /obj/item/stack/cable_coil(loc, 2) qdel(src) -/obj/machinery/camera/update_icon() +/obj/machinery/camera/update_icon_state() if(!status) icon_state = "[initial(icon_state)]1" else if (stat & EMPED) diff --git a/code/game/machinery/defibrillator_mount.dm b/code/game/machinery/defibrillator_mount.dm index 40ccc61b..f3be6ac2 100644 --- a/code/game/machinery/defibrillator_mount.dm +++ b/code/game/machinery/defibrillator_mount.dm @@ -38,17 +38,21 @@ defib.cell.give(180) //90% efficiency, slightly better than the cell charger's 87.5% update_icon() -/obj/machinery/defibrillator_mount/update_icon() - cut_overlays() - if(defib) - add_overlay("defib") - if(defib.powered) - add_overlay(defib.safety ? "online" : "emagged") - var/ratio = defib.cell.charge / defib.cell.maxcharge - ratio = CEILING(ratio * 4, 1) * 25 - add_overlay("charge[ratio]") - if(clamps_locked) - add_overlay("clamps") +/obj/machinery/defibrillator_mount/update_overlays() + . = ..() + if(!defib) + return + + . += "defib" + + if(defib.powered) + . += (defib.safety ? "online" : "emagged") + var/ratio = defib.cell.charge / defib.cell.maxcharge + ratio = CEILING(ratio * 4, 1) * 25 + . += "charge[ratio]" + + if(clamps_locked) + . += "clamps" /obj/machinery/defibrillator_mount/get_cell() if(defib) diff --git a/code/game/objects/effects/temporary_visuals/miscellaneous.dm b/code/game/objects/effects/temporary_visuals/miscellaneous.dm index b1638844..c165eb6e 100644 --- a/code/game/objects/effects/temporary_visuals/miscellaneous.dm +++ b/code/game/objects/effects/temporary_visuals/miscellaneous.dm @@ -464,7 +464,7 @@ status = rcd_status delay = rcd_delay if (status == RCD_DECONSTRUCT) - addtimer(CALLBACK(src, .proc/update_icon), 11) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 11) delay -= 11 icon_state = "rcd_end_reverse" else diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 946b3cac..d0608d52 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -46,8 +46,7 @@ /obj/item/defibrillator/update_icon() update_power() - update_overlays() - update_charge() + return ..() /obj/item/defibrillator/proc/update_power() if(!QDELETED(cell)) @@ -58,23 +57,20 @@ else powered = FALSE -/obj/item/defibrillator/proc/update_overlays() - cut_overlays() +/obj/item/defibrillator/update_overlays() + . = ..() if(!on) - add_overlay("[initial(icon_state)]-paddles") + . += "[initial(icon_state)]-paddles" if(powered) - add_overlay("[initial(icon_state)]-powered") - if(!cell) - add_overlay("[initial(icon_state)]-nocell") - if(!safety) - add_overlay("[initial(icon_state)]-emagged") - -/obj/item/defibrillator/proc/update_charge() - if(powered) //so it doesn't show charge if it's unpowered + . += "[initial(icon_state)]-powered" if(!QDELETED(cell)) var/ratio = cell.charge / cell.maxcharge ratio = CEILING(ratio*4, 1) * 25 add_overlay("[initial(icon_state)]-charge[ratio]") + if(!cell) + . += "[initial(icon_state)]-nocell" + if(!safety) + . += "[initial(icon_state)]-emagged" /obj/item/defibrillator/CheckParts(list/parts_list) ..() diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 3fde2307..a8d57fab 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -1,237 +1,237 @@ -/obj/item/transfer_valve - icon = 'icons/obj/assemblies.dmi' - name = "tank transfer valve" - icon_state = "valve_1" - item_state = "ttv" - lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' - righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' - desc = "Regulates the transfer of air between two tanks." - w_class = WEIGHT_CLASS_BULKY - var/obj/item/tank/tank_one - var/obj/item/tank/tank_two - var/obj/item/assembly/attached_device - var/mob/attacher = null - var/valve_open = FALSE - var/toggle = 1 - -/obj/item/transfer_valve/IsAssemblyHolder() - return TRUE - -/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) - if(istype(item, /obj/item/tank)) - if(tank_one && tank_two) - to_chat(user, "There are already two tanks attached, remove one first!") - return - - if(!tank_one) - if(!user.transferItemToLoc(item, src)) - return - tank_one = item - to_chat(user, "You attach the tank to the transfer valve.") - else if(!tank_two) - if(!user.transferItemToLoc(item, src)) - return - tank_two = item - to_chat(user, "You attach the tank to the transfer valve.") - - update_icon() -//TODO: Have this take an assemblyholder - else if(isassembly(item)) - var/obj/item/assembly/A = item - if(A.secured) - to_chat(user, "The device is secured.") - return - if(attached_device) - to_chat(user, "There is already a device attached to the valve, remove it first!") - return - if(!user.transferItemToLoc(item, src)) - return - attached_device = A - to_chat(user, "You attach the [item] to the valve controls and secure it.") - A.holder = src - A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). - - GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." - message_admins("[ADMIN_LOOKUPFLW(user)] attached a [item] to a transfer valve.") - log_game("[key_name(user)] attached a [item] to a transfer valve.") - attacher = user - return - -//Attached device memes -/obj/item/transfer_valve/Move() - . = ..() - if(attached_device) - attached_device.holder_movement() - -/obj/item/transfer_valve/dropped() - . = ..() - if(attached_device) - attached_device.dropped() - -/obj/item/transfer_valve/on_found(mob/finder) - if(attached_device) - attached_device.on_found(finder) - -/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj) - . = ..() - if(attached_device) - attached_device.Crossed(AM) - -/obj/item/transfer_valve/attack_hand()//Triggers mousetraps - . = ..() - if(.) - return - if(attached_device) - attached_device.attack_hand() - -//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. - - -/obj/item/transfer_valve/attack_self(mob/user) - user.set_machine(src) - var/dat = {" Valve properties: -
                  Attachment one: [tank_one] [tank_one ? "Remove" : ""] -
                  Attachment two: [tank_two] [tank_two ? "Remove" : ""] -
                  Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""] -
                  Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"} - - var/datum/browser/popup = new(user, "trans_valve", name) - popup.set_content(dat) - popup.open() - return - -/obj/item/transfer_valve/Topic(href, href_list) - ..() - if(!usr.canUseTopic(src)) - return - if(tank_one && href_list["tankone"]) - split_gases() - valve_open = FALSE - tank_one.forceMove(drop_location()) - tank_one = null - update_icon() - else if(tank_two && href_list["tanktwo"]) - split_gases() - valve_open = FALSE - tank_two.forceMove(drop_location()) - tank_two = null - update_icon() - else if(href_list["open"]) - toggle_valve() - else if(attached_device) - if(href_list["rem_device"]) - attached_device.on_detach() - attached_device = null - update_icon() - if(href_list["device"]) - attached_device.attack_self(usr) - - attack_self(usr) - add_fingerprint(usr) - -/obj/item/transfer_valve/proc/process_activation(obj/item/D) - if(toggle) - toggle = FALSE - toggle_valve() - addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever - -/obj/item/transfer_valve/proc/toggle_off() - toggle = TRUE - -/obj/item/transfer_valve/update_icon() - cut_overlays() - underlays = null - - if(!tank_one && !tank_two && !attached_device) - icon_state = "valve_1" - return - icon_state = "valve" - - if(tank_one) - add_overlay("[tank_one.icon_state]") - if(tank_two) - var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") - J.Shift(WEST, 13) - underlays += J - if(attached_device) - add_overlay("device") - if(istype(attached_device, /obj/item/assembly/infra)) - var/obj/item/assembly/infra/sensor = attached_device - if(sensor.on && sensor.visible) - add_overlay("proxy_beam") - -/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) - var/target_self = FALSE - if(!target || (target == tank_one.air_contents)) - target = tank_two.air_contents - if(target == tank_two.air_contents) - target_self = TRUE - if(change_volume) - if(!target_self) - target.volume += tank_two.volume - target.volume += tank_one.air_contents.volume - var/datum/gas_mixture/temp - temp = tank_one.air_contents.remove_ratio(1) - target.merge(temp) - if(!target_self) - temp = tank_two.air_contents.remove_ratio(1) - target.merge(temp) - -/obj/item/transfer_valve/proc/split_gases() - if (!valve_open || !tank_one || !tank_two) - return - var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume - var/datum/gas_mixture/temp - temp = tank_two.air_contents.remove_ratio(ratio1) - tank_one.air_contents.merge(temp) - tank_two.air_contents.volume -= tank_one.air_contents.volume - - /* - Exadv1: I know this isn't how it's going to work, but this was just to check - it explodes properly when it gets a signal (and it does). - */ - -/obj/item/transfer_valve/proc/toggle_valve() - if(!valve_open && tank_one && tank_two) - valve_open = TRUE - var/turf/bombturf = get_turf(src) - - var/attachment - if(attached_device) - if(istype(attached_device, /obj/item/assembly/signaler)) - attachment = "[attached_device]" - else - attachment = attached_device - - var/admin_attachment_message - var/attachment_message - if(attachment) - admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]" - attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]" - - var/mob/bomber = get_mob_by_key(fingerprintslast) - var/admin_bomber_message - var/bomber_message - if(bomber) - admin_bomber_message = " - Last touched by: [ADMIN_LOOKUPFLW(bomber)]" - bomber_message = " - Last touched by: [key_name_admin(bomber)]" - - - var/admin_bomb_message = "Bomb valve opened in [ADMIN_VERBOSEJMP(bombturf)][admin_attachment_message][admin_bomber_message]" - GLOB.bombers += admin_bomb_message - message_admins(admin_bomb_message, 0, 1) - log_game("Bomb valve opened in [AREACOORD(bombturf)][attachment_message][bomber_message]") - - merge_gases() - for(var/i in 1 to 6) - addtimer(CALLBACK(src, .proc/update_icon), 20 + (i - 1) * 10) - - else if(valve_open && tank_one && tank_two) - split_gases() - valve_open = FALSE - update_icon() - -// this doesn't do anything but the timer etc. expects it to be here -// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs -/obj/item/transfer_valve/proc/c_state() - return +/obj/item/transfer_valve + icon = 'icons/obj/assemblies.dmi' + name = "tank transfer valve" + icon_state = "valve_1" + item_state = "ttv" + lefthand_file = 'icons/mob/inhands/weapons/bombs_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/bombs_righthand.dmi' + desc = "Regulates the transfer of air between two tanks." + w_class = WEIGHT_CLASS_BULKY + var/obj/item/tank/tank_one + var/obj/item/tank/tank_two + var/obj/item/assembly/attached_device + var/mob/attacher = null + var/valve_open = FALSE + var/toggle = 1 + +/obj/item/transfer_valve/IsAssemblyHolder() + return TRUE + +/obj/item/transfer_valve/attackby(obj/item/item, mob/user, params) + if(istype(item, /obj/item/tank)) + if(tank_one && tank_two) + to_chat(user, "There are already two tanks attached, remove one first!") + return + + if(!tank_one) + if(!user.transferItemToLoc(item, src)) + return + tank_one = item + to_chat(user, "You attach the tank to the transfer valve.") + else if(!tank_two) + if(!user.transferItemToLoc(item, src)) + return + tank_two = item + to_chat(user, "You attach the tank to the transfer valve.") + + update_icon() +//TODO: Have this take an assemblyholder + else if(isassembly(item)) + var/obj/item/assembly/A = item + if(A.secured) + to_chat(user, "The device is secured.") + return + if(attached_device) + to_chat(user, "There is already a device attached to the valve, remove it first!") + return + if(!user.transferItemToLoc(item, src)) + return + attached_device = A + to_chat(user, "You attach the [item] to the valve controls and secure it.") + A.holder = src + A.toggle_secure() //this calls update_icon(), which calls update_icon() on the holder (i.e. the bomb). + + GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." + message_admins("[ADMIN_LOOKUPFLW(user)] attached a [item] to a transfer valve.") + log_game("[key_name(user)] attached a [item] to a transfer valve.") + attacher = user + return + +//Attached device memes +/obj/item/transfer_valve/Move() + . = ..() + if(attached_device) + attached_device.holder_movement() + +/obj/item/transfer_valve/dropped() + . = ..() + if(attached_device) + attached_device.dropped() + +/obj/item/transfer_valve/on_found(mob/finder) + if(attached_device) + attached_device.on_found(finder) + +/obj/item/transfer_valve/Crossed(atom/movable/AM as mob|obj) + . = ..() + if(attached_device) + attached_device.Crossed(AM) + +/obj/item/transfer_valve/attack_hand()//Triggers mousetraps + . = ..() + if(.) + return + if(attached_device) + attached_device.attack_hand() + +//These keep attached devices synced up, for example a TTV with a mouse trap being found in a bag so it's triggered, or moving the TTV with an infrared beam sensor to update the beam's direction. + + +/obj/item/transfer_valve/attack_self(mob/user) + user.set_machine(src) + var/dat = {" Valve properties: +
                  Attachment one: [tank_one] [tank_one ? "Remove" : ""] +
                  Attachment two: [tank_two] [tank_two ? "Remove" : ""] +
                  Valve attachment: [attached_device ? "[attached_device]" : "None"] [attached_device ? "Remove" : ""] +
                  Valve status: [ valve_open ? "Closed Open" : "Closed Open"]"} + + var/datum/browser/popup = new(user, "trans_valve", name) + popup.set_content(dat) + popup.open() + return + +/obj/item/transfer_valve/Topic(href, href_list) + ..() + if(!usr.canUseTopic(src)) + return + if(tank_one && href_list["tankone"]) + split_gases() + valve_open = FALSE + tank_one.forceMove(drop_location()) + tank_one = null + update_icon() + else if(tank_two && href_list["tanktwo"]) + split_gases() + valve_open = FALSE + tank_two.forceMove(drop_location()) + tank_two = null + update_icon() + else if(href_list["open"]) + toggle_valve() + else if(attached_device) + if(href_list["rem_device"]) + attached_device.on_detach() + attached_device = null + update_icon() + if(href_list["device"]) + attached_device.attack_self(usr) + + attack_self(usr) + add_fingerprint(usr) + +/obj/item/transfer_valve/proc/process_activation(obj/item/D) + if(toggle) + toggle = FALSE + toggle_valve() + addtimer(CALLBACK(src, .proc/toggle_off), 5) //To stop a signal being spammed from a proxy sensor constantly going off or whatever + +/obj/item/transfer_valve/proc/toggle_off() + toggle = TRUE + +/obj/item/transfer_valve/update_icon() + cut_overlays() + underlays = null + + if(!tank_one && !tank_two && !attached_device) + icon_state = "valve_1" + return + icon_state = "valve" + + if(tank_one) + add_overlay("[tank_one.icon_state]") + if(tank_two) + var/icon/J = new(icon, icon_state = "[tank_two.icon_state]") + J.Shift(WEST, 13) + underlays += J + if(attached_device) + add_overlay("device") + if(istype(attached_device, /obj/item/assembly/infra)) + var/obj/item/assembly/infra/sensor = attached_device + if(sensor.on && sensor.visible) + add_overlay("proxy_beam") + +/obj/item/transfer_valve/proc/merge_gases(datum/gas_mixture/target, change_volume = TRUE) + var/target_self = FALSE + if(!target || (target == tank_one.air_contents)) + target = tank_two.air_contents + if(target == tank_two.air_contents) + target_self = TRUE + if(change_volume) + if(!target_self) + target.volume += tank_two.volume + target.volume += tank_one.air_contents.volume + var/datum/gas_mixture/temp + temp = tank_one.air_contents.remove_ratio(1) + target.merge(temp) + if(!target_self) + temp = tank_two.air_contents.remove_ratio(1) + target.merge(temp) + +/obj/item/transfer_valve/proc/split_gases() + if (!valve_open || !tank_one || !tank_two) + return + var/ratio1 = tank_one.air_contents.volume/tank_two.air_contents.volume + var/datum/gas_mixture/temp + temp = tank_two.air_contents.remove_ratio(ratio1) + tank_one.air_contents.merge(temp) + tank_two.air_contents.volume -= tank_one.air_contents.volume + + /* + Exadv1: I know this isn't how it's going to work, but this was just to check + it explodes properly when it gets a signal (and it does). + */ + +/obj/item/transfer_valve/proc/toggle_valve() + if(!valve_open && tank_one && tank_two) + valve_open = TRUE + var/turf/bombturf = get_turf(src) + + var/attachment + if(attached_device) + if(istype(attached_device, /obj/item/assembly/signaler)) + attachment = "[attached_device]" + else + attachment = attached_device + + var/admin_attachment_message + var/attachment_message + if(attachment) + admin_attachment_message = " with [attachment] attached by [attacher ? ADMIN_LOOKUPFLW(attacher) : "Unknown"]" + attachment_message = " with [attachment] attached by [attacher ? key_name_admin(attacher) : "Unknown"]" + + var/mob/bomber = get_mob_by_key(fingerprintslast) + var/admin_bomber_message + var/bomber_message + if(bomber) + admin_bomber_message = " - Last touched by: [ADMIN_LOOKUPFLW(bomber)]" + bomber_message = " - Last touched by: [key_name_admin(bomber)]" + + + var/admin_bomb_message = "Bomb valve opened in [ADMIN_VERBOSEJMP(bombturf)][admin_attachment_message][admin_bomber_message]" + GLOB.bombers += admin_bomb_message + message_admins(admin_bomb_message, 0, 1) + log_game("Bomb valve opened in [AREACOORD(bombturf)][attachment_message][bomber_message]") + + merge_gases() + for(var/i in 1 to 6) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 20 + (i - 1) * 10) + + else if(valve_open && tank_one && tank_two) + split_gases() + valve_open = FALSE + update_icon() + +// this doesn't do anything but the timer etc. expects it to be here +// eventually maybe have it update icon to show state (timer, prox etc.) like old bombs +/obj/item/transfer_valve/proc/c_state() + return diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 656bbc51..282311b5 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -1,255 +1,252 @@ - -/obj - var/crit_fail = FALSE - animate_movement = 2 - speech_span = SPAN_ROBOT - var/obj_flags = CAN_BE_HIT - var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. - - var/damtype = BRUTE - var/force = 0 - - var/datum/armor/armor - var/obj_integrity //defaults to max_integrity - var/max_integrity = 500 - var/integrity_failure = 0 //0 if we have no special broken behavior - - var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF - - var/acid_level = 0 //how much acid is on that obj - - var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. - var/current_skin //the item reskin - var/list/unique_reskin //List of options to reskin. - var/always_reskinnable = FALSE - - // Access levels, used in modules\jobs\access.dm - var/list/req_access - var/req_access_txt = "0" - var/list/req_one_access - var/req_one_access_txt = "0" - - var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object - - vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. - -/obj/vv_edit_var(vname, vval) - switch(vname) - if("anchored") - setAnchored(vval) - return TRUE - if("obj_flags") - if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) - return FALSE - if("control_object") - var/obj/O = vval - if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION)) - return FALSE - return ..() - -/obj/Initialize() - . = ..() - if (islist(armor)) - armor = getArmor(arglist(armor)) - else if (!armor) - armor = getArmor() - else if (!istype(armor, /datum/armor)) - stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()") - - if(obj_integrity == null) - obj_integrity = max_integrity - if (set_obj_flags) - var/flagslist = splittext(set_obj_flags,";") - var/list/string_to_objflag = GLOB.bitfields["obj_flags"] - for (var/flag in flagslist) - if(flag[1] == "!") - flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! - obj_flags &= ~string_to_objflag[flag] - else - obj_flags |= string_to_objflag[flag] - if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) - var/turf/T = loc - T.add_blueprints_preround(src) - - -/obj/Destroy(force=FALSE) - if(!ismachinery(src)) - STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists - SStgui.close_uis(src) - . = ..() - -/obj/proc/setAnchored(anchorvalue) - SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) - anchored = anchorvalue - -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) - . = ..() - if(obj_flags & FROZEN) - visible_message("[src] shatters into a million pieces!") - qdel(src) - - -/obj/assume_air(datum/gas_mixture/giver) - if(loc) - return loc.assume_air(giver) - else - return null - -/obj/remove_air(amount) - if(loc) - return loc.remove_air(amount) - else - return null - -/obj/return_air() - if(loc) - return loc.return_air() - else - return null - -/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) - //Return: (NONSTANDARD) - // null if object handles breathing logic for lifeform - // datum/air_group to tell lifeform to process using that breath return - //DEFAULT: Take air from turf to give to have mob process - - if(breath_request>0) - var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.return_volume() - return remove_air(environment.total_moles() * breath_percentage) - else - return null - -/obj/proc/updateUsrDialog() - if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) - var/is_in_use = FALSE - var/list/nearby = viewers(1, src) - for(var/mob/M in nearby) - if ((M.client && M.machine == src)) - is_in_use = TRUE - ui_interact(M) - if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) - if (!(usr in nearby)) - if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. - is_in_use = TRUE - ui_interact(usr) - - // check for TK users - - if(ishuman(usr)) - var/mob/living/carbon/human/H = usr - if(!(usr in nearby)) - if(usr.client && usr.machine==src) - if(H.dna.check_mutation(TK)) - is_in_use = TRUE - ui_interact(usr) - if (is_in_use) - obj_flags |= IN_USE - else - obj_flags &= ~IN_USE - -/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) - // Check that people are actually using the machine. If not, don't update anymore. - if(obj_flags & IN_USE) - var/is_in_use = FALSE - if(update_viewers) - for(var/mob/M in viewers(1, src)) - if ((M.client && M.machine == src)) - is_in_use = TRUE - src.interact(M) - var/ai_in_use = FALSE - if(update_ais) - ai_in_use = AutoUpdateAI(src) - - if(update_viewers && update_ais) //State change is sure only if we check both - if(!ai_in_use && !is_in_use) - obj_flags &= ~IN_USE - - -/obj/attack_ghost(mob/user) - . = ..() - if(.) - return - ui_interact(user) - -/obj/proc/container_resist(mob/living/user) - return - -/obj/proc/update_icon() - return - -/mob/proc/unset_machine() - if(machine) - machine.on_unset_machine(src) - machine = null - -//called when the user unsets the machine. -/atom/movable/proc/on_unset_machine(mob/user) - return - -/mob/proc/set_machine(obj/O) - if(src.machine) - unset_machine() - src.machine = O - if(istype(O)) - O.obj_flags |= IN_USE - -/obj/item/proc/updateSelfDialog() - var/mob/M = src.loc - if(istype(M) && M.client && M.machine == src) - src.attack_self(M) - -/obj/proc/hide(h) - return - -/obj/singularity_pull(S, current_size) - ..() - if(!anchored || current_size >= STAGE_FIVE) - step_towards(src,S) - -/obj/get_dumping_location(datum/component/storage/source,mob/user) - return get_turf(src) - -/obj/proc/CanAStarPass() - . = !density - -/obj/proc/check_uplink_validity() - return 1 - -/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) - return - -/obj/vv_get_dropdown() - . = ..() - .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]" - .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]" - .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]" - -/obj/examine(mob/user) - . = ..() - if(obj_flags & UNIQUE_RENAME) - . += "Use a pen on it to rename it or change its description." - if(unique_reskin && (!current_skin || always_reskinnable)) - . += "Alt-click it to reskin it." - -/obj/AltClick(mob/user) - . = ..() - if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - reskin_obj(user) - return TRUE - -/obj/proc/reskin_obj(mob/M) - if(!LAZYLEN(unique_reskin)) - return - var/dat = "Reskin options for [name]:\n" - for(var/V in unique_reskin) - var/output = icon2html(src, M, unique_reskin[V]) - dat += "[V]: [output]\n" - to_chat(M, dat) - - var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin - if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin) - return - current_skin = choice - icon_state = unique_reskin[choice] - to_chat(M, "[src] is now skinned as '[choice]'.") + +/obj + var/crit_fail = FALSE + animate_movement = 2 + speech_span = SPAN_ROBOT + var/obj_flags = CAN_BE_HIT + var/set_obj_flags // ONLY FOR MAPPING: Sets flags from a string list, handled in Initialize. Usage: set_obj_flags = "EMAGGED;!CAN_BE_HIT" to set EMAGGED and clear CAN_BE_HIT. + + var/damtype = BRUTE + var/force = 0 + + var/datum/armor/armor + var/obj_integrity //defaults to max_integrity + var/max_integrity = 500 + var/integrity_failure = 0 //0 if we have no special broken behavior + + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF + + var/acid_level = 0 //how much acid is on that obj + + var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. + var/current_skin //the item reskin + var/list/unique_reskin //List of options to reskin. + var/always_reskinnable = FALSE + + // Access levels, used in modules\jobs\access.dm + var/list/req_access + var/req_access_txt = "0" + var/list/req_one_access + var/req_one_access_txt = "0" + + var/renamedByPlayer = FALSE //set when a player uses a pen on a renamable object + + vis_flags = VIS_INHERIT_PLANE //when this be added to vis_contents of something it inherit something.plane, important for visualisation of obj in openspace. + +/obj/vv_edit_var(vname, vval) + switch(vname) + if("anchored") + setAnchored(vval) + return TRUE + if("obj_flags") + if ((obj_flags & DANGEROUS_POSSESSION) && !(vval & DANGEROUS_POSSESSION)) + return FALSE + if("control_object") + var/obj/O = vval + if(istype(O) && (O.obj_flags & DANGEROUS_POSSESSION)) + return FALSE + return ..() + +/obj/Initialize() + . = ..() + if (islist(armor)) + armor = getArmor(arglist(armor)) + else if (!armor) + armor = getArmor() + else if (!istype(armor, /datum/armor)) + stack_trace("Invalid type [armor.type] found in .armor during /obj Initialize()") + + if(obj_integrity == null) + obj_integrity = max_integrity + if (set_obj_flags) + var/flagslist = splittext(set_obj_flags,";") + var/list/string_to_objflag = GLOB.bitfields["obj_flags"] + for (var/flag in flagslist) + if(flag[1] == "!") + flag = copytext(flag, length(flag[1]) + 1) // Get all but the initial ! + obj_flags &= ~string_to_objflag[flag] + else + obj_flags |= string_to_objflag[flag] + if((obj_flags & ON_BLUEPRINTS) && isturf(loc)) + var/turf/T = loc + T.add_blueprints_preround(src) + + +/obj/Destroy(force=FALSE) + if(!ismachinery(src)) + STOP_PROCESSING(SSobj, src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists + SStgui.close_uis(src) + . = ..() + +/obj/proc/setAnchored(anchorvalue) + SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) + anchored = anchorvalue + +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, force, messy_throw = TRUE) + . = ..() + if(obj_flags & FROZEN) + visible_message("[src] shatters into a million pieces!") + qdel(src) + + +/obj/assume_air(datum/gas_mixture/giver) + if(loc) + return loc.assume_air(giver) + else + return null + +/obj/remove_air(amount) + if(loc) + return loc.remove_air(amount) + else + return null + +/obj/return_air() + if(loc) + return loc.return_air() + else + return null + +/obj/proc/handle_internal_lifeform(mob/lifeform_inside_me, breath_request) + //Return: (NONSTANDARD) + // null if object handles breathing logic for lifeform + // datum/air_group to tell lifeform to process using that breath return + //DEFAULT: Take air from turf to give to have mob process + + if(breath_request>0) + var/datum/gas_mixture/environment = return_air() + var/breath_percentage = BREATH_VOLUME / environment.return_volume() + return remove_air(environment.total_moles() * breath_percentage) + else + return null + +/obj/proc/updateUsrDialog() + if((obj_flags & IN_USE) && !(obj_flags & USES_TGUI)) + var/is_in_use = FALSE + var/list/nearby = viewers(1, src) + for(var/mob/M in nearby) + if ((M.client && M.machine == src)) + is_in_use = TRUE + ui_interact(M) + if(isAI(usr) || iscyborg(usr) || IsAdminGhost(usr)) + if (!(usr in nearby)) + if (usr.client && usr.machine==src) // && M.machine == src is omitted because if we triggered this by using the dialog, it doesn't matter if our machine changed in between triggering it and this - the dialog is probably still supposed to refresh. + is_in_use = TRUE + ui_interact(usr) + + // check for TK users + + if(ishuman(usr)) + var/mob/living/carbon/human/H = usr + if(!(usr in nearby)) + if(usr.client && usr.machine==src) + if(H.dna.check_mutation(TK)) + is_in_use = TRUE + ui_interact(usr) + if (is_in_use) + obj_flags |= IN_USE + else + obj_flags &= ~IN_USE + +/obj/proc/updateDialog(update_viewers = TRUE,update_ais = TRUE) + // Check that people are actually using the machine. If not, don't update anymore. + if(obj_flags & IN_USE) + var/is_in_use = FALSE + if(update_viewers) + for(var/mob/M in viewers(1, src)) + if ((M.client && M.machine == src)) + is_in_use = TRUE + src.interact(M) + var/ai_in_use = FALSE + if(update_ais) + ai_in_use = AutoUpdateAI(src) + + if(update_viewers && update_ais) //State change is sure only if we check both + if(!ai_in_use && !is_in_use) + obj_flags &= ~IN_USE + + +/obj/attack_ghost(mob/user) + . = ..() + if(.) + return + ui_interact(user) + +/obj/proc/container_resist(mob/living/user) + return + +/mob/proc/unset_machine() + if(machine) + machine.on_unset_machine(src) + machine = null + +//called when the user unsets the machine. +/atom/movable/proc/on_unset_machine(mob/user) + return + +/mob/proc/set_machine(obj/O) + if(src.machine) + unset_machine() + src.machine = O + if(istype(O)) + O.obj_flags |= IN_USE + +/obj/item/proc/updateSelfDialog() + var/mob/M = src.loc + if(istype(M) && M.client && M.machine == src) + src.attack_self(M) + +/obj/proc/hide(h) + return + +/obj/singularity_pull(S, current_size) + ..() + if(!anchored || current_size >= STAGE_FIVE) + step_towards(src,S) + +/obj/get_dumping_location(datum/component/storage/source,mob/user) + return get_turf(src) + +/obj/proc/CanAStarPass() + . = !density + +/obj/proc/check_uplink_validity() + return 1 + +/obj/proc/intercept_user_move(dir, mob, newLoc, oldLoc) + return + +/obj/vv_get_dropdown() + . = ..() + .["Delete all of type"] = "?_src_=vars;[HrefToken()];delall=[REF(src)]" + .["Osay"] = "?_src_=vars;[HrefToken()];osay[REF(src)]" + .["Modify armor values"] = "?_src_=vars;[HrefToken()];modarmor=[REF(src)]" + +/obj/examine(mob/user) + . = ..() + if(obj_flags & UNIQUE_RENAME) + . += "Use a pen on it to rename it or change its description." + if(unique_reskin && (!current_skin || always_reskinnable)) + . += "Alt-click it to reskin it." + +/obj/AltClick(mob/user) + . = ..() + if(unique_reskin && (!current_skin || always_reskinnable) && user.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + reskin_obj(user) + return TRUE + +/obj/proc/reskin_obj(mob/M) + if(!LAZYLEN(unique_reskin)) + return + var/dat = "Reskin options for [name]:\n" + for(var/V in unique_reskin) + var/output = icon2html(src, M, unique_reskin[V]) + dat += "[V]: [output]\n" + to_chat(M, dat) + + var/choice = input(M, always_reskinnable ? "Choose the a reskin for [src]" : "Warning, you can only reskin [src] once!","Reskin Object") as null|anything in unique_reskin + if(QDELETED(src) || !choice || (current_skin && !always_reskinnable) || M.incapacitated() || !in_range(M,src) || !unique_reskin[choice] || unique_reskin[choice] == current_skin) + return + current_skin = choice + icon_state = unique_reskin[choice] + to_chat(M, "[src] is now skinned as '[choice]'.") diff --git a/code/game/objects/structures/divine.dm b/code/game/objects/structures/divine.dm index 5ce34d44..b9748560 100644 --- a/code/game/objects/structures/divine.dm +++ b/code/game/objects/structures/divine.dm @@ -41,7 +41,7 @@ to_chat(user, "The water feels warm and soothing as you touch it. The fountain immediately dries up shortly afterwards.") user.reagents.add_reagent(/datum/reagent/medicine/omnizine/godblood,20) update_icon() - addtimer(CALLBACK(src, .proc/update_icon), time_between_uses) + addtimer(CALLBACK(src, /atom/.proc/update_icon), time_between_uses) /obj/structure/healingfountain/update_icon() diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 2b0d57be..41539529 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -103,9 +103,9 @@ /turf/open/floor/blob_act(obj/structure/blob/B) return -/turf/open/floor/proc/update_icon() +/turf/open/floor/update_icon() + . = ..() update_visuals() - return 1 /turf/open/floor/attack_paw(mob/user) return attack_hand(user) diff --git a/code/game/turfs/simulated/wall/reinf_walls.dm b/code/game/turfs/simulated/wall/reinf_walls.dm index 39d2d9c5..f4f86e79 100644 --- a/code/game/turfs/simulated/wall/reinf_walls.dm +++ b/code/game/turfs/simulated/wall/reinf_walls.dm @@ -202,15 +202,20 @@ return 1 return 0 -/turf/closed/wall/r_wall/proc/update_icon() +/turf/closed/wall/r_wall/update_icon() + . = ..() if(d_state != INTACT) smooth = SMOOTH_FALSE clear_smooth_overlays() - icon_state = "r_wall-[d_state]" else smooth = SMOOTH_TRUE queue_smooth_neighbors(src) queue_smooth(src) + +/turf/closed/wall/r_wall/update_icon_state() + if(d_state != INTACT) + icon_state = "r_wall-[d_state]" + else icon_state = "r_wall" /turf/closed/wall/r_wall/singularity_pull(S, current_size) diff --git a/code/game/turfs/space/transit.dm b/code/game/turfs/space/transit.dm index f0f0667c..db5fc8a1 100644 --- a/code/game/turfs/space/transit.dm +++ b/code/game/turfs/space/transit.dm @@ -103,10 +103,13 @@ for(var/atom/movable/AM in src) throw_atom(AM) -/turf/open/space/transit/proc/update_icon() - icon_state = "speedspace_ns_[get_transit_state(src)]" +/turf/open/space/transit/update_icon() + . = ..() transform = turn(matrix(), get_transit_angle(src)) +/turf/open/space/transit/update_icon_state() + icon_state = "speedspace_ns_[get_transit_state(src)]" + /proc/get_transit_state(turf/T) var/p = 9 . = 1 diff --git a/code/modules/assembly/flash.dm b/code/modules/assembly/flash.dm index afe5aa3f..c9e0ca33 100644 --- a/code/modules/assembly/flash.dm +++ b/code/modules/assembly/flash.dm @@ -1,363 +1,363 @@ -#define CONFUSION_STACK_MAX_MULTIPLIER 2 -/obj/item/assembly/flash - name = "flash" - desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production." - icon_state = "flash" - item_state = "flashtool" - lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - throwforce = 0 - w_class = WEIGHT_CLASS_TINY - materials = list(MAT_METAL = 300, MAT_GLASS = 300) - crit_fail = FALSE //Is the flash burnt out? - light_color = LIGHT_COLOR_WHITE - light_power = FLASH_LIGHT_POWER - var/flashing_overlay = "flash-f" - var/times_used = 0 //Number of times it's been used. - var/burnout_resistance = 0 - var/last_used = 0 //last world.time it was used. - var/cooldown = 0 - var/last_trigger = 0 //Last time it was successfully triggered. - -/obj/item/assembly/flash/suicide_act(mob/living/user) - if (crit_fail) - user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but its burnt out!") - return SHAME - else if (user.eye_blind) - user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but [user.p_theyre()] blind!") - return SHAME - user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it! It looks like [user.p_theyre()] trying to commit suicide!") - attack(user,user) - return FIRELOSS - -/obj/item/assembly/flash/update_icon(flash = FALSE) - cut_overlays() - attached_overlays = list() - if(crit_fail) - add_overlay("flashburnt") - attached_overlays += "flashburnt" - if(flash) - add_overlay(flashing_overlay) - attached_overlays += flashing_overlay - addtimer(CALLBACK(src, .proc/update_icon), 5) - if(holder) - holder.update_icon() - -/obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user) - if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) - flash_carbon(user, user, 15, 0) - return FALSE - return TRUE - -/obj/item/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. - if(!crit_fail) - crit_fail = TRUE - update_icon() - if(ismob(loc)) - var/mob/M = loc - M.visible_message("[src] burns out!","[src] burns out!") - else - var/turf/T = get_turf(src) - T.visible_message("[src] burns out!") - -/obj/item/assembly/flash/proc/flash_recharge(interval = 10) - var/deciseconds_passed = world.time - last_used - for(var/seconds = deciseconds_passed / 10, seconds >= interval, seconds -= interval) //get 1 charge every interval - times_used-- - last_used = world.time - times_used = max(0, times_used) //sanity - if(max(0, prob(times_used * 3) - burnout_resistance)) //The more often it's used in a short span of time the more likely it will burn out - burn_out() - return FALSE - return TRUE - -//BYPASS CHECKS ALSO PREVENTS BURNOUT! -/obj/item/assembly/flash/proc/AOE_flash(bypass_checks = FALSE, range = 3, power = 5, targeted = FALSE, mob/user) - if(!bypass_checks && !try_use_flash()) - return FALSE - var/list/mob/targets = get_flash_targets(get_turf(src), range, FALSE) - if(user) - targets -= user - for(var/mob/living/carbon/C in targets) - flash_carbon(C, user, power, targeted, TRUE) - return TRUE - -/obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE) - if(!target_loc) - target_loc = loc - if(override_vision_checks) - return get_hearers_in_view(range, get_turf(target_loc)) - if(isturf(target_loc) || (ismob(target_loc) && isturf(target_loc.loc))) - return viewers(range, get_turf(target_loc)) - else - return typecache_filter_list(target_loc.GetAllContents(), GLOB.typecache_living) - -/obj/item/assembly/flash/proc/try_use_flash(mob/user = null) - if(crit_fail || (world.time < last_trigger + cooldown)) - return FALSE - last_trigger = world.time - playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) - flash_lighting_fx(FLASH_LIGHT_RANGE, light_power, light_color) - times_used++ - flash_recharge() - update_icon(TRUE) - if(user && !clown_check(user)) - return FALSE - return TRUE - -/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE) - if(!istype(M)) - return - if(user) - log_combat(user, M, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src) - else //caused by emp/remote signal - M.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]",LOG_ATTACK) - if(generic_message && M != user) - to_chat(M, "[src] emits a blinding light!") - if(targeted) - if(M.flash_act(1, 1)) - if(M.confused < power) - var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused - M.confused += min(power, diff) - if(user) - terrible_conversion_proc(M, user) - visible_message("[user] blinds [M] with the flash!") - to_chat(user, "You blind [M] with the flash!") - to_chat(M, "[user] blinds you with the flash!") - else - to_chat(M, "You are blinded by [src]!") - var/toblur = 20 - M.eye_blurry - if(toblur > 0) - M.blur_eyes(toblur) - else if(user) - visible_message("[user] fails to blind [M] with the flash!") - to_chat(user, "You fail to blind [M] with the flash!") - to_chat(M, "[user] fails to blind you with the flash!") - else - to_chat(M, "[src] fails to blind you!") - else - if(M.flash_act()) - var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused - M.confused += min(power, diff) - -/obj/item/assembly/flash/attack(mob/living/M, mob/user) - if(!try_use_flash(user)) - return FALSE - if(iscarbon(M)) - flash_carbon(M, user, 20, 1) - return TRUE - else if(issilicon(M)) - var/mob/living/silicon/robot/R = M - log_combat(user, R, "flashed", src) - update_icon(1) - R.Knockdown(rand(80,120)) - var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused - R.confused += min(5, diff) - R.flash_act(affect_silicon = 1) - user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!") - return TRUE - - user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!") - -/obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) - if(holder) - return FALSE - if(!AOE_flash(FALSE, 3, 5, FALSE, user)) - return FALSE - to_chat(user, "[src] emits a blinding light!") - -/obj/item/assembly/flash/emp_act(severity) - . = ..() - if(. & EMP_PROTECT_SELF) - return - if(!try_use_flash()) - return - AOE_flash() - burn_out() - -/obj/item/assembly/flash/activate()//AOE flash on signal received - if(!..()) - return - AOE_flash() - -/obj/item/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/human/H, mob/user) - if(istype(H) && ishuman(user) && H.stat != DEAD) - if(user.mind) - var/datum/antagonist/rev/head/converter = user.mind.has_antag_datum(/datum/antagonist/rev/head) - if(!converter) - return - if(!H.client) - to_chat(user, "This mind is so vacant that it is not susceptible to influence!") - return - if(H.stat != CONSCIOUS) - to_chat(user, "They must be conscious before you can convert [H.p_them()]!") - return - if(converter.add_revolutionary(H.mind)) - times_used -- //Flashes less likely to burn out for headrevs when used for conversion - else - to_chat(user, "This mind seems resistant to the flash!") - - -/obj/item/assembly/flash/cyborg - -/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) - ..() - new /obj/effect/temp_visual/borgflash(get_turf(src)) - -/obj/item/assembly/flash/cyborg/attack_self(mob/user) - ..() - new /obj/effect/temp_visual/borgflash(get_turf(src)) - -/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, params) - return -/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I) - return - -/obj/item/assembly/flash/memorizer - name = "memorizer" - desc = "If you see this, you're not likely to remember it any time soon." - icon = 'icons/obj/device.dmi' - icon_state = "memorizer" - item_state = "nullrod" - -/obj/item/assembly/flash/handheld //this is now the regular pocket flashes - -/obj/item/assembly/flash/armimplant - name = "photon projector" - desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out." - var/flashcd = 20 - var/overheat = 0 - var/obj/item/organ/cyberimp/arm/flash/I = null - -/obj/item/assembly/flash/armimplant/burn_out() - if(I && I.owner) - to_chat(I.owner, "Your photon projector implant overheats and deactivates!") - I.Retract() - overheat = TRUE - addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2) - -/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) - if(overheat) - if(I && I.owner) - to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") - return FALSE - overheat = TRUE - addtimer(CALLBACK(src, .proc/cooldown), flashcd) - playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) - update_icon(1) - return TRUE - - -/obj/item/assembly/flash/armimplant/proc/cooldown() - overheat = FALSE - -/obj/item/assembly/flash/shield - name = "strobe shield" - desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs." - icon = 'icons/obj/items_and_weapons.dmi' - icon_state = "flashshield" - item_state = "flashshield" - lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' - righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' - slot_flags = ITEM_SLOT_BACK - force = 10 - throwforce = 5 - throw_speed = 2 - throw_range = 3 - w_class = WEIGHT_CLASS_BULKY - materials = list(MAT_GLASS=7500, MAT_METAL=1000) - attack_verb = list("shoved", "bashed") - block_chance = 50 - armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) - -/obj/item/assembly/flash/shield/flash_recharge(interval=10) - if(times_used >= 4) - burn_out() - return FALSE - return TRUE - -/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/assembly/flash/handheld)) - var/obj/item/assembly/flash/handheld/flash = W - if(flash.crit_fail) - to_chat(user, "No sense replacing it with a broken bulb.") - return - else - to_chat(user, "You begin to replace the bulb.") - if(do_after(user, 20, target = src)) - if(flash.crit_fail || !flash || QDELETED(flash)) - return - crit_fail = FALSE - times_used = 0 - playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) - update_icon() - flash.crit_fail = TRUE - flash.update_icon() - return - ..() - -/obj/item/assembly/flash/shield/update_icon(flash = FALSE) - icon_state = "flashshield" - item_state = "flashshield" - - if(crit_fail) - icon_state = "riot" - item_state = "riot" - else if(flash) - icon_state = "flashshield_flash" - item_state = "flashshield_flash" - addtimer(CALLBACK(src, .proc/update_icon), 5) - - if(holder) - holder.update_icon() - -/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) - activate() - return ..() - -//ported from tg - check to make sure it can't appear where it's not supposed to. -/obj/item/assembly/flash/hypnotic - desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance." - flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own. - light_color = LIGHT_COLOR_PINK - cooldown = 20 - -/obj/item/assembly/flash/hypnotic/burn_out() - return - -/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE) - if(!istype(M)) - return - if(user) - log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src) - else //caused by emp/remote signal - M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK) - if(generic_message && M != user) - to_chat(M, "[src] emits a soothing light...") - if(targeted) - if(M.flash_act(1, 1)) - var/hypnosis = FALSE - if(M.hypnosis_vulnerable()) - hypnosis = TRUE - if(user) - user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!") - - if(!hypnosis) - to_chat(M, "The light makes you feel oddly relaxed...") - M.confused += min(M.confused + 10, 20) - M.dizziness += min(M.dizziness + 10, 20) - M.drowsyness += min(M.drowsyness + 10, 20) - M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) - else - M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) - - else if(user) - user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!") - else - to_chat(M, "[src] fails to blind you!") - - else if(M.flash_act()) - to_chat(M, "Such a pretty light...") - M.confused += min(M.confused + 4, 20) - M.dizziness += min(M.dizziness + 4, 20) - M.drowsyness += min(M.drowsyness + 4, 20) +#define CONFUSION_STACK_MAX_MULTIPLIER 2 +/obj/item/assembly/flash + name = "flash" + desc = "A powerful and versatile flashbulb device, with applications ranging from disorienting attackers to acting as visual receptors in robot production." + icon_state = "flash" + item_state = "flashtool" + lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' + throwforce = 0 + w_class = WEIGHT_CLASS_TINY + materials = list(MAT_METAL = 300, MAT_GLASS = 300) + crit_fail = FALSE //Is the flash burnt out? + light_color = LIGHT_COLOR_WHITE + light_power = FLASH_LIGHT_POWER + var/flashing_overlay = "flash-f" + var/times_used = 0 //Number of times it's been used. + var/burnout_resistance = 0 + var/last_used = 0 //last world.time it was used. + var/cooldown = 0 + var/last_trigger = 0 //Last time it was successfully triggered. + +/obj/item/assembly/flash/suicide_act(mob/living/user) + if (crit_fail) + user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but its burnt out!") + return SHAME + else if (user.eye_blind) + user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it ... but [user.p_theyre()] blind!") + return SHAME + user.visible_message("[user] raises \the [src] up to [user.p_their()] eyes and activates it! It looks like [user.p_theyre()] trying to commit suicide!") + attack(user,user) + return FIRELOSS + +/obj/item/assembly/flash/update_icon(flash = FALSE) + cut_overlays() + attached_overlays = list() + if(crit_fail) + add_overlay("flashburnt") + attached_overlays += "flashburnt" + if(flash) + add_overlay(flashing_overlay) + attached_overlays += flashing_overlay + addtimer(CALLBACK(src, /atom/.proc/update_icon), 5) + if(holder) + holder.update_icon() + +/obj/item/assembly/flash/proc/clown_check(mob/living/carbon/human/user) + if(HAS_TRAIT(user, TRAIT_CLUMSY) && prob(50)) + flash_carbon(user, user, 15, 0) + return FALSE + return TRUE + +/obj/item/assembly/flash/proc/burn_out() //Made so you can override it if you want to have an invincible flash from R&D or something. + if(!crit_fail) + crit_fail = TRUE + update_icon() + if(ismob(loc)) + var/mob/M = loc + M.visible_message("[src] burns out!","[src] burns out!") + else + var/turf/T = get_turf(src) + T.visible_message("[src] burns out!") + +/obj/item/assembly/flash/proc/flash_recharge(interval = 10) + var/deciseconds_passed = world.time - last_used + for(var/seconds = deciseconds_passed / 10, seconds >= interval, seconds -= interval) //get 1 charge every interval + times_used-- + last_used = world.time + times_used = max(0, times_used) //sanity + if(max(0, prob(times_used * 3) - burnout_resistance)) //The more often it's used in a short span of time the more likely it will burn out + burn_out() + return FALSE + return TRUE + +//BYPASS CHECKS ALSO PREVENTS BURNOUT! +/obj/item/assembly/flash/proc/AOE_flash(bypass_checks = FALSE, range = 3, power = 5, targeted = FALSE, mob/user) + if(!bypass_checks && !try_use_flash()) + return FALSE + var/list/mob/targets = get_flash_targets(get_turf(src), range, FALSE) + if(user) + targets -= user + for(var/mob/living/carbon/C in targets) + flash_carbon(C, user, power, targeted, TRUE) + return TRUE + +/obj/item/assembly/flash/proc/get_flash_targets(atom/target_loc, range = 3, override_vision_checks = FALSE) + if(!target_loc) + target_loc = loc + if(override_vision_checks) + return get_hearers_in_view(range, get_turf(target_loc)) + if(isturf(target_loc) || (ismob(target_loc) && isturf(target_loc.loc))) + return viewers(range, get_turf(target_loc)) + else + return typecache_filter_list(target_loc.GetAllContents(), GLOB.typecache_living) + +/obj/item/assembly/flash/proc/try_use_flash(mob/user = null) + if(crit_fail || (world.time < last_trigger + cooldown)) + return FALSE + last_trigger = world.time + playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) + flash_lighting_fx(FLASH_LIGHT_RANGE, light_power, light_color) + times_used++ + flash_recharge() + update_icon(TRUE) + if(user && !clown_check(user)) + return FALSE + return TRUE + +/obj/item/assembly/flash/proc/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE) + if(!istype(M)) + return + if(user) + log_combat(user, M, "[targeted? "flashed(targeted)" : "flashed(AOE)"]", src) + else //caused by emp/remote signal + M.log_message("was [targeted? "flashed(targeted)" : "flashed(AOE)"]",LOG_ATTACK) + if(generic_message && M != user) + to_chat(M, "[src] emits a blinding light!") + if(targeted) + if(M.flash_act(1, 1)) + if(M.confused < power) + var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused + M.confused += min(power, diff) + if(user) + terrible_conversion_proc(M, user) + visible_message("[user] blinds [M] with the flash!") + to_chat(user, "You blind [M] with the flash!") + to_chat(M, "[user] blinds you with the flash!") + else + to_chat(M, "You are blinded by [src]!") + var/toblur = 20 - M.eye_blurry + if(toblur > 0) + M.blur_eyes(toblur) + else if(user) + visible_message("[user] fails to blind [M] with the flash!") + to_chat(user, "You fail to blind [M] with the flash!") + to_chat(M, "[user] fails to blind you with the flash!") + else + to_chat(M, "[src] fails to blind you!") + else + if(M.flash_act()) + var/diff = power * CONFUSION_STACK_MAX_MULTIPLIER - M.confused + M.confused += min(power, diff) + +/obj/item/assembly/flash/attack(mob/living/M, mob/user) + if(!try_use_flash(user)) + return FALSE + if(iscarbon(M)) + flash_carbon(M, user, 20, 1) + return TRUE + else if(issilicon(M)) + var/mob/living/silicon/robot/R = M + log_combat(user, R, "flashed", src) + update_icon(1) + R.Knockdown(rand(80,120)) + var/diff = 5 * CONFUSION_STACK_MAX_MULTIPLIER - M.confused + R.confused += min(5, diff) + R.flash_act(affect_silicon = 1) + user.visible_message("[user] overloads [R]'s sensors with the flash!", "You overload [R]'s sensors with the flash!") + return TRUE + + user.visible_message("[user] fails to blind [M] with the flash!", "You fail to blind [M] with the flash!") + +/obj/item/assembly/flash/attack_self(mob/living/carbon/user, flag = 0, emp = 0) + if(holder) + return FALSE + if(!AOE_flash(FALSE, 3, 5, FALSE, user)) + return FALSE + to_chat(user, "[src] emits a blinding light!") + +/obj/item/assembly/flash/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + if(!try_use_flash()) + return + AOE_flash() + burn_out() + +/obj/item/assembly/flash/activate()//AOE flash on signal received + if(!..()) + return + AOE_flash() + +/obj/item/assembly/flash/proc/terrible_conversion_proc(mob/living/carbon/human/H, mob/user) + if(istype(H) && ishuman(user) && H.stat != DEAD) + if(user.mind) + var/datum/antagonist/rev/head/converter = user.mind.has_antag_datum(/datum/antagonist/rev/head) + if(!converter) + return + if(!H.client) + to_chat(user, "This mind is so vacant that it is not susceptible to influence!") + return + if(H.stat != CONSCIOUS) + to_chat(user, "They must be conscious before you can convert [H.p_them()]!") + return + if(converter.add_revolutionary(H.mind)) + times_used -- //Flashes less likely to burn out for headrevs when used for conversion + else + to_chat(user, "This mind seems resistant to the flash!") + + +/obj/item/assembly/flash/cyborg + +/obj/item/assembly/flash/cyborg/attack(mob/living/M, mob/user) + ..() + new /obj/effect/temp_visual/borgflash(get_turf(src)) + +/obj/item/assembly/flash/cyborg/attack_self(mob/user) + ..() + new /obj/effect/temp_visual/borgflash(get_turf(src)) + +/obj/item/assembly/flash/cyborg/attackby(obj/item/W, mob/user, params) + return +/obj/item/assembly/flash/cyborg/screwdriver_act(mob/living/user, obj/item/I) + return + +/obj/item/assembly/flash/memorizer + name = "memorizer" + desc = "If you see this, you're not likely to remember it any time soon." + icon = 'icons/obj/device.dmi' + icon_state = "memorizer" + item_state = "nullrod" + +/obj/item/assembly/flash/handheld //this is now the regular pocket flashes + +/obj/item/assembly/flash/armimplant + name = "photon projector" + desc = "A high-powered photon projector implant normally used for lighting purposes, but also doubles as a flashbulb weapon. Self-repair protocols fix the flashbulb if it ever burns out." + var/flashcd = 20 + var/overheat = 0 + var/obj/item/organ/cyberimp/arm/flash/I = null + +/obj/item/assembly/flash/armimplant/burn_out() + if(I && I.owner) + to_chat(I.owner, "Your photon projector implant overheats and deactivates!") + I.Retract() + overheat = TRUE + addtimer(CALLBACK(src, .proc/cooldown), flashcd * 2) + +/obj/item/assembly/flash/armimplant/try_use_flash(mob/user = null) + if(overheat) + if(I && I.owner) + to_chat(I.owner, "Your photon projector is running too hot to be used again so quickly!") + return FALSE + overheat = TRUE + addtimer(CALLBACK(src, .proc/cooldown), flashcd) + playsound(src, 'sound/weapons/flash.ogg', 100, TRUE) + update_icon(1) + return TRUE + + +/obj/item/assembly/flash/armimplant/proc/cooldown() + overheat = FALSE + +/obj/item/assembly/flash/shield + name = "strobe shield" + desc = "A shield with a built in, high intensity light capable of blinding and disorienting suspects. Takes regular handheld flashes as bulbs." + icon = 'icons/obj/items_and_weapons.dmi' + icon_state = "flashshield" + item_state = "flashshield" + lefthand_file = 'icons/mob/inhands/equipment/shields_lefthand.dmi' + righthand_file = 'icons/mob/inhands/equipment/shields_righthand.dmi' + slot_flags = ITEM_SLOT_BACK + force = 10 + throwforce = 5 + throw_speed = 2 + throw_range = 3 + w_class = WEIGHT_CLASS_BULKY + materials = list(MAT_GLASS=7500, MAT_METAL=1000) + attack_verb = list("shoved", "bashed") + block_chance = 50 + armor = list("melee" = 50, "bullet" = 50, "laser" = 50, "energy" = 0, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 70) + +/obj/item/assembly/flash/shield/flash_recharge(interval=10) + if(times_used >= 4) + burn_out() + return FALSE + return TRUE + +/obj/item/assembly/flash/shield/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/assembly/flash/handheld)) + var/obj/item/assembly/flash/handheld/flash = W + if(flash.crit_fail) + to_chat(user, "No sense replacing it with a broken bulb.") + return + else + to_chat(user, "You begin to replace the bulb.") + if(do_after(user, 20, target = src)) + if(flash.crit_fail || !flash || QDELETED(flash)) + return + crit_fail = FALSE + times_used = 0 + playsound(src, 'sound/items/deconstruct.ogg', 50, TRUE) + update_icon() + flash.crit_fail = TRUE + flash.update_icon() + return + ..() + +/obj/item/assembly/flash/shield/update_icon(flash = FALSE) + icon_state = "flashshield" + item_state = "flashshield" + + if(crit_fail) + icon_state = "riot" + item_state = "riot" + else if(flash) + icon_state = "flashshield_flash" + item_state = "flashshield_flash" + addtimer(CALLBACK(src, /atom/.proc/update_icon), 5) + + if(holder) + holder.update_icon() + +/obj/item/assembly/flash/shield/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + activate() + return ..() + +//ported from tg - check to make sure it can't appear where it's not supposed to. +/obj/item/assembly/flash/hypnotic + desc = "A modified flash device, programmed to emit a sequence of subliminal flashes that can send a vulnerable target into a hypnotic trance." + flashing_overlay = "flash-hypno" //I cannot find this icon no matter how hard I look in tg, so I might just make my own. + light_color = LIGHT_COLOR_PINK + cooldown = 20 + +/obj/item/assembly/flash/hypnotic/burn_out() + return + +/obj/item/assembly/flash/hypnotic/flash_carbon(mob/living/carbon/M, mob/user, power = 15, targeted = TRUE, generic_message = FALSE) + if(!istype(M)) + return + if(user) + log_combat(user, M, "[targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]", src) + else //caused by emp/remote signal + M.log_message("was [targeted? "hypno-flashed(targeted)" : "hypno-flashed(AOE)"]",LOG_ATTACK) + if(generic_message && M != user) + to_chat(M, "[src] emits a soothing light...") + if(targeted) + if(M.flash_act(1, 1)) + var/hypnosis = FALSE + if(M.hypnosis_vulnerable()) + hypnosis = TRUE + if(user) + user.visible_message("[user] blinds [M] with the flash!", "You hypno-flash [M]!") + + if(!hypnosis) + to_chat(M, "The light makes you feel oddly relaxed...") + M.confused += min(M.confused + 10, 20) + M.dizziness += min(M.dizziness + 10, 20) + M.drowsyness += min(M.drowsyness + 10, 20) + M.apply_status_effect(STATUS_EFFECT_PACIFY, 100) + else + M.apply_status_effect(/datum/status_effect/trance, 200, TRUE) + + else if(user) + user.visible_message("[user] fails to blind [M] with the flash!", "You fail to hypno-flash [M]!") + else + to_chat(M, "[src] fails to blind you!") + + else if(M.flash_act()) + to_chat(M, "Such a pretty light...") + M.confused += min(M.confused + 4, 20) + M.dizziness += min(M.dizziness + 4, 20) + M.drowsyness += min(M.drowsyness + 4, 20) diff --git a/code/modules/cargo/gondolapod.dm b/code/modules/cargo/gondolapod.dm index 7b78facf..1b4ebd6c 100644 --- a/code/modules/cargo/gondolapod.dm +++ b/code/modules/cargo/gondolapod.dm @@ -29,7 +29,7 @@ name = linked_pod.name . = ..() -/mob/living/simple_animal/pet/gondola/gondolapod/proc/update_icon() +/mob/living/simple_animal/pet/gondola/gondolapod/update_icon_state() if(opened) icon_state = "gondolapod_open" else diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 2ad46b80..d1d17b3d 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -53,7 +53,7 @@ mix_filling_color(S) S.reagents.trans_to(src,min(S.reagents.total_volume, 15)) //limit of 15, we don't want our custom food to be completely filled by just one ingredient with large reagent volume. foodtype |= S.foodtype - update_overlays(S) + update_snack_overlays(S) to_chat(user, "You add the [I.name] to the [name].") update_name(S) else @@ -101,7 +101,7 @@ rgbcolor[4] = (customcolor[4]+ingcolor[4])/2 filling_color = rgb(rgbcolor[1], rgbcolor[2], rgbcolor[3], rgbcolor[4]) -/obj/item/reagent_containers/food/snacks/customizable/update_overlays(obj/item/reagent_containers/food/snacks/S) +/obj/item/reagent_containers/food/snacks/customizable/update_snack_overlays(obj/item/reagent_containers/food/snacks/S) var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") filling.color = pick("#FF0000","#0000FF","#008000","#FFFF00") @@ -137,7 +137,7 @@ /obj/item/reagent_containers/food/snacks/customizable/initialize_slice(obj/item/reagent_containers/food/snacks/slice, reagents_per_slice) ..() slice.filling_color = filling_color - slice.update_overlays(src) + slice.update_snack_overlays(src) /obj/item/reagent_containers/food/snacks/customizable/Destroy() diff --git a/code/modules/food_and_drinks/food/snacks.dm b/code/modules/food_and_drinks/food/snacks.dm index 22106266..ee7e129a 100644 --- a/code/modules/food_and_drinks/food/snacks.dm +++ b/code/modules/food_and_drinks/food/snacks.dm @@ -267,7 +267,7 @@ All foods are distributed among various categories. Use common sense. trash = null return -/obj/item/reagent_containers/food/snacks/proc/update_overlays(obj/item/reagent_containers/food/snacks/S) +/obj/item/reagent_containers/food/snacks/proc/update_snack_overlays(obj/item/reagent_containers/food/snacks/S) cut_overlays() var/mutable_appearance/filling = mutable_appearance(icon, "[initial(icon_state)]_filling") if(S.filling_color == "#FFFFFF") diff --git a/code/modules/food_and_drinks/food/snacks_pastry.dm b/code/modules/food_and_drinks/food/snacks_pastry.dm index e06e095b..3e6f57ba 100644 --- a/code/modules/food_and_drinks/food/snacks_pastry.dm +++ b/code/modules/food_and_drinks/food/snacks_pastry.dm @@ -822,13 +822,13 @@ to_chat(user, "You add the [I] to the [name].") P.name = initial(P.name) contents += P - update_overlays(P) + update_snack_overlays(P) if (P.contents.len) for(var/V in P.contents) P = V P.name = initial(P.name) contents += P - update_overlays(P) + update_snack_overlays(P) P = I clearlist(P.contents) return @@ -837,7 +837,7 @@ return O.attackby(I, user, params) ..() -/obj/item/reagent_containers/food/snacks/pancakes/update_overlays(obj/item/reagent_containers/food/snacks/P) +/obj/item/reagent_containers/food/snacks/pancakes/update_snack_overlays(obj/item/reagent_containers/food/snacks/P) var/mutable_appearance/pancake = mutable_appearance(icon, "[P.item_state]_[rand(1,3)]") pancake.pixel_x = rand(-1,1) pancake.pixel_y = 3 * contents.len - 1 diff --git a/code/modules/holodeck/turfs.dm b/code/modules/holodeck/turfs.dm index 3574f8a9..7b5b0586 100644 --- a/code/modules/holodeck/turfs.dm +++ b/code/modules/holodeck/turfs.dm @@ -111,11 +111,10 @@ /turf/open/floor/holofloor/carpet/Initialize() . = ..() - addtimer(CALLBACK(src, .proc/update_icon), 1) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 1) /turf/open/floor/holofloor/carpet/update_icon() - if(!..()) - return 0 + . = ..() if(intact) queue_smooth(src) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 1c91b733..50862ee1 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -175,7 +175,8 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) * Hair will always update its dir, so if your sprite has no dirs the haircut will go all over the place. * |- Ricotez */ -/mob/dead/observer/proc/update_icon(new_form) +/mob/dead/observer/update_icon(new_form) + . = ..() if(client) //We update our preferences in case they changed right before update_icon was called. ghost_accs = client.prefs.ghost_accs ghost_others = client.prefs.ghost_others diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index 0378b0b9..600dfdd5 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -51,7 +51,7 @@ weapon.attack(C, src) playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE, -1) if(C.stat == DEAD) - addtimer(CALLBACK(src, .proc/update_icon), 2) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 2) back_to_idle() diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm index 7e3b2eb1..afc92c96 100644 --- a/code/modules/mob/living/simple_animal/bot/bot.dm +++ b/code/modules/mob/living/simple_animal/bot/bot.dm @@ -852,7 +852,7 @@ Pass a positive integer as an argument to override a bot's default speed. ejectpai(usr) update_controls() -/mob/living/simple_animal/bot/proc/update_icon() +/mob/living/simple_animal/bot/update_icon_state() icon_state = "[initial(icon_state)][on]" // Machinery to simplify topic and access calls diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index c76dece7..5788fbb2 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -49,7 +49,7 @@ /mob/living/simple_animal/bot/honkbot/proc/sensor_blink() icon_state = "honkbot-c" - addtimer(CALLBACK(src, .proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 5, TIMER_OVERRIDE|TIMER_UNIQUE) //honkbots react with sounds. /mob/living/simple_animal/bot/honkbot/proc/react_ping() @@ -177,7 +177,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, playsound(src, "honkbot_e", 50, 0) spam_flag = TRUE // prevent spam icon_state = "honkbot-e" - addtimer(CALLBACK(src, .proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 30, TIMER_OVERRIDE|TIMER_UNIQUE) addtimer(CALLBACK(src, .proc/spam_flag_false), cooldowntimehorn) /mob/living/simple_animal/bot/honkbot/proc/honk_attack(mob/living/carbon/C) // horn attack diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index 7a64c4e0..0d1a4bda 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -252,7 +252,7 @@ Auto Patrol: []"}, var/judgement_criteria = judgement_criteria() playsound(src, 'sound/weapons/egloves.ogg', 50, TRUE, -1) icon_state = "secbot-c" - addtimer(CALLBACK(src, .proc/update_icon), 2) + addtimer(CALLBACK(src, /atom/.proc/update_icon), 2) var/threat = 5 if(ishuman(C)) C.stuttering = 5 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 66bcbdc0..5c99826d 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -392,14 +392,10 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA spintime -= speed /mob/proc/update_pull_hud_icon() - if(hud_used) - if(hud_used.pull_icon) - hud_used.pull_icon.update_icon(src) + hud_used?.pull_icon?.update_icon() /mob/proc/update_rest_hud_icon() - if(hud_used) - if(hud_used.rest_icon) - hud_used.rest_icon.update_icon(src) + hud_used?.rest_icon?.update_icon() /mob/verb/mode() set name = "Activate Held Object" diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 5a404651..6e74f42c 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -27,7 +27,7 @@ I'll make some notes on where certain variable defines should probably go. Changing this around would probably require a good look-over the pre-existing code. */ - var/zone_selected = null + var/zone_selected = BODY_ZONE_CHEST var/computer_id = null var/list/logging = list() diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 922d36fe..02c9c1ed 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -1,408 +1,408 @@ -/mob/CanPass(atom/movable/mover, turf/target) - if((mover.pass_flags & PASSMOB)) - return TRUE - if(istype(mover, /obj/item/projectile) || mover.throwing) - return (!density || lying) - if(buckled == mover) - return TRUE - if(ismob(mover)) - if (mover in buckled_mobs) - return TRUE - return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover))) - -//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM. -//See mob_movespeed.dm -/mob/proc/movement_delay() //update /living/movement_delay() if you change this - return cached_multiplicative_slowdown - -/client/verb/drop_item() - set hidden = 1 - if(!iscyborg(mob) && mob.stat == CONSCIOUS) - mob.dropItemToGround(mob.get_active_held_item()) - return - -/client/proc/Move_object(direct) - if(mob && mob.control_object) - if(mob.control_object.density) - step(mob.control_object,direct) - if(!mob.control_object) - return - mob.control_object.setDir(direct) - else - mob.control_object.forceMove(get_step(mob.control_object,direct)) - -#define MOVEMENT_DELAY_BUFFER 0.75 -#define MOVEMENT_DELAY_BUFFER_DELTA 1.25 - -/client/Move(n, direct) - if(world.time < move_delay) //do not move anything ahead of this check please - return FALSE - else - next_move_dir_add = 0 - next_move_dir_sub = 0 - var/old_move_delay = move_delay - move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick - if(!mob || !mob.loc) - return FALSE - if(!n || !direct) - return FALSE - if(mob.notransform) - return FALSE //This is sota the goto stop mobs from moving var - if(mob.control_object) - return Move_object(direct) - if(!isliving(mob)) - return mob.Move(n, direct) - if(mob.stat == DEAD) - mob.ghostize() - return FALSE - if(mob.force_moving) - return FALSE - - var/mob/living/L = mob //Already checked for isliving earlier - if(L.incorporeal_move) //Move though walls - Process_Incorpmove(direct) - return FALSE - - if(mob.remote_control) //we're controlling something, our movement is relayed to it - return mob.remote_control.relaymove(mob, direct) - - if(isAI(mob)) - return AIMove(n,direct,mob) - - if(Process_Grab()) //are we restrained by someone's grip? - return - - if(mob.buckled) //if we're buckled to something, tell it we moved. - return mob.buckled.relaymove(mob, direct) - - if(!mob.canmove) - return FALSE - - if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved - var/atom/O = mob.loc - return O.relaymove(mob, direct) - - if(!mob.Process_Spacemove(direct)) - return FALSE - //We are now going to move - var/add_delay = mob.movement_delay() - mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * (((direct & 3) && (direct & 12)) ? 2 : 1))) // set it now in case of pulled objects - if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) - move_delay = old_move_delay - else - move_delay = world.time - var/oldloc = mob.loc - - if(L.confused) - var/newdir = 0 - if(L.confused > 40) - newdir = pick(GLOB.alldirs) - else if(prob(L.confused * 1.5)) - newdir = angle2dir(dir2angle(direct) + pick(90, -90)) - else if(prob(L.confused * 3)) - newdir = angle2dir(dir2angle(direct) + pick(45, -45)) - if(newdir) - direct = newdir - n = get_step(L, direct) - - . = ..() - - if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully - add_delay *= 1.66 - move_delay += add_delay - mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) - if(.) // If mob is null here, we deserve the runtime - if(mob.throwing) - mob.throwing.finalize(FALSE) - - for(var/obj/O in mob.user_movement_hooks) - O.intercept_user_move(direct, mob, n, oldloc) - - var/atom/movable/P = mob.pulling - if(P && !ismob(P) && P.density) - mob.setDir(turn(mob.dir, 180)) - -///Process_Grab() -///Called by client/Move() -///Checks to see if you are being grabbed and if so attemps to break it -/client/proc/Process_Grab() - if(mob.pulledby) - if(mob.incapacitated(ignore_restraints = 1)) - move_delay = world.time + 10 - return TRUE - else if(mob.restrained(ignore_grab = 1)) - move_delay = world.time + 10 - to_chat(src, "You're restrained! You can't move!") - return TRUE - else - return mob.resist_grab(1) - -///Process_Incorpmove -///Called by client/Move() -///Allows mobs to run though walls -/client/proc/Process_Incorpmove(direct) - var/turf/mobloc = get_turf(mob) - if(!isliving(mob)) - return - var/mob/living/L = mob - switch(L.incorporeal_move) - if(INCORPOREAL_MOVE_BASIC) - var/T = get_step(L,direct) - if(T) - L.forceMove(T) - L.setDir(direct) - if(INCORPOREAL_MOVE_SHADOW) - if(prob(50)) - var/locx - var/locy - switch(direct) - if(NORTH) - locx = mobloc.x - locy = (mobloc.y+2) - if(locy>world.maxy) - return - if(SOUTH) - locx = mobloc.x - locy = (mobloc.y-2) - if(locy<1) - return - if(EAST) - locy = mobloc.y - locx = (mobloc.x+2) - if(locx>world.maxx) - return - if(WEST) - locy = mobloc.y - locx = (mobloc.x-2) - if(locx<1) - return - else - return - var/target = locate(locx,locy,mobloc.z) - if(target) - L.loc = target - var/limit = 2//For only two trailing shadows. - for(var/turf/T in getline(mobloc, L.loc)) - new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir) - limit-- - if(limit<=0) - break - else - new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir) - var/T = get_step(L,direct) - if(T) - L.forceMove(T) - L.setDir(direct) - if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles. - var/turf/open/floor/stepTurf = get_step(L, direct) - if(stepTurf) - for(var/obj/effect/decal/cleanable/salt/S in stepTurf) - to_chat(L, "[S] bars your passage!") - if(isrevenant(L)) - var/mob/living/simple_animal/revenant/R = L - R.reveal(20) - R.stun(20) - return - if(stepTurf.flags_1 & NOJAUNT_1) - to_chat(L, "Some strange aura is blocking the way.") - return - if (locate(/obj/effect/blessing, stepTurf)) - to_chat(L, "Holy energies block your path!") - return - - L.forceMove(stepTurf) - L.setDir(direct) - return TRUE - - -///Process_Spacemove -///Called by /client/Move() -///For moving in space -///return TRUE for movement 0 for none -/mob/Process_Spacemove(movement_dir = 0) - if(spacewalk || ..()) - return TRUE - var/atom/movable/backup = get_spacemove_backup() - if(backup) - if(istype(backup) && movement_dir && !backup.anchored) - if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves - to_chat(src, "You push off of [backup] to propel yourself.") - return TRUE - return FALSE - -/mob/get_spacemove_backup() - for(var/A in orange(1, get_turf(src))) - if(isarea(A)) - continue - else if(isturf(A)) - var/turf/turf = A - if(isspaceturf(turf)) - continue - if(!turf.density && !mob_negates_gravity()) - continue - return A - else - var/atom/movable/AM = A - if(AM == buckled) - continue - if(ismob(AM)) - var/mob/M = AM - if(M.buckled) - continue - if(!AM.CanPass(src) || AM.density) - if(AM.anchored) - return AM - if(pulling == AM) - continue - . = AM - -/mob/proc/mob_has_gravity() - return has_gravity() - -/mob/proc/mob_negates_gravity() - return FALSE - - -/mob/proc/slip(s_amount, w_amount, obj/O, lube) - return - -/mob/proc/update_gravity() - return - -//bodypart selection - Cyberboss -//8 toggles through head - eyes - mouth -//4: r-arm 5: chest 6: l-arm -//1: r-leg 2: groin 3: l-leg - -/client/proc/check_has_body_select() - return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel) - -/client/verb/body_toggle_head() - set name = "body-toggle-head" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/next_in_line - switch(mob.zone_selected) - if(BODY_ZONE_HEAD) - next_in_line = BODY_ZONE_PRECISE_EYES - if(BODY_ZONE_PRECISE_EYES) - next_in_line = BODY_ZONE_PRECISE_MOUTH - else - next_in_line = BODY_ZONE_HEAD - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(next_in_line, mob) - -/client/verb/body_r_arm() - set name = "body-r-arm" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_R_ARM, mob) - -/client/verb/body_chest() - set name = "body-chest" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_CHEST, mob) - -/client/verb/body_l_arm() - set name = "body-l-arm" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_L_ARM, mob) - -/client/verb/body_r_leg() - set name = "body-r-leg" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_R_LEG, mob) - -/client/verb/body_groin() - set name = "body-groin" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) - -/client/verb/body_l_leg() - set name = "body-l-leg" - set hidden = 1 - - if(!check_has_body_select()) - return - - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select - selector.set_selected_zone(BODY_ZONE_L_LEG, mob) - -/client/verb/toggle_walk_run() - set name = "toggle-walk-run" - set hidden = TRUE - set instant = TRUE - if(mob) - mob.toggle_move_intent(usr) - -/mob/proc/toggle_move_intent(mob/user) - if(m_intent == MOVE_INTENT_RUN) - m_intent = MOVE_INTENT_WALK - else - if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude. - to_chat(src, "You find yourself unable to run.") - return FALSE - m_intent = MOVE_INTENT_RUN - if(hud_used && hud_used.static_inventory) - for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) - selector.update_icon(src) - -/mob/verb/up() - set name = "Move Upwards" - set category = "IC" - - if(zMove(UP, TRUE)) - to_chat(src, "You move upwards.") - -/mob/verb/down() - set name = "Move Down" - set category = "IC" - - if(zMove(DOWN, TRUE)) - to_chat(src, "You move down.") - -/mob/proc/zMove(dir, feedback = FALSE) - if(dir != UP && dir != DOWN) - return FALSE - var/turf/target = get_step_multiz(src, dir) - if(!target) - if(feedback) - to_chat(src, "There's nothing in that direction!") - return FALSE - if(!canZMove(dir, target)) - if(feedback) - to_chat(src, "You couldn't move there!") - return FALSE - forceMove(target) - return TRUE - -/mob/proc/canZMove(direction, turf/target) - return FALSE +/mob/CanPass(atom/movable/mover, turf/target) + if((mover.pass_flags & PASSMOB)) + return TRUE + if(istype(mover, /obj/item/projectile) || mover.throwing) + return (!density || lying) + if(buckled == mover) + return TRUE + if(ismob(mover)) + if (mover in buckled_mobs) + return TRUE + return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover))) + +//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM. +//See mob_movespeed.dm +/mob/proc/movement_delay() //update /living/movement_delay() if you change this + return cached_multiplicative_slowdown + +/client/verb/drop_item() + set hidden = 1 + if(!iscyborg(mob) && mob.stat == CONSCIOUS) + mob.dropItemToGround(mob.get_active_held_item()) + return + +/client/proc/Move_object(direct) + if(mob && mob.control_object) + if(mob.control_object.density) + step(mob.control_object,direct) + if(!mob.control_object) + return + mob.control_object.setDir(direct) + else + mob.control_object.forceMove(get_step(mob.control_object,direct)) + +#define MOVEMENT_DELAY_BUFFER 0.75 +#define MOVEMENT_DELAY_BUFFER_DELTA 1.25 + +/client/Move(n, direct) + if(world.time < move_delay) //do not move anything ahead of this check please + return FALSE + else + next_move_dir_add = 0 + next_move_dir_sub = 0 + var/old_move_delay = move_delay + move_delay = world.time + world.tick_lag //this is here because Move() can now be called mutiple times per tick + if(!mob || !mob.loc) + return FALSE + if(!n || !direct) + return FALSE + if(mob.notransform) + return FALSE //This is sota the goto stop mobs from moving var + if(mob.control_object) + return Move_object(direct) + if(!isliving(mob)) + return mob.Move(n, direct) + if(mob.stat == DEAD) + mob.ghostize() + return FALSE + if(mob.force_moving) + return FALSE + + var/mob/living/L = mob //Already checked for isliving earlier + if(L.incorporeal_move) //Move though walls + Process_Incorpmove(direct) + return FALSE + + if(mob.remote_control) //we're controlling something, our movement is relayed to it + return mob.remote_control.relaymove(mob, direct) + + if(isAI(mob)) + return AIMove(n,direct,mob) + + if(Process_Grab()) //are we restrained by someone's grip? + return + + if(mob.buckled) //if we're buckled to something, tell it we moved. + return mob.buckled.relaymove(mob, direct) + + if(!mob.canmove) + return FALSE + + if(isobj(mob.loc) || ismob(mob.loc)) //Inside an object, tell it we moved + var/atom/O = mob.loc + return O.relaymove(mob, direct) + + if(!mob.Process_Spacemove(direct)) + return FALSE + //We are now going to move + var/add_delay = mob.movement_delay() + mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay * (((direct & 3) && (direct & 12)) ? 2 : 1))) // set it now in case of pulled objects + if(old_move_delay + (add_delay*MOVEMENT_DELAY_BUFFER_DELTA) + MOVEMENT_DELAY_BUFFER > world.time) + move_delay = old_move_delay + else + move_delay = world.time + var/oldloc = mob.loc + + if(L.confused) + var/newdir = 0 + if(L.confused > 40) + newdir = pick(GLOB.alldirs) + else if(prob(L.confused * 1.5)) + newdir = angle2dir(dir2angle(direct) + pick(90, -90)) + else if(prob(L.confused * 3)) + newdir = angle2dir(dir2angle(direct) + pick(45, -45)) + if(newdir) + direct = newdir + n = get_step(L, direct) + + . = ..() + + if((direct & (direct - 1)) && mob.loc == n) //moved diagonally successfully + add_delay *= 1.66 + move_delay += add_delay + mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay)) + if(.) // If mob is null here, we deserve the runtime + if(mob.throwing) + mob.throwing.finalize(FALSE) + + for(var/obj/O in mob.user_movement_hooks) + O.intercept_user_move(direct, mob, n, oldloc) + + var/atom/movable/P = mob.pulling + if(P && !ismob(P) && P.density) + mob.setDir(turn(mob.dir, 180)) + +///Process_Grab() +///Called by client/Move() +///Checks to see if you are being grabbed and if so attemps to break it +/client/proc/Process_Grab() + if(mob.pulledby) + if(mob.incapacitated(ignore_restraints = 1)) + move_delay = world.time + 10 + return TRUE + else if(mob.restrained(ignore_grab = 1)) + move_delay = world.time + 10 + to_chat(src, "You're restrained! You can't move!") + return TRUE + else + return mob.resist_grab(1) + +///Process_Incorpmove +///Called by client/Move() +///Allows mobs to run though walls +/client/proc/Process_Incorpmove(direct) + var/turf/mobloc = get_turf(mob) + if(!isliving(mob)) + return + var/mob/living/L = mob + switch(L.incorporeal_move) + if(INCORPOREAL_MOVE_BASIC) + var/T = get_step(L,direct) + if(T) + L.forceMove(T) + L.setDir(direct) + if(INCORPOREAL_MOVE_SHADOW) + if(prob(50)) + var/locx + var/locy + switch(direct) + if(NORTH) + locx = mobloc.x + locy = (mobloc.y+2) + if(locy>world.maxy) + return + if(SOUTH) + locx = mobloc.x + locy = (mobloc.y-2) + if(locy<1) + return + if(EAST) + locy = mobloc.y + locx = (mobloc.x+2) + if(locx>world.maxx) + return + if(WEST) + locy = mobloc.y + locx = (mobloc.x-2) + if(locx<1) + return + else + return + var/target = locate(locx,locy,mobloc.z) + if(target) + L.loc = target + var/limit = 2//For only two trailing shadows. + for(var/turf/T in getline(mobloc, L.loc)) + new /obj/effect/temp_visual/dir_setting/ninja/shadow(T, L.dir) + limit-- + if(limit<=0) + break + else + new /obj/effect/temp_visual/dir_setting/ninja/shadow(mobloc, L.dir) + var/T = get_step(L,direct) + if(T) + L.forceMove(T) + L.setDir(direct) + if(INCORPOREAL_MOVE_JAUNT) //Incorporeal move, but blocked by holy-watered tiles and salt piles. + var/turf/open/floor/stepTurf = get_step(L, direct) + if(stepTurf) + for(var/obj/effect/decal/cleanable/salt/S in stepTurf) + to_chat(L, "[S] bars your passage!") + if(isrevenant(L)) + var/mob/living/simple_animal/revenant/R = L + R.reveal(20) + R.stun(20) + return + if(stepTurf.flags_1 & NOJAUNT_1) + to_chat(L, "Some strange aura is blocking the way.") + return + if (locate(/obj/effect/blessing, stepTurf)) + to_chat(L, "Holy energies block your path!") + return + + L.forceMove(stepTurf) + L.setDir(direct) + return TRUE + + +///Process_Spacemove +///Called by /client/Move() +///For moving in space +///return TRUE for movement 0 for none +/mob/Process_Spacemove(movement_dir = 0) + if(spacewalk || ..()) + return TRUE + var/atom/movable/backup = get_spacemove_backup() + if(backup) + if(istype(backup) && movement_dir && !backup.anchored) + if(backup.newtonian_move(turn(movement_dir, 180))) //You're pushing off something movable, so it moves + to_chat(src, "You push off of [backup] to propel yourself.") + return TRUE + return FALSE + +/mob/get_spacemove_backup() + for(var/A in orange(1, get_turf(src))) + if(isarea(A)) + continue + else if(isturf(A)) + var/turf/turf = A + if(isspaceturf(turf)) + continue + if(!turf.density && !mob_negates_gravity()) + continue + return A + else + var/atom/movable/AM = A + if(AM == buckled) + continue + if(ismob(AM)) + var/mob/M = AM + if(M.buckled) + continue + if(!AM.CanPass(src) || AM.density) + if(AM.anchored) + return AM + if(pulling == AM) + continue + . = AM + +/mob/proc/mob_has_gravity() + return has_gravity() + +/mob/proc/mob_negates_gravity() + return FALSE + + +/mob/proc/slip(s_amount, w_amount, obj/O, lube) + return + +/mob/proc/update_gravity() + return + +//bodypart selection - Cyberboss +//8 toggles through head - eyes - mouth +//4: r-arm 5: chest 6: l-arm +//1: r-leg 2: groin 3: l-leg + +/client/proc/check_has_body_select() + return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel) + +/client/verb/body_toggle_head() + set name = "body-toggle-head" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/next_in_line + switch(mob.zone_selected) + if(BODY_ZONE_HEAD) + next_in_line = BODY_ZONE_PRECISE_EYES + if(BODY_ZONE_PRECISE_EYES) + next_in_line = BODY_ZONE_PRECISE_MOUTH + else + next_in_line = BODY_ZONE_HEAD + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(next_in_line, mob) + +/client/verb/body_r_arm() + set name = "body-r-arm" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_R_ARM, mob) + +/client/verb/body_chest() + set name = "body-chest" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_CHEST, mob) + +/client/verb/body_l_arm() + set name = "body-l-arm" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_L_ARM, mob) + +/client/verb/body_r_leg() + set name = "body-r-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_R_LEG, mob) + +/client/verb/body_groin() + set name = "body-groin" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) + +/client/verb/body_l_leg() + set name = "body-l-leg" + set hidden = 1 + + if(!check_has_body_select()) + return + + var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + selector.set_selected_zone(BODY_ZONE_L_LEG, mob) + +/client/verb/toggle_walk_run() + set name = "toggle-walk-run" + set hidden = TRUE + set instant = TRUE + if(mob) + mob.toggle_move_intent(usr) + +/mob/proc/toggle_move_intent(mob/user) + if(m_intent == MOVE_INTENT_RUN) + m_intent = MOVE_INTENT_WALK + else + if (HAS_TRAIT(src,TRAIT_NORUNNING)) // FULPSTATION 7/10/19 So you can't run during fortitude. + to_chat(src, "You find yourself unable to run.") + return FALSE + m_intent = MOVE_INTENT_RUN + if(hud_used && hud_used.static_inventory) + for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + selector.update_icon() + +/mob/verb/up() + set name = "Move Upwards" + set category = "IC" + + if(zMove(UP, TRUE)) + to_chat(src, "You move upwards.") + +/mob/verb/down() + set name = "Move Down" + set category = "IC" + + if(zMove(DOWN, TRUE)) + to_chat(src, "You move down.") + +/mob/proc/zMove(dir, feedback = FALSE) + if(dir != UP && dir != DOWN) + return FALSE + var/turf/target = get_step_multiz(src, dir) + if(!target) + if(feedback) + to_chat(src, "There's nothing in that direction!") + return FALSE + if(!canZMove(dir, target)) + if(feedback) + to_chat(src, "You couldn't move there!") + return FALSE + forceMove(target) + return TRUE + +/mob/proc/canZMove(direction, turf/target) + return FALSE diff --git a/modular_citadel/code/_onclick/hud/screen_objects.dm b/modular_citadel/code/_onclick/hud/screen_objects.dm index 3a0eb364..6ad0603c 100644 --- a/modular_citadel/code/_onclick/hud/screen_objects.dm +++ b/modular_citadel/code/_onclick/hud/screen_objects.dm @@ -18,10 +18,11 @@ var/mob/living/carbon/C = usr C.toggle_combat_mode() -/obj/screen/combattoggle/proc/rebasetointerbay(mob/living/carbon/C) - if(!C) +/obj/screen/combattoggle/update_icon_state() + var/mob/living/carbon/user = hud?.mymob + if(!istype(user)) return - if(C.combatmode) + if(user.combatmode) icon_state = "combat" else icon_state = "combat_off" @@ -36,10 +37,11 @@ var/mob/living/carbon/C = usr C.toggle_vore_mode() -/obj/screen/voretoggle/proc/rebaseintomygut(mob/living/carbon/C) - if(!C) +/obj/screen/voretoggle/update_icon_state() + var/mob/living/carbon/user = hud?.mymob + if(!istype(user)) return - if(C.voremode && !C.combatmode) + if(user.voremode && !user.combatmode) icon_state = "nom" else icon_state = "nom_off" diff --git a/modular_citadel/code/_onclick/hud/sprint.dm b/modular_citadel/code/_onclick/hud/sprint.dm index ae58134d..14f8fba8 100644 --- a/modular_citadel/code/_onclick/hud/sprint.dm +++ b/modular_citadel/code/_onclick/hud/sprint.dm @@ -12,10 +12,11 @@ var/mob/living/carbon/human/H = usr H.togglesprint() -/obj/screen/sprintbutton/proc/insert_witty_toggle_joke_here(mob/living/carbon/human/H) - if(!H) +/obj/screen/sprintbutton/update_icon_state() + var/mob/living/user = hud?.mymob + if(istype(user)) return - if(H.sprinting) + if(user.sprinting) icon_state = "act_sprint_on" else icon_state = "act_sprint" diff --git a/modular_citadel/code/_onclick/hud/stamina.dm b/modular_citadel/code/_onclick/hud/stamina.dm index 71ad66bb..e76fec7d 100644 --- a/modular_citadel/code/_onclick/hud/stamina.dm +++ b/modular_citadel/code/_onclick/hud/stamina.dm @@ -14,32 +14,18 @@ var/mob/living/L = usr to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
                  Your stamina buffer can take [L.stambuffer] stamina loss, and will use 50% of that stamina loss when recharging.
                  Your stamina buffer is [(L.stambuffer*(100/L.stambuffer))-(L.bufferedstam*(100/L.stambuffer))]% full.
                  ") -/mob/living/carbon/human/proc/staminahudamount() - if(stat == DEAD || recoveringstam) - return "staminacrit" +/obj/screen/staminas/update_icon_state() + var/mob/living/carbon/user = hud?.mymob + if(!user) + return + if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2)) + icon_state = "staminacrit" + else if(user.hal_screwyhud == 5) + icon_state = "stamina0" else - switch(hal_screwyhud) - if(1 to 2) - return "staminacrit" - if(5) - return "stamina0" - else - switch(100 - getStaminaLoss()) - if(100 to INFINITY) - return "stamina0" - if(80 to 100) - return "stamina1" - if(60 to 80) - return "stamina2" - if(40 to 60) - return "stamina3" - if(20 to 40) - return "stamina4" - if(0 to 20) - return "stamina5" - else - return "stamina6" + icon_state = "stamina[max(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" +//stam buffer //stam buffer /obj/screen/staminabuffer icon = 'modular_citadel/icons/ui/screen_gen.dmi' @@ -49,32 +35,30 @@ layer = ABOVE_HUD_LAYER + 0.1 mouse_opacity = 0 -/mob/living/carbon/human/proc/staminabufferhudamount() - if(stat == DEAD || recoveringstam) - return "stambuffer7" +/obj/screen/staminabuffer/update_icon_state() + var/mob/living/carbon/user = hud?.mymob + if(!user) + return + if(user.stat == DEAD || user.recoveringstam || (user.hal_screwyhud in 1 to 2)) + icon_state = "stambuffer7" + else if(user.hal_screwyhud == 5) + icon_state = "stambuffer0" else - switch(hal_screwyhud) - if(1 to 2) - return "stambuffer7" - if(5) - return "stambuffer0" + switch(user.bufferedstam / user.stambuffer) + if(0.95 to INFINITY) + icon_state = "stambuffer7" + if(0.9 to 0.95) + icon_state = "stambuffer6" + if(0.8 to 0.9) + icon_state = "stambuffer5" + if(0.6 to 0.8) + icon_state = "stambuffer4" + if(0.4 to 0.6) + icon_state = "stambuffer3" + if(0.2 to 0.4) + icon_state = "stambuffer2" + if(0.05 to 0.2) + icon_state = "stambuffer1" else - var/percentmult = 100/stambuffer - switch(stambuffer*percentmult - bufferedstam*percentmult) - if(95 to INFINITY) - return "stambuffer0" - if(90 to 95) - return "stambuffer1" - if(80 to 90) - return "stambuffer2" - if(60 to 80) - return "stambuffer3" - if(40 to 60) - return "stambuffer4" - if(20 to 40) - return "stambuffer5" - if(5 to 20) - return "stambuffer6" - else - return "stambuffer7" -*/ \ No newline at end of file + icon_state = "stambuffer0" +*/ diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index bea9e8b1..5cb49f45 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -41,18 +41,16 @@ playsound_local(src, 'modular_citadel/sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the above! if(client) client.show_popup_menus = !combatmode // So we can right-click for alternate actions and all that other good shit. Also moves examine to shift+rightclick to make it possible to attack while sprinting - if(hud_used && hud_used.static_inventory) - for(var/obj/screen/combattoggle/selector in hud_used.static_inventory) - selector.rebasetointerbay(src) + var/obj/screen/combattoggle/T = locate() in hud_used?.static_inventory + T?.update_icon_state() combatmessagecooldown = 10 SECONDS + world.time //This is set 100% of the time to make sure squeezing regen out of process cycles doesn't result in the combat mode message getting spammed SEND_SIGNAL(src, COMSIG_COMBAT_TOGGLED, src, combatmode) return TRUE mob/living/carbon/proc/toggle_vore_mode() voremode = !voremode - if(hud_used && hud_used.static_inventory) - for(var/obj/screen/voretoggle/selector in hud_used.static_inventory) - selector.rebaseintomygut(src) + var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + T?.update_icon_state() if(combatmode) return FALSE //let's not override the main draw of the game these days SEND_SIGNAL(src, COMSIG_VORE_TOGGLED, src, voremode) diff --git a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm index f9ed0a01..cf2ae09d 100644 --- a/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm +++ b/modular_citadel/code/modules/mob/living/carbon/human/human_movement.dm @@ -1,6 +1,3 @@ -/mob/living/carbon/human - var/sprinting = FALSE - /mob/living/carbon/human/Move(NewLoc, direct) var/oldpseudoheight = pseudo_z_axis . = ..() @@ -27,13 +24,12 @@ if(sprinting) playsound_local(src, 'modular_citadel/sound/misc/sprintactivate.ogg', 50, FALSE, pressure_affected = FALSE) else - playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) -// if(hud_used && hud_used.static_inventory) -// for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory) -// selector.insert_witty_toggle_joke_here(src) + playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) + var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory + S?.update_icon_state() return TRUE /mob/living/carbon/human/proc/sprint_hotkey(targetstatus) if(targetstatus ? !sprinting : sprinting) togglesprint() -*/ \ No newline at end of file +*/ diff --git a/modular_citadel/code/modules/mob/living/living.dm b/modular_citadel/code/modules/mob/living/living.dm index 5ec2ab8c..b74d116c 100644 --- a/modular_citadel/code/modules/mob/living/living.dm +++ b/modular_citadel/code/modules/mob/living/living.dm @@ -1,4 +1,5 @@ /mob/living + var/sprinting = FALSE var/recoveringstam = FALSE var/incomingstammult = 1 var/bufferedstam = 0 diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm index d32d560b..b5a425ed 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,6 +1,3 @@ -/mob/living/silicon/robot - var/sprinting = FALSE - /mob/living/silicon/robot/Move(NewLoc, direct) . = ..() @@ -19,13 +16,12 @@ else if(shutdown) playsound_local(src, 'sound/effects/light_flicker.ogg', 50, FALSE, pressure_affected = FALSE) - playsound_local(src, 'modular_citadel/sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) -// if(hud_used && hud_used.static_inventory) -// for(var/obj/screen/sprintbutton/selector in hud_used.static_inventory) -// selector.insert_witty_toggle_joke_here(src) + playsound_local(src, 'sound/misc/sprintdeactivate.ogg', 50, FALSE, pressure_affected = FALSE) + var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory + S?.update_icon_state() return TRUE /mob/living/silicon/robot/proc/sprint_hotkey(targetstatus) if(targetstatus ? !sprinting : sprinting) togglesprint() -*/ \ No newline at end of file +*/ diff --git a/tgstation.dme b/tgstation.dme index 6f83b2f6..d93cc8a3 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -1,3358 +1,3357 @@ - -// DM Environment file for tgstation.dme. -// All manual changes should be made outside the BEGIN_ and END_ blocks. -// New source code should be placed in .dm files: choose File/New --> Code File. -// BEGIN_INTERNALS -// END_INTERNALS - -// BEGIN_FILE_DIR -#define FILE_DIR . -// END_FILE_DIR - -// BEGIN_PREFERENCES -#define DEBUG -// END_PREFERENCES - -// BEGIN_INCLUDE -#include "_maps\_basemap.dm" -#include "_maps\layeniastation.dm" -#include "_maps\map_files\generic\CentCom.dmm" -#include "code\_compile_options.dm" -#include "code\world.dm" -#include "code\__DEFINES\_globals.dm" -#include "code\__DEFINES\_protect.dm" -#include "code\__DEFINES\_tick.dm" -#include "code\__DEFINES\access.dm" -#include "code\__DEFINES\admin.dm" -#include "code\__DEFINES\antagonists.dm" -#include "code\__DEFINES\atmospherics.dm" -#include "code\__DEFINES\atom_hud.dm" -#include "code\__DEFINES\bsql.config.dm" -#include "code\__DEFINES\bsql.dm" -#include "code\__DEFINES\callbacks.dm" -#include "code\__DEFINES\cargo.dm" -#include "code\__DEFINES\cinematics.dm" -#include "code\__DEFINES\citadel_defines.dm" -#include "code\__DEFINES\cleaning.dm" -#include "code\__DEFINES\clockcult.dm" -#include "code\__DEFINES\colors.dm" -#include "code\__DEFINES\combat.dm" -#include "code\__DEFINES\components.dm" -#include "code\__DEFINES\configuration.dm" -#include "code\__DEFINES\construction.dm" -#include "code\__DEFINES\contracts.dm" -#include "code\__DEFINES\cult.dm" -#include "code\__DEFINES\diseases.dm" -#include "code\__DEFINES\DNA.dm" -#include "code\__DEFINES\events.dm" -#include "code\__DEFINES\exports.dm" -#include "code\__DEFINES\flags.dm" -#include "code\__DEFINES\food.dm" -#include "code\__DEFINES\footsteps.dm" -#include "code\__DEFINES\hud.dm" -#include "code\__DEFINES\integrated_electronics.dm" -#include "code\__DEFINES\interaction_flags.dm" -#include "code\__DEFINES\inventory.dm" -#include "code\__DEFINES\is_helpers.dm" -#include "code\__DEFINES\jobs.dm" -#include "code\__DEFINES\language.dm" -#include "code\__DEFINES\layers.dm" -#include "code\__DEFINES\lighting.dm" -#include "code\__DEFINES\logging.dm" -#include "code\__DEFINES\machines.dm" -#include "code\__DEFINES\maps.dm" -#include "code\__DEFINES\maths.dm" -#include "code\__DEFINES\MC.dm" -#include "code\__DEFINES\mecha.dm" -#include "code\__DEFINES\medal.dm" -#include "code\__DEFINES\melee.dm" -#include "code\__DEFINES\menu.dm" -#include "code\__DEFINES\misc.dm" -#include "code\__DEFINES\mobs.dm" -#include "code\__DEFINES\monkeys.dm" -#include "code\__DEFINES\move_force.dm" -#include "code\__DEFINES\movement.dm" -#include "code\__DEFINES\movespeed_modification.dm" -#include "code\__DEFINES\nanites.dm" -#include "code\__DEFINES\networks.dm" -#include "code\__DEFINES\obj_flags.dm" -#include "code\__DEFINES\pinpointers.dm" -#include "code\__DEFINES\pipe_construction.dm" -#include "code\__DEFINES\pool.dm" -#include "code\__DEFINES\preferences.dm" -#include "code\__DEFINES\procpath.dm" -#include "code\__DEFINES\profile.dm" -#include "code\__DEFINES\qdel.dm" -#include "code\__DEFINES\quirks.dm" -#include "code\__DEFINES\radiation.dm" -#include "code\__DEFINES\radio.dm" -#include "code\__DEFINES\reactions.dm" -#include "code\__DEFINES\reagents.dm" -#include "code\__DEFINES\reagents_specific_heat.dm" -#include "code\__DEFINES\research.dm" -#include "code\__DEFINES\robots.dm" -#include "code\__DEFINES\role_preferences.dm" -#include "code\__DEFINES\rust_g.config.dm" -#include "code\__DEFINES\rust_g.dm" -#include "code\__DEFINES\say.dm" -#include "code\__DEFINES\shuttles.dm" -#include "code\__DEFINES\sight.dm" -#include "code\__DEFINES\sound.dm" -#include "code\__DEFINES\spaceman_dmm.dm" -#include "code\__DEFINES\stat.dm" -#include "code\__DEFINES\stat_tracking.dm" -#include "code\__DEFINES\status_effects.dm" -#include "code\__DEFINES\subsystems.dm" -#include "code\__DEFINES\tgs.config.dm" -#include "code\__DEFINES\tgs.dm" -#include "code\__DEFINES\tgui.dm" -#include "code\__DEFINES\time.dm" -#include "code\__DEFINES\tools.dm" -#include "code\__DEFINES\traits.dm" -#include "code\__DEFINES\turf_flags.dm" -#include "code\__DEFINES\typeids.dm" -#include "code\__DEFINES\vehicles.dm" -#include "code\__DEFINES\voreconstants.dm" -#include "code\__DEFINES\vv.dm" -#include "code\__DEFINES\wall_dents.dm" -#include "code\__DEFINES\wires.dm" -#include "code\__DEFINES\dcs\signals.dm" -#include "code\__HELPERS\_cit_helpers.dm" -#include "code\__HELPERS\_lists.dm" -#include "code\__HELPERS\_logging.dm" -#include "code\__HELPERS\_string_lists.dm" -#include "code\__HELPERS\areas.dm" -#include "code\__HELPERS\AStar.dm" -#include "code\__HELPERS\cmp.dm" -#include "code\__HELPERS\dates.dm" -#include "code\__HELPERS\dna.dm" -#include "code\__HELPERS\files.dm" -#include "code\__HELPERS\game.dm" -#include "code\__HELPERS\global_lists.dm" -#include "code\__HELPERS\heap.dm" -#include "code\__HELPERS\icon_smoothing.dm" -#include "code\__HELPERS\icons.dm" -#include "code\__HELPERS\level_traits.dm" -#include "code\__HELPERS\matrices.dm" -#include "code\__HELPERS\mobs.dm" -#include "code\__HELPERS\mouse_control.dm" -#include "code\__HELPERS\names.dm" -#include "code\__HELPERS\priority_announce.dm" -#include "code\__HELPERS\pronouns.dm" -#include "code\__HELPERS\qdel.dm" -#include "code\__HELPERS\radiation.dm" -#include "code\__HELPERS\radio.dm" -#include "code\__HELPERS\reagents.dm" -#include "code\__HELPERS\roundend.dm" -#include "code\__HELPERS\sanitize_values.dm" -#include "code\__HELPERS\shell.dm" -#include "code\__HELPERS\stat_tracking.dm" -#include "code\__HELPERS\text.dm" -#include "code\__HELPERS\text_vr.dm" -#include "code\__HELPERS\time.dm" -#include "code\__HELPERS\type2type.dm" -#include "code\__HELPERS\type2type_vr.dm" -#include "code\__HELPERS\typelists.dm" -#include "code\__HELPERS\unsorted.dm" -#include "code\__HELPERS\verbs.dm" -#include "code\__HELPERS\view.dm" -#include "code\__HELPERS\sorts\__main.dm" -#include "code\__HELPERS\sorts\InsertSort.dm" -#include "code\__HELPERS\sorts\MergeSort.dm" -#include "code\__HELPERS\sorts\TimSort.dm" -#include "code\_globalvars\bitfields.dm" -#include "code\_globalvars\configuration.dm" -#include "code\_globalvars\game_modes.dm" -#include "code\_globalvars\genetics.dm" -#include "code\_globalvars\logging.dm" -#include "code\_globalvars\misc.dm" -#include "code\_globalvars\regexes.dm" -#include "code\_globalvars\lists\flavor_misc.dm" -#include "code\_globalvars\lists\maintenance_loot.dm" -#include "code\_globalvars\lists\mapping.dm" -#include "code\_globalvars\lists\medals.dm" -#include "code\_globalvars\lists\mobs.dm" -#include "code\_globalvars\lists\names.dm" -#include "code\_globalvars\lists\objects.dm" -#include "code\_globalvars\lists\poll_ignore.dm" -#include "code\_globalvars\lists\typecache.dm" -#include "code\_globalvars\lists\vending.dm" -#include "code\_js\byjax.dm" -#include "code\_js\menus.dm" -#include "code\_onclick\adjacent.dm" -#include "code\_onclick\ai.dm" -#include "code\_onclick\click.dm" -#include "code\_onclick\cyborg.dm" -#include "code\_onclick\drag_drop.dm" -#include "code\_onclick\item_attack.dm" -#include "code\_onclick\observer.dm" -#include "code\_onclick\other_mobs.dm" -#include "code\_onclick\overmind.dm" -#include "code\_onclick\telekinesis.dm" -#include "code\_onclick\hud\_defines.dm" -#include "code\_onclick\hud\action_button.dm" -#include "code\_onclick\hud\ai.dm" -#include "code\_onclick\hud\alert.dm" -#include "code\_onclick\hud\alien.dm" -#include "code\_onclick\hud\alien_larva.dm" -#include "code\_onclick\hud\blob_overmind.dm" -#include "code\_onclick\hud\blobbernauthud.dm" -#include "code\_onclick\hud\constructs.dm" -#include "code\_onclick\hud\credits.dm" -#include "code\_onclick\hud\devil.dm" -#include "code\_onclick\hud\drones.dm" -#include "code\_onclick\hud\fullscreen.dm" -#include "code\_onclick\hud\generic_dextrous.dm" -#include "code\_onclick\hud\ghost.dm" -#include "code\_onclick\hud\guardian.dm" -#include "code\_onclick\hud\hud.dm" -#include "code\_onclick\hud\hud_cit.dm" -#include "code\_onclick\hud\human.dm" -#include "code\_onclick\hud\monkey.dm" -#include "code\_onclick\hud\movable_screen_objects.dm" -#include "code\_onclick\hud\parallax.dm" -#include "code\_onclick\hud\picture_in_picture.dm" -#include "code\_onclick\hud\plane_master.dm" -#include "code\_onclick\hud\radial.dm" -#include "code\_onclick\hud\radial_persistent.dm" -#include "code\_onclick\hud\revenanthud.dm" -#include "code\_onclick\hud\robot.dm" -#include "code\_onclick\hud\screen_objects.dm" -#include "code\_onclick\hud\swarmer.dm" -#include "code\controllers\admin.dm" -#include "code\controllers\configuration_citadel.dm" -#include "code\controllers\controller.dm" -#include "code\controllers\failsafe.dm" -#include "code\controllers\globals.dm" -#include "code\controllers\hooks.dm" -#include "code\controllers\master.dm" -#include "code\controllers\subsystem.dm" -#include "code\controllers\configuration\config_entry.dm" -#include "code\controllers\configuration\configuration.dm" -#include "code\controllers\configuration\entries\comms.dm" -#include "code\controllers\configuration\entries\dbconfig.dm" -#include "code\controllers\configuration\entries\game_options.dm" -#include "code\controllers\configuration\entries\general.dm" -#include "code\controllers\subsystem\acid.dm" -#include "code\controllers\subsystem\adjacent_air.dm" -#include "code\controllers\subsystem\air.dm" -#include "code\controllers\subsystem\air_turfs.dm" -#include "code\controllers\subsystem\assets.dm" -#include "code\controllers\subsystem\atoms.dm" -#include "code\controllers\subsystem\augury.dm" -#include "code\controllers\subsystem\autotransfer.dm" -#include "code\controllers\subsystem\blackbox.dm" -#include "code\controllers\subsystem\chat.dm" -#include "code\controllers\subsystem\communications.dm" -#include "code\controllers\subsystem\dbcore.dm" -#include "code\controllers\subsystem\dcs.dm" -#include "code\controllers\subsystem\disease.dm" -#include "code\controllers\subsystem\events.dm" -#include "code\controllers\subsystem\fire_burning.dm" -#include "code\controllers\subsystem\garbage.dm" -#include "code\controllers\subsystem\icon_smooth.dm" -#include "code\controllers\subsystem\idlenpcpool.dm" -#include "code\controllers\subsystem\input.dm" -#include "code\controllers\subsystem\ipintel.dm" -#include "code\controllers\subsystem\item_spawning.dm" -#include "code\controllers\subsystem\job.dm" -#include "code\controllers\subsystem\jukeboxes.dm" -#include "code\controllers\subsystem\language.dm" -#include "code\controllers\subsystem\lighting.dm" -#include "code\controllers\subsystem\machines.dm" -#include "code\controllers\subsystem\mapping.dm" -#include "code\controllers\subsystem\medals.dm" -#include "code\controllers\subsystem\minor_mapping.dm" -#include "code\controllers\subsystem\mobs.dm" -#include "code\controllers\subsystem\moods.dm" -#include "code\controllers\subsystem\nightshift.dm" -#include "code\controllers\subsystem\npcpool.dm" -#include "code\controllers\subsystem\overlays.dm" -#include "code\controllers\subsystem\pai.dm" -#include "code\controllers\subsystem\parallax.dm" -#include "code\controllers\subsystem\pathfinder.dm" -#include "code\controllers\subsystem\persistence.dm" -#include "code\controllers\subsystem\ping.dm" -#include "code\controllers\subsystem\radiation.dm" -#include "code\controllers\subsystem\radio.dm" -#include "code\controllers\subsystem\research.dm" -#include "code\controllers\subsystem\server_maint.dm" -#include "code\controllers\subsystem\shuttle.dm" -#include "code\controllers\subsystem\spacedrift.dm" -#include "code\controllers\subsystem\statpanel.dm" -#include "code\controllers\subsystem\stickyban.dm" -#include "code\controllers\subsystem\sun.dm" -#include "code\controllers\subsystem\tgui.dm" -#include "code\controllers\subsystem\throwing.dm" -#include "code\controllers\subsystem\ticker.dm" -#include "code\controllers\subsystem\time_track.dm" -#include "code\controllers\subsystem\timer.dm" -#include "code\controllers\subsystem\title.dm" -#include "code\controllers\subsystem\traumas.dm" -#include "code\controllers\subsystem\vis_overlays.dm" -#include "code\controllers\subsystem\vore.dm" -#include "code\controllers\subsystem\vote.dm" -#include "code\controllers\subsystem\weather.dm" -#include "code\controllers\subsystem\processing\chemistry.dm" -#include "code\controllers\subsystem\processing\circuit.dm" -#include "code\controllers\subsystem\processing\fastprocess.dm" -#include "code\controllers\subsystem\processing\fields.dm" -#include "code\controllers\subsystem\processing\nanites.dm" -#include "code\controllers\subsystem\processing\networks.dm" -#include "code\controllers\subsystem\processing\obj.dm" -#include "code\controllers\subsystem\processing\processing.dm" -#include "code\controllers\subsystem\processing\projectiles.dm" -#include "code\controllers\subsystem\processing\quirks.dm" -#include "code\controllers\subsystem\processing\wet_floors.dm" -#include "code\datums\action.dm" -#include "code\datums\ai_laws.dm" -#include "code\datums\armor.dm" -#include "code\datums\beam.dm" -#include "code\datums\browser.dm" -#include "code\datums\callback.dm" -#include "code\datums\chatmessage.dm" -#include "code\datums\cinematic.dm" -#include "code\datums\dash_weapon.dm" -#include "code\datums\datacore.dm" -#include "code\datums\datum.dm" -#include "code\datums\datumvars.dm" -#include "code\datums\dna.dm" -#include "code\datums\dog_fashion.dm" -#include "code\datums\embedding_behavior.dm" -#include "code\datums\emotes.dm" -#include "code\datums\ert.dm" -#include "code\datums\explosion.dm" -#include "code\datums\forced_movement.dm" -#include "code\datums\holocall.dm" -#include "code\datums\http.dm" -#include "code\datums\hud.dm" -#include "code\datums\map_config.dm" -#include "code\datums\martial.dm" -#include "code\datums\mind.dm" -#include "code\datums\mutable_appearance.dm" -#include "code\datums\numbered_display.dm" -#include "code\datums\outfit.dm" -#include "code\datums\position_point_vector.dm" -#include "code\datums\profiling.dm" -#include "code\datums\progressbar.dm" -#include "code\datums\radiation_wave.dm" -#include "code\datums\recipe.dm" -#include "code\datums\ruins.dm" -#include "code\datums\saymode.dm" -#include "code\datums\shuttles.dm" -#include "code\datums\soullink.dm" -#include "code\datums\spawners_menu.dm" -#include "code\datums\verbs.dm" -#include "code\datums\weakrefs.dm" -#include "code\datums\world_topic.dm" -#include "code\datums\actions\beam_rifle.dm" -#include "code\datums\actions\ninja.dm" -#include "code\datums\brain_damage\brain_trauma.dm" -#include "code\datums\brain_damage\hypnosis.dm" -#include "code\datums\brain_damage\imaginary_friend.dm" -#include "code\datums\brain_damage\mild.dm" -#include "code\datums\brain_damage\phobia.dm" -#include "code\datums\brain_damage\severe.dm" -#include "code\datums\brain_damage\special.dm" -#include "code\datums\brain_damage\split_personality.dm" -#include "code\datums\components\_component.dm" -#include "code\datums\components\anti_magic.dm" -#include "code\datums\components\armor_plate.dm" -#include "code\datums\components\bouncy.dm" -#include "code\datums\components\butchering.dm" -#include "code\datums\components\caltrop.dm" -#include "code\datums\components\chasm.dm" -#include "code\datums\components\construction.dm" -#include "code\datums\components\decal.dm" -#include "code\datums\components\earprotection.dm" -#include "code\datums\components\edit_complainer.dm" -#include "code\datums\components\empprotection.dm" -#include "code\datums\components\footstep.dm" -#include "code\datums\components\forced_gravity.dm" -#include "code\datums\components\infective.dm" -#include "code\datums\components\jousting.dm" -#include "code\datums\components\knockoff.dm" -#include "code\datums\components\lockon_aiming.dm" -#include "code\datums\components\magnetic_catch.dm" -#include "code\datums\components\material_container.dm" -#include "code\datums\components\mirage_border.dm" -#include "code\datums\components\mood.dm" -#include "code\datums\components\nanites.dm" -#include "code\datums\components\ntnet_interface.dm" -#include "code\datums\components\orbiter.dm" -#include "code\datums\components\paintable.dm" -#include "code\datums\components\rad_insulation.dm" -#include "code\datums\components\radioactive.dm" -#include "code\datums\components\remote_materials.dm" -#include "code\datums\components\riding.dm" -#include "code\datums\components\rotation.dm" -#include "code\datums\components\signal_redirect.dm" -#include "code\datums\components\sizzle.dm" -#include "code\datums\components\slippery.dm" -#include "code\datums\components\spawner.dm" -#include "code\datums\components\spooky.dm" -#include "code\datums\components\squeak.dm" -#include "code\datums\components\stationloving.dm" -#include "code\datums\components\swarming.dm" -#include "code\datums\components\thermite.dm" -#include "code\datums\components\twitch_plays.dm" -#include "code\datums\components\uplink.dm" -#include "code\datums\components\wearertargeting.dm" -#include "code\datums\components\wet_floor.dm" -#include "code\datums\components\crafting\craft.dm" -#include "code\datums\components\crafting\guncrafting.dm" -#include "code\datums\components\crafting\recipes.dm" -#include "code\datums\components\crafting\recipes\recipes_clothing.dm" -#include "code\datums\components\crafting\recipes\recipes_misc.dm" -#include "code\datums\components\crafting\recipes\recipes_primal.dm" -#include "code\datums\components\crafting\recipes\recipes_robot.dm" -#include "code\datums\components\crafting\recipes\recipes_weapon_and_ammo.dm" -#include "code\datums\components\storage\storage.dm" -#include "code\datums\components\storage\concrete\_concrete.dm" -#include "code\datums\components\storage\concrete\bag_of_holding.dm" -#include "code\datums\components\storage\concrete\bluespace.dm" -#include "code\datums\components\storage\concrete\emergency.dm" -#include "code\datums\components\storage\concrete\implant.dm" -#include "code\datums\components\storage\concrete\pockets.dm" -#include "code\datums\components\storage\concrete\rped.dm" -#include "code\datums\components\storage\concrete\special.dm" -#include "code\datums\components\storage\concrete\stack.dm" -#include "code\datums\diseases\_disease.dm" -#include "code\datums\diseases\_MobProcs.dm" -#include "code\datums\diseases\anxiety.dm" -#include "code\datums\diseases\appendicitis.dm" -#include "code\datums\diseases\beesease.dm" -#include "code\datums\diseases\brainrot.dm" -#include "code\datums\diseases\cold.dm" -#include "code\datums\diseases\cold9.dm" -#include "code\datums\diseases\dna_spread.dm" -#include "code\datums\diseases\fake_gbs.dm" -#include "code\datums\diseases\flu.dm" -#include "code\datums\diseases\fluspanish.dm" -#include "code\datums\diseases\gbs.dm" -#include "code\datums\diseases\heart_failure.dm" -#include "code\datums\diseases\magnitis.dm" -#include "code\datums\diseases\parrotpossession.dm" -#include "code\datums\diseases\pierrot_throat.dm" -#include "code\datums\diseases\retrovirus.dm" -#include "code\datums\diseases\rhumba_beat.dm" -#include "code\datums\diseases\transformation.dm" -#include "code\datums\diseases\tuberculosis.dm" -#include "code\datums\diseases\wizarditis.dm" -#include "code\datums\diseases\advance\advance.dm" -#include "code\datums\diseases\advance\presets.dm" -#include "code\datums\diseases\advance\symptoms\beard.dm" -#include "code\datums\diseases\advance\symptoms\choking.dm" -#include "code\datums\diseases\advance\symptoms\confusion.dm" -#include "code\datums\diseases\advance\symptoms\cough.dm" -#include "code\datums\diseases\advance\symptoms\deafness.dm" -#include "code\datums\diseases\advance\symptoms\dizzy.dm" -#include "code\datums\diseases\advance\symptoms\fever.dm" -#include "code\datums\diseases\advance\symptoms\fire.dm" -#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" -#include "code\datums\diseases\advance\symptoms\hallucigen.dm" -#include "code\datums\diseases\advance\symptoms\headache.dm" -#include "code\datums\diseases\advance\symptoms\heal.dm" -#include "code\datums\diseases\advance\symptoms\itching.dm" -#include "code\datums\diseases\advance\symptoms\nanites.dm" -#include "code\datums\diseases\advance\symptoms\narcolepsy.dm" -#include "code\datums\diseases\advance\symptoms\oxygen.dm" -#include "code\datums\diseases\advance\symptoms\sensory.dm" -#include "code\datums\diseases\advance\symptoms\shedding.dm" -#include "code\datums\diseases\advance\symptoms\shivering.dm" -#include "code\datums\diseases\advance\symptoms\skin.dm" -#include "code\datums\diseases\advance\symptoms\sneeze.dm" -#include "code\datums\diseases\advance\symptoms\species.dm" -#include "code\datums\diseases\advance\symptoms\symptoms.dm" -#include "code\datums\diseases\advance\symptoms\viral.dm" -#include "code\datums\diseases\advance\symptoms\vision.dm" -#include "code\datums\diseases\advance\symptoms\voice_change.dm" -#include "code\datums\diseases\advance\symptoms\vomit.dm" -#include "code\datums\diseases\advance\symptoms\weight.dm" -#include "code\datums\diseases\advance\symptoms\youth.dm" -#include "code\datums\elements\_element.dm" -#include "code\datums\elements\bed_tucking.dm" -#include "code\datums\elements\cleaning.dm" -#include "code\datums\elements\earhealing.dm" -#include "code\datums\elements\flavor_text.dm" -#include "code\datums\elements\ghost_role_eligibility.dm" -#include "code\datums\elements\mob_holder.dm" -#include "code\datums\elements\swimming.dm" -#include "code\datums\elements\wuv.dm" -#include "code\datums\helper_datums\events.dm" -#include "code\datums\helper_datums\getrev.dm" -#include "code\datums\helper_datums\icon_snapshot.dm" -#include "code\datums\helper_datums\teleport.dm" -#include "code\datums\helper_datums\topic_input.dm" -#include "code\datums\looping_sounds\_looping_sound.dm" -#include "code\datums\looping_sounds\item_sounds.dm" -#include "code\datums\looping_sounds\machinery_sounds.dm" -#include "code\datums\looping_sounds\weather.dm" -#include "code\datums\martial\boxing.dm" -#include "code\datums\martial\cqc.dm" -#include "code\datums\martial\krav_maga.dm" -#include "code\datums\martial\mushpunch.dm" -#include "code\datums\martial\plasma_fist.dm" -#include "code\datums\martial\psychotic_brawl.dm" -#include "code\datums\martial\sleeping_carp.dm" -#include "code\datums\martial\wrestling.dm" -#include "code\datums\mood_events\beauty_events.dm" -#include "code\datums\mood_events\drink_events.dm" -#include "code\datums\mood_events\drug_events.dm" -#include "code\datums\mood_events\generic_negative_events.dm" -#include "code\datums\mood_events\generic_positive_events.dm" -#include "code\datums\mood_events\mood_event.dm" -#include "code\datums\mood_events\needs_events.dm" -#include "code\datums\mutations\_mutations.dm" -#include "code\datums\mutations\actions.dm" -#include "code\datums\mutations\antenna.dm" -#include "code\datums\mutations\body.dm" -#include "code\datums\mutations\chameleon.dm" -#include "code\datums\mutations\cold_resistance.dm" -#include "code\datums\mutations\combined.dm" -#include "code\datums\mutations\hulk.dm" -#include "code\datums\mutations\radioactive.dm" -#include "code\datums\mutations\sight.dm" -#include "code\datums\mutations\speech.dm" -#include "code\datums\mutations\telekinesis.dm" -#include "code\datums\ruins\lavaland.dm" -#include "code\datums\ruins\space.dm" -#include "code\datums\ruins\station.dm" -#include "code\datums\status_effects\buffs.dm" -#include "code\datums\status_effects\debuffs.dm" -#include "code\datums\status_effects\gas.dm" -#include "code\datums\status_effects\neutral.dm" -#include "code\datums\status_effects\status_effect.dm" -#include "code\datums\traits\_quirk.dm" -#include "code\datums\traits\good.dm" -#include "code\datums\traits\negative.dm" -#include "code\datums\traits\neutral.dm" -#include "code\datums\weather\weather.dm" -#include "code\datums\weather\weather_types\acid_rain.dm" -#include "code\datums\weather\weather_types\ash_storm.dm" -#include "code\datums\weather\weather_types\floor_is_lava.dm" -#include "code\datums\weather\weather_types\layenia.dm" -#include "code\datums\weather\weather_types\radiation_storm.dm" -#include "code\datums\weather\weather_types\snow_storm.dm" -#include "code\datums\wires\_wires.dm" -#include "code\datums\wires\airalarm.dm" -#include "code\datums\wires\airlock.dm" -#include "code\datums\wires\apc.dm" -#include "code\datums\wires\autolathe.dm" -#include "code\datums\wires\emitter.dm" -#include "code\datums\wires\explosive.dm" -#include "code\datums\wires\microwave.dm" -#include "code\datums\wires\mulebot.dm" -#include "code\datums\wires\particle_accelerator.dm" -#include "code\datums\wires\r_n_d.dm" -#include "code\datums\wires\radio.dm" -#include "code\datums\wires\robot.dm" -#include "code\datums\wires\suit_storage_unit.dm" -#include "code\datums\wires\syndicatebomb.dm" -#include "code\datums\wires\tesla_coil.dm" -#include "code\datums\wires\vending.dm" -#include "code\game\alternate_appearance.dm" -#include "code\game\atoms.dm" -#include "code\game\atoms_movable.dm" -#include "code\game\communications.dm" -#include "code\game\data_huds.dm" -#include "code\game\say.dm" -#include "code\game\shuttle_engines.dm" -#include "code\game\sound.dm" -#include "code\game\world.dm" -#include "code\game\area\ai_monitored.dm" -#include "code\game\area\areas.dm" -#include "code\game\area\Space_Station_13_areas.dm" -#include "code\game\area\areas\away_content.dm" -#include "code\game\area\areas\centcom.dm" -#include "code\game\area\areas\holodeck.dm" -#include "code\game\area\areas\layenia.dm" -#include "code\game\area\areas\mining.dm" -#include "code\game\area\areas\shuttles.dm" -#include "code\game\area\areas\ruins\_ruins.dm" -#include "code\game\area\areas\ruins\lavaland.dm" -#include "code\game\area\areas\ruins\space.dm" -#include "code\game\area\areas\ruins\templates.dm" -#include "code\game\gamemodes\events.dm" -#include "code\game\gamemodes\game_mode.dm" -#include "code\game\gamemodes\objective.dm" -#include "code\game\gamemodes\objective_items.dm" -#include "code\game\gamemodes\bloodsucker\bloodsucker.dm" -#include "code\game\gamemodes\bloodsucker\hunter.dm" -#include "code\game\gamemodes\brother\traitor_bro.dm" -#include "code\game\gamemodes\changeling\changeling.dm" -#include "code\game\gamemodes\changeling\traitor_chan.dm" -#include "code\game\gamemodes\clock_cult\clock_cult.dm" -#include "code\game\gamemodes\clown_ops\bananium_bomb.dm" -#include "code\game\gamemodes\clown_ops\clown_ops.dm" -#include "code\game\gamemodes\clown_ops\clown_weapons.dm" -#include "code\game\gamemodes\cult\cult.dm" -#include "code\game\gamemodes\devil\devil_game_mode.dm" -#include "code\game\gamemodes\devil\game_mode.dm" -#include "code\game\gamemodes\devil\objectives.dm" -#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" -#include "code\game\gamemodes\dynamic\dynamic.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" -#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" -#include "code\game\gamemodes\extended\extended.dm" -#include "code\game\gamemodes\meteor\meteor.dm" -#include "code\game\gamemodes\meteor\meteors.dm" -#include "code\game\gamemodes\monkey\monkey.dm" -#include "code\game\gamemodes\nuclear\nuclear.dm" -#include "code\game\gamemodes\overthrow\objective.dm" -#include "code\game\gamemodes\overthrow\overthrow.dm" -#include "code\game\gamemodes\revolution\revolution.dm" -#include "code\game\gamemodes\sandbox\airlock_maker.dm" -#include "code\game\gamemodes\sandbox\h_sandbox.dm" -#include "code\game\gamemodes\sandbox\sandbox.dm" -#include "code\game\gamemodes\traitor\double_agents.dm" -#include "code\game\gamemodes\traitor\traitor.dm" -#include "code\game\gamemodes\wizard\wizard.dm" -#include "code\game\machinery\_machinery.dm" -#include "code\game\machinery\ai_slipper.dm" -#include "code\game\machinery\airlock_control.dm" -#include "code\game\machinery\announcement_system.dm" -#include "code\game\machinery\aug_manipulator.dm" -#include "code\game\machinery\autolathe.dm" -#include "code\game\machinery\bank_machine.dm" -#include "code\game\machinery\Beacon.dm" -#include "code\game\machinery\bloodbankgen.dm" -#include "code\game\machinery\buttons.dm" -#include "code\game\machinery\cell_charger.dm" -#include "code\game\machinery\cloning.dm" -#include "code\game\machinery\constructable_frame.dm" -#include "code\game\machinery\dance_machine.dm" -#include "code\game\machinery\defibrillator_mount.dm" -#include "code\game\machinery\deployable.dm" -#include "code\game\machinery\dish_drive.dm" -#include "code\game\machinery\dna_scanner.dm" -#include "code\game\machinery\doppler_array.dm" -#include "code\game\machinery\droneDispenser.dm" -#include "code\game\machinery\exp_cloner.dm" -#include "code\game\machinery\firealarm.dm" -#include "code\game\machinery\flasher.dm" -#include "code\game\machinery\gulag_item_reclaimer.dm" -#include "code\game\machinery\gulag_teleporter.dm" -#include "code\game\machinery\harvester.dm" -#include "code\game\machinery\hologram.dm" -#include "code\game\machinery\igniter.dm" -#include "code\game\machinery\iv_drip.dm" -#include "code\game\machinery\launch_pad.dm" -#include "code\game\machinery\lightswitch.dm" -#include "code\game\machinery\limbgrower.dm" -#include "code\game\machinery\magnet.dm" -#include "code\game\machinery\mass_driver.dm" -#include "code\game\machinery\navbeacon.dm" -#include "code\game\machinery\newscaster.dm" -#include "code\game\machinery\PDApainter.dm" -#include "code\game\machinery\posi_alert.dm" -#include "code\game\machinery\quantum_pad.dm" -#include "code\game\machinery\recharger.dm" -#include "code\game\machinery\rechargestation.dm" -#include "code\game\machinery\recycler.dm" -#include "code\game\machinery\requests_console.dm" -#include "code\game\machinery\shieldgen.dm" -#include "code\game\machinery\Sleeper.dm" -#include "code\game\machinery\slotmachine.dm" -#include "code\game\machinery\spaceheater.dm" -#include "code\game\machinery\stasis.dm" -#include "code\game\machinery\status_display.dm" -#include "code\game\machinery\suit_storage_unit.dm" -#include "code\game\machinery\syndicatebeacon.dm" -#include "code\game\machinery\syndicatebomb.dm" -#include "code\game\machinery\teleporter.dm" -#include "code\game\machinery\transformer.dm" -#include "code\game\machinery\washing_machine.dm" -#include "code\game\machinery\wishgranter.dm" -#include "code\game\machinery\camera\camera.dm" -#include "code\game\machinery\camera\camera_assembly.dm" -#include "code\game\machinery\camera\motion.dm" -#include "code\game\machinery\camera\presets.dm" -#include "code\game\machinery\camera\tracking.dm" -#include "code\game\machinery\computer\_computer.dm" -#include "code\game\machinery\computer\aifixer.dm" -#include "code\game\machinery\computer\apc_control.dm" -#include "code\game\machinery\computer\arcade.dm" -#include "code\game\machinery\computer\atmos_alert.dm" -#include "code\game\machinery\computer\atmos_control.dm" -#include "code\game\machinery\computer\buildandrepair.dm" -#include "code\game\machinery\computer\camera.dm" -#include "code\game\machinery\computer\camera_advanced.dm" -#include "code\game\machinery\computer\card.dm" -#include "code\game\machinery\computer\cloning.dm" -#include "code\game\machinery\computer\communications.dm" -#include "code\game\machinery\computer\crew.dm" -#include "code\game\machinery\computer\dna_console.dm" -#include "code\game\machinery\computer\launchpad_control.dm" -#include "code\game\machinery\computer\law.dm" -#include "code\game\machinery\computer\medical.dm" -#include "code\game\machinery\computer\Operating.dm" -#include "code\game\machinery\computer\pod.dm" -#include "code\game\machinery\computer\robot.dm" -#include "code\game\machinery\computer\security.dm" -#include "code\game\machinery\computer\station_alert.dm" -#include "code\game\machinery\computer\telecrystalconsoles.dm" -#include "code\game\machinery\computer\teleporter.dm" -#include "code\game\machinery\computer\arcade\battle.dm" -#include "code\game\machinery\computer\arcade\minesweeper.dm" -#include "code\game\machinery\computer\arcade\misc_arcade.dm" -#include "code\game\machinery\computer\arcade\orion_trail.dm" -#include "code\game\machinery\computer\prisoner\_prisoner.dm" -#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm" -#include "code\game\machinery\computer\prisoner\management.dm" -#include "code\game\machinery\doors\airlock.dm" -#include "code\game\machinery\doors\airlock_electronics.dm" -#include "code\game\machinery\doors\airlock_types.dm" -#include "code\game\machinery\doors\alarmlock.dm" -#include "code\game\machinery\doors\brigdoors.dm" -#include "code\game\machinery\doors\checkForMultipleDoors.dm" -#include "code\game\machinery\doors\door.dm" -#include "code\game\machinery\doors\firedoor.dm" -#include "code\game\machinery\doors\passworddoor.dm" -#include "code\game\machinery\doors\poddoor.dm" -#include "code\game\machinery\doors\shutters.dm" -#include "code\game\machinery\doors\unpowered.dm" -#include "code\game\machinery\doors\windowdoor.dm" -#include "code\game\machinery\embedded_controller\access_controller.dm" -#include "code\game\machinery\embedded_controller\airlock_controller.dm" -#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" -#include "code\game\machinery\embedded_controller\simple_vent_controller.dm" -#include "code\game\machinery\pipe\construction.dm" -#include "code\game\machinery\pipe\pipe_dispenser.dm" -#include "code\game\machinery\porta_turret\portable_turret.dm" -#include "code\game\machinery\porta_turret\portable_turret_construct.dm" -#include "code\game\machinery\porta_turret\portable_turret_cover.dm" -#include "code\game\machinery\poweredfans\fan_assembly.dm" -#include "code\game\machinery\poweredfans\poweredfans.dm" -#include "code\game\machinery\telecomms\broadcasting.dm" -#include "code\game\machinery\telecomms\machine_interactions.dm" -#include "code\game\machinery\telecomms\telecomunications.dm" -#include "code\game\machinery\telecomms\computers\logbrowser.dm" -#include "code\game\machinery\telecomms\computers\message.dm" -#include "code\game\machinery\telecomms\computers\telemonitor.dm" -#include "code\game\machinery\telecomms\machines\allinone.dm" -#include "code\game\machinery\telecomms\machines\broadcaster.dm" -#include "code\game\machinery\telecomms\machines\bus.dm" -#include "code\game\machinery\telecomms\machines\hub.dm" -#include "code\game\machinery\telecomms\machines\message_server.dm" -#include "code\game\machinery\telecomms\machines\processor.dm" -#include "code\game\machinery\telecomms\machines\receiver.dm" -#include "code\game\machinery\telecomms\machines\relay.dm" -#include "code\game\machinery\telecomms\machines\server.dm" -#include "code\game\mecha\mech_bay.dm" -#include "code\game\mecha\mech_fabricator.dm" -#include "code\game\mecha\mecha.dm" -#include "code\game\mecha\mecha_actions.dm" -#include "code\game\mecha\mecha_construction_paths.dm" -#include "code\game\mecha\mecha_control_console.dm" -#include "code\game\mecha\mecha_defense.dm" -#include "code\game\mecha\mecha_parts.dm" -#include "code\game\mecha\mecha_topic.dm" -#include "code\game\mecha\mecha_wreckage.dm" -#include "code\game\mecha\combat\combat.dm" -#include "code\game\mecha\combat\durand.dm" -#include "code\game\mecha\combat\gygax.dm" -#include "code\game\mecha\combat\honker.dm" -#include "code\game\mecha\combat\marauder.dm" -#include "code\game\mecha\combat\neovgre.dm" -#include "code\game\mecha\combat\phazon.dm" -#include "code\game\mecha\combat\reticence.dm" -#include "code\game\mecha\equipment\mecha_equipment.dm" -#include "code\game\mecha\equipment\tools\medical_tools.dm" -#include "code\game\mecha\equipment\tools\mining_tools.dm" -#include "code\game\mecha\equipment\tools\other_tools.dm" -#include "code\game\mecha\equipment\tools\work_tools.dm" -#include "code\game\mecha\equipment\weapons\weapons.dm" -#include "code\game\mecha\medical\medical.dm" -#include "code\game\mecha\medical\odysseus.dm" -#include "code\game\mecha\working\ripley.dm" -#include "code\game\mecha\working\working.dm" -#include "code\game\objects\buckling.dm" -#include "code\game\objects\empulse.dm" -#include "code\game\objects\items.dm" -#include "code\game\objects\obj_defense.dm" -#include "code\game\objects\objs.dm" -#include "code\game\objects\structures.dm" -#include "code\game\objects\effects\alien_acid.dm" -#include "code\game\objects\effects\anomalies.dm" -#include "code\game\objects\effects\blessing.dm" -#include "code\game\objects\effects\bump_teleporter.dm" -#include "code\game\objects\effects\contraband.dm" -#include "code\game\objects\effects\countdown.dm" -#include "code\game\objects\effects\effects.dm" -#include "code\game\objects\effects\forcefields.dm" -#include "code\game\objects\effects\glowshroom.dm" -#include "code\game\objects\effects\landmarks.dm" -#include "code\game\objects\effects\mines.dm" -#include "code\game\objects\effects\misc.dm" -#include "code\game\objects\effects\overlays.dm" -#include "code\game\objects\effects\portals.dm" -#include "code\game\objects\effects\proximity.dm" -#include "code\game\objects\effects\spiders.dm" -#include "code\game\objects\effects\step_triggers.dm" -#include "code\game\objects\effects\wanted_poster.dm" -#include "code\game\objects\effects\decals\cleanable.dm" -#include "code\game\objects\effects\decals\crayon.dm" -#include "code\game\objects\effects\decals\decal.dm" -#include "code\game\objects\effects\decals\misc.dm" -#include "code\game\objects\effects\decals\remains.dm" -#include "code\game\objects\effects\decals\cleanable\aliens.dm" -#include "code\game\objects\effects\decals\cleanable\gibs.dm" -#include "code\game\objects\effects\decals\cleanable\humans.dm" -#include "code\game\objects\effects\decals\cleanable\misc.dm" -#include "code\game\objects\effects\decals\cleanable\robots.dm" -#include "code\game\objects\effects\decals\turfdecal\dirt.dm" -#include "code\game\objects\effects\decals\turfdecal\markings.dm" -#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" -#include "code\game\objects\effects\decals\turfdecal\weather.dm" -#include "code\game\objects\effects\effect_system\effect_system.dm" -#include "code\game\objects\effects\effect_system\effects_explosion.dm" -#include "code\game\objects\effects\effect_system\effects_foam.dm" -#include "code\game\objects\effects\effect_system\effects_other.dm" -#include "code\game\objects\effects\effect_system\effects_smoke.dm" -#include "code\game\objects\effects\effect_system\effects_sparks.dm" -#include "code\game\objects\effects\effect_system\effects_water.dm" -#include "code\game\objects\effects\spawners\bombspawner.dm" -#include "code\game\objects\effects\spawners\bundle.dm" -#include "code\game\objects\effects\spawners\gibspawner.dm" -#include "code\game\objects\effects\spawners\lootdrop.dm" -#include "code\game\objects\effects\spawners\structure.dm" -#include "code\game\objects\effects\spawners\traps.dm" -#include "code\game\objects\effects\spawners\vaultspawner.dm" -#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" -#include "code\game\objects\effects\temporary_visuals\clockcult.dm" -#include "code\game\objects\effects\temporary_visuals\cult.dm" -#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" -#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" -#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "code\game\objects\items\AI_modules.dm" -#include "code\game\objects\items\airlock_painter.dm" -#include "code\game\objects\items\apc_frame.dm" -#include "code\game\objects\items\blueprints.dm" -#include "code\game\objects\items\body_egg.dm" -#include "code\game\objects\items\bodybag.dm" -#include "code\game\objects\items\candle.dm" -#include "code\game\objects\items\cardboard_cutouts.dm" -#include "code\game\objects\items\cards_ids.dm" -#include "code\game\objects\items\charter.dm" -#include "code\game\objects\items\chromosome.dm" -#include "code\game\objects\items\chrono_eraser.dm" -#include "code\game\objects\items\cigs_lighters.dm" -#include "code\game\objects\items\clown_items.dm" -#include "code\game\objects\items\control_wand.dm" -#include "code\game\objects\items\cosmetics.dm" -#include "code\game\objects\items\courtroom.dm" -#include "code\game\objects\items\crayons.dm" -#include "code\game\objects\items\defib.dm" -#include "code\game\objects\items\dehy_carp.dm" -#include "code\game\objects\items\dice.dm" -#include "code\game\objects\items\dna_injector.dm" -#include "code\game\objects\items\documents.dm" -#include "code\game\objects\items\eightball.dm" -#include "code\game\objects\items\extinguisher.dm" -#include "code\game\objects\items\flamethrower.dm" -#include "code\game\objects\items\gift.dm" -#include "code\game\objects\items\granters.dm" -#include "code\game\objects\items\handcuffs.dm" -#include "code\game\objects\items\his_grace.dm" -#include "code\game\objects\items\holosign_creator.dm" -#include "code\game\objects\items\holy_weapons.dm" -#include "code\game\objects\items\hot_potato.dm" -#include "code\game\objects\items\inducer.dm" -#include "code\game\objects\items\kitchen.dm" -#include "code\game\objects\items\latexballoon.dm" -#include "code\game\objects\items\lorebooks.dm" -#include "code\game\objects\items\manuals.dm" -#include "code\game\objects\items\mesmetron.dm" -#include "code\game\objects\items\miscellaneous.dm" -#include "code\game\objects\items\mop.dm" -#include "code\game\objects\items\paint.dm" -#include "code\game\objects\items\paiwire.dm" -#include "code\game\objects\items\pet_carrier.dm" -#include "code\game\objects\items\pinpointer.dm" -#include "code\game\objects\items\plushes.dm" -#include "code\game\objects\items\pneumaticCannon.dm" -#include "code\game\objects\items\powerfist.dm" -#include "code\game\objects\items\RCD.dm" -#include "code\game\objects\items\RCL.dm" -#include "code\game\objects\items\religion.dm" -#include "code\game\objects\items\RPD.dm" -#include "code\game\objects\items\RSF.dm" -#include "code\game\objects\items\scrolls.dm" -#include "code\game\objects\items\sharpener.dm" -#include "code\game\objects\items\shields.dm" -#include "code\game\objects\items\shooting_range.dm" -#include "code\game\objects\items\signs.dm" -#include "code\game\objects\items\singularityhammer.dm" -#include "code\game\objects\items\stunbaton.dm" -#include "code\game\objects\items\taster.dm" -#include "code\game\objects\items\teleportation.dm" -#include "code\game\objects\items\teleprod.dm" -#include "code\game\objects\items\theft_tools.dm" -#include "code\game\objects\items\toys.dm" -#include "code\game\objects\items\trash.dm" -#include "code\game\objects\items\twohanded.dm" -#include "code\game\objects\items\vending_items.dm" -#include "code\game\objects\items\weaponry.dm" -#include "code\game\objects\items\circuitboards\circuitboard.dm" -#include "code\game\objects\items\circuitboards\computer_circuitboards.dm" -#include "code\game\objects\items\circuitboards\machine_circuitboards.dm" -#include "code\game\objects\items\devices\aicard.dm" -#include "code\game\objects\items\devices\anomaly_neutralizer.dm" -#include "code\game\objects\items\devices\beacon.dm" -#include "code\game\objects\items\devices\camera_bug.dm" -#include "code\game\objects\items\devices\chameleonproj.dm" -#include "code\game\objects\items\devices\compressionkit.dm" -#include "code\game\objects\items\devices\desynchronizer.dm" -#include "code\game\objects\items\devices\dogborg_sleeper.dm" -#include "code\game\objects\items\devices\doorCharge.dm" -#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" -#include "code\game\objects\items\devices\flashlight.dm" -#include "code\game\objects\items\devices\forcefieldprojector.dm" -#include "code\game\objects\items\devices\geiger_counter.dm" -#include "code\game\objects\items\devices\glue.dm" -#include "code\game\objects\items\devices\gps.dm" -#include "code\game\objects\items\devices\instruments.dm" -#include "code\game\objects\items\devices\laserpointer.dm" -#include "code\game\objects\items\devices\lightreplacer.dm" -#include "code\game\objects\items\devices\megaphone.dm" -#include "code\game\objects\items\devices\multitool.dm" -#include "code\game\objects\items\devices\paicard.dm" -#include "code\game\objects\items\devices\pipe_painter.dm" -#include "code\game\objects\items\devices\powersink.dm" -#include "code\game\objects\items\devices\pressureplates.dm" -#include "code\game\objects\items\devices\quantum_keycard.dm" -#include "code\game\objects\items\devices\reverse_bear_trap.dm" -#include "code\game\objects\items\devices\scanners.dm" -#include "code\game\objects\items\devices\sensor_device.dm" -#include "code\game\objects\items\devices\taperecorder.dm" -#include "code\game\objects\items\devices\traitordevices.dm" -#include "code\game\objects\items\devices\transfer_valve.dm" -#include "code\game\objects\items\devices\PDA\cart.dm" -#include "code\game\objects\items\devices\PDA\PDA.dm" -#include "code\game\objects\items\devices\PDA\PDA_types.dm" -#include "code\game\objects\items\devices\PDA\radio.dm" -#include "code\game\objects\items\devices\PDA\virus_cart.dm" -#include "code\game\objects\items\devices\radio\electropack.dm" -#include "code\game\objects\items\devices\radio\encryptionkey.dm" -#include "code\game\objects\items\devices\radio\headset.dm" -#include "code\game\objects\items\devices\radio\intercom.dm" -#include "code\game\objects\items\devices\radio\radio.dm" -#include "code\game\objects\items\grenades\antigravity.dm" -#include "code\game\objects\items\grenades\chem_grenade.dm" -#include "code\game\objects\items\grenades\clusterbuster.dm" -#include "code\game\objects\items\grenades\emgrenade.dm" -#include "code\game\objects\items\grenades\flashbang.dm" -#include "code\game\objects\items\grenades\ghettobomb.dm" -#include "code\game\objects\items\grenades\grenade.dm" -#include "code\game\objects\items\grenades\plastic.dm" -#include "code\game\objects\items\grenades\smokebomb.dm" -#include "code\game\objects\items\grenades\spawnergrenade.dm" -#include "code\game\objects\items\grenades\syndieminibomb.dm" -#include "code\game\objects\items\implants\implant.dm" -#include "code\game\objects\items\implants\implant_abductor.dm" -#include "code\game\objects\items\implants\implant_chem.dm" -#include "code\game\objects\items\implants\implant_clown.dm" -#include "code\game\objects\items\implants\implant_CQC.dm" -#include "code\game\objects\items\implants\implant_exile.dm" -#include "code\game\objects\items\implants\implant_explosive.dm" -#include "code\game\objects\items\implants\implant_freedom.dm" -#include "code\game\objects\items\implants\implant_krav_maga.dm" -#include "code\game\objects\items\implants\implant_mindshield.dm" -#include "code\game\objects\items\implants\implant_misc.dm" -#include "code\game\objects\items\implants\implant_mushpunch.dm" -#include "code\game\objects\items\implants\implant_plasmafist.dm" -#include "code\game\objects\items\implants\implant_psychobrawl.dm" -#include "code\game\objects\items\implants\implant_radio.dm" -#include "code\game\objects\items\implants\implant_slave.dm" -#include "code\game\objects\items\implants\implant_sleepingcarp.dm" -#include "code\game\objects\items\implants\implant_spell.dm" -#include "code\game\objects\items\implants\implant_stealth.dm" -#include "code\game\objects\items\implants\implant_storage.dm" -#include "code\game\objects\items\implants\implant_track.dm" -#include "code\game\objects\items\implants\implant_uplink.dm" -#include "code\game\objects\items\implants\implant_wrestling.dm" -#include "code\game\objects\items\implants\implantcase.dm" -#include "code\game\objects\items\implants\implantchair.dm" -#include "code\game\objects\items\implants\implanter.dm" -#include "code\game\objects\items\implants\implantpad.dm" -#include "code\game\objects\items\melee\energy.dm" -#include "code\game\objects\items\melee\misc.dm" -#include "code\game\objects\items\melee\transforming.dm" -#include "code\game\objects\items\robot\ai_upgrades.dm" -#include "code\game\objects\items\robot\robot_items.dm" -#include "code\game\objects\items\robot\robot_parts.dm" -#include "code\game\objects\items\robot\robot_upgrades.dm" -#include "code\game\objects\items\stacks\bscrystal.dm" -#include "code\game\objects\items\stacks\cash.dm" -#include "code\game\objects\items\stacks\medical.dm" -#include "code\game\objects\items\stacks\rods.dm" -#include "code\game\objects\items\stacks\stack.dm" -#include "code\game\objects\items\stacks\telecrystal.dm" -#include "code\game\objects\items\stacks\wrap.dm" -#include "code\game\objects\items\stacks\sheets\glass.dm" -#include "code\game\objects\items\stacks\sheets\leather.dm" -#include "code\game\objects\items\stacks\sheets\light.dm" -#include "code\game\objects\items\stacks\sheets\mineral.dm" -#include "code\game\objects\items\stacks\sheets\sheet_types.dm" -#include "code\game\objects\items\stacks\sheets\sheets.dm" -#include "code\game\objects\items\stacks\tiles\light.dm" -#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" -#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" -#include "code\game\objects\items\stacks\tiles\tile_types.dm" -#include "code\game\objects\items\storage\backpack.dm" -#include "code\game\objects\items\storage\bags.dm" -#include "code\game\objects\items\storage\belt.dm" -#include "code\game\objects\items\storage\book.dm" -#include "code\game\objects\items\storage\boxes.dm" -#include "code\game\objects\items\storage\briefcase.dm" -#include "code\game\objects\items\storage\dakis.dm" -#include "code\game\objects\items\storage\fancy.dm" -#include "code\game\objects\items\storage\firstaid.dm" -#include "code\game\objects\items\storage\lockbox.dm" -#include "code\game\objects\items\storage\secure.dm" -#include "code\game\objects\items\storage\storage.dm" -#include "code\game\objects\items\storage\toolbox.dm" -#include "code\game\objects\items\storage\uplink_kits.dm" -#include "code\game\objects\items\storage\wallets.dm" -#include "code\game\objects\items\tanks\jetpack.dm" -#include "code\game\objects\items\tanks\tank_types.dm" -#include "code\game\objects\items\tanks\tanks.dm" -#include "code\game\objects\items\tanks\watertank.dm" -#include "code\game\objects\items\tools\crowbar.dm" -#include "code\game\objects\items\tools\screwdriver.dm" -#include "code\game\objects\items\tools\weldingtool.dm" -#include "code\game\objects\items\tools\wirecutters.dm" -#include "code\game\objects\items\tools\wrench.dm" -#include "code\game\objects\structures\ai_core.dm" -#include "code\game\objects\structures\aliens.dm" -#include "code\game\objects\structures\artstuff.dm" -#include "code\game\objects\structures\barsigns.dm" -#include "code\game\objects\structures\bedsheet_bin.dm" -#include "code\game\objects\structures\destructible_structures.dm" -#include "code\game\objects\structures\displaycase.dm" -#include "code\game\objects\structures\divine.dm" -#include "code\game\objects\structures\door_assembly.dm" -#include "code\game\objects\structures\door_assembly_types.dm" -#include "code\game\objects\structures\dresser.dm" -#include "code\game\objects\structures\electricchair.dm" -#include "code\game\objects\structures\extinguisher.dm" -#include "code\game\objects\structures\false_walls.dm" -#include "code\game\objects\structures\fence.dm" -#include "code\game\objects\structures\fireaxe.dm" -#include "code\game\objects\structures\fireplace.dm" -#include "code\game\objects\structures\flora.dm" -#include "code\game\objects\structures\fluff.dm" -#include "code\game\objects\structures\ghost_role_spawners.dm" -#include "code\game\objects\structures\girders.dm" -#include "code\game\objects\structures\grille.dm" -#include "code\game\objects\structures\guillotine.dm" -#include "code\game\objects\structures\guncase.dm" -#include "code\game\objects\structures\headpike.dm" -#include "code\game\objects\structures\hivebot.dm" -#include "code\game\objects\structures\holosign.dm" -#include "code\game\objects\structures\janicart.dm" -#include "code\game\objects\structures\kitchen_spike.dm" -#include "code\game\objects\structures\ladders.dm" -#include "code\game\objects\structures\lattice.dm" -#include "code\game\objects\structures\life_candle.dm" -#include "code\game\objects\structures\loom.dm" -#include "code\game\objects\structures\manned_turret.dm" -#include "code\game\objects\structures\medkit.dm" -#include "code\game\objects\structures\memorial.dm" -#include "code\game\objects\structures\mineral_doors.dm" -#include "code\game\objects\structures\mirror.dm" -#include "code\game\objects\structures\mop_bucket.dm" -#include "code\game\objects\structures\morgue.dm" -#include "code\game\objects\structures\musician.dm" -#include "code\game\objects\structures\noticeboard.dm" -#include "code\game\objects\structures\petrified_statue.dm" -#include "code\game\objects\structures\plasticflaps.dm" -#include "code\game\objects\structures\reflector.dm" -#include "code\game\objects\structures\safe.dm" -#include "code\game\objects\structures\showcase.dm" -#include "code\game\objects\structures\spawner.dm" -#include "code\game\objects\structures\spirit_board.dm" -#include "code\game\objects\structures\stairs.dm" -#include "code\game\objects\structures\statues.dm" -#include "code\game\objects\structures\table_frames.dm" -#include "code\game\objects\structures\tables_racks.dm" -#include "code\game\objects\structures\tank_dispenser.dm" -#include "code\game\objects\structures\target_stake.dm" -#include "code\game\objects\structures\traps.dm" -#include "code\game\objects\structures\trash_piles.dm" -#include "code\game\objects\structures\watercloset.dm" -#include "code\game\objects\structures\windoor_assembly.dm" -#include "code\game\objects\structures\window.dm" -#include "code\game\objects\structures\beds_chairs\alien_nest.dm" -#include "code\game\objects\structures\beds_chairs\bed.dm" -#include "code\game\objects\structures\beds_chairs\chair.dm" -#include "code\game\objects\structures\crates_lockers\closets.dm" -#include "code\game\objects\structures\crates_lockers\crates.dm" -#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" -#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" -#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" -#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" -#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" -#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\misc.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\psychology.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" -#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" -#include "code\game\objects\structures\crates_lockers\crates\bins.dm" -#include "code\game\objects\structures\crates_lockers\crates\critter.dm" -#include "code\game\objects\structures\crates_lockers\crates\large.dm" -#include "code\game\objects\structures\crates_lockers\crates\secure.dm" -#include "code\game\objects\structures\crates_lockers\crates\wooden.dm" -#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" -#include "code\game\objects\structures\signs\_signs.dm" -#include "code\game\objects\structures\signs\signs_departments.dm" -#include "code\game\objects\structures\signs\signs_maps.dm" -#include "code\game\objects\structures\signs\signs_plaques.dm" -#include "code\game\objects\structures\signs\signs_warning.dm" -#include "code\game\objects\structures\transit_tubes\station.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm" -#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" -#include "code\game\turfs\baseturf_skipover.dm" -#include "code\game\turfs\change_turf.dm" -#include "code\game\turfs\closed.dm" -#include "code\game\turfs\open.dm" -#include "code\game\turfs\turf.dm" -#include "code\game\turfs\openspace\openspace.dm" -#include "code\game\turfs\simulated\chasm.dm" -#include "code\game\turfs\simulated\dirtystation.dm" -#include "code\game\turfs\simulated\floor.dm" -#include "code\game\turfs\simulated\lava.dm" -#include "code\game\turfs\simulated\minerals.dm" -#include "code\game\turfs\simulated\reebe_void.dm" -#include "code\game\turfs\simulated\river.dm" -#include "code\game\turfs\simulated\walls.dm" -#include "code\game\turfs\simulated\water.dm" -#include "code\game\turfs\simulated\floor\fancy_floor.dm" -#include "code\game\turfs\simulated\floor\light_floor.dm" -#include "code\game\turfs\simulated\floor\mineral_floor.dm" -#include "code\game\turfs\simulated\floor\misc_floor.dm" -#include "code\game\turfs\simulated\floor\plasteel_floor.dm" -#include "code\game\turfs\simulated\floor\plating.dm" -#include "code\game\turfs\simulated\floor\reinf_floor.dm" -#include "code\game\turfs\simulated\floor\plating\asteroid.dm" -#include "code\game\turfs\simulated\floor\plating\dirt.dm" -#include "code\game\turfs\simulated\floor\plating\misc_plating.dm" -#include "code\game\turfs\simulated\wall\mineral_walls.dm" -#include "code\game\turfs\simulated\wall\misc_walls.dm" -#include "code\game\turfs\simulated\wall\reinf_walls.dm" -#include "code\game\turfs\space\space.dm" -#include "code\game\turfs\space\transit.dm" -#include "code\modules\admin\admin.dm" -#include "code\modules\admin\admin_investigate.dm" -#include "code\modules\admin\admin_ranks.dm" -#include "code\modules\admin\admin_verbs.dm" -#include "code\modules\admin\adminmenu.dm" -#include "code\modules\admin\antag_panel.dm" -#include "code\modules\admin\banjob.dm" -#include "code\modules\admin\chat_commands.dm" -#include "code\modules\admin\check_antagonists.dm" -#include "code\modules\admin\create_mob.dm" -#include "code\modules\admin\create_object.dm" -#include "code\modules\admin\create_poll.dm" -#include "code\modules\admin\create_turf.dm" -#include "code\modules\admin\fun_balloon.dm" -#include "code\modules\admin\holder2.dm" -#include "code\modules\admin\ipintel.dm" -#include "code\modules\admin\IsBanned.dm" -#include "code\modules\admin\NewBan.dm" -#include "code\modules\admin\permissionedit.dm" -#include "code\modules\admin\player_panel.dm" -#include "code\modules\admin\secrets.dm" -#include "code\modules\admin\sound_emitter.dm" -#include "code\modules\admin\sql_message_system.dm" -#include "code\modules\admin\stickyban.dm" -#include "code\modules\admin\topic.dm" -#include "code\modules\admin\whitelist.dm" -#include "code\modules\admin\DB_ban\functions.dm" -#include "code\modules\admin\verbs\adminhelp.dm" -#include "code\modules\admin\verbs\adminjump.dm" -#include "code\modules\admin\verbs\adminpm.dm" -#include "code\modules\admin\verbs\adminsay.dm" -#include "code\modules\admin\verbs\ak47s.dm" -#include "code\modules\admin\verbs\atmosdebug.dm" -#include "code\modules\admin\verbs\bluespacearty.dm" -#include "code\modules\admin\verbs\borgpanel.dm" -#include "code\modules\admin\verbs\BrokenInhands.dm" -#include "code\modules\admin\verbs\cinematic.dm" -#include "code\modules\admin\verbs\deadsay.dm" -#include "code\modules\admin\verbs\debug.dm" -#include "code\modules\admin\verbs\diagnostics.dm" -#include "code\modules\admin\verbs\dice.dm" -#include "code\modules\admin\verbs\fps.dm" -#include "code\modules\admin\verbs\getlogs.dm" -#include "code\modules\admin\verbs\individual_logging.dm" -#include "code\modules\admin\verbs\machine_upgrade.dm" -#include "code\modules\admin\verbs\manipulate_organs.dm" -#include "code\modules\admin\verbs\map_template_loadverb.dm" -#include "code\modules\admin\verbs\mapping.dm" -#include "code\modules\admin\verbs\maprotation.dm" -#include "code\modules\admin\verbs\massmodvar.dm" -#include "code\modules\admin\verbs\modifyvariables.dm" -#include "code\modules\admin\verbs\one_click_antag.dm" -#include "code\modules\admin\verbs\onlyone.dm" -#include "code\modules\admin\verbs\panicbunker.dm" -#include "code\modules\admin\verbs\playsound.dm" -#include "code\modules\admin\verbs\possess.dm" -#include "code\modules\admin\verbs\pray.dm" -#include "code\modules\admin\verbs\randomverbs.dm" -#include "code\modules\admin\verbs\reestablish_db_connection.dm" -#include "code\modules\admin\verbs\spawnobjasmob.dm" -#include "code\modules\admin\verbs\tripAI.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" -#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" -#include "code\modules\admin\view_variables\debug_variables.dm" -#include "code\modules\antagonists\_common\antag_datum.dm" -#include "code\modules\antagonists\_common\antag_helpers.dm" -#include "code\modules\antagonists\_common\antag_hud.dm" -#include "code\modules\antagonists\_common\antag_spawner.dm" -#include "code\modules\antagonists\_common\antag_team.dm" -#include "code\modules\antagonists\abductor\abductor.dm" -#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" -#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" -#include "code\modules\antagonists\abductor\equipment\gland.dm" -#include "code\modules\antagonists\abductor\machinery\camera.dm" -#include "code\modules\antagonists\abductor\machinery\console.dm" -#include "code\modules\antagonists\abductor\machinery\dispenser.dm" -#include "code\modules\antagonists\abductor\machinery\experiment.dm" -#include "code\modules\antagonists\abductor\machinery\pad.dm" -#include "code\modules\antagonists\blob\blob.dm" -#include "code\modules\antagonists\blob\blob\blob_report.dm" -#include "code\modules\antagonists\blob\blob\overmind.dm" -#include "code\modules\antagonists\blob\blob\powers.dm" -#include "code\modules\antagonists\blob\blob\theblob.dm" -#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm" -#include "code\modules\antagonists\blob\blob\blobs\core.dm" -#include "code\modules\antagonists\blob\blob\blobs\factory.dm" -#include "code\modules\antagonists\blob\blob\blobs\node.dm" -#include "code\modules\antagonists\blob\blob\blobs\resource.dm" -#include "code\modules\antagonists\blob\blob\blobs\shield.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm" -#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm" -#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm" -#include "code\modules\antagonists\bloodsucker\datum_hunter.dm" -#include "code\modules\antagonists\bloodsucker\datum_vassal.dm" -#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm" -#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm" -#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm" -#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm" -#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm" -#include "code\modules\antagonists\brainwashing\brainwashing.dm" -#include "code\modules\antagonists\brother\brother.dm" -#include "code\modules\antagonists\changeling\cellular_emporium.dm" -#include "code\modules\antagonists\changeling\changeling.dm" -#include "code\modules\antagonists\changeling\changeling_power.dm" -#include "code\modules\antagonists\changeling\powers\absorb.dm" -#include "code\modules\antagonists\changeling\powers\adrenaline.dm" -#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" -#include "code\modules\antagonists\changeling\powers\biodegrade.dm" -#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" -#include "code\modules\antagonists\changeling\powers\digitalcamo.dm" -#include "code\modules\antagonists\changeling\powers\fakedeath.dm" -#include "code\modules\antagonists\changeling\powers\fleshmend.dm" -#include "code\modules\antagonists\changeling\powers\headcrab.dm" -#include "code\modules\antagonists\changeling\powers\hivemind.dm" -#include "code\modules\antagonists\changeling\powers\humanform.dm" -#include "code\modules\antagonists\changeling\powers\lesserform.dm" -#include "code\modules\antagonists\changeling\powers\linglink.dm" -#include "code\modules\antagonists\changeling\powers\mimic_voice.dm" -#include "code\modules\antagonists\changeling\powers\mutations.dm" -#include "code\modules\antagonists\changeling\powers\panacea.dm" -#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" -#include "code\modules\antagonists\changeling\powers\regenerate.dm" -#include "code\modules\antagonists\changeling\powers\revive.dm" -#include "code\modules\antagonists\changeling\powers\shriek.dm" -#include "code\modules\antagonists\changeling\powers\spiders.dm" -#include "code\modules\antagonists\changeling\powers\strained_muscles.dm" -#include "code\modules\antagonists\changeling\powers\tiny_prick.dm" -#include "code\modules\antagonists\changeling\powers\transform.dm" -#include "code\modules\antagonists\clockcult\clock_effect.dm" -#include "code\modules\antagonists\clockcult\clock_item.dm" -#include "code\modules\antagonists\clockcult\clock_mobs.dm" -#include "code\modules\antagonists\clockcult\clock_scripture.dm" -#include "code\modules\antagonists\clockcult\clock_structure.dm" -#include "code\modules\antagonists\clockcult\clockcult.dm" -#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm" -#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm" -#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm" -#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm" -#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm" -#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm" -#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm" -#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm" -#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm" -#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm" -#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm" -#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm" -#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm" -#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm" -#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm" -#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm" -#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm" -#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm" -#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" -#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" -#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" -#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" -#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" -#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm" -#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm" -#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" -#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm" -#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm" -#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" -#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" -#include "code\modules\antagonists\cult\blood_magic.dm" -#include "code\modules\antagonists\cult\cult.dm" -#include "code\modules\antagonists\cult\cult_comms.dm" -#include "code\modules\antagonists\cult\cult_items.dm" -#include "code\modules\antagonists\cult\cult_structures.dm" -#include "code\modules\antagonists\cult\ritual.dm" -#include "code\modules\antagonists\cult\rune_spawn_action.dm" -#include "code\modules\antagonists\cult\runes.dm" -#include "code\modules\antagonists\devil\devil.dm" -#include "code\modules\antagonists\devil\devil_helpers.dm" -#include "code\modules\antagonists\devil\imp\imp.dm" -#include "code\modules\antagonists\devil\sintouched\objectives.dm" -#include "code\modules\antagonists\devil\sintouched\sintouched.dm" -#include "code\modules\antagonists\devil\true_devil\_true_devil.dm" -#include "code\modules\antagonists\devil\true_devil\inventory.dm" -#include "code\modules\antagonists\disease\disease_abilities.dm" -#include "code\modules\antagonists\disease\disease_datum.dm" -#include "code\modules\antagonists\disease\disease_disease.dm" -#include "code\modules\antagonists\disease\disease_event.dm" -#include "code\modules\antagonists\disease\disease_mob.dm" -#include "code\modules\antagonists\ert\ert.dm" -#include "code\modules\antagonists\greentext\greentext.dm" -#include "code\modules\antagonists\greybois\greybois.dm" -#include "code\modules\antagonists\highlander\highlander.dm" -#include "code\modules\antagonists\monkey\monkey.dm" -#include "code\modules\antagonists\morph\morph.dm" -#include "code\modules\antagonists\morph\morph_antag.dm" -#include "code\modules\antagonists\nightmare\nightmare.dm" -#include "code\modules\antagonists\nightmare\nightmare_objectives.dm" -#include "code\modules\antagonists\ninja\ninja.dm" -#include "code\modules\antagonists\nukeop\clownop.dm" -#include "code\modules\antagonists\nukeop\nukeop.dm" -#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" -#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" -#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" -#include "code\modules\antagonists\official\official.dm" -#include "code\modules\antagonists\overthrow\overthrow.dm" -#include "code\modules\antagonists\overthrow\overthrow_converter.dm" -#include "code\modules\antagonists\overthrow\overthrow_team.dm" -#include "code\modules\antagonists\pirate\pirate.dm" -#include "code\modules\antagonists\revenant\revenant.dm" -#include "code\modules\antagonists\revenant\revenant_abilities.dm" -#include "code\modules\antagonists\revenant\revenant_antag.dm" -#include "code\modules\antagonists\revenant\revenant_blight.dm" -#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" -#include "code\modules\antagonists\revolution\revolution.dm" -#include "code\modules\antagonists\separatist\separatist.dm" -#include "code\modules\antagonists\slaughter\slaughter.dm" -#include "code\modules\antagonists\slaughter\slaughter_antag.dm" -#include "code\modules\antagonists\slaughter\slaughterevent.dm" -#include "code\modules\antagonists\survivalist\survivalist.dm" -#include "code\modules\antagonists\swarmer\swarmer.dm" -#include "code\modules\antagonists\swarmer\swarmer_event.dm" -#include "code\modules\antagonists\traitor\datum_traitor.dm" -#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm" -#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" -#include "code\modules\antagonists\valentines\heartbreaker.dm" -#include "code\modules\antagonists\valentines\valentine.dm" -#include "code\modules\antagonists\wishgranter\wishgranter.dm" -#include "code\modules\antagonists\wizard\wizard.dm" -#include "code\modules\antagonists\wizard\equipment\artefact.dm" -#include "code\modules\antagonists\wizard\equipment\soulstone.dm" -#include "code\modules\antagonists\wizard\equipment\spellbook.dm" -#include "code\modules\antagonists\xeno\xeno.dm" -#include "code\modules\assembly\assembly.dm" -#include "code\modules\assembly\bomb.dm" -#include "code\modules\assembly\doorcontrol.dm" -#include "code\modules\assembly\flash.dm" -#include "code\modules\assembly\health.dm" -#include "code\modules\assembly\helpers.dm" -#include "code\modules\assembly\holder.dm" -#include "code\modules\assembly\igniter.dm" -#include "code\modules\assembly\infrared.dm" -#include "code\modules\assembly\mousetrap.dm" -#include "code\modules\assembly\proximity.dm" -#include "code\modules\assembly\shock_kit.dm" -#include "code\modules\assembly\signaler.dm" -#include "code\modules\assembly\timer.dm" -#include "code\modules\assembly\voice.dm" -#include "code\modules\atmospherics\multiz.dm" -#include "code\modules\atmospherics\environmental\LINDA_fire.dm" -#include "code\modules\atmospherics\environmental\LINDA_system.dm" -#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" -#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -#include "code\modules\atmospherics\gasmixtures\gas_types.dm" -#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" -#include "code\modules\atmospherics\gasmixtures\reactions.dm" -#include "code\modules\atmospherics\machinery\airalarm.dm" -#include "code\modules\atmospherics\machinery\atmosmachinery.dm" -#include "code\modules\atmospherics\machinery\datum_pipeline.dm" -#include "code\modules\atmospherics\machinery\components\components_base.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" -#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" -#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" -#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" -#include "code\modules\atmospherics\machinery\other\meter.dm" -#include "code\modules\atmospherics\machinery\other\miner.dm" -#include "code\modules\atmospherics\machinery\pipes\bluespace.dm" -#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" -#include "code\modules\atmospherics\machinery\pipes\manifold.dm" -#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" -#include "code\modules\atmospherics\machinery\pipes\mapping.dm" -#include "code\modules\atmospherics\machinery\pipes\pipes.dm" -#include "code\modules\atmospherics\machinery\pipes\simple.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" -#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" -#include "code\modules\atmospherics\machinery\portable\canister.dm" -#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" -#include "code\modules\atmospherics\machinery\portable\pump.dm" -#include "code\modules\atmospherics\machinery\portable\scrubber.dm" -#include "code\modules\awaymissions\away_props.dm" -#include "code\modules\awaymissions\bluespaceartillery.dm" -#include "code\modules\awaymissions\capture_the_flag.dm" -#include "code\modules\awaymissions\corpse.dm" -#include "code\modules\awaymissions\exile.dm" -#include "code\modules\awaymissions\gateway.dm" -#include "code\modules\awaymissions\pamphlet.dm" -#include "code\modules\awaymissions\signpost.dm" -#include "code\modules\awaymissions\super_secret_room.dm" -#include "code\modules\awaymissions\zlevel.dm" -#include "code\modules\awaymissions\mission_code\Academy.dm" -#include "code\modules\awaymissions\mission_code\Cabin.dm" -#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\jungleresort.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" -#include "code\modules\awaymissions\mission_code\spacebattle.dm" -#include "code\modules\awaymissions\mission_code\stationCollision.dm" -#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" -#include "code\modules\awaymissions\mission_code\wildwest.dm" -#include "code\modules\bsql\includes.dm" -#include "code\modules\buildmode\bm_mode.dm" -#include "code\modules\buildmode\buildmode.dm" -#include "code\modules\buildmode\buttons.dm" -#include "code\modules\buildmode\effects\line.dm" -#include "code\modules\buildmode\submodes\advanced.dm" -#include "code\modules\buildmode\submodes\area_edit.dm" -#include "code\modules\buildmode\submodes\basic.dm" -#include "code\modules\buildmode\submodes\boom.dm" -#include "code\modules\buildmode\submodes\copy.dm" -#include "code\modules\buildmode\submodes\fill.dm" -#include "code\modules\buildmode\submodes\mapgen.dm" -#include "code\modules\buildmode\submodes\throwing.dm" -#include "code\modules\buildmode\submodes\variable_edit.dm" -#include "code\modules\cargo\bounty.dm" -#include "code\modules\cargo\bounty_console.dm" -#include "code\modules\cargo\centcom_podlauncher.dm" -#include "code\modules\cargo\console.dm" -#include "code\modules\cargo\export_scanner.dm" -#include "code\modules\cargo\exports.dm" -#include "code\modules\cargo\expressconsole.dm" -#include "code\modules\cargo\gondolapod.dm" -#include "code\modules\cargo\order.dm" -#include "code\modules\cargo\packs.dm" -#include "code\modules\cargo\supplypod.dm" -#include "code\modules\cargo\supplypod_beacon.dm" -#include "code\modules\cargo\bounties\assistant.dm" -#include "code\modules\cargo\bounties\botany.dm" -#include "code\modules\cargo\bounties\chef.dm" -#include "code\modules\cargo\bounties\engineering.dm" -#include "code\modules\cargo\bounties\item.dm" -#include "code\modules\cargo\bounties\mech.dm" -#include "code\modules\cargo\bounties\medical.dm" -#include "code\modules\cargo\bounties\mining.dm" -#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\food_wine.dm" -#include "code\modules\cargo\exports\gear.dm" -#include "code\modules\cargo\exports\large_objects.dm" -#include "code\modules\cargo\exports\lewd.dm" -#include "code\modules\cargo\exports\manifest.dm" -#include "code\modules\cargo\exports\materials.dm" -#include "code\modules\cargo\exports\organs_robotics.dm" -#include "code\modules\cargo\exports\parts.dm" -#include "code\modules\cargo\exports\seeds.dm" -#include "code\modules\cargo\exports\sheets.dm" -#include "code\modules\cargo\exports\tools.dm" -#include "code\modules\cargo\exports\weapons.dm" -#include "code\modules\cargo\packs\armory.dm" -#include "code\modules\cargo\packs\costumes_toys.dm" -#include "code\modules\cargo\packs\emergency.dm" -#include "code\modules\cargo\packs\engine.dm" -#include "code\modules\cargo\packs\engineering.dm" -#include "code\modules\cargo\packs\livestock.dm" -#include "code\modules\cargo\packs\materials.dm" -#include "code\modules\cargo\packs\medical.dm" -#include "code\modules\cargo\packs\misc.dm" -#include "code\modules\cargo\packs\organic.dm" -#include "code\modules\cargo\packs\science.dm" -#include "code\modules\cargo\packs\security.dm" -#include "code\modules\cargo\packs\service.dm" -#include "code\modules\chatter\chatter.dm" -#include "code\modules\client\asset_cache.dm" -#include "code\modules\client\client_colour.dm" -#include "code\modules\client\client_defines.dm" -#include "code\modules\client\client_procs.dm" -#include "code\modules\client\darkmode.dm" -#include "code\modules\client\message.dm" -#include "code\modules\client\player_details.dm" -#include "code\modules\client\preferences.dm" -#include "code\modules\client\preferences_savefile.dm" -#include "code\modules\client\preferences_toggles.dm" -#include "code\modules\client\preferences_vr.dm" -#include "code\modules\client\verbs\aooc.dm" -#include "code\modules\client\verbs\etips.dm" -#include "code\modules\client\verbs\looc.dm" -#include "code\modules\client\verbs\ooc.dm" -#include "code\modules\client\verbs\ping.dm" -#include "code\modules\client\verbs\suicide.dm" -#include "code\modules\client\verbs\who.dm" -#include "code\modules\clothing\chameleon.dm" -#include "code\modules\clothing\clothing.dm" -#include "code\modules\clothing\ears\_ears.dm" -#include "code\modules\clothing\glasses\_glasses.dm" -#include "code\modules\clothing\glasses\engine_goggles.dm" -#include "code\modules\clothing\glasses\hud.dm" -#include "code\modules\clothing\glasses\vg_glasses.dm" -#include "code\modules\clothing\gloves\_gloves.dm" -#include "code\modules\clothing\gloves\boxing.dm" -#include "code\modules\clothing\gloves\color.dm" -#include "code\modules\clothing\gloves\miscellaneous.dm" -#include "code\modules\clothing\gloves\ring.dm" -#include "code\modules\clothing\gloves\vg_gloves.dm" -#include "code\modules\clothing\head\_head.dm" -#include "code\modules\clothing\head\beanie.dm" -#include "code\modules\clothing\head\cit_hats.dm" -#include "code\modules\clothing\head\collectable.dm" -#include "code\modules\clothing\head\hardhat.dm" -#include "code\modules\clothing\head\helmet.dm" -#include "code\modules\clothing\head\jobs.dm" -#include "code\modules\clothing\head\misc.dm" -#include "code\modules\clothing\head\misc_special.dm" -#include "code\modules\clothing\head\soft_caps.dm" -#include "code\modules\clothing\head\vg_hats.dm" -#include "code\modules\clothing\masks\_masks.dm" -#include "code\modules\clothing\masks\boxing.dm" -#include "code\modules\clothing\masks\breath.dm" -#include "code\modules\clothing\masks\gasmask.dm" -#include "code\modules\clothing\masks\hailer.dm" -#include "code\modules\clothing\masks\miscellaneous.dm" -#include "code\modules\clothing\masks\vg_masks.dm" -#include "code\modules\clothing\neck\_neck.dm" -#include "code\modules\clothing\outfits\ert.dm" -#include "code\modules\clothing\outfits\event.dm" -#include "code\modules\clothing\outfits\plasmaman.dm" -#include "code\modules\clothing\outfits\standard.dm" -#include "code\modules\clothing\outfits\vr.dm" -#include "code\modules\clothing\outfits\vv_outfit.dm" -#include "code\modules\clothing\shoes\_shoes.dm" -#include "code\modules\clothing\shoes\bananashoes.dm" -#include "code\modules\clothing\shoes\colour.dm" -#include "code\modules\clothing\shoes\magboots.dm" -#include "code\modules\clothing\shoes\miscellaneous.dm" -#include "code\modules\clothing\shoes\taeclowndo.dm" -#include "code\modules\clothing\shoes\vg_shoes.dm" -#include "code\modules\clothing\spacesuits\_spacesuits.dm" -#include "code\modules\clothing\spacesuits\chronosuit.dm" -#include "code\modules\clothing\spacesuits\hardsuit.dm" -#include "code\modules\clothing\spacesuits\miscellaneous.dm" -#include "code\modules\clothing\spacesuits\plasmamen.dm" -#include "code\modules\clothing\spacesuits\syndi.dm" -#include "code\modules\clothing\spacesuits\vg_spess.dm" -#include "code\modules\clothing\suits\_suits.dm" -#include "code\modules\clothing\suits\armor.dm" -#include "code\modules\clothing\suits\bio.dm" -#include "code\modules\clothing\suits\cloaks.dm" -#include "code\modules\clothing\suits\jobs.dm" -#include "code\modules\clothing\suits\labcoat.dm" -#include "code\modules\clothing\suits\miscellaneous.dm" -#include "code\modules\clothing\suits\reactive_armour.dm" -#include "code\modules\clothing\suits\toggles.dm" -#include "code\modules\clothing\suits\utility.dm" -#include "code\modules\clothing\suits\vg_suits.dm" -#include "code\modules\clothing\suits\wiz_robe.dm" -#include "code\modules\clothing\under\_under.dm" -#include "code\modules\clothing\under\accessories.dm" -#include "code\modules\clothing\under\color.dm" -#include "code\modules\clothing\under\miscellaneous.dm" -#include "code\modules\clothing\under\pants.dm" -#include "code\modules\clothing\under\shorts.dm" -#include "code\modules\clothing\under\syndicate.dm" -#include "code\modules\clothing\under\trek.dm" -#include "code\modules\clothing\under\vg_under.dm" -#include "code\modules\clothing\under\jobs\civilian.dm" -#include "code\modules\clothing\under\jobs\engineering.dm" -#include "code\modules\clothing\under\jobs\medsci.dm" -#include "code\modules\clothing\under\jobs\security.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" -#include "code\modules\clothing\under\jobs\Plasmaman\security.dm" -#include "code\modules\detectivework\detective_work.dm" -#include "code\modules\detectivework\evidence.dm" -#include "code\modules\detectivework\scanner.dm" -#include "code\modules\emoji\emoji_parse.dm" -#include "code\modules\error_handler\error_handler.dm" -#include "code\modules\error_handler\error_viewer.dm" -#include "code\modules\events\_event.dm" -#include "code\modules\events\abductor.dm" -#include "code\modules\events\alien_infestation.dm" -#include "code\modules\events\anomaly.dm" -#include "code\modules\events\anomaly_bluespace.dm" -#include "code\modules\events\anomaly_flux.dm" -#include "code\modules\events\anomaly_grav.dm" -#include "code\modules\events\anomaly_pyro.dm" -#include "code\modules\events\anomaly_vortex.dm" -#include "code\modules\events\aurora_aquilae.dm" -#include "code\modules\events\aurora_caelus.dm" -#include "code\modules\events\blob.dm" -#include "code\modules\events\brand_intelligence.dm" -#include "code\modules\events\bureaucratic_error.dm" -#include "code\modules\events\camerafailure.dm" -#include "code\modules\events\carp_migration.dm" -#include "code\modules\events\carpteam.dm" -#include "code\modules\events\communications_blackout.dm" -#include "code\modules\events\devil.dm" -#include "code\modules\events\disease_outbreak.dm" -#include "code\modules\events\dust.dm" -#include "code\modules\events\electrical_storm.dm" -#include "code\modules\events\false_alarm.dm" -#include "code\modules\events\floorcluwne.dm" -#include "code\modules\events\ghost_role.dm" -#include "code\modules\events\grid_check.dm" -#include "code\modules\events\heart_attack.dm" -#include "code\modules\events\high_priority_bounty.dm" -#include "code\modules\events\immovable_rod.dm" -#include "code\modules\events\ion_storm.dm" -#include "code\modules\events\major_dust.dm" -#include "code\modules\events\mass_hallucination.dm" -#include "code\modules\events\meateor_wave.dm" -#include "code\modules\events\meteor_wave.dm" -#include "code\modules\events\mice_migration.dm" -#include "code\modules\events\nightmare.dm" -#include "code\modules\events\operative.dm" -#include "code\modules\events\pirates.dm" -#include "code\modules\events\portal_storm.dm" -#include "code\modules\events\prison_break.dm" -#include "code\modules\events\processor_overload.dm" -#include "code\modules\events\radiation_storm.dm" -#include "code\modules\events\sentience.dm" -#include "code\modules\events\shuttle_loan.dm" -#include "code\modules\events\spacevine.dm" -#include "code\modules\events\spider_infestation.dm" -#include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\vent_clog.dm" -#include "code\modules\events\wormholes.dm" -#include "code\modules\events\holiday\halloween.dm" -#include "code\modules\events\holiday\vday.dm" -#include "code\modules\events\holiday\xmas.dm" -#include "code\modules\events\wizard\aid.dm" -#include "code\modules\events\wizard\blobies.dm" -#include "code\modules\events\wizard\curseditems.dm" -#include "code\modules\events\wizard\departmentrevolt.dm" -#include "code\modules\events\wizard\fakeexplosion.dm" -#include "code\modules\events\wizard\ghost.dm" -#include "code\modules\events\wizard\greentext.dm" -#include "code\modules\events\wizard\imposter.dm" -#include "code\modules\events\wizard\invincible.dm" -#include "code\modules\events\wizard\lava.dm" -#include "code\modules\events\wizard\magicarp.dm" -#include "code\modules\events\wizard\petsplosion.dm" -#include "code\modules\events\wizard\race.dm" -#include "code\modules\events\wizard\rpgloot.dm" -#include "code\modules\events\wizard\shuffle.dm" -#include "code\modules\events\wizard\summons.dm" -#include "code\modules\fields\fields.dm" -#include "code\modules\fields\gravity.dm" -#include "code\modules\fields\peaceborg_dampener.dm" -#include "code\modules\fields\timestop.dm" -#include "code\modules\fields\turf_objects.dm" -#include "code\modules\flufftext\Dreaming.dm" -#include "code\modules\flufftext\Hallucination.dm" -#include "code\modules\food_and_drinks\autobottler.dm" -#include "code\modules\food_and_drinks\food.dm" -#include "code\modules\food_and_drinks\pizzabox.dm" -#include "code\modules\food_and_drinks\drinks\drinks.dm" -#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" -#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" -#include "code\modules\food_and_drinks\food\condiment.dm" -#include "code\modules\food_and_drinks\food\customizables.dm" -#include "code\modules\food_and_drinks\food\snacks.dm" -#include "code\modules\food_and_drinks\food\snacks_bread.dm" -#include "code\modules\food_and_drinks\food\snacks_burgers.dm" -#include "code\modules\food_and_drinks\food\snacks_cake.dm" -#include "code\modules\food_and_drinks\food\snacks_egg.dm" -#include "code\modules\food_and_drinks\food\snacks_frozen.dm" -#include "code\modules\food_and_drinks\food\snacks_meat.dm" -#include "code\modules\food_and_drinks\food\snacks_other.dm" -#include "code\modules\food_and_drinks\food\snacks_pastry.dm" -#include "code\modules\food_and_drinks\food\snacks_pie.dm" -#include "code\modules\food_and_drinks\food\snacks_pizza.dm" -#include "code\modules\food_and_drinks\food\snacks_salad.dm" -#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" -#include "code\modules\food_and_drinks\food\snacks_soup.dm" -#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" -#include "code\modules\food_and_drinks\food\snacks_sushi.dm" -#include "code\modules\food_and_drinks\food\snacks_vend.dm" -#include "code\modules\food_and_drinks\food\snacks\dough.dm" -#include "code\modules\food_and_drinks\food\snacks\meat.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" -#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" -#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" -#include "code\modules\food_and_drinks\recipes\food_mixtures.dm" -#include "code\modules\food_and_drinks\recipes\processor_recipes.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" -#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm" -#include "code\modules\games\cas.dm" -#include "code\modules\goonchat\browserOutput.dm" -#include "code\modules\holiday\easter.dm" -#include "code\modules\holiday\holidays.dm" -#include "code\modules\holiday\halloween\bartholomew.dm" -#include "code\modules\holiday\halloween\jacqueen.dm" -#include "code\modules\holodeck\area_copy.dm" -#include "code\modules\holodeck\computer.dm" -#include "code\modules\holodeck\holo_effect.dm" -#include "code\modules\holodeck\items.dm" -#include "code\modules\holodeck\mobs.dm" -#include "code\modules\holodeck\turfs.dm" -#include "code\modules\hydroponics\biogenerator.dm" -#include "code\modules\hydroponics\fermenting_barrel.dm" -#include "code\modules\hydroponics\gene_modder.dm" -#include "code\modules\hydroponics\grown.dm" -#include "code\modules\hydroponics\growninedible.dm" -#include "code\modules\hydroponics\hydroitemdefines.dm" -#include "code\modules\hydroponics\hydroponics.dm" -#include "code\modules\hydroponics\plant_genes.dm" -#include "code\modules\hydroponics\sample.dm" -#include "code\modules\hydroponics\seed_extractor.dm" -#include "code\modules\hydroponics\seeds.dm" -#include "code\modules\hydroponics\beekeeping\beebox.dm" -#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" -#include "code\modules\hydroponics\beekeeping\honey_frame.dm" -#include "code\modules\hydroponics\beekeeping\honeycomb.dm" -#include "code\modules\hydroponics\grown\ambrosia.dm" -#include "code\modules\hydroponics\grown\apple.dm" -#include "code\modules\hydroponics\grown\banana.dm" -#include "code\modules\hydroponics\grown\beans.dm" -#include "code\modules\hydroponics\grown\berries.dm" -#include "code\modules\hydroponics\grown\cannabis.dm" -#include "code\modules\hydroponics\grown\cereals.dm" -#include "code\modules\hydroponics\grown\chili.dm" -#include "code\modules\hydroponics\grown\citrus.dm" -#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" -#include "code\modules\hydroponics\grown\corn.dm" -#include "code\modules\hydroponics\grown\cotton.dm" -#include "code\modules\hydroponics\grown\eggplant.dm" -#include "code\modules\hydroponics\grown\flowers.dm" -#include "code\modules\hydroponics\grown\garlic.dm" -#include "code\modules\hydroponics\grown\grass_carpet.dm" -#include "code\modules\hydroponics\grown\kudzu.dm" -#include "code\modules\hydroponics\grown\melon.dm" -#include "code\modules\hydroponics\grown\misc.dm" -#include "code\modules\hydroponics\grown\mushrooms.dm" -#include "code\modules\hydroponics\grown\nettle.dm" -#include "code\modules\hydroponics\grown\onion.dm" -#include "code\modules\hydroponics\grown\peach.dm" -#include "code\modules\hydroponics\grown\peanuts.dm" -#include "code\modules\hydroponics\grown\peas.dm" -#include "code\modules\hydroponics\grown\pineapple.dm" -#include "code\modules\hydroponics\grown\potato.dm" -#include "code\modules\hydroponics\grown\pumpkin.dm" -#include "code\modules\hydroponics\grown\random.dm" -#include "code\modules\hydroponics\grown\replicapod.dm" -#include "code\modules\hydroponics\grown\root.dm" -#include "code\modules\hydroponics\grown\tea_coffee.dm" -#include "code\modules\hydroponics\grown\tobacco.dm" -#include "code\modules\hydroponics\grown\tomato.dm" -#include "code\modules\hydroponics\grown\towercap.dm" -#include "code\modules\integrated_electronics\_defines.dm" -#include "code\modules\integrated_electronics\core\analyzer.dm" -#include "code\modules\integrated_electronics\core\assemblies.dm" -#include "code\modules\integrated_electronics\core\debugger.dm" -#include "code\modules\integrated_electronics\core\detailer.dm" -#include "code\modules\integrated_electronics\core\helpers.dm" -#include "code\modules\integrated_electronics\core\integrated_circuit.dm" -#include "code\modules\integrated_electronics\core\pins.dm" -#include "code\modules\integrated_electronics\core\printer.dm" -#include "code\modules\integrated_electronics\core\saved_circuits.dm" -#include "code\modules\integrated_electronics\core\wirer.dm" -#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\index_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\selfref_pin.dm" -#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" -#include "code\modules\integrated_electronics\passive\passive.dm" -#include "code\modules\integrated_electronics\passive\power.dm" -#include "code\modules\integrated_electronics\subtypes\access.dm" -#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" -#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" -#include "code\modules\integrated_electronics\subtypes\converters.dm" -#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" -#include "code\modules\integrated_electronics\subtypes\input.dm" -#include "code\modules\integrated_electronics\subtypes\lists.dm" -#include "code\modules\integrated_electronics\subtypes\logic.dm" -#include "code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "code\modules\integrated_electronics\subtypes\memory.dm" -#include "code\modules\integrated_electronics\subtypes\output.dm" -#include "code\modules\integrated_electronics\subtypes\power.dm" -#include "code\modules\integrated_electronics\subtypes\reagents.dm" -#include "code\modules\integrated_electronics\subtypes\smart.dm" -#include "code\modules\integrated_electronics\subtypes\text.dm" -#include "code\modules\integrated_electronics\subtypes\time.dm" -#include "code\modules\integrated_electronics\subtypes\trig.dm" -#include "code\modules\integrated_electronics\subtypes\weaponized.dm" -#include "code\modules\jobs\access.dm" -#include "code\modules\jobs\job_exp.dm" -#include "code\modules\jobs\jobs.dm" -#include "code\modules\jobs\job_types\assistant.dm" -#include "code\modules\jobs\job_types\captain.dm" -#include "code\modules\jobs\job_types\cargo_service.dm" -#include "code\modules\jobs\job_types\civilian.dm" -#include "code\modules\jobs\job_types\civilian_chaplain.dm" -#include "code\modules\jobs\job_types\engineering.dm" -#include "code\modules\jobs\job_types\job.dm" -#include "code\modules\jobs\job_types\job_alt_titles.dm" -#include "code\modules\jobs\job_types\medical.dm" -#include "code\modules\jobs\job_types\science.dm" -#include "code\modules\jobs\job_types\security.dm" -#include "code\modules\jobs\job_types\silicon.dm" -#include "code\modules\jobs\map_changes\map_changes.dm" -#include "code\modules\keybindings\bindings_admin.dm" -#include "code\modules\keybindings\bindings_atom.dm" -#include "code\modules\keybindings\bindings_carbon.dm" -#include "code\modules\keybindings\bindings_client.dm" -#include "code\modules\keybindings\bindings_human.dm" -#include "code\modules\keybindings\bindings_living.dm" -#include "code\modules\keybindings\bindings_mob.dm" -#include "code\modules\keybindings\bindings_robot.dm" -#include "code\modules\keybindings\focus.dm" -#include "code\modules\keybindings\setup.dm" -#include "code\modules\language\aphasia.dm" -#include "code\modules\language\beachbum.dm" -#include "code\modules\language\codespeak.dm" -#include "code\modules\language\common.dm" -#include "code\modules\language\draconic.dm" -#include "code\modules\language\drone.dm" -#include "code\modules\language\language.dm" -#include "code\modules\language\language_holder.dm" -#include "code\modules\language\language_menu.dm" -#include "code\modules\language\machine.dm" -#include "code\modules\language\monkey.dm" -#include "code\modules\language\narsian.dm" -#include "code\modules\language\ratvarian.dm" -#include "code\modules\language\slime.dm" -#include "code\modules\language\spacerussian.dm" -#include "code\modules\language\swarmer.dm" -#include "code\modules\language\tajara.dm" -#include "code\modules\language\vampiric.dm" -#include "code\modules\language\xenocommon.dm" -#include "code\modules\library\lib_codex_gigas.dm" -#include "code\modules\library\lib_items.dm" -#include "code\modules\library\lib_machines.dm" -#include "code\modules\library\random_books.dm" -#include "code\modules\library\soapstone.dm" -#include "code\modules\lighting\lighting_area.dm" -#include "code\modules\lighting\lighting_atom.dm" -#include "code\modules\lighting\lighting_corner.dm" -#include "code\modules\lighting\lighting_object.dm" -#include "code\modules\lighting\lighting_setup.dm" -#include "code\modules\lighting\lighting_source.dm" -#include "code\modules\lighting\lighting_turf.dm" -#include "code\modules\mapping\dmm_suite.dm" -#include "code\modules\mapping\map_template.dm" -#include "code\modules\mapping\preloader.dm" -#include "code\modules\mapping\reader.dm" -#include "code\modules\mapping\ruins.dm" -#include "code\modules\mapping\verify.dm" -#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm" -#include "code\modules\mapping\mapping_helpers\baseturf.dm" -#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm" -#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm" -#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm" -#include "code\modules\mapping\space_management\multiz_helpers.dm" -#include "code\modules\mapping\space_management\space_level.dm" -#include "code\modules\mapping\space_management\space_reservation.dm" -#include "code\modules\mapping\space_management\space_transition.dm" -#include "code\modules\mapping\space_management\traits.dm" -#include "code\modules\mapping\space_management\zlevel_manager.dm" -#include "code\modules\mining\abandoned_crates.dm" -#include "code\modules\mining\aux_base.dm" -#include "code\modules\mining\aux_base_camera.dm" -#include "code\modules\mining\fulton.dm" -#include "code\modules\mining\machine_processing.dm" -#include "code\modules\mining\machine_redemption.dm" -#include "code\modules\mining\machine_silo.dm" -#include "code\modules\mining\machine_stacking.dm" -#include "code\modules\mining\machine_unloading.dm" -#include "code\modules\mining\machine_vending.dm" -#include "code\modules\mining\mine_items.dm" -#include "code\modules\mining\minebot.dm" -#include "code\modules\mining\mint.dm" -#include "code\modules\mining\money_bag.dm" -#include "code\modules\mining\ores_coins.dm" -#include "code\modules\mining\satchel_ore_boxdm.dm" -#include "code\modules\mining\shelters.dm" -#include "code\modules\mining\equipment\explorer_gear.dm" -#include "code\modules\mining\equipment\goliath_hide.dm" -#include "code\modules\mining\equipment\kinetic_crusher.dm" -#include "code\modules\mining\equipment\lazarus_injector.dm" -#include "code\modules\mining\equipment\marker_beacons.dm" -#include "code\modules\mining\equipment\mineral_scanner.dm" -#include "code\modules\mining\equipment\mining_tools.dm" -#include "code\modules\mining\equipment\regenerative_core.dm" -#include "code\modules\mining\equipment\resonator.dm" -#include "code\modules\mining\equipment\survival_pod.dm" -#include "code\modules\mining\equipment\vendor_items.dm" -#include "code\modules\mining\equipment\wormhole_jaunter.dm" -#include "code\modules\mining\laborcamp\laborshuttle.dm" -#include "code\modules\mining\laborcamp\laborstacker.dm" -#include "code\modules\mining\lavaland\ash_flora.dm" -#include "code\modules\mining\lavaland\necropolis_chests.dm" -#include "code\modules\mining\lavaland\ruins\gym.dm" -#include "code\modules\mob\death.dm" -#include "code\modules\mob\emote.dm" -#include "code\modules\mob\inventory.dm" -#include "code\modules\mob\login.dm" -#include "code\modules\mob\logout.dm" -#include "code\modules\mob\mob.dm" -#include "code\modules\mob\mob_defines.dm" -#include "code\modules\mob\mob_helpers.dm" -#include "code\modules\mob\mob_movement.dm" -#include "code\modules\mob\mob_movespeed.dm" -#include "code\modules\mob\mob_transformation_simple.dm" -#include "code\modules\mob\say.dm" -#include "code\modules\mob\say_vr.dm" -#include "code\modules\mob\status_procs.dm" -#include "code\modules\mob\transform_procs.dm" -#include "code\modules\mob\typing_indicator.dm" -#include "code\modules\mob\update_icons.dm" -#include "code\modules\mob\camera\camera.dm" -#include "code\modules\mob\dead\dead.dm" -#include "code\modules\mob\dead\new_player\login.dm" -#include "code\modules\mob\dead\new_player\logout.dm" -#include "code\modules\mob\dead\new_player\new_player.dm" -#include "code\modules\mob\dead\new_player\poll.dm" -#include "code\modules\mob\dead\new_player\preferences_setup.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" -#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" -#include "code\modules\mob\dead\observer\login.dm" -#include "code\modules\mob\dead\observer\logout.dm" -#include "code\modules\mob\dead\observer\notificationprefs.dm" -#include "code\modules\mob\dead\observer\observer.dm" -#include "code\modules\mob\dead\observer\observer_movement.dm" -#include "code\modules\mob\dead\observer\say.dm" -#include "code\modules\mob\living\blood.dm" -#include "code\modules\mob\living\bloodcrawl.dm" -#include "code\modules\mob\living\damage_procs.dm" -#include "code\modules\mob\living\death.dm" -#include "code\modules\mob\living\emote.dm" -#include "code\modules\mob\living\life.dm" -#include "code\modules\mob\living\living.dm" -#include "code\modules\mob\living\living_defense.dm" -#include "code\modules\mob\living\living_defines.dm" -#include "code\modules\mob\living\living_movement.dm" -#include "code\modules\mob\living\login.dm" -#include "code\modules\mob\living\logout.dm" -#include "code\modules\mob\living\say.dm" -#include "code\modules\mob\living\status_procs.dm" -#include "code\modules\mob\living\taste.dm" -#include "code\modules\mob\living\ventcrawling.dm" -#include "code\modules\mob\living\brain\brain.dm" -#include "code\modules\mob\living\brain\brain_item.dm" -#include "code\modules\mob\living\brain\death.dm" -#include "code\modules\mob\living\brain\emote.dm" -#include "code\modules\mob\living\brain\life.dm" -#include "code\modules\mob\living\brain\MMI.dm" -#include "code\modules\mob\living\brain\posibrain.dm" -#include "code\modules\mob\living\brain\say.dm" -#include "code\modules\mob\living\brain\status_procs.dm" -#include "code\modules\mob\living\carbon\carbon.dm" -#include "code\modules\mob\living\carbon\carbon_defense.dm" -#include "code\modules\mob\living\carbon\carbon_defines.dm" -#include "code\modules\mob\living\carbon\carbon_movement.dm" -#include "code\modules\mob\living\carbon\damage_procs.dm" -#include "code\modules\mob\living\carbon\death.dm" -#include "code\modules\mob\living\carbon\emote.dm" -#include "code\modules\mob\living\carbon\examine.dm" -#include "code\modules\mob\living\carbon\give.dm" -#include "code\modules\mob\living\carbon\inventory.dm" -#include "code\modules\mob\living\carbon\life.dm" -#include "code\modules\mob\living\carbon\say.dm" -#include "code\modules\mob\living\carbon\status_procs.dm" -#include "code\modules\mob\living\carbon\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\alien.dm" -#include "code\modules\mob\living\carbon\alien\alien_defense.dm" -#include "code\modules\mob\living\carbon\alien\damage_procs.dm" -#include "code\modules\mob\living\carbon\alien\death.dm" -#include "code\modules\mob\living\carbon\alien\emote.dm" -#include "code\modules\mob\living\carbon\alien\life.dm" -#include "code\modules\mob\living\carbon\alien\login.dm" -#include "code\modules\mob\living\carbon\alien\logout.dm" -#include "code\modules\mob\living\carbon\alien\organs.dm" -#include "code\modules\mob\living\carbon\alien\say.dm" -#include "code\modules\mob\living\carbon\alien\screen.dm" -#include "code\modules\mob\living\carbon\alien\status_procs.dm" -#include "code\modules\mob\living\carbon\alien\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\death.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm" -#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" -#include "code\modules\mob\living\carbon\alien\larva\death.dm" -#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva.dm" -#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" -#include "code\modules\mob\living\carbon\alien\larva\life.dm" -#include "code\modules\mob\living\carbon\alien\larva\powers.dm" -#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" -#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" -#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" -#include "code\modules\mob\living\carbon\human\damage_procs.dm" -#include "code\modules\mob\living\carbon\human\death.dm" -#include "code\modules\mob\living\carbon\human\dummy.dm" -#include "code\modules\mob\living\carbon\human\emote.dm" -#include "code\modules\mob\living\carbon\human\examine.dm" -#include "code\modules\mob\living\carbon\human\examine_vr.dm" -#include "code\modules\mob\living\carbon\human\human.dm" -#include "code\modules\mob\living\carbon\human\human_defense.dm" -#include "code\modules\mob\living\carbon\human\human_defines.dm" -#include "code\modules\mob\living\carbon\human\human_helpers.dm" -#include "code\modules\mob\living\carbon\human\human_movement.dm" -#include "code\modules\mob\living\carbon\human\inventory.dm" -#include "code\modules\mob\living\carbon\human\life.dm" -#include "code\modules\mob\living\carbon\human\physiology.dm" -#include "code\modules\mob\living\carbon\human\say.dm" -#include "code\modules\mob\living\carbon\human\species.dm" -#include "code\modules\mob\living\carbon\human\status_procs.dm" -#include "code\modules\mob\living\carbon\human\typing_indicator.dm" -#include "code\modules\mob\living\carbon\human\update_icons.dm" -#include "code\modules\mob\living\carbon\human\species_types\abductors.dm" -#include "code\modules\mob\living\carbon\human\species_types\android.dm" -#include "code\modules\mob\living\carbon\human\species_types\angel.dm" -#include "code\modules\mob\living\carbon\human\species_types\corporate.dm" -#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" -#include "code\modules\mob\living\carbon\human\species_types\felinid.dm" -#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\golems.dm" -#include "code\modules\mob\living\carbon\human\species_types\humans.dm" -#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" -#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" -#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" -#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" -#include "code\modules\mob\living\carbon\human\species_types\synths.dm" -#include "code\modules\mob\living\carbon\human\species_types\vampire.dm" -#include "code\modules\mob\living\carbon\human\species_types\zombies.dm" -#include "code\modules\mob\living\carbon\monkey\combat.dm" -#include "code\modules\mob\living\carbon\monkey\death.dm" -#include "code\modules\mob\living\carbon\monkey\inventory.dm" -#include "code\modules\mob\living\carbon\monkey\life.dm" -#include "code\modules\mob\living\carbon\monkey\monkey.dm" -#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm" -#include "code\modules\mob\living\carbon\monkey\punpun.dm" -#include "code\modules\mob\living\carbon\monkey\update_icons.dm" -#include "code\modules\mob\living\silicon\damage_procs.dm" -#include "code\modules\mob\living\silicon\death.dm" -#include "code\modules\mob\living\silicon\examine.dm" -#include "code\modules\mob\living\silicon\laws.dm" -#include "code\modules\mob\living\silicon\login.dm" -#include "code\modules\mob\living\silicon\say.dm" -#include "code\modules\mob\living\silicon\silicon.dm" -#include "code\modules\mob\living\silicon\silicon_defense.dm" -#include "code\modules\mob\living\silicon\silicon_movement.dm" -#include "code\modules\mob\living\silicon\ai\ai.dm" -#include "code\modules\mob\living\silicon\ai\ai_defense.dm" -#include "code\modules\mob\living\silicon\ai\death.dm" -#include "code\modules\mob\living\silicon\ai\examine.dm" -#include "code\modules\mob\living\silicon\ai\laws.dm" -#include "code\modules\mob\living\silicon\ai\life.dm" -#include "code\modules\mob\living\silicon\ai\login.dm" -#include "code\modules\mob\living\silicon\ai\logout.dm" -#include "code\modules\mob\living\silicon\ai\multicam.dm" -#include "code\modules\mob\living\silicon\ai\say.dm" -#include "code\modules\mob\living\silicon\ai\vox_sounds.dm" -#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" -#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" -#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" -#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" -#include "code\modules\mob\living\silicon\pai\death.dm" -#include "code\modules\mob\living\silicon\pai\pai.dm" -#include "code\modules\mob\living\silicon\pai\pai_defense.dm" -#include "code\modules\mob\living\silicon\pai\pai_shell.dm" -#include "code\modules\mob\living\silicon\pai\personality.dm" -#include "code\modules\mob\living\silicon\pai\say.dm" -#include "code\modules\mob\living\silicon\pai\software.dm" -#include "code\modules\mob\living\silicon\robot\death.dm" -#include "code\modules\mob\living\silicon\robot\emote.dm" -#include "code\modules\mob\living\silicon\robot\examine.dm" -#include "code\modules\mob\living\silicon\robot\inventory.dm" -#include "code\modules\mob\living\silicon\robot\laws.dm" -#include "code\modules\mob\living\silicon\robot\life.dm" -#include "code\modules\mob\living\silicon\robot\login.dm" -#include "code\modules\mob\living\silicon\robot\robot.dm" -#include "code\modules\mob\living\silicon\robot\robot_defense.dm" -#include "code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "code\modules\mob\living\silicon\robot\say.dm" -#include "code\modules\mob\living\simple_animal\animal_defense.dm" -#include "code\modules\mob\living\simple_animal\astral.dm" -#include "code\modules\mob\living\simple_animal\constructs.dm" -#include "code\modules\mob\living\simple_animal\corpse.dm" -#include "code\modules\mob\living\simple_animal\damage_procs.dm" -#include "code\modules\mob\living\simple_animal\parrot.dm" -#include "code\modules\mob\living\simple_animal\shade.dm" -#include "code\modules\mob\living\simple_animal\simple_animal.dm" -#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" -#include "code\modules\mob\living\simple_animal\status_procs.dm" -#include "code\modules\mob\living\simple_animal\bot\bot.dm" -#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" -#include "code\modules\mob\living\simple_animal\bot\construction.dm" -#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" -#include "code\modules\mob\living\simple_animal\bot\firebot.dm" -#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" -#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" -#include "code\modules\mob\living\simple_animal\bot\medbot.dm" -#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" -#include "code\modules\mob\living\simple_animal\bot\secbot.dm" -#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" -#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" -#include "code\modules\mob\living\simple_animal\friendly\cat.dm" -#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" -#include "code\modules\mob\living\simple_animal\friendly\crab.dm" -#include "code\modules\mob\living\simple_animal\friendly\dog.dm" -#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" -#include "code\modules\mob\living\simple_animal\friendly\fox.dm" -#include "code\modules\mob\living\simple_animal\friendly\goliathbaby.dm" -#include "code\modules\mob\living\simple_animal\friendly\gondola.dm" -#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" -#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" -#include "code\modules\mob\living\simple_animal\friendly\panda.dm" -#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" -#include "code\modules\mob\living\simple_animal\friendly\pet.dm" -#include "code\modules\mob\living\simple_animal\friendly\possum.dm" -#include "code\modules\mob\living\simple_animal\friendly\skunk.dm" -#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" -#include "code\modules\mob\living\simple_animal\friendly\snake.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" -#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" -#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" -#include "code\modules\mob\living\simple_animal\guardian\types\support.dm" -#include "code\modules\mob\living\simple_animal\hostile\alien.dm" -#include "code\modules\mob\living\simple_animal\hostile\bear.dm" -#include "code\modules\mob\living\simple_animal\hostile\bees.dm" -#include "code\modules\mob\living\simple_animal\hostile\bread.dm" -#include "code\modules\mob\living\simple_animal\hostile\carp.dm" -#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" -#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" -#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" -#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm" -#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" -#include "code\modules\mob\living\simple_animal\hostile\goose.dm" -#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" -#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" -#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" -#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" -#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" -#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" -#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" -#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" -#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" -#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" -#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" -#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" -#include "code\modules\mob\living\simple_animal\hostile\russian.dm" -#include "code\modules\mob\living\simple_animal\hostile\sharks.dm" -#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" -#include "code\modules\mob\living\simple_animal\hostile\statue.dm" -#include "code\modules\mob\living\simple_animal\hostile\stickman.dm" -#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" -#include "code\modules\mob\living\simple_animal\hostile\tree.dm" -#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" -#include "code\modules\mob\living\simple_animal\hostile\wizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" -#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" -#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" -#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" -#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" -#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" -#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" -#include "code\modules\mob\living\simple_animal\slime\death.dm" -#include "code\modules\mob\living\simple_animal\slime\emote.dm" -#include "code\modules\mob\living\simple_animal\slime\life.dm" -#include "code\modules\mob\living\simple_animal\slime\powers.dm" -#include "code\modules\mob\living\simple_animal\slime\say.dm" -#include "code\modules\mob\living\simple_animal\slime\slime.dm" -#include "code\modules\mob\living\simple_animal\slime\subtypes.dm" -#include "code\modules\modular_computers\laptop_vendor.dm" -#include "code\modules\modular_computers\computers\item\computer.dm" -#include "code\modules\modular_computers\computers\item\computer_components.dm" -#include "code\modules\modular_computers\computers\item\computer_damage.dm" -#include "code\modules\modular_computers\computers\item\computer_power.dm" -#include "code\modules\modular_computers\computers\item\computer_ui.dm" -#include "code\modules\modular_computers\computers\item\laptop.dm" -#include "code\modules\modular_computers\computers\item\laptop_presets.dm" -#include "code\modules\modular_computers\computers\item\processor.dm" -#include "code\modules\modular_computers\computers\item\tablet.dm" -#include "code\modules\modular_computers\computers\item\tablet_presets.dm" -#include "code\modules\modular_computers\computers\machinery\console_presets.dm" -#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" -#include "code\modules\modular_computers\computers\machinery\modular_console.dm" -#include "code\modules\modular_computers\file_system\computer_file.dm" -#include "code\modules\modular_computers\file_system\data.dm" -#include "code\modules\modular_computers\file_system\program.dm" -#include "code\modules\modular_computers\file_system\program_events.dm" -#include "code\modules\modular_computers\file_system\programs\airestorer.dm" -#include "code\modules\modular_computers\file_system\programs\alarm.dm" -#include "code\modules\modular_computers\file_system\programs\card.dm" -#include "code\modules\modular_computers\file_system\programs\configurator.dm" -#include "code\modules\modular_computers\file_system\programs\file_browser.dm" -#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" -#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" -#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" -#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" -#include "code\modules\modular_computers\file_system\programs\powermonitor.dm" -#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" -#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" -#include "code\modules\modular_computers\hardware\_hardware.dm" -#include "code\modules\modular_computers\hardware\ai_slot.dm" -#include "code\modules\modular_computers\hardware\battery_module.dm" -#include "code\modules\modular_computers\hardware\card_slot.dm" -#include "code\modules\modular_computers\hardware\CPU.dm" -#include "code\modules\modular_computers\hardware\hard_drive.dm" -#include "code\modules\modular_computers\hardware\network_card.dm" -#include "code\modules\modular_computers\hardware\portable_disk.dm" -#include "code\modules\modular_computers\hardware\printer.dm" -#include "code\modules\modular_computers\hardware\recharger.dm" -#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" -#include "code\modules\ninja\__ninjaDefines.dm" -#include "code\modules\ninja\energy_katana.dm" -#include "code\modules\ninja\ninja_event.dm" -#include "code\modules\ninja\outfit.dm" -#include "code\modules\ninja\suit\gloves.dm" -#include "code\modules\ninja\suit\head.dm" -#include "code\modules\ninja\suit\mask.dm" -#include "code\modules\ninja\suit\ninjaDrainAct.dm" -#include "code\modules\ninja\suit\shoes.dm" -#include "code\modules\ninja\suit\suit.dm" -#include "code\modules\ninja\suit\suit_attackby.dm" -#include "code\modules\ninja\suit\suit_initialisation.dm" -#include "code\modules\ninja\suit\suit_process.dm" -#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm" -#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm" -#include "code\modules\NTNet\netdata.dm" -#include "code\modules\NTNet\network.dm" -#include "code\modules\NTNet\relays.dm" -#include "code\modules\NTNet\services\_service.dm" -#include "code\modules\oracle_ui\assets.dm" -#include "code\modules\oracle_ui\hookup_procs.dm" -#include "code\modules\oracle_ui\oracle_ui.dm" -#include "code\modules\oracle_ui\themed.dm" -#include "code\modules\paperwork\clipboard.dm" -#include "code\modules\paperwork\contract.dm" -#include "code\modules\paperwork\filingcabinet.dm" -#include "code\modules\paperwork\folders.dm" -#include "code\modules\paperwork\handlabeler.dm" -#include "code\modules\paperwork\paper.dm" -#include "code\modules\paperwork\paper_cutter.dm" -#include "code\modules\paperwork\paper_premade.dm" -#include "code\modules\paperwork\paperbin.dm" -#include "code\modules\paperwork\paperplane.dm" -#include "code\modules\paperwork\pen.dm" -#include "code\modules\paperwork\photocopier.dm" -#include "code\modules\paperwork\stamps.dm" -#include "code\modules\photography\_pictures.dm" -#include "code\modules\photography\camera\camera.dm" -#include "code\modules\photography\camera\camera_image_capturing.dm" -#include "code\modules\photography\camera\film.dm" -#include "code\modules\photography\camera\other.dm" -#include "code\modules\photography\camera\silicon_camera.dm" -#include "code\modules\photography\photos\album.dm" -#include "code\modules\photography\photos\frame.dm" -#include "code\modules\photography\photos\photo.dm" -#include "code\modules\pool\pool_controller.dm" -#include "code\modules\pool\pool_drain.dm" -#include "code\modules\pool\pool_effects.dm" -#include "code\modules\pool\pool_main.dm" -#include "code\modules\pool\pool_noodles.dm" -#include "code\modules\pool\pool_structures.dm" -#include "code\modules\pool\pool_wires.dm" -#include "code\modules\power\apc.dm" -#include "code\modules\power\cable.dm" -#include "code\modules\power\cell.dm" -#include "code\modules\power\floodlight.dm" -#include "code\modules\power\generator.dm" -#include "code\modules\power\gravitygenerator.dm" -#include "code\modules\power\lighting.dm" -#include "code\modules\power\monitor.dm" -#include "code\modules\power\multiz.dm" -#include "code\modules\power\port_gen.dm" -#include "code\modules\power\power.dm" -#include "code\modules\power\powernet.dm" -#include "code\modules\power\rtg.dm" -#include "code\modules\power\smes.dm" -#include "code\modules\power\solar.dm" -#include "code\modules\power\terminal.dm" -#include "code\modules\power\tracker.dm" -#include "code\modules\power\turbine.dm" -#include "code\modules\power\antimatter\containment_jar.dm" -#include "code\modules\power\antimatter\control.dm" -#include "code\modules\power\antimatter\shielding.dm" -#include "code\modules\power\singularity\collector.dm" -#include "code\modules\power\singularity\containment_field.dm" -#include "code\modules\power\singularity\emitter.dm" -#include "code\modules\power\singularity\field_generator.dm" -#include "code\modules\power\singularity\generator.dm" -#include "code\modules\power\singularity\investigate.dm" -#include "code\modules\power\singularity\narsie.dm" -#include "code\modules\power\singularity\singularity.dm" -#include "code\modules\power\singularity\particle_accelerator\particle.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" -#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" -#include "code\modules\power\supermatter\supermatter.dm" -#include "code\modules\power\tesla\coil.dm" -#include "code\modules\power\tesla\energy_ball.dm" -#include "code\modules\power\tesla\generator.dm" -#include "code\modules\procedural_mapping\mapGenerator.dm" -#include "code\modules\procedural_mapping\mapGeneratorModule.dm" -#include "code\modules\procedural_mapping\mapGeneratorObj.dm" -#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" -#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" -#include "code\modules\procedural_mapping\mapGenerators\cellular.dm" -#include "code\modules\procedural_mapping\mapGenerators\cult.dm" -#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" -#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm" -#include "code\modules\procedural_mapping\mapGenerators\nature.dm" -#include "code\modules\procedural_mapping\mapGenerators\repair.dm" -#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" -#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" -#include "code\modules\projectiles\gun.dm" -#include "code\modules\projectiles\pins.dm" -#include "code\modules\projectiles\projectile.dm" -#include "code\modules\projectiles\ammunition\_ammunition.dm" -#include "code\modules\projectiles\ammunition\_firing.dm" -#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" -#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" -#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" -#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" -#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" -#include "code\modules\projectiles\ammunition\ballistic\smg.dm" -#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" -#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" -#include "code\modules\projectiles\ammunition\caseless\foam.dm" -#include "code\modules\projectiles\ammunition\caseless\misc.dm" -#include "code\modules\projectiles\ammunition\caseless\rocket.dm" -#include "code\modules\projectiles\ammunition\energy\_energy.dm" -#include "code\modules\projectiles\ammunition\energy\ebow.dm" -#include "code\modules\projectiles\ammunition\energy\gravity.dm" -#include "code\modules\projectiles\ammunition\energy\laser.dm" -#include "code\modules\projectiles\ammunition\energy\lmg.dm" -#include "code\modules\projectiles\ammunition\energy\plasma.dm" -#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" -#include "code\modules\projectiles\ammunition\energy\portal.dm" -#include "code\modules\projectiles\ammunition\energy\special.dm" -#include "code\modules\projectiles\ammunition\energy\stun.dm" -#include "code\modules\projectiles\ammunition\special\magic.dm" -#include "code\modules\projectiles\ammunition\special\syringe.dm" -#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" -#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" -#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" -#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" -#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" -#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" -#include "code\modules\projectiles\boxes_magazines\external\smg.dm" -#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" -#include "code\modules\projectiles\boxes_magazines\external\toy.dm" -#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" -#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" -#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" -#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" -#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" -#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" -#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" -#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" -#include "code\modules\projectiles\guns\ballistic.dm" -#include "code\modules\projectiles\guns\energy.dm" -#include "code\modules\projectiles\guns\magic.dm" -#include "code\modules\projectiles\guns\ballistic\automatic.dm" -#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" -#include "code\modules\projectiles\guns\ballistic\launchers.dm" -#include "code\modules\projectiles\guns\ballistic\pistol.dm" -#include "code\modules\projectiles\guns\ballistic\revolver.dm" -#include "code\modules\projectiles\guns\ballistic\shotgun.dm" -#include "code\modules\projectiles\guns\ballistic\toy.dm" -#include "code\modules\projectiles\guns\energy\dueling.dm" -#include "code\modules\projectiles\guns\energy\energy_gun.dm" -#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" -#include "code\modules\projectiles\guns\energy\laser.dm" -#include "code\modules\projectiles\guns\energy\megabuster.dm" -#include "code\modules\projectiles\guns\energy\mounted.dm" -#include "code\modules\projectiles\guns\energy\plasma_cit.dm" -#include "code\modules\projectiles\guns\energy\pulse.dm" -#include "code\modules\projectiles\guns\energy\special.dm" -#include "code\modules\projectiles\guns\energy\stun.dm" -#include "code\modules\projectiles\guns\magic\staff.dm" -#include "code\modules\projectiles\guns\magic\wand.dm" -#include "code\modules\projectiles\guns\misc\beam_rifle.dm" -#include "code\modules\projectiles\guns\misc\blastcannon.dm" -#include "code\modules\projectiles\guns\misc\chem_gun.dm" -#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" -#include "code\modules\projectiles\guns\misc\medbeam.dm" -#include "code\modules\projectiles\guns\misc\syringe_gun.dm" -#include "code\modules\projectiles\projectile\beams.dm" -#include "code\modules\projectiles\projectile\bullets.dm" -#include "code\modules\projectiles\projectile\magic.dm" -#include "code\modules\projectiles\projectile\megabuster.dm" -#include "code\modules\projectiles\projectile\plasma.dm" -#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" -#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" -#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" -#include "code\modules\projectiles\projectile\bullets\grenade.dm" -#include "code\modules\projectiles\projectile\bullets\lmg.dm" -#include "code\modules\projectiles\projectile\bullets\pistol.dm" -#include "code\modules\projectiles\projectile\bullets\revolver.dm" -#include "code\modules\projectiles\projectile\bullets\rifle.dm" -#include "code\modules\projectiles\projectile\bullets\shotgun.dm" -#include "code\modules\projectiles\projectile\bullets\smg.dm" -#include "code\modules\projectiles\projectile\bullets\sniper.dm" -#include "code\modules\projectiles\projectile\bullets\special.dm" -#include "code\modules\projectiles\projectile\energy\_energy.dm" -#include "code\modules\projectiles\projectile\energy\ebow.dm" -#include "code\modules\projectiles\projectile\energy\misc.dm" -#include "code\modules\projectiles\projectile\energy\net_snare.dm" -#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" -#include "code\modules\projectiles\projectile\energy\stun.dm" -#include "code\modules\projectiles\projectile\energy\tesla.dm" -#include "code\modules\projectiles\projectile\magic\spellcard.dm" -#include "code\modules\projectiles\projectile\reusable\_reusable.dm" -#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" -#include "code\modules\projectiles\projectile\reusable\magspear.dm" -#include "code\modules\projectiles\projectile\special\curse.dm" -#include "code\modules\projectiles\projectile\special\floral.dm" -#include "code\modules\projectiles\projectile\special\gravity.dm" -#include "code\modules\projectiles\projectile\special\hallucination.dm" -#include "code\modules\projectiles\projectile\special\ion.dm" -#include "code\modules\projectiles\projectile\special\meteor.dm" -#include "code\modules\projectiles\projectile\special\mindflayer.dm" -#include "code\modules\projectiles\projectile\special\neurotoxin.dm" -#include "code\modules\projectiles\projectile\special\plasma.dm" -#include "code\modules\projectiles\projectile\special\rocket.dm" -#include "code\modules\projectiles\projectile\special\temperature.dm" -#include "code\modules\projectiles\projectile\special\wormhole.dm" -#include "code\modules\reagents\chem_splash.dm" -#include "code\modules\reagents\chem_wiki_render.dm" -#include "code\modules\reagents\reagent_containers.dm" -#include "code\modules\reagents\reagent_dispenser.dm" -#include "code\modules\reagents\chemistry\colors.dm" -#include "code\modules\reagents\chemistry\holder.dm" -#include "code\modules\reagents\chemistry\reagents.dm" -#include "code\modules\reagents\chemistry\recipes.dm" -#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" -#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" -#include "code\modules\reagents\chemistry\machinery\chem_master.dm" -#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" -#include "code\modules\reagents\chemistry\machinery\pandemic.dm" -#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" -#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" -#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\food_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" -#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" -#include "code\modules\reagents\chemistry\recipes\drugs.dm" -#include "code\modules\reagents\chemistry\recipes\medicine.dm" -#include "code\modules\reagents\chemistry\recipes\others.dm" -#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" -#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" -#include "code\modules\reagents\reagent_containers\borghydro.dm" -#include "code\modules\reagents\reagent_containers\bottle.dm" -#include "code\modules\reagents\reagent_containers\chem_pack.dm" -#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm" -#include "code\modules\reagents\reagent_containers\dropper.dm" -#include "code\modules\reagents\reagent_containers\glass.dm" -#include "code\modules\reagents\reagent_containers\hypospray.dm" -#include "code\modules\reagents\reagent_containers\hypovial.dm" -#include "code\modules\reagents\reagent_containers\medspray.dm" -#include "code\modules\reagents\reagent_containers\patch.dm" -#include "code\modules\reagents\reagent_containers\pill.dm" -#include "code\modules\reagents\reagent_containers\rags.dm" -#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm" -#include "code\modules\reagents\reagent_containers\spray.dm" -#include "code\modules\reagents\reagent_containers\syringes.dm" -#include "code\modules\recycling\conveyor2.dm" -#include "code\modules\recycling\sortingmachinery.dm" -#include "code\modules\recycling\disposal\bin.dm" -#include "code\modules\recycling\disposal\construction.dm" -#include "code\modules\recycling\disposal\eject.dm" -#include "code\modules\recycling\disposal\holder.dm" -#include "code\modules\recycling\disposal\multiz.dm" -#include "code\modules\recycling\disposal\outlet.dm" -#include "code\modules\recycling\disposal\pipe.dm" -#include "code\modules\recycling\disposal\pipe_sorting.dm" -#include "code\modules\research\designs.dm" -#include "code\modules\research\destructive_analyzer.dm" -#include "code\modules\research\experimentor.dm" -#include "code\modules\research\rdconsole.dm" -#include "code\modules\research\rdmachines.dm" -#include "code\modules\research\research_disk.dm" -#include "code\modules\research\server.dm" -#include "code\modules\research\stock_parts.dm" -#include "code\modules\research\designs\AI_module_designs.dm" -#include "code\modules\research\designs\autobotter_designs.dm" -#include "code\modules\research\designs\biogenerator_designs.dm" -#include "code\modules\research\designs\bluespace_designs.dm" -#include "code\modules\research\designs\computer_part_designs.dm" -#include "code\modules\research\designs\electronics_designs.dm" -#include "code\modules\research\designs\equipment_designs.dm" -#include "code\modules\research\designs\limbgrower_designs.dm" -#include "code\modules\research\designs\mecha_designs.dm" -#include "code\modules\research\designs\mechfabricator_designs.dm" -#include "code\modules\research\designs\medical_designs.dm" -#include "code\modules\research\designs\mining_designs.dm" -#include "code\modules\research\designs\misc_designs.dm" -#include "code\modules\research\designs\nanite_designs.dm" -#include "code\modules\research\designs\power_designs.dm" -#include "code\modules\research\designs\smelting_designs.dm" -#include "code\modules\research\designs\stock_parts_designs.dm" -#include "code\modules\research\designs\telecomms_designs.dm" -#include "code\modules\research\designs\weapon_designs.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" -#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" -#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" -#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" -#include "code\modules\research\machinery\_production.dm" -#include "code\modules\research\machinery\circuit_imprinter.dm" -#include "code\modules\research\machinery\departmental_circuit_imprinter.dm" -#include "code\modules\research\machinery\departmental_protolathe.dm" -#include "code\modules\research\machinery\departmental_techfab.dm" -#include "code\modules\research\machinery\protolathe.dm" -#include "code\modules\research\machinery\techfab.dm" -#include "code\modules\research\nanites\nanite_chamber.dm" -#include "code\modules\research\nanites\nanite_chamber_computer.dm" -#include "code\modules\research\nanites\nanite_cloud_controller.dm" -#include "code\modules\research\nanites\nanite_hijacker.dm" -#include "code\modules\research\nanites\nanite_misc_items.dm" -#include "code\modules\research\nanites\nanite_program_hub.dm" -#include "code\modules\research\nanites\nanite_programmer.dm" -#include "code\modules\research\nanites\nanite_programs.dm" -#include "code\modules\research\nanites\nanite_remote.dm" -#include "code\modules\research\nanites\program_disks.dm" -#include "code\modules\research\nanites\public_chamber.dm" -#include "code\modules\research\nanites\nanite_programs\buffing.dm" -#include "code\modules\research\nanites\nanite_programs\healing.dm" -#include "code\modules\research\nanites\nanite_programs\rogue.dm" -#include "code\modules\research\nanites\nanite_programs\sensor.dm" -#include "code\modules\research\nanites\nanite_programs\suppression.dm" -#include "code\modules\research\nanites\nanite_programs\utility.dm" -#include "code\modules\research\nanites\nanite_programs\weapon.dm" -#include "code\modules\research\techweb\__techweb_helpers.dm" -#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\xenoarch\artifact.dm" -#include "code\modules\research\xenoarch\artifact_list.dm" -#include "code\modules\research\xenoarch\strange_rock.dm" -#include "code\modules\research\xenoarch\tools.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm" -#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.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\_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\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\lavaland_ruin_code.dm" -#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" -#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" -#include "code\modules\ruins\lavalandruin_code\puzzle.dm" -#include "code\modules\ruins\lavalandruin_code\sloth.dm" -#include "code\modules\ruins\lavalandruin_code\surface.dm" -#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" -#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm" -#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" -#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" -#include "code\modules\ruins\spaceruin_code\asteroid4.dm" -#include "code\modules\ruins\spaceruin_code\bigderelict1.dm" -#include "code\modules\ruins\spaceruin_code\caravanambush.dm" -#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" -#include "code\modules\ruins\spaceruin_code\crashedclownship.dm" -#include "code\modules\ruins\spaceruin_code\crashedship.dm" -#include "code\modules\ruins\spaceruin_code\deepstorage.dm" -#include "code\modules\ruins\spaceruin_code\DJstation.dm" -#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" -#include "code\modules\ruins\spaceruin_code\listeningstation.dm" -#include "code\modules\ruins\spaceruin_code\miracle.dm" -#include "code\modules\ruins\spaceruin_code\oldstation.dm" -#include "code\modules\ruins\spaceruin_code\originalcontent.dm" -#include "code\modules\ruins\spaceruin_code\spacehotel.dm" -#include "code\modules\ruins\spaceruin_code\TheDerelict.dm" -#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" -#include "code\modules\security_levels\keycard_authentication.dm" -#include "code\modules\security_levels\security_levels.dm" -#include "code\modules\shuttle\arrivals.dm" -#include "code\modules\shuttle\assault_pod.dm" -#include "code\modules\shuttle\computer.dm" -#include "code\modules\shuttle\docking.dm" -#include "code\modules\shuttle\elevator.dm" -#include "code\modules\shuttle\emergency.dm" -#include "code\modules\shuttle\ferry.dm" -#include "code\modules\shuttle\manipulator.dm" -#include "code\modules\shuttle\monastery.dm" -#include "code\modules\shuttle\navigation_computer.dm" -#include "code\modules\shuttle\on_move.dm" -#include "code\modules\shuttle\ripple.dm" -#include "code\modules\shuttle\shuttle.dm" -#include "code\modules\shuttle\shuttle_rotate.dm" -#include "code\modules\shuttle\special.dm" -#include "code\modules\shuttle\supply.dm" -#include "code\modules\shuttle\syndicate.dm" -#include "code\modules\shuttle\white_ship.dm" -#include "code\modules\spells\spell.dm" -#include "code\modules\spells\spell_types\adminbussed.dm" -#include "code\modules\spells\spell_types\aimed.dm" -#include "code\modules\spells\spell_types\area_teleport.dm" -#include "code\modules\spells\spell_types\barnyard.dm" -#include "code\modules\spells\spell_types\bloodcrawl.dm" -#include "code\modules\spells\spell_types\charge.dm" -#include "code\modules\spells\spell_types\conjure.dm" -#include "code\modules\spells\spell_types\construct_spells.dm" -#include "code\modules\spells\spell_types\devil.dm" -#include "code\modules\spells\spell_types\devil_boons.dm" -#include "code\modules\spells\spell_types\dumbfire.dm" -#include "code\modules\spells\spell_types\emplosion.dm" -#include "code\modules\spells\spell_types\ethereal_jaunt.dm" -#include "code\modules\spells\spell_types\explosion.dm" -#include "code\modules\spells\spell_types\forcewall.dm" -#include "code\modules\spells\spell_types\genetic.dm" -#include "code\modules\spells\spell_types\godhand.dm" -#include "code\modules\spells\spell_types\infinite_guns.dm" -#include "code\modules\spells\spell_types\inflict_handler.dm" -#include "code\modules\spells\spell_types\knock.dm" -#include "code\modules\spells\spell_types\lichdom.dm" -#include "code\modules\spells\spell_types\lightning.dm" -#include "code\modules\spells\spell_types\mime.dm" -#include "code\modules\spells\spell_types\mind_transfer.dm" -#include "code\modules\spells\spell_types\projectile.dm" -#include "code\modules\spells\spell_types\rightandwrong.dm" -#include "code\modules\spells\spell_types\rod_form.dm" -#include "code\modules\spells\spell_types\santa.dm" -#include "code\modules\spells\spell_types\shadow_walk.dm" -#include "code\modules\spells\spell_types\shapeshift.dm" -#include "code\modules\spells\spell_types\spacetime_distortion.dm" -#include "code\modules\spells\spell_types\summonitem.dm" -#include "code\modules\spells\spell_types\taeclowndo.dm" -#include "code\modules\spells\spell_types\telepathy.dm" -#include "code\modules\spells\spell_types\the_traps.dm" -#include "code\modules\spells\spell_types\touch_attacks.dm" -#include "code\modules\spells\spell_types\trigger.dm" -#include "code\modules\spells\spell_types\turf_teleport.dm" -#include "code\modules\spells\spell_types\voice_of_god.dm" -#include "code\modules\spells\spell_types\wizard.dm" -#include "code\modules\station_goals\bsa.dm" -#include "code\modules\station_goals\dna_vault.dm" -#include "code\modules\station_goals\shield.dm" -#include "code\modules\station_goals\station_goal.dm" -#include "code\modules\surgery\amputation.dm" -#include "code\modules\surgery\brain_surgery.dm" -#include "code\modules\surgery\breast_augmentation.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\embalming.dm" -#include "code\modules\surgery\experimental_dissection.dm" -#include "code\modules\surgery\eye_surgery.dm" -#include "code\modules\surgery\graft_synthtissue.dm" -#include "code\modules\surgery\healing.dm" -#include "code\modules\surgery\helpers.dm" -#include "code\modules\surgery\implant_removal.dm" -#include "code\modules\surgery\limb_augmentation.dm" -#include "code\modules\surgery\lipoplasty.dm" -#include "code\modules\surgery\lobectomy.dm" -#include "code\modules\surgery\mechanic_steps.dm" -#include "code\modules\surgery\nutcracker.dm" -#include "code\modules\surgery\organ_manipulation.dm" -#include "code\modules\surgery\organic_steps.dm" -#include "code\modules\surgery\penis_augmentation.dm" -#include "code\modules\surgery\plastic_surgery.dm" -#include "code\modules\surgery\prosthetic_replacement.dm" -#include "code\modules\surgery\remove_embedded_object.dm" -#include "code\modules\surgery\surgery.dm" -#include "code\modules\surgery\surgery_step.dm" -#include "code\modules\surgery\tools.dm" -#include "code\modules\surgery\advanced\brainwashing.dm" -#include "code\modules\surgery\advanced\lobotomy.dm" -#include "code\modules\surgery\advanced\necrotic_revival.dm" -#include "code\modules\surgery\advanced\pacification.dm" -#include "code\modules\surgery\advanced\revival.dm" -#include "code\modules\surgery\advanced\toxichealing.dm" -#include "code\modules\surgery\advanced\viral_bonding.dm" -#include "code\modules\surgery\advanced\bioware\bioware.dm" -#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" -#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" -#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" -#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" -#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" -#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" -#include "code\modules\surgery\advanced\bioware\vein_threading.dm" -#include "code\modules\surgery\bodyparts\bodyparts.dm" -#include "code\modules\surgery\bodyparts\broken.dm" -#include "code\modules\surgery\bodyparts\dismemberment.dm" -#include "code\modules\surgery\bodyparts\head.dm" -#include "code\modules\surgery\bodyparts\helpers.dm" -#include "code\modules\surgery\bodyparts\robot_bodyparts.dm" -#include "code\modules\surgery\organs\appendix.dm" -#include "code\modules\surgery\organs\augments_arms.dm" -#include "code\modules\surgery\organs\augments_chest.dm" -#include "code\modules\surgery\organs\augments_eyes.dm" -#include "code\modules\surgery\organs\augments_internal.dm" -#include "code\modules\surgery\organs\autosurgeon.dm" -#include "code\modules\surgery\organs\ears.dm" -#include "code\modules\surgery\organs\eyes.dm" -#include "code\modules\surgery\organs\heart.dm" -#include "code\modules\surgery\organs\helpers.dm" -#include "code\modules\surgery\organs\liver.dm" -#include "code\modules\surgery\organs\lungs.dm" -#include "code\modules\surgery\organs\organ_internal.dm" -#include "code\modules\surgery\organs\stomach.dm" -#include "code\modules\surgery\organs\tails.dm" -#include "code\modules\surgery\organs\tongue.dm" -#include "code\modules\surgery\organs\vocal_cords.dm" -#include "code\modules\tgs\includes.dm" -#include "code\modules\tgui\external.dm" -#include "code\modules\tgui\states.dm" -#include "code\modules\tgui\subsystem.dm" -#include "code\modules\tgui\tgui.dm" -#include "code\modules\tgui\states\admin.dm" -#include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\conscious.dm" -#include "code\modules\tgui\states\contained.dm" -#include "code\modules\tgui\states\deep_inventory.dm" -#include "code\modules\tgui\states\default.dm" -#include "code\modules\tgui\states\hands.dm" -#include "code\modules\tgui\states\human_adjacent.dm" -#include "code\modules\tgui\states\inventory.dm" -#include "code\modules\tgui\states\language_menu.dm" -#include "code\modules\tgui\states\not_incapacitated.dm" -#include "code\modules\tgui\states\notcontained.dm" -#include "code\modules\tgui\states\observer.dm" -#include "code\modules\tgui\states\physical.dm" -#include "code\modules\tgui\states\self.dm" -#include "code\modules\tgui\states\zlevel.dm" -#include "code\modules\tooltip\tooltip.dm" -#include "code\modules\unit_tests\_unit_tests.dm" -#include "code\modules\uplink\uplink_devices.dm" -#include "code\modules\uplink\uplink_items.dm" -#include "code\modules\uplink\uplink_purchase_log.dm" -#include "code\modules\vehicles\_vehicle.dm" -#include "code\modules\vehicles\atv.dm" -#include "code\modules\vehicles\bicycle.dm" -#include "code\modules\vehicles\lavaboat.dm" -#include "code\modules\vehicles\motorized_wheelchair.dm" -#include "code\modules\vehicles\pimpin_ride.dm" -#include "code\modules\vehicles\ridden.dm" -#include "code\modules\vehicles\scooter.dm" -#include "code\modules\vehicles\sealed.dm" -#include "code\modules\vehicles\secway.dm" -#include "code\modules\vehicles\speedbike.dm" -#include "code\modules\vehicles\vehicle_actions.dm" -#include "code\modules\vehicles\vehicle_key.dm" -#include "code\modules\vehicles\wheelchair.dm" -#include "code\modules\vehicles\cars\car.dm" -#include "code\modules\vehicles\cars\clowncar.dm" -#include "code\modules\vending\_vending.dm" -#include "code\modules\vending\assist.dm" -#include "code\modules\vending\autodrobe.dm" -#include "code\modules\vending\boozeomat.dm" -#include "code\modules\vending\cartridge.dm" -#include "code\modules\vending\cigarette.dm" -#include "code\modules\vending\clothesmate.dm" -#include "code\modules\vending\coffee.dm" -#include "code\modules\vending\cola.dm" -#include "code\modules\vending\drinnerware.dm" -#include "code\modules\vending\engineering.dm" -#include "code\modules\vending\engivend.dm" -#include "code\modules\vending\games.dm" -#include "code\modules\vending\liberation.dm" -#include "code\modules\vending\liberation_toy.dm" -#include "code\modules\vending\magivend.dm" -#include "code\modules\vending\medical.dm" -#include "code\modules\vending\medical_wall.dm" -#include "code\modules\vending\megaseed.dm" -#include "code\modules\vending\nutrimax.dm" -#include "code\modules\vending\plasmaresearch.dm" -#include "code\modules\vending\robotics.dm" -#include "code\modules\vending\security.dm" -#include "code\modules\vending\snack.dm" -#include "code\modules\vending\sovietsoda.dm" -#include "code\modules\vending\sustenance.dm" -#include "code\modules\vending\toys.dm" -#include "code\modules\vending\wardrobes.dm" -#include "code\modules\vending\youtool.dm" -#include "code\modules\VR\vr_human.dm" -#include "code\modules\VR\vr_sleeper.dm" -#include "code\modules\zombie\items.dm" -#include "code\modules\zombie\organs.dm" -#include "hyperstation\code\__DEFINES\economy.dm" -#include "hyperstation\code\__DEFINES\wendigo.dm" -#include "hyperstation\code\controllers\subsystem\economy.dm" -#include "hyperstation\code\datums\actions.dm" -#include "hyperstation\code\datums\components\crafting\bounties.dm" -#include "hyperstation\code\datums\components\crafting\recipes.dm" -#include "hyperstation\code\datums\ert_hazard_cleanup.dm" -#include "hyperstation\code\datums\elements\holder_micro.dm" -#include "hyperstation\code\datums\mood_events\events.dm" -#include "hyperstation\code\datums\ruins\lavaland.dm" -#include "hyperstation\code\datums\traits\good.dm" -#include "hyperstation\code\datums\traits\neutral.dm" -#include "hyperstation\code\datums\weather\oxygen_rain.dm" -#include "hyperstation\code\game\objects\railings.dm" -#include "hyperstation\code\game\objects\items\cosmetics.dm" -#include "hyperstation\code\game\objects\items\storage\big_bag.dm" -#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm" -#include "hyperstation\code\gamemode\traitor_lewd.dm" -#include "hyperstation\code\gamemode\traitor_thief.dm" -#include "hyperstation\code\gamemode\werewolf\werewolf.dm" -#include "hyperstation\code\hyperbot\hyperbot.dm" -#include "hyperstation\code\mobs\carrion.dm" -#include "hyperstation\code\mobs\dancer.dm" -#include "hyperstation\code\mobs\hugbot.dm" -#include "hyperstation\code\mobs\mimic.dm" -#include "hyperstation\code\mobs\werewolf.dm" -#include "hyperstation\code\modules\pen.dm" -#include "hyperstation\code\modules\traits.dm" -#include "hyperstation\code\modules\admin\verbs\hyperverbs.dm" -#include "hyperstation\code\modules\antagonists\wendigo\datums_hud.dm" -#include "hyperstation\code\modules\antagonists\wendigo\forest\structures\soul_storage.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\_on_click.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\defines_init.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\examine.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\metabolization.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_defense.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_equip.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\organs_bodyparts.dm" -#include "hyperstation\code\modules\antagonists\wendigo\mob\update_icons.dm" -#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm" -#include "hyperstation\code\modules\arousal\arousalhud.dm" -#include "hyperstation\code\modules\cargo\exports\engineering.dm" -#include "hyperstation\code\modules\cargo\exports\sweatshop.dm" -#include "hyperstation\code\modules\cargo\packs\misc.dm" -#include "hyperstation\code\modules\cargo\sweatshop\metal.dm" -#include "hyperstation\code\modules\cargo\sweatshop\sweatshop.dm" -#include "hyperstation\code\modules\cargo\sweatshop\wooden.dm" -#include "hyperstation\code\modules\client\loadout\glasses.dm" -#include "hyperstation\code\modules\client\loadout\tablet.dm" -#include "hyperstation\code\modules\clothing\gloves.dm" -#include "hyperstation\code\modules\clothing\head.dm" -#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm" -#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm" -#include "hyperstation\code\modules\clothing\suits\misc.dm" -#include "hyperstation\code\modules\clothing\under\under.dm" -#include "hyperstation\code\modules\economy\account.dm" -#include "hyperstation\code\modules\integrated_electronics\input.dm" -#include "hyperstation\code\modules\mining\shelters.dm" -#include "hyperstation\code\modules\mining\equipment\survival_pod.dm" -#include "hyperstation\code\modules\mob\mob_helpers.dm" -#include "hyperstation\code\modules\mob\living\status_indicators.dm" -#include "hyperstation\code\modules\mob\living\silicon\robot\robot.dm" -#include "hyperstation\code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "hyperstation\code\modules\patreon\patreon.dm" -#include "hyperstation\code\modules\power\reactor\fuel_rods.dm" -#include "hyperstation\code\modules\power\reactor\rbmk.dm" -#include "hyperstation\code\modules\power\reactor\reactor_cargo.dm" -#include "hyperstation\code\modules\reagents\chemistry\reagents\food_reagents.dm" -#include "hyperstation\code\modules\reagents\chemistry\reagents\hydroponics_reactions.dm" -#include "hyperstation\code\modules\resize\resize_action.dm" -#include "hyperstation\code\modules\resize\resizing.dm" -#include "hyperstation\code\modules\resize\sizechems.dm" -#include "hyperstation\code\modules\resize\sizegun.dm" -#include "hyperstation\code\modules\surgery\organs\augments_arms.dm" -#include "hyperstation\code\modules\uplink\uplink_items.dm" -#include "hyperstation\code\obj\ashtray.dm" -#include "hyperstation\code\obj\bluespace sewing kit.dm" -#include "hyperstation\code\obj\condom.dm" -#include "hyperstation\code\obj\decal.dm" -#include "hyperstation\code\obj\economy.dm" -#include "hyperstation\code\obj\fleshlight.dm" -#include "hyperstation\code\obj\fluff.dm" -#include "hyperstation\code\obj\kinkyclothes.dm" -#include "hyperstation\code\obj\leash.dm" -#include "hyperstation\code\obj\lunaritems.dm" -#include "hyperstation\code\obj\milking machine.dm" -#include "hyperstation\code\obj\plushes.dm" -#include "hyperstation\code\obj\pole.dm" -#include "hyperstation\code\obj\pregnancytester.dm" -#include "hyperstation\code\obj\rewards.dm" -#include "hyperstation\code\obj\rope.dm" -#include "hyperstation\code\obj\sizeitems.dm" -#include "hyperstation\code\obj\sounding.dm" -#include "hyperstation\code\obj\vibrator.dm" -#include "interface\interface.dm" -#include "interface\menu.dm" -#include "interface\stylesheet.dm" -#include "modular_citadel\code\init.dm" -#include "modular_citadel\code\__HELPERS\list2list.dm" -#include "modular_citadel\code\__HELPERS\lists.dm" -#include "modular_citadel\code\__HELPERS\mobs.dm" -#include "modular_citadel\code\_globalvars\lists\mobs.dm" -#include "modular_citadel\code\_onclick\click.dm" -#include "modular_citadel\code\_onclick\item_attack.dm" -#include "modular_citadel\code\_onclick\other_mobs.dm" -#include "modular_citadel\code\_onclick\hud\screen_objects.dm" -#include "modular_citadel\code\_onclick\hud\sprint.dm" -#include "modular_citadel\code\_onclick\hud\stamina.dm" -#include "modular_citadel\code\controllers\configuration\entries\general.dm" -#include "modular_citadel\code\controllers\subsystem\job.dm" -#include "modular_citadel\code\datums\components\material_container.dm" -#include "modular_citadel\code\datums\components\phantomthief.dm" -#include "modular_citadel\code\datums\components\souldeath.dm" -#include "modular_citadel\code\datums\mood_events\chem_events.dm" -#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" -#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" -#include "modular_citadel\code\datums\mood_events\moodular.dm" -#include "modular_citadel\code\datums\mutations\hulk.dm" -#include "modular_citadel\code\datums\status_effects\chems.dm" -#include "modular_citadel\code\datums\status_effects\debuffs.dm" -#include "modular_citadel\code\datums\traits\negative.dm" -#include "modular_citadel\code\datums\traits\neutral.dm" -#include "modular_citadel\code\datums\wires\airlock.dm" -#include "modular_citadel\code\datums\wires\autoylathe.dm" -#include "modular_citadel\code\game\area\cit_areas.dm" -#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm" -#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm" -#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm" -#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm" -#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" -#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" -#include "modular_citadel\code\game\machinery\cryopod.dm" -#include "modular_citadel\code\game\machinery\displaycases.dm" -#include "modular_citadel\code\game\machinery\Sleeper.dm" -#include "modular_citadel\code\game\machinery\toylathe.dm" -#include "modular_citadel\code\game\machinery\vending.dm" -#include "modular_citadel\code\game\machinery\wishgranter.dm" -#include "modular_citadel\code\game\machinery\doors\airlock.dm" -#include "modular_citadel\code\game\machinery\doors\airlock_types.dm" -#include "modular_citadel\code\game\objects\cit_screenshake.dm" -#include "modular_citadel\code\game\objects\items.dm" -#include "modular_citadel\code\game\objects\tools.dm" -#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" -#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" -#include "modular_citadel\code\game\objects\items\balls.dm" -#include "modular_citadel\code\game\objects\items\boombox.dm" -#include "modular_citadel\code\game\objects\items\holy_weapons.dm" -#include "modular_citadel\code\game\objects\items\honk.dm" -#include "modular_citadel\code\game\objects\items\stunsword.dm" -#include "modular_citadel\code\game\objects\items\vending_items.dm" -#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm" -#include "modular_citadel\code\game\objects\items\devices\aicard.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" -#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" -#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" -#include "modular_citadel\code\game\objects\items\melee\misc.dm" -#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" -#include "modular_citadel\code\game\objects\items\storage\firstaid.dm" -#include "modular_citadel\code\game\objects\structures\tables_racks.dm" -#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" -#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" -#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm" -#include "modular_citadel\code\game\turfs\cit_turfs.dm" -#include "modular_citadel\code\modules\admin\chat_commands.dm" -#include "modular_citadel\code\modules\admin\holder2.dm" -#include "modular_citadel\code\modules\admin\secrets.dm" -#include "modular_citadel\code\modules\arousal\arousal.dm" -#include "modular_citadel\code\modules\arousal\organs\belly.dm" -#include "modular_citadel\code\modules\arousal\organs\breasts.dm" -#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" -#include "modular_citadel\code\modules\arousal\organs\genitals.dm" -#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" -#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" -#include "modular_citadel\code\modules\arousal\organs\penis.dm" -#include "modular_citadel\code\modules\arousal\organs\testicles.dm" -#include "modular_citadel\code\modules\arousal\organs\vagina.dm" -#include "modular_citadel\code\modules\arousal\organs\womb.dm" -#include "modular_citadel\code\modules\arousal\toys\dildos.dm" -#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm" -#include "modular_citadel\code\modules\cargo\console.dm" -#include "modular_citadel\code\modules\client\client_defines.dm" -#include "modular_citadel\code\modules\client\client_procs.dm" -#include "modular_citadel\code\modules\client\preferences.dm" -#include "modular_citadel\code\modules\client\preferences_savefile.dm" -#include "modular_citadel\code\modules\client\preferences_toggles.dm" -#include "modular_citadel\code\modules\client\loadout\__donator.dm" -#include "modular_citadel\code\modules\client\loadout\_medical.dm" -#include "modular_citadel\code\modules\client\loadout\_security.dm" -#include "modular_citadel\code\modules\client\loadout\_service.dm" -#include "modular_citadel\code\modules\client\loadout\backpack.dm" -#include "modular_citadel\code\modules\client\loadout\glasses.dm" -#include "modular_citadel\code\modules\client\loadout\gloves.dm" -#include "modular_citadel\code\modules\client\loadout\hands.dm" -#include "modular_citadel\code\modules\client\loadout\head.dm" -#include "modular_citadel\code\modules\client\loadout\loadout.dm" -#include "modular_citadel\code\modules\client\loadout\mask.dm" -#include "modular_citadel\code\modules\client\loadout\neck.dm" -#include "modular_citadel\code\modules\client\loadout\shoes.dm" -#include "modular_citadel\code\modules\client\loadout\suit.dm" -#include "modular_citadel\code\modules\client\loadout\uniform.dm" -#include "modular_citadel\code\modules\client\verbs\who.dm" -#include "modular_citadel\code\modules\clothing\clothing.dm" -#include "modular_citadel\code\modules\clothing\neck.dm" -#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" -#include "modular_citadel\code\modules\clothing\head\head.dm" -#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" -#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm" -#include "modular_citadel\code\modules\clothing\suits\suits.dm" -#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" -#include "modular_citadel\code\modules\clothing\under\trek_under.dm" -#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" -#include "modular_citadel\code\modules\clothing\under\under.dm" -#include "modular_citadel\code\modules\crafting\recipes.dm" -#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" -#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" -#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" -#include "modular_citadel\code\modules\events\blob.dm" -#include "modular_citadel\code\modules\events\wizard\magicarp.dm" -#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" -#include "modular_citadel\code\modules\mentor\follow.dm" -#include "modular_citadel\code\modules\mentor\mentor.dm" -#include "modular_citadel\code\modules\mentor\mentor_memo.dm" -#include "modular_citadel\code\modules\mentor\mentor_verbs.dm" -#include "modular_citadel\code\modules\mentor\mentorhelp.dm" -#include "modular_citadel\code\modules\mentor\mentorpm.dm" -#include "modular_citadel\code\modules\mentor\mentorsay.dm" -#include "modular_citadel\code\modules\mining\mining_ruins.dm" -#include "modular_citadel\code\modules\mob\cit_emotes.dm" -#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm" -#include "modular_citadel\code\modules\mob\living\damage_procs.dm" -#include "modular_citadel\code\modules\mob\living\living.dm" -#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" -#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" -#include "modular_citadel\code\modules\mob\living\carbon\life.dm" -#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm" -#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" -#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" -#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm" -#include "modular_citadel\code\modules\power\lighting.dm" -#include "modular_citadel\code\modules\projectiles\gun.dm" -#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" -#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" -#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm" -#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm" -#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" -#include "modular_citadel\code\modules\projectiles\guns\toys.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" -#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" -#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" -#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" -#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" -#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" -#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" -#include "modular_citadel\code\modules\reagents\objects\clothes.dm" -#include "modular_citadel\code\modules\reagents\objects\items.dm" -#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" -#include "modular_citadel\code\modules\recycling\disposal\bin.dm" -#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" -#include "modular_citadel\code\modules\research\designs\machine_designs.dm" -#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" -#include "modular_citadel\code\modules\research\techweb\_techweb.dm" -#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm" -#include "modular_citadel\code\modules\vehicles\secway.dm" -#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" -#include "modular_citadel\code\modules\vore\persistence.dm" -#include "modular_citadel\code\modules\vore\trycatch_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" -#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" -#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" -#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" -#include "modular_citadel\code\modules\vore\eating\living_vr.dm" -#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" -#include "modular_citadel\code\modules\vore\eating\voreitems.dm" -#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" -#include "modular_citadel\interface\skin.dmf" -#include "yogstation\code\modules\power\energyharvester.dm" -// END_INCLUDE + +// DM Environment file for tgstation.dme. +// All manual changes should be made outside the BEGIN_ and END_ blocks. +// New source code should be placed in .dm files: choose File/New --> Code File. +// BEGIN_INTERNALS +// END_INTERNALS + +// BEGIN_FILE_DIR +#define FILE_DIR . +// END_FILE_DIR + +// BEGIN_PREFERENCES +#define DEBUG +// END_PREFERENCES + +// BEGIN_INCLUDE +#include "_maps\_basemap.dm" +#include "_maps\layeniastation.dm" +#include "_maps\map_files\generic\CentCom.dmm" +#include "code\_compile_options.dm" +#include "code\world.dm" +#include "code\__DEFINES\_globals.dm" +#include "code\__DEFINES\_protect.dm" +#include "code\__DEFINES\_tick.dm" +#include "code\__DEFINES\access.dm" +#include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\antagonists.dm" +#include "code\__DEFINES\atmospherics.dm" +#include "code\__DEFINES\atom_hud.dm" +#include "code\__DEFINES\bsql.config.dm" +#include "code\__DEFINES\bsql.dm" +#include "code\__DEFINES\callbacks.dm" +#include "code\__DEFINES\cargo.dm" +#include "code\__DEFINES\cinematics.dm" +#include "code\__DEFINES\citadel_defines.dm" +#include "code\__DEFINES\cleaning.dm" +#include "code\__DEFINES\clockcult.dm" +#include "code\__DEFINES\colors.dm" +#include "code\__DEFINES\combat.dm" +#include "code\__DEFINES\components.dm" +#include "code\__DEFINES\configuration.dm" +#include "code\__DEFINES\construction.dm" +#include "code\__DEFINES\contracts.dm" +#include "code\__DEFINES\cult.dm" +#include "code\__DEFINES\diseases.dm" +#include "code\__DEFINES\DNA.dm" +#include "code\__DEFINES\events.dm" +#include "code\__DEFINES\exports.dm" +#include "code\__DEFINES\flags.dm" +#include "code\__DEFINES\food.dm" +#include "code\__DEFINES\footsteps.dm" +#include "code\__DEFINES\hud.dm" +#include "code\__DEFINES\integrated_electronics.dm" +#include "code\__DEFINES\interaction_flags.dm" +#include "code\__DEFINES\inventory.dm" +#include "code\__DEFINES\is_helpers.dm" +#include "code\__DEFINES\jobs.dm" +#include "code\__DEFINES\language.dm" +#include "code\__DEFINES\layers.dm" +#include "code\__DEFINES\lighting.dm" +#include "code\__DEFINES\logging.dm" +#include "code\__DEFINES\machines.dm" +#include "code\__DEFINES\maps.dm" +#include "code\__DEFINES\maths.dm" +#include "code\__DEFINES\MC.dm" +#include "code\__DEFINES\mecha.dm" +#include "code\__DEFINES\medal.dm" +#include "code\__DEFINES\melee.dm" +#include "code\__DEFINES\menu.dm" +#include "code\__DEFINES\misc.dm" +#include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\monkeys.dm" +#include "code\__DEFINES\move_force.dm" +#include "code\__DEFINES\movement.dm" +#include "code\__DEFINES\movespeed_modification.dm" +#include "code\__DEFINES\nanites.dm" +#include "code\__DEFINES\networks.dm" +#include "code\__DEFINES\obj_flags.dm" +#include "code\__DEFINES\pinpointers.dm" +#include "code\__DEFINES\pipe_construction.dm" +#include "code\__DEFINES\pool.dm" +#include "code\__DEFINES\preferences.dm" +#include "code\__DEFINES\procpath.dm" +#include "code\__DEFINES\profile.dm" +#include "code\__DEFINES\qdel.dm" +#include "code\__DEFINES\quirks.dm" +#include "code\__DEFINES\radiation.dm" +#include "code\__DEFINES\radio.dm" +#include "code\__DEFINES\reactions.dm" +#include "code\__DEFINES\reagents.dm" +#include "code\__DEFINES\reagents_specific_heat.dm" +#include "code\__DEFINES\research.dm" +#include "code\__DEFINES\robots.dm" +#include "code\__DEFINES\role_preferences.dm" +#include "code\__DEFINES\rust_g.config.dm" +#include "code\__DEFINES\rust_g.dm" +#include "code\__DEFINES\say.dm" +#include "code\__DEFINES\shuttles.dm" +#include "code\__DEFINES\sight.dm" +#include "code\__DEFINES\sound.dm" +#include "code\__DEFINES\spaceman_dmm.dm" +#include "code\__DEFINES\stat.dm" +#include "code\__DEFINES\stat_tracking.dm" +#include "code\__DEFINES\status_effects.dm" +#include "code\__DEFINES\subsystems.dm" +#include "code\__DEFINES\tgs.config.dm" +#include "code\__DEFINES\tgs.dm" +#include "code\__DEFINES\tgui.dm" +#include "code\__DEFINES\time.dm" +#include "code\__DEFINES\tools.dm" +#include "code\__DEFINES\traits.dm" +#include "code\__DEFINES\turf_flags.dm" +#include "code\__DEFINES\typeids.dm" +#include "code\__DEFINES\vehicles.dm" +#include "code\__DEFINES\voreconstants.dm" +#include "code\__DEFINES\vv.dm" +#include "code\__DEFINES\wall_dents.dm" +#include "code\__DEFINES\wires.dm" +#include "code\__DEFINES\dcs\signals.dm" +#include "code\__HELPERS\_cit_helpers.dm" +#include "code\__HELPERS\_lists.dm" +#include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\_string_lists.dm" +#include "code\__HELPERS\areas.dm" +#include "code\__HELPERS\AStar.dm" +#include "code\__HELPERS\cmp.dm" +#include "code\__HELPERS\dates.dm" +#include "code\__HELPERS\dna.dm" +#include "code\__HELPERS\files.dm" +#include "code\__HELPERS\game.dm" +#include "code\__HELPERS\global_lists.dm" +#include "code\__HELPERS\heap.dm" +#include "code\__HELPERS\icon_smoothing.dm" +#include "code\__HELPERS\icons.dm" +#include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\matrices.dm" +#include "code\__HELPERS\mobs.dm" +#include "code\__HELPERS\mouse_control.dm" +#include "code\__HELPERS\names.dm" +#include "code\__HELPERS\priority_announce.dm" +#include "code\__HELPERS\pronouns.dm" +#include "code\__HELPERS\qdel.dm" +#include "code\__HELPERS\radiation.dm" +#include "code\__HELPERS\radio.dm" +#include "code\__HELPERS\reagents.dm" +#include "code\__HELPERS\roundend.dm" +#include "code\__HELPERS\sanitize_values.dm" +#include "code\__HELPERS\shell.dm" +#include "code\__HELPERS\stat_tracking.dm" +#include "code\__HELPERS\text.dm" +#include "code\__HELPERS\text_vr.dm" +#include "code\__HELPERS\time.dm" +#include "code\__HELPERS\type2type.dm" +#include "code\__HELPERS\type2type_vr.dm" +#include "code\__HELPERS\typelists.dm" +#include "code\__HELPERS\unsorted.dm" +#include "code\__HELPERS\verbs.dm" +#include "code\__HELPERS\view.dm" +#include "code\__HELPERS\sorts\__main.dm" +#include "code\__HELPERS\sorts\InsertSort.dm" +#include "code\__HELPERS\sorts\MergeSort.dm" +#include "code\__HELPERS\sorts\TimSort.dm" +#include "code\_globalvars\bitfields.dm" +#include "code\_globalvars\configuration.dm" +#include "code\_globalvars\game_modes.dm" +#include "code\_globalvars\genetics.dm" +#include "code\_globalvars\logging.dm" +#include "code\_globalvars\misc.dm" +#include "code\_globalvars\regexes.dm" +#include "code\_globalvars\lists\flavor_misc.dm" +#include "code\_globalvars\lists\maintenance_loot.dm" +#include "code\_globalvars\lists\mapping.dm" +#include "code\_globalvars\lists\medals.dm" +#include "code\_globalvars\lists\mobs.dm" +#include "code\_globalvars\lists\names.dm" +#include "code\_globalvars\lists\objects.dm" +#include "code\_globalvars\lists\poll_ignore.dm" +#include "code\_globalvars\lists\typecache.dm" +#include "code\_globalvars\lists\vending.dm" +#include "code\_js\byjax.dm" +#include "code\_js\menus.dm" +#include "code\_onclick\adjacent.dm" +#include "code\_onclick\ai.dm" +#include "code\_onclick\click.dm" +#include "code\_onclick\cyborg.dm" +#include "code\_onclick\drag_drop.dm" +#include "code\_onclick\item_attack.dm" +#include "code\_onclick\observer.dm" +#include "code\_onclick\other_mobs.dm" +#include "code\_onclick\overmind.dm" +#include "code\_onclick\telekinesis.dm" +#include "code\_onclick\hud\_defines.dm" +#include "code\_onclick\hud\action_button.dm" +#include "code\_onclick\hud\ai.dm" +#include "code\_onclick\hud\alert.dm" +#include "code\_onclick\hud\alien.dm" +#include "code\_onclick\hud\alien_larva.dm" +#include "code\_onclick\hud\blob_overmind.dm" +#include "code\_onclick\hud\blobbernauthud.dm" +#include "code\_onclick\hud\constructs.dm" +#include "code\_onclick\hud\credits.dm" +#include "code\_onclick\hud\devil.dm" +#include "code\_onclick\hud\drones.dm" +#include "code\_onclick\hud\fullscreen.dm" +#include "code\_onclick\hud\generic_dextrous.dm" +#include "code\_onclick\hud\ghost.dm" +#include "code\_onclick\hud\guardian.dm" +#include "code\_onclick\hud\hud.dm" +#include "code\_onclick\hud\human.dm" +#include "code\_onclick\hud\monkey.dm" +#include "code\_onclick\hud\movable_screen_objects.dm" +#include "code\_onclick\hud\parallax.dm" +#include "code\_onclick\hud\picture_in_picture.dm" +#include "code\_onclick\hud\plane_master.dm" +#include "code\_onclick\hud\radial.dm" +#include "code\_onclick\hud\radial_persistent.dm" +#include "code\_onclick\hud\revenanthud.dm" +#include "code\_onclick\hud\robot.dm" +#include "code\_onclick\hud\screen_objects.dm" +#include "code\_onclick\hud\swarmer.dm" +#include "code\controllers\admin.dm" +#include "code\controllers\configuration_citadel.dm" +#include "code\controllers\controller.dm" +#include "code\controllers\failsafe.dm" +#include "code\controllers\globals.dm" +#include "code\controllers\hooks.dm" +#include "code\controllers\master.dm" +#include "code\controllers\subsystem.dm" +#include "code\controllers\configuration\config_entry.dm" +#include "code\controllers\configuration\configuration.dm" +#include "code\controllers\configuration\entries\comms.dm" +#include "code\controllers\configuration\entries\dbconfig.dm" +#include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\subsystem\acid.dm" +#include "code\controllers\subsystem\adjacent_air.dm" +#include "code\controllers\subsystem\air.dm" +#include "code\controllers\subsystem\air_turfs.dm" +#include "code\controllers\subsystem\assets.dm" +#include "code\controllers\subsystem\atoms.dm" +#include "code\controllers\subsystem\augury.dm" +#include "code\controllers\subsystem\autotransfer.dm" +#include "code\controllers\subsystem\blackbox.dm" +#include "code\controllers\subsystem\chat.dm" +#include "code\controllers\subsystem\communications.dm" +#include "code\controllers\subsystem\dbcore.dm" +#include "code\controllers\subsystem\dcs.dm" +#include "code\controllers\subsystem\disease.dm" +#include "code\controllers\subsystem\events.dm" +#include "code\controllers\subsystem\fire_burning.dm" +#include "code\controllers\subsystem\garbage.dm" +#include "code\controllers\subsystem\icon_smooth.dm" +#include "code\controllers\subsystem\idlenpcpool.dm" +#include "code\controllers\subsystem\input.dm" +#include "code\controllers\subsystem\ipintel.dm" +#include "code\controllers\subsystem\item_spawning.dm" +#include "code\controllers\subsystem\job.dm" +#include "code\controllers\subsystem\jukeboxes.dm" +#include "code\controllers\subsystem\language.dm" +#include "code\controllers\subsystem\lighting.dm" +#include "code\controllers\subsystem\machines.dm" +#include "code\controllers\subsystem\mapping.dm" +#include "code\controllers\subsystem\medals.dm" +#include "code\controllers\subsystem\minor_mapping.dm" +#include "code\controllers\subsystem\mobs.dm" +#include "code\controllers\subsystem\moods.dm" +#include "code\controllers\subsystem\nightshift.dm" +#include "code\controllers\subsystem\npcpool.dm" +#include "code\controllers\subsystem\overlays.dm" +#include "code\controllers\subsystem\pai.dm" +#include "code\controllers\subsystem\parallax.dm" +#include "code\controllers\subsystem\pathfinder.dm" +#include "code\controllers\subsystem\persistence.dm" +#include "code\controllers\subsystem\ping.dm" +#include "code\controllers\subsystem\radiation.dm" +#include "code\controllers\subsystem\radio.dm" +#include "code\controllers\subsystem\research.dm" +#include "code\controllers\subsystem\server_maint.dm" +#include "code\controllers\subsystem\shuttle.dm" +#include "code\controllers\subsystem\spacedrift.dm" +#include "code\controllers\subsystem\statpanel.dm" +#include "code\controllers\subsystem\stickyban.dm" +#include "code\controllers\subsystem\sun.dm" +#include "code\controllers\subsystem\tgui.dm" +#include "code\controllers\subsystem\throwing.dm" +#include "code\controllers\subsystem\ticker.dm" +#include "code\controllers\subsystem\time_track.dm" +#include "code\controllers\subsystem\timer.dm" +#include "code\controllers\subsystem\title.dm" +#include "code\controllers\subsystem\traumas.dm" +#include "code\controllers\subsystem\vis_overlays.dm" +#include "code\controllers\subsystem\vore.dm" +#include "code\controllers\subsystem\vote.dm" +#include "code\controllers\subsystem\weather.dm" +#include "code\controllers\subsystem\processing\chemistry.dm" +#include "code\controllers\subsystem\processing\circuit.dm" +#include "code\controllers\subsystem\processing\fastprocess.dm" +#include "code\controllers\subsystem\processing\fields.dm" +#include "code\controllers\subsystem\processing\nanites.dm" +#include "code\controllers\subsystem\processing\networks.dm" +#include "code\controllers\subsystem\processing\obj.dm" +#include "code\controllers\subsystem\processing\processing.dm" +#include "code\controllers\subsystem\processing\projectiles.dm" +#include "code\controllers\subsystem\processing\quirks.dm" +#include "code\controllers\subsystem\processing\wet_floors.dm" +#include "code\datums\action.dm" +#include "code\datums\ai_laws.dm" +#include "code\datums\armor.dm" +#include "code\datums\beam.dm" +#include "code\datums\browser.dm" +#include "code\datums\callback.dm" +#include "code\datums\chatmessage.dm" +#include "code\datums\cinematic.dm" +#include "code\datums\dash_weapon.dm" +#include "code\datums\datacore.dm" +#include "code\datums\datum.dm" +#include "code\datums\datumvars.dm" +#include "code\datums\dna.dm" +#include "code\datums\dog_fashion.dm" +#include "code\datums\embedding_behavior.dm" +#include "code\datums\emotes.dm" +#include "code\datums\ert.dm" +#include "code\datums\explosion.dm" +#include "code\datums\forced_movement.dm" +#include "code\datums\holocall.dm" +#include "code\datums\http.dm" +#include "code\datums\hud.dm" +#include "code\datums\map_config.dm" +#include "code\datums\martial.dm" +#include "code\datums\mind.dm" +#include "code\datums\mutable_appearance.dm" +#include "code\datums\numbered_display.dm" +#include "code\datums\outfit.dm" +#include "code\datums\position_point_vector.dm" +#include "code\datums\profiling.dm" +#include "code\datums\progressbar.dm" +#include "code\datums\radiation_wave.dm" +#include "code\datums\recipe.dm" +#include "code\datums\ruins.dm" +#include "code\datums\saymode.dm" +#include "code\datums\shuttles.dm" +#include "code\datums\soullink.dm" +#include "code\datums\spawners_menu.dm" +#include "code\datums\verbs.dm" +#include "code\datums\weakrefs.dm" +#include "code\datums\world_topic.dm" +#include "code\datums\actions\beam_rifle.dm" +#include "code\datums\actions\ninja.dm" +#include "code\datums\brain_damage\brain_trauma.dm" +#include "code\datums\brain_damage\hypnosis.dm" +#include "code\datums\brain_damage\imaginary_friend.dm" +#include "code\datums\brain_damage\mild.dm" +#include "code\datums\brain_damage\phobia.dm" +#include "code\datums\brain_damage\severe.dm" +#include "code\datums\brain_damage\special.dm" +#include "code\datums\brain_damage\split_personality.dm" +#include "code\datums\components\_component.dm" +#include "code\datums\components\anti_magic.dm" +#include "code\datums\components\armor_plate.dm" +#include "code\datums\components\bouncy.dm" +#include "code\datums\components\butchering.dm" +#include "code\datums\components\caltrop.dm" +#include "code\datums\components\chasm.dm" +#include "code\datums\components\construction.dm" +#include "code\datums\components\decal.dm" +#include "code\datums\components\earprotection.dm" +#include "code\datums\components\edit_complainer.dm" +#include "code\datums\components\empprotection.dm" +#include "code\datums\components\footstep.dm" +#include "code\datums\components\forced_gravity.dm" +#include "code\datums\components\infective.dm" +#include "code\datums\components\jousting.dm" +#include "code\datums\components\knockoff.dm" +#include "code\datums\components\lockon_aiming.dm" +#include "code\datums\components\magnetic_catch.dm" +#include "code\datums\components\material_container.dm" +#include "code\datums\components\mirage_border.dm" +#include "code\datums\components\mood.dm" +#include "code\datums\components\nanites.dm" +#include "code\datums\components\ntnet_interface.dm" +#include "code\datums\components\orbiter.dm" +#include "code\datums\components\paintable.dm" +#include "code\datums\components\rad_insulation.dm" +#include "code\datums\components\radioactive.dm" +#include "code\datums\components\remote_materials.dm" +#include "code\datums\components\riding.dm" +#include "code\datums\components\rotation.dm" +#include "code\datums\components\signal_redirect.dm" +#include "code\datums\components\sizzle.dm" +#include "code\datums\components\slippery.dm" +#include "code\datums\components\spawner.dm" +#include "code\datums\components\spooky.dm" +#include "code\datums\components\squeak.dm" +#include "code\datums\components\stationloving.dm" +#include "code\datums\components\swarming.dm" +#include "code\datums\components\thermite.dm" +#include "code\datums\components\twitch_plays.dm" +#include "code\datums\components\uplink.dm" +#include "code\datums\components\wearertargeting.dm" +#include "code\datums\components\wet_floor.dm" +#include "code\datums\components\crafting\craft.dm" +#include "code\datums\components\crafting\guncrafting.dm" +#include "code\datums\components\crafting\recipes.dm" +#include "code\datums\components\crafting\recipes\recipes_clothing.dm" +#include "code\datums\components\crafting\recipes\recipes_misc.dm" +#include "code\datums\components\crafting\recipes\recipes_primal.dm" +#include "code\datums\components\crafting\recipes\recipes_robot.dm" +#include "code\datums\components\crafting\recipes\recipes_weapon_and_ammo.dm" +#include "code\datums\components\storage\storage.dm" +#include "code\datums\components\storage\concrete\_concrete.dm" +#include "code\datums\components\storage\concrete\bag_of_holding.dm" +#include "code\datums\components\storage\concrete\bluespace.dm" +#include "code\datums\components\storage\concrete\emergency.dm" +#include "code\datums\components\storage\concrete\implant.dm" +#include "code\datums\components\storage\concrete\pockets.dm" +#include "code\datums\components\storage\concrete\rped.dm" +#include "code\datums\components\storage\concrete\special.dm" +#include "code\datums\components\storage\concrete\stack.dm" +#include "code\datums\diseases\_disease.dm" +#include "code\datums\diseases\_MobProcs.dm" +#include "code\datums\diseases\anxiety.dm" +#include "code\datums\diseases\appendicitis.dm" +#include "code\datums\diseases\beesease.dm" +#include "code\datums\diseases\brainrot.dm" +#include "code\datums\diseases\cold.dm" +#include "code\datums\diseases\cold9.dm" +#include "code\datums\diseases\dna_spread.dm" +#include "code\datums\diseases\fake_gbs.dm" +#include "code\datums\diseases\flu.dm" +#include "code\datums\diseases\fluspanish.dm" +#include "code\datums\diseases\gbs.dm" +#include "code\datums\diseases\heart_failure.dm" +#include "code\datums\diseases\magnitis.dm" +#include "code\datums\diseases\parrotpossession.dm" +#include "code\datums\diseases\pierrot_throat.dm" +#include "code\datums\diseases\retrovirus.dm" +#include "code\datums\diseases\rhumba_beat.dm" +#include "code\datums\diseases\transformation.dm" +#include "code\datums\diseases\tuberculosis.dm" +#include "code\datums\diseases\wizarditis.dm" +#include "code\datums\diseases\advance\advance.dm" +#include "code\datums\diseases\advance\presets.dm" +#include "code\datums\diseases\advance\symptoms\beard.dm" +#include "code\datums\diseases\advance\symptoms\choking.dm" +#include "code\datums\diseases\advance\symptoms\confusion.dm" +#include "code\datums\diseases\advance\symptoms\cough.dm" +#include "code\datums\diseases\advance\symptoms\deafness.dm" +#include "code\datums\diseases\advance\symptoms\dizzy.dm" +#include "code\datums\diseases\advance\symptoms\fever.dm" +#include "code\datums\diseases\advance\symptoms\fire.dm" +#include "code\datums\diseases\advance\symptoms\flesh_eating.dm" +#include "code\datums\diseases\advance\symptoms\hallucigen.dm" +#include "code\datums\diseases\advance\symptoms\headache.dm" +#include "code\datums\diseases\advance\symptoms\heal.dm" +#include "code\datums\diseases\advance\symptoms\itching.dm" +#include "code\datums\diseases\advance\symptoms\nanites.dm" +#include "code\datums\diseases\advance\symptoms\narcolepsy.dm" +#include "code\datums\diseases\advance\symptoms\oxygen.dm" +#include "code\datums\diseases\advance\symptoms\sensory.dm" +#include "code\datums\diseases\advance\symptoms\shedding.dm" +#include "code\datums\diseases\advance\symptoms\shivering.dm" +#include "code\datums\diseases\advance\symptoms\skin.dm" +#include "code\datums\diseases\advance\symptoms\sneeze.dm" +#include "code\datums\diseases\advance\symptoms\species.dm" +#include "code\datums\diseases\advance\symptoms\symptoms.dm" +#include "code\datums\diseases\advance\symptoms\viral.dm" +#include "code\datums\diseases\advance\symptoms\vision.dm" +#include "code\datums\diseases\advance\symptoms\voice_change.dm" +#include "code\datums\diseases\advance\symptoms\vomit.dm" +#include "code\datums\diseases\advance\symptoms\weight.dm" +#include "code\datums\diseases\advance\symptoms\youth.dm" +#include "code\datums\elements\_element.dm" +#include "code\datums\elements\bed_tucking.dm" +#include "code\datums\elements\cleaning.dm" +#include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\flavor_text.dm" +#include "code\datums\elements\ghost_role_eligibility.dm" +#include "code\datums\elements\mob_holder.dm" +#include "code\datums\elements\swimming.dm" +#include "code\datums\elements\wuv.dm" +#include "code\datums\helper_datums\events.dm" +#include "code\datums\helper_datums\getrev.dm" +#include "code\datums\helper_datums\icon_snapshot.dm" +#include "code\datums\helper_datums\teleport.dm" +#include "code\datums\helper_datums\topic_input.dm" +#include "code\datums\looping_sounds\_looping_sound.dm" +#include "code\datums\looping_sounds\item_sounds.dm" +#include "code\datums\looping_sounds\machinery_sounds.dm" +#include "code\datums\looping_sounds\weather.dm" +#include "code\datums\martial\boxing.dm" +#include "code\datums\martial\cqc.dm" +#include "code\datums\martial\krav_maga.dm" +#include "code\datums\martial\mushpunch.dm" +#include "code\datums\martial\plasma_fist.dm" +#include "code\datums\martial\psychotic_brawl.dm" +#include "code\datums\martial\sleeping_carp.dm" +#include "code\datums\martial\wrestling.dm" +#include "code\datums\mood_events\beauty_events.dm" +#include "code\datums\mood_events\drink_events.dm" +#include "code\datums\mood_events\drug_events.dm" +#include "code\datums\mood_events\generic_negative_events.dm" +#include "code\datums\mood_events\generic_positive_events.dm" +#include "code\datums\mood_events\mood_event.dm" +#include "code\datums\mood_events\needs_events.dm" +#include "code\datums\mutations\_mutations.dm" +#include "code\datums\mutations\actions.dm" +#include "code\datums\mutations\antenna.dm" +#include "code\datums\mutations\body.dm" +#include "code\datums\mutations\chameleon.dm" +#include "code\datums\mutations\cold_resistance.dm" +#include "code\datums\mutations\combined.dm" +#include "code\datums\mutations\hulk.dm" +#include "code\datums\mutations\radioactive.dm" +#include "code\datums\mutations\sight.dm" +#include "code\datums\mutations\speech.dm" +#include "code\datums\mutations\telekinesis.dm" +#include "code\datums\ruins\lavaland.dm" +#include "code\datums\ruins\space.dm" +#include "code\datums\ruins\station.dm" +#include "code\datums\status_effects\buffs.dm" +#include "code\datums\status_effects\debuffs.dm" +#include "code\datums\status_effects\gas.dm" +#include "code\datums\status_effects\neutral.dm" +#include "code\datums\status_effects\status_effect.dm" +#include "code\datums\traits\_quirk.dm" +#include "code\datums\traits\good.dm" +#include "code\datums\traits\negative.dm" +#include "code\datums\traits\neutral.dm" +#include "code\datums\weather\weather.dm" +#include "code\datums\weather\weather_types\acid_rain.dm" +#include "code\datums\weather\weather_types\ash_storm.dm" +#include "code\datums\weather\weather_types\floor_is_lava.dm" +#include "code\datums\weather\weather_types\layenia.dm" +#include "code\datums\weather\weather_types\radiation_storm.dm" +#include "code\datums\weather\weather_types\snow_storm.dm" +#include "code\datums\wires\_wires.dm" +#include "code\datums\wires\airalarm.dm" +#include "code\datums\wires\airlock.dm" +#include "code\datums\wires\apc.dm" +#include "code\datums\wires\autolathe.dm" +#include "code\datums\wires\emitter.dm" +#include "code\datums\wires\explosive.dm" +#include "code\datums\wires\microwave.dm" +#include "code\datums\wires\mulebot.dm" +#include "code\datums\wires\particle_accelerator.dm" +#include "code\datums\wires\r_n_d.dm" +#include "code\datums\wires\radio.dm" +#include "code\datums\wires\robot.dm" +#include "code\datums\wires\suit_storage_unit.dm" +#include "code\datums\wires\syndicatebomb.dm" +#include "code\datums\wires\tesla_coil.dm" +#include "code\datums\wires\vending.dm" +#include "code\game\alternate_appearance.dm" +#include "code\game\atoms.dm" +#include "code\game\atoms_movable.dm" +#include "code\game\communications.dm" +#include "code\game\data_huds.dm" +#include "code\game\say.dm" +#include "code\game\shuttle_engines.dm" +#include "code\game\sound.dm" +#include "code\game\world.dm" +#include "code\game\area\ai_monitored.dm" +#include "code\game\area\areas.dm" +#include "code\game\area\Space_Station_13_areas.dm" +#include "code\game\area\areas\away_content.dm" +#include "code\game\area\areas\centcom.dm" +#include "code\game\area\areas\holodeck.dm" +#include "code\game\area\areas\layenia.dm" +#include "code\game\area\areas\mining.dm" +#include "code\game\area\areas\shuttles.dm" +#include "code\game\area\areas\ruins\_ruins.dm" +#include "code\game\area\areas\ruins\lavaland.dm" +#include "code\game\area\areas\ruins\space.dm" +#include "code\game\area\areas\ruins\templates.dm" +#include "code\game\gamemodes\events.dm" +#include "code\game\gamemodes\game_mode.dm" +#include "code\game\gamemodes\objective.dm" +#include "code\game\gamemodes\objective_items.dm" +#include "code\game\gamemodes\bloodsucker\bloodsucker.dm" +#include "code\game\gamemodes\bloodsucker\hunter.dm" +#include "code\game\gamemodes\brother\traitor_bro.dm" +#include "code\game\gamemodes\changeling\changeling.dm" +#include "code\game\gamemodes\changeling\traitor_chan.dm" +#include "code\game\gamemodes\clock_cult\clock_cult.dm" +#include "code\game\gamemodes\clown_ops\bananium_bomb.dm" +#include "code\game\gamemodes\clown_ops\clown_ops.dm" +#include "code\game\gamemodes\clown_ops\clown_weapons.dm" +#include "code\game\gamemodes\cult\cult.dm" +#include "code\game\gamemodes\devil\devil_game_mode.dm" +#include "code\game\gamemodes\devil\game_mode.dm" +#include "code\game\gamemodes\devil\objectives.dm" +#include "code\game\gamemodes\devil\devil agent\devil_agent.dm" +#include "code\game\gamemodes\dynamic\dynamic.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_events.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" +#include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" +#include "code\game\gamemodes\extended\extended.dm" +#include "code\game\gamemodes\meteor\meteor.dm" +#include "code\game\gamemodes\meteor\meteors.dm" +#include "code\game\gamemodes\monkey\monkey.dm" +#include "code\game\gamemodes\nuclear\nuclear.dm" +#include "code\game\gamemodes\overthrow\objective.dm" +#include "code\game\gamemodes\overthrow\overthrow.dm" +#include "code\game\gamemodes\revolution\revolution.dm" +#include "code\game\gamemodes\sandbox\airlock_maker.dm" +#include "code\game\gamemodes\sandbox\h_sandbox.dm" +#include "code\game\gamemodes\sandbox\sandbox.dm" +#include "code\game\gamemodes\traitor\double_agents.dm" +#include "code\game\gamemodes\traitor\traitor.dm" +#include "code\game\gamemodes\wizard\wizard.dm" +#include "code\game\machinery\_machinery.dm" +#include "code\game\machinery\ai_slipper.dm" +#include "code\game\machinery\airlock_control.dm" +#include "code\game\machinery\announcement_system.dm" +#include "code\game\machinery\aug_manipulator.dm" +#include "code\game\machinery\autolathe.dm" +#include "code\game\machinery\bank_machine.dm" +#include "code\game\machinery\Beacon.dm" +#include "code\game\machinery\bloodbankgen.dm" +#include "code\game\machinery\buttons.dm" +#include "code\game\machinery\cell_charger.dm" +#include "code\game\machinery\cloning.dm" +#include "code\game\machinery\constructable_frame.dm" +#include "code\game\machinery\dance_machine.dm" +#include "code\game\machinery\defibrillator_mount.dm" +#include "code\game\machinery\deployable.dm" +#include "code\game\machinery\dish_drive.dm" +#include "code\game\machinery\dna_scanner.dm" +#include "code\game\machinery\doppler_array.dm" +#include "code\game\machinery\droneDispenser.dm" +#include "code\game\machinery\exp_cloner.dm" +#include "code\game\machinery\firealarm.dm" +#include "code\game\machinery\flasher.dm" +#include "code\game\machinery\gulag_item_reclaimer.dm" +#include "code\game\machinery\gulag_teleporter.dm" +#include "code\game\machinery\harvester.dm" +#include "code\game\machinery\hologram.dm" +#include "code\game\machinery\igniter.dm" +#include "code\game\machinery\iv_drip.dm" +#include "code\game\machinery\launch_pad.dm" +#include "code\game\machinery\lightswitch.dm" +#include "code\game\machinery\limbgrower.dm" +#include "code\game\machinery\magnet.dm" +#include "code\game\machinery\mass_driver.dm" +#include "code\game\machinery\navbeacon.dm" +#include "code\game\machinery\newscaster.dm" +#include "code\game\machinery\PDApainter.dm" +#include "code\game\machinery\posi_alert.dm" +#include "code\game\machinery\quantum_pad.dm" +#include "code\game\machinery\recharger.dm" +#include "code\game\machinery\rechargestation.dm" +#include "code\game\machinery\recycler.dm" +#include "code\game\machinery\requests_console.dm" +#include "code\game\machinery\shieldgen.dm" +#include "code\game\machinery\Sleeper.dm" +#include "code\game\machinery\slotmachine.dm" +#include "code\game\machinery\spaceheater.dm" +#include "code\game\machinery\stasis.dm" +#include "code\game\machinery\status_display.dm" +#include "code\game\machinery\suit_storage_unit.dm" +#include "code\game\machinery\syndicatebeacon.dm" +#include "code\game\machinery\syndicatebomb.dm" +#include "code\game\machinery\teleporter.dm" +#include "code\game\machinery\transformer.dm" +#include "code\game\machinery\washing_machine.dm" +#include "code\game\machinery\wishgranter.dm" +#include "code\game\machinery\camera\camera.dm" +#include "code\game\machinery\camera\camera_assembly.dm" +#include "code\game\machinery\camera\motion.dm" +#include "code\game\machinery\camera\presets.dm" +#include "code\game\machinery\camera\tracking.dm" +#include "code\game\machinery\computer\_computer.dm" +#include "code\game\machinery\computer\aifixer.dm" +#include "code\game\machinery\computer\apc_control.dm" +#include "code\game\machinery\computer\arcade.dm" +#include "code\game\machinery\computer\atmos_alert.dm" +#include "code\game\machinery\computer\atmos_control.dm" +#include "code\game\machinery\computer\buildandrepair.dm" +#include "code\game\machinery\computer\camera.dm" +#include "code\game\machinery\computer\camera_advanced.dm" +#include "code\game\machinery\computer\card.dm" +#include "code\game\machinery\computer\cloning.dm" +#include "code\game\machinery\computer\communications.dm" +#include "code\game\machinery\computer\crew.dm" +#include "code\game\machinery\computer\dna_console.dm" +#include "code\game\machinery\computer\launchpad_control.dm" +#include "code\game\machinery\computer\law.dm" +#include "code\game\machinery\computer\medical.dm" +#include "code\game\machinery\computer\Operating.dm" +#include "code\game\machinery\computer\pod.dm" +#include "code\game\machinery\computer\robot.dm" +#include "code\game\machinery\computer\security.dm" +#include "code\game\machinery\computer\station_alert.dm" +#include "code\game\machinery\computer\telecrystalconsoles.dm" +#include "code\game\machinery\computer\teleporter.dm" +#include "code\game\machinery\computer\arcade\battle.dm" +#include "code\game\machinery\computer\arcade\minesweeper.dm" +#include "code\game\machinery\computer\arcade\misc_arcade.dm" +#include "code\game\machinery\computer\arcade\orion_trail.dm" +#include "code\game\machinery\computer\prisoner\_prisoner.dm" +#include "code\game\machinery\computer\prisoner\gulag_teleporter.dm" +#include "code\game\machinery\computer\prisoner\management.dm" +#include "code\game\machinery\doors\airlock.dm" +#include "code\game\machinery\doors\airlock_electronics.dm" +#include "code\game\machinery\doors\airlock_types.dm" +#include "code\game\machinery\doors\alarmlock.dm" +#include "code\game\machinery\doors\brigdoors.dm" +#include "code\game\machinery\doors\checkForMultipleDoors.dm" +#include "code\game\machinery\doors\door.dm" +#include "code\game\machinery\doors\firedoor.dm" +#include "code\game\machinery\doors\passworddoor.dm" +#include "code\game\machinery\doors\poddoor.dm" +#include "code\game\machinery\doors\shutters.dm" +#include "code\game\machinery\doors\unpowered.dm" +#include "code\game\machinery\doors\windowdoor.dm" +#include "code\game\machinery\embedded_controller\access_controller.dm" +#include "code\game\machinery\embedded_controller\airlock_controller.dm" +#include "code\game\machinery\embedded_controller\embedded_controller_base.dm" +#include "code\game\machinery\embedded_controller\simple_vent_controller.dm" +#include "code\game\machinery\pipe\construction.dm" +#include "code\game\machinery\pipe\pipe_dispenser.dm" +#include "code\game\machinery\porta_turret\portable_turret.dm" +#include "code\game\machinery\porta_turret\portable_turret_construct.dm" +#include "code\game\machinery\porta_turret\portable_turret_cover.dm" +#include "code\game\machinery\poweredfans\fan_assembly.dm" +#include "code\game\machinery\poweredfans\poweredfans.dm" +#include "code\game\machinery\telecomms\broadcasting.dm" +#include "code\game\machinery\telecomms\machine_interactions.dm" +#include "code\game\machinery\telecomms\telecomunications.dm" +#include "code\game\machinery\telecomms\computers\logbrowser.dm" +#include "code\game\machinery\telecomms\computers\message.dm" +#include "code\game\machinery\telecomms\computers\telemonitor.dm" +#include "code\game\machinery\telecomms\machines\allinone.dm" +#include "code\game\machinery\telecomms\machines\broadcaster.dm" +#include "code\game\machinery\telecomms\machines\bus.dm" +#include "code\game\machinery\telecomms\machines\hub.dm" +#include "code\game\machinery\telecomms\machines\message_server.dm" +#include "code\game\machinery\telecomms\machines\processor.dm" +#include "code\game\machinery\telecomms\machines\receiver.dm" +#include "code\game\machinery\telecomms\machines\relay.dm" +#include "code\game\machinery\telecomms\machines\server.dm" +#include "code\game\mecha\mech_bay.dm" +#include "code\game\mecha\mech_fabricator.dm" +#include "code\game\mecha\mecha.dm" +#include "code\game\mecha\mecha_actions.dm" +#include "code\game\mecha\mecha_construction_paths.dm" +#include "code\game\mecha\mecha_control_console.dm" +#include "code\game\mecha\mecha_defense.dm" +#include "code\game\mecha\mecha_parts.dm" +#include "code\game\mecha\mecha_topic.dm" +#include "code\game\mecha\mecha_wreckage.dm" +#include "code\game\mecha\combat\combat.dm" +#include "code\game\mecha\combat\durand.dm" +#include "code\game\mecha\combat\gygax.dm" +#include "code\game\mecha\combat\honker.dm" +#include "code\game\mecha\combat\marauder.dm" +#include "code\game\mecha\combat\neovgre.dm" +#include "code\game\mecha\combat\phazon.dm" +#include "code\game\mecha\combat\reticence.dm" +#include "code\game\mecha\equipment\mecha_equipment.dm" +#include "code\game\mecha\equipment\tools\medical_tools.dm" +#include "code\game\mecha\equipment\tools\mining_tools.dm" +#include "code\game\mecha\equipment\tools\other_tools.dm" +#include "code\game\mecha\equipment\tools\work_tools.dm" +#include "code\game\mecha\equipment\weapons\weapons.dm" +#include "code\game\mecha\medical\medical.dm" +#include "code\game\mecha\medical\odysseus.dm" +#include "code\game\mecha\working\ripley.dm" +#include "code\game\mecha\working\working.dm" +#include "code\game\objects\buckling.dm" +#include "code\game\objects\empulse.dm" +#include "code\game\objects\items.dm" +#include "code\game\objects\obj_defense.dm" +#include "code\game\objects\objs.dm" +#include "code\game\objects\structures.dm" +#include "code\game\objects\effects\alien_acid.dm" +#include "code\game\objects\effects\anomalies.dm" +#include "code\game\objects\effects\blessing.dm" +#include "code\game\objects\effects\bump_teleporter.dm" +#include "code\game\objects\effects\contraband.dm" +#include "code\game\objects\effects\countdown.dm" +#include "code\game\objects\effects\effects.dm" +#include "code\game\objects\effects\forcefields.dm" +#include "code\game\objects\effects\glowshroom.dm" +#include "code\game\objects\effects\landmarks.dm" +#include "code\game\objects\effects\mines.dm" +#include "code\game\objects\effects\misc.dm" +#include "code\game\objects\effects\overlays.dm" +#include "code\game\objects\effects\portals.dm" +#include "code\game\objects\effects\proximity.dm" +#include "code\game\objects\effects\spiders.dm" +#include "code\game\objects\effects\step_triggers.dm" +#include "code\game\objects\effects\wanted_poster.dm" +#include "code\game\objects\effects\decals\cleanable.dm" +#include "code\game\objects\effects\decals\crayon.dm" +#include "code\game\objects\effects\decals\decal.dm" +#include "code\game\objects\effects\decals\misc.dm" +#include "code\game\objects\effects\decals\remains.dm" +#include "code\game\objects\effects\decals\cleanable\aliens.dm" +#include "code\game\objects\effects\decals\cleanable\gibs.dm" +#include "code\game\objects\effects\decals\cleanable\humans.dm" +#include "code\game\objects\effects\decals\cleanable\misc.dm" +#include "code\game\objects\effects\decals\cleanable\robots.dm" +#include "code\game\objects\effects\decals\turfdecal\dirt.dm" +#include "code\game\objects\effects\decals\turfdecal\markings.dm" +#include "code\game\objects\effects\decals\turfdecal\tilecoloring.dm" +#include "code\game\objects\effects\decals\turfdecal\weather.dm" +#include "code\game\objects\effects\effect_system\effect_system.dm" +#include "code\game\objects\effects\effect_system\effects_explosion.dm" +#include "code\game\objects\effects\effect_system\effects_foam.dm" +#include "code\game\objects\effects\effect_system\effects_other.dm" +#include "code\game\objects\effects\effect_system\effects_smoke.dm" +#include "code\game\objects\effects\effect_system\effects_sparks.dm" +#include "code\game\objects\effects\effect_system\effects_water.dm" +#include "code\game\objects\effects\spawners\bombspawner.dm" +#include "code\game\objects\effects\spawners\bundle.dm" +#include "code\game\objects\effects\spawners\gibspawner.dm" +#include "code\game\objects\effects\spawners\lootdrop.dm" +#include "code\game\objects\effects\spawners\structure.dm" +#include "code\game\objects\effects\spawners\traps.dm" +#include "code\game\objects\effects\spawners\vaultspawner.dm" +#include "code\game\objects\effects\spawners\xeno_egg_delivery.dm" +#include "code\game\objects\effects\temporary_visuals\clockcult.dm" +#include "code\game\objects\effects\temporary_visuals\cult.dm" +#include "code\game\objects\effects\temporary_visuals\miscellaneous.dm" +#include "code\game\objects\effects\temporary_visuals\temporary_visual.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\projectile_effects.dm" +#include "code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "code\game\objects\items\AI_modules.dm" +#include "code\game\objects\items\airlock_painter.dm" +#include "code\game\objects\items\apc_frame.dm" +#include "code\game\objects\items\blueprints.dm" +#include "code\game\objects\items\body_egg.dm" +#include "code\game\objects\items\bodybag.dm" +#include "code\game\objects\items\candle.dm" +#include "code\game\objects\items\cardboard_cutouts.dm" +#include "code\game\objects\items\cards_ids.dm" +#include "code\game\objects\items\charter.dm" +#include "code\game\objects\items\chromosome.dm" +#include "code\game\objects\items\chrono_eraser.dm" +#include "code\game\objects\items\cigs_lighters.dm" +#include "code\game\objects\items\clown_items.dm" +#include "code\game\objects\items\control_wand.dm" +#include "code\game\objects\items\cosmetics.dm" +#include "code\game\objects\items\courtroom.dm" +#include "code\game\objects\items\crayons.dm" +#include "code\game\objects\items\defib.dm" +#include "code\game\objects\items\dehy_carp.dm" +#include "code\game\objects\items\dice.dm" +#include "code\game\objects\items\dna_injector.dm" +#include "code\game\objects\items\documents.dm" +#include "code\game\objects\items\eightball.dm" +#include "code\game\objects\items\extinguisher.dm" +#include "code\game\objects\items\flamethrower.dm" +#include "code\game\objects\items\gift.dm" +#include "code\game\objects\items\granters.dm" +#include "code\game\objects\items\handcuffs.dm" +#include "code\game\objects\items\his_grace.dm" +#include "code\game\objects\items\holosign_creator.dm" +#include "code\game\objects\items\holy_weapons.dm" +#include "code\game\objects\items\hot_potato.dm" +#include "code\game\objects\items\inducer.dm" +#include "code\game\objects\items\kitchen.dm" +#include "code\game\objects\items\latexballoon.dm" +#include "code\game\objects\items\lorebooks.dm" +#include "code\game\objects\items\manuals.dm" +#include "code\game\objects\items\mesmetron.dm" +#include "code\game\objects\items\miscellaneous.dm" +#include "code\game\objects\items\mop.dm" +#include "code\game\objects\items\paint.dm" +#include "code\game\objects\items\paiwire.dm" +#include "code\game\objects\items\pet_carrier.dm" +#include "code\game\objects\items\pinpointer.dm" +#include "code\game\objects\items\plushes.dm" +#include "code\game\objects\items\pneumaticCannon.dm" +#include "code\game\objects\items\powerfist.dm" +#include "code\game\objects\items\RCD.dm" +#include "code\game\objects\items\RCL.dm" +#include "code\game\objects\items\religion.dm" +#include "code\game\objects\items\RPD.dm" +#include "code\game\objects\items\RSF.dm" +#include "code\game\objects\items\scrolls.dm" +#include "code\game\objects\items\sharpener.dm" +#include "code\game\objects\items\shields.dm" +#include "code\game\objects\items\shooting_range.dm" +#include "code\game\objects\items\signs.dm" +#include "code\game\objects\items\singularityhammer.dm" +#include "code\game\objects\items\stunbaton.dm" +#include "code\game\objects\items\taster.dm" +#include "code\game\objects\items\teleportation.dm" +#include "code\game\objects\items\teleprod.dm" +#include "code\game\objects\items\theft_tools.dm" +#include "code\game\objects\items\toys.dm" +#include "code\game\objects\items\trash.dm" +#include "code\game\objects\items\twohanded.dm" +#include "code\game\objects\items\vending_items.dm" +#include "code\game\objects\items\weaponry.dm" +#include "code\game\objects\items\circuitboards\circuitboard.dm" +#include "code\game\objects\items\circuitboards\computer_circuitboards.dm" +#include "code\game\objects\items\circuitboards\machine_circuitboards.dm" +#include "code\game\objects\items\devices\aicard.dm" +#include "code\game\objects\items\devices\anomaly_neutralizer.dm" +#include "code\game\objects\items\devices\beacon.dm" +#include "code\game\objects\items\devices\camera_bug.dm" +#include "code\game\objects\items\devices\chameleonproj.dm" +#include "code\game\objects\items\devices\compressionkit.dm" +#include "code\game\objects\items\devices\desynchronizer.dm" +#include "code\game\objects\items\devices\dogborg_sleeper.dm" +#include "code\game\objects\items\devices\doorCharge.dm" +#include "code\game\objects\items\devices\electroadaptive_pseudocircuit.dm" +#include "code\game\objects\items\devices\flashlight.dm" +#include "code\game\objects\items\devices\forcefieldprojector.dm" +#include "code\game\objects\items\devices\geiger_counter.dm" +#include "code\game\objects\items\devices\glue.dm" +#include "code\game\objects\items\devices\gps.dm" +#include "code\game\objects\items\devices\instruments.dm" +#include "code\game\objects\items\devices\laserpointer.dm" +#include "code\game\objects\items\devices\lightreplacer.dm" +#include "code\game\objects\items\devices\megaphone.dm" +#include "code\game\objects\items\devices\multitool.dm" +#include "code\game\objects\items\devices\paicard.dm" +#include "code\game\objects\items\devices\pipe_painter.dm" +#include "code\game\objects\items\devices\powersink.dm" +#include "code\game\objects\items\devices\pressureplates.dm" +#include "code\game\objects\items\devices\quantum_keycard.dm" +#include "code\game\objects\items\devices\reverse_bear_trap.dm" +#include "code\game\objects\items\devices\scanners.dm" +#include "code\game\objects\items\devices\sensor_device.dm" +#include "code\game\objects\items\devices\taperecorder.dm" +#include "code\game\objects\items\devices\traitordevices.dm" +#include "code\game\objects\items\devices\transfer_valve.dm" +#include "code\game\objects\items\devices\PDA\cart.dm" +#include "code\game\objects\items\devices\PDA\PDA.dm" +#include "code\game\objects\items\devices\PDA\PDA_types.dm" +#include "code\game\objects\items\devices\PDA\radio.dm" +#include "code\game\objects\items\devices\PDA\virus_cart.dm" +#include "code\game\objects\items\devices\radio\electropack.dm" +#include "code\game\objects\items\devices\radio\encryptionkey.dm" +#include "code\game\objects\items\devices\radio\headset.dm" +#include "code\game\objects\items\devices\radio\intercom.dm" +#include "code\game\objects\items\devices\radio\radio.dm" +#include "code\game\objects\items\grenades\antigravity.dm" +#include "code\game\objects\items\grenades\chem_grenade.dm" +#include "code\game\objects\items\grenades\clusterbuster.dm" +#include "code\game\objects\items\grenades\emgrenade.dm" +#include "code\game\objects\items\grenades\flashbang.dm" +#include "code\game\objects\items\grenades\ghettobomb.dm" +#include "code\game\objects\items\grenades\grenade.dm" +#include "code\game\objects\items\grenades\plastic.dm" +#include "code\game\objects\items\grenades\smokebomb.dm" +#include "code\game\objects\items\grenades\spawnergrenade.dm" +#include "code\game\objects\items\grenades\syndieminibomb.dm" +#include "code\game\objects\items\implants\implant.dm" +#include "code\game\objects\items\implants\implant_abductor.dm" +#include "code\game\objects\items\implants\implant_chem.dm" +#include "code\game\objects\items\implants\implant_clown.dm" +#include "code\game\objects\items\implants\implant_CQC.dm" +#include "code\game\objects\items\implants\implant_exile.dm" +#include "code\game\objects\items\implants\implant_explosive.dm" +#include "code\game\objects\items\implants\implant_freedom.dm" +#include "code\game\objects\items\implants\implant_krav_maga.dm" +#include "code\game\objects\items\implants\implant_mindshield.dm" +#include "code\game\objects\items\implants\implant_misc.dm" +#include "code\game\objects\items\implants\implant_mushpunch.dm" +#include "code\game\objects\items\implants\implant_plasmafist.dm" +#include "code\game\objects\items\implants\implant_psychobrawl.dm" +#include "code\game\objects\items\implants\implant_radio.dm" +#include "code\game\objects\items\implants\implant_slave.dm" +#include "code\game\objects\items\implants\implant_sleepingcarp.dm" +#include "code\game\objects\items\implants\implant_spell.dm" +#include "code\game\objects\items\implants\implant_stealth.dm" +#include "code\game\objects\items\implants\implant_storage.dm" +#include "code\game\objects\items\implants\implant_track.dm" +#include "code\game\objects\items\implants\implant_uplink.dm" +#include "code\game\objects\items\implants\implant_wrestling.dm" +#include "code\game\objects\items\implants\implantcase.dm" +#include "code\game\objects\items\implants\implantchair.dm" +#include "code\game\objects\items\implants\implanter.dm" +#include "code\game\objects\items\implants\implantpad.dm" +#include "code\game\objects\items\melee\energy.dm" +#include "code\game\objects\items\melee\misc.dm" +#include "code\game\objects\items\melee\transforming.dm" +#include "code\game\objects\items\robot\ai_upgrades.dm" +#include "code\game\objects\items\robot\robot_items.dm" +#include "code\game\objects\items\robot\robot_parts.dm" +#include "code\game\objects\items\robot\robot_upgrades.dm" +#include "code\game\objects\items\stacks\bscrystal.dm" +#include "code\game\objects\items\stacks\cash.dm" +#include "code\game\objects\items\stacks\medical.dm" +#include "code\game\objects\items\stacks\rods.dm" +#include "code\game\objects\items\stacks\stack.dm" +#include "code\game\objects\items\stacks\telecrystal.dm" +#include "code\game\objects\items\stacks\wrap.dm" +#include "code\game\objects\items\stacks\sheets\glass.dm" +#include "code\game\objects\items\stacks\sheets\leather.dm" +#include "code\game\objects\items\stacks\sheets\light.dm" +#include "code\game\objects\items\stacks\sheets\mineral.dm" +#include "code\game\objects\items\stacks\sheets\sheet_types.dm" +#include "code\game\objects\items\stacks\sheets\sheets.dm" +#include "code\game\objects\items\stacks\tiles\light.dm" +#include "code\game\objects\items\stacks\tiles\tile_mineral.dm" +#include "code\game\objects\items\stacks\tiles\tile_reskinning.dm" +#include "code\game\objects\items\stacks\tiles\tile_types.dm" +#include "code\game\objects\items\storage\backpack.dm" +#include "code\game\objects\items\storage\bags.dm" +#include "code\game\objects\items\storage\belt.dm" +#include "code\game\objects\items\storage\book.dm" +#include "code\game\objects\items\storage\boxes.dm" +#include "code\game\objects\items\storage\briefcase.dm" +#include "code\game\objects\items\storage\dakis.dm" +#include "code\game\objects\items\storage\fancy.dm" +#include "code\game\objects\items\storage\firstaid.dm" +#include "code\game\objects\items\storage\lockbox.dm" +#include "code\game\objects\items\storage\secure.dm" +#include "code\game\objects\items\storage\storage.dm" +#include "code\game\objects\items\storage\toolbox.dm" +#include "code\game\objects\items\storage\uplink_kits.dm" +#include "code\game\objects\items\storage\wallets.dm" +#include "code\game\objects\items\tanks\jetpack.dm" +#include "code\game\objects\items\tanks\tank_types.dm" +#include "code\game\objects\items\tanks\tanks.dm" +#include "code\game\objects\items\tanks\watertank.dm" +#include "code\game\objects\items\tools\crowbar.dm" +#include "code\game\objects\items\tools\screwdriver.dm" +#include "code\game\objects\items\tools\weldingtool.dm" +#include "code\game\objects\items\tools\wirecutters.dm" +#include "code\game\objects\items\tools\wrench.dm" +#include "code\game\objects\structures\ai_core.dm" +#include "code\game\objects\structures\aliens.dm" +#include "code\game\objects\structures\artstuff.dm" +#include "code\game\objects\structures\barsigns.dm" +#include "code\game\objects\structures\bedsheet_bin.dm" +#include "code\game\objects\structures\destructible_structures.dm" +#include "code\game\objects\structures\displaycase.dm" +#include "code\game\objects\structures\divine.dm" +#include "code\game\objects\structures\door_assembly.dm" +#include "code\game\objects\structures\door_assembly_types.dm" +#include "code\game\objects\structures\dresser.dm" +#include "code\game\objects\structures\electricchair.dm" +#include "code\game\objects\structures\extinguisher.dm" +#include "code\game\objects\structures\false_walls.dm" +#include "code\game\objects\structures\fence.dm" +#include "code\game\objects\structures\fireaxe.dm" +#include "code\game\objects\structures\fireplace.dm" +#include "code\game\objects\structures\flora.dm" +#include "code\game\objects\structures\fluff.dm" +#include "code\game\objects\structures\ghost_role_spawners.dm" +#include "code\game\objects\structures\girders.dm" +#include "code\game\objects\structures\grille.dm" +#include "code\game\objects\structures\guillotine.dm" +#include "code\game\objects\structures\guncase.dm" +#include "code\game\objects\structures\headpike.dm" +#include "code\game\objects\structures\hivebot.dm" +#include "code\game\objects\structures\holosign.dm" +#include "code\game\objects\structures\janicart.dm" +#include "code\game\objects\structures\kitchen_spike.dm" +#include "code\game\objects\structures\ladders.dm" +#include "code\game\objects\structures\lattice.dm" +#include "code\game\objects\structures\life_candle.dm" +#include "code\game\objects\structures\loom.dm" +#include "code\game\objects\structures\manned_turret.dm" +#include "code\game\objects\structures\medkit.dm" +#include "code\game\objects\structures\memorial.dm" +#include "code\game\objects\structures\mineral_doors.dm" +#include "code\game\objects\structures\mirror.dm" +#include "code\game\objects\structures\mop_bucket.dm" +#include "code\game\objects\structures\morgue.dm" +#include "code\game\objects\structures\musician.dm" +#include "code\game\objects\structures\noticeboard.dm" +#include "code\game\objects\structures\petrified_statue.dm" +#include "code\game\objects\structures\plasticflaps.dm" +#include "code\game\objects\structures\reflector.dm" +#include "code\game\objects\structures\safe.dm" +#include "code\game\objects\structures\showcase.dm" +#include "code\game\objects\structures\spawner.dm" +#include "code\game\objects\structures\spirit_board.dm" +#include "code\game\objects\structures\stairs.dm" +#include "code\game\objects\structures\statues.dm" +#include "code\game\objects\structures\table_frames.dm" +#include "code\game\objects\structures\tables_racks.dm" +#include "code\game\objects\structures\tank_dispenser.dm" +#include "code\game\objects\structures\target_stake.dm" +#include "code\game\objects\structures\traps.dm" +#include "code\game\objects\structures\trash_piles.dm" +#include "code\game\objects\structures\watercloset.dm" +#include "code\game\objects\structures\windoor_assembly.dm" +#include "code\game\objects\structures\window.dm" +#include "code\game\objects\structures\beds_chairs\alien_nest.dm" +#include "code\game\objects\structures\beds_chairs\bed.dm" +#include "code\game\objects\structures\beds_chairs\chair.dm" +#include "code\game\objects\structures\crates_lockers\closets.dm" +#include "code\game\objects\structures\crates_lockers\crates.dm" +#include "code\game\objects\structures\crates_lockers\closets\bodybag.dm" +#include "code\game\objects\structures\crates_lockers\closets\cardboardbox.dm" +#include "code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "code\game\objects\structures\crates_lockers\closets\gimmick.dm" +#include "code\game\objects\structures\crates_lockers\closets\job_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\l3closet.dm" +#include "code\game\objects\structures\crates_lockers\closets\syndicate.dm" +#include "code\game\objects\structures\crates_lockers\closets\utility_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\bar.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\cargo.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\engineering.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\freezer.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\hydroponics.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\medical.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\misc.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\personal.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\psychology.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\scientist.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\secure_closets.dm" +#include "code\game\objects\structures\crates_lockers\closets\secure\security.dm" +#include "code\game\objects\structures\crates_lockers\crates\bins.dm" +#include "code\game\objects\structures\crates_lockers\crates\critter.dm" +#include "code\game\objects\structures\crates_lockers\crates\large.dm" +#include "code\game\objects\structures\crates_lockers\crates\secure.dm" +#include "code\game\objects\structures\crates_lockers\crates\wooden.dm" +#include "code\game\objects\structures\lavaland\necropolis_tendril.dm" +#include "code\game\objects\structures\signs\_signs.dm" +#include "code\game\objects\structures\signs\signs_departments.dm" +#include "code\game\objects\structures\signs\signs_maps.dm" +#include "code\game\objects\structures\signs\signs_plaques.dm" +#include "code\game\objects\structures\signs\signs_warning.dm" +#include "code\game\objects\structures\transit_tubes\station.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_construction.dm" +#include "code\game\objects\structures\transit_tubes\transit_tube_pod.dm" +#include "code\game\turfs\baseturf_skipover.dm" +#include "code\game\turfs\change_turf.dm" +#include "code\game\turfs\closed.dm" +#include "code\game\turfs\open.dm" +#include "code\game\turfs\turf.dm" +#include "code\game\turfs\openspace\openspace.dm" +#include "code\game\turfs\simulated\chasm.dm" +#include "code\game\turfs\simulated\dirtystation.dm" +#include "code\game\turfs\simulated\floor.dm" +#include "code\game\turfs\simulated\lava.dm" +#include "code\game\turfs\simulated\minerals.dm" +#include "code\game\turfs\simulated\reebe_void.dm" +#include "code\game\turfs\simulated\river.dm" +#include "code\game\turfs\simulated\walls.dm" +#include "code\game\turfs\simulated\water.dm" +#include "code\game\turfs\simulated\floor\fancy_floor.dm" +#include "code\game\turfs\simulated\floor\light_floor.dm" +#include "code\game\turfs\simulated\floor\mineral_floor.dm" +#include "code\game\turfs\simulated\floor\misc_floor.dm" +#include "code\game\turfs\simulated\floor\plasteel_floor.dm" +#include "code\game\turfs\simulated\floor\plating.dm" +#include "code\game\turfs\simulated\floor\reinf_floor.dm" +#include "code\game\turfs\simulated\floor\plating\asteroid.dm" +#include "code\game\turfs\simulated\floor\plating\dirt.dm" +#include "code\game\turfs\simulated\floor\plating\misc_plating.dm" +#include "code\game\turfs\simulated\wall\mineral_walls.dm" +#include "code\game\turfs\simulated\wall\misc_walls.dm" +#include "code\game\turfs\simulated\wall\reinf_walls.dm" +#include "code\game\turfs\space\space.dm" +#include "code\game\turfs\space\transit.dm" +#include "code\modules\admin\admin.dm" +#include "code\modules\admin\admin_investigate.dm" +#include "code\modules\admin\admin_ranks.dm" +#include "code\modules\admin\admin_verbs.dm" +#include "code\modules\admin\adminmenu.dm" +#include "code\modules\admin\antag_panel.dm" +#include "code\modules\admin\banjob.dm" +#include "code\modules\admin\chat_commands.dm" +#include "code\modules\admin\check_antagonists.dm" +#include "code\modules\admin\create_mob.dm" +#include "code\modules\admin\create_object.dm" +#include "code\modules\admin\create_poll.dm" +#include "code\modules\admin\create_turf.dm" +#include "code\modules\admin\fun_balloon.dm" +#include "code\modules\admin\holder2.dm" +#include "code\modules\admin\ipintel.dm" +#include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\NewBan.dm" +#include "code\modules\admin\permissionedit.dm" +#include "code\modules\admin\player_panel.dm" +#include "code\modules\admin\secrets.dm" +#include "code\modules\admin\sound_emitter.dm" +#include "code\modules\admin\sql_message_system.dm" +#include "code\modules\admin\stickyban.dm" +#include "code\modules\admin\topic.dm" +#include "code\modules\admin\whitelist.dm" +#include "code\modules\admin\DB_ban\functions.dm" +#include "code\modules\admin\verbs\adminhelp.dm" +#include "code\modules\admin\verbs\adminjump.dm" +#include "code\modules\admin\verbs\adminpm.dm" +#include "code\modules\admin\verbs\adminsay.dm" +#include "code\modules\admin\verbs\ak47s.dm" +#include "code\modules\admin\verbs\atmosdebug.dm" +#include "code\modules\admin\verbs\bluespacearty.dm" +#include "code\modules\admin\verbs\borgpanel.dm" +#include "code\modules\admin\verbs\BrokenInhands.dm" +#include "code\modules\admin\verbs\cinematic.dm" +#include "code\modules\admin\verbs\deadsay.dm" +#include "code\modules\admin\verbs\debug.dm" +#include "code\modules\admin\verbs\diagnostics.dm" +#include "code\modules\admin\verbs\dice.dm" +#include "code\modules\admin\verbs\fps.dm" +#include "code\modules\admin\verbs\getlogs.dm" +#include "code\modules\admin\verbs\individual_logging.dm" +#include "code\modules\admin\verbs\machine_upgrade.dm" +#include "code\modules\admin\verbs\manipulate_organs.dm" +#include "code\modules\admin\verbs\map_template_loadverb.dm" +#include "code\modules\admin\verbs\mapping.dm" +#include "code\modules\admin\verbs\maprotation.dm" +#include "code\modules\admin\verbs\massmodvar.dm" +#include "code\modules\admin\verbs\modifyvariables.dm" +#include "code\modules\admin\verbs\one_click_antag.dm" +#include "code\modules\admin\verbs\onlyone.dm" +#include "code\modules\admin\verbs\panicbunker.dm" +#include "code\modules\admin\verbs\playsound.dm" +#include "code\modules\admin\verbs\possess.dm" +#include "code\modules\admin\verbs\pray.dm" +#include "code\modules\admin\verbs\randomverbs.dm" +#include "code\modules\admin\verbs\reestablish_db_connection.dm" +#include "code\modules\admin\verbs\spawnobjasmob.dm" +#include "code\modules\admin\verbs\tripAI.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_parser.dm" +#include "code\modules\admin\verbs\SDQL2\SDQL_2_wrappers.dm" +#include "code\modules\admin\view_variables\debug_variables.dm" +#include "code\modules\antagonists\_common\antag_datum.dm" +#include "code\modules\antagonists\_common\antag_helpers.dm" +#include "code\modules\antagonists\_common\antag_hud.dm" +#include "code\modules\antagonists\_common\antag_spawner.dm" +#include "code\modules\antagonists\_common\antag_team.dm" +#include "code\modules\antagonists\abductor\abductor.dm" +#include "code\modules\antagonists\abductor\abductee\abductee_objectives.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_gear.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_outfits.dm" +#include "code\modules\antagonists\abductor\equipment\abduction_surgery.dm" +#include "code\modules\antagonists\abductor\equipment\gland.dm" +#include "code\modules\antagonists\abductor\machinery\camera.dm" +#include "code\modules\antagonists\abductor\machinery\console.dm" +#include "code\modules\antagonists\abductor\machinery\dispenser.dm" +#include "code\modules\antagonists\abductor\machinery\experiment.dm" +#include "code\modules\antagonists\abductor\machinery\pad.dm" +#include "code\modules\antagonists\blob\blob.dm" +#include "code\modules\antagonists\blob\blob\blob_report.dm" +#include "code\modules\antagonists\blob\blob\overmind.dm" +#include "code\modules\antagonists\blob\blob\powers.dm" +#include "code\modules\antagonists\blob\blob\theblob.dm" +#include "code\modules\antagonists\blob\blob\blobs\blob_mobs.dm" +#include "code\modules\antagonists\blob\blob\blobs\core.dm" +#include "code\modules\antagonists\blob\blob\blobs\factory.dm" +#include "code\modules\antagonists\blob\blob\blobs\node.dm" +#include "code\modules\antagonists\blob\blob\blobs\resource.dm" +#include "code\modules\antagonists\blob\blob\blobs\shield.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_flaws.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_integration.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_life.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_objectives.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_powers.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_sunlight.dm" +#include "code\modules\antagonists\bloodsucker\bloodsucker_ui.dm" +#include "code\modules\antagonists\bloodsucker\datum_bloodsucker.dm" +#include "code\modules\antagonists\bloodsucker\datum_hunter.dm" +#include "code\modules\antagonists\bloodsucker\datum_vassal.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_organs.dm" +#include "code\modules\antagonists\bloodsucker\items\bloodsucker_stake.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_coffin.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_crypt.dm" +#include "code\modules\antagonists\bloodsucker\objects\bloodsucker_lair.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_brawn.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_cloak.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_feed.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_fortitude.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_gohome.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_haste.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_lunge.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_masquerade.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_mesmerize.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_trespass.dm" +#include "code\modules\antagonists\bloodsucker\powers\bs_veil.dm" +#include "code\modules\antagonists\bloodsucker\powers\v_recuperate.dm" +#include "code\modules\antagonists\brainwashing\brainwashing.dm" +#include "code\modules\antagonists\brother\brother.dm" +#include "code\modules\antagonists\changeling\cellular_emporium.dm" +#include "code\modules\antagonists\changeling\changeling.dm" +#include "code\modules\antagonists\changeling\changeling_power.dm" +#include "code\modules\antagonists\changeling\powers\absorb.dm" +#include "code\modules\antagonists\changeling\powers\adrenaline.dm" +#include "code\modules\antagonists\changeling\powers\augmented_eyesight.dm" +#include "code\modules\antagonists\changeling\powers\biodegrade.dm" +#include "code\modules\antagonists\changeling\powers\chameleon_skin.dm" +#include "code\modules\antagonists\changeling\powers\digitalcamo.dm" +#include "code\modules\antagonists\changeling\powers\fakedeath.dm" +#include "code\modules\antagonists\changeling\powers\fleshmend.dm" +#include "code\modules\antagonists\changeling\powers\headcrab.dm" +#include "code\modules\antagonists\changeling\powers\hivemind.dm" +#include "code\modules\antagonists\changeling\powers\humanform.dm" +#include "code\modules\antagonists\changeling\powers\lesserform.dm" +#include "code\modules\antagonists\changeling\powers\linglink.dm" +#include "code\modules\antagonists\changeling\powers\mimic_voice.dm" +#include "code\modules\antagonists\changeling\powers\mutations.dm" +#include "code\modules\antagonists\changeling\powers\panacea.dm" +#include "code\modules\antagonists\changeling\powers\pheromone_receptors.dm" +#include "code\modules\antagonists\changeling\powers\regenerate.dm" +#include "code\modules\antagonists\changeling\powers\revive.dm" +#include "code\modules\antagonists\changeling\powers\shriek.dm" +#include "code\modules\antagonists\changeling\powers\spiders.dm" +#include "code\modules\antagonists\changeling\powers\strained_muscles.dm" +#include "code\modules\antagonists\changeling\powers\tiny_prick.dm" +#include "code\modules\antagonists\changeling\powers\transform.dm" +#include "code\modules\antagonists\clockcult\clock_effect.dm" +#include "code\modules\antagonists\clockcult\clock_item.dm" +#include "code\modules\antagonists\clockcult\clock_mobs.dm" +#include "code\modules\antagonists\clockcult\clock_scripture.dm" +#include "code\modules\antagonists\clockcult\clock_structure.dm" +#include "code\modules\antagonists\clockcult\clockcult.dm" +#include "code\modules\antagonists\clockcult\clock_effects\city_of_cogs_rift.dm" +#include "code\modules\antagonists\clockcult\clock_effects\clock_overlay.dm" +#include "code\modules\antagonists\clockcult\clock_effects\clock_sigils.dm" +#include "code\modules\antagonists\clockcult\clock_effects\general_markers.dm" +#include "code\modules\antagonists\clockcult\clock_effects\servant_blocker.dm" +#include "code\modules\antagonists\clockcult\clock_effects\spatial_gateway.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\clock_powerdrain.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\component_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\fabrication_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\hierophant_network.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\power_helpers.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\ratvarian_language.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\scripture_checks.dm" +#include "code\modules\antagonists\clockcult\clock_helpers\slab_abilities.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_components.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_armor.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_slab.dm" +#include "code\modules\antagonists\clockcult\clock_items\clockwork_weaponry.dm" +#include "code\modules\antagonists\clockcult\clock_items\construct_chassis.dm" +#include "code\modules\antagonists\clockcult\clock_items\integration_cog.dm" +#include "code\modules\antagonists\clockcult\clock_items\judicial_visor.dm" +#include "code\modules\antagonists\clockcult\clock_items\replica_fabricator.dm" +#include "code\modules\antagonists\clockcult\clock_items\soul_vessel.dm" +#include "code\modules\antagonists\clockcult\clock_items\wraith_spectacles.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\_call_weapon.dm" +#include "code\modules\antagonists\clockcult\clock_items\clock_weapons\ratvarian_spear.dm" +#include "code\modules\antagonists\clockcult\clock_mobs\_eminence.dm" +#include "code\modules\antagonists\clockcult\clock_mobs\clockwork_marauder.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_applications.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_cyborg.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_drivers.dm" +#include "code\modules\antagonists\clockcult\clock_scriptures\scripture_scripts.dm" +#include "code\modules\antagonists\clockcult\clock_structures\_trap_object.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ark_of_the_clockwork_justicar.dm" +#include "code\modules\antagonists\clockcult\clock_structures\clockwork_obelisk.dm" +#include "code\modules\antagonists\clockcult\clock_structures\eminence_spire.dm" +#include "code\modules\antagonists\clockcult\clock_structures\heralds_beacon.dm" +#include "code\modules\antagonists\clockcult\clock_structures\mania_motor.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ocular_warden.dm" +#include "code\modules\antagonists\clockcult\clock_structures\ratvar_the_clockwork_justicar.dm" +#include "code\modules\antagonists\clockcult\clock_structures\reflector.dm" +#include "code\modules\antagonists\clockcult\clock_structures\stargazer.dm" +#include "code\modules\antagonists\clockcult\clock_structures\taunting_trail.dm" +#include "code\modules\antagonists\clockcult\clock_structures\wall_gear.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\lever.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\pressure_sensor_mech.dm" +#include "code\modules\antagonists\clockcult\clock_structures\trap_triggers\repeater.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\brass_skewer.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\power_null.dm" +#include "code\modules\antagonists\clockcult\clock_structures\traps\steam_vent.dm" +#include "code\modules\antagonists\cult\blood_magic.dm" +#include "code\modules\antagonists\cult\cult.dm" +#include "code\modules\antagonists\cult\cult_comms.dm" +#include "code\modules\antagonists\cult\cult_items.dm" +#include "code\modules\antagonists\cult\cult_structures.dm" +#include "code\modules\antagonists\cult\ritual.dm" +#include "code\modules\antagonists\cult\rune_spawn_action.dm" +#include "code\modules\antagonists\cult\runes.dm" +#include "code\modules\antagonists\devil\devil.dm" +#include "code\modules\antagonists\devil\devil_helpers.dm" +#include "code\modules\antagonists\devil\imp\imp.dm" +#include "code\modules\antagonists\devil\sintouched\objectives.dm" +#include "code\modules\antagonists\devil\sintouched\sintouched.dm" +#include "code\modules\antagonists\devil\true_devil\_true_devil.dm" +#include "code\modules\antagonists\devil\true_devil\inventory.dm" +#include "code\modules\antagonists\disease\disease_abilities.dm" +#include "code\modules\antagonists\disease\disease_datum.dm" +#include "code\modules\antagonists\disease\disease_disease.dm" +#include "code\modules\antagonists\disease\disease_event.dm" +#include "code\modules\antagonists\disease\disease_mob.dm" +#include "code\modules\antagonists\ert\ert.dm" +#include "code\modules\antagonists\greentext\greentext.dm" +#include "code\modules\antagonists\greybois\greybois.dm" +#include "code\modules\antagonists\highlander\highlander.dm" +#include "code\modules\antagonists\monkey\monkey.dm" +#include "code\modules\antagonists\morph\morph.dm" +#include "code\modules\antagonists\morph\morph_antag.dm" +#include "code\modules\antagonists\nightmare\nightmare.dm" +#include "code\modules\antagonists\nightmare\nightmare_objectives.dm" +#include "code\modules\antagonists\ninja\ninja.dm" +#include "code\modules\antagonists\nukeop\clownop.dm" +#include "code\modules\antagonists\nukeop\nukeop.dm" +#include "code\modules\antagonists\nukeop\equipment\nuclear_challenge.dm" +#include "code\modules\antagonists\nukeop\equipment\nuclearbomb.dm" +#include "code\modules\antagonists\nukeop\equipment\pinpointer.dm" +#include "code\modules\antagonists\official\official.dm" +#include "code\modules\antagonists\overthrow\overthrow.dm" +#include "code\modules\antagonists\overthrow\overthrow_converter.dm" +#include "code\modules\antagonists\overthrow\overthrow_team.dm" +#include "code\modules\antagonists\pirate\pirate.dm" +#include "code\modules\antagonists\revenant\revenant.dm" +#include "code\modules\antagonists\revenant\revenant_abilities.dm" +#include "code\modules\antagonists\revenant\revenant_antag.dm" +#include "code\modules\antagonists\revenant\revenant_blight.dm" +#include "code\modules\antagonists\revenant\revenant_spawn_event.dm" +#include "code\modules\antagonists\revolution\revolution.dm" +#include "code\modules\antagonists\separatist\separatist.dm" +#include "code\modules\antagonists\slaughter\slaughter.dm" +#include "code\modules\antagonists\slaughter\slaughter_antag.dm" +#include "code\modules\antagonists\slaughter\slaughterevent.dm" +#include "code\modules\antagonists\survivalist\survivalist.dm" +#include "code\modules\antagonists\swarmer\swarmer.dm" +#include "code\modules\antagonists\swarmer\swarmer_event.dm" +#include "code\modules\antagonists\traitor\datum_traitor.dm" +#include "code\modules\antagonists\traitor\equipment\Malf_Modules.dm" +#include "code\modules\antagonists\traitor\IAA\internal_affairs.dm" +#include "code\modules\antagonists\valentines\heartbreaker.dm" +#include "code\modules\antagonists\valentines\valentine.dm" +#include "code\modules\antagonists\wishgranter\wishgranter.dm" +#include "code\modules\antagonists\wizard\wizard.dm" +#include "code\modules\antagonists\wizard\equipment\artefact.dm" +#include "code\modules\antagonists\wizard\equipment\soulstone.dm" +#include "code\modules\antagonists\wizard\equipment\spellbook.dm" +#include "code\modules\antagonists\xeno\xeno.dm" +#include "code\modules\assembly\assembly.dm" +#include "code\modules\assembly\bomb.dm" +#include "code\modules\assembly\doorcontrol.dm" +#include "code\modules\assembly\flash.dm" +#include "code\modules\assembly\health.dm" +#include "code\modules\assembly\helpers.dm" +#include "code\modules\assembly\holder.dm" +#include "code\modules\assembly\igniter.dm" +#include "code\modules\assembly\infrared.dm" +#include "code\modules\assembly\mousetrap.dm" +#include "code\modules\assembly\proximity.dm" +#include "code\modules\assembly\shock_kit.dm" +#include "code\modules\assembly\signaler.dm" +#include "code\modules\assembly\timer.dm" +#include "code\modules\assembly\voice.dm" +#include "code\modules\atmospherics\multiz.dm" +#include "code\modules\atmospherics\environmental\LINDA_fire.dm" +#include "code\modules\atmospherics\environmental\LINDA_system.dm" +#include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" +#include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" +#include "code\modules\atmospherics\gasmixtures\gas_types.dm" +#include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" +#include "code\modules\atmospherics\gasmixtures\reactions.dm" +#include "code\modules\atmospherics\machinery\airalarm.dm" +#include "code\modules\atmospherics\machinery\atmosmachinery.dm" +#include "code\modules\atmospherics\machinery\datum_pipeline.dm" +#include "code\modules\atmospherics\machinery\components\components_base.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\binary_devices.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\circulator.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\dp_vent_pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\passive_gate.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\pump.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\relief_valve.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\valve.dm" +#include "code\modules\atmospherics\machinery\components\binary_devices\volume_pump.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\filter.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\mixer.dm" +#include "code\modules\atmospherics\machinery\components\trinary_devices\trinary_devices.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\cryo.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\heat_exchanger.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\outlet_injector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\passive_vent.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\portables_connector.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\relief_valve.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\tank.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\thermomachine.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\unary_devices.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\vent_pump.dm" +#include "code\modules\atmospherics\machinery\components\unary_devices\vent_scrubber.dm" +#include "code\modules\atmospherics\machinery\other\meter.dm" +#include "code\modules\atmospherics\machinery\other\miner.dm" +#include "code\modules\atmospherics\machinery\pipes\bluespace.dm" +#include "code\modules\atmospherics\machinery\pipes\layermanifold.dm" +#include "code\modules\atmospherics\machinery\pipes\manifold.dm" +#include "code\modules\atmospherics\machinery\pipes\manifold4w.dm" +#include "code\modules\atmospherics\machinery\pipes\mapping.dm" +#include "code\modules\atmospherics\machinery\pipes\pipes.dm" +#include "code\modules\atmospherics\machinery\pipes\simple.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\he_pipes.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\junction.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\manifold4w.dm" +#include "code\modules\atmospherics\machinery\pipes\heat_exchange\simple.dm" +#include "code\modules\atmospherics\machinery\portable\canister.dm" +#include "code\modules\atmospherics\machinery\portable\portable_atmospherics.dm" +#include "code\modules\atmospherics\machinery\portable\pump.dm" +#include "code\modules\atmospherics\machinery\portable\scrubber.dm" +#include "code\modules\awaymissions\away_props.dm" +#include "code\modules\awaymissions\bluespaceartillery.dm" +#include "code\modules\awaymissions\capture_the_flag.dm" +#include "code\modules\awaymissions\corpse.dm" +#include "code\modules\awaymissions\exile.dm" +#include "code\modules\awaymissions\gateway.dm" +#include "code\modules\awaymissions\pamphlet.dm" +#include "code\modules\awaymissions\signpost.dm" +#include "code\modules\awaymissions\super_secret_room.dm" +#include "code\modules\awaymissions\zlevel.dm" +#include "code\modules\awaymissions\mission_code\Academy.dm" +#include "code\modules\awaymissions\mission_code\Cabin.dm" +#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\jungleresort.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" +#include "code\modules\awaymissions\mission_code\spacebattle.dm" +#include "code\modules\awaymissions\mission_code\stationCollision.dm" +#include "code\modules\awaymissions\mission_code\undergroundoutpost45.dm" +#include "code\modules\awaymissions\mission_code\wildwest.dm" +#include "code\modules\bsql\includes.dm" +#include "code\modules\buildmode\bm_mode.dm" +#include "code\modules\buildmode\buildmode.dm" +#include "code\modules\buildmode\buttons.dm" +#include "code\modules\buildmode\effects\line.dm" +#include "code\modules\buildmode\submodes\advanced.dm" +#include "code\modules\buildmode\submodes\area_edit.dm" +#include "code\modules\buildmode\submodes\basic.dm" +#include "code\modules\buildmode\submodes\boom.dm" +#include "code\modules\buildmode\submodes\copy.dm" +#include "code\modules\buildmode\submodes\fill.dm" +#include "code\modules\buildmode\submodes\mapgen.dm" +#include "code\modules\buildmode\submodes\throwing.dm" +#include "code\modules\buildmode\submodes\variable_edit.dm" +#include "code\modules\cargo\bounty.dm" +#include "code\modules\cargo\bounty_console.dm" +#include "code\modules\cargo\centcom_podlauncher.dm" +#include "code\modules\cargo\console.dm" +#include "code\modules\cargo\export_scanner.dm" +#include "code\modules\cargo\exports.dm" +#include "code\modules\cargo\expressconsole.dm" +#include "code\modules\cargo\gondolapod.dm" +#include "code\modules\cargo\order.dm" +#include "code\modules\cargo\packs.dm" +#include "code\modules\cargo\supplypod.dm" +#include "code\modules\cargo\supplypod_beacon.dm" +#include "code\modules\cargo\bounties\assistant.dm" +#include "code\modules\cargo\bounties\botany.dm" +#include "code\modules\cargo\bounties\chef.dm" +#include "code\modules\cargo\bounties\engineering.dm" +#include "code\modules\cargo\bounties\item.dm" +#include "code\modules\cargo\bounties\mech.dm" +#include "code\modules\cargo\bounties\medical.dm" +#include "code\modules\cargo\bounties\mining.dm" +#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\food_wine.dm" +#include "code\modules\cargo\exports\gear.dm" +#include "code\modules\cargo\exports\large_objects.dm" +#include "code\modules\cargo\exports\lewd.dm" +#include "code\modules\cargo\exports\manifest.dm" +#include "code\modules\cargo\exports\materials.dm" +#include "code\modules\cargo\exports\organs_robotics.dm" +#include "code\modules\cargo\exports\parts.dm" +#include "code\modules\cargo\exports\seeds.dm" +#include "code\modules\cargo\exports\sheets.dm" +#include "code\modules\cargo\exports\tools.dm" +#include "code\modules\cargo\exports\weapons.dm" +#include "code\modules\cargo\packs\armory.dm" +#include "code\modules\cargo\packs\costumes_toys.dm" +#include "code\modules\cargo\packs\emergency.dm" +#include "code\modules\cargo\packs\engine.dm" +#include "code\modules\cargo\packs\engineering.dm" +#include "code\modules\cargo\packs\livestock.dm" +#include "code\modules\cargo\packs\materials.dm" +#include "code\modules\cargo\packs\medical.dm" +#include "code\modules\cargo\packs\misc.dm" +#include "code\modules\cargo\packs\organic.dm" +#include "code\modules\cargo\packs\science.dm" +#include "code\modules\cargo\packs\security.dm" +#include "code\modules\cargo\packs\service.dm" +#include "code\modules\chatter\chatter.dm" +#include "code\modules\client\asset_cache.dm" +#include "code\modules\client\client_colour.dm" +#include "code\modules\client\client_defines.dm" +#include "code\modules\client\client_procs.dm" +#include "code\modules\client\darkmode.dm" +#include "code\modules\client\message.dm" +#include "code\modules\client\player_details.dm" +#include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_savefile.dm" +#include "code\modules\client\preferences_toggles.dm" +#include "code\modules\client\preferences_vr.dm" +#include "code\modules\client\verbs\aooc.dm" +#include "code\modules\client\verbs\etips.dm" +#include "code\modules\client\verbs\looc.dm" +#include "code\modules\client\verbs\ooc.dm" +#include "code\modules\client\verbs\ping.dm" +#include "code\modules\client\verbs\suicide.dm" +#include "code\modules\client\verbs\who.dm" +#include "code\modules\clothing\chameleon.dm" +#include "code\modules\clothing\clothing.dm" +#include "code\modules\clothing\ears\_ears.dm" +#include "code\modules\clothing\glasses\_glasses.dm" +#include "code\modules\clothing\glasses\engine_goggles.dm" +#include "code\modules\clothing\glasses\hud.dm" +#include "code\modules\clothing\glasses\vg_glasses.dm" +#include "code\modules\clothing\gloves\_gloves.dm" +#include "code\modules\clothing\gloves\boxing.dm" +#include "code\modules\clothing\gloves\color.dm" +#include "code\modules\clothing\gloves\miscellaneous.dm" +#include "code\modules\clothing\gloves\ring.dm" +#include "code\modules\clothing\gloves\vg_gloves.dm" +#include "code\modules\clothing\head\_head.dm" +#include "code\modules\clothing\head\beanie.dm" +#include "code\modules\clothing\head\cit_hats.dm" +#include "code\modules\clothing\head\collectable.dm" +#include "code\modules\clothing\head\hardhat.dm" +#include "code\modules\clothing\head\helmet.dm" +#include "code\modules\clothing\head\jobs.dm" +#include "code\modules\clothing\head\misc.dm" +#include "code\modules\clothing\head\misc_special.dm" +#include "code\modules\clothing\head\soft_caps.dm" +#include "code\modules\clothing\head\vg_hats.dm" +#include "code\modules\clothing\masks\_masks.dm" +#include "code\modules\clothing\masks\boxing.dm" +#include "code\modules\clothing\masks\breath.dm" +#include "code\modules\clothing\masks\gasmask.dm" +#include "code\modules\clothing\masks\hailer.dm" +#include "code\modules\clothing\masks\miscellaneous.dm" +#include "code\modules\clothing\masks\vg_masks.dm" +#include "code\modules\clothing\neck\_neck.dm" +#include "code\modules\clothing\outfits\ert.dm" +#include "code\modules\clothing\outfits\event.dm" +#include "code\modules\clothing\outfits\plasmaman.dm" +#include "code\modules\clothing\outfits\standard.dm" +#include "code\modules\clothing\outfits\vr.dm" +#include "code\modules\clothing\outfits\vv_outfit.dm" +#include "code\modules\clothing\shoes\_shoes.dm" +#include "code\modules\clothing\shoes\bananashoes.dm" +#include "code\modules\clothing\shoes\colour.dm" +#include "code\modules\clothing\shoes\magboots.dm" +#include "code\modules\clothing\shoes\miscellaneous.dm" +#include "code\modules\clothing\shoes\taeclowndo.dm" +#include "code\modules\clothing\shoes\vg_shoes.dm" +#include "code\modules\clothing\spacesuits\_spacesuits.dm" +#include "code\modules\clothing\spacesuits\chronosuit.dm" +#include "code\modules\clothing\spacesuits\hardsuit.dm" +#include "code\modules\clothing\spacesuits\miscellaneous.dm" +#include "code\modules\clothing\spacesuits\plasmamen.dm" +#include "code\modules\clothing\spacesuits\syndi.dm" +#include "code\modules\clothing\spacesuits\vg_spess.dm" +#include "code\modules\clothing\suits\_suits.dm" +#include "code\modules\clothing\suits\armor.dm" +#include "code\modules\clothing\suits\bio.dm" +#include "code\modules\clothing\suits\cloaks.dm" +#include "code\modules\clothing\suits\jobs.dm" +#include "code\modules\clothing\suits\labcoat.dm" +#include "code\modules\clothing\suits\miscellaneous.dm" +#include "code\modules\clothing\suits\reactive_armour.dm" +#include "code\modules\clothing\suits\toggles.dm" +#include "code\modules\clothing\suits\utility.dm" +#include "code\modules\clothing\suits\vg_suits.dm" +#include "code\modules\clothing\suits\wiz_robe.dm" +#include "code\modules\clothing\under\_under.dm" +#include "code\modules\clothing\under\accessories.dm" +#include "code\modules\clothing\under\color.dm" +#include "code\modules\clothing\under\miscellaneous.dm" +#include "code\modules\clothing\under\pants.dm" +#include "code\modules\clothing\under\shorts.dm" +#include "code\modules\clothing\under\syndicate.dm" +#include "code\modules\clothing\under\trek.dm" +#include "code\modules\clothing\under\vg_under.dm" +#include "code\modules\clothing\under\jobs\civilian.dm" +#include "code\modules\clothing\under\jobs\engineering.dm" +#include "code\modules\clothing\under\jobs\medsci.dm" +#include "code\modules\clothing\under\jobs\security.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\civilian_service.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\engineering.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\medsci.dm" +#include "code\modules\clothing\under\jobs\Plasmaman\security.dm" +#include "code\modules\detectivework\detective_work.dm" +#include "code\modules\detectivework\evidence.dm" +#include "code\modules\detectivework\scanner.dm" +#include "code\modules\emoji\emoji_parse.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\events\_event.dm" +#include "code\modules\events\abductor.dm" +#include "code\modules\events\alien_infestation.dm" +#include "code\modules\events\anomaly.dm" +#include "code\modules\events\anomaly_bluespace.dm" +#include "code\modules\events\anomaly_flux.dm" +#include "code\modules\events\anomaly_grav.dm" +#include "code\modules\events\anomaly_pyro.dm" +#include "code\modules\events\anomaly_vortex.dm" +#include "code\modules\events\aurora_aquilae.dm" +#include "code\modules\events\aurora_caelus.dm" +#include "code\modules\events\blob.dm" +#include "code\modules\events\brand_intelligence.dm" +#include "code\modules\events\bureaucratic_error.dm" +#include "code\modules\events\camerafailure.dm" +#include "code\modules\events\carp_migration.dm" +#include "code\modules\events\carpteam.dm" +#include "code\modules\events\communications_blackout.dm" +#include "code\modules\events\devil.dm" +#include "code\modules\events\disease_outbreak.dm" +#include "code\modules\events\dust.dm" +#include "code\modules\events\electrical_storm.dm" +#include "code\modules\events\false_alarm.dm" +#include "code\modules\events\floorcluwne.dm" +#include "code\modules\events\ghost_role.dm" +#include "code\modules\events\grid_check.dm" +#include "code\modules\events\heart_attack.dm" +#include "code\modules\events\high_priority_bounty.dm" +#include "code\modules\events\immovable_rod.dm" +#include "code\modules\events\ion_storm.dm" +#include "code\modules\events\major_dust.dm" +#include "code\modules\events\mass_hallucination.dm" +#include "code\modules\events\meateor_wave.dm" +#include "code\modules\events\meteor_wave.dm" +#include "code\modules\events\mice_migration.dm" +#include "code\modules\events\nightmare.dm" +#include "code\modules\events\operative.dm" +#include "code\modules\events\pirates.dm" +#include "code\modules\events\portal_storm.dm" +#include "code\modules\events\prison_break.dm" +#include "code\modules\events\processor_overload.dm" +#include "code\modules\events\radiation_storm.dm" +#include "code\modules\events\sentience.dm" +#include "code\modules\events\shuttle_loan.dm" +#include "code\modules\events\spacevine.dm" +#include "code\modules\events\spider_infestation.dm" +#include "code\modules\events\spontaneous_appendicitis.dm" +#include "code\modules\events\vent_clog.dm" +#include "code\modules\events\wormholes.dm" +#include "code\modules\events\holiday\halloween.dm" +#include "code\modules\events\holiday\vday.dm" +#include "code\modules\events\holiday\xmas.dm" +#include "code\modules\events\wizard\aid.dm" +#include "code\modules\events\wizard\blobies.dm" +#include "code\modules\events\wizard\curseditems.dm" +#include "code\modules\events\wizard\departmentrevolt.dm" +#include "code\modules\events\wizard\fakeexplosion.dm" +#include "code\modules\events\wizard\ghost.dm" +#include "code\modules\events\wizard\greentext.dm" +#include "code\modules\events\wizard\imposter.dm" +#include "code\modules\events\wizard\invincible.dm" +#include "code\modules\events\wizard\lava.dm" +#include "code\modules\events\wizard\magicarp.dm" +#include "code\modules\events\wizard\petsplosion.dm" +#include "code\modules\events\wizard\race.dm" +#include "code\modules\events\wizard\rpgloot.dm" +#include "code\modules\events\wizard\shuffle.dm" +#include "code\modules\events\wizard\summons.dm" +#include "code\modules\fields\fields.dm" +#include "code\modules\fields\gravity.dm" +#include "code\modules\fields\peaceborg_dampener.dm" +#include "code\modules\fields\timestop.dm" +#include "code\modules\fields\turf_objects.dm" +#include "code\modules\flufftext\Dreaming.dm" +#include "code\modules\flufftext\Hallucination.dm" +#include "code\modules\food_and_drinks\autobottler.dm" +#include "code\modules\food_and_drinks\food.dm" +#include "code\modules\food_and_drinks\pizzabox.dm" +#include "code\modules\food_and_drinks\drinks\drinks.dm" +#include "code\modules\food_and_drinks\drinks\drinks\bottle.dm" +#include "code\modules\food_and_drinks\drinks\drinks\drinkingglass.dm" +#include "code\modules\food_and_drinks\food\condiment.dm" +#include "code\modules\food_and_drinks\food\customizables.dm" +#include "code\modules\food_and_drinks\food\snacks.dm" +#include "code\modules\food_and_drinks\food\snacks_bread.dm" +#include "code\modules\food_and_drinks\food\snacks_burgers.dm" +#include "code\modules\food_and_drinks\food\snacks_cake.dm" +#include "code\modules\food_and_drinks\food\snacks_egg.dm" +#include "code\modules\food_and_drinks\food\snacks_frozen.dm" +#include "code\modules\food_and_drinks\food\snacks_meat.dm" +#include "code\modules\food_and_drinks\food\snacks_other.dm" +#include "code\modules\food_and_drinks\food\snacks_pastry.dm" +#include "code\modules\food_and_drinks\food\snacks_pie.dm" +#include "code\modules\food_and_drinks\food\snacks_pizza.dm" +#include "code\modules\food_and_drinks\food\snacks_salad.dm" +#include "code\modules\food_and_drinks\food\snacks_sandwichtoast.dm" +#include "code\modules\food_and_drinks\food\snacks_soup.dm" +#include "code\modules\food_and_drinks\food\snacks_spaghetti.dm" +#include "code\modules\food_and_drinks\food\snacks_sushi.dm" +#include "code\modules\food_and_drinks\food\snacks_vend.dm" +#include "code\modules\food_and_drinks\food\snacks\dough.dm" +#include "code\modules\food_and_drinks\food\snacks\meat.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\deep_fryer.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\food_cart.dm" +#include "code\modules\food_and_drinks\kitchen_machinery\gibber.dm" +#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" +#include "code\modules\food_and_drinks\recipes\food_mixtures.dm" +#include "code\modules\food_and_drinks\recipes\processor_recipes.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_bread.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_burger.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_cake.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_egg.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_frozen.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_meat.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_misc.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pastry.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pie.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_pizza.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_salad.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sandwich.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_soup.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_spaghetti.dm" +#include "code\modules\food_and_drinks\recipes\tablecraft\recipes_sushi.dm" +#include "code\modules\games\cas.dm" +#include "code\modules\goonchat\browserOutput.dm" +#include "code\modules\holiday\easter.dm" +#include "code\modules\holiday\holidays.dm" +#include "code\modules\holiday\halloween\bartholomew.dm" +#include "code\modules\holiday\halloween\jacqueen.dm" +#include "code\modules\holodeck\area_copy.dm" +#include "code\modules\holodeck\computer.dm" +#include "code\modules\holodeck\holo_effect.dm" +#include "code\modules\holodeck\items.dm" +#include "code\modules\holodeck\mobs.dm" +#include "code\modules\holodeck\turfs.dm" +#include "code\modules\hydroponics\biogenerator.dm" +#include "code\modules\hydroponics\fermenting_barrel.dm" +#include "code\modules\hydroponics\gene_modder.dm" +#include "code\modules\hydroponics\grown.dm" +#include "code\modules\hydroponics\growninedible.dm" +#include "code\modules\hydroponics\hydroitemdefines.dm" +#include "code\modules\hydroponics\hydroponics.dm" +#include "code\modules\hydroponics\plant_genes.dm" +#include "code\modules\hydroponics\sample.dm" +#include "code\modules\hydroponics\seed_extractor.dm" +#include "code\modules\hydroponics\seeds.dm" +#include "code\modules\hydroponics\beekeeping\beebox.dm" +#include "code\modules\hydroponics\beekeeping\beekeeper_suit.dm" +#include "code\modules\hydroponics\beekeeping\honey_frame.dm" +#include "code\modules\hydroponics\beekeeping\honeycomb.dm" +#include "code\modules\hydroponics\grown\ambrosia.dm" +#include "code\modules\hydroponics\grown\apple.dm" +#include "code\modules\hydroponics\grown\banana.dm" +#include "code\modules\hydroponics\grown\beans.dm" +#include "code\modules\hydroponics\grown\berries.dm" +#include "code\modules\hydroponics\grown\cannabis.dm" +#include "code\modules\hydroponics\grown\cereals.dm" +#include "code\modules\hydroponics\grown\chili.dm" +#include "code\modules\hydroponics\grown\citrus.dm" +#include "code\modules\hydroponics\grown\cocoa_vanilla.dm" +#include "code\modules\hydroponics\grown\corn.dm" +#include "code\modules\hydroponics\grown\cotton.dm" +#include "code\modules\hydroponics\grown\eggplant.dm" +#include "code\modules\hydroponics\grown\flowers.dm" +#include "code\modules\hydroponics\grown\garlic.dm" +#include "code\modules\hydroponics\grown\grass_carpet.dm" +#include "code\modules\hydroponics\grown\kudzu.dm" +#include "code\modules\hydroponics\grown\melon.dm" +#include "code\modules\hydroponics\grown\misc.dm" +#include "code\modules\hydroponics\grown\mushrooms.dm" +#include "code\modules\hydroponics\grown\nettle.dm" +#include "code\modules\hydroponics\grown\onion.dm" +#include "code\modules\hydroponics\grown\peach.dm" +#include "code\modules\hydroponics\grown\peanuts.dm" +#include "code\modules\hydroponics\grown\peas.dm" +#include "code\modules\hydroponics\grown\pineapple.dm" +#include "code\modules\hydroponics\grown\potato.dm" +#include "code\modules\hydroponics\grown\pumpkin.dm" +#include "code\modules\hydroponics\grown\random.dm" +#include "code\modules\hydroponics\grown\replicapod.dm" +#include "code\modules\hydroponics\grown\root.dm" +#include "code\modules\hydroponics\grown\tea_coffee.dm" +#include "code\modules\hydroponics\grown\tobacco.dm" +#include "code\modules\hydroponics\grown\tomato.dm" +#include "code\modules\hydroponics\grown\towercap.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\core\analyzer.dm" +#include "code\modules\integrated_electronics\core\assemblies.dm" +#include "code\modules\integrated_electronics\core\debugger.dm" +#include "code\modules\integrated_electronics\core\detailer.dm" +#include "code\modules\integrated_electronics\core\helpers.dm" +#include "code\modules\integrated_electronics\core\integrated_circuit.dm" +#include "code\modules\integrated_electronics\core\pins.dm" +#include "code\modules\integrated_electronics\core\printer.dm" +#include "code\modules\integrated_electronics\core\saved_circuits.dm" +#include "code\modules\integrated_electronics\core\wirer.dm" +#include "code\modules\integrated_electronics\core\special_pins\boolean_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\char_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\color_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\dir_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\index_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\list_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\number_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\ref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\selfref_pin.dm" +#include "code\modules\integrated_electronics\core\special_pins\string_pin.dm" +#include "code\modules\integrated_electronics\passive\passive.dm" +#include "code\modules\integrated_electronics\passive\power.dm" +#include "code\modules\integrated_electronics\subtypes\access.dm" +#include "code\modules\integrated_electronics\subtypes\arithmetic.dm" +#include "code\modules\integrated_electronics\subtypes\atmospherics.dm" +#include "code\modules\integrated_electronics\subtypes\converters.dm" +#include "code\modules\integrated_electronics\subtypes\data_transfer.dm" +#include "code\modules\integrated_electronics\subtypes\input.dm" +#include "code\modules\integrated_electronics\subtypes\lists.dm" +#include "code\modules\integrated_electronics\subtypes\logic.dm" +#include "code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "code\modules\integrated_electronics\subtypes\memory.dm" +#include "code\modules\integrated_electronics\subtypes\output.dm" +#include "code\modules\integrated_electronics\subtypes\power.dm" +#include "code\modules\integrated_electronics\subtypes\reagents.dm" +#include "code\modules\integrated_electronics\subtypes\smart.dm" +#include "code\modules\integrated_electronics\subtypes\text.dm" +#include "code\modules\integrated_electronics\subtypes\time.dm" +#include "code\modules\integrated_electronics\subtypes\trig.dm" +#include "code\modules\integrated_electronics\subtypes\weaponized.dm" +#include "code\modules\jobs\access.dm" +#include "code\modules\jobs\job_exp.dm" +#include "code\modules\jobs\jobs.dm" +#include "code\modules\jobs\job_types\assistant.dm" +#include "code\modules\jobs\job_types\captain.dm" +#include "code\modules\jobs\job_types\cargo_service.dm" +#include "code\modules\jobs\job_types\civilian.dm" +#include "code\modules\jobs\job_types\civilian_chaplain.dm" +#include "code\modules\jobs\job_types\engineering.dm" +#include "code\modules\jobs\job_types\job.dm" +#include "code\modules\jobs\job_types\job_alt_titles.dm" +#include "code\modules\jobs\job_types\medical.dm" +#include "code\modules\jobs\job_types\science.dm" +#include "code\modules\jobs\job_types\security.dm" +#include "code\modules\jobs\job_types\silicon.dm" +#include "code\modules\jobs\map_changes\map_changes.dm" +#include "code\modules\keybindings\bindings_admin.dm" +#include "code\modules\keybindings\bindings_atom.dm" +#include "code\modules\keybindings\bindings_carbon.dm" +#include "code\modules\keybindings\bindings_client.dm" +#include "code\modules\keybindings\bindings_human.dm" +#include "code\modules\keybindings\bindings_living.dm" +#include "code\modules\keybindings\bindings_mob.dm" +#include "code\modules\keybindings\bindings_robot.dm" +#include "code\modules\keybindings\focus.dm" +#include "code\modules\keybindings\setup.dm" +#include "code\modules\language\aphasia.dm" +#include "code\modules\language\beachbum.dm" +#include "code\modules\language\codespeak.dm" +#include "code\modules\language\common.dm" +#include "code\modules\language\draconic.dm" +#include "code\modules\language\drone.dm" +#include "code\modules\language\language.dm" +#include "code\modules\language\language_holder.dm" +#include "code\modules\language\language_menu.dm" +#include "code\modules\language\machine.dm" +#include "code\modules\language\monkey.dm" +#include "code\modules\language\narsian.dm" +#include "code\modules\language\ratvarian.dm" +#include "code\modules\language\slime.dm" +#include "code\modules\language\spacerussian.dm" +#include "code\modules\language\swarmer.dm" +#include "code\modules\language\tajara.dm" +#include "code\modules\language\vampiric.dm" +#include "code\modules\language\xenocommon.dm" +#include "code\modules\library\lib_codex_gigas.dm" +#include "code\modules\library\lib_items.dm" +#include "code\modules\library\lib_machines.dm" +#include "code\modules\library\random_books.dm" +#include "code\modules\library\soapstone.dm" +#include "code\modules\lighting\lighting_area.dm" +#include "code\modules\lighting\lighting_atom.dm" +#include "code\modules\lighting\lighting_corner.dm" +#include "code\modules\lighting\lighting_object.dm" +#include "code\modules\lighting\lighting_setup.dm" +#include "code\modules\lighting\lighting_source.dm" +#include "code\modules\lighting\lighting_turf.dm" +#include "code\modules\mapping\dmm_suite.dm" +#include "code\modules\mapping\map_template.dm" +#include "code\modules\mapping\preloader.dm" +#include "code\modules\mapping\reader.dm" +#include "code\modules\mapping\ruins.dm" +#include "code\modules\mapping\verify.dm" +#include "code\modules\mapping\mapping_helpers\_mapping_helpers.dm" +#include "code\modules\mapping\mapping_helpers\baseturf.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\_network_builder.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\atmos_pipe.dm" +#include "code\modules\mapping\mapping_helpers\network_builder\power_cables.dm" +#include "code\modules\mapping\space_management\multiz_helpers.dm" +#include "code\modules\mapping\space_management\space_level.dm" +#include "code\modules\mapping\space_management\space_reservation.dm" +#include "code\modules\mapping\space_management\space_transition.dm" +#include "code\modules\mapping\space_management\traits.dm" +#include "code\modules\mapping\space_management\zlevel_manager.dm" +#include "code\modules\mining\abandoned_crates.dm" +#include "code\modules\mining\aux_base.dm" +#include "code\modules\mining\aux_base_camera.dm" +#include "code\modules\mining\fulton.dm" +#include "code\modules\mining\machine_processing.dm" +#include "code\modules\mining\machine_redemption.dm" +#include "code\modules\mining\machine_silo.dm" +#include "code\modules\mining\machine_stacking.dm" +#include "code\modules\mining\machine_unloading.dm" +#include "code\modules\mining\machine_vending.dm" +#include "code\modules\mining\mine_items.dm" +#include "code\modules\mining\minebot.dm" +#include "code\modules\mining\mint.dm" +#include "code\modules\mining\money_bag.dm" +#include "code\modules\mining\ores_coins.dm" +#include "code\modules\mining\satchel_ore_boxdm.dm" +#include "code\modules\mining\shelters.dm" +#include "code\modules\mining\equipment\explorer_gear.dm" +#include "code\modules\mining\equipment\goliath_hide.dm" +#include "code\modules\mining\equipment\kinetic_crusher.dm" +#include "code\modules\mining\equipment\lazarus_injector.dm" +#include "code\modules\mining\equipment\marker_beacons.dm" +#include "code\modules\mining\equipment\mineral_scanner.dm" +#include "code\modules\mining\equipment\mining_tools.dm" +#include "code\modules\mining\equipment\regenerative_core.dm" +#include "code\modules\mining\equipment\resonator.dm" +#include "code\modules\mining\equipment\survival_pod.dm" +#include "code\modules\mining\equipment\vendor_items.dm" +#include "code\modules\mining\equipment\wormhole_jaunter.dm" +#include "code\modules\mining\laborcamp\laborshuttle.dm" +#include "code\modules\mining\laborcamp\laborstacker.dm" +#include "code\modules\mining\lavaland\ash_flora.dm" +#include "code\modules\mining\lavaland\necropolis_chests.dm" +#include "code\modules\mining\lavaland\ruins\gym.dm" +#include "code\modules\mob\death.dm" +#include "code\modules\mob\emote.dm" +#include "code\modules\mob\inventory.dm" +#include "code\modules\mob\login.dm" +#include "code\modules\mob\logout.dm" +#include "code\modules\mob\mob.dm" +#include "code\modules\mob\mob_defines.dm" +#include "code\modules\mob\mob_helpers.dm" +#include "code\modules\mob\mob_movement.dm" +#include "code\modules\mob\mob_movespeed.dm" +#include "code\modules\mob\mob_transformation_simple.dm" +#include "code\modules\mob\say.dm" +#include "code\modules\mob\say_vr.dm" +#include "code\modules\mob\status_procs.dm" +#include "code\modules\mob\transform_procs.dm" +#include "code\modules\mob\typing_indicator.dm" +#include "code\modules\mob\update_icons.dm" +#include "code\modules\mob\camera\camera.dm" +#include "code\modules\mob\dead\dead.dm" +#include "code\modules\mob\dead\new_player\login.dm" +#include "code\modules\mob\dead\new_player\logout.dm" +#include "code\modules\mob\dead\new_player\new_player.dm" +#include "code\modules\mob\dead\new_player\poll.dm" +#include "code\modules\mob\dead\new_player\preferences_setup.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\_sprite_accessories.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\body_markings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\caps.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\ears.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\frills.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_face.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\hair_head.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\horns.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\legs.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\moth_fluff.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\moth_wings.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\pines.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\snouts.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\socks.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\tails.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\undershirt.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\underwear.dm" +#include "code\modules\mob\dead\new_player\sprite_accessories\wings.dm" +#include "code\modules\mob\dead\observer\login.dm" +#include "code\modules\mob\dead\observer\logout.dm" +#include "code\modules\mob\dead\observer\notificationprefs.dm" +#include "code\modules\mob\dead\observer\observer.dm" +#include "code\modules\mob\dead\observer\observer_movement.dm" +#include "code\modules\mob\dead\observer\say.dm" +#include "code\modules\mob\living\blood.dm" +#include "code\modules\mob\living\bloodcrawl.dm" +#include "code\modules\mob\living\damage_procs.dm" +#include "code\modules\mob\living\death.dm" +#include "code\modules\mob\living\emote.dm" +#include "code\modules\mob\living\life.dm" +#include "code\modules\mob\living\living.dm" +#include "code\modules\mob\living\living_defense.dm" +#include "code\modules\mob\living\living_defines.dm" +#include "code\modules\mob\living\living_movement.dm" +#include "code\modules\mob\living\login.dm" +#include "code\modules\mob\living\logout.dm" +#include "code\modules\mob\living\say.dm" +#include "code\modules\mob\living\status_procs.dm" +#include "code\modules\mob\living\taste.dm" +#include "code\modules\mob\living\ventcrawling.dm" +#include "code\modules\mob\living\brain\brain.dm" +#include "code\modules\mob\living\brain\brain_item.dm" +#include "code\modules\mob\living\brain\death.dm" +#include "code\modules\mob\living\brain\emote.dm" +#include "code\modules\mob\living\brain\life.dm" +#include "code\modules\mob\living\brain\MMI.dm" +#include "code\modules\mob\living\brain\posibrain.dm" +#include "code\modules\mob\living\brain\say.dm" +#include "code\modules\mob\living\brain\status_procs.dm" +#include "code\modules\mob\living\carbon\carbon.dm" +#include "code\modules\mob\living\carbon\carbon_defense.dm" +#include "code\modules\mob\living\carbon\carbon_defines.dm" +#include "code\modules\mob\living\carbon\carbon_movement.dm" +#include "code\modules\mob\living\carbon\damage_procs.dm" +#include "code\modules\mob\living\carbon\death.dm" +#include "code\modules\mob\living\carbon\emote.dm" +#include "code\modules\mob\living\carbon\examine.dm" +#include "code\modules\mob\living\carbon\give.dm" +#include "code\modules\mob\living\carbon\inventory.dm" +#include "code\modules\mob\living\carbon\life.dm" +#include "code\modules\mob\living\carbon\say.dm" +#include "code\modules\mob\living\carbon\status_procs.dm" +#include "code\modules\mob\living\carbon\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\alien.dm" +#include "code\modules\mob\living\carbon\alien\alien_defense.dm" +#include "code\modules\mob\living\carbon\alien\damage_procs.dm" +#include "code\modules\mob\living\carbon\alien\death.dm" +#include "code\modules\mob\living\carbon\alien\emote.dm" +#include "code\modules\mob\living\carbon\alien\life.dm" +#include "code\modules\mob\living\carbon\alien\login.dm" +#include "code\modules\mob\living\carbon\alien\logout.dm" +#include "code\modules\mob\living\carbon\alien\organs.dm" +#include "code\modules\mob\living\carbon\alien\say.dm" +#include "code\modules\mob\living\carbon\alien\screen.dm" +#include "code\modules\mob\living\carbon\alien\status_procs.dm" +#include "code\modules\mob\living\carbon\alien\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\alien_powers.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\death.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\humanoid_defense.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\inventory.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\life.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\queen.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\drone.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\hunter.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\praetorian.dm" +#include "code\modules\mob\living\carbon\alien\humanoid\caste\sentinel.dm" +#include "code\modules\mob\living\carbon\alien\larva\death.dm" +#include "code\modules\mob\living\carbon\alien\larva\inventory.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva.dm" +#include "code\modules\mob\living\carbon\alien\larva\larva_defense.dm" +#include "code\modules\mob\living\carbon\alien\larva\life.dm" +#include "code\modules\mob\living\carbon\alien\larva\powers.dm" +#include "code\modules\mob\living\carbon\alien\larva\update_icons.dm" +#include "code\modules\mob\living\carbon\alien\special\alien_embryo.dm" +#include "code\modules\mob\living\carbon\alien\special\facehugger.dm" +#include "code\modules\mob\living\carbon\human\damage_procs.dm" +#include "code\modules\mob\living\carbon\human\death.dm" +#include "code\modules\mob\living\carbon\human\dummy.dm" +#include "code\modules\mob\living\carbon\human\emote.dm" +#include "code\modules\mob\living\carbon\human\examine.dm" +#include "code\modules\mob\living\carbon\human\examine_vr.dm" +#include "code\modules\mob\living\carbon\human\human.dm" +#include "code\modules\mob\living\carbon\human\human_defense.dm" +#include "code\modules\mob\living\carbon\human\human_defines.dm" +#include "code\modules\mob\living\carbon\human\human_helpers.dm" +#include "code\modules\mob\living\carbon\human\human_movement.dm" +#include "code\modules\mob\living\carbon\human\inventory.dm" +#include "code\modules\mob\living\carbon\human\life.dm" +#include "code\modules\mob\living\carbon\human\physiology.dm" +#include "code\modules\mob\living\carbon\human\say.dm" +#include "code\modules\mob\living\carbon\human\species.dm" +#include "code\modules\mob\living\carbon\human\status_procs.dm" +#include "code\modules\mob\living\carbon\human\typing_indicator.dm" +#include "code\modules\mob\living\carbon\human\update_icons.dm" +#include "code\modules\mob\living\carbon\human\species_types\abductors.dm" +#include "code\modules\mob\living\carbon\human\species_types\android.dm" +#include "code\modules\mob\living\carbon\human\species_types\angel.dm" +#include "code\modules\mob\living\carbon\human\species_types\corporate.dm" +#include "code\modules\mob\living\carbon\human\species_types\dullahan.dm" +#include "code\modules\mob\living\carbon\human\species_types\felinid.dm" +#include "code\modules\mob\living\carbon\human\species_types\flypeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\golems.dm" +#include "code\modules\mob\living\carbon\human\species_types\humans.dm" +#include "code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\lizardpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\mothmen.dm" +#include "code\modules\mob\living\carbon\human\species_types\mushpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\plasmamen.dm" +#include "code\modules\mob\living\carbon\human\species_types\podpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\shadowpeople.dm" +#include "code\modules\mob\living\carbon\human\species_types\skeletons.dm" +#include "code\modules\mob\living\carbon\human\species_types\synths.dm" +#include "code\modules\mob\living\carbon\human\species_types\vampire.dm" +#include "code\modules\mob\living\carbon\human\species_types\zombies.dm" +#include "code\modules\mob\living\carbon\monkey\combat.dm" +#include "code\modules\mob\living\carbon\monkey\death.dm" +#include "code\modules\mob\living\carbon\monkey\inventory.dm" +#include "code\modules\mob\living\carbon\monkey\life.dm" +#include "code\modules\mob\living\carbon\monkey\monkey.dm" +#include "code\modules\mob\living\carbon\monkey\monkey_defense.dm" +#include "code\modules\mob\living\carbon\monkey\punpun.dm" +#include "code\modules\mob\living\carbon\monkey\update_icons.dm" +#include "code\modules\mob\living\silicon\damage_procs.dm" +#include "code\modules\mob\living\silicon\death.dm" +#include "code\modules\mob\living\silicon\examine.dm" +#include "code\modules\mob\living\silicon\laws.dm" +#include "code\modules\mob\living\silicon\login.dm" +#include "code\modules\mob\living\silicon\say.dm" +#include "code\modules\mob\living\silicon\silicon.dm" +#include "code\modules\mob\living\silicon\silicon_defense.dm" +#include "code\modules\mob\living\silicon\silicon_movement.dm" +#include "code\modules\mob\living\silicon\ai\ai.dm" +#include "code\modules\mob\living\silicon\ai\ai_defense.dm" +#include "code\modules\mob\living\silicon\ai\death.dm" +#include "code\modules\mob\living\silicon\ai\examine.dm" +#include "code\modules\mob\living\silicon\ai\laws.dm" +#include "code\modules\mob\living\silicon\ai\life.dm" +#include "code\modules\mob\living\silicon\ai\login.dm" +#include "code\modules\mob\living\silicon\ai\logout.dm" +#include "code\modules\mob\living\silicon\ai\multicam.dm" +#include "code\modules\mob\living\silicon\ai\say.dm" +#include "code\modules\mob\living\silicon\ai\vox_sounds.dm" +#include "code\modules\mob\living\silicon\ai\freelook\cameranet.dm" +#include "code\modules\mob\living\silicon\ai\freelook\chunk.dm" +#include "code\modules\mob\living\silicon\ai\freelook\eye.dm" +#include "code\modules\mob\living\silicon\ai\freelook\read_me.dm" +#include "code\modules\mob\living\silicon\pai\death.dm" +#include "code\modules\mob\living\silicon\pai\pai.dm" +#include "code\modules\mob\living\silicon\pai\pai_defense.dm" +#include "code\modules\mob\living\silicon\pai\pai_shell.dm" +#include "code\modules\mob\living\silicon\pai\personality.dm" +#include "code\modules\mob\living\silicon\pai\say.dm" +#include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\robot\death.dm" +#include "code\modules\mob\living\silicon\robot\emote.dm" +#include "code\modules\mob\living\silicon\robot\examine.dm" +#include "code\modules\mob\living\silicon\robot\inventory.dm" +#include "code\modules\mob\living\silicon\robot\laws.dm" +#include "code\modules\mob\living\silicon\robot\life.dm" +#include "code\modules\mob\living\silicon\robot\login.dm" +#include "code\modules\mob\living\silicon\robot\robot.dm" +#include "code\modules\mob\living\silicon\robot\robot_defense.dm" +#include "code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "code\modules\mob\living\silicon\robot\say.dm" +#include "code\modules\mob\living\simple_animal\animal_defense.dm" +#include "code\modules\mob\living\simple_animal\astral.dm" +#include "code\modules\mob\living\simple_animal\constructs.dm" +#include "code\modules\mob\living\simple_animal\corpse.dm" +#include "code\modules\mob\living\simple_animal\damage_procs.dm" +#include "code\modules\mob\living\simple_animal\parrot.dm" +#include "code\modules\mob\living\simple_animal\shade.dm" +#include "code\modules\mob\living\simple_animal\simple_animal.dm" +#include "code\modules\mob\living\simple_animal\simple_animal_vr.dm" +#include "code\modules\mob\living\simple_animal\status_procs.dm" +#include "code\modules\mob\living\simple_animal\bot\bot.dm" +#include "code\modules\mob\living\simple_animal\bot\cleanbot.dm" +#include "code\modules\mob\living\simple_animal\bot\construction.dm" +#include "code\modules\mob\living\simple_animal\bot\ed209bot.dm" +#include "code\modules\mob\living\simple_animal\bot\firebot.dm" +#include "code\modules\mob\living\simple_animal\bot\floorbot.dm" +#include "code\modules\mob\living\simple_animal\bot\honkbot.dm" +#include "code\modules\mob\living\simple_animal\bot\medbot.dm" +#include "code\modules\mob\living\simple_animal\bot\mulebot.dm" +#include "code\modules\mob\living\simple_animal\bot\secbot.dm" +#include "code\modules\mob\living\simple_animal\bot\SuperBeepsky.dm" +#include "code\modules\mob\living\simple_animal\friendly\butterfly.dm" +#include "code\modules\mob\living\simple_animal\friendly\cat.dm" +#include "code\modules\mob\living\simple_animal\friendly\cockroach.dm" +#include "code\modules\mob\living\simple_animal\friendly\crab.dm" +#include "code\modules\mob\living\simple_animal\friendly\dog.dm" +#include "code\modules\mob\living\simple_animal\friendly\farm_animals.dm" +#include "code\modules\mob\living\simple_animal\friendly\fox.dm" +#include "code\modules\mob\living\simple_animal\friendly\goliathbaby.dm" +#include "code\modules\mob\living\simple_animal\friendly\gondola.dm" +#include "code\modules\mob\living\simple_animal\friendly\lizard.dm" +#include "code\modules\mob\living\simple_animal\friendly\mouse.dm" +#include "code\modules\mob\living\simple_animal\friendly\panda.dm" +#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" +#include "code\modules\mob\living\simple_animal\friendly\pet.dm" +#include "code\modules\mob\living\simple_animal\friendly\possum.dm" +#include "code\modules\mob\living\simple_animal\friendly\skunk.dm" +#include "code\modules\mob\living\simple_animal\friendly\sloth.dm" +#include "code\modules\mob\living\simple_animal\friendly\snake.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\_drone.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\drones_as_items.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\extra_drone_types.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\interaction.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\inventory.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\say.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\verbs.dm" +#include "code\modules\mob\living\simple_animal\friendly\drone\visuals_icons.dm" +#include "code\modules\mob\living\simple_animal\guardian\guardian.dm" +#include "code\modules\mob\living\simple_animal\guardian\guardiannaming.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\assassin.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\charger.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\dextrous.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\explosive.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\fire.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\lightning.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\protector.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\ranged.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\standard.dm" +#include "code\modules\mob\living\simple_animal\guardian\types\support.dm" +#include "code\modules\mob\living\simple_animal\hostile\alien.dm" +#include "code\modules\mob\living\simple_animal\hostile\bear.dm" +#include "code\modules\mob\living\simple_animal\hostile\bees.dm" +#include "code\modules\mob\living\simple_animal\hostile\bread.dm" +#include "code\modules\mob\living\simple_animal\hostile\carp.dm" +#include "code\modules\mob\living\simple_animal\hostile\cat_butcher.dm" +#include "code\modules\mob\living\simple_animal\hostile\eyeballs.dm" +#include "code\modules\mob\living\simple_animal\hostile\faithless.dm" +#include "code\modules\mob\living\simple_animal\hostile\floor_cluwne.dm" +#include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\goose.dm" +#include "code\modules\mob\living\simple_animal\hostile\headcrab.dm" +#include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" +#include "code\modules\mob\living\simple_animal\hostile\hostile.dm" +#include "code\modules\mob\living\simple_animal\hostile\illusion.dm" +#include "code\modules\mob\living\simple_animal\hostile\killertomato.dm" +#include "code\modules\mob\living\simple_animal\hostile\mecha_pilot.dm" +#include "code\modules\mob\living\simple_animal\hostile\mimic.dm" +#include "code\modules\mob\living\simple_animal\hostile\mushroom.dm" +#include "code\modules\mob\living\simple_animal\hostile\nanotrasen.dm" +#include "code\modules\mob\living\simple_animal\hostile\netherworld.dm" +#include "code\modules\mob\living\simple_animal\hostile\pirate.dm" +#include "code\modules\mob\living\simple_animal\hostile\regalrat.dm" +#include "code\modules\mob\living\simple_animal\hostile\russian.dm" +#include "code\modules\mob\living\simple_animal\hostile\sharks.dm" +#include "code\modules\mob\living\simple_animal\hostile\skeleton.dm" +#include "code\modules\mob\living\simple_animal\hostile\statue.dm" +#include "code\modules\mob\living\simple_animal\hostile\stickman.dm" +#include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" +#include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\venus_human_trap.dm" +#include "code\modules\mob\living\simple_animal\hostile\wizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\wumborian_fugu.dm" +#include "code\modules\mob\living\simple_animal\hostile\zombie.dm" +#include "code\modules\mob\living\simple_animal\hostile\bosses\boss.dm" +#include "code\modules\mob\living\simple_animal\hostile\bosses\paperwizard.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\emotes.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\gorilla.dm" +#include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" +#include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\blood_drunk_miner.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\bubblegum.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\colossus.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\dragon_vore.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\drake.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\hierophant.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\legion.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\megafauna.dm" +#include "code\modules\mob\living\simple_animal\hostile\megafauna\swarmer.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\basilisk.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\curse_blob.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goldgrub.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\goliath.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\gutlunch.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\hivelord.dm" +#include "code\modules\mob\living\simple_animal\hostile\mining_mobs\mining_mobs.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\bat.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\clown.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\frog.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\ghost.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\retaliate.dm" +#include "code\modules\mob\living\simple_animal\hostile\retaliate\spaceman.dm" +#include "code\modules\mob\living\simple_animal\slime\death.dm" +#include "code\modules\mob\living\simple_animal\slime\emote.dm" +#include "code\modules\mob\living\simple_animal\slime\life.dm" +#include "code\modules\mob\living\simple_animal\slime\powers.dm" +#include "code\modules\mob\living\simple_animal\slime\say.dm" +#include "code\modules\mob\living\simple_animal\slime\slime.dm" +#include "code\modules\mob\living\simple_animal\slime\subtypes.dm" +#include "code\modules\modular_computers\laptop_vendor.dm" +#include "code\modules\modular_computers\computers\item\computer.dm" +#include "code\modules\modular_computers\computers\item\computer_components.dm" +#include "code\modules\modular_computers\computers\item\computer_damage.dm" +#include "code\modules\modular_computers\computers\item\computer_power.dm" +#include "code\modules\modular_computers\computers\item\computer_ui.dm" +#include "code\modules\modular_computers\computers\item\laptop.dm" +#include "code\modules\modular_computers\computers\item\laptop_presets.dm" +#include "code\modules\modular_computers\computers\item\processor.dm" +#include "code\modules\modular_computers\computers\item\tablet.dm" +#include "code\modules\modular_computers\computers\item\tablet_presets.dm" +#include "code\modules\modular_computers\computers\machinery\console_presets.dm" +#include "code\modules\modular_computers\computers\machinery\modular_computer.dm" +#include "code\modules\modular_computers\computers\machinery\modular_console.dm" +#include "code\modules\modular_computers\file_system\computer_file.dm" +#include "code\modules\modular_computers\file_system\data.dm" +#include "code\modules\modular_computers\file_system\program.dm" +#include "code\modules\modular_computers\file_system\program_events.dm" +#include "code\modules\modular_computers\file_system\programs\airestorer.dm" +#include "code\modules\modular_computers\file_system\programs\alarm.dm" +#include "code\modules\modular_computers\file_system\programs\card.dm" +#include "code\modules\modular_computers\file_system\programs\configurator.dm" +#include "code\modules\modular_computers\file_system\programs\file_browser.dm" +#include "code\modules\modular_computers\file_system\programs\ntdownloader.dm" +#include "code\modules\modular_computers\file_system\programs\ntmonitor.dm" +#include "code\modules\modular_computers\file_system\programs\ntnrc_client.dm" +#include "code\modules\modular_computers\file_system\programs\nttransfer.dm" +#include "code\modules\modular_computers\file_system\programs\powermonitor.dm" +#include "code\modules\modular_computers\file_system\programs\sm_monitor.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\dos.dm" +#include "code\modules\modular_computers\file_system\programs\antagonist\revelation.dm" +#include "code\modules\modular_computers\hardware\_hardware.dm" +#include "code\modules\modular_computers\hardware\ai_slot.dm" +#include "code\modules\modular_computers\hardware\battery_module.dm" +#include "code\modules\modular_computers\hardware\card_slot.dm" +#include "code\modules\modular_computers\hardware\CPU.dm" +#include "code\modules\modular_computers\hardware\hard_drive.dm" +#include "code\modules\modular_computers\hardware\network_card.dm" +#include "code\modules\modular_computers\hardware\portable_disk.dm" +#include "code\modules\modular_computers\hardware\printer.dm" +#include "code\modules\modular_computers\hardware\recharger.dm" +#include "code\modules\modular_computers\NTNet\NTNRC\conversation.dm" +#include "code\modules\ninja\__ninjaDefines.dm" +#include "code\modules\ninja\energy_katana.dm" +#include "code\modules\ninja\ninja_event.dm" +#include "code\modules\ninja\outfit.dm" +#include "code\modules\ninja\suit\gloves.dm" +#include "code\modules\ninja\suit\head.dm" +#include "code\modules\ninja\suit\mask.dm" +#include "code\modules\ninja\suit\ninjaDrainAct.dm" +#include "code\modules\ninja\suit\shoes.dm" +#include "code\modules\ninja\suit\suit.dm" +#include "code\modules\ninja\suit\suit_attackby.dm" +#include "code\modules\ninja\suit\suit_initialisation.dm" +#include "code\modules\ninja\suit\suit_process.dm" +#include "code\modules\ninja\suit\n_suit_verbs\energy_net_nets.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_adrenaline.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_cost_check.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_empulse.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_net.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_smoke.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_stars.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_stealth.dm" +#include "code\modules\ninja\suit\n_suit_verbs\ninja_sword_recall.dm" +#include "code\modules\NTNet\netdata.dm" +#include "code\modules\NTNet\network.dm" +#include "code\modules\NTNet\relays.dm" +#include "code\modules\NTNet\services\_service.dm" +#include "code\modules\oracle_ui\assets.dm" +#include "code\modules\oracle_ui\hookup_procs.dm" +#include "code\modules\oracle_ui\oracle_ui.dm" +#include "code\modules\oracle_ui\themed.dm" +#include "code\modules\paperwork\clipboard.dm" +#include "code\modules\paperwork\contract.dm" +#include "code\modules\paperwork\filingcabinet.dm" +#include "code\modules\paperwork\folders.dm" +#include "code\modules\paperwork\handlabeler.dm" +#include "code\modules\paperwork\paper.dm" +#include "code\modules\paperwork\paper_cutter.dm" +#include "code\modules\paperwork\paper_premade.dm" +#include "code\modules\paperwork\paperbin.dm" +#include "code\modules\paperwork\paperplane.dm" +#include "code\modules\paperwork\pen.dm" +#include "code\modules\paperwork\photocopier.dm" +#include "code\modules\paperwork\stamps.dm" +#include "code\modules\photography\_pictures.dm" +#include "code\modules\photography\camera\camera.dm" +#include "code\modules\photography\camera\camera_image_capturing.dm" +#include "code\modules\photography\camera\film.dm" +#include "code\modules\photography\camera\other.dm" +#include "code\modules\photography\camera\silicon_camera.dm" +#include "code\modules\photography\photos\album.dm" +#include "code\modules\photography\photos\frame.dm" +#include "code\modules\photography\photos\photo.dm" +#include "code\modules\pool\pool_controller.dm" +#include "code\modules\pool\pool_drain.dm" +#include "code\modules\pool\pool_effects.dm" +#include "code\modules\pool\pool_main.dm" +#include "code\modules\pool\pool_noodles.dm" +#include "code\modules\pool\pool_structures.dm" +#include "code\modules\pool\pool_wires.dm" +#include "code\modules\power\apc.dm" +#include "code\modules\power\cable.dm" +#include "code\modules\power\cell.dm" +#include "code\modules\power\floodlight.dm" +#include "code\modules\power\generator.dm" +#include "code\modules\power\gravitygenerator.dm" +#include "code\modules\power\lighting.dm" +#include "code\modules\power\monitor.dm" +#include "code\modules\power\multiz.dm" +#include "code\modules\power\port_gen.dm" +#include "code\modules\power\power.dm" +#include "code\modules\power\powernet.dm" +#include "code\modules\power\rtg.dm" +#include "code\modules\power\smes.dm" +#include "code\modules\power\solar.dm" +#include "code\modules\power\terminal.dm" +#include "code\modules\power\tracker.dm" +#include "code\modules\power\turbine.dm" +#include "code\modules\power\antimatter\containment_jar.dm" +#include "code\modules\power\antimatter\control.dm" +#include "code\modules\power\antimatter\shielding.dm" +#include "code\modules\power\singularity\collector.dm" +#include "code\modules\power\singularity\containment_field.dm" +#include "code\modules\power\singularity\emitter.dm" +#include "code\modules\power\singularity\field_generator.dm" +#include "code\modules\power\singularity\generator.dm" +#include "code\modules\power\singularity\investigate.dm" +#include "code\modules\power\singularity\narsie.dm" +#include "code\modules\power\singularity\singularity.dm" +#include "code\modules\power\singularity\particle_accelerator\particle.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_accelerator.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_control.dm" +#include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" +#include "code\modules\power\supermatter\supermatter.dm" +#include "code\modules\power\tesla\coil.dm" +#include "code\modules\power\tesla\energy_ball.dm" +#include "code\modules\power\tesla\generator.dm" +#include "code\modules\procedural_mapping\mapGenerator.dm" +#include "code\modules\procedural_mapping\mapGeneratorModule.dm" +#include "code\modules\procedural_mapping\mapGeneratorObj.dm" +#include "code\modules\procedural_mapping\mapGeneratorReadme.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\helpers.dm" +#include "code\modules\procedural_mapping\mapGeneratorModules\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\asteroid.dm" +#include "code\modules\procedural_mapping\mapGenerators\cellular.dm" +#include "code\modules\procedural_mapping\mapGenerators\cult.dm" +#include "code\modules\procedural_mapping\mapGenerators\lava_river.dm" +#include "code\modules\procedural_mapping\mapGenerators\lavaland.dm" +#include "code\modules\procedural_mapping\mapGenerators\nature.dm" +#include "code\modules\procedural_mapping\mapGenerators\repair.dm" +#include "code\modules\procedural_mapping\mapGenerators\shuttle.dm" +#include "code\modules\procedural_mapping\mapGenerators\syndicate.dm" +#include "code\modules\projectiles\gun.dm" +#include "code\modules\projectiles\pins.dm" +#include "code\modules\projectiles\projectile.dm" +#include "code\modules\projectiles\ammunition\_ammunition.dm" +#include "code\modules\projectiles\ammunition\_firing.dm" +#include "code\modules\projectiles\ammunition\ballistic\lmg.dm" +#include "code\modules\projectiles\ammunition\ballistic\pistol.dm" +#include "code\modules\projectiles\ammunition\ballistic\revolver.dm" +#include "code\modules\projectiles\ammunition\ballistic\rifle.dm" +#include "code\modules\projectiles\ammunition\ballistic\shotgun.dm" +#include "code\modules\projectiles\ammunition\ballistic\smg.dm" +#include "code\modules\projectiles\ammunition\ballistic\sniper.dm" +#include "code\modules\projectiles\ammunition\caseless\_caseless.dm" +#include "code\modules\projectiles\ammunition\caseless\foam.dm" +#include "code\modules\projectiles\ammunition\caseless\misc.dm" +#include "code\modules\projectiles\ammunition\caseless\rocket.dm" +#include "code\modules\projectiles\ammunition\energy\_energy.dm" +#include "code\modules\projectiles\ammunition\energy\ebow.dm" +#include "code\modules\projectiles\ammunition\energy\gravity.dm" +#include "code\modules\projectiles\ammunition\energy\laser.dm" +#include "code\modules\projectiles\ammunition\energy\lmg.dm" +#include "code\modules\projectiles\ammunition\energy\plasma.dm" +#include "code\modules\projectiles\ammunition\energy\plasma_cit.dm" +#include "code\modules\projectiles\ammunition\energy\portal.dm" +#include "code\modules\projectiles\ammunition\energy\special.dm" +#include "code\modules\projectiles\ammunition\energy\stun.dm" +#include "code\modules\projectiles\ammunition\special\magic.dm" +#include "code\modules\projectiles\ammunition\special\syringe.dm" +#include "code\modules\projectiles\boxes_magazines\_box_magazine.dm" +#include "code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "code\modules\projectiles\boxes_magazines\external\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\external\lmg.dm" +#include "code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "code\modules\projectiles\boxes_magazines\external\rechargable.dm" +#include "code\modules\projectiles\boxes_magazines\external\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\external\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\external\smg.dm" +#include "code\modules\projectiles\boxes_magazines\external\sniper.dm" +#include "code\modules\projectiles\boxes_magazines\external\toy.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_cylinder.dm" +#include "code\modules\projectiles\boxes_magazines\internal\_internal.dm" +#include "code\modules\projectiles\boxes_magazines\internal\grenade.dm" +#include "code\modules\projectiles\boxes_magazines\internal\misc.dm" +#include "code\modules\projectiles\boxes_magazines\internal\revolver.dm" +#include "code\modules\projectiles\boxes_magazines\internal\rifle.dm" +#include "code\modules\projectiles\boxes_magazines\internal\shotgun.dm" +#include "code\modules\projectiles\boxes_magazines\internal\toy.dm" +#include "code\modules\projectiles\guns\ballistic.dm" +#include "code\modules\projectiles\guns\energy.dm" +#include "code\modules\projectiles\guns\magic.dm" +#include "code\modules\projectiles\guns\ballistic\automatic.dm" +#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" +#include "code\modules\projectiles\guns\ballistic\launchers.dm" +#include "code\modules\projectiles\guns\ballistic\pistol.dm" +#include "code\modules\projectiles\guns\ballistic\revolver.dm" +#include "code\modules\projectiles\guns\ballistic\shotgun.dm" +#include "code\modules\projectiles\guns\ballistic\toy.dm" +#include "code\modules\projectiles\guns\energy\dueling.dm" +#include "code\modules\projectiles\guns\energy\energy_gun.dm" +#include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" +#include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\megabuster.dm" +#include "code\modules\projectiles\guns\energy\mounted.dm" +#include "code\modules\projectiles\guns\energy\plasma_cit.dm" +#include "code\modules\projectiles\guns\energy\pulse.dm" +#include "code\modules\projectiles\guns\energy\special.dm" +#include "code\modules\projectiles\guns\energy\stun.dm" +#include "code\modules\projectiles\guns\magic\staff.dm" +#include "code\modules\projectiles\guns\magic\wand.dm" +#include "code\modules\projectiles\guns\misc\beam_rifle.dm" +#include "code\modules\projectiles\guns\misc\blastcannon.dm" +#include "code\modules\projectiles\guns\misc\chem_gun.dm" +#include "code\modules\projectiles\guns\misc\grenade_launcher.dm" +#include "code\modules\projectiles\guns\misc\medbeam.dm" +#include "code\modules\projectiles\guns\misc\syringe_gun.dm" +#include "code\modules\projectiles\projectile\beams.dm" +#include "code\modules\projectiles\projectile\bullets.dm" +#include "code\modules\projectiles\projectile\magic.dm" +#include "code\modules\projectiles\projectile\megabuster.dm" +#include "code\modules\projectiles\projectile\plasma.dm" +#include "code\modules\projectiles\projectile\bullets\_incendiary.dm" +#include "code\modules\projectiles\projectile\bullets\dart_syringe.dm" +#include "code\modules\projectiles\projectile\bullets\dnainjector.dm" +#include "code\modules\projectiles\projectile\bullets\grenade.dm" +#include "code\modules\projectiles\projectile\bullets\lmg.dm" +#include "code\modules\projectiles\projectile\bullets\pistol.dm" +#include "code\modules\projectiles\projectile\bullets\revolver.dm" +#include "code\modules\projectiles\projectile\bullets\rifle.dm" +#include "code\modules\projectiles\projectile\bullets\shotgun.dm" +#include "code\modules\projectiles\projectile\bullets\smg.dm" +#include "code\modules\projectiles\projectile\bullets\sniper.dm" +#include "code\modules\projectiles\projectile\bullets\special.dm" +#include "code\modules\projectiles\projectile\energy\_energy.dm" +#include "code\modules\projectiles\projectile\energy\ebow.dm" +#include "code\modules\projectiles\projectile\energy\misc.dm" +#include "code\modules\projectiles\projectile\energy\net_snare.dm" +#include "code\modules\projectiles\projectile\energy\nuclear_particle.dm" +#include "code\modules\projectiles\projectile\energy\stun.dm" +#include "code\modules\projectiles\projectile\energy\tesla.dm" +#include "code\modules\projectiles\projectile\magic\spellcard.dm" +#include "code\modules\projectiles\projectile\reusable\_reusable.dm" +#include "code\modules\projectiles\projectile\reusable\foam_dart.dm" +#include "code\modules\projectiles\projectile\reusable\magspear.dm" +#include "code\modules\projectiles\projectile\special\curse.dm" +#include "code\modules\projectiles\projectile\special\floral.dm" +#include "code\modules\projectiles\projectile\special\gravity.dm" +#include "code\modules\projectiles\projectile\special\hallucination.dm" +#include "code\modules\projectiles\projectile\special\ion.dm" +#include "code\modules\projectiles\projectile\special\meteor.dm" +#include "code\modules\projectiles\projectile\special\mindflayer.dm" +#include "code\modules\projectiles\projectile\special\neurotoxin.dm" +#include "code\modules\projectiles\projectile\special\plasma.dm" +#include "code\modules\projectiles\projectile\special\rocket.dm" +#include "code\modules\projectiles\projectile\special\temperature.dm" +#include "code\modules\projectiles\projectile\special\wormhole.dm" +#include "code\modules\reagents\chem_splash.dm" +#include "code\modules\reagents\chem_wiki_render.dm" +#include "code\modules\reagents\reagent_containers.dm" +#include "code\modules\reagents\reagent_dispenser.dm" +#include "code\modules\reagents\chemistry\colors.dm" +#include "code\modules\reagents\chemistry\holder.dm" +#include "code\modules\reagents\chemistry\reagents.dm" +#include "code\modules\reagents\chemistry\recipes.dm" +#include "code\modules\reagents\chemistry\machinery\chem_dispenser.dm" +#include "code\modules\reagents\chemistry\machinery\chem_heater.dm" +#include "code\modules\reagents\chemistry\machinery\chem_master.dm" +#include "code\modules\reagents\chemistry\machinery\chem_synthesizer.dm" +#include "code\modules\reagents\chemistry\machinery\pandemic.dm" +#include "code\modules\reagents\chemistry\machinery\reagentgrinder.dm" +#include "code\modules\reagents\chemistry\machinery\smoke_machine.dm" +#include "code\modules\reagents\chemistry\reagents\alcohol_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\blob_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drink_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\drug_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\food_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\impure_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\medicine_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\pyrotechnic_reagents.dm" +#include "code\modules\reagents\chemistry\reagents\toxin_reagents.dm" +#include "code\modules\reagents\chemistry\recipes\drugs.dm" +#include "code\modules\reagents\chemistry\recipes\medicine.dm" +#include "code\modules\reagents\chemistry\recipes\others.dm" +#include "code\modules\reagents\chemistry\recipes\pyrotechnics.dm" +#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" +#include "code\modules\reagents\reagent_containers\borghydro.dm" +#include "code\modules\reagents\reagent_containers\bottle.dm" +#include "code\modules\reagents\reagent_containers\chem_pack.dm" +#include "code\modules\reagents\reagent_containers\Chemical_tongue.dm" +#include "code\modules\reagents\reagent_containers\dropper.dm" +#include "code\modules\reagents\reagent_containers\glass.dm" +#include "code\modules\reagents\reagent_containers\hypospray.dm" +#include "code\modules\reagents\reagent_containers\hypovial.dm" +#include "code\modules\reagents\reagent_containers\medspray.dm" +#include "code\modules\reagents\reagent_containers\patch.dm" +#include "code\modules\reagents\reagent_containers\pill.dm" +#include "code\modules\reagents\reagent_containers\rags.dm" +#include "code\modules\reagents\reagent_containers\sleeper_buffer.dm" +#include "code\modules\reagents\reagent_containers\spray.dm" +#include "code\modules\reagents\reagent_containers\syringes.dm" +#include "code\modules\recycling\conveyor2.dm" +#include "code\modules\recycling\sortingmachinery.dm" +#include "code\modules\recycling\disposal\bin.dm" +#include "code\modules\recycling\disposal\construction.dm" +#include "code\modules\recycling\disposal\eject.dm" +#include "code\modules\recycling\disposal\holder.dm" +#include "code\modules\recycling\disposal\multiz.dm" +#include "code\modules\recycling\disposal\outlet.dm" +#include "code\modules\recycling\disposal\pipe.dm" +#include "code\modules\recycling\disposal\pipe_sorting.dm" +#include "code\modules\research\designs.dm" +#include "code\modules\research\destructive_analyzer.dm" +#include "code\modules\research\experimentor.dm" +#include "code\modules\research\rdconsole.dm" +#include "code\modules\research\rdmachines.dm" +#include "code\modules\research\research_disk.dm" +#include "code\modules\research\server.dm" +#include "code\modules\research\stock_parts.dm" +#include "code\modules\research\designs\AI_module_designs.dm" +#include "code\modules\research\designs\autobotter_designs.dm" +#include "code\modules\research\designs\biogenerator_designs.dm" +#include "code\modules\research\designs\bluespace_designs.dm" +#include "code\modules\research\designs\computer_part_designs.dm" +#include "code\modules\research\designs\electronics_designs.dm" +#include "code\modules\research\designs\equipment_designs.dm" +#include "code\modules\research\designs\limbgrower_designs.dm" +#include "code\modules\research\designs\mecha_designs.dm" +#include "code\modules\research\designs\mechfabricator_designs.dm" +#include "code\modules\research\designs\medical_designs.dm" +#include "code\modules\research\designs\mining_designs.dm" +#include "code\modules\research\designs\misc_designs.dm" +#include "code\modules\research\designs\nanite_designs.dm" +#include "code\modules\research\designs\power_designs.dm" +#include "code\modules\research\designs\smelting_designs.dm" +#include "code\modules\research\designs\stock_parts_designs.dm" +#include "code\modules\research\designs\telecomms_designs.dm" +#include "code\modules\research\designs\weapon_designs.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_construction.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_electronics.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_medical_and_dinnerware.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_sec_and_hacked.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tcomms_and_misc.dm" +#include "code\modules\research\designs\autolathe_desings\autolathe_designs_tools.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_all_misc.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_cargo .dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_engi.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_medical.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sci.dm" +#include "code\modules\research\designs\comp_board_designs\comp_board_designs_sec.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_all_misc.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_cargo.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_engi.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_medical.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_sci.dm" +#include "code\modules\research\designs\machine_desings\machine_designs_service.dm" +#include "code\modules\research\machinery\_production.dm" +#include "code\modules\research\machinery\circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_circuit_imprinter.dm" +#include "code\modules\research\machinery\departmental_protolathe.dm" +#include "code\modules\research\machinery\departmental_techfab.dm" +#include "code\modules\research\machinery\protolathe.dm" +#include "code\modules\research\machinery\techfab.dm" +#include "code\modules\research\nanites\nanite_chamber.dm" +#include "code\modules\research\nanites\nanite_chamber_computer.dm" +#include "code\modules\research\nanites\nanite_cloud_controller.dm" +#include "code\modules\research\nanites\nanite_hijacker.dm" +#include "code\modules\research\nanites\nanite_misc_items.dm" +#include "code\modules\research\nanites\nanite_program_hub.dm" +#include "code\modules\research\nanites\nanite_programmer.dm" +#include "code\modules\research\nanites\nanite_programs.dm" +#include "code\modules\research\nanites\nanite_remote.dm" +#include "code\modules\research\nanites\program_disks.dm" +#include "code\modules\research\nanites\public_chamber.dm" +#include "code\modules\research\nanites\nanite_programs\buffing.dm" +#include "code\modules\research\nanites\nanite_programs\healing.dm" +#include "code\modules\research\nanites\nanite_programs\rogue.dm" +#include "code\modules\research\nanites\nanite_programs\sensor.dm" +#include "code\modules\research\nanites\nanite_programs\suppression.dm" +#include "code\modules\research\nanites\nanite_programs\utility.dm" +#include "code\modules\research\nanites\nanite_programs\weapon.dm" +#include "code\modules\research\techweb\__techweb_helpers.dm" +#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\xenoarch\artifact.dm" +#include "code\modules\research\xenoarch\artifact_list.dm" +#include "code\modules\research\xenoarch\strange_rock.dm" +#include "code\modules\research\xenoarch\tools.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\amauri.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\gelthi.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\jurlmah.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\nofruit.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\shand.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\surik.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\telriis.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\thaadra.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\vale.dm" +#include "code\modules\research\xenoarch\xenobotany\grown\vaporsac.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\_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\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\lavaland_ruin_code.dm" +#include "code\modules\ruins\lavalandruin_code\biodome_clown_planet.dm" +#include "code\modules\ruins\lavalandruin_code\pizzaparty.dm" +#include "code\modules\ruins\lavalandruin_code\puzzle.dm" +#include "code\modules\ruins\lavalandruin_code\sloth.dm" +#include "code\modules\ruins\lavalandruin_code\surface.dm" +#include "code\modules\ruins\lavalandruin_code\syndicate_base.dm" +#include "code\modules\ruins\objects_and_mobs\ash_walker_den.dm" +#include "code\modules\ruins\objects_and_mobs\necropolis_gate.dm" +#include "code\modules\ruins\objects_and_mobs\sin_ruins.dm" +#include "code\modules\ruins\spaceruin_code\asteroid4.dm" +#include "code\modules\ruins\spaceruin_code\bigderelict1.dm" +#include "code\modules\ruins\spaceruin_code\caravanambush.dm" +#include "code\modules\ruins\spaceruin_code\cloning_lab.dm" +#include "code\modules\ruins\spaceruin_code\crashedclownship.dm" +#include "code\modules\ruins\spaceruin_code\crashedship.dm" +#include "code\modules\ruins\spaceruin_code\deepstorage.dm" +#include "code\modules\ruins\spaceruin_code\DJstation.dm" +#include "code\modules\ruins\spaceruin_code\hilbertshotel.dm" +#include "code\modules\ruins\spaceruin_code\listeningstation.dm" +#include "code\modules\ruins\spaceruin_code\miracle.dm" +#include "code\modules\ruins\spaceruin_code\oldstation.dm" +#include "code\modules\ruins\spaceruin_code\originalcontent.dm" +#include "code\modules\ruins\spaceruin_code\spacehotel.dm" +#include "code\modules\ruins\spaceruin_code\TheDerelict.dm" +#include "code\modules\ruins\spaceruin_code\whiteshipruin_box.dm" +#include "code\modules\security_levels\keycard_authentication.dm" +#include "code\modules\security_levels\security_levels.dm" +#include "code\modules\shuttle\arrivals.dm" +#include "code\modules\shuttle\assault_pod.dm" +#include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\docking.dm" +#include "code\modules\shuttle\elevator.dm" +#include "code\modules\shuttle\emergency.dm" +#include "code\modules\shuttle\ferry.dm" +#include "code\modules\shuttle\manipulator.dm" +#include "code\modules\shuttle\monastery.dm" +#include "code\modules\shuttle\navigation_computer.dm" +#include "code\modules\shuttle\on_move.dm" +#include "code\modules\shuttle\ripple.dm" +#include "code\modules\shuttle\shuttle.dm" +#include "code\modules\shuttle\shuttle_rotate.dm" +#include "code\modules\shuttle\special.dm" +#include "code\modules\shuttle\supply.dm" +#include "code\modules\shuttle\syndicate.dm" +#include "code\modules\shuttle\white_ship.dm" +#include "code\modules\spells\spell.dm" +#include "code\modules\spells\spell_types\adminbussed.dm" +#include "code\modules\spells\spell_types\aimed.dm" +#include "code\modules\spells\spell_types\area_teleport.dm" +#include "code\modules\spells\spell_types\barnyard.dm" +#include "code\modules\spells\spell_types\bloodcrawl.dm" +#include "code\modules\spells\spell_types\charge.dm" +#include "code\modules\spells\spell_types\conjure.dm" +#include "code\modules\spells\spell_types\construct_spells.dm" +#include "code\modules\spells\spell_types\devil.dm" +#include "code\modules\spells\spell_types\devil_boons.dm" +#include "code\modules\spells\spell_types\dumbfire.dm" +#include "code\modules\spells\spell_types\emplosion.dm" +#include "code\modules\spells\spell_types\ethereal_jaunt.dm" +#include "code\modules\spells\spell_types\explosion.dm" +#include "code\modules\spells\spell_types\forcewall.dm" +#include "code\modules\spells\spell_types\genetic.dm" +#include "code\modules\spells\spell_types\godhand.dm" +#include "code\modules\spells\spell_types\infinite_guns.dm" +#include "code\modules\spells\spell_types\inflict_handler.dm" +#include "code\modules\spells\spell_types\knock.dm" +#include "code\modules\spells\spell_types\lichdom.dm" +#include "code\modules\spells\spell_types\lightning.dm" +#include "code\modules\spells\spell_types\mime.dm" +#include "code\modules\spells\spell_types\mind_transfer.dm" +#include "code\modules\spells\spell_types\projectile.dm" +#include "code\modules\spells\spell_types\rightandwrong.dm" +#include "code\modules\spells\spell_types\rod_form.dm" +#include "code\modules\spells\spell_types\santa.dm" +#include "code\modules\spells\spell_types\shadow_walk.dm" +#include "code\modules\spells\spell_types\shapeshift.dm" +#include "code\modules\spells\spell_types\spacetime_distortion.dm" +#include "code\modules\spells\spell_types\summonitem.dm" +#include "code\modules\spells\spell_types\taeclowndo.dm" +#include "code\modules\spells\spell_types\telepathy.dm" +#include "code\modules\spells\spell_types\the_traps.dm" +#include "code\modules\spells\spell_types\touch_attacks.dm" +#include "code\modules\spells\spell_types\trigger.dm" +#include "code\modules\spells\spell_types\turf_teleport.dm" +#include "code\modules\spells\spell_types\voice_of_god.dm" +#include "code\modules\spells\spell_types\wizard.dm" +#include "code\modules\station_goals\bsa.dm" +#include "code\modules\station_goals\dna_vault.dm" +#include "code\modules\station_goals\shield.dm" +#include "code\modules\station_goals\station_goal.dm" +#include "code\modules\surgery\amputation.dm" +#include "code\modules\surgery\brain_surgery.dm" +#include "code\modules\surgery\breast_augmentation.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\embalming.dm" +#include "code\modules\surgery\experimental_dissection.dm" +#include "code\modules\surgery\eye_surgery.dm" +#include "code\modules\surgery\graft_synthtissue.dm" +#include "code\modules\surgery\healing.dm" +#include "code\modules\surgery\helpers.dm" +#include "code\modules\surgery\implant_removal.dm" +#include "code\modules\surgery\limb_augmentation.dm" +#include "code\modules\surgery\lipoplasty.dm" +#include "code\modules\surgery\lobectomy.dm" +#include "code\modules\surgery\mechanic_steps.dm" +#include "code\modules\surgery\nutcracker.dm" +#include "code\modules\surgery\organ_manipulation.dm" +#include "code\modules\surgery\organic_steps.dm" +#include "code\modules\surgery\penis_augmentation.dm" +#include "code\modules\surgery\plastic_surgery.dm" +#include "code\modules\surgery\prosthetic_replacement.dm" +#include "code\modules\surgery\remove_embedded_object.dm" +#include "code\modules\surgery\surgery.dm" +#include "code\modules\surgery\surgery_step.dm" +#include "code\modules\surgery\tools.dm" +#include "code\modules\surgery\advanced\brainwashing.dm" +#include "code\modules\surgery\advanced\lobotomy.dm" +#include "code\modules\surgery\advanced\necrotic_revival.dm" +#include "code\modules\surgery\advanced\pacification.dm" +#include "code\modules\surgery\advanced\revival.dm" +#include "code\modules\surgery\advanced\toxichealing.dm" +#include "code\modules\surgery\advanced\viral_bonding.dm" +#include "code\modules\surgery\advanced\bioware\bioware.dm" +#include "code\modules\surgery\advanced\bioware\bioware_surgery.dm" +#include "code\modules\surgery\advanced\bioware\ligament_hook.dm" +#include "code\modules\surgery\advanced\bioware\ligament_reinforcement.dm" +#include "code\modules\surgery\advanced\bioware\muscled_veins.dm" +#include "code\modules\surgery\advanced\bioware\nerve_grounding.dm" +#include "code\modules\surgery\advanced\bioware\nerve_splicing.dm" +#include "code\modules\surgery\advanced\bioware\vein_threading.dm" +#include "code\modules\surgery\bodyparts\bodyparts.dm" +#include "code\modules\surgery\bodyparts\broken.dm" +#include "code\modules\surgery\bodyparts\dismemberment.dm" +#include "code\modules\surgery\bodyparts\head.dm" +#include "code\modules\surgery\bodyparts\helpers.dm" +#include "code\modules\surgery\bodyparts\robot_bodyparts.dm" +#include "code\modules\surgery\organs\appendix.dm" +#include "code\modules\surgery\organs\augments_arms.dm" +#include "code\modules\surgery\organs\augments_chest.dm" +#include "code\modules\surgery\organs\augments_eyes.dm" +#include "code\modules\surgery\organs\augments_internal.dm" +#include "code\modules\surgery\organs\autosurgeon.dm" +#include "code\modules\surgery\organs\ears.dm" +#include "code\modules\surgery\organs\eyes.dm" +#include "code\modules\surgery\organs\heart.dm" +#include "code\modules\surgery\organs\helpers.dm" +#include "code\modules\surgery\organs\liver.dm" +#include "code\modules\surgery\organs\lungs.dm" +#include "code\modules\surgery\organs\organ_internal.dm" +#include "code\modules\surgery\organs\stomach.dm" +#include "code\modules\surgery\organs\tails.dm" +#include "code\modules\surgery\organs\tongue.dm" +#include "code\modules\surgery\organs\vocal_cords.dm" +#include "code\modules\tgs\includes.dm" +#include "code\modules\tgui\external.dm" +#include "code\modules\tgui\states.dm" +#include "code\modules\tgui\subsystem.dm" +#include "code\modules\tgui\tgui.dm" +#include "code\modules\tgui\states\admin.dm" +#include "code\modules\tgui\states\always.dm" +#include "code\modules\tgui\states\conscious.dm" +#include "code\modules\tgui\states\contained.dm" +#include "code\modules\tgui\states\deep_inventory.dm" +#include "code\modules\tgui\states\default.dm" +#include "code\modules\tgui\states\hands.dm" +#include "code\modules\tgui\states\human_adjacent.dm" +#include "code\modules\tgui\states\inventory.dm" +#include "code\modules\tgui\states\language_menu.dm" +#include "code\modules\tgui\states\not_incapacitated.dm" +#include "code\modules\tgui\states\notcontained.dm" +#include "code\modules\tgui\states\observer.dm" +#include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\zlevel.dm" +#include "code\modules\tooltip\tooltip.dm" +#include "code\modules\unit_tests\_unit_tests.dm" +#include "code\modules\uplink\uplink_devices.dm" +#include "code\modules\uplink\uplink_items.dm" +#include "code\modules\uplink\uplink_purchase_log.dm" +#include "code\modules\vehicles\_vehicle.dm" +#include "code\modules\vehicles\atv.dm" +#include "code\modules\vehicles\bicycle.dm" +#include "code\modules\vehicles\lavaboat.dm" +#include "code\modules\vehicles\motorized_wheelchair.dm" +#include "code\modules\vehicles\pimpin_ride.dm" +#include "code\modules\vehicles\ridden.dm" +#include "code\modules\vehicles\scooter.dm" +#include "code\modules\vehicles\sealed.dm" +#include "code\modules\vehicles\secway.dm" +#include "code\modules\vehicles\speedbike.dm" +#include "code\modules\vehicles\vehicle_actions.dm" +#include "code\modules\vehicles\vehicle_key.dm" +#include "code\modules\vehicles\wheelchair.dm" +#include "code\modules\vehicles\cars\car.dm" +#include "code\modules\vehicles\cars\clowncar.dm" +#include "code\modules\vending\_vending.dm" +#include "code\modules\vending\assist.dm" +#include "code\modules\vending\autodrobe.dm" +#include "code\modules\vending\boozeomat.dm" +#include "code\modules\vending\cartridge.dm" +#include "code\modules\vending\cigarette.dm" +#include "code\modules\vending\clothesmate.dm" +#include "code\modules\vending\coffee.dm" +#include "code\modules\vending\cola.dm" +#include "code\modules\vending\drinnerware.dm" +#include "code\modules\vending\engineering.dm" +#include "code\modules\vending\engivend.dm" +#include "code\modules\vending\games.dm" +#include "code\modules\vending\liberation.dm" +#include "code\modules\vending\liberation_toy.dm" +#include "code\modules\vending\magivend.dm" +#include "code\modules\vending\medical.dm" +#include "code\modules\vending\medical_wall.dm" +#include "code\modules\vending\megaseed.dm" +#include "code\modules\vending\nutrimax.dm" +#include "code\modules\vending\plasmaresearch.dm" +#include "code\modules\vending\robotics.dm" +#include "code\modules\vending\security.dm" +#include "code\modules\vending\snack.dm" +#include "code\modules\vending\sovietsoda.dm" +#include "code\modules\vending\sustenance.dm" +#include "code\modules\vending\toys.dm" +#include "code\modules\vending\wardrobes.dm" +#include "code\modules\vending\youtool.dm" +#include "code\modules\VR\vr_human.dm" +#include "code\modules\VR\vr_sleeper.dm" +#include "code\modules\zombie\items.dm" +#include "code\modules\zombie\organs.dm" +#include "hyperstation\code\__DEFINES\economy.dm" +#include "hyperstation\code\__DEFINES\wendigo.dm" +#include "hyperstation\code\controllers\subsystem\economy.dm" +#include "hyperstation\code\datums\actions.dm" +#include "hyperstation\code\datums\components\crafting\bounties.dm" +#include "hyperstation\code\datums\components\crafting\recipes.dm" +#include "hyperstation\code\datums\ert_hazard_cleanup.dm" +#include "hyperstation\code\datums\elements\holder_micro.dm" +#include "hyperstation\code\datums\mood_events\events.dm" +#include "hyperstation\code\datums\ruins\lavaland.dm" +#include "hyperstation\code\datums\traits\good.dm" +#include "hyperstation\code\datums\traits\neutral.dm" +#include "hyperstation\code\datums\weather\oxygen_rain.dm" +#include "hyperstation\code\game\objects\railings.dm" +#include "hyperstation\code\game\objects\items\cosmetics.dm" +#include "hyperstation\code\game\objects\items\storage\big_bag.dm" +#include "hyperstation\code\game\objects\structures\ghost_role_spawners.dm" +#include "hyperstation\code\gamemode\traitor_lewd.dm" +#include "hyperstation\code\gamemode\traitor_thief.dm" +#include "hyperstation\code\gamemode\werewolf\werewolf.dm" +#include "hyperstation\code\hyperbot\hyperbot.dm" +#include "hyperstation\code\mobs\carrion.dm" +#include "hyperstation\code\mobs\dancer.dm" +#include "hyperstation\code\mobs\hugbot.dm" +#include "hyperstation\code\mobs\mimic.dm" +#include "hyperstation\code\mobs\werewolf.dm" +#include "hyperstation\code\modules\pen.dm" +#include "hyperstation\code\modules\traits.dm" +#include "hyperstation\code\modules\admin\verbs\hyperverbs.dm" +#include "hyperstation\code\modules\antagonists\wendigo\datums_hud.dm" +#include "hyperstation\code\modules\antagonists\wendigo\forest\structures\soul_storage.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\_on_click.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\defines_init.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\examine.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\metabolization.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_defense.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\mob_equip.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\organs_bodyparts.dm" +#include "hyperstation\code\modules\antagonists\wendigo\mob\update_icons.dm" +#include "hyperstation\code\modules\antagonists\werewolf\werewolf.dm" +#include "hyperstation\code\modules\arousal\arousalhud.dm" +#include "hyperstation\code\modules\cargo\exports\engineering.dm" +#include "hyperstation\code\modules\cargo\exports\sweatshop.dm" +#include "hyperstation\code\modules\cargo\packs\misc.dm" +#include "hyperstation\code\modules\cargo\sweatshop\metal.dm" +#include "hyperstation\code\modules\cargo\sweatshop\sweatshop.dm" +#include "hyperstation\code\modules\cargo\sweatshop\wooden.dm" +#include "hyperstation\code\modules\client\loadout\glasses.dm" +#include "hyperstation\code\modules\client\loadout\tablet.dm" +#include "hyperstation\code\modules\clothing\gloves.dm" +#include "hyperstation\code\modules\clothing\head.dm" +#include "hyperstation\code\modules\clothing\glasses\polychromic_glasses.dm" +#include "hyperstation\code\modules\clothing\spacesuits\hardsuit.dm" +#include "hyperstation\code\modules\clothing\suits\misc.dm" +#include "hyperstation\code\modules\clothing\under\under.dm" +#include "hyperstation\code\modules\economy\account.dm" +#include "hyperstation\code\modules\integrated_electronics\input.dm" +#include "hyperstation\code\modules\mining\shelters.dm" +#include "hyperstation\code\modules\mining\equipment\survival_pod.dm" +#include "hyperstation\code\modules\mob\mob_helpers.dm" +#include "hyperstation\code\modules\mob\living\status_indicators.dm" +#include "hyperstation\code\modules\mob\living\silicon\robot\robot.dm" +#include "hyperstation\code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "hyperstation\code\modules\patreon\patreon.dm" +#include "hyperstation\code\modules\power\reactor\fuel_rods.dm" +#include "hyperstation\code\modules\power\reactor\rbmk.dm" +#include "hyperstation\code\modules\power\reactor\reactor_cargo.dm" +#include "hyperstation\code\modules\reagents\chemistry\reagents\food_reagents.dm" +#include "hyperstation\code\modules\reagents\chemistry\reagents\hydroponics_reactions.dm" +#include "hyperstation\code\modules\resize\resize_action.dm" +#include "hyperstation\code\modules\resize\resizing.dm" +#include "hyperstation\code\modules\resize\sizechems.dm" +#include "hyperstation\code\modules\resize\sizegun.dm" +#include "hyperstation\code\modules\surgery\organs\augments_arms.dm" +#include "hyperstation\code\modules\uplink\uplink_items.dm" +#include "hyperstation\code\obj\ashtray.dm" +#include "hyperstation\code\obj\bluespace sewing kit.dm" +#include "hyperstation\code\obj\condom.dm" +#include "hyperstation\code\obj\decal.dm" +#include "hyperstation\code\obj\economy.dm" +#include "hyperstation\code\obj\fleshlight.dm" +#include "hyperstation\code\obj\fluff.dm" +#include "hyperstation\code\obj\kinkyclothes.dm" +#include "hyperstation\code\obj\leash.dm" +#include "hyperstation\code\obj\lunaritems.dm" +#include "hyperstation\code\obj\milking machine.dm" +#include "hyperstation\code\obj\plushes.dm" +#include "hyperstation\code\obj\pole.dm" +#include "hyperstation\code\obj\pregnancytester.dm" +#include "hyperstation\code\obj\rewards.dm" +#include "hyperstation\code\obj\rope.dm" +#include "hyperstation\code\obj\sizeitems.dm" +#include "hyperstation\code\obj\sounding.dm" +#include "hyperstation\code\obj\vibrator.dm" +#include "interface\interface.dm" +#include "interface\menu.dm" +#include "interface\stylesheet.dm" +#include "modular_citadel\code\init.dm" +#include "modular_citadel\code\__HELPERS\list2list.dm" +#include "modular_citadel\code\__HELPERS\lists.dm" +#include "modular_citadel\code\__HELPERS\mobs.dm" +#include "modular_citadel\code\_globalvars\lists\mobs.dm" +#include "modular_citadel\code\_onclick\click.dm" +#include "modular_citadel\code\_onclick\item_attack.dm" +#include "modular_citadel\code\_onclick\other_mobs.dm" +#include "modular_citadel\code\_onclick\hud\screen_objects.dm" +#include "modular_citadel\code\_onclick\hud\sprint.dm" +#include "modular_citadel\code\_onclick\hud\stamina.dm" +#include "modular_citadel\code\controllers\configuration\entries\general.dm" +#include "modular_citadel\code\controllers\subsystem\job.dm" +#include "modular_citadel\code\datums\components\material_container.dm" +#include "modular_citadel\code\datums\components\phantomthief.dm" +#include "modular_citadel\code\datums\components\souldeath.dm" +#include "modular_citadel\code\datums\mood_events\chem_events.dm" +#include "modular_citadel\code\datums\mood_events\generic_negative_events.dm" +#include "modular_citadel\code\datums\mood_events\generic_positive_events.dm" +#include "modular_citadel\code\datums\mood_events\moodular.dm" +#include "modular_citadel\code\datums\mutations\hulk.dm" +#include "modular_citadel\code\datums\status_effects\chems.dm" +#include "modular_citadel\code\datums\status_effects\debuffs.dm" +#include "modular_citadel\code\datums\traits\negative.dm" +#include "modular_citadel\code\datums\traits\neutral.dm" +#include "modular_citadel\code\datums\wires\airlock.dm" +#include "modular_citadel\code\datums\wires\autoylathe.dm" +#include "modular_citadel\code\game\area\cit_areas.dm" +#include "modular_citadel\code\game\gamemodes\gangs\dominator.dm" +#include "modular_citadel\code\game\gamemodes\gangs\dominator_countdown.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_datums.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_decals.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_hud.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_items.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gang_pen.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gangs.dm" +#include "modular_citadel\code\game\gamemodes\gangs\gangtool.dm" +#include "modular_citadel\code\game\gamemodes\gangs\implant_gang.dm" +#include "modular_citadel\code\game\gamemodes\miniantags\bot_swarm\swarmer_event.dm" +#include "modular_citadel\code\game\gamemodes\revolution\revolution.dm" +#include "modular_citadel\code\game\machinery\cryopod.dm" +#include "modular_citadel\code\game\machinery\displaycases.dm" +#include "modular_citadel\code\game\machinery\Sleeper.dm" +#include "modular_citadel\code\game\machinery\toylathe.dm" +#include "modular_citadel\code\game\machinery\vending.dm" +#include "modular_citadel\code\game\machinery\wishgranter.dm" +#include "modular_citadel\code\game\machinery\doors\airlock.dm" +#include "modular_citadel\code\game\machinery\doors\airlock_types.dm" +#include "modular_citadel\code\game\objects\cit_screenshake.dm" +#include "modular_citadel\code\game\objects\items.dm" +#include "modular_citadel\code\game\objects\tools.dm" +#include "modular_citadel\code\game\objects\effects\spawner\spawners.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\impact.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\muzzle.dm" +#include "modular_citadel\code\game\objects\effects\temporary_visuals\projectiles\tracer.dm" +#include "modular_citadel\code\game\objects\items\balls.dm" +#include "modular_citadel\code\game\objects\items\boombox.dm" +#include "modular_citadel\code\game\objects\items\holy_weapons.dm" +#include "modular_citadel\code\game\objects\items\honk.dm" +#include "modular_citadel\code\game\objects\items\stunsword.dm" +#include "modular_citadel\code\game\objects\items\vending_items.dm" +#include "modular_citadel\code\game\objects\items\circuitboards\machine_circuitboards.dm" +#include "modular_citadel\code\game\objects\items\devices\aicard.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\encryptionkey.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\headset.dm" +#include "modular_citadel\code\game\objects\items\devices\radio\shockcollar.dm" +#include "modular_citadel\code\game\objects\items\melee\eutactic_blades.dm" +#include "modular_citadel\code\game\objects\items\melee\misc.dm" +#include "modular_citadel\code\game\objects\items\robot\robot_upgrades.dm" +#include "modular_citadel\code\game\objects\items\storage\firstaid.dm" +#include "modular_citadel\code\game\objects\structures\tables_racks.dm" +#include "modular_citadel\code\game\objects\structures\beds_chairs\chair.dm" +#include "modular_citadel\code\game\objects\structures\beds_chairs\sofa.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\fitness.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\wardrobe.dm" +#include "modular_citadel\code\game\objects\structures\crates_lockers\closets\secure\citadel_lockers.dm" +#include "modular_citadel\code\game\turfs\cit_turfs.dm" +#include "modular_citadel\code\modules\admin\chat_commands.dm" +#include "modular_citadel\code\modules\admin\holder2.dm" +#include "modular_citadel\code\modules\admin\secrets.dm" +#include "modular_citadel\code\modules\arousal\arousal.dm" +#include "modular_citadel\code\modules\arousal\organs\belly.dm" +#include "modular_citadel\code\modules\arousal\organs\breasts.dm" +#include "modular_citadel\code\modules\arousal\organs\eggsack.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals.dm" +#include "modular_citadel\code\modules\arousal\organs\genitals_sprite_accessories.dm" +#include "modular_citadel\code\modules\arousal\organs\ovipositor.dm" +#include "modular_citadel\code\modules\arousal\organs\penis.dm" +#include "modular_citadel\code\modules\arousal\organs\testicles.dm" +#include "modular_citadel\code\modules\arousal\organs\vagina.dm" +#include "modular_citadel\code\modules\arousal\organs\womb.dm" +#include "modular_citadel\code\modules\arousal\toys\dildos.dm" +#include "modular_citadel\code\modules\awaymissions\citadel_ghostrole_spawners.dm" +#include "modular_citadel\code\modules\cargo\console.dm" +#include "modular_citadel\code\modules\client\client_defines.dm" +#include "modular_citadel\code\modules\client\client_procs.dm" +#include "modular_citadel\code\modules\client\preferences.dm" +#include "modular_citadel\code\modules\client\preferences_savefile.dm" +#include "modular_citadel\code\modules\client\preferences_toggles.dm" +#include "modular_citadel\code\modules\client\loadout\__donator.dm" +#include "modular_citadel\code\modules\client\loadout\_medical.dm" +#include "modular_citadel\code\modules\client\loadout\_security.dm" +#include "modular_citadel\code\modules\client\loadout\_service.dm" +#include "modular_citadel\code\modules\client\loadout\backpack.dm" +#include "modular_citadel\code\modules\client\loadout\glasses.dm" +#include "modular_citadel\code\modules\client\loadout\gloves.dm" +#include "modular_citadel\code\modules\client\loadout\hands.dm" +#include "modular_citadel\code\modules\client\loadout\head.dm" +#include "modular_citadel\code\modules\client\loadout\loadout.dm" +#include "modular_citadel\code\modules\client\loadout\mask.dm" +#include "modular_citadel\code\modules\client\loadout\neck.dm" +#include "modular_citadel\code\modules\client\loadout\shoes.dm" +#include "modular_citadel\code\modules\client\loadout\suit.dm" +#include "modular_citadel\code\modules\client\loadout\uniform.dm" +#include "modular_citadel\code\modules\client\verbs\who.dm" +#include "modular_citadel\code\modules\clothing\clothing.dm" +#include "modular_citadel\code\modules\clothing\neck.dm" +#include "modular_citadel\code\modules\clothing\glasses\phantomthief.dm" +#include "modular_citadel\code\modules\clothing\head\head.dm" +#include "modular_citadel\code\modules\clothing\spacesuits\flightsuit.dm" +#include "modular_citadel\code\modules\clothing\suits\polychromic_cloaks.dm" +#include "modular_citadel\code\modules\clothing\suits\polychromic_suit.dm" +#include "modular_citadel\code\modules\clothing\suits\suits.dm" +#include "modular_citadel\code\modules\clothing\under\polychromic_clothes.dm" +#include "modular_citadel\code\modules\clothing\under\trek_under.dm" +#include "modular_citadel\code\modules\clothing\under\turtlenecks.dm" +#include "modular_citadel\code\modules\clothing\under\under.dm" +#include "modular_citadel\code\modules\crafting\recipes.dm" +#include "modular_citadel\code\modules\custom_loadout\custom_items.dm" +#include "modular_citadel\code\modules\custom_loadout\load_to_mob.dm" +#include "modular_citadel\code\modules\custom_loadout\read_from_file.dm" +#include "modular_citadel\code\modules\events\blob.dm" +#include "modular_citadel\code\modules\events\wizard\magicarp.dm" +#include "modular_citadel\code\modules\integrated_electronics\subtypes\manipulation.dm" +#include "modular_citadel\code\modules\mentor\follow.dm" +#include "modular_citadel\code\modules\mentor\mentor.dm" +#include "modular_citadel\code\modules\mentor\mentor_memo.dm" +#include "modular_citadel\code\modules\mentor\mentor_verbs.dm" +#include "modular_citadel\code\modules\mentor\mentorhelp.dm" +#include "modular_citadel\code\modules\mentor\mentorpm.dm" +#include "modular_citadel\code\modules\mentor\mentorsay.dm" +#include "modular_citadel\code\modules\mining\mining_ruins.dm" +#include "modular_citadel\code\modules\mob\cit_emotes.dm" +#include "modular_citadel\code\modules\mob\dead\new_player\sprite_accessories.dm" +#include "modular_citadel\code\modules\mob\living\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\living.dm" +#include "modular_citadel\code\modules\mob\living\carbon\carbon.dm" +#include "modular_citadel\code\modules\mob\living\carbon\damage_procs.dm" +#include "modular_citadel\code\modules\mob\living\carbon\life.dm" +#include "modular_citadel\code\modules\mob\living\carbon\reindex_screams.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human_defense.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\human_movement.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\life.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\furrypeople.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\ipc.dm" +#include "modular_citadel\code\modules\mob\living\carbon\human\species_types\jellypeople.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\dogborg_equipment.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_modules.dm" +#include "modular_citadel\code\modules\mob\living\silicon\robot\robot_movement.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\banana_spider.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\kiwi.dm" +#include "modular_citadel\code\modules\mob\living\simple_animal\simplemob_vore_values.dm" +#include "modular_citadel\code\modules\power\lighting.dm" +#include "modular_citadel\code\modules\projectiles\gun.dm" +#include "modular_citadel\code\modules\projectiles\ammunition\caseless.dm" +#include "modular_citadel\code\modules\projectiles\ammunition\ballistic\smg\smg.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\ammo_boxes.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\pistol.dm" +#include "modular_citadel\code\modules\projectiles\boxes_magazines\external\smg\smg.dm" +#include "modular_citadel\code\modules\projectiles\bullets\bullets\smg.dm" +#include "modular_citadel\code\modules\projectiles\guns\pumpenergy.dm" +#include "modular_citadel\code\modules\projectiles\guns\toys.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\handguns.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\magweapon_energy.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\revolver.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\rifles.dm" +#include "modular_citadel\code\modules\projectiles\guns\ballistic\spinfusor.dm" +#include "modular_citadel\code\modules\projectiles\guns\energy\energy_gun.dm" +#include "modular_citadel\code\modules\projectiles\guns\energy\laser.dm" +#include "modular_citadel\code\modules\projectiles\projectiles\reusable.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\astrogen.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\eigentstasium.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\enlargement.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\fermi_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\healing.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\MKUltra.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\other_reagents.dm" +#include "modular_citadel\code\modules\reagents\chemistry\reagents\SDGF.dm" +#include "modular_citadel\code\modules\reagents\chemistry\recipes\fermi.dm" +#include "modular_citadel\code\modules\reagents\objects\clothes.dm" +#include "modular_citadel\code\modules\reagents\objects\items.dm" +#include "modular_citadel\code\modules\reagents\reagents\cit_reagents.dm" +#include "modular_citadel\code\modules\recycling\disposal\bin.dm" +#include "modular_citadel\code\modules\research\designs\autoylathe_designs.dm" +#include "modular_citadel\code\modules\research\designs\machine_designs.dm" +#include "modular_citadel\code\modules\research\designs\xenobio_designs.dm" +#include "modular_citadel\code\modules\research\techweb\_techweb.dm" +#include "modular_citadel\code\modules\research\xenobiology\xenobio_camera.dm" +#include "modular_citadel\code\modules\vehicles\secway.dm" +#include "modular_citadel\code\modules\vore\hook-defs_vr.dm" +#include "modular_citadel\code\modules\vore\persistence.dm" +#include "modular_citadel\code\modules\vore\trycatch_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_dat_vr.dm" +#include "modular_citadel\code\modules\vore\eating\belly_obj_vr.dm" +#include "modular_citadel\code\modules\vore\eating\bellymodes_vr.dm" +#include "modular_citadel\code\modules\vore\eating\digest_act_vr.dm" +#include "modular_citadel\code\modules\vore\eating\living_vr.dm" +#include "modular_citadel\code\modules\vore\eating\vore_vr.dm" +#include "modular_citadel\code\modules\vore\eating\voreitems.dm" +#include "modular_citadel\code\modules\vore\eating\vorepanel_vr.dm" +#include "modular_citadel\interface\skin.dmf" +#include "yogstation\code\modules\power\energyharvester.dm" +// END_INCLUDE From b1cb8dc08336c23da4bc61696905d56efb59b822 Mon Sep 17 00:00:00 2001 From: Archie Date: Fri, 4 Jun 2021 15:24:00 -0300 Subject: [PATCH 06/14] broken --- code/game/objects/items/storage/fancy.dm | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 8754a2cc..32bf2823 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -281,6 +281,7 @@ w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper_pack" + ///The value in here has NOTHING to do with icons. It needs to be this for the proper examine. icon_type = "rolling paper" spawn_type = /obj/item/rollingpaper price = 2 @@ -291,10 +292,14 @@ STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/rollingpaper)) -/obj/item/storage/fancy/rollingpapers/update_icon() - cut_overlays() +///Overrides to do nothing because fancy boxes are fucking insane. +/obj/item/storage/fancy/rollingpapers/update_icon_state() + return + +/obj/item/storage/fancy/rollingpapers/update_overlays() + . = ..() if(!contents.len) - add_overlay("[icon_state]_empty") + . += "[icon_state]_empty" ///////////// //CIGAR BOX// From 8de3503b13d4c3f549bd3c2ea1d796ba0b0de275 Mon Sep 17 00:00:00 2001 From: Archie Date: Fri, 4 Jun 2021 15:50:47 -0300 Subject: [PATCH 07/14] Revert "broken" This reverts commit b1cb8dc08336c23da4bc61696905d56efb59b822. --- code/game/objects/items/storage/fancy.dm | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/code/game/objects/items/storage/fancy.dm b/code/game/objects/items/storage/fancy.dm index 32bf2823..8754a2cc 100644 --- a/code/game/objects/items/storage/fancy.dm +++ b/code/game/objects/items/storage/fancy.dm @@ -281,7 +281,6 @@ w_class = WEIGHT_CLASS_TINY icon = 'icons/obj/cigarettes.dmi' icon_state = "cig_paper_pack" - ///The value in here has NOTHING to do with icons. It needs to be this for the proper examine. icon_type = "rolling paper" spawn_type = /obj/item/rollingpaper price = 2 @@ -292,14 +291,10 @@ STR.max_items = 10 STR.can_hold = typecacheof(list(/obj/item/rollingpaper)) -///Overrides to do nothing because fancy boxes are fucking insane. -/obj/item/storage/fancy/rollingpapers/update_icon_state() - return - -/obj/item/storage/fancy/rollingpapers/update_overlays() - . = ..() +/obj/item/storage/fancy/rollingpapers/update_icon() + cut_overlays() if(!contents.len) - . += "[icon_state]_empty" + add_overlay("[icon_state]_empty") ///////////// //CIGAR BOX// From fbd8d02ebb03205fac54973cdc9b7985bab46f00 Mon Sep 17 00:00:00 2001 From: Archie Date: Fri, 4 Jun 2021 16:31:31 -0300 Subject: [PATCH 08/14] Matchbox runtime fix --- code/datums/components/storage/concrete/_concrete.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index eb900a18..1afe7924 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -66,7 +66,7 @@ /datum/component/storage/concrete/_insert_physical_item(obj/item/I, override = FALSE) . = TRUE var/atom/real_location = real_location() - if(I.loc != real_location) + if(I.loc != real_location && real_location) I.forceMove(real_location) refresh_mob_views() From 011752f1d2d4e4796aff97e7a8e0ac2a4464aae0 Mon Sep 17 00:00:00 2001 From: Archie Date: Sat, 5 Jun 2021 01:50:46 -0300 Subject: [PATCH 09/14] Runtimes, Generator Changes --- code/datums/beam.dm | 3 +- code/modules/power/generator.dm | 30 ++++++++++++++----- .../code/modules/power/reactor/rbmk.dm | 4 +-- 3 files changed, 27 insertions(+), 10 deletions(-) diff --git a/code/datums/beam.dm b/code/datums/beam.dm index d97ee9a7..2622b6ae 100644 --- a/code/datums/beam.dm +++ b/code/datums/beam.dm @@ -83,6 +83,7 @@ elements.Cut() /datum/beam/Destroy() + finished = TRUE Reset() target = null origin = null @@ -100,7 +101,7 @@ var/length = round(sqrt((DX)**2+(DY)**2)) //hypotenuse of the triangle formed by target and origin's displacement for(N in 0 to length-1 step 32)//-1 as we want < not <=, but we want the speed of X in Y to Z and step X - if(QDELETED(src) || finished) + if(finished) break var/obj/effect/ebeam/X = new beam_type(origin_oldloc) X.owner = src diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 1515485a..0df43ecc 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -166,7 +166,7 @@ playsound(src.loc, sound_engine_alert1, 55, 0) if (prob(5)) playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - zapStuff(src, 5, min(genlev, 20000)) + zapStuff(src, 10, genlev) if (!grumping && grump >= 100 && prob(5)) grumping = 1 playsound(src.loc, "sound/machines/engine_grump1.ogg", 50, 0) @@ -178,7 +178,7 @@ playsound(src.loc, sound_engine_alert2, 55, 0) if (prob(10)) // lowering a bit more playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - zapStuff(src, 5, min(genlev, 20000)) + zapStuff(src, 10, genlev) if (prob(5)) src.visible_message("[src] starts smoking!") if (!grumping && grump >= 100 && prob(10)) // probably not good if this happens several times in a row @@ -210,21 +210,31 @@ if (prob(get_dist(W,src.loc)*6)) continue W.deconstruct(FALSE) - for (var/mob/living/M in range(6, src.loc)) + for (var/mob/living/M in range(9, src.loc)) shake_camera(M, 3, 16) grumping = 0 grump -= 30 if (prob(33)) // lowered because all the DEL procs related to zap are stacking up in the profiler if(prob(5)) playsound(src.loc, sound_bigzap, 100, 1, extrarange = 10) - zapStuff(src, 5, min(genlev, 30000)) //BIG ZAP + zapStuff(src, 10, genlev*2) //BIG ZAP else playsound(src.loc, 'sound/weapons/emitter2.ogg', 100, 1, extrarange = 10) - zapStuff(src, 5, min(genlev, 20000)) + zapStuff(src, 10, genlev) if(prob(5)) src.visible_message("[src] [pick("rumbles", "groans", "shudders", "grustles", "hums", "thrums")] [pick("ominously", "oddly", "strangely", "oddly", "worringly", "softly", "loudly")]!") else if (prob(2)) src.visible_message("[src] hungers!") + shake_animation(1) + playsound(loc, 'sound/machines/clockcult/steam_whoosh.ogg', 75, TRUE) + var/turf/T = get_turf(src) + switch(rand(1,3)) + if(1) + T.atmos_spawn_air("co2=25;TEMP=300]") + if(2) + T.atmos_spawn_air("tritium=5;TEMP=500]") + if(3) + T.atmos_spawn_air("miasma=10;TEMP=500]") //brapgenerator ..() /obj/machinery/power/generator/proc/get_menu(include_link = TRUE) @@ -357,8 +367,13 @@ cold_circ.generator = null cold_circ = null -/obj/machinery/power/generator/proc/zapStuff(atom/zapstart, range = 3, power) - . = zapstart.dir +/obj/machinery/power/generator/proc/zapStuff(atom/zapstart, range = 5, power, icon_state) + playsound(zapstart, 'sound/magic/lightningshock.ogg', 100, 1, extrarange = range) + tesla_zap(zapstart, range, power, TESLA_MOB_DAMAGE | TESLA_MOB_STUN) + if(prob(10)) + //REDO THE ZAP. YES, THIS MEANS FUCK YOU. + zapStuff(zapstart, range*2, power) + /*. = zapstart.dir if(power < 1000) return @@ -424,3 +439,4 @@ zapStuff(target_structure, 5, power / 2) else zapStuff(target_structure, 5, power / 1.5) + */ diff --git a/hyperstation/code/modules/power/reactor/rbmk.dm b/hyperstation/code/modules/power/reactor/rbmk.dm index 39faa817..db8747ec 100644 --- a/hyperstation/code/modules/power/reactor/rbmk.dm +++ b/hyperstation/code/modules/power/reactor/rbmk.dm @@ -14,7 +14,7 @@ #define RBMK_MAX_CRITICALITY 3 //No more criticality than N for now. //#define RBMK_POWER_FLAVOURISER 1000 //To turn those KWs into something usable -#define RBMK_POWER_FLAVOURISER 2000 //Let's use double for now. +#define RBMK_POWER_FLAVOURISER 5000 //Let's use double for now. //Math. Lame. #define KPA_TO_PSI(A) (A/6.895) @@ -97,7 +97,7 @@ The reactor CHEWS through moderator. It does not do this slowly. Be very careful var/next_slowprocess = 0 var/gas_absorption_effectiveness = 0.5 var/gas_absorption_constant = 0.5 //We refer to this one as it's set on init, randomized. - var/minimum_coolant_level = 4 + var/minimum_coolant_level = 2 var/warning = FALSE //Have we begun warning the crew of their impending death? var/next_warning = 0 //To avoid spam. var/last_power_produced = 0 //For logging purposes From 852558a8638d22fbb2d6d8b3e325c7af452e5486 Mon Sep 17 00:00:00 2001 From: Archie Date: Sat, 5 Jun 2021 01:51:13 -0300 Subject: [PATCH 10/14] Text --- hyperstation/code/modules/power/reactor/rbmk.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hyperstation/code/modules/power/reactor/rbmk.dm b/hyperstation/code/modules/power/reactor/rbmk.dm index db8747ec..441e5ca3 100644 --- a/hyperstation/code/modules/power/reactor/rbmk.dm +++ b/hyperstation/code/modules/power/reactor/rbmk.dm @@ -14,7 +14,7 @@ #define RBMK_MAX_CRITICALITY 3 //No more criticality than N for now. //#define RBMK_POWER_FLAVOURISER 1000 //To turn those KWs into something usable -#define RBMK_POWER_FLAVOURISER 5000 //Let's use double for now. +#define RBMK_POWER_FLAVOURISER 5000 //Five times stronger. Previous numbers were baby numbers. //Math. Lame. #define KPA_TO_PSI(A) (A/6.895) From 62a15a68e361c4f77a862ee647516b18fd3b3c37 Mon Sep 17 00:00:00 2001 From: Archie Date: Sat, 5 Jun 2021 18:34:45 -0300 Subject: [PATCH 11/14] Fixes a major memory leak in shuttle code --- code/game/turfs/change_turf.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 84b6cbb3..93c21467 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -71,7 +71,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( // basic doesn't initialize and this will cause issues // no warning though because this can happen naturaly as a result of it being built on top of path = /turf/open/space - if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP)) // Don't no-op if the map loader requires it to be reconstructed + if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP) && (baseturfs == new_baseturfs)) // Don't no-op if the map loader requires it to be reconstructed, or if this is a new set of baseturfs return src if(flags & CHANGETURF_SKIP) return new path(src) From 56b18a7deb1f438087e65be6a34bb386a7e5e208 Mon Sep 17 00:00:00 2001 From: Archie Date: Sun, 6 Jun 2021 04:47:48 -0300 Subject: [PATCH 12/14] Dynamic Changes --- code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index c6f49fd8..66fe2c9f 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -17,6 +17,7 @@ weight = 5 cost = 10 requirements = list(101,101,30,25,20,20,15,15,15,15) + minimum_players = 15 high_population_requirement = 10 var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) chaos_min = 2.5 @@ -34,6 +35,7 @@ weight = 5 cost = 0 requirements = list(101,25,25,20,20,15,15,10,10,10) + minimum_players = 10 high_population_requirement = 10 //var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) chaos_min = 2.0 @@ -186,6 +188,7 @@ weight = 3 cost = 10 requirements = list(101,101,50,40,40,30,30,30,20,20) + minimum_players = 15 high_population_requirement = 10 var/team_mode_probability = 30 chaos_min = 3.0 From 51b9ee28f9c7a1e5f380777ac21200b05c0fdbf2 Mon Sep 17 00:00:00 2001 From: Archie Date: Sun, 6 Jun 2021 04:50:54 -0300 Subject: [PATCH 13/14] Midrounds --- code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index aa8bc56c..5282dfb1 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -213,6 +213,7 @@ weight = 4 cost = 10 requirements = list(101,101,30,25,20,20,15,15,15,10) + minimum_players = 15 repeatable = TRUE high_population_requirement = 10 flags = TRAITOR_RULESET @@ -229,6 +230,7 @@ weight = 4 cost = 5 requirements = list(101,30,25,20,15,10,10,5,5,5) + minimum_players = 10 repeatable = TRUE high_population_requirement = 10 flags = TRAITOR_RULESET From 7051d335aef64301094023a04e836a5c1fc647a4 Mon Sep 17 00:00:00 2001 From: Archie Date: Sun, 6 Jun 2021 04:52:09 -0300 Subject: [PATCH 14/14] 075 --- code/controllers/subsystem/vote.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index ede48a07..b56cf5a5 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -1,6 +1,6 @@ #define DYNAMIC_DEFAULT_CHAOS 1.0 //The default chaos value for low pop low vote rounds #define DYNAMIC_VOTE_NORMALIZATION 5 //If there are fewer than this many votes, the average will be skewed towards the default -#define DYNAMIC_NONVOTER_FACTOR 0.5 // 1 means they count for a full vote +#define DYNAMIC_NONVOTER_FACTOR 0.75 // 1 means they count for a full vote SUBSYSTEM_DEF(vote) name = "Vote"