From 46cc33b32c0e55d7bb5f026a3533dd85cc396327 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 24 Jun 2014 22:50:34 +0930 Subject: [PATCH 01/14] Added Tajaran furs and headscarf. --- code/modules/clothing/suits/alien.dm | 20 +++++++++++++++++++- icons/mob/head.dmi | Bin 110003 -> 110943 bytes icons/mob/species/tajaran/suit.dmi | Bin 4494 -> 5157 bytes icons/mob/suit.dmi | Bin 234006 -> 236335 bytes icons/obj/clothing/hats.dmi | Bin 57874 -> 58184 bytes icons/obj/clothing/suits.dmi | Bin 83733 -> 84536 bytes 6 files changed, 19 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm index 5b664f21b35..8b3c7de076f 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/alien.dm @@ -12,4 +12,22 @@ desc = "A rather grisly selection of cured hides and skin, sewn together to form a ragged mantle." icon_state = "mantle-unathi" item_state = "mantle-unathi" - body_parts_covered = UPPER_TORSO \ No newline at end of file + body_parts_covered = UPPER_TORSO + +//Taj clothing. + +/obj/item/clothing/suit/tajaran/furs + name = "heavy furs" + desc = "A traditional Zhan-Khazan garment." + icon_state = "zhan_furs" + item_state = "zhan_furs" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS + + sprite_sheets = list( + "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', + ) + +/obj/item/clothing/head/tajaran/scarf + name = "headscarf" + desc = "A scarf of coarse fabric. Seems to have ear-holes." + icon_state = "zhan_scarf" \ No newline at end of file diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index a36dcfbbdca4f317f0df7575f2112288618f248c..e47e5b240e7e0ec93f50f2ccb297ccd461423a78 100644 GIT binary patch delta 13992 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 delta 13045 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 diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 620da66a60c54f87c1e99323a5605fb420e250a6..d0eca318fd2b655231346279ebbb3a3c24f492b6 100644 GIT binary patch literal 5157 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 DJ&OV0 literal 4494 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 Xzl0uHr#n)98UOKGAprIZ#6U{ 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 A6#xJL delta 21010 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 diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 67d085a46b08acf4b32d42f7cb4c6c028030a006..9bd079b1e605e575cb9c6051a400a62cf3449bd1 100644 GIT binary patch delta 2545 zcmaJ>X*kr49-Xld29s?fWT}MkqAX*{GPab&*s^EOGQDrMiTO{Hm}Cp3TOqQHeeA?& z7)v4BSYD)fWlNT^Z)2|KxnJ&=dwY_%svP)z)dd3EdGw2z zFrkm$=FEM?g>FXXy7f^}=s+_QT&Q(>we70bd`$B*zW*n122Bgn=hV{a7NN>z~bvKP+_lhWQr*m!l+MnGaL#9rDzD&Ea$eLZs0*4g-W zl2zKT{blKFt(msqfPA4?FvLb_)<;k4aah<3M0j{15R~%;ueheH-q#du0C9>~n9!|( zY<^vj%8udyv%SCG_6@K{Y`nxHGS|J9vmPx4l2f#$)_crIn@NF=`riadG(DkfBe#P7 zexKm!A1qm45YrA0@?~0YZB>(h;k7>$!4ZcT=n*5-Z9K>jEolIy)B+;R)lbPIi8E}K zB`gYqbIaXv3#;0oIPksz?+?Fz!=+D8v^w=3R6cNUa6rQ+0oA^BwD#A2*v`6?E_de7}?3*7*=iE z9HHgxML&zn{{8gn(&3TW=ZPw=hBwYt4~_NDHK^fyXkfMmU!i;efS^!AqgZ~GpWakP zC12lE?OEUi-maMeXG#8fGFJL!3o4GkR?4ixM*Pax*nMVVdLre>T*eecxo)ZAX9k0?Z6m>cd zYG@tKbT?yG#<9~QZXYGT;Had43SYM{#`tzR+<(c@19x|BAD@x_25j~bpQ3XAqJYrA zm|kojx!_~$x?_$j5k>B~x9?o(f$FznyHh0XaiiVk0)&3za^a?a;)t8 znRZdA6%XeSX*i!G>hA^L@BH2L5z2fs4YbS&XmpyyDpNBP?HhfH9v--qCy)!Y&N)Nk zbzw`sYb-*mqeYugzcBi(!0kpu#4*I~bv@#WI6%H7GFY1P>5(V_`PH-gVlaOkhOO`yqn=dIs& z;Gg}k!qIfE;lcaB`GP%G~B{OC?c-}XH4A-NaUNP6BSXhuIg3Qg$ z2eEP%M&|`^O1-H*XQ@=`28R51LuigNFurx_utYDI!|jR-zJINi6#VDnKwCjC^KthI zO)r-JoU%hrwHk?DH{UqDz&EupugiHtr$e`Q`NYn&@9gaSdcw(1@*9xc-rJK^SGRo> zrjuoEZSBWyWg?XOdJ)ITp$CU=Ct~Sl!x49EZ9VIpU!!U~fwzp^6 zSTiy*D9aD?N=mrRQY4Wml<>P-mn)IHf~y3nRt20l-VmPy_#|0Vq*a|ju>z;vGxyUDYXvd zzPFhN9aT5)izajbpig#L+Er^e)eMbBG5@vNtg|kADPos6@Cz9mYHKTas+gLV#scyW z3>-E(jk}B>U8YRskaHuc&k0r+9H?6)68t@{cfYcC{!Z{UaU~I+Q^;B1#kKCqT+>SRyoUy8U^ zU9C1ag&rJfM$wiN>g^#y&hQDIMl9vSy={jPsNfMIxey+~_7K!6tZ zxY3gVgLRhr@fpT*_}41F+iAQIz&v3L7uy!K@2+ee%xoQa)J)WR`oUV``6T{96Ty6v zy7Cf;a4TrmdO4Bk!6gVoUM@+}k^vz1WY<`g6%~2J+kJd|(#5LpYKqQ$=u(_~WCMw} zZ$4$ZJNmPc4>o2DAzb|fnHd=~`}DbY%+sLV89{hL(wkO}>MX>gChQvQ+Bv+CKwBsw{xA12LGx94$b^`5<8iIv$c| zf>C;S+(8`(Gje>Qu=MCk3}i6?J5@^_H1&Tpmqw?b2P33IsCBg5xMQJjy+17&Ev zY-w-r09Sh_wlL{jb{J#N8qv>@3 delta 2233 zcmah}XFMB<77uEa)T&*Iv})I=HdaJQxG3r>s`jW|vn4ddj8uz8bsObS4u37>nE5LEXA+1M-NA4U%cI+gW6utUOnOU-GhKVMHU8e9CaMBvY!t-=gl1%2{^K z>X(ayOQq*bVbM0ba=qkXY~AT;)aF{9EK;fiU^oE{m_4>OBkLg(9JmYt#Gb*`UL{H6D;X9M-s)%j8RXshn_z6h+We3E+Y1G#5vP;XEHwN|V%u;*Zq zQ6ezYaeAH*sNZyA#Yx^jm1v`rTn;onFY%gHadj{;X6m~E&39TaPo?<)NEvELQv#lB z#AZ)GGB?X1Uu#PRe4SG-EP#?-&&zU@nWi^ht3Z zwi(j?wq5pt?T~#sbTniDXXj&pRlqUWTA@>w%;|tKNO6zxMm<+WKSoTsHP321f3;4~ zfmKxOMS#?Tzb^#4&3>1~mK)>%vv_KAI`YTp_=Hj$S-xp1tov)SZ2sf>OJ!9%6uak{ zgi}t@UGQXc`8D5tlxb^eRa8Tod<&@A>k%LT&EP5?0|!TJl0oE&w2@KOZMqBwj}@DMAsiXuir5oy0cCswc`3< zNe-R>Tk}~&yHy_jvm89G@d)X6m?f(p`O9;xi$D#e079ct2=2g)v0Op&wb^IF(bdF?r7_k}u_RJtS60j+^#>KzdEuMBF}X zDz+;eNg|>C-0~c~i$bv1?eiG&i5l%&+;Hz32mysmC(Q4pq^hZ+%r@99VczWGgz@Va zgY2>$-Nvuym&L7C7cUorP9z979(48=nYA6bv%Wkv2$J9{4BtLWAlC?cI>WaS9#xJD z$Gxf2O3;pRJyai;k9~oCX2*0GcMc|B!sS8bw?LHWT>f|*kv?9BCXTO!>UQGZ3vTS! zrFS@M#6Q7cR49smAP|U0{Xc=-kaFI%Qw|0rBC72EUpU|j2viGTdxODHS%LpMp}(i+ zaUBfiX`RXF@4v-`k}V`Ct*xz%9BE}V=FAG!Ordtlp(=ma8fFyeOGKQwG5!V?7#YEK zvwu7C|4oz;(|NE>gzn}DPF`_SLoYA;U~#zgiVBrW$VV=w>S8b%e#-8y7O%8H(Apt& zex~J6Jo|w{n(hQtJ8jdN&Lb0hQza>?bp_s5U2}QuYtk{QyD55c4v@v;84Ndrd8e1K zYHK1_vNrk2p$m!B{{H0A)#RCAFj)wmfcL*`CrluK__-)6KZ|N=hO>W0m#~e>p+7cw|Ni@iL>*$PY!Q3vtLEPVE3Rfe&wm#Fg=joyS25LbnopaEpr&#QhWaBq1 zx0vO!QACzZYlMcuLVC=(%OWEm0{s02uD<3uJUk55maL|23_X%+sWP^+^ULvR;{d=l zY6XmR=ZYD+vwdT0X^*O1h`WQQ3QhjVk>uevC>?uo^t5YJ+&(5^&T=# z*yJ%|Ucs5Y8K15!EZVw=ChpGD)zhBN;4`gZuw`@Ycw$52lea||4rA(R!q>9D42_I{ zYDuK@?JrcSp@|8HBrj)B!#1(dU&5$}ACJeY>*)9+!Jm)z0)6T?XpREH756t!UI6bB2liaL*}-gT%hcwy4rfCgldYkDCvp;ySDa?N3|BGh!v<{Y}nRJxm4xVW&Cp#h_(GhR~6>sNmC$YH}STbBh@>91^9?p zYliwZ^!@uNA!b|b?Z1D*Rf0-!OOY?ab5Z7#yl+~i>)HyUJU@a%Qr7pZI$fLrGBuE* zW??x2>~%4US=LScYwjxnVA^o;UYKYXPA5X+!;Uxw2AgmP5JUgbo4}G2bq=N;nM?g2 b4PvnM>A5EBM_Rc6m}UmIVuw{3xhMV$(Eds2 diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index e9d1a3d3f03ffcb35281e06f9447fcf3bcd23f15..49fe023e48cdf40a77d1b8ae8cbceb885a58a20e 100644 GIT binary patch delta 10025 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 ZC9X_}R{zP6M-D(QWkn5zayiq${{I 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 From 515e78f76098ae2dcd2f39aa9c9ca5dbe85346ef Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Wed, 25 Jun 2014 15:47:38 +0930 Subject: [PATCH 02/14] First pass on custom loadouts. --- baystation12.dme | 1 + code/modules/client/preferences.dm | 6 ++-- code/modules/client/preferences_gear.dm | 43 +++++++++++++++++++++++ code/modules/mob/living/carbon/species.dm | 19 ++++++++-- 4 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 code/modules/client/preferences_gear.dm diff --git a/baystation12.dme b/baystation12.dme index 7e9ce53fac4..29b9bab6c9c 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -739,6 +739,7 @@ #include "code\modules\client\client defines.dm" #include "code\modules\client\client procs.dm" #include "code\modules\client\preferences.dm" +#include "code\modules\client\preferences_gear.dm" #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_toggles.dm" #include "code\modules\clothing\clothing.dm" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index f2d835d2a5f..2e32dfed3aa 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -73,8 +73,9 @@ datum/preferences var/r_eyes = 0 //Eye color var/g_eyes = 0 //Eye color var/b_eyes = 0 //Eye color - var/species = "Human" + var/species = "Human" //Species datum to use. var/language = "None" //Secondary language + var/datum/gear //Custom/fluff item loadout. //Mob preview var/icon/preview_icon = null @@ -104,7 +105,6 @@ datum/preferences // maps each organ to either null(intact), "cyborg" or "amputated" // will probably not be able to do this for head and torso ;) var/list/organ_data = list() - var/list/player_alt_titles = new() // the default name of a job like "Medical Doctor" var/flavor_text = "" @@ -132,6 +132,8 @@ datum/preferences gender = pick(MALE, FEMALE) real_name = random_name(gender) + gear = new /datum/gear() + /datum/preferences proc/ZeroSkills(var/forced = 0) for(var/V in SKILLS) for(var/datum/skill/S in SKILLS[V]) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm new file mode 100644 index 00000000000..a9a10574300 --- /dev/null +++ b/code/modules/client/preferences_gear.dm @@ -0,0 +1,43 @@ +/datum/gear + display_name + display_icon //Icon for preview. + display_icon_name //Icon state for preview. + path //Path to item. + cost //Number of points used. + +//Standard gear datums. +/datum/gear/tie_horrible + display_name = "Horrible tie" + display_icon = 'icons/obj/clothing/ties.dmi' + display_icon_name = "horribletie" + path = /obj/item/clothing/tie/horrible + cost = 2 + +//Species-specific gear datums. +/datum/gear/zhan_furs + display_name = "Zhan-Khazan furs" + display_icon = '' + display_icon_name = "zhan_furs" + path = /obj/item/clothing/suit/tajaran/furs + cost = 3 + +/datum/gear/zhan_scarf + display_name = "Zhan-Khazan headscarf" + display_icon = '' + display_icon_name = "zhan_scarf" + path = /obj/item/clothing/head/tajaran/scarf + cost = 2 + +/datum/gear/unathi_robe + display_name = "Roughspun robe" + display_icon = '' + display_icon_name = "" + path = + cost = 3 + +/datum/gear/unathi_mantle + display_name = "Hide mantle" + display_icon = '' + display_icon_name = "" + path = + cost = 2 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index b171bfb8845..0ee8a196a28 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -28,7 +28,7 @@ var/heat_level_1 = 360 // Heat damage level 1 above this point. var/heat_level_2 = 400 // Heat damage level 2 above this point. var/heat_level_3 = 1000 // Heat damage level 2 above this point. - + var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing) var/synth_temp_gain = 0 //IS_SYNTHETIC species will gain this much temperature every second @@ -52,6 +52,9 @@ var/race_key = 0 var/icon/icon_template + //Used for character generation fluff items. + var/list/custom_gear_options + /datum/species/New() unarmed = new unarmed_type() @@ -137,6 +140,11 @@ flesh_color = "#34AF10" + custom_gear_options = list( + "Unathi robe" = /obj/item/clothing/suit/unathi/robe, + "Unathi mantle" = /obj/item/clothing/suit/unathi/mantle + ) + /datum/species/tajaran name = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' @@ -161,6 +169,11 @@ flesh_color = "#AFA59E" + custom_gear_options = list( + /obj/item/clothing/head/tajaran/scarf + /obj/item/clothing/suit/tajaran/furs + ) + /datum/species/skrell name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' @@ -331,7 +344,7 @@ heat_level_1 = 500 //gives them about 25 seconds in space before taking damage heat_level_2 = 1000 heat_level_3 = 2000 - + synth_temp_gain = 10 //this should cause IPCs to stabilize at ~80 C in a 20 C environment. flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | IS_SYNTHETIC @@ -348,7 +361,7 @@ var/miss_sound = 'sound/weapons/punchmiss.ogg' var/sharp = 0 var/edge = 0 - + /datum/unarmed_attack/punch attack_verb = list("punch") From 19bb5014a9e6448fbe6b41e74e16b0d9f02f4f03 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sun, 29 Jun 2014 04:22:09 +0930 Subject: [PATCH 03/14] More work on custom gear. --- code/controllers/master_controller.dm | 18 ++- code/modules/client/preferences.dm | 36 ++++- code/modules/client/preferences_gear.dm | 130 ++++++++++++++++--- code/modules/mining/drilling/distribution.dm | 3 - code/modules/mob/living/carbon/species.dm | 2 +- code/setup.dm | 9 +- 6 files changed, 160 insertions(+), 38 deletions(-) diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index cb52b2252fa..2ae5d1db1e8 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -79,13 +79,6 @@ datum/controller/game_controller/proc/setup() for(var/i=0, iGenerating resource distribution map." + var/datum/ore_distribution/O = new() + O.populate_distribution_map() + + //Set up spawn points. + populate_spawn_points() + + //Set up gear list. + populate_gear_list() + world << "\red \b Initializations complete." sleep(-1) diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 2e32dfed3aa..c65a8f472e7 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -75,7 +75,7 @@ datum/preferences var/b_eyes = 0 //Eye color var/species = "Human" //Species datum to use. var/language = "None" //Secondary language - var/datum/gear //Custom/fluff item loadout. + var/list/gear //Custom/fluff item loadout. //Mob preview var/icon/preview_icon = null @@ -132,7 +132,7 @@ datum/preferences gender = pick(MALE, FEMALE) real_name = random_name(gender) - gear = new /datum/gear() + gear = list() /datum/preferences proc/ZeroSkills(var/forced = 0) @@ -342,6 +342,22 @@ datum/preferences else dat += "

" + dat += "Custom Loadout: " + var/total_cost = 0 + if(gear && gear.len) + dat += "
" + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + dat += "[gear_name] ([G.cost]) " + dat += "\[remove\]
" + if(total_cost < MAX_GEAR_COST) + dat += "\[add\]
" + dat += "Used: [total_cost] points.
" + else + dat += "none.
" + if(gender == MALE) dat += "Underwear: [underwear_m[underwear]]
" else @@ -837,6 +853,22 @@ datum/preferences ShowChoices(user) return 1 + else if (href_list["preference"] == "loadout") + + if(href_list["task"] == "input") + + var/choice = input("Select gear to add.") as null|anything in gear_datums + if(choice && gear_datums[choice]) + gear += choice + + else if(href_list["task"] == "remove") + var/to_remove = href_list["gear"] + if(!to_remove) return + for(var/gear_name in gear) + if(gear_name == to_remove) + gear -= gear_name + break + switch(href_list["task"]) if("random") switch(href_list["preference"]) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index a9a10574300..29065325618 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -1,43 +1,131 @@ +var/global/list/gear_datums = list() + +proc/populate_gear_list() + for(var/type in typesof(/datum/gear)-/datum/gear) + var/datum/gear/G = new type() + gear_datums[G.display_name] = G + /datum/gear - display_name - display_icon //Icon for preview. - display_icon_name //Icon state for preview. - path //Path to item. - cost //Number of points used. + var/display_name //Name/index. + var/path //Path to item. + var/cost //Number of points used. + var/slot //Slot to equip to. + var/list/allowed_roles //Roles that can spawn with this item. //Standard gear datums. /datum/gear/tie_horrible - display_name = "Horrible tie" - display_icon = 'icons/obj/clothing/ties.dmi' - display_icon_name = "horribletie" + display_name = "horrible tie" path = /obj/item/clothing/tie/horrible cost = 2 +/datum/gear/hairflower + display_name = "hair flower pin" + path = /obj/item/clothing/head/hairflower + cost = 1 + slot = SLOT_HEAD + +/datum/gear/bandana + display_name = "pirate bandana" + path = /obj/item/clothing/head/bandana + cost = 1 + slot = SLOT_HEAD + +/datum/gear/overalls + display_name = "overalls" + path = /obj/item/clothing/suit/apron/overalls + cost = 1 + slot = SLOT_OCLOTHING + +/datum/gear/wcoat + display_name = "waistcoat" + path = /obj/item/clothing/suit/wcoat + cost = 1 + slot = SLOT_OCLOTHING + +/datum/gear/prescription + display_name = "prescription sunglasses" + path = /obj/item/clothing/glasses/sunglasses/prescription + cost = 2 + slot = SLOT_EYES + +/datum/gear/eyepatch + display_name = "eyepatch" + path = /obj/item/clothing/glasses/eyepatch + cost = 1 + slot = SLOT_EYES + +/datum/gear/flatcap + display_name = "flat cap" + path = /obj/item/clothing/head/flatcap + cost = 1 + slot = SLOT_HEAD + +/datum/gear/labcoat + display_name = "labcoat" + path = /obj/item/clothing/suit/storage/labcoat + cost = 2 + slot = SLOT_OCLOTHING + +/datum/gear/sandal + display_name = "sandals" + path = /obj/item/clothing/shoes/sandal + cost = 1 + slot = SLOT_FEET + +/datum/gear/leather + display_name = "leather shoes" + path = /obj/item/clothing/shoes/leather + cost = 1 + slot = SLOT_FEET + +/datum/gear/dress_shoes + display_name = "dress shoes" + path = /obj/item/clothing/shoes/centcom + cost = 1 + slot = SLOT_FEET + +//Security +/datum/gear/security + display_name = "Security HUD" + path = /obj/item/clothing/glasses/hud/security + cost = 1 + slot = SLOT_EYES + allowed_roles = list("Security Officer","Head of Security","Warden") + +/datum/gear/sec_beret + display_name = "security beret" + path = /obj/item/clothing/head/beret/sec + cost = 1 + slot = SLOT_HEAD + allowed_roles = list("Security Officer","Head of Security","Warden") + +//Engineering +/datum/gear/eng_beret + display_name = "engineering beret" + path = /obj/item/clothing/head/beret/eng + cost = 1 + slot = SLOT_HEAD + allowed_roles = list("Station Engineering","Atmospheric Technician","Chief Engineer") + //Species-specific gear datums. /datum/gear/zhan_furs display_name = "Zhan-Khazan furs" - display_icon = '' - display_icon_name = "zhan_furs" path = /obj/item/clothing/suit/tajaran/furs cost = 3 /datum/gear/zhan_scarf display_name = "Zhan-Khazan headscarf" - display_icon = '' - display_icon_name = "zhan_scarf" path = /obj/item/clothing/head/tajaran/scarf cost = 2 /datum/gear/unathi_robe - display_name = "Roughspun robe" - display_icon = '' - display_icon_name = "" - path = + display_name = "roughspun robe" + path = /obj/item/clothing/suit/unathi/robe cost = 3 + slot = SLOT_OCLOTHING /datum/gear/unathi_mantle - display_name = "Hide mantle" - display_icon = '' - display_icon_name = "" - path = - cost = 2 \ No newline at end of file + display_name = "hide mantle" + path = /obj/item/clothing/suit/unathi/mantle + cost = 2 + slot = SLOT_OCLOTHING \ No newline at end of file diff --git a/code/modules/mining/drilling/distribution.dm b/code/modules/mining/drilling/distribution.dm index 2ca9a3f685c..1b4c698ea9b 100644 --- a/code/modules/mining/drilling/distribution.dm +++ b/code/modules/mining/drilling/distribution.dm @@ -75,9 +75,6 @@ Deep minerals: //Halfassed diamond-square algorithm with some fuckery since it's a single dimension array. /datum/ore_distribution/proc/populate_distribution_map() - //Announce it! - world << "Generating resource distribution map." - //Seed beginning values. var/x = 1 var/y = 1 diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 05af15dd9d7..27a4b4aa117 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -170,7 +170,7 @@ flesh_color = "#AFA59E" custom_gear_options = list( - /obj/item/clothing/head/tajaran/scarf + /obj/item/clothing/head/tajaran/scarf, /obj/item/clothing/suit/tajaran/furs ) diff --git a/code/setup.dm b/code/setup.dm index 3f87fb2d2aa..ed724d54a02 100644 --- a/code/setup.dm +++ b/code/setup.dm @@ -796,14 +796,15 @@ var/list/RESTRICTED_CAMERA_NETWORKS = list( //Those networks can only be accesse #define IDLE_STATE 0 #define WAIT_LAUNCH 1 #define WAIT_ARRIVE 2 -#define WAIT_FINISH 3 +#define WAIT_FINISH 3 + - //computer3 error codes, move lower in the file when it passes dev -Sayu #define PROG_CRASH 1 // Generic crash #define MISSING_PERIPHERAL 2 // Missing hardware #define BUSTED_ASS_COMPUTER 4 // Self-perpetuating error. BAC will continue to crash forever. #define MISSING_PROGRAM 8 // Some files try to automatically launch a program. This is that failing. #define FILE_DRM 16 // Some files want to not be copied/moved. This is them complaining that you tried. - #define NETWORK_FAILURE 32 - + #define NETWORK_FAILURE 32 + +#define MAX_GEAR_COST 5 //Used in chargen for loadout limit. \ No newline at end of file From 21e625d89bf8b9503dbf33a759085b590b39c1a1 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Sat, 5 Jul 2014 16:48:59 +0930 Subject: [PATCH 04/14] Added Crisis and Surgeon modules, removed Medical module, added Construction module, altered Mining and Engineering modules. --- .../structures/stool_bed_chair_nest/bed.dm | 38 ++++- .../modules/mob/living/silicon/robot/robot.dm | 30 +++- .../mob/living/silicon/robot/robot_modules.dm | 158 ++++++++++++------ .../living/silicon/robot/robot_movement.dm | 5 + .../reagents/reagent_containers/borghydro.dm | 6 + 5 files changed, 184 insertions(+), 53 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 4f3112cb355..458c275ebaf 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -115,11 +115,47 @@ icon_state = "folded" w_class = 4.0 // Can't be put in backpacks. Oh well. - attack_self(mob/user) +/obj/item/roller/attack_self(mob/user) var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) R.add_fingerprint(user) del(src) +/obj/item/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + + if(istype(W,/obj/item/roller_holder)) + var/obj/item/roller_holder/RH = W + if(!RH.held) + user << "\blue You collect the roller bed." + src.loc = RH + RH.held = src + return + + ..() + +/obj/item/roller_holder + name = "roller bed rack" + desc = "A rack for carrying a collapsed roller bed." + icon = 'icons/obj/rollerbed.dmi' + icon_state = "folded" + var/obj/item/roller/held + +/obj/item/roller_holder/New() + ..() + held = new /obj/item/roller(src) + +/obj/item/roller_holder/attack_self(mob/user as mob) + + if(!held) + user << "\blue The rack is empty." + return + + user << "\blue You deploy the roller bed." + var/obj/structure/stool/bed/roller/R = new /obj/structure/stool/bed/roller(user.loc) + R.add_fingerprint(user) + del(held) + held = null + + /obj/structure/stool/bed/roller/Move() ..() if(buckled_mob) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 1d0dd77e284..00124ffd635 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -5,7 +5,7 @@ icon_state = "robot" maxHealth = 200 health = 200 - + var/sight_mode = 0 var/custom_name = "" var/custom_sprite = 0 //Due to all the sprites involved, a var for our custom borgs may be best @@ -163,7 +163,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Medical", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Security") if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -198,15 +198,26 @@ module_sprites["Advanced Droid"] = "droid-miner" module_sprites["Treadhead"] = "Miner" - if("Medical") - module = new /obj/item/weapon/robot_module/medical(src) + if("Crisis") + module = new /obj/item/weapon/robot_module/crisis(src) module.channels = list("Medical" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Medical") module_sprites["Basic"] = "Medbot" + module_sprites["Standard"] = "surgeon" module_sprites["Advanced Droid"] = "droid-medical" module_sprites["Needles"] = "medicalrobot" + + if("Surgeon") + module = new /obj/item/weapon/robot_module/surgeon(src) + module.channels = list("Medical" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Medical") + + module_sprites["Basic"] = "Medbot" module_sprites["Standard"] = "surgeon" + module_sprites["Advanced Droid"] = "droid-medical" + module_sprites["Needles"] = "medicalrobot" if("Security") module = new /obj/item/weapon/robot_module/security(src) @@ -225,6 +236,15 @@ module_sprites["Antique"] = "engineerrobot" module_sprites["Landmate"] = "landmate" + if("Construction") + module = new /obj/item/weapon/robot_module/engineering(src) + module.channels = list("Engineering" = 1) + if(camera && "Robots" in camera.network) + camera.network.Add("Engineering") + module_sprites["Basic"] = "Engineering" + module_sprites["Antique"] = "engineerrobot" + module_sprites["Landmate"] = "landmate" + if("Janitor") module = new /obj/item/weapon/robot_module/janitor(src) module_sprites["Basic"] = "JanBot2" @@ -238,7 +258,7 @@ //languages module.add_languages(src) - + //Custom_sprite check and entry if (custom_sprite == 1) module_sprites["Custom"] = "[src.ckey]-[modtype]" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index be0ee66bb46..3e5808ffea5 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -9,6 +9,7 @@ var/list/modules = list() var/obj/item/emag = null var/obj/item/borg/upgrade/jetpack = null + var/list/stacktypes emp_act(severity) if(modules) @@ -31,7 +32,21 @@ /obj/item/weapon/robot_module/proc/respawn_consumable(var/mob/living/silicon/robot/R) - return + + if(!stacktypes || !stacktypes.len) return + + for(var/T in stacktypes) + var/O = locate(T) in src.modules + var/obj/item/stack/S = O + + if(!S) + src.modules -= null + S = new T(src) + src.modules += S + S.amount = 1 + + if(S && S.amount < stacktypes[T]) + S.amount++ /obj/item/weapon/robot_module/proc/rebuild()//Rebuilds the list so it's possible to add/remove items from the module var/list/temp_list = modules @@ -41,7 +56,9 @@ modules += O /obj/item/weapon/robot_module/proc/add_languages(var/mob/living/silicon/robot/R) - R.add_language("Tradeband", 0) + R.add_language("Tradeband", 1) + R.add_language("Sol Common", 1) + /obj/item/weapon/robot_module/standard name = "standard robot module" @@ -57,8 +74,49 @@ src.emag = new /obj/item/weapon/melee/energy/sword(src) return -/obj/item/weapon/robot_module/medical - name = "medical robot module" +/obj/item/weapon/robot_module/surgeon + name = "surgeon robot module" + stacktypes = list( + /obj/item/stack/medical/advanced/bruise_pack = 5, + /obj/item/stack/nanopaste = 5 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/device/healthanalyzer(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/surgeon(src) + src.modules += new /obj/item/weapon/scalpel(src) + src.modules += new /obj/item/weapon/hemostat(src) + src.modules += new /obj/item/weapon/retractor(src) + src.modules += new /obj/item/weapon/cautery(src) + src.modules += new /obj/item/weapon/bonegel(src) + src.modules += new /obj/item/weapon/bonesetter(src) + src.modules += new /obj/item/weapon/circular_saw(src) + src.modules += new /obj/item/weapon/surgicaldrill(src) + src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.modules += new /obj/item/stack/medical/advanced/bruise_pack(src) + src.modules += new /obj/item/stack/nanopaste(src) + + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + + src.emag.reagents.add_reagent("pacid", 250) + src.emag.name = "Polyacid spray" + return + +/obj/item/weapon/robot_module/surgeon/respawn_consumable(var/mob/living/silicon/robot/R) + if(src.emag) + var/obj/item/weapon/reagent_containers/spray/PS = src.emag + PS.reagents.add_reagent("pacid", 2) + ..() + +/obj/item/weapon/robot_module/crisis + name = "crisis robot module" + stacktypes = list( + /obj/item/stack/medical/ointment = 5, + /obj/item/stack/medical/bruise_pack = 5, + /obj/item/stack/medical/splint = 5 + ) New() src.modules += new /obj/item/device/flashlight(src) @@ -66,40 +124,71 @@ src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/device/reagent_scanner/adv(src) - src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) + src.modules += new /obj/item/roller_holder(src) + src.modules += new /obj/item/stack/medical/ointment(src) + src.modules += new /obj/item/stack/medical/bruise_pack(src) + src.modules += new /obj/item/stack/medical/splint(src) + src.modules += new /obj/item/weapon/reagent_containers/borghypo/crisis(src) src.modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) src.modules += new /obj/item/weapon/reagent_containers/robodropper(src) src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) - src.emag = new /obj/item/weapon/reagent_containers/spray(src) src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" return -/obj/item/weapon/robot_module/medical/respawn_consumable(var/mob/living/silicon/robot/R) +/obj/item/weapon/robot_module/crisis/respawn_consumable(var/mob/living/silicon/robot/R) + var/obj/item/weapon/reagent_containers/syringe/S = locate() in src.modules - if(S.mode == 2)//SYRINGE_BROKEN + if(S.mode == 2) S.reagents.clear_reagents() S.mode = initial(S.mode) S.desc = initial(S.desc) S.update_icon() + if(src.emag) var/obj/item/weapon/reagent_containers/spray/PS = src.emag PS.reagents.add_reagent("pacid", 2) -/obj/item/weapon/robot_module/engineering - name = "engineering robot module" + ..() +/obj/item/weapon/robot_module/construction + name = "construction robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/plasteel = 10, + /obj/item/stack/sheet/rglass = 50 + ) + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/borg/sight/meson(src) + src.modules += new /obj/item/weapon/extinguisher(src) + src.modules += new /obj/item/weapon/rcd/borg(src) + src.modules += new /obj/item/weapon/screwdriver(src) + src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/crowbar(src) + src.modules += new /obj/item/weapon/pickaxe/plasmacutter(src) + +/obj/item/weapon/robot_module/engineering + name = "engineering robot module" + + stacktypes = list( + /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/rglass = 50, + /obj/item/weapon/cable_coil = 50, + /obj/item/stack/rods = 15, + /obj/item/stack/tile/plasteel = 15 + ) New() src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) - src.modules += new /obj/item/weapon/rcd/borg(src) src.modules += new /obj/item/weapon/extinguisher(src) -// src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/weapon/weldingtool/largetank(src) src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/wrench(src) @@ -109,6 +198,10 @@ src.modules += new /obj/item/device/t_scanner(src) src.modules += new /obj/item/device/analyzer(src) src.modules += new /obj/item/taperoll/engineering(src) + src.modules += new /obj/item/weapon/gripper(src) + src.modules += new /obj/item/weapon/matter_decompiler(src) + + src.emag = new /obj/item/borg/stun(src) var/obj/item/stack/sheet/metal/cyborg/M = new /obj/item/stack/sheet/metal/cyborg(src) M.amount = 50 @@ -124,24 +217,6 @@ return -/obj/item/weapon/robot_module/engineering/respawn_consumable(var/mob/living/silicon/robot/R) - var/list/stacks = list ( - /obj/item/stack/sheet/metal, - /obj/item/stack/sheet/rglass, - /obj/item/weapon/cable_coil, - ) - for(var/T in stacks) - var/O = locate(T) in src.modules - if(O) - if(O:amount < 50) - O:amount++ - else - src.modules -= null - O = new T(src) - src.modules += O - O:amount = 1 - return - /obj/item/weapon/robot_module/security name = "security robot module" @@ -250,11 +325,11 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) - src.emag = new /obj/item/borg/stun(src) + src.modules += new /obj/item/weapon/wrench(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) -// src.modules += new /obj/item/weapon/shovel(src) Uneeded due to buffed drill + src.emag = new /obj/item/weapon/pickaxe/plasmacutter(src) return /obj/item/weapon/robot_module/syndicate @@ -286,7 +361,7 @@ /obj/item/weapon/robot_module/drone name = "drone module" - var/list/stacktypes = list( + stacktypes = list( /obj/item/stack/sheet/wood/cyborg = 1, /obj/item/stack/sheet/mineral/plastic/cyborg = 1, /obj/item/stack/sheet/rglass/cyborg = 5, @@ -327,20 +402,9 @@ var/obj/item/weapon/reagent_containers/spray/cleaner/C = locate() in src.modules C.reagents.add_reagent("cleaner", 3) - for(var/T in stacktypes) - var/O = locate(T) in src.modules - var/obj/item/stack/sheet/S = O - - if(!S) - src.modules -= null - S = new T(src) - src.modules += S - S.amount = 1 - - if(S && S.amount < stacktypes[T]) - S.amount++ - var/obj/item/device/lightreplacer/LR = locate() in src.modules LR.Charge(R) + ..() + return \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index f1a62754b4b..c3b7d43c05c 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -1,3 +1,8 @@ +/mob/living/silicon/robot/Process_Spaceslipping(var/prob_slip) + if(module && (istype(module,/obj/item/weapon/robot_module/construction) || istype(module,/obj/item/weapon/robot_module/drone))) + return 0 + ..(prob_slip) + /mob/living/silicon/robot/Process_Spacemove() if(module) for(var/obj/item/weapon/tank/jetpack/J in module.modules) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index a8d88bcf20b..d69773b5d4d 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -18,6 +18,12 @@ var/list/reagent_ids = list("tricordrazine", "inaprovaline", "spaceacillin") //var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "anti_toxin", "inaprovaline", "spaceacillin") +/obj/item/weapon/reagent_containers/borghypo/surgeon + reagent_ids = list("bicaridine", "inaprovaline", "dexalin") + +/obj/item/weapon/reagent_containers/borghypo/crisis + reagent_ids = list("tricordrazine", "inaprovaline", "tramadol") + /obj/item/weapon/reagent_containers/borghypo/New() ..() for(var/R in reagent_ids) From 6499385279fd333abea905a324f702a1c20b3953 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Tue, 8 Jul 2014 19:44:33 +0930 Subject: [PATCH 05/14] Temp commit with robot module work --- .../mob/living/silicon/robot/robot_items.dm | 30 ++++++++++++++---- .../mob/living/silicon/robot/robot_modules.dm | 18 +++++++++++ icons/mob/head.dmi | Bin 110003 -> 111471 bytes icons/mob/roaper.dmi | Bin 0 -> 4938 bytes 4 files changed, 42 insertions(+), 6 deletions(-) create mode 100644 icons/mob/roaper.dmi diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 1c24a5e75dd..00d1b0abf0c 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -95,14 +95,26 @@ var/mode = 1 /obj/item/weapon/pen/robopen/attack_self(mob/user as mob) + + var/choice = input("Would you like to change colour or mode?") as null|anything in list("Colour","Mode") + if(!choice) return + playsound(src.loc, 'sound/effects/pop.ogg', 50, 0) - if (mode == 1) - mode = 2 - user << "Changed printing mode to 'Rename Paper'" + + switch(choice) + + if("Colour") + var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") + if(newcolour) color = newcolour + + if("Mode") + if (mode == 1) + mode = 2 + else + mode = 1 + user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" + return - if (mode == 2) - mode = 1 - user << "Changed printing mode to 'Write Paper'" // Copied over from paper's rename verb // see code\modules\paperwork\paper.dm line 62 @@ -120,6 +132,12 @@ add_fingerprint(user) return +/obj/item/weapon/form_printer + name = "paperwork printer" + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "paper_bin1" + item_state = "sheet-metal" + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3e5808ffea5..d1fca617a08 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -311,6 +311,24 @@ R.add_language("Tradeband", 1) R.add_language("Gutter", 1) +/obj/item/weapon/robot_module/clerical + name = "clerical robot module" + + New() + src.modules += new /obj/item/device/flashlight(src) + src.modules += new /obj/item/device/flash(src) + src.modules += new /obj/item/weapon/pen/robopen(src) + + add_languages(var/mob/living/silicon/robot/R) + R.add_language("Sol Common", 1) + R.add_language("Sinta'unathi", 1) + R.add_language("Siik'maas", 1) + R.add_language("Siik'tajr", 0) + R.add_language("Skrellian", 1) + R.add_language("Rootspeak", 1) + R.add_language("Tradeband", 1) + R.add_language("Gutter", 1) + /obj/item/weapon/robot_module/butler/respawn_consumable(var/mob/living/silicon/robot/R) var/obj/item/weapon/reagent_containers/food/condiment/enzyme/E = locate() in src.modules E.reagents.add_reagent("enzyme", 2) diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c0e431f14aee3c651202ec6a0d45e2dcf7c40209..62c00fe9dc75c9b8d40d0cafa867a1b4de23e5ff 100644 GIT binary patch delta 14706 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 Lm1Rn#jNbnbuN~}W delta 13227 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%0Dn+j$e!Wd++~Ev1b>* zjc4C__7x9U^gdDvaG&SsRj|ffh5Jas%|MPVCZ+@Qb~#g5$h2_Q5S7L@0g5^~F(smN zW@ZEKeBTJfxO5tXg}L)Ul{?$fY1_!wh8rQ()p;<2i=A-6U>NSFh#n04?rc`2eNbDr%?xtLHDgjapG8XmYFve$tSjC^e zjV<_}l9_zrt5f!~yV?q^7u<68L`fTTZFPD+2&A3O;l#(sU-rgS4ixszo>OgW9VsD3 zBwCZb*pDQjo8`4I2H(QY)PO`$8RK{RzcT)EnXzIBh$xv0Ub3Z%d1yR6UgGaGgtJ!k zeZQz<|=B;R=MpN$r&hsfkxk1R&)rL(#5^D zoW#q70#VzN?JN4mG@;0XazjTw*Fn^5mLbKt^?CZ`jfWU?&0-iI%c;tJi3Sg6$+(dD zjC)whWH!mOh{i&D|I=BfINDKO0Zsq*kcvlCE+c~aUI+ax@JUT+vc4yw`g+XNuSfXa zf{1^$u%K!epsa&f>x(7rz!NtX=M1jff&Sg36<*vg*HyRI4%^uU* zPP_OhOS1h7FWCQ;-BLj_$jYW~6xjzrcbS*%gSg56S!ery3l72mcIEE>ZN~q<6P|+Y Yzqs_M`Io%g0H`U-y^<|^ZtVZR0HQg}P5=M^ diff --git a/icons/mob/roaper.dmi b/icons/mob/roaper.dmi new file mode 100644 index 0000000000000000000000000000000000000000..272251ec8ae71477500d8a295f13e29c32d6c2a9 GIT binary patch literal 4938 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 Date: Fri, 11 Jul 2014 11:47:53 +0930 Subject: [PATCH 06/14] More work on gear loadouts. --- code/game/jobs/job_controller.dm | 38 ++- code/modules/client/preferences.dm | 72 +++-- code/modules/client/preferences_gear.dm | 298 ++++++++++++++++-- code/modules/client/preferences_savefile.dm | 4 + code/modules/clothing/under/miscellaneous.dm | 4 +- code/modules/clothing/under/ties.dm | 46 +-- code/modules/mob/living/carbon/human/human.dm | 32 ++ code/modules/mob/living/carbon/species.dm | 1 + code/modules/mob/living/simple_animal/vox.dm | 160 ---------- 9 files changed, 419 insertions(+), 236 deletions(-) delete mode 100644 code/modules/mob/living/simple_animal/vox.dm diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 64408038f6e..ea80904d918 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -346,9 +346,41 @@ var/global/datum/controller/occupations/job_master proc/EquipRank(var/mob/living/carbon/human/H, var/rank, var/joined_late = 0) + if(!H) return 0 + var/datum/job/job = GetJob(rank) + if(job) + + //Equip custom gear loadout. + if(H.client.prefs.gear && H.client.prefs.gear.len) + + for(var/thing in H.client.prefs.gear) + var/datum/gear/G = gear_datums[thing] + if(G) + var/permitted + if(G.allowed_roles) + for(var/job_name in G.allowed_roles) + if(job.title == job_name) + permitted = 1 + else + permitted = 1 + + if(G.whitelisted && !is_alien_whitelisted(H, G.whitelisted)) + permitted = 0 + + if(!permitted) + H << "\red Your current job or whitelist status does not permit you to spawn with [thing]!" + continue + + if(G.slot) + H.equip_to_slot_or_del(new G.path(H), G.slot) + else + spawn(1) + new G.path(get_turf(H)) + + //Equip job items. job.equip(H) else H << "Your job is [rank] and the game just can't handle it! Please report this bug to an administrator." @@ -433,12 +465,12 @@ var/global/datum/controller/occupations/job_master if(H.species.name == "Tajaran" || H.species.name == "Unathi") H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes,1) else if(H.species.name == "Vox") - H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(src), slot_wear_mask) + H.equip_to_slot_or_del(new /obj/item/clothing/mask/breath(H), slot_wear_mask) if(!H.r_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_r_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_r_hand) H.internal = H.r_hand else if (!H.l_hand) - H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(src), slot_l_hand) + H.equip_to_slot_or_del(new /obj/item/weapon/tank/nitrogen(H), slot_l_hand) H.internal = H.l_hand H.internals.icon_state = "internal1" diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 85d56d31eef..448662c4516 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -266,7 +266,27 @@ datum/preferences if(config.allow_Metadata) dat += "OOC Notes: Edit
" - dat += "
Occupation Choices
" + dat += "
Custom Loadout: " + var/total_cost = 0 + + if(isnull(gear) || !islist(gear)) gear = list() + + if(gear && gear.len) + dat += "
" + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + dat += "[gear_name] \[remove\]
" + + dat += "Used: [total_cost] points." + else + dat += "none." + + if(total_cost < MAX_GEAR_COST) + dat += " \[add\]" + + dat += "

Occupation Choices
" dat += "\tSet Preferences
" dat += "
Body " @@ -342,22 +362,6 @@ datum/preferences else dat += "

" - dat += "Custom Loadout: " - var/total_cost = 0 - if(gear && gear.len) - dat += "
" - for(var/gear_name in gear) - if(gear_datums[gear_name]) - var/datum/gear/G = gear_datums[gear_name] - total_cost += G.cost - dat += "[gear_name] ([G.cost]) " - dat += "\[remove\]
" - if(total_cost < MAX_GEAR_COST) - dat += "\[add\]
" - dat += "Used: [total_cost] points.
" - else - dat += "none.
" - if(gender == MALE) dat += "Underwear: [underwear_m[underwear]]
" else @@ -857,9 +861,35 @@ datum/preferences if(href_list["task"] == "input") - var/choice = input("Select gear to add.") as null|anything in gear_datums + var/list/valid_gear_choices = list() + + for(var/gear_name in gear_datums) + var/datum/gear/G = gear_datums[gear_name] + if(G.whitelisted && !is_alien_whitelisted(user, G.whitelisted)) + continue + valid_gear_choices += gear_name + + var/choice = input(user, "Select gear to add: ") as null|anything in valid_gear_choices + if(choice && gear_datums[choice]) - gear += choice + + var/total_cost = 0 + + if(isnull(gear) || !islist(gear)) gear = list() + + if(gear && gear.len) + for(var/gear_name in gear) + if(gear_datums[gear_name]) + var/datum/gear/G = gear_datums[gear_name] + total_cost += G.cost + + var/datum/gear/C = gear_datums[choice] + total_cost += C.cost + if(C && total_cost <= MAX_GEAR_COST) + gear += choice + user << "\blue Added [choice] for [C.cost] points ([MAX_GEAR_COST - total_cost] points remaining)." + else + user << "\red That item will exceed the maximum loadout cost of [MAX_GEAR_COST] points." else if(href_list["task"] == "remove") var/to_remove = href_list["gear"] @@ -996,14 +1026,14 @@ datum/preferences var/datum/language/lang = all_languages[L] if((!(lang.flags & RESTRICTED)) && (is_alien_whitelisted(user, L)||(!( lang.flags & WHITELISTED ))||(S && (L in S.secondary_langs)))) new_languages += lang - + //Apparently there's some PHP script that needs to be updated in order to give people whitelist languages. //This workaround should be removed once that has been properly updated if (lang.name == "Siik'maas") new_languages |= all_languages["Siik'tajr"] if (lang.name == "Siik'tajr") new_languages |= all_languages["Siik'maas"] - + languages_available = 1 if(!(languages_available)) diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index 29065325618..e18b6d39fc5 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -11,6 +11,7 @@ proc/populate_gear_list() var/cost //Number of points used. var/slot //Slot to equip to. var/list/allowed_roles //Roles that can spawn with this item. + var/whitelisted //Term to check the whitelist for.. //Standard gear datums. /datum/gear/tie_horrible @@ -18,85 +19,318 @@ proc/populate_gear_list() path = /obj/item/clothing/tie/horrible cost = 2 +/datum/gear/tie_blue + display_name = "blue tie" + path = /obj/item/clothing/tie/blue + cost = 2 + +/datum/gear/tie_red + display_name = "red tie" + path = /obj/item/clothing/tie/red + cost = 2 + /datum/gear/hairflower display_name = "hair flower pin" path = /obj/item/clothing/head/hairflower - cost = 1 - slot = SLOT_HEAD + cost = 2 + slot = slot_head /datum/gear/bandana display_name = "pirate bandana" path = /obj/item/clothing/head/bandana - cost = 1 - slot = SLOT_HEAD + cost = 3 + slot = slot_head /datum/gear/overalls display_name = "overalls" path = /obj/item/clothing/suit/apron/overalls - cost = 1 - slot = SLOT_OCLOTHING + cost = 2 + slot = slot_wear_suit /datum/gear/wcoat display_name = "waistcoat" path = /obj/item/clothing/suit/wcoat - cost = 1 - slot = SLOT_OCLOTHING + cost = 2 + slot = slot_wear_suit /datum/gear/prescription display_name = "prescription sunglasses" path = /obj/item/clothing/glasses/sunglasses/prescription - cost = 2 - slot = SLOT_EYES + cost = 3 + slot = slot_glasses /datum/gear/eyepatch display_name = "eyepatch" path = /obj/item/clothing/glasses/eyepatch - cost = 1 - slot = SLOT_EYES + cost = 3 + slot = slot_glasses /datum/gear/flatcap display_name = "flat cap" path = /obj/item/clothing/head/flatcap - cost = 1 - slot = SLOT_HEAD + cost = 2 + slot = slot_head /datum/gear/labcoat display_name = "labcoat" path = /obj/item/clothing/suit/storage/labcoat - cost = 2 - slot = SLOT_OCLOTHING + cost = 3 + slot = slot_wear_suit /datum/gear/sandal display_name = "sandals" path = /obj/item/clothing/shoes/sandal cost = 1 - slot = SLOT_FEET + slot = slot_shoes /datum/gear/leather display_name = "leather shoes" path = /obj/item/clothing/shoes/leather - cost = 1 - slot = SLOT_FEET + cost = 2 + slot = slot_shoes /datum/gear/dress_shoes display_name = "dress shoes" path = /obj/item/clothing/shoes/centcom + cost = 2 + slot = slot_shoes + +/datum/gear/black_gloves + display_name = "black gloves" + path = /obj/item/clothing/gloves/black cost = 1 - slot = SLOT_FEET + slot = slot_gloves + +/datum/gear/red_gloves + display_name = "red gloves" + path = /obj/item/clothing/gloves/red + cost = 1 + slot = slot_gloves + +/datum/gear/blue_gloves + display_name = "blue gloves" + path = /obj/item/clothing/gloves/blue + cost = 1 + slot = slot_gloves + +/datum/gear/orange_gloves + display_name = "orange gloves" + path = /obj/item/clothing/gloves/orange + cost = 1 + slot = slot_gloves + +/datum/gear/purple_gloves + display_name = "purple gloves" + path = /obj/item/clothing/gloves/purple + cost = 1 + slot = slot_gloves + +/datum/gear/brown_gloves + display_name = "brown gloves" + path = /obj/item/clothing/gloves/brown + cost = 1 + slot = slot_gloves + +/datum/gear/green_gloves + display_name = "green gloves" + path = /obj/item/clothing/gloves/green + cost = 2 + slot = slot_gloves + +/datum/gear/white_gloves + display_name = "white gloves" + path = /obj/item/clothing/gloves/white + cost = 2 + slot = slot_gloves + +/datum/gear/black_shoes + display_name = "black shoes" + path = /obj/item/clothing/shoes/black + cost = 2 + slot = slot_shoes + +/datum/gear/blue_shoes + display_name = "blue shoes" + path = /obj/item/clothing/shoes/blue + cost = 2 + slot = slot_shoes + +/datum/gear/brown_shoes + display_name = "brown shoes" + path = /obj/item/clothing/shoes/brown + cost = 2 + slot = slot_shoes + +/datum/gear/green_shoes + display_name = "green shoes" + path = /obj/item/clothing/shoes/green + cost = 2 + slot = slot_shoes + +/datum/gear/orange_shoes + display_name = "orange shoes" + path = /obj/item/clothing/shoes/orange + cost = 2 + slot = slot_shoes + +/datum/gear/purple_shoes + display_name = "purple shoes" + path = /obj/item/clothing/shoes/purple + cost = 2 + slot = slot_shoes + +/datum/gear/red_shoes + display_name = "red shoes" + path = /obj/item/clothing/shoes/red + cost = 2 + slot = slot_shoes + +/datum/gear/white_shoes + display_name = "white shoes" + path = /obj/item/clothing/shoes/white + cost = 2 + slot = slot_shoes + +/datum/gear/yellow_shoes + display_name = "yellow shoes" + path = /obj/item/clothing/shoes/yellow + cost = 2 + slot = slot_shoes + +/datum/gear/jackboots + display_name = "jackboots" + path = /obj/item/clothing/shoes/jackboots + cost = 3 + slot = slot_shoes + +/datum/gear/webbing + display_name = "webbing" + path = /obj/item/clothing/tie/storage/webbing + cost = 1 + +/datum/gear/armband + display_name = "red armband" + path = /obj/item/clothing/tie/armband + cost = 1 + +/datum/gear/armband_cargo + display_name = "cargo armband" + path = /obj/item/clothing/tie/armband/cargo + cost = 1 + +/datum/gear/armband_engineering + display_name = "engineering armband" + path = /obj/item/clothing/tie/armband/engine + cost = 1 + +/datum/gear/armband_science + display_name = "science armband" + path = /obj/item/clothing/tie/armband/science + cost = 1 + +/datum/gear/armband_hydroponics + display_name = "hydroponics armband" + path = /obj/item/clothing/tie/armband/hydro + cost = 1 + +/datum/gear/armband_medical + display_name = "medical armband" + path = /obj/item/clothing/tie/armband/med + cost = 1 + +/datum/gear/armband_emt + display_name = "EMT armband" + path = /obj/item/clothing/tie/armband/medgreen + cost = 1 + +/datum/gear/skirt_blue + display_name = "blue plaid skirt" + path = /obj/item/clothing/under/dress/plaid_blue + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_red + display_name = "red plaid skirt" + path = /obj/item/clothing/under/dress/plaid_red + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_purple + display_name = "purple plaid skirt" + path = /obj/item/clothing/under/dress/plaid_purple + slot = slot_w_uniform + cost = 3 + +/datum/gear/skirt_black + display_name = "black skirt" + path = /obj/item/clothing/under/blackskirt + slot = slot_w_uniform + cost = 3 + +/datum/gear/sundress + display_name = "sundress" + path = /obj/item/clothing/under/sundress + slot = slot_w_uniform + cost = 3 + +/datum/gear/uniform_captain + display_name = "captain's dress uniform" + path = /obj/item/clothing/under/dress/dress_cap + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Captain") + +/datum/gear/uniform_hop + display_name = "HoP dress uniform" + path = /obj/item/clothing/under/dress/dress_hop + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Head of Personnel") + +/datum/gear/uniform_hr + display_name = "HR director uniform" + path = /obj/item/clothing/under/dress/dress_hr + slot = slot_w_uniform + cost = 3 + allowed_roles = list("Head of Personnel") + +/datum/gear/kilt + display_name = "kilt" + path = /obj/item/clothing/under/kilt + slot = slot_w_uniform + cost = 3 + +/datum/gear/exec_suit + display_name = "executive suit" + path = /obj/item/clothing/under/suit_jacket/really_black + slot = slot_w_uniform + cost = 3 //Security /datum/gear/security display_name = "Security HUD" path = /obj/item/clothing/glasses/hud/security - cost = 1 - slot = SLOT_EYES + cost = 3 + slot = slot_glasses allowed_roles = list("Security Officer","Head of Security","Warden") +/datum/gear/black_vest + display_name = "black webbing vest" + path = /obj/item/clothing/tie/storage/black_vest + cost = 3 + allowed_roles = list("Security Officer","Head of Security","Warden") + +/datum/gear/armpit + display_name = "shoulder holster" + path = /obj/item/clothing/tie/holster/armpit + cost = 3 + allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Head of Security") + /datum/gear/sec_beret display_name = "security beret" path = /obj/item/clothing/head/beret/sec cost = 1 - slot = SLOT_HEAD + slot = slot_head allowed_roles = list("Security Officer","Head of Security","Warden") //Engineering @@ -104,28 +338,38 @@ proc/populate_gear_list() display_name = "engineering beret" path = /obj/item/clothing/head/beret/eng cost = 1 - slot = SLOT_HEAD - allowed_roles = list("Station Engineering","Atmospheric Technician","Chief Engineer") + slot = slot_head + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") + +/datum/gear/brown_vest + display_name = "brown webbing vest" + path = /obj/item/clothing/tie/storage/brown_vest + cost = 3 + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") //Species-specific gear datums. /datum/gear/zhan_furs display_name = "Zhan-Khazan furs" path = /obj/item/clothing/suit/tajaran/furs cost = 3 + whitelisted = "Tajaran" /datum/gear/zhan_scarf display_name = "Zhan-Khazan headscarf" path = /obj/item/clothing/head/tajaran/scarf cost = 2 + whitelisted = "Tajaran" /datum/gear/unathi_robe display_name = "roughspun robe" path = /obj/item/clothing/suit/unathi/robe cost = 3 - slot = SLOT_OCLOTHING + slot = slot_wear_suit + whitelisted = "Unathi" /datum/gear/unathi_mantle display_name = "hide mantle" path = /obj/item/clothing/suit/unathi/mantle cost = 2 - slot = SLOT_OCLOTHING \ No newline at end of file + slot = slot_wear_suit + whitelisted = "Unathi" diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 68bb5a9e3eb..ef3b8e5c035 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -155,6 +155,7 @@ S["skills"] >> skills S["skill_specialization"] >> skill_specialization S["organ_data"] >> organ_data + S["gear"] >> gear S["nanotrasen_relation"] >> nanotrasen_relation //S["skin_style"] >> skin_style @@ -211,6 +212,7 @@ if(isnull(disabilities)) disabilities = 0 if(!player_alt_titles) player_alt_titles = new() if(!organ_data) src.organ_data = list() + if(!gear) src.gear = list() //if(!skin_style) skin_style = "Default" return 1 @@ -248,6 +250,7 @@ S["undershirt"] << undershirt S["backbag"] << backbag S["b_type"] << b_type + S["spawnpoint"] << spawnpoint //Jobs S["alternate_option"] << alternate_option @@ -273,6 +276,7 @@ S["skills"] << skills S["skill_specialization"] << skill_specialization S["organ_data"] << organ_data + S["gear"] << gear S["nanotrasen_relation"] << nanotrasen_relation //S["skin_style"] << skin_style diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index c182d820246..3e4cf1a3d1b 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -294,13 +294,13 @@ /obj/item/clothing/under/dress/dress_cap - name = "captain dress uniform" + name = "captain's dress uniform" desc = "Feminine fashion for the style concious captain." icon_state = "dress_cap" item_color = "dress_cap" /obj/item/clothing/under/dress/dress_hop - name = "head of personal dress uniform" + name = "head of personnel dress uniform" desc = "Feminine fashion for the style concious HoP." icon_state = "dress_hop" item_color = "dress_hop" diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 57cc66865b1..d8b1bdf70b0 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -22,7 +22,7 @@ has_suit = S loc = has_suit has_suit.overlays += inv_overlay - + user << "You attach [src] to [has_suit]." src.add_fingerprint(user) @@ -157,38 +157,38 @@ item_color = "red" /obj/item/clothing/tie/armband/cargo - name = "cargo bay guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is brown." + name = "cargo armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is brown." icon_state = "cargo" item_color = "cargo" /obj/item/clothing/tie/armband/engine - name = "engineering guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is orange with a reflective strip!" + name = "engineering armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is orange with a reflective strip!" icon_state = "engie" item_color = "engie" /obj/item/clothing/tie/armband/science - name = "science guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is purple." + name = "science armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is purple." icon_state = "rnd" item_color = "rnd" /obj/item/clothing/tie/armband/hydro - name = "hydroponics guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is green and blue." + name = "hydroponics armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is green and blue." icon_state = "hydro" item_color = "hydro" /obj/item/clothing/tie/armband/med - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white." + name = "medical armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white." icon_state = "med" item_color = "med" /obj/item/clothing/tie/armband/medgreen - name = "medical guard armband" - desc = "An armband, worn by the station's security forces to display which department they're assigned to. This one is white and green." + name = "EMT armband" + desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." icon_state = "medgreen" item_color = "medgreen" @@ -208,16 +208,16 @@ if(holstered) user << "\red There is already a [holstered] holstered here!" return - + if (!istype(I, /obj/item/weapon/gun)) user << "\red Only guns can be holstered!" return - + var/obj/item/weapon/gun/W = I if (!can_holster(W)) user << "\red This [W] won't fit in the [src]!" return - + holstered = W user.drop_from_inventory(holstered) holstered.loc = src @@ -227,7 +227,7 @@ /obj/item/clothing/tie/holster/proc/unholster(mob/user as mob) if(!holstered) return - + if(istype(user.get_active_hand(),/obj) && istype(user.get_inactive_hand(),/obj)) user << "\red You need an empty hand to draw the [holstered]!" else @@ -246,7 +246,7 @@ if (holstered) unholster(user) return - + ..(user) /obj/item/clothing/tie/holster/attackby(obj/item/W as obj, mob/user as mob) @@ -280,7 +280,7 @@ set src in usr if(!istype(usr, /mob/living)) return if(usr.stat) return - + var/obj/item/clothing/tie/holster/H = null if (istype(src, /obj/item/clothing/tie/holster)) H = src @@ -288,7 +288,7 @@ var/obj/item/clothing/under/S = src if (S.hastie) H = S.hastie - + if (!H) usr << "/red Something is very wrong." @@ -330,14 +330,14 @@ if (has_suit) //if we are part of a suit hold.open(user) return - + if (hold.handle_attack_hand(user)) //otherwise interact as a regular storage item ..(user) /obj/item/clothing/tie/storage/MouseDrop(obj/over_object as obj) if (has_suit) return - + if (hold.handle_mousedrop(usr, over_object)) ..(over_object) @@ -471,6 +471,6 @@ "/obj/item/weapon/kitchen/utensil/pknife",\ "/obj/item/weapon/kitchenknife",\ "/obj/item/weapon/kitchenknife/ritual") - + new /obj/item/weapon/hatchet/unathiknife(hold) new /obj/item/weapon/hatchet/unathiknife(hold) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index f4edb30e240..50c3076b3af 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1458,3 +1458,35 @@ M.apply_damage(50,BRUTE) if(M.stat == 2) M.gib() + +/mob/living/carbon/human/proc/commune() + set category = "IC" + set name = "Commune with creature" + set desc = "Send a telepathic message to an unlucky recipient." + + var/list/targets = list() + var/target = null + var/text = null + + targets += getmobs() //Fill list, prompt user with list + target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets + + if(!target) return + + text = input("What would you like to say?", "Speak to creature", null, null) + + if(!text) return + + var/mob/M = targets[target] + + if(istype(M, /mob/dead/observer) || M.stat == DEAD) + src << "Not even a [src.species.name] can speak to the dead." + return + + M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" + if(istype(M,/mob/living/carbon/human)) + var/mob/living/carbon/human/H = M + if(H.species.name == src.species.name) + return + H << "\red Your nose begins to bleed..." + H.drip(1) \ No newline at end of file diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 6812a4c4259..7ca77168b09 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -228,6 +228,7 @@ /datum/species/vox/armalis/handle_post_spawn(var/mob/living/carbon/human/H) H.verbs += /mob/living/carbon/human/proc/gut + H.verbs += /mob/living/carbon/human/proc/commune ..() /datum/species/vox/armalis diff --git a/code/modules/mob/living/simple_animal/vox.dm b/code/modules/mob/living/simple_animal/vox.dm deleted file mode 100644 index f3354ce8561..00000000000 --- a/code/modules/mob/living/simple_animal/vox.dm +++ /dev/null @@ -1,160 +0,0 @@ -/mob/living/simple_animal/vox/armalis/ - - name = "serpentine alien" - real_name = "serpentine alien" - desc = "A one-eyed, serpentine creature, half-machine, easily nine feet from tail to beak!" - icon = 'icons/mob/vox.dmi' - icon_state = "armalis" - icon_living = "armalis" - maxHealth = 500 - health = 500 - response_harm = "slashes at the" - harm_intent_damage = 0 - melee_damage_lower = 30 - melee_damage_upper = 40 - attacktext = "slammed its enormous claws into" - speed = -1 - wall_smash = 1 - attack_sound = 'sound/weapons/bladeslice.ogg' - status_flags = 0 - universal_speak = 1 - - var/armour = null - var/amp = null - var/quills = 3 - -/mob/living/simple_animal/vox/armalis/Die() - - living_mob_list -= src - dead_mob_list += src - stat = DEAD - visible_message("\red [src] shudders violently and explodes!","\red You feel your body rupture!") - explosion(get_turf(loc), -1, -1, 3, 5) - src.gib() - return - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(O.force >= 25) - var/damage = O.force - if (O.damtype == HALLOSS) - damage = 0 - health -= damage - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") - else - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") - -/mob/living/simple_animal/vox/armalis/verb/fire_quill(mob/target as mob in oview()) - - set name = "Fire quill" - set desc = "Fires a viciously pointed quill at a high speed." - set category = "Alien" - - if(quills<=0) - return - - src << "\red You launch a razor-sharp quill at [target]!" - for(var/mob/O in oviewers()) - if ((O.client && !( O.blinded ))) - O << "\red [src] launches a razor-sharp quill at [target]!" - - var/obj/item/weapon/arrow/quill/Q = new(loc) - Q.fingerprintslast = src.ckey - Q.throw_at(target,10,30) - quills-- - - spawn(100) - src << "\red You feel a fresh quill slide into place." - quills++ - -/mob/living/simple_animal/vox/armalis/verb/message_mob() - set category = "Alien" - set name = "Commune with creature" - set desc = "Send a telepathic message to an unlucky recipient." - - var/list/targets = list() - var/target = null - var/text = null - - targets += getmobs() //Fill list, prompt user with list - target = input("Select a creature!", "Speak to creature", null, null) as null|anything in targets - text = input("What would you like to say?", "Speak to creature", null, null) - - if (!target || !text) - return - - var/mob/M = targets[target] - - if(istype(M, /mob/dead/observer) || M.stat == DEAD) - src << "Not even the armalis can speak to the dead." - return - - M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" - if(istype(M,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = M - if(H.species.name == "Vox") - return - H << "\red Your nose begins to bleed..." - H.drip(1) - -/mob/living/simple_animal/vox/armalis/verb/shriek() - set category = "Alien" - set name = "Shriek" - set desc = "Give voice to a psychic shriek." - -/mob/living/simple_animal/vox/armalis/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O,/obj/item/vox/armalis_armour)) - user.drop_item() - armour = O - speed = 1 - maxHealth += 200 - health += 200 - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - if(istype(O,/obj/item/vox/armalis_amp)) - user.drop_item() - amp = O - O.loc = src - visible_message("\blue [src] is quickly outfitted in [O] by [user].","\blue You quickly outfit [src] in [O].") - regenerate_icons() - return - return ..() - -/mob/living/simple_animal/vox/armalis/regenerate_icons() - - overlays = list() - if(armour) - var/icon/armour = image('icons/mob/vox.dmi',"armour") - speed = 1 - overlays += armour - if(amp) - var/icon/amp = image('icons/mob/vox.dmi',"amplifier") - overlays += amp - return - -/obj/item/vox/armalis_armour - - name = "strange armour" - desc = "Hulking reinforced armour for something huge." - icon = 'icons/obj/clothing/suits.dmi' - icon_state = "armalis_armour" - item_state = "armalis_armour" - -/obj/item/vox/armalis_amp - - name = "strange lenses" - desc = "A series of metallic lenses and chains." - icon = 'icons/obj/clothing/hats.dmi' - icon_state = "amp" - item_state = "amp" \ No newline at end of file From 3955edd04b8738e267a49e12a2de9b0101b817dc Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 12:16:08 +0930 Subject: [PATCH 07/14] Final touches for loadout system. --- code/game/jobs/job_controller.dm | 16 ++++++++++++-- code/modules/client/preferences_gear.dm | 29 +++++++++++++++++++++++++ code/modules/clothing/suits/alien.dm | 4 ---- 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index ea80904d918..c8be3a2351a 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -350,6 +350,7 @@ var/global/datum/controller/occupations/job_master if(!H) return 0 var/datum/job/job = GetJob(rank) + var/list/spawn_in_storage = list() if(job) @@ -377,8 +378,8 @@ var/global/datum/controller/occupations/job_master if(G.slot) H.equip_to_slot_or_del(new G.path(H), G.slot) else - spawn(1) - new G.path(get_turf(H)) + spawn_in_storage += thing + //Equip job items. job.equip(H) @@ -460,6 +461,17 @@ var/global/datum/controller/occupations/job_master new /obj/item/weapon/storage/box/survival(BPK) H.equip_to_slot_or_del(BPK, slot_back,1) + //Deferred item spawning. + var/obj/item/weapon/storage/B = locate(/obj/item/weapon/storage/backpack) in H.contents + + if(isnull(B) || istype(B)) + B = locate(/obj/item/weapon/storage/box) in H.contents + + if(!isnull(B)) + for(var/thing in spawn_in_storage) + var/datum/gear/G = gear_datums[thing] + new G.path(B) + //TODO: Generalize this by-species if(H.species) if(H.species.name == "Tajaran" || H.species.name == "Unathi") diff --git a/code/modules/client/preferences_gear.dm b/code/modules/client/preferences_gear.dm index e18b6d39fc5..e8df54ddfd8 100644 --- a/code/modules/client/preferences_gear.dm +++ b/code/modules/client/preferences_gear.dm @@ -14,6 +14,22 @@ proc/populate_gear_list() var/whitelisted //Term to check the whitelist for.. //Standard gear datums. + +/datum/gear/cards + display_name = "deck of cards" + path = /obj/item/weapon/deck + cost = 2 + +/datum/gear/dice + display_name = "d20" + path = /obj/item/weapon/dice/d20 + cost = 1 + +/datum/gear/comb + display_name = "purple comb" + path = /obj/item/weapon/fluff/cado_keppel_1 + cost = 1 + /datum/gear/tie_horrible display_name = "horrible tie" path = /obj/item/clothing/tie/horrible @@ -347,6 +363,19 @@ proc/populate_gear_list() cost = 3 allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") +/datum/gear/engineer_bandana + display_name = "engineering bandana" + path = /obj/item/clothing/head/helmet/greenbandana/fluff/taryn_kifer_1 + cost = 2 + allowed_roles = list("Station Engineer","Atmospheric Technician","Chief Engineer") + +//Science +/datum/gear/scanning_goggles + display_name = "scanning goggles" + path = /obj/item/clothing/glasses/fluff/uzenwa_sissra_1 + cost = 2 + allowed_roles = list("Roboticist", "Scientist", "Research Director") + //Species-specific gear datums. /datum/gear/zhan_furs display_name = "Zhan-Khazan furs" diff --git a/code/modules/clothing/suits/alien.dm b/code/modules/clothing/suits/alien.dm index 8b3c7de076f..539efcaacc9 100644 --- a/code/modules/clothing/suits/alien.dm +++ b/code/modules/clothing/suits/alien.dm @@ -23,10 +23,6 @@ item_state = "zhan_furs" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS - sprite_sheets = list( - "Tajaran" = 'icons/mob/species/tajaran/suit.dmi', - ) - /obj/item/clothing/head/tajaran/scarf name = "headscarf" desc = "A scarf of coarse fabric. Seems to have ear-holes." From dd99197be713ae3653ea6104ebbe8b97ff865d92 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 12:20:16 +0930 Subject: [PATCH 08/14] Merging in a couple of new Tajaran icons. --- icons/mob/head.dmi | Bin 111826 -> 113186 bytes icons/mob/suit.dmi | Bin 237129 -> 239329 bytes icons/obj/clothing/hats.dmi | Bin 58998 -> 59315 bytes icons/obj/clothing/suits.dmi | Bin 85510 -> 86341 bytes 4 files changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index c4453316df9a3d302a05d484a77cc3a531ce301f..feafab49836408d39f242ba590a1baf16b76c6ce 100644 GIT binary patch delta 15977 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 M{y?qtj!pRg1v7LD=>Px# delta 14607 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 delta 24125 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 delta 4416 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 a;Ral~NmAq?Of?3e&r2C4=@Ka;pZ^1#w5hKE delta 10993 zcmZX41yohRyYD`9cSv`rlqg*Xq&t*uDM1DqSKH(%s$NAPv%Sc$@!w z_pbHsJ?pG9dw(-$X3saj`QkUbBL_7k9W|C2_CAgU4#Tdn3WI^F@s5U1yi~vcIc)T) zYq&W*C-9HXDJ1_P6-C8%rB5zKFLvJ~F@Jt<;FnlSffJF)*JOjq?PN z1nie+YLim&%$<#BR|*1VP-vq?{3lIwn6w{Ds9uNX;$srxdB zB*rJ?vuPoBs_bB_qb!%2Tv zpWcqkMV3_CehN=y9#A9Rm~)InXsQ(2N6BiwQBk&~Et#AR$>+1BS73O;O5_;U%2hs3 zuE+JqpMz&f!fJ@ed!_Dqn5Xg3^C4bqtMl|Ei>3OZD<5&WvMFSsiQmA;$o}k8!y8?& z-t$>PYHII$cXzXi!q@$sQB*VG#B8g3GnIUSc4+`W4=6}WzS3>-6YK5m&3g63d2jkz zduQira{%)6PfP5C&!0Pmg@k5|aAmts^b|>Kebn^_Nev0m+GT>py3zZ>!uQtHD9n^S zY*Hi)g{hq};Zu`$2MOiSxq-`wQAxi}QKVc{1LcyoRF*9y-G`qjp>xkudLc*U%oE|r24W;eIV zk5*=l72aa*?Cu=R`)X<28$AO>J(gaLPfcWh`}J*UD^w}*tx;Khy1_j?qo+bS?bOtB zb8`xmH;2A2H^vLJ?u47Q@>CT@59!8C%-GnI@_9{M6_WB1n;=83tvQa&isX&HPPnJje@zXheyJUQ_Cs}EyVTQjN zMPkBnJ>&C-XbIgs`k!FCPW6#P40B7-t}UU-LZHy#n)G2p*z|P)IO3DI754lZ5MlW6DaN1gPYPr%8Xs^QF+GdsS5Wsq5%gcUC&)6UR`K>*F3J( zB_$=z&(Ck(2j{AtZ_e#~?#`xs8YzLq!dK?*jv)!A8B>!a`3XV0!+jAEP8+?X#;5+q zY@W~sN5b-jS~?vdj!C;biP}(Ke|07vkHgJZQc_}LZ!e>ygdGtXIWjuhS{;Rghle+8 zTUFz-fz{g9R`G6zHz+i8tvBf@B)sMDpN7CX3>tb-xL5xQ)8RKix%_ioNY>;eN(~MswUKIUSkx_GCRf6HZuarPa=55k2;2P+Lk0{h92p=HNc*cjz+Jj zo`YrDMaS*LYH;0q;%$}0rX>=*C7slE^$Hf#ue2_nAG!$%9);b0#(I}|Pn58v8Q|Xx zN6eZoTIWwkJUQ6e`6(=mWM+}ML1Lq&MJz$eiJDqvSJAe9U1nHoeqNWGj{)7w>>m!B zAiCqFFDk8@S}uZvQ>cez0wBVlMIWPS+5-6Gp-iWf)) zXiV)bEiL^?3claEMnm=!oa}b=2j^grCq*fHAoLIeZ9lc;);ZHkY@WY^^wo*aaaFO z%f4yIx}QG{#MS3aPtVXW1PyWe78u*%##$fWYf%O*^(4?s9#q3H5>yeK<`lvV&s|)< z(4~xuM3)+2ztJR`ohcr*OM7K@4aXBm*8rokGH-)rP3r$ zhq+hpSaIuERN3X|{t2ds1N%AIhmDL@&7qz8fIfD}jqQ>y%LJ30{-H8$+x;%jyVQc5QY_ zj-+M{Q6;c5$)D5YC%}yfJ5Vi3ChX7!j|Pc|G*l)C|ym zKRW&J%H{>n_V+I?m8gUg&7v5rFJ2@%CKIu-u|WnM`Wk|bK3_}@-CbN-YhAZ^-i|U0 ziikuu;?+Ylo@`sd?Brr9EUFb%``7|(ps>6krR=ugeWjz*HfpS|v!fBQE;@d8qk|OV=S;}^ zXD5IQcnRtv|GG;1aNI$zcX;Xff^TA#n~MJ#cjF~v)4xBQl9lgn`a)FtBOUF{8yafO zr_IB&O2p3hI0fDdoT>4*l~k_${GpcVP-ণ|)MEYigezqedY#DwbFNpFksit$= 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 From 55d52ef1f46a7b356d5e646a7285dc9d034d015c Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 12:25:08 +0930 Subject: [PATCH 09/14] Cleaned up a little oversight. --- code/modules/mob/living/carbon/species.dm | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/code/modules/mob/living/carbon/species.dm b/code/modules/mob/living/carbon/species.dm index 7ca77168b09..feb74deb548 100644 --- a/code/modules/mob/living/carbon/species.dm +++ b/code/modules/mob/living/carbon/species.dm @@ -54,9 +54,6 @@ var/race_key = 0 var/icon/icon_template - //Used for character generation fluff items. - var/list/custom_gear_options - /datum/species/New() unarmed = new unarmed_type() @@ -145,11 +142,6 @@ reagent_tag = IS_UNATHI base_color = "#066000" - custom_gear_options = list( - "Unathi robe" = /obj/item/clothing/suit/unathi/robe, - "Unathi mantle" = /obj/item/clothing/suit/unathi/mantle - ) - /datum/species/tajaran name = "Tajaran" icobase = 'icons/mob/human_races/r_tajaran.dmi' @@ -175,11 +167,6 @@ flesh_color = "#AFA59E" base_color = "#333333" - custom_gear_options = list( - /obj/item/clothing/head/tajaran/scarf, - /obj/item/clothing/suit/tajaran/furs - ) - /datum/species/skrell name = "Skrell" icobase = 'icons/mob/human_races/r_skrell.dmi' From 8f09c557f9cf70580aa8d2680e0f071c2232745b Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 13:12:01 +0930 Subject: [PATCH 10/14] Added paperwork handler, clerical gripper, some other tweaks. --- .../living/silicon/robot/drone/drone_items.dm | 13 ++++++++++ .../mob/living/silicon/robot/robot_items.dm | 25 +++++++++++++++++-- .../mob/living/silicon/robot/robot_modules.dm | 10 +++++--- 3 files changed, 43 insertions(+), 5 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/drone/drone_items.dm b/code/modules/mob/living/silicon/robot/drone/drone_items.dm index 7c2dc565a4e..dfe1a9db29e 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm @@ -28,6 +28,19 @@ //Item currently being held. var/obj/item/wrapped = null +/obj/item/weapon/gripper/paperwork + name = "paperwork gripper" + desc = "A simple grasping tool for clerical work." + icon = 'icons/obj/device.dmi' + icon_state = "gripper" + + can_hold = list( + /obj/item/weapon/clipboard, + /obj/item/weapon/paper, + /obj/item/weapon/paper_bundle, + /obj/item/weapon/card/id + ) + /obj/item/weapon/gripper/attack_self(mob/user as mob) if(wrapped) wrapped.attack_self(user) diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 00d1b0abf0c..0536b07fd44 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -114,7 +114,7 @@ mode = 1 user << "Changed printing mode to '[mode == 2 ? "Rename Paper" : "Write Paper"]'" - return + return // Copied over from paper's rename verb // see code\modules\paperwork\paper.dm line 62 @@ -132,12 +132,33 @@ add_fingerprint(user) return +//TODO: Add prewritten forms to dispense when you work out a good way to store the strings. /obj/item/weapon/form_printer - name = "paperwork printer" + //name = "paperwork printer" + name = "paper dispenser" icon = 'icons/obj/bureaucracy.dmi' icon_state = "paper_bin1" item_state = "sheet-metal" +/obj/item/weapon/form_printer/attack(mob/living/carbon/M as mob, mob/living/carbon/user as mob) + return + +/obj/item/weapon/form_printer/afterattack(atom/target as mob|obj|turf|area, mob/living/user as mob|obj, flag, params) + + if(!target || !flag) + return + + if(istype(target,/obj/structure/table)) + deploy_paper(get_turf(target)) + +/obj/item/weapon/form_printer/attack_self(mob/user as mob) + deploy_paper(get_turf(src)) + +/obj/item/weapon/form_printer/proc/deploy_paper(var/turf/T) + T.visible_message("\blue \The [src.loc] dispenses a sheet of crisp white paper.") + new /obj/item/weapon/paper(T) + + //Personal shielding for the combat module. /obj/item/borg/combat/shield name = "personal shielding" diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index b1797e6b2a9..aa9f5ce958f 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -277,7 +277,6 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src) src.modules += new /obj/item/weapon/reagent_containers/food/condiment/enzyme(src) - src.modules += new /obj/item/weapon/pen/robopen(src) var/obj/item/weapon/rsf/M = new /obj/item/weapon/rsf(src) M.matter = 30 @@ -318,6 +317,10 @@ src.modules += new /obj/item/device/flashlight(src) src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/weapon/pen/robopen(src) + src.modules += new /obj/item/weapon/form_printer(src) + src.modules += new /obj/item/weapon/gripper/paperwork(src) + + src.emag = new /obj/item/weapon/stamp/denied(src) add_languages(var/mob/living/silicon/robot/R) R.add_language("Sol Common", 1) @@ -344,6 +347,7 @@ src.modules += new /obj/item/device/flash(src) src.modules += new /obj/item/borg/sight/meson(src) src.modules += new /obj/item/weapon/wrench(src) + src.modules += new /obj/item/weapon/screwdriver(src) src.modules += new /obj/item/weapon/storage/bag/ore(src) src.modules += new /obj/item/weapon/pickaxe/borgdrill(src) src.modules += new /obj/item/weapon/storage/bag/sheetsnatcher/borg(src) @@ -430,7 +434,7 @@ /obj/item/proc/is_robot_module() if (!istype(src.loc, /mob/living/silicon/robot)) return 0 - + var/mob/living/silicon/robot/R = src.loc - + return (src in R.module.modules) From 0d21889beea9ca343979ce8d48358e76212f7e6e Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 13:50:34 +0930 Subject: [PATCH 11/14] Fixed some bugs, did some testing, moved some procs around for robot functionality. --- .../structures/stool_bed_chair_nest/bed.dm | 16 +++++++++++++++- code/modules/mob/living/silicon/robot/robot.dm | 12 ++++++++++-- .../mob/living/silicon/robot/robot_items.dm | 2 +- .../mob/living/silicon/robot/robot_modules.dm | 2 ++ 4 files changed, 28 insertions(+), 4 deletions(-) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index 985d34d8c04..19bbcf36f45 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -71,7 +71,9 @@ "You hear metal clanking") unbuckle() src.add_fingerprint(user) - return + return 1 + + return 0 /obj/structure/stool/bed/proc/buckle_mob(mob/M as mob, mob/user as mob) if (!ticker) @@ -112,6 +114,18 @@ icon_state = "down" anchored = 0 +/obj/structure/stool/bed/roller/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W,/obj/item/roller_holder)) + if(buckled_mob) + manual_unbuckle() + else + visible_message("[user] collapses \the [src.name].") + new/obj/item/roller(get_turf(src)) + spawn(0) + del(src) + return + ..() + /obj/item/roller name = "roller bed" desc = "A collapsed roller bed that can be carried around." diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 00124ffd635..8d1823f0c51 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -163,7 +163,7 @@ /mob/living/silicon/robot/proc/pick_module() if(module) return - var/list/modules = list("Standard", "Engineering", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Security") + var/list/modules = list("Standard", "Engineering", "Construction", "Surgeon", "Crisis", "Miner", "Janitor", "Service", "Clerical", "Security") if(crisis && security_level == SEC_LEVEL_RED) //Leaving this in until it's balanced appropriately. src << "\red Crisis mode active. Combat module available." modules+="Combat" @@ -189,6 +189,14 @@ module_sprites["Rich"] = "maximillion" module_sprites["Default"] = "Service2" + if("Clerical") + module = new /obj/item/weapon/robot_module/clerical(src) + module_sprites["Waitress"] = "Service" + module_sprites["Kent"] = "toiletbot" + module_sprites["Bro"] = "Brobot" + module_sprites["Rich"] = "maximillion" + module_sprites["Default"] = "Service2" + if("Miner") module = new /obj/item/weapon/robot_module/miner(src) module.channels = list("Supply" = 1) @@ -237,7 +245,7 @@ module_sprites["Landmate"] = "landmate" if("Construction") - module = new /obj/item/weapon/robot_module/engineering(src) + module = new /obj/item/weapon/robot_module/construction(src) module.channels = list("Engineering" = 1) if(camera && "Robots" in camera.network) camera.network.Add("Engineering") diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index 0536b07fd44..931cb0556be 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -105,7 +105,7 @@ if("Colour") var/newcolour = input("Which colour would you like to use?") as null|anything in list("black","blue","red","green","yellow") - if(newcolour) color = newcolour + if(newcolour) colour = newcolour if("Mode") if (mode == 1) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index aa9f5ce958f..3ad034666a9 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -134,6 +134,8 @@ src.modules += new /obj/item/weapon/reagent_containers/syringe(src) src.modules += new /obj/item/weapon/extinguisher/mini(src) + src.emag = new /obj/item/weapon/reagent_containers/spray(src) + src.emag.reagents.add_reagent("pacid", 250) src.emag.name = "Polyacid spray" return From d2c57115ed95f982249ecf6fc83994271b5d19e9 Mon Sep 17 00:00:00 2001 From: Zuhayr Date: Fri, 11 Jul 2014 13:55:21 +0930 Subject: [PATCH 12/14] Added glass to the engineering module. --- code/modules/mob/living/silicon/robot/robot_modules.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 3ad034666a9..00caecb8f0a 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -180,6 +180,7 @@ stacktypes = list( /obj/item/stack/sheet/metal = 50, + /obj/item/stack/sheet/glass = 50, /obj/item/stack/sheet/rglass = 50, /obj/item/weapon/cable_coil = 50, /obj/item/stack/rods = 15, @@ -209,7 +210,11 @@ M.amount = 50 src.modules += M - var/obj/item/stack/sheet/rglass/cyborg/G = new /obj/item/stack/sheet/rglass/cyborg(src) + var/obj/item/stack/sheet/rglass/cyborg/R = new /obj/item/stack/sheet/rglass/cyborg(src) + R.amount = 50 + src.modules += R + + var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(src) G.amount = 50 src.modules += G From b6856eac8b706778e6216fc98e52dd499cc88a3c Mon Sep 17 00:00:00 2001 From: Walter0o Date: Fri, 11 Jul 2014 09:19:23 +0200 Subject: [PATCH 13/14] can't trust players with anything --- code/modules/mob/living/carbon/human/human.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 50c3076b3af..4f6368ad6fa 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1475,6 +1475,8 @@ text = input("What would you like to say?", "Speak to creature", null, null) + text = trim(copytext(sanitize(text), 1, MAX_MESSAGE_LEN)) + if(!text) return var/mob/M = targets[target] @@ -1483,10 +1485,12 @@ src << "Not even a [src.species.name] can speak to the dead." return + log_say("[key_name(src)] communed to [key_name(M)]: [text]") + M << "\blue Like lead slabs crashing into the ocean, alien thoughts drop into your mind: [text]" if(istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M if(H.species.name == src.species.name) return H << "\red Your nose begins to bleed..." - H.drip(1) \ No newline at end of file + H.drip(1) From 6b64fb5e77f448a0a7a99f6cb24474b9b8ec0f9e Mon Sep 17 00:00:00 2001 From: Loganbacca Date: Mon, 14 Jul 2014 19:12:22 +1200 Subject: [PATCH 14/14] Pipe rendering rewrite - Complete rewrite of pipe rendering code. It now selects icons from a shared cache. - Manifolds and other devices (pumps, filters, etc.) now match the color of the connected pipes. - Updated omni devices to use the shared cache. - Set separate pipe color definitions. - Cleaned up a lot of pipe code, converting it to absolute paths and removing old commented out code. - Tweaked t-ray rendering code. - Tweaked pipe painter. - Enhanced pipe checking debug command. - Expanded tank capacity and resprited them. --- baystation12.dme | 1 + code/ATMOSPHERICS/_atmos_setup.dm | 200 ++++ code/ATMOSPHERICS/atmospherics.dm | 70 +- .../binary_devices/binary_atmos_base.dm | 4 + .../components/binary_devices/dp_vent_pump.dm | 296 +++--- .../components/binary_devices/passive_gate.dm | 275 +++--- .../components/binary_devices/pump.dm | 293 +++--- .../components/binary_devices/volume_pump.dm | 284 +++--- .../components/omni_devices/_omni_extras.dm | 37 - .../components/omni_devices/omni_base.dm | 55 +- .../components/portables_connector.dm | 231 +++-- .../components/trinary_devices/filter.dm | 280 +++--- .../components/trinary_devices/mixer.dm | 306 +++--- .../trinary_devices/trinary_base.dm | 5 + code/ATMOSPHERICS/components/tvalve.dm | 846 +++++++++-------- .../components/unary/outlet_injector.dm | 242 +++-- .../components/unary/unary_base.dm | 4 + .../components/unary/vent_pump.dm | 555 +++++------ .../components/unary/vent_scrubber.dm | 428 +++++---- code/ATMOSPHERICS/components/valve.dm | 566 ++++++----- code/ATMOSPHERICS/mapdebugging.dm | 16 - code/ATMOSPHERICS/pipes.dm | 884 +++++++++--------- code/game/machinery/pipe/construction.dm | 20 +- .../objects/items/devices/pipe_painter.dm | 17 +- code/game/objects/items/devices/scanners.dm | 2 + code/game/turfs/simulated/floor_types.dm | 3 +- code/modules/admin/verbs/atmosdebug.dm | 20 +- code/modules/recycling/disposal.dm | 4 +- icons/atmos/connector.dmi | Bin 0 -> 653 bytes icons/atmos/digital_tvalve.dmi | Bin 0 -> 2486 bytes icons/atmos/digital_valve.dmi | Bin 0 -> 3435 bytes icons/atmos/filter.dmi | Bin 0 -> 17954 bytes icons/atmos/injector.dmi | Bin 0 -> 939 bytes icons/atmos/manifold.dmi | Bin 0 -> 1097 bytes icons/atmos/mixer.dmi | Bin 0 -> 27952 bytes icons/atmos/omni_devices.dmi | Bin 0 -> 12175 bytes icons/atmos/passive_gate.dmi | Bin 0 -> 1052 bytes icons/atmos/pipe_underlays.dmi | Bin 0 -> 1070 bytes icons/atmos/pipes.dmi | Bin 0 -> 1433 bytes icons/atmos/pump.dmi | Bin 0 -> 1561 bytes icons/atmos/tank.dmi | Bin 0 -> 3062 bytes icons/atmos/tvalve.dmi | Bin 0 -> 2974 bytes icons/atmos/valve.dmi | Bin 0 -> 1544 bytes icons/atmos/vent_pump.dmi | Bin 0 -> 36930 bytes icons/atmos/vent_scrubber.dmi | Bin 0 -> 1328 bytes icons/atmos/volume_pump.dmi | Bin 0 -> 4062 bytes icons/obj/atmospherics/omni_devices.dmi | Bin 12990 -> 13197 bytes 47 files changed, 3137 insertions(+), 2807 deletions(-) create mode 100644 code/ATMOSPHERICS/_atmos_setup.dm delete mode 100644 code/ATMOSPHERICS/mapdebugging.dm create mode 100644 icons/atmos/connector.dmi create mode 100644 icons/atmos/digital_tvalve.dmi create mode 100644 icons/atmos/digital_valve.dmi create mode 100644 icons/atmos/filter.dmi create mode 100644 icons/atmos/injector.dmi create mode 100644 icons/atmos/manifold.dmi create mode 100644 icons/atmos/mixer.dmi create mode 100644 icons/atmos/omni_devices.dmi create mode 100644 icons/atmos/passive_gate.dmi create mode 100644 icons/atmos/pipe_underlays.dmi create mode 100644 icons/atmos/pipes.dmi create mode 100644 icons/atmos/pump.dmi create mode 100644 icons/atmos/tank.dmi create mode 100644 icons/atmos/tvalve.dmi create mode 100644 icons/atmos/valve.dmi create mode 100644 icons/atmos/vent_pump.dmi create mode 100644 icons/atmos/vent_scrubber.dmi create mode 100644 icons/atmos/volume_pump.dmi diff --git a/baystation12.dme b/baystation12.dme index afcec78b11e..9423cef1e0d 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -48,6 +48,7 @@ #include "code\_onclick\hud\other_mobs.dm" #include "code\_onclick\hud\robot.dm" #include "code\_onclick\hud\screen_objects.dm" +#include "code\ATMOSPHERICS\_atmos_setup.dm" #include "code\ATMOSPHERICS\atmospherics.dm" #include "code\ATMOSPHERICS\datum_pipe_network.dm" #include "code\ATMOSPHERICS\datum_pipeline.dm" diff --git a/code/ATMOSPHERICS/_atmos_setup.dm b/code/ATMOSPHERICS/_atmos_setup.dm new file mode 100644 index 00000000000..a34d372c59c --- /dev/null +++ b/code/ATMOSPHERICS/_atmos_setup.dm @@ -0,0 +1,200 @@ +//-------------------------------------------- +// Pipe colors +// +// Add them here and to the pipe_colors list +// to automatically add them to all relevant +// atmospherics devices. +//-------------------------------------------- + +#define PIPE_COLOR_GREY "#ffffff" //yes white is grey +#define PIPE_COLOR_RED "#ff0000" +#define PIPE_COLOR_BLUE "#0000ff" +#define PIPE_COLOR_CYAN "#00ffff" +#define PIPE_COLOR_GREEN "#00ff00" +#define PIPE_COLOR_YELLOW "#ffcc00" +#define PIPE_COLOR_PURPLE "#5c1ec0" + +var/global/list/pipe_colors = list("grey" = PIPE_COLOR_GREY, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE) + +/proc/pipe_color_lookup(var/color) + for(var/C in pipe_colors) + if(color == pipe_colors[C]) + return "[C]" + +/proc/pipe_color_check(var/color) + for(var/C in pipe_colors) + if(color == pipe_colors[C]) + return 1 + return 0 + +//-------------------------------------------- +// Icon cache generation +//-------------------------------------------- + +/datum/pipe_icon_manager + var/list/pipe_icons[] + var/list/manifold_icons[] + var/list/device_icons[] + var/list/underlays_down[] + var/list/underlays_exposed[] + var/list/underlays_intact[] + var/list/pipe_underlays_exposed[] + var/list/pipe_underlays_intact[] + var/list/omni_icons[] + +/datum/pipe_icon_manager/New() + check_icons() + +/datum/pipe_icon_manager/proc/get_atmos_icon(var/device, var/dir, var/color, var/state) + check_icons() + + device = "[device]" + state = "[state]" + color = "[color]" + dir = "[dir]" + + switch(device) + if("pipe") + return pipe_icons[state + color] + if("manifold") + return manifold_icons[state + color] + if("device") + return device_icons[state] + if("omni") + return omni_icons[state] + if("underlay_intact") + return underlays_intact[dir + color] + if("underlay_exposed") + return underlays_exposed[dir + color] + if("underlay_down") + return underlays_down[dir + color] + if("pipe_underlay_exposed") + return pipe_underlays_exposed[dir + color] + if("pipe_underlay_intact") + return pipe_underlays_intact[dir + color] + +/datum/pipe_icon_manager/proc/check_icons() + if(!pipe_icons) + gen_pipe_icons() + if(!manifold_icons) + gen_manifold_icons() + if(!device_icons) + gen_device_icons() + if(!omni_icons) + gen_omni_icons() + if(!underlays_intact || !underlays_down || !underlays_exposed || !pipe_underlays_exposed || !pipe_underlays_intact) + gen_underlay_icons() + +/datum/pipe_icon_manager/proc/gen_pipe_icons() + if(!pipe_icons) + pipe_icons = new() + + var/icon/pipe = new('icons/atmos/pipes.dmi') + + for(var/state in pipe.IconStates()) + if(!state || findtext(state, "map")) + continue + + var/cache_name = state + var/image/I = image('icons/atmos/pipes.dmi', icon_state = state) + pipe_icons[cache_name] = I + + for(var/pipe_color in pipe_colors) + I = image('icons/atmos/pipes.dmi', icon_state = state) + I.color = pipe_colors[pipe_color] + pipe_icons[state + "[pipe_colors[pipe_color]]"] = I + +/datum/pipe_icon_manager/proc/gen_manifold_icons() + if(!manifold_icons) + manifold_icons = new() + + var/icon/pipe = new('icons/atmos/manifold.dmi') + + for(var/state in pipe.IconStates()) + if(findtext(state, "clamps")) + var/image/I = image('icons/atmos/manifold.dmi', icon_state = state) + manifold_icons[state] = I + continue + + if(state == "core" || state == "4way") + var/image/I = image('icons/atmos/manifold.dmi', icon_state = state) + manifold_icons[state] = I + for(var/pipe_color in pipe_colors) + I = image('icons/atmos/manifold.dmi', icon_state = state) + I.color = pipe_colors[pipe_color] + manifold_icons[state + pipe_colors[pipe_color]] = I + +/datum/pipe_icon_manager/proc/gen_device_icons() + if(!device_icons) + device_icons = new() + + var/icon/device + + device = new('icons/atmos/vent_pump.dmi') + for(var/state in device.IconStates()) + if(!state || findtext(state, "map")) + continue + device_icons["vent" + state] = image('icons/atmos/vent_pump.dmi', icon_state = state) + + device = new('icons/atmos/vent_scrubber.dmi') + for(var/state in device.IconStates()) + if(!state || findtext(state, "map")) + continue + device_icons["scrubber" + state] = image('icons/atmos/vent_scrubber.dmi', icon_state = state) + +/datum/pipe_icon_manager/proc/gen_omni_icons() + if(!omni_icons) + omni_icons = new() + + var/icon/omni = new('icons/atmos/omni_devices.dmi') + + for(var/state in omni.IconStates()) + if(!state || findtext(state, "map")) + continue + omni_icons[state] = image('icons/atmos/omni_devices.dmi', icon_state = state) + +/datum/pipe_icon_manager/proc/gen_underlay_icons() + if(!underlays_intact) + underlays_intact = new() + if(!underlays_exposed) + underlays_exposed = new() + if(!underlays_down) + underlays_down = new() + if(!pipe_underlays_exposed) + pipe_underlays_exposed = new() + if(!pipe_underlays_intact) + pipe_underlays_intact = new() + + var/icon/pipe = new('icons/atmos/pipe_underlays.dmi') + + for(var/state in pipe.IconStates()) + if(state == "") + continue + + for(var/D in cardinal) + var/image/I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) + switch(state) + if("intact") + underlays_intact["[D]"] = I + if("exposed") + underlays_exposed["[D]"] = I + if("down") + underlays_down["[D]"] = I + if("pipe_exposed") + pipe_underlays_exposed["[D]"] = I + if("pipe_intact") + pipe_underlays_intact["[D]"] = I + for(var/pipe_color in pipe_colors) + I = image('icons/atmos/pipe_underlays.dmi', icon_state = state, dir = D) + I.color = pipe_colors[pipe_color] + switch(state) + if("intact") + underlays_intact["[D]" + pipe_colors[pipe_color]] = I + if("exposed") + underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("down") + underlays_down["[D]" + pipe_colors[pipe_color]] = I + if("pipe_exposed") + pipe_underlays_exposed["[D]" + pipe_colors[pipe_color]] = I + if("pipe_intact") + pipe_underlays_intact["[D]" + pipe_colors[pipe_color]] = I \ No newline at end of file diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 1b89db43be1..d652aed9d95 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -10,48 +10,96 @@ Pipelines + Other Objects -> Pipe network */ -obj/machinery/atmospherics +/obj/machinery/atmospherics anchored = 1 idle_power_usage = 0 active_power_usage = 0 power_channel = ENVIRON var/nodealert = 0 + var/initialize_directions = 0 + var/pipe_color + + var/global/datum/pipe_icon_manager/icon_manager +/obj/machinery/atmospherics/New() + if(!icon_manager) + icon_manager = new() + + if(!pipe_color) + pipe_color = color + color = null + + if(!pipe_color_check(pipe_color)) + pipe_color = null + ..() -obj/machinery/atmospherics/var/initialize_directions = 0 -obj/machinery/atmospherics/var/pipe_color +/obj/machinery/atmospherics/attackby(atom/A, mob/user as mob) + if(istype(A, /obj/item/device/pipe_painter)) + return + ..() -obj/machinery/atmospherics/process() +/obj/machinery/atmospherics/proc/add_underlay(var/turf/T, var/obj/machinery/atmospherics/node, var/direction) + if(node) + if(T.intact && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + underlays += icon_manager.get_atmos_icon("underlay_down", direction, color_cache_name(node)) + else + underlays += icon_manager.get_atmos_icon("underlay_intact", direction, color_cache_name(node)) + else + underlays += icon_manager.get_atmos_icon("underlay_exposed", direction, pipe_color) + +/obj/machinery/atmospherics/proc/update_underlays() + if(check_icon_cache()) + return 1 + else + return 0 + +/obj/machinery/atmospherics/proc/check_icon_cache(var/safety = 0) + if(!istype(icon_manager)) + if(!safety) //to prevent infinite loops + icon_manager = new() + check_icon_cache(1) + return 0 + + return 1 + +/obj/machinery/atmospherics/proc/color_cache_name(var/obj/machinery/atmospherics/node) + //Don't use this for standard pipes + if(!istype(node)) + return null + + return node.pipe_color + +/obj/machinery/atmospherics/process() build_network() -obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) +/obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) // Check to see if should be added to network. Add self if so and adjust variables appropriately. // Note don't forget to have neighbors look as well! return null -obj/machinery/atmospherics/proc/build_network() +/obj/machinery/atmospherics/proc/build_network() // Called to build a network from this node return null -obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/proc/return_network(obj/machinery/atmospherics/reference) // Returns pipe_network associated with connection to reference // Notes: should create network if necessary // Should never return null return null -obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) +/obj/machinery/atmospherics/proc/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) // Used when two pipe_networks are combining -obj/machinery/atmospherics/proc/return_network_air(datum/network/reference) +/obj/machinery/atmospherics/proc/return_network_air(datum/network/reference) // Return a list of gas_mixture(s) in the object // associated with reference pipe_network for use in rebuilding the networks gases list // Is permitted to return null -obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/proc/disconnect(obj/machinery/atmospherics/reference) -obj/machinery/atmospherics/update_icon() +/obj/machinery/atmospherics/update_icon() return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 9d2a8e32e8a..52f57b29582 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -76,6 +76,7 @@ obj/machinery/atmospherics/binary break update_icon() + update_underlays() build_network() if(!network1 && node1) @@ -127,4 +128,7 @@ obj/machinery/atmospherics/binary del(network2) node2 = null + update_icon() + update_underlays() + return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index ac451871dc2..6a21d08245b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/binary/dp_vent_pump - icon = 'icons/obj/atmospherics/dp_vent_pump.dmi' - icon_state = "off" + icon = 'icons/atmos/vent_pump.dmi' + icon_state = "map_dp_vent" //node2 is output port //node1 is input port @@ -10,15 +10,6 @@ level = 1 - high_volume - name = "Large Dual Port Air Vent" - - New() - ..() - - air1.volume = 1000 - air2.volume = 1000 - var/on = 0 var/pump_direction = 1 //0 = siphoning, 1 = releasing @@ -26,174 +17,199 @@ var/input_pressure_min = 0 var/output_pressure_max = 0 + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection + var/pressure_checks = 1 //1: Do not pass external_pressure_bound //2: Do not pass input_pressure_min //4: Do not pass output_pressure_max +/obj/machinery/atmospherics/binary/dp_vent_pump/New() + ..() + icon = null + +/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume + name = "Large Dual Port Air Vent" + +/obj/machinery/atmospherics/binary/dp_vent_pump/high_volume/New() + ..() + air1.volume = 1000 + air2.volume = 1000 + +/obj/machinery/atmospherics/binary/dp_vent_pump/update_icon(var/safety = 0) + if(!check_icon_cache()) + return + + overlays.Cut() + + var/vent_icon = "vent" + + var/turf/T = get_turf(src) + if(!istype(T)) + return + + if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) + vent_icon += "h" + + if(!powered()) + vent_icon += "off" + else + vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" + + overlays += icon_manager.get_atmos_icon("device", , , vent_icon) + +/obj/machinery/atmospherics/binary/dp_vent_pump/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + if(T.intact && node1 && node2 && node1.level == 1 && node2.level == 1 && istype(node1, /obj/machinery/atmospherics/pipe) && istype(node2, /obj/machinery/atmospherics/pipe)) + return + else + add_underlay(T, node1, turn(dir, -180)) + add_underlay(T, node2, dir) + +/obj/machinery/atmospherics/binary/dp_vent_pump/hide(var/i) update_icon() - if(on) - if(pump_direction) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 + update_underlays() - return +/obj/machinery/atmospherics/binary/dp_vent_pump/process() + ..() - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(on) - if(pump_direction) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - return + if(!on) + return 0 - process() - ..() + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() - if(!on) - return 0 + if(pump_direction) //input -> external + var/pressure_delta = 10000 - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) - if(pump_direction) //input -> external - var/pressure_delta = 10000 + if(pressure_delta > 0) + if(air1.temperature > 0) + var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (air1.return_pressure() - input_pressure_min)) + var/datum/gas_mixture/removed = air1.remove(transfer_moles) - if(pressure_delta > 0) - if(air1.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + loc.assume_air(removed) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) + if(network1) + network1.update = 1 - loc.assume_air(removed) + else //external -> output + var/pressure_delta = 10000 - if(network1) - network1.update = 1 + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) + if(pressure_checks&4) + pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) - else //external -> output - var/pressure_delta = 10000 + if(pressure_delta > 0) + if(environment.temperature > 0) + var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&4) - pressure_delta = min(pressure_delta, (output_pressure_max - air2.return_pressure())) + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if(pressure_delta > 0) - if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air2.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + air2.merge(removed) - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if(network2) + network2.update = 1 - air2.merge(removed) - - if(network2) - network2.update = 1 - - return 1 + return 1 //Radio remote control - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) +/obj/machinery/atmospherics/binary/dp_vent_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - broadcast_status() - if(!radio_connection) - return 0 +/obj/machinery/atmospherics/binary/dp_vent_pump/proc/broadcast_status() + if(!radio_connection) + return 0 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - signal.data = list( - "tag" = id, - "device" = "ADVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "input" = input_pressure_min, - "output" = output_pressure_max, - "external" = external_pressure_bound, - "sigtype" = "status" - ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + signal.data = list( + "tag" = id, + "device" = "ADVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "input" = input_pressure_min, + "output" = output_pressure_max, + "external" = external_pressure_bound, + "sigtype" = "status" + ) + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - return 1 + return 1 - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection +/obj/machinery/atmospherics/binary/dp_vent_pump/initialize() + ..() + if(frequency) + set_frequency(frequency) - initialize() - ..() - if(frequency) - set_frequency(frequency) +/obj/machinery/atmospherics/binary/dp_vent_pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 + if(signal.data["power"]) + on = text2num(signal.data["power"]) - receive_signal(datum/signal/signal) + if(signal.data["power_toggle"]) + on = !on - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 - if("power" in signal.data) - on = text2num(signal.data["power"]) + if(signal.data["direction"]) + pump_direction = text2num(signal.data["direction"]) - if("power_toggle" in signal.data) - on = !on + if(signal.data["checks"]) + pressure_checks = text2num(signal.data["checks"]) - if("direction" in signal.data) - pump_direction = text2num(signal.data["direction"]) + if(signal.data["purge"]) + pressure_checks &= ~1 + pump_direction = 0 - if("checks" in signal.data) - pressure_checks = text2num(signal.data["checks"]) + if(signal.data["stabalize"]) + pressure_checks |= 1 + pump_direction = 1 - if("purge" in signal.data) - pressure_checks &= ~1 - pump_direction = 0 + if(signal.data["set_input_pressure"]) + input_pressure_min = between( + 0, + text2num(signal.data["set_input_pressure"]), + ONE_ATMOSPHERE*50 + ) - if("stabalize" in signal.data) - pressure_checks |= 1 - pump_direction = 1 + if(signal.data["set_output_pressure"]) + output_pressure_max = between( + 0, + text2num(signal.data["set_output_pressure"]), + ONE_ATMOSPHERE*50 + ) - if("set_input_pressure" in signal.data) - input_pressure_min = between( - 0, - text2num(signal.data["set_input_pressure"]), - ONE_ATMOSPHERE*50 - ) + if(signal.data["set_external_pressure"]) + external_pressure_bound = between( + 0, + text2num(signal.data["set_external_pressure"]), + ONE_ATMOSPHERE*50 + ) - if("set_output_pressure" in signal.data) - output_pressure_max = between( - 0, - text2num(signal.data["set_output_pressure"]), - ONE_ATMOSPHERE*50 - ) - - if("set_external_pressure" in signal.data) - external_pressure_bound = between( - 0, - text2num(signal.data["set_external_pressure"]), - ONE_ATMOSPHERE*50 - ) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - //if(signal.data["tag"]) + if(signal.data["status"]) spawn(2) broadcast_status() - update_icon() \ No newline at end of file + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index a126928e2da..4766883a645 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -1,8 +1,9 @@ -obj/machinery/atmospherics/binary/passive_gate +/obj/machinery/atmospherics/binary/passive_gate //Tries to achieve target pressure at output (like a normal pump) except // Uses no power but can not transfer gases from a low pressure area to a high pressure area - icon = 'icons/obj/atmospherics/passive_gate.dmi' - icon_state = "intact_off" + icon = 'icons/atmos/passive_gate.dmi' + icon_state = "map" + level = 1 name = "Passive gate" desc = "A one-way air valve that does not require power" @@ -14,175 +15,161 @@ obj/machinery/atmospherics/binary/passive_gate var/id = null var/datum/radio_frequency/radio_connection - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" - else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" - return +/obj/machinery/atmospherics/binary/passive_gate/update_icon() + icon_state = "[on ? "on" : "off"]" - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node1, turn(dir, 180)) + add_underlay(T, node2, dir) - var/output_starting_pressure = air2.return_pressure() - var/input_starting_pressure = air1.return_pressure() +/obj/machinery/atmospherics/binary/passive_gate/hide(var/i) + update_underlays() - if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) - //No need to pump gas if target is already reached or input pressure is too low - //Need at least 10 KPa difference to overcome friction in the mechanism - return 1 +/obj/machinery/atmospherics/binary/passive_gate/process() + ..() + if(!on) + return 0 - //Calculate necessary moles to transfer using PV = nRT - if((air1.total_moles() > 0) && (air1.temperature>0)) - var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) - //Can not have a pressure delta that would cause output_pressure > input_pressure + var/output_starting_pressure = air2.return_pressure() + var/input_starting_pressure = air1.return_pressure() - var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + if(output_starting_pressure >= min(target_pressure,input_starting_pressure-10)) + //No need to pump gas if target is already reached or input pressure is too low + //Need at least 10 KPa difference to overcome friction in the mechanism + return 1 - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) + //Calculate necessary moles to transfer using PV = nRT + if((air1.total_moles() > 0) && (air1.temperature>0)) + var/pressure_delta = min(target_pressure - output_starting_pressure, (input_starting_pressure - output_starting_pressure)/2) + //Can not have a pressure delta that would cause output_pressure > input_pressure - if(network1) - network1.update = 1 + var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - if(network2) - network2.update = 1 + //Actually transfer the gas + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + air2.merge(removed) + if(network1) + network1.update = 1 - //Radio remote control + if(network2) + network2.update = 1 - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) +//Radio remote control - broadcast_status() - if(!radio_connection) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src +/obj/machinery/atmospherics/binary/passive_gate/proc/broadcast_status() + if(!radio_connection) + return 0 - signal.data = list( - "tag" = id, - "device" = "AGP", - "power" = on, - "target_output" = target_pressure, - "sigtype" = "status" - ) + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) + signal.data = list( + "tag" = id, + "device" = "AGP", + "power" = on, + "target_output" = target_pressure, + "sigtype" = "status" + ) - return 1 + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} + return 1 - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") +/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [round(target_pressure,0.1)]kPa | Change + "} - initialize() - ..() - if(frequency) - set_frequency(frequency) + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/binary/passive_gate/initialize() + ..() + if(frequency) + set_frequency(frequency) - if("power" in signal.data) - on = text2num(signal.data["power"]) +/obj/machinery/atmospherics/binary/passive_gate/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 - if("power_toggle" in signal.data) - on = !on + if("power" in signal.data) + on = text2num(signal.data["power"]) - if("set_output_pressure" in signal.data) - target_pressure = between( - 0, - text2num(signal.data["set_output_pressure"]), - ONE_ATMOSPHERE*50 - ) + if("power_toggle" in signal.data) + on = !on - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if("set_output_pressure" in signal.data) + target_pressure = between( + 0, + text2num(signal.data["set_output_pressure"]), + ONE_ATMOSPHERE*50 + ) + if("status" in signal.data) spawn(2) broadcast_status() - update_icon() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() + return + +/obj/machinery/atmospherics/binary/passive_gate/attack_hand(user as mob) + if(..()) return - - - - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." return + usr.set_machine(src) + interact(user) + return - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() - return - - power_change() - ..() - update_icon() - - - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) +/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return +/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index 0a0a56fb747..b8e54e5bc88 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -12,9 +12,10 @@ Thus, the two variables affect pump operation are set in New(): but overall network volume is also increased as this increases... */ -obj/machinery/atmospherics/binary/pump - icon = 'icons/obj/atmospherics/pump.dmi' - icon_state = "intact_off" +/obj/machinery/atmospherics/binary/pump + icon = 'icons/atmos/pump.dmi' + icon_state = "map" + level = 1 name = "Gas pump" desc = "A pump" @@ -26,180 +27,180 @@ obj/machinery/atmospherics/binary/pump var/id = null var/datum/radio_frequency/radio_connection - highcap - name = "High capacity gas pump" - desc = "A high capacity pump" +/obj/machinery/atmospherics/binary/pump/highcap + name = "High capacity gas pump" + desc = "A high capacity pump" - target_pressure = 15000000 + target_pressure = 15000000 - on - on = 1 - icon_state = "intact_on" +/obj/machinery/atmospherics/binary/pump/on + on = 1 - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" - else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" - return +/obj/machinery/atmospherics/binary/pump/update_icon() + if(!powered()) + icon_state = "off" + else + icon_state = "[on ? "on" : "off"]" - process() -// ..() - if(stat & (NOPOWER|BROKEN)) +/obj/machinery/atmospherics/binary/pump/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) return - if(!on) - return 0 + add_underlay(T, node1, turn(dir, -180)) + add_underlay(T, node2, dir) - var/output_starting_pressure = air2.return_pressure() +/obj/machinery/atmospherics/binary/pump/hide(var/i) + update_underlays() - if( (target_pressure - output_starting_pressure) < 0.01) - //No need to pump gas if target is already reached! - return 1 +/obj/machinery/atmospherics/binary/pump/process() +// ..() + if(stat & (NOPOWER|BROKEN)) + return + if(!on) + return 0 - //Calculate necessary moles to transfer using PV=nRT - if((air1.total_moles() > 0) && (air1.temperature>0)) - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) - - if(network1) - network1.update = 1 - - if(network2) - network2.update = 1 + var/output_starting_pressure = air2.return_pressure() + if( (target_pressure - output_starting_pressure) < 0.01) + //No need to pump gas if target is already reached! return 1 - //Radio remote control + //Calculate necessary moles to transfer using PV=nRT + if((air1.total_moles() > 0) && (air1.temperature>0)) + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles = pressure_delta*air2.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) + //Actually transfer the gas + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + air2.merge(removed) - broadcast_status() - if(!radio_connection) - return 0 + if(network1) + network1.update = 1 - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + if(network2) + network2.update = 1 - signal.data = list( - "tag" = id, - "device" = "AGP", - "power" = on, - "target_output" = target_pressure, - "sigtype" = "status" - ) + return 1 - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) +//Radio remote control - return 1 +/obj/machinery/atmospherics/binary/pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, filter = RADIO_ATMOSIA) - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [round(target_pressure,0.1)]kPa | Change - "} +/obj/machinery/atmospherics/binary/pump/proc/broadcast_status() + if(!radio_connection) + return 0 - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - initialize() - ..() - if(frequency) - set_frequency(frequency) + signal.data = list( + "tag" = id, + "device" = "AGP", + "power" = on, + "target_output" = target_pressure, + "sigtype" = "status" + ) - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - if("power" in signal.data) - on = text2num(signal.data["power"]) + return 1 - if("power_toggle" in signal.data) - on = !on +/obj/machinery/atmospherics/binary/pump/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [round(target_pressure,0.1)]kPa | Change + "} - if("set_output_pressure" in signal.data) - target_pressure = between( - 0, - text2num(signal.data["set_output_pressure"]), - ONE_ATMOSPHERE*50 - ) + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon +/obj/machinery/atmospherics/binary/pump/initialize() + ..() + if(frequency) + set_frequency(frequency) +/obj/machinery/atmospherics/binary/pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 + + if(signal.data["power"]) + on = text2num(signal.data["power"]) + + if(signal.data["power_toggle"]) + on = !on + + if(signal.data["set_output_pressure"]) + target_pressure = between( + 0, + text2num(signal.data["set_output_pressure"]), + ONE_ATMOSPHERE*50 + ) + + if(signal.data["status"]) spawn(2) broadcast_status() - update_icon() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() + return + + +/obj/machinery/atmospherics/binary/pump/attack_hand(user as mob) + if(..()) return - - - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." return + usr.set_machine(src) + interact(user) + return - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() - return +/obj/machinery/atmospherics/binary/pump/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return - power_change() - ..() +/obj/machinery/atmospherics/binary/pump/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) +/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm index e2dddfa97c1..2f9d775bd55 100644 --- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm @@ -12,9 +12,10 @@ Thus, the two variables affect pump operation are set in New(): but overall network volume is also increased as this increases... */ -obj/machinery/atmospherics/binary/volume_pump - icon = 'icons/obj/atmospherics/volume_pump.dmi' - icon_state = "intact_off" +/obj/machinery/atmospherics/binary/volume_pump + icon = 'icons/atmos/volume_pump.dmi' + icon_state = "map" + level = 1 name = "Volumetric gas pump" desc = "A volumetric pump" @@ -26,174 +27,167 @@ obj/machinery/atmospherics/binary/volume_pump var/id = null var/datum/radio_frequency/radio_connection - on - on = 1 - icon_state = "intact_on" +/obj/machinery/atmospherics/binary/volume_pump/on + on = 1 - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node1 && node2) - icon_state = "intact_[on?("on"):("off")]" - else - if(node1) - icon_state = "exposed_1_off" - else if(node2) - icon_state = "exposed_2_off" - else - icon_state = "exposed_3_off" - return +/obj/machinery/atmospherics/binary/volume_pump/update_icon() + if(!powered()) + icon_state = "off" + else + icon_state = "[on ? "on" : "off"]" - process() -// ..() - if(stat & (NOPOWER|BROKEN)) +/obj/machinery/atmospherics/binary/volume_pump/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) return - if(!on) - return 0 + add_underlay(T, node1, turn(dir, -180)) + add_underlay(T, node2, dir) + +/obj/machinery/atmospherics/binary/volume_pump/hide(var/i) + update_underlays() + +/obj/machinery/atmospherics/binary/volume_pump/process() +// ..() + if(stat & (NOPOWER|BROKEN)) + return + if(!on) + return 0 // Pump mechanism just won't do anything if the pressure is too high/too low - var/input_starting_pressure = air1.return_pressure() - var/output_starting_pressure = air2.return_pressure() - - if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000)) - return 1 - - var/transfer_ratio = max(1, transfer_rate/air1.volume) - - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - - air2.merge(removed) - - if(network1) - network1.update = 1 - - if(network2) - network2.update = 1 + var/input_starting_pressure = air1.return_pressure() + var/output_starting_pressure = air2.return_pressure() + if((input_starting_pressure < 0.01) || (output_starting_pressure > 9000)) return 1 - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency) + var/transfer_ratio = max(1, transfer_rate/air1.volume) - broadcast_status() - if(!radio_connection) - return 0 + var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src + air2.merge(removed) - signal.data = list( - "tag" = id, - "device" = "APV", - "power" = on, - "transfer_rate" = transfer_rate, - "sigtype" = "status" - ) - radio_connection.post_signal(src, signal) + if(network1) + network1.update = 1 - return 1 + if(network2) + network2.update = 1 - interact(mob/user as mob) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow: - [round(transfer_rate,1)]l/s | Change - "} + return 1 - user << browse("[src.name] control[dat]", "window=atmo_pump") - onclose(user, "atmo_pump") +/obj/machinery/atmospherics/binary/volume_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency) +/obj/machinery/atmospherics/binary/volume_pump/proc/broadcast_status() + if(!radio_connection) + return 0 + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src - initialize() - ..() + signal.data = list( + "tag" = id, + "device" = "APV", + "power" = on, + "transfer_rate" = transfer_rate, + "sigtype" = "status" + ) + radio_connection.post_signal(src, signal) - set_frequency(frequency) + return 1 - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 +/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user as mob) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output flow: + [round(transfer_rate,1)]l/s | Change + "} - if("power" in signal.data) - on = text2num(signal.data["power"]) + user << browse("[src.name] control[dat]", "window=atmo_pump") + onclose(user, "atmo_pump") - if("power_toggle" in signal.data) - on = !on +/obj/machinery/atmospherics/binary/volume_pump/initialize() + ..() + set_frequency(frequency) - if("set_transfer_rate" in signal.data) - transfer_rate = between( - 0, - text2num(signal.data["set_transfer_rate"]), - air1.volume - ) +/obj/machinery/atmospherics/binary/volume_pump/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon + if(signal.data["power"]) + on = text2num(signal.data["power"]) + if(signal.data["power_toggle"]) + on = !on + + if(signal.data["set_transfer_rate"]) + transfer_rate = between( + 0, + text2num(signal.data["set_transfer_rate"]), + air1.volume + ) + + if(signal.data["status"]) spawn(2) broadcast_status() + return //do not update_icon + + spawn(2) + broadcast_status() + update_icon() + +/obj/machinery/atmospherics/binary/volume_pump/attack_hand(user as mob) + if(..()) + return + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." + return + usr.set_machine(src) + interact(user) + return + +/obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_transfer_rate"]) + var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num + src.transfer_rate = max(0, min(200, new_transfer_rate)) + usr.set_machine(src) + src.update_icon() + src.updateUsrDialog() + return + +/obj/machinery/atmospherics/binary/volume_pump/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - interact(user) - return - - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_transfer_rate"]) - var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",src.transfer_rate) as num - src.transfer_rate = max(0, min(200, new_transfer_rate)) - usr.set_machine(src) - src.update_icon() - src.updateUsrDialog() - return - - power_change() - ..() - update_icon() - - - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) - +/obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm index ae827881ad5..b48c2f40333 100644 --- a/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm +++ b/code/ATMOSPHERICS/components/omni_devices/_omni_extras.dm @@ -11,33 +11,6 @@ #define ATM_P 6 //Phoron #define ATM_N2O 7 -//-------------------------------------------- -// Omni device cached icon list -//-------------------------------------------- -var/global/list/omni_icons[] - -/proc/gen_omni_icons() - omni_icons = new() - var/icon/omni = new('icons/obj/atmospherics/omni_devices.dmi') - - for(var/state in omni.IconStates()) - if(!state || findtext(state, "map")) - continue - - var/image/I = image('icons/obj/atmospherics/omni_devices.dmi', icon_state = state) - - if(findtext(state, "pipe")) - for(var/pipe_color in pipe_colors) - I = image('icons/obj/atmospherics/omni_devices.dmi', icon_state = state) - I.color = pipe_colors[pipe_color] - var/cache_name = state - if(I.color) - cache_name += "_[pipe_colors[pipe_color]]" - omni_icons[cache_name] = I - else - omni_icons[state] = I - - //-------------------------------------------- // Omni port datum // @@ -83,16 +56,6 @@ var/global/list/omni_icons[] // Need to find somewhere else for these //-------------------------------------------- -#define PIPE_COLOR_RED "#ff0000" -#define PIPE_COLOR_BLUE "#0000ff" -#define PIPE_COLOR_CYAN "#00ffff" -#define PIPE_COLOR_GREEN "#00ff00" -#define PIPE_COLOR_YELLOW "#ffcc00" -#define PIPE_COLOR_PURPLE "#5c1ec0" - -var/global/list/pipe_colors = list("grey" = null, "red" = PIPE_COLOR_RED, "blue" = PIPE_COLOR_BLUE, "cyan" = PIPE_COLOR_CYAN, "green" = PIPE_COLOR_GREEN, "yellow" = PIPE_COLOR_YELLOW, "purple" = PIPE_COLOR_PURPLE) - - //returns a text string based on the direction flag input // if capitalize is true, it will return the string capitalized // otherwise it will return the direction string in lower case diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm index 0e46546a20a..24c771f94da 100644 --- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm +++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm @@ -3,10 +3,11 @@ //-------------------------------------------- /obj/machinery/atmospherics/omni name = "omni device" - icon = 'icons/obj/atmospherics/omni_devices.dmi' + icon = 'icons/atmos/omni_devices.dmi' icon_state = "base" use_power = 1 initialize_directions = 0 + level = 1 var/on = 0 var/configuring = 0 @@ -70,12 +71,6 @@ update_icon() /obj/machinery/atmospherics/omni/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if(istype(W, /obj/item/device/pipe_painter)) //for updating the color of connected pipe ends - for(var/datum/omni_port/P in ports) - P.update = 1 - update_ports() - return - if(!istype(W, /obj/item/weapon/wrench)) return ..() @@ -106,8 +101,8 @@ return /obj/machinery/atmospherics/omni/proc/build_icons() - if(!omni_icons) - gen_omni_icons() + if(!check_icon_cache()) + return var/core_icon = null if(istype(src, /obj/machinery/atmospherics/omni/mixer)) @@ -119,13 +114,16 @@ //directional icons are layers 1-4, with the core icon on layer 5 if(core_icon) - overlays_off[5] = omni_icons[core_icon] - overlays_on[5] = omni_icons[core_icon + "_glow"] + overlays_off[5] = icon_manager.get_atmos_icon("omni", , , core_icon) + overlays_on[5] = icon_manager.get_atmos_icon("omni", , , core_icon + "_glow") - overlays_error[1] = omni_icons[core_icon] - overlays_error[2] = omni_icons["error"] + overlays_error[1] = icon_manager.get_atmos_icon("omni", , , core_icon) + overlays_error[2] = icon_manager.get_atmos_icon("omni", , , "error") /obj/machinery/atmospherics/omni/proc/update_port_icons() + if(!check_icon_cache()) + return + for(var/datum/omni_port/P in ports) if(P.update) var/ref_layer = 0 @@ -145,11 +143,11 @@ var/list/port_icons = select_port_icons(P) if(port_icons) if(P.node) - underlays_current[ref_layer] = omni_icons[port_icons["pipe_icon"]] + underlays_current[ref_layer] = port_icons["pipe_icon"] else underlays_current[ref_layer] = null - overlays_off[ref_layer] = omni_icons[port_icons["off_icon"]] - overlays_on[ref_layer] = omni_icons[port_icons["on_icon"]] + overlays_off[ref_layer] = port_icons["off_icon"] + overlays_on[ref_layer] = port_icons["on_icon"] else underlays_current[ref_layer] = null overlays_off[ref_layer] = null @@ -175,14 +173,29 @@ if(ATM_O2 to ATM_N2O) ic_on += "_filter" ic_off += "_out" - - var/pipe_state = ic_dir + "_pipe" - if(P.node) - if(P.node.color) - pipe_state += "_[P.node.color]" + ic_on = icon_manager.get_atmos_icon("omni", , , ic_on) + ic_off = icon_manager.get_atmos_icon("omni", , , ic_off) + + var/pipe_state + var/turf/T = get_turf(src) + if(!istype(T)) + return + if(T.intact && istype(P.node, /obj/machinery/atmospherics/pipe) && P.node.level == 1 ) + pipe_state = icon_manager.get_atmos_icon("underlay_down", P.dir, color_cache_name(P.node)) + else + pipe_state = icon_manager.get_atmos_icon("underlay_intact", P.dir, color_cache_name(P.node)) + return list("on_icon" = ic_on, "off_icon" = ic_off, "pipe_icon" = pipe_state) +/obj/machinery/atmospherics/omni/update_underlays() + for(var/datum/omni_port/P in ports) + P.update = 1 + update_ports() + +/obj/machinery/atmospherics/omni/hide(var/i) + update_underlays() + /obj/machinery/atmospherics/omni/proc/update_ports() sort_ports() update_port_icons() diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm index 9ecc82b3244..75d32718fa9 100644 --- a/code/ATMOSPHERICS/components/portables_connector.dm +++ b/code/ATMOSPHERICS/components/portables_connector.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/portables_connector - icon = 'icons/obj/atmospherics/portables_connector.dmi' - icon_state = "intact" + icon = 'icons/atmos/connector.dmi' + icon_state = "map_connector" name = "Connector Port" desc = "For connecting portables devices related to atmospherics control." @@ -16,142 +16,139 @@ var/on = 0 use_power = 0 - level = 0 + level = 1 - New() - initialize_directions = dir - ..() +/obj/machinery/atmospherics/portables_connector/New() + initialize_directions = dir + ..() - update_icon() - if(node) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node) - else - icon_state = "exposed" +/obj/machinery/atmospherics/portables_connector/update_icon() + icon_state = "connector" +/obj/machinery/atmospherics/portables_connector/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node, dir) + +/obj/machinery/atmospherics/portables_connector/hide(var/i) + update_underlays() + +/obj/machinery/atmospherics/portables_connector/process() + ..() + if(!on) return - - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node) - else - icon_state = "exposed" - - process() - ..() - if(!on) - return - if(!connected_device) - on = 0 - return - if(network) - network.update = 1 - return 1 + if(!connected_device) + on = 0 + return + if(network) + network.update = 1 + return 1 // Housekeeping and pipe network stuff below - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node) - network = new_network +/obj/machinery/atmospherics/portables_connector/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node) + network = new_network - if(new_network.normal_members.Find(src)) - return 0 + if(new_network.normal_members.Find(src)) + return 0 - new_network.normal_members += src + new_network.normal_members += src - return null + return null - Del() - loc = null +/obj/machinery/atmospherics/portables_connector/Del() + loc = null - if(connected_device) - connected_device.disconnect() + if(connected_device) + connected_device.disconnect() - if(node) - node.disconnect(src) - del(network) + if(node) + node.disconnect(src) + del(network) - node = null + node = null - ..() + ..() - initialize() - if(node) return +/obj/machinery/atmospherics/portables_connector/initialize() + if(node) return - var/node_connect = dir + var/node_connect = dir - for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) - if(target.initialize_directions & get_dir(target,src)) - node = target - break + for(var/obj/machinery/atmospherics/target in get_step(src,node_connect)) + if(target.initialize_directions & get_dir(target,src)) + node = target + break - update_icon() + update_icon() + update_underlays() +/obj/machinery/atmospherics/portables_connector/build_network() + if(!network && node) + network = new /datum/pipe_network() + network.normal_members += src + network.build_network(node, src) + + +/obj/machinery/atmospherics/portables_connector/return_network(obj/machinery/atmospherics/reference) build_network() - if(!network && node) - network = new /datum/pipe_network() - network.normal_members += src - network.build_network(node, src) + + if(reference==node) + return network + + if(reference==connected_device) + return network + + return null + +/obj/machinery/atmospherics/portables_connector/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network == old_network) + network = new_network + + return 1 + +/obj/machinery/atmospherics/portables_connector/return_network_air(datum/pipe_network/reference) + var/list/results = list() + + if(connected_device) + results += connected_device.air_contents + + return results + +/obj/machinery/atmospherics/portables_connector/disconnect(obj/machinery/atmospherics/reference) + if(reference==node) + del(network) + node = null + + update_underlays() + + return null - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node) - return network - - if(reference==connected_device) - return network - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network == old_network) - network = new_network - +/obj/machinery/atmospherics/portables_connector/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (connected_device) + user << "\red You cannot unwrench this [src], dettach [connected_device] first." return 1 - - return_network_air(datum/pipe_network/reference) - var/list/results = list() - - if(connected_device) - results += connected_device.air_contents - - return results - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node) - del(network) - node = null - - return null - - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (connected_device) - user << "\red You cannot unwrench this [src], dettach [connected_device] first." - return 1 - if (locate(/obj/machinery/portable_atmospherics, src.loc)) - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) + if (locate(/obj/machinery/portable_atmospherics, src.loc)) + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 16a863a2e1f..594190bdb8a 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -1,11 +1,11 @@ -obj/machinery/atmospherics/trinary/filter - icon = 'icons/obj/atmospherics/filter.dmi' - icon_state = "intact_off" +/obj/machinery/atmospherics/trinary/filter + icon = 'icons/atmos/filter.dmi' + icon_state = "map" density = 0 + level = 1 name = "Gas filter" - var/on = 0 var/temp = null // -- TLE var/target_pressure = ONE_ATMOSPHERE @@ -24,141 +24,159 @@ Filter types: var/frequency = 0 var/datum/radio_frequency/radio_connection - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) +/obj/machinery/atmospherics/trinary/filter/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - New() - if(radio_controller) - initialize() - ..() +/* I don't know why this is here, but it's ugly, so I'm disabling it +/obj/machinery/atmospherics/trinary/filter/New() + ..() + if(radio_controller) + initialize() +*/ +/obj/machinery/atmospherics/trinary/filter/update_icon() + if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter)) + icon_state = "m" + else + icon_state = "" + + if(!powered()) + icon_state += "off" + else if(node2 && node3 && node1) + icon_state += on ? "on" : "off" + else + icon_state += "off" + on = 0 - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node2 && node3 && node1) - icon_state = "intact_[on?("on"):("off")]" +/obj/machinery/atmospherics/trinary/filter/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + + add_underlay(T, node1, turn(dir, -180)) + + if(istype(src, /obj/machinery/atmospherics/trinary/filter/m_filter)) + add_underlay(T, node2, turn(dir, 90)) else - icon_state = "intact_off" - on = 0 + add_underlay(T, node2, turn(dir, -90)) - return + add_underlay(T, node3, dir) - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() +/obj/machinery/atmospherics/trinary/filter/hide(var/i) + update_underlays() - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/trinary/filter/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() - var/output_starting_pressure = air3.return_pressure() +/obj/machinery/atmospherics/trinary/filter/process() + ..() + if(!on) + return 0 - if(output_starting_pressure >= target_pressure || air2.return_pressure() >= target_pressure ) - //No need to mix if target is already full! - return 1 - - //Calculate necessary moles to transfer using PV=nRT - - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles - - if(air1.temperature > 0) - transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - //Actually transfer the gas - - if(transfer_moles > 0) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - - if(!removed) - return - var/datum/gas_mixture/filtered_out = new - filtered_out.temperature = removed.temperature - - switch(filter_type) - if(0) //removing hydrocarbons - filtered_out.phoron = removed.phoron - removed.phoron = 0 - - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/oxygen_agent_b)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - - if(1) //removing O2 - filtered_out.oxygen = removed.oxygen - removed.oxygen = 0 - - if(2) //removing N2 - filtered_out.nitrogen = removed.nitrogen - removed.nitrogen = 0 - - if(3) //removing CO2 - filtered_out.carbon_dioxide = removed.carbon_dioxide - removed.carbon_dioxide = 0 - - if(4)//removing N2O - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/sleeping_agent)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - - else - filtered_out = null - - - air2.merge(filtered_out) - air3.merge(removed) - - if(network2) - network2.update = 1 - - if(network3) - network3.update = 1 - - if(network1) - network1.update = 1 + var/output_starting_pressure = air3.return_pressure() + if(output_starting_pressure >= target_pressure || air2.return_pressure() >= target_pressure ) + //No need to mix if target is already full! return 1 - initialize() - set_frequency(frequency) - ..() + //Calculate necessary moles to transfer using PV=nRT - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles + + if(air1.temperature > 0) + transfer_moles = pressure_delta*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + //Actually transfer the gas + + if(transfer_moles > 0) + var/datum/gas_mixture/removed = air1.remove(transfer_moles) + + if(!removed) + return + var/datum/gas_mixture/filtered_out = new + filtered_out.temperature = removed.temperature + + switch(filter_type) + if(0) //removing hydrocarbons + filtered_out.phoron = removed.phoron + removed.phoron = 0 + + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/oxygen_agent_b)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + + if(1) //removing O2 + filtered_out.oxygen = removed.oxygen + removed.oxygen = 0 + + if(2) //removing N2 + filtered_out.nitrogen = removed.nitrogen + removed.nitrogen = 0 + + if(3) //removing CO2 + filtered_out.carbon_dioxide = removed.carbon_dioxide + removed.carbon_dioxide = 0 + + if(4)//removing N2O + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/sleeping_agent)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + + else + filtered_out = null -obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE + air2.merge(filtered_out) + air3.merge(removed) + + if(network2) + network2.update = 1 + + if(network3) + network3.update = 1 + + if(network1) + network1.update = 1 + + return 1 + +/obj/machinery/atmospherics/trinary/filter/initialize() + set_frequency(frequency) + ..() + +/obj/machinery/atmospherics/trinary/filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) + + +/obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE if(..()) return @@ -211,7 +229,7 @@ obj/machinery/atmospherics/trinary/filter/attack_hand(user as mob) // -- TLE onclose(user, "atmo_filter") return -obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE +/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE if(..()) return usr.set_machine(src) @@ -234,9 +252,8 @@ obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE */ return -obj/machinery/atmospherics/trinary/filter/m_filter - icon = 'icons/obj/atmospherics/m_filter.dmi' - icon_state = "intact_off" +/obj/machinery/atmospherics/trinary/filter/m_filter + icon_state = "mmap" dir = SOUTH initialize_directions = SOUTH|NORTH|EAST @@ -253,7 +270,9 @@ obj/machinery/atmospherics/trinary/filter/m_filter/New() if(WEST) initialize_directions = WEST|SOUTH|EAST -obj/machinery/atmospherics/trinary/filter/m_filter/initialize() +/obj/machinery/atmospherics/trinary/filter/m_filter/initialize() + set_frequency(frequency) + if(node1 && node2 && node3) return var/node1_connect = turn(dir, -180) @@ -276,3 +295,4 @@ obj/machinery/atmospherics/trinary/filter/m_filter/initialize() break update_icon() + update_underlays() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm index 4d94acbfba3..228be72020d 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm @@ -1,169 +1,190 @@ -obj/machinery/atmospherics/trinary/mixer - icon = 'icons/obj/atmospherics/mixer.dmi' - icon_state = "intact_off" +/obj/machinery/atmospherics/trinary/mixer + icon = 'icons/atmos/mixer.dmi' + icon_state = "map" density = 0 + level = 1 name = "Gas mixer" - var/on = 0 - var/target_pressure = ONE_ATMOSPHERE var/node1_concentration = 0.5 var/node2_concentration = 0.5 //node 3 is the outlet, nodes 1 & 2 are intakes - update_icon() - if(stat & NOPOWER) - icon_state = "intact_off" - else if(node2 && node3 && node1) - icon_state = "intact_[on?("on"):("off")]" +/obj/machinery/atmospherics/trinary/mixer/update_icon(var/safety = 0) + if(istype(src, /obj/machinery/atmospherics/trinary/mixer/m_mixer)) + icon_state = "m" + else if(istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) + icon_state = "t" + else + icon_state = "" + + if(!powered()) + icon_state += "off" + else if(node2 && node3 && node1) + icon_state += on ? "on" : "off" + else + icon_state += "off" + on = 0 + +/obj/machinery/atmospherics/trinary/mixer/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + + if(istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) + add_underlay(T, node1, turn(dir, -90)) else - icon_state = "intact_off" - on = 0 + add_underlay(T, node1, turn(dir, -180)) - return + if(istype(src, /obj/machinery/atmospherics/trinary/mixer/m_mixer) || istype(src, /obj/machinery/atmospherics/trinary/mixer/t_mixer)) + add_underlay(T, node2, turn(dir, 90)) + else + add_underlay(T, node2, turn(dir, -90)) - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() + add_underlay(T, node3, dir) - New() - ..() - air3.volume = 300 +/obj/machinery/atmospherics/trinary/mixer/hide(var/i) + update_underlays() - process() - ..() - if(!on) - return 0 +/obj/machinery/atmospherics/trinary/mixer/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() - var/output_starting_pressure = air3.return_pressure() +/obj/machinery/atmospherics/trinary/mixer/New() + ..() + air3.volume = 300 - if(output_starting_pressure >= target_pressure) - //No need to mix if target is already full! - return 1 +/obj/machinery/atmospherics/trinary/mixer/process() + ..() + if(!on) + return 0 - //Calculate necessary moles to transfer using PV=nRT - - var/pressure_delta = target_pressure - output_starting_pressure - var/transfer_moles1 = 0 - var/transfer_moles2 = 0 - - if(air1.temperature > 0) - transfer_moles1 = (node1_concentration*pressure_delta)*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) - - if(air2.temperature > 0) - transfer_moles2 = (node2_concentration*pressure_delta)*air3.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) - - var/air1_moles = air1.total_moles() - var/air2_moles = air2.total_moles() - - if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) - if(!transfer_moles1 || !transfer_moles2) return - var/ratio = min(air1_moles/transfer_moles1, air2_moles/transfer_moles2) - - transfer_moles1 *= ratio - transfer_moles2 *= ratio - - //Actually transfer the gas - - if(transfer_moles1 > 0) - var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) - air3.merge(removed1) - - if(transfer_moles2 > 0) - var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) - air3.merge(removed2) - - if(network1 && transfer_moles1) - network1.update = 1 - - if(network2 && transfer_moles2) - network2.update = 1 - - if(network3) - network3.update = 1 + var/output_starting_pressure = air3.return_pressure() + if(output_starting_pressure >= target_pressure) + //No need to mix if target is already full! return 1 - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) + //Calculate necessary moles to transfer using PV=nRT - attack_hand(user as mob) - if(..()) - return - src.add_fingerprint(usr) - if(!src.allowed(user)) - user << "\red Access denied." - return - usr.set_machine(src) - var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure: - [target_pressure]kPa | Change -
- Node 1 Concentration: - - - - - [node1_concentration]([node1_concentration*100]%) - + - + -
- Node 2 Concentration: - - - - - [node2_concentration]([node2_concentration*100]%) - + - + - "} + var/pressure_delta = target_pressure - output_starting_pressure + var/transfer_moles1 = 0 + var/transfer_moles2 = 0 - user << browse("[src.name] control[dat]", "window=atmo_mixer") - onclose(user, "atmo_mixer") + if(air1.temperature > 0) + transfer_moles1 = (node1_concentration*pressure_delta)*air3.volume/(air1.temperature * R_IDEAL_GAS_EQUATION) + + if(air2.temperature > 0) + transfer_moles2 = (node2_concentration*pressure_delta)*air3.volume/(air2.temperature * R_IDEAL_GAS_EQUATION) + + var/air1_moles = air1.total_moles() + var/air2_moles = air2.total_moles() + + if((air1_moles < transfer_moles1) || (air2_moles < transfer_moles2)) + if(!transfer_moles1 || !transfer_moles2) return + var/ratio = min(air1_moles/transfer_moles1, air2_moles/transfer_moles2) + + transfer_moles1 *= ratio + transfer_moles2 *= ratio + + //Actually transfer the gas + + if(transfer_moles1 > 0) + var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) + air3.merge(removed1) + + if(transfer_moles2 > 0) + var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) + air3.merge(removed2) + + if(network1 && transfer_moles1) + network1.update = 1 + + if(network2 && transfer_moles2) + network2.update = 1 + + if(network3) + network3.update = 1 + + return 1 + +/obj/machinery/atmospherics/trinary/mixer/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) + +/obj/machinery/atmospherics/trinary/mixer/attack_hand(user as mob) + if(..()) return - - Topic(href,href_list) - if(..()) return - if(href_list["power"]) - on = !on - if(href_list["set_press"]) - var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num - src.target_pressure = max(0, min(4500, new_pressure)) - if(href_list["node1_c"]) - var/value = text2num(href_list["node1_c"]) - src.node1_concentration = max(0, min(1, src.node1_concentration + value)) - src.node2_concentration = max(0, min(1, src.node2_concentration - value)) - if(href_list["node2_c"]) - var/value = text2num(href_list["node2_c"]) - src.node2_concentration = max(0, min(1, src.node2_concentration + value)) - src.node1_concentration = max(0, min(1, src.node1_concentration - value)) - src.update_icon() - src.updateUsrDialog() + src.add_fingerprint(usr) + if(!src.allowed(user)) + user << "\red Access denied." return + usr.set_machine(src) + var/dat = {"Power: [on?"On":"Off"]
+ Desirable output pressure: + [target_pressure]kPa | Change +
+ Node 1 Concentration: + - + - + [node1_concentration]([node1_concentration*100]%) + + + + +
+ Node 2 Concentration: + - + - + [node2_concentration]([node2_concentration*100]%) + + + + + "} + + user << browse("[src.name] control[dat]", "window=atmo_mixer") + onclose(user, "atmo_mixer") + return + +/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list) + if(..()) return + if(href_list["power"]) + on = !on + if(href_list["set_press"]) + var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",src.target_pressure) as num + src.target_pressure = max(0, min(4500, new_pressure)) + if(href_list["node1_c"]) + var/value = text2num(href_list["node1_c"]) + src.node1_concentration = max(0, min(1, src.node1_concentration + value)) + src.node2_concentration = max(0, min(1, src.node2_concentration - value)) + if(href_list["node2_c"]) + var/value = text2num(href_list["node2_c"]) + src.node2_concentration = max(0, min(1, src.node2_concentration + value)) + src.node1_concentration = max(0, min(1, src.node1_concentration - value)) + src.update_icon() + src.updateUsrDialog() + return obj/machinery/atmospherics/trinary/mixer/t_mixer - icon = 'icons/obj/atmospherics/t_mixer.dmi' - icon_state = "intact_off" + icon_state = "tmap" dir = SOUTH initialize_directions = SOUTH|EAST|WEST @@ -205,10 +226,10 @@ obj/machinery/atmospherics/trinary/mixer/t_mixer/initialize() break update_icon() + update_underlays() obj/machinery/atmospherics/trinary/mixer/m_mixer - icon = 'icons/obj/atmospherics/m_mixer.dmi' - icon_state = "intact_off" + icon_state = "mmap" dir = SOUTH initialize_directions = SOUTH|NORTH|EAST @@ -249,4 +270,5 @@ obj/machinery/atmospherics/trinary/mixer/m_mixer/initialize() node3 = target break - update_icon() \ No newline at end of file + update_icon() + update_underlays() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index d3f1116a430..655e58ea384 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -2,6 +2,8 @@ obj/machinery/atmospherics/trinary dir = SOUTH initialize_directions = SOUTH|NORTH|WEST use_power = 1 + + var/on = 0 var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 @@ -94,6 +96,7 @@ obj/machinery/atmospherics/trinary break update_icon() + update_underlays() build_network() if(!network1 && node1) @@ -160,5 +163,7 @@ obj/machinery/atmospherics/trinary else if(reference==node3) del(network3) node3 = null + + update_underlays() return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 83f592c315f..603feb02949 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -1,10 +1,11 @@ -obj/machinery/atmospherics/tvalve - icon = 'icons/obj/atmospherics/valve.dmi' - icon_state = "tvalve0" +/obj/machinery/atmospherics/tvalve + icon = 'icons/atmos/tvalve.dmi' + icon_state = "map_tvalve0" name = "manual switching valve" desc = "A pipe valve" + level = 1 dir = SOUTH initialize_directions = SOUTH|NORTH|WEST @@ -19,415 +20,466 @@ obj/machinery/atmospherics/tvalve var/datum/pipe_network/network_node2 var/datum/pipe_network/network_node3 - update_icon(animation) - if(animation) - flick("tvalve[src.state][!src.state]",src) +/obj/machinery/atmospherics/tvalve/bypass + icon_state = "map_tvalve1" + state = 1 + +/obj/machinery/atmospherics/tvalve/update_icon(animation) + if(animation) + flick("tvalve[src.state][!src.state]",src) + else + icon_state = "tvalve[state]" + +/obj/machinery/atmospherics/tvalve/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node1, turn(dir, -180)) + + if(istype(src, /obj/machinery/atmospherics/tvalve/mirrored)) + add_underlay(T, node2, turn(dir, 90)) else - icon_state = "tvalve[state]" + add_underlay(T, node2, turn(dir, -90)) + + add_underlay(T, node3, dir) - New() - initialize_directions() - ..() - - proc/initialize_directions() - switch(dir) - if(NORTH) - initialize_directions = SOUTH|NORTH|EAST - if(SOUTH) - initialize_directions = NORTH|SOUTH|WEST - if(EAST) - initialize_directions = WEST|EAST|SOUTH - if(WEST) - initialize_directions = EAST|WEST|NORTH - - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) - if(reference == node1) - network_node1 = new_network - if(state) - network_node2 = new_network - else - network_node3 = new_network - else if(reference == node2) - network_node2 = new_network - if(state) - network_node1 = new_network - else if(reference == node3) - network_node3 = new_network - if(!state) - network_node1 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - - if(state) - if(reference == node1) - if(node2) - return node2.network_expand(new_network, src) - else if(reference == node2) - if(node1) - return node1.network_expand(new_network, src) - else - if(reference == node1) - if(node3) - return node3.network_expand(new_network, src) - else if(reference == node3) - if(node1) - return node1.network_expand(new_network, src) - - return null - - Del() - loc = null - - if(node1) - node1.disconnect(src) - del(network_node1) - if(node2) - node2.disconnect(src) - del(network_node2) - if(node3) - node3.disconnect(src) - del(network_node3) - - node1 = null - node2 = null - node3 = null - - ..() - - proc/go_to_side() - - if(state) return 0 - - state = 1 - update_icon() - - if(network_node1) - del(network_node1) - if(network_node3) - del(network_node3) - build_network() - - if(network_node1&&network_node2) - network_node1.merge(network_node2) - network_node2 = network_node1 - - if(network_node1) - network_node1.update = 1 - else if(network_node2) - network_node2.update = 1 - - return 1 - - proc/go_straight() - - if(!state) - return 0 - - state = 0 - update_icon() - - if(network_node1) - del(network_node1) - if(network_node2) - del(network_node2) - build_network() - - if(network_node1&&network_node3) - network_node1.merge(network_node3) - network_node3 = network_node1 - - if(network_node1) - network_node1.update = 1 - else if(network_node3) - network_node3.update = 1 - - return 1 - - attack_ai(mob/user as mob) - return - - attack_paw(mob/user as mob) - return attack_hand(user) - - attack_hand(mob/user as mob) - src.add_fingerprint(usr) - update_icon(1) - sleep(10) - if (src.state) - src.go_straight() - else - src.go_to_side() - - process() - ..() - machines.Remove(src) - -/* if(open && (!node1 || !node2)) - close() - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (!node2) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ - - return - - initialize() - var/node1_dir - var/node2_dir - var/node3_dir - - node1_dir = turn(dir, 180) - node2_dir = turn(dir, -90) - node3_dir = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir)) - if(target.initialize_directions & get_dir(target,src)) - node3 = target - break - - build_network() - if(!network_node1 && node1) - network_node1 = new /datum/pipe_network() - network_node1.normal_members += src - network_node1.build_network(node1, src) - - if(!network_node2 && node2) - network_node2 = new /datum/pipe_network() - network_node2.normal_members += src - network_node2.build_network(node2, src) - - if(!network_node3 && node3) - network_node3 = new /datum/pipe_network() - network_node3.normal_members += src - network_node3.build_network(node3, src) - - - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network_node1 - - if(reference==node2) - return network_node2 - - if(reference==node3) - return network_node3 - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network_node1 == old_network) - network_node1 = new_network - if(network_node2 == old_network) - network_node2 = new_network - if(network_node3 == old_network) - network_node3 = new_network - - return 1 - - return_network_air(datum/network/reference) - return null - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network_node1) - node1 = null - - else if(reference==node2) - del(network_node2) - node2 = null - - else if(reference==node3) - del(network_node3) - node2 = null - - return null - - digital // can be controlled by AI - name = "digital switching valve" - desc = "A digitally controlled valve." - icon = 'icons/obj/atmospherics/digital_valve.dmi' - - attack_ai(mob/user as mob) - return src.attack_hand(user) - - attack_hand(mob/user as mob) - if(!src.allowed(user)) - user << "\red Access denied." - return - ..() - - //Radio remote control - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection - - initialize() - ..() - if(frequency) - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) - return 0 - - switch(signal.data["command"]) - if("valve_open") - if(!state) - go_to_side() - - if("valve_close") - if(state) - go_straight() - - if("valve_toggle") - if(state) - go_straight() - else - go_to_side() - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (istype(src, /obj/machinery/atmospherics/tvalve/digital)) - user << "\red You cannot unwrench this [src], it's too complicated." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) - -obj/machinery/atmospherics/tvalve/mirrored - icon_state = "tvalvem0" +/obj/machinery/atmospherics/tvalve/hide(var/i) + update_underlays() +/obj/machinery/atmospherics/tvalve/New() initialize_directions() - switch(dir) - if(NORTH) - initialize_directions = SOUTH|NORTH|WEST - if(SOUTH) - initialize_directions = NORTH|SOUTH|EAST - if(EAST) - initialize_directions = WEST|EAST|NORTH - if(WEST) - initialize_directions = EAST|WEST|SOUTH + ..() - initialize() - var/node1_dir - var/node2_dir - var/node3_dir +/obj/machinery/atmospherics/tvalve/proc/initialize_directions() + switch(dir) + if(NORTH) + initialize_directions = SOUTH|NORTH|EAST + if(SOUTH) + initialize_directions = NORTH|SOUTH|WEST + if(EAST) + initialize_directions = WEST|EAST|SOUTH + if(WEST) + initialize_directions = EAST|WEST|NORTH - node1_dir = turn(dir, 180) - node2_dir = turn(dir, 90) - node3_dir = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir)) - if(target.initialize_directions & get_dir(target,src)) - node3 = target - break - - update_icon(animation) - if(animation) - flick("tvalvem[src.state][!src.state]",src) +/obj/machinery/atmospherics/tvalve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node1) + network_node1 = new_network + if(state) + network_node2 = new_network else - icon_state = "tvalvem[state]" + network_node3 = new_network + else if(reference == node2) + network_node2 = new_network + if(state) + network_node1 = new_network + else if(reference == node3) + network_node3 = new_network + if(!state) + network_node1 = new_network - digital // can be controlled by AI - name = "digital switching valve" - desc = "A digitally controlled valve." - icon = 'icons/obj/atmospherics/digital_valve.dmi' + if(new_network.normal_members.Find(src)) + return 0 - attack_ai(mob/user as mob) - return src.attack_hand(user) + new_network.normal_members += src - attack_hand(mob/user as mob) - if(!src.allowed(user)) - user << "\red Access denied." - return - ..() + if(state) + if(reference == node1) + if(node2) + return node2.network_expand(new_network, src) + else if(reference == node2) + if(node1) + return node1.network_expand(new_network, src) + else + if(reference == node1) + if(node3) + return node3.network_expand(new_network, src) + else if(reference == node3) + if(node1) + return node1.network_expand(new_network, src) - //Radio remote control -eh? + return null - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) +/obj/machinery/atmospherics/tvalve/Del() + loc = null - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection + if(node1) + node1.disconnect(src) + del(network_node1) + if(node2) + node2.disconnect(src) + del(network_node2) + if(node3) + node3.disconnect(src) + del(network_node3) - initialize() - ..() - if(frequency) - set_frequency(frequency) + node1 = null + node2 = null + node3 = null - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) - return 0 + ..() - switch(signal.data["command"]) - if("valve_open") - if(!state) - go_to_side() +/obj/machinery/atmospherics/tvalve/proc/go_to_side() - if("valve_close") - if(state) - go_straight() + if(state) return 0 - if("valve_toggle") - if(state) - go_straight() - else - go_to_side() \ No newline at end of file + state = 1 + update_icon() + + if(network_node1) + del(network_node1) + if(network_node3) + del(network_node3) + build_network() + + if(network_node1&&network_node2) + network_node1.merge(network_node2) + network_node2 = network_node1 + + if(network_node1) + network_node1.update = 1 + else if(network_node2) + network_node2.update = 1 + + return 1 + +/obj/machinery/atmospherics/tvalve/proc/go_straight() + + if(!state) + return 0 + + state = 0 + update_icon() + + if(network_node1) + del(network_node1) + if(network_node2) + del(network_node2) + build_network() + + if(network_node1&&network_node3) + network_node1.merge(network_node3) + network_node3 = network_node1 + + if(network_node1) + network_node1.update = 1 + else if(network_node3) + network_node3.update = 1 + + return 1 + +/obj/machinery/atmospherics/tvalve/attack_ai(mob/user as mob) + return + +/obj/machinery/atmospherics/tvalve/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/atmospherics/tvalve/attack_hand(mob/user as mob) + src.add_fingerprint(usr) + update_icon(1) + sleep(10) + if (src.state) + src.go_straight() + else + src.go_to_side() + +/obj/machinery/atmospherics/tvalve/process() + ..() + . = PROCESS_KILL + //machines.Remove(src) + + return + +/obj/machinery/atmospherics/tvalve/initialize() + var/node1_dir + var/node2_dir + var/node3_dir + + node1_dir = turn(dir, 180) + node2_dir = turn(dir, -90) + node3_dir = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir)) + if(target.initialize_directions & get_dir(target,src)) + node3 = target + break + + update_icon() + update_underlays() + +/obj/machinery/atmospherics/tvalve/build_network() + if(!network_node1 && node1) + network_node1 = new /datum/pipe_network() + network_node1.normal_members += src + network_node1.build_network(node1, src) + + if(!network_node2 && node2) + network_node2 = new /datum/pipe_network() + network_node2.normal_members += src + network_node2.build_network(node2, src) + + if(!network_node3 && node3) + network_node3 = new /datum/pipe_network() + network_node3.normal_members += src + network_node3.build_network(node3, src) + + +/obj/machinery/atmospherics/tvalve/return_network(obj/machinery/atmospherics/reference) + build_network() + + if(reference==node1) + return network_node1 + + if(reference==node2) + return network_node2 + + if(reference==node3) + return network_node3 + + return null + +/obj/machinery/atmospherics/tvalve/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network_node1 == old_network) + network_node1 = new_network + if(network_node2 == old_network) + network_node2 = new_network + if(network_node3 == old_network) + network_node3 = new_network + + return 1 + +/obj/machinery/atmospherics/tvalve/return_network_air(datum/network/reference) + return null + +/obj/machinery/atmospherics/tvalve/disconnect(obj/machinery/atmospherics/reference) + if(reference==node1) + del(network_node1) + node1 = null + + else if(reference==node2) + del(network_node2) + node2 = null + + else if(reference==node3) + del(network_node3) + node2 = null + + update_underlays() + + return null + +/obj/machinery/atmospherics/tvalve/digital // can be controlled by AI + name = "digital switching valve" + desc = "A digitally controlled valve." + icon = 'icons/atmos/digital_tvalve.dmi' + + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection + +/obj/machinery/atmospherics/tvalve/digital/bypass + icon_state = "map_tvalve1" + state = 1 + +/obj/machinery/atmospherics/tvalve/digital/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() + +/obj/machinery/atmospherics/tvalve/digital/update_icon() + ..() + if(!powered()) + icon_state = "tvalvenopower" + +/obj/machinery/atmospherics/tvalve/digital/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/atmospherics/tvalve/digital/attack_hand(mob/user as mob) + if(!powered()) + return + if(!src.allowed(user)) + user << "\red Access denied." + return + ..() + +//Radio remote control + +/obj/machinery/atmospherics/tvalve/digital/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + + + +/obj/machinery/atmospherics/tvalve/digital/initialize() + ..() + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/tvalve/digital/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id)) + return 0 + + switch(signal.data["command"]) + if("valve_open") + if(!state) + go_to_side() + + if("valve_close") + if(state) + go_straight() + + if("valve_toggle") + if(state) + go_straight() + else + go_to_side() + +/obj/machinery/atmospherics/tvalve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (istype(src, /obj/machinery/atmospherics/tvalve/digital)) + user << "\red You cannot unwrench this [src], it's too complicated." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) + +/obj/machinery/atmospherics/tvalve/mirrored + icon_state = "map_tvalvem0" + +/obj/machinery/atmospherics/tvalve/mirrored/bypass + icon_state = "map_tvalvem1" + state = 1 + +/obj/machinery/atmospherics/tvalve/mirrored/initialize_directions() + switch(dir) + if(NORTH) + initialize_directions = SOUTH|NORTH|WEST + if(SOUTH) + initialize_directions = NORTH|SOUTH|EAST + if(EAST) + initialize_directions = WEST|EAST|NORTH + if(WEST) + initialize_directions = EAST|WEST|SOUTH + +/obj/machinery/atmospherics/tvalve/mirrored/initialize() + var/node1_dir + var/node2_dir + var/node3_dir + + node1_dir = turn(dir, 180) + node2_dir = turn(dir, 90) + node3_dir = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node3_dir)) + if(target.initialize_directions & get_dir(target,src)) + node3 = target + break + + update_icon() + update_underlays() + +/obj/machinery/atmospherics/tvalve/mirrored/update_icon(animation) + if(animation) + flick("tvalvem[src.state][!src.state]",src) + else + icon_state = "tvalvem[state]" + +/obj/machinery/atmospherics/tvalve/mirrored/digital // can be controlled by AI + name = "digital switching valve" + desc = "A digitally controlled valve." + icon = 'icons/atmos/digital_tvalve.dmi' + + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection + +/obj/machinery/atmospherics/tvalve/mirrored/digital/bypass + icon_state = "map_tvalvem1" + state = 1 + +/obj/machinery/atmospherics/tvalve/mirrored/digital/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) + update_icon() + +/obj/machinery/atmospherics/tvalve/mirrored/digital/update_icon() + ..() + if(!powered()) + icon_state = "tvalvemnopower" + +/obj/machinery/atmospherics/tvalve/mirrored/digital/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/atmospherics/tvalve/mirrored/digital/attack_hand(mob/user as mob) + if(!powered()) + return + if(!src.allowed(user)) + user << "\red Access denied." + return + ..() + +//Radio remote control -eh? + +/obj/machinery/atmospherics/tvalve/mirrored/digital/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) + +/obj/machinery/atmospherics/tvalve/mirrored/digital/initialize() + ..() + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/tvalve/mirrored/digital/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id)) + return 0 + + switch(signal.data["command"]) + if("valve_open") + if(!state) + go_to_side() + + if("valve_close") + if(state) + go_straight() + + if("valve_toggle") + if(state) + go_straight() + else + go_to_side() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index f070882ba82..c821b629e04 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -1,7 +1,8 @@ /obj/machinery/atmospherics/unary/outlet_injector - icon = 'icons/obj/atmospherics/outlet_injector.dmi' - icon_state = "off" + icon = 'icons/atmos/injector.dmi' + icon_state = "map_injector" use_power = 1 + layer = 3 name = "Air Injector" desc = "Has a valve and pump attached to it" @@ -17,131 +18,122 @@ level = 1 - update_icon() - if(node) - if(on && !(stat & NOPOWER)) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - else - icon_state = "exposed" - on = 0 +/obj/machinery/atmospherics/unary/outlet_injector/update_icon() + if(!powered()) + icon_state = "off" + else + icon_state = "[on ? "on" : "off"]" - return - - power_change() - var/old_stat = stat - ..() - if(old_stat != stat) - update_icon() - - - process() - ..() - injecting = 0 - - if(!on || stat & NOPOWER) - return 0 - - if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - - if(network) - network.update = 1 - - return 1 - - proc/inject() - if(on || injecting) - return 0 - - injecting = 1 - - if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - - if(network) - network.update = 1 - - flick("inject", src) - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "tag" = id, - "device" = "AO", - "power" = on, - "volume_rate" = volume_rate, - //"timestamp" = world.time, - "sigtype" = "status" - ) - - radio_connection.post_signal(src, signal) - - return 1 - - initialize() - ..() - - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) - return 0 - - if("power" in signal.data) - on = text2num(signal.data["power"]) - - if("power_toggle" in signal.data) - on = !on - - if("inject" in signal.data) - spawn inject() +/obj/machinery/atmospherics/unary/outlet_injector/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) return + add_underlay(T, node, dir) - if("set_volume_rate" in signal.data) - var/number = text2num(signal.data["set_volume_rate"]) - volume_rate = between(0, number, air_contents.volume) - - if("status" in signal.data) - spawn(2) - broadcast_status() - return //do not update_icon - - //log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") - //return - spawn(2) - broadcast_status() +/obj/machinery/atmospherics/unary/outlet_injector/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node) - if(on) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]exposed" - on = 0 - return \ No newline at end of file +/obj/machinery/atmospherics/unary/outlet_injector/process() + ..() + injecting = 0 + + if(!on || stat & NOPOWER) + return 0 + + if(air_contents.temperature > 0) + var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + + if(network) + network.update = 1 + + return 1 + +/obj/machinery/atmospherics/unary/outlet_injector/proc/inject() + if(on || injecting) + return 0 + + injecting = 1 + + if(air_contents.temperature > 0) + var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) + + loc.assume_air(removed) + + if(network) + network.update = 1 + + flick("inject", src) + +/obj/machinery/atmospherics/unary/outlet_injector/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency) + +/obj/machinery/atmospherics/unary/outlet_injector/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "tag" = id, + "device" = "AO", + "power" = on, + "volume_rate" = volume_rate, + "sigtype" = "status" + ) + + radio_connection.post_signal(src, signal) + + return 1 + +/obj/machinery/atmospherics/unary/outlet_injector/initialize() + ..() + + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) + return 0 + + if(signal.data["power"]) + on = text2num(signal.data["power"]) + + if(signal.data["power_toggle"]) + on = !on + + if(signal.data["inject"]) + spawn inject() + return + + if(signal.data["set_volume_rate"]) + var/number = text2num(signal.data["set_volume_rate"]) + volume_rate = between(0, number, air_contents.volume) + + if(signal.data["status"]) + spawn(2) + broadcast_status() + return //do not update_icon + + //log_admin("DEBUG \[[world.timeofday]\]: outlet_injector/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + //return + spawn(2) + broadcast_status() + update_icon() + +/obj/machinery/atmospherics/unary/outlet_injector/hide(var/i) + update_underlays() \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index b755071487e..2c5f63f6079 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -50,6 +50,7 @@ break update_icon() + update_underlays() build_network() if(!network && node) @@ -85,4 +86,7 @@ del(network) node = null + update_icon() + update_underlays() + return null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index f4e9cb97509..e2cd25cfbad 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -4,8 +4,8 @@ #undefine /obj/machinery/atmospherics/unary/vent_pump - icon = 'icons/obj/atmospherics/vent_pump.dmi' - icon_state = "off" + icon = 'icons/atmos/vent_pump.dmi' + icon_state = "map_vent" name = "Air Vent" desc = "Has a valve and pump attached to it" @@ -40,316 +40,329 @@ var/radio_filter_out var/radio_filter_in - on - on = 1 - icon_state = "out" +/obj/machinery/atmospherics/unary/vent_pump/on + on = 1 + icon_state = "map_vent_out" - siphon - pump_direction = 0 - icon_state = "off" +/obj/machinery/atmospherics/unary/vent_pump/siphon + pump_direction = 0 - on - on = 1 - icon_state = "in" +/obj/machinery/atmospherics/unary/vent_pump/siphon/on + on = 1 + icon_state = "map_vent_in" - New() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) - assign_uid() - id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() - ..() +/obj/machinery/atmospherics/unary/vent_pump/New() + icon = null + initial_loc = get_area(loc) + if (initial_loc.master) + initial_loc = initial_loc.master + area_uid = initial_loc.uid + if (!id_tag) + assign_uid() + id_tag = num2text(uid) + if(ticker && ticker.current_state == 3)//if the game is running + src.initialize() + src.broadcast_status() + ..() - high_volume - name = "Large Air Vent" - power_channel = EQUIP - New() - ..() - air_contents.volume = 1000 +/obj/machinery/atmospherics/unary/vent_pump/high_volume + name = "Large Air Vent" + power_channel = EQUIP - update_icon() - if(welded) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" - return - if(on && !(stat & (NOPOWER|BROKEN))) - if(pump_direction) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" +/obj/machinery/atmospherics/unary/vent_pump/high_volume/New() + ..() + air_contents.volume = 1000 +/obj/machinery/atmospherics/unary/vent_pump/update_icon(var/safety = 0) + if(!check_icon_cache()) return - process() - ..() - if(stat & (NOPOWER|BROKEN)) + overlays.Cut() + + var/vent_icon = "vent" + + var/turf/T = get_turf(src) + if(!istype(T)) + return + + if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + vent_icon += "h" + + if(welded) + vent_icon += "weld" + else if(!powered()) + vent_icon += "off" + else + vent_icon += "[on ? "[pump_direction ? "out" : "in"]" : "off"]" + + overlays += icon_manager.get_atmos_icon("device", , , vent_icon) + +/obj/machinery/atmospherics/unary/vent_pump/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) return - if (!node) - on = 0 - //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 - if(!on) - return 0 - - if(welded) - return 0 - - var/datum/gas_mixture/environment = loc.return_air() - var/environment_pressure = environment.return_pressure() - - if(pump_direction) //internal -> external - var/pressure_delta = 10000 - - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) - - if(pressure_delta > 0.5) - if(air_contents.temperature > 0) - var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) - - if(network) - network.update = 1 - - else //external -> internal - var/pressure_delta = 10000 - if(pressure_checks&1) - pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) - if(pressure_checks&2) - pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) - - if(pressure_delta > 0.5) - if(environment.temperature > 0) - var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space - return - - air_contents.merge(removed) - - if(network) - network.update = 1 - - return 1 - - //Radio remote control - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) - - broadcast_status() - if(!radio_connection) - return 0 - - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - - signal.data = list( - "area" = src.area_uid, - "tag" = src.id_tag, - "device" = "AVP", - "power" = on, - "direction" = pump_direction?("release"):("siphon"), - "checks" = pressure_checks, - "internal" = internal_pressure_bound, - "external" = external_pressure_bound, - "timestamp" = world.time, - "sigtype" = "status" - ) - - if(!initial_loc.air_vent_names[id_tag]) - var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]" - initial_loc.air_vent_names[id_tag] = new_name - src.name = new_name - initial_loc.air_vent_info[id_tag] = signal.data - - radio_connection.post_signal(src, signal, radio_filter_out) - - return 1 - - - initialize() - ..() - - //some vents work his own spesial way - radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null - if(frequency) - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) + if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) return - //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 + else + add_underlay(T, node, dir) - if(signal.data["purge"] != null) - pressure_checks &= ~1 - pump_direction = 0 +/obj/machinery/atmospherics/unary/vent_pump/hide() + update_icon() + update_underlays() - if(signal.data["stabalize"] != null) - pressure_checks |= 1 - pump_direction = 1 +/obj/machinery/atmospherics/unary/vent_pump/process() + ..() + if(stat & (NOPOWER|BROKEN)) + return + if (!node) + on = 0 + //broadcast_status() // from now air alarm/control computer should request update purposely --rastaf0 + if(!on) + return 0 - if(signal.data["power"] != null) - on = text2num(signal.data["power"]) + if(welded) + return 0 - if(signal.data["power_toggle"] != null) - on = !on + var/datum/gas_mixture/environment = loc.return_air() + var/environment_pressure = environment.return_pressure() - if(signal.data["checks"] != null) - if (signal.data["checks"] == "default") - pressure_checks = pressure_checks_default - else - pressure_checks = text2num(signal.data["checks"]) + if(pump_direction) //internal -> external + var/pressure_delta = 10000 - if(signal.data["checks_toggle"] != null) - pressure_checks = (pressure_checks?0:3) + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (external_pressure_bound - environment_pressure)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (air_contents.return_pressure() - internal_pressure_bound)) - if(signal.data["direction"] != null) - pump_direction = text2num(signal.data["direction"]) + if(pressure_delta > 0.5) + if(air_contents.temperature > 0) + var/transfer_moles = pressure_delta*environment.volume/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - if(signal.data["set_internal_pressure"] != null) - if (signal.data["set_internal_pressure"] == "default") - internal_pressure_bound = internal_pressure_bound_default - else - internal_pressure_bound = between( - 0, - text2num(signal.data["set_internal_pressure"]), - ONE_ATMOSPHERE*50 - ) + var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - if(signal.data["set_external_pressure"] != null) - if (signal.data["set_external_pressure"] == "default") - external_pressure_bound = external_pressure_bound_default - else - external_pressure_bound = between( - 0, - text2num(signal.data["set_external_pressure"]), - ONE_ATMOSPHERE*50 - ) + loc.assume_air(removed) - if(signal.data["adjust_internal_pressure"] != null) + if(network) + network.update = 1 + + else //external -> internal + var/pressure_delta = 10000 + if(pressure_checks&1) + pressure_delta = min(pressure_delta, (environment_pressure - external_pressure_bound)) + if(pressure_checks&2) + pressure_delta = min(pressure_delta, (internal_pressure_bound - air_contents.return_pressure())) + + if(pressure_delta > 0.5) + if(environment.temperature > 0) + var/transfer_moles = pressure_delta*air_contents.volume/(environment.temperature * R_IDEAL_GAS_EQUATION) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if (isnull(removed)) //in space + return + + air_contents.merge(removed) + + if(network) + network.update = 1 + + return 1 + +//Radio remote control + +/obj/machinery/atmospherics/unary/vent_pump/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency,radio_filter_in) + +/obj/machinery/atmospherics/unary/vent_pump/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + + signal.data = list( + "area" = src.area_uid, + "tag" = src.id_tag, + "device" = "AVP", + "power" = on, + "direction" = pump_direction?("release"):("siphon"), + "checks" = pressure_checks, + "internal" = internal_pressure_bound, + "external" = external_pressure_bound, + "timestamp" = world.time, + "sigtype" = "status" + ) + + if(!initial_loc.air_vent_names[id_tag]) + var/new_name = "[initial_loc.name] Vent Pump #[initial_loc.air_vent_names.len+1]" + initial_loc.air_vent_names[id_tag] = new_name + src.name = new_name + initial_loc.air_vent_info[id_tag] = signal.data + + radio_connection.post_signal(src, signal, radio_filter_out) + + return 1 + + +/obj/machinery/atmospherics/unary/vent_pump/initialize() + ..() + + //some vents work his own spesial way + radio_filter_in = frequency==1439?(RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==1439?(RADIO_TO_AIRALARM):null + if(frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/vent_pump/receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) + return + //log_admin("DEBUG \[[world.timeofday]\]: /obj/machinery/atmospherics/unary/vent_pump/receive_signal([signal.debug_print()])") + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + return 0 + + if(signal.data["purge"] != null) + pressure_checks &= ~1 + pump_direction = 0 + + if(signal.data["stabalize"] != null) + pressure_checks |= 1 + pump_direction = 1 + + if(signal.data["power"] != null) + on = text2num(signal.data["power"]) + + if(signal.data["power_toggle"] != null) + on = !on + + if(signal.data["checks"] != null) + if (signal.data["checks"] == "default") + pressure_checks = pressure_checks_default + else + pressure_checks = text2num(signal.data["checks"]) + + if(signal.data["checks_toggle"] != null) + pressure_checks = (pressure_checks?0:3) + + if(signal.data["direction"] != null) + pump_direction = text2num(signal.data["direction"]) + + if(signal.data["set_internal_pressure"] != null) + if (signal.data["set_internal_pressure"] == "default") + internal_pressure_bound = internal_pressure_bound_default + else internal_pressure_bound = between( 0, - internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), + text2num(signal.data["set_internal_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["adjust_external_pressure"] != null) - - + if(signal.data["set_external_pressure"] != null) + if (signal.data["set_external_pressure"] == "default") + external_pressure_bound = external_pressure_bound_default + else external_pressure_bound = between( 0, - external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), + text2num(signal.data["set_external_pressure"]), ONE_ATMOSPHERE*50 ) - if(signal.data["init"] != null) - name = signal.data["init"] - return + if(signal.data["adjust_internal_pressure"] != null) + internal_pressure_bound = between( + 0, + internal_pressure_bound + text2num(signal.data["adjust_internal_pressure"]), + ONE_ATMOSPHERE*50 + ) - if(signal.data["status"] != null) - spawn(2) - broadcast_status() - return //do not update_icon + if(signal.data["adjust_external_pressure"] != null) - //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + + external_pressure_bound = between( + 0, + external_pressure_bound + text2num(signal.data["adjust_external_pressure"]), + ONE_ATMOSPHERE*50 + ) + + if(signal.data["init"] != null) + name = signal.data["init"] + return + + if(signal.data["status"] != null) spawn(2) broadcast_status() - update_icon() - return + return //do not update_icon - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(welded) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]weld" - return - if(on&&node) - if(pump_direction) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]out" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 - return + //log_admin("DEBUG \[[world.timeofday]\]: vent_pump/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + spawn(2) + broadcast_status() + update_icon() + return - attackby(obj/item/W, mob/user) - if(istype(W, /obj/item/weapon/weldingtool)) - var/obj/item/weapon/weldingtool/WT = W - if (WT.remove_fuel(0,user)) - user << "\blue Now welding the vent." - if(do_after(user, 20)) - if(!src || !WT.isOn()) return - playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) - if(!welded) - user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") - welded = 1 - update_icon() - else - user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") - welded = 0 - update_icon() +/obj/machinery/atmospherics/unary/vent_pump/attackby(obj/item/W, mob/user) + if(istype(W, /obj/item/weapon/weldingtool)) + var/obj/item/weapon/weldingtool/WT = W + if (WT.remove_fuel(0,user)) + user << "\blue Now welding the vent." + if(do_after(user, 20)) + if(!src || !WT.isOn()) return + playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) + if(!welded) + user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.") + welded = 1 + update_icon() else - user << "\blue The welding tool needs to be on to start this task." + user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") + welded = 0 + update_icon() else - user << "\blue You need more welding fuel to complete this task." - return 1 - examine() - set src in oview(1) - ..() - if(welded) - usr << "It seems welded shut." - - power_change() - if(powered(power_channel)) - stat &= ~NOPOWER + user << "\blue The welding tool needs to be on to start this task." else - stat |= NOPOWER + user << "\blue You need more welding fuel to complete this task." + return 1 + else + ..() + +/obj/machinery/atmospherics/unary/vent_pump/examine() + set src in oview(1) + ..() + if(welded) + usr << "It seems welded shut." + +/obj/machinery/atmospherics/unary/vent_pump/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) +/obj/machinery/atmospherics/unary/vent_pump/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (node && node.level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) /obj/machinery/atmospherics/unary/vent_pump/Del() if(initial_loc) diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm index 3845b9ad61b..05acdd16030 100644 --- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm +++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm @@ -1,6 +1,6 @@ /obj/machinery/atmospherics/unary/vent_scrubber - icon = 'icons/obj/atmospherics/vent_scrubber.dmi' - icon_state = "off" + icon = 'icons/atmos/vent_scrubber.dmi' + icon_state = "map_scrubber" name = "Air Scrubber" desc = "Has a valve and pump attached to it" @@ -25,245 +25,259 @@ var/area_uid var/radio_filter_out var/radio_filter_in - New() - initial_loc = get_area(loc) - if (initial_loc.master) - initial_loc = initial_loc.master - area_uid = initial_loc.uid - if (!id_tag) - assign_uid() - id_tag = num2text(uid) - if(ticker && ticker.current_state == 3)//if the game is running - src.initialize() - src.broadcast_status() - ..() - update_icon() - if(node && on && !(stat & (NOPOWER|BROKEN))) - if(scrubbing) - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[level == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" +/obj/machinery/atmospherics/unary/vent_scrubber/New() + icon = null + initial_loc = get_area(loc) + if (initial_loc.master) + initial_loc = initial_loc.master + area_uid = initial_loc.uid + if (!id_tag) + assign_uid() + id_tag = num2text(uid) + if(ticker && ticker.current_state == 3)//if the game is running + src.initialize() + src.broadcast_status() + ..() + +/obj/machinery/atmospherics/unary/vent_scrubber/update_icon(var/safety = 0) + if(!check_icon_cache()) return - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) + overlays.Cut() + + var/scrubber_icon = "scrubber" - broadcast_status() - if(!radio_connection) - return 0 + var/turf/T = get_turf(src) + if(!istype(T)) + return - var/datum/signal/signal = new - signal.transmission_method = 1 //radio signal - signal.source = src - signal.data = list( - "area" = area_uid, - "tag" = id_tag, - "device" = "AScr", - "timestamp" = world.time, - "power" = on, - "scrubbing" = scrubbing, - "panic" = panic, - "filter_co2" = scrub_CO2, - "filter_phoron" = scrub_Toxins, - "filter_n2o" = scrub_N2O, - "sigtype" = "status" - ) - if(!initial_loc.air_scrub_names[id_tag]) - var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]" - initial_loc.air_scrub_names[id_tag] = new_name - src.name = new_name - initial_loc.air_scrub_info[id_tag] = signal.data - radio_connection.post_signal(src, signal, radio_filter_out) + if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + scrubber_icon += "h" + + if(!powered()) + scrubber_icon += "off" + else + scrubber_icon += "[on ? "[scrubbing ? "on" : "in"]" : "off"]" - return 1 + overlays += icon_manager.get_atmos_icon("device", , , scrubber_icon) - initialize() - ..() - radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null - radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null - if (frequency) - set_frequency(frequency) - - process() - ..() - if(stat & (NOPOWER|BROKEN)) +/obj/machinery/atmospherics/unary/vent_scrubber/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) return - if (!node) - on = 0 - //broadcast_status() - if(!on) - return 0 + if(T.intact && node && node.level == 1 && istype(node, /obj/machinery/atmospherics/pipe)) + return + else + add_underlay(T, node, dir) + +/obj/machinery/atmospherics/unary/vent_scrubber/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, radio_filter_in) + +/obj/machinery/atmospherics/unary/vent_scrubber/proc/broadcast_status() + if(!radio_connection) + return 0 + + var/datum/signal/signal = new + signal.transmission_method = 1 //radio signal + signal.source = src + signal.data = list( + "area" = area_uid, + "tag" = id_tag, + "device" = "AScr", + "timestamp" = world.time, + "power" = on, + "scrubbing" = scrubbing, + "panic" = panic, + "filter_co2" = scrub_CO2, + "filter_phoron" = scrub_Toxins, + "filter_n2o" = scrub_N2O, + "sigtype" = "status" + ) + if(!initial_loc.air_scrub_names[id_tag]) + var/new_name = "[initial_loc.name] Air Scrubber #[initial_loc.air_scrub_names.len+1]" + initial_loc.air_scrub_names[id_tag] = new_name + src.name = new_name + initial_loc.air_scrub_info[id_tag] = signal.data + radio_connection.post_signal(src, signal, radio_filter_out) + + return 1 + +/obj/machinery/atmospherics/unary/vent_scrubber/initialize() + ..() + radio_filter_in = frequency==initial(frequency)?(RADIO_FROM_AIRALARM):null + radio_filter_out = frequency==initial(frequency)?(RADIO_TO_AIRALARM):null + if (frequency) + set_frequency(frequency) + +/obj/machinery/atmospherics/unary/vent_scrubber/process() + ..() + if(stat & (NOPOWER|BROKEN)) + return + if (!node) + on = 0 + //broadcast_status() + if(!on) + return 0 - var/datum/gas_mixture/environment = loc.return_air() + var/datum/gas_mixture/environment = loc.return_air() - if(scrubbing) - if((environment.phoron>0.001) || (environment.carbon_dioxide>0.001) || (environment.trace_gases.len>0)) - var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() + if(scrubbing) + if((environment.phoron>0.001) || (environment.carbon_dioxide>0.001) || (environment.trace_gases.len>0)) + var/transfer_moles = min(1, volume_rate/environment.volume)*environment.total_moles() - //Take a gas sample - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) - if (isnull(removed)) //in space - return - - //Filter it - var/datum/gas_mixture/filtered_out = new - filtered_out.temperature = removed.temperature - if(scrub_Toxins) - filtered_out.phoron = removed.phoron - removed.phoron = 0 - if(scrub_CO2) - filtered_out.carbon_dioxide = removed.carbon_dioxide - removed.carbon_dioxide = 0 - - if(removed.trace_gases.len>0) - for(var/datum/gas/trace_gas in removed.trace_gases) - if(istype(trace_gas, /datum/gas/oxygen_agent_b)) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) - removed.trace_gases -= trace_gas - filtered_out.trace_gases += trace_gas - - - //Remix the resulting gases - air_contents.merge(filtered_out) - - loc.assume_air(removed) - - if(network) - network.update = 1 - - else //Just siphoning all air - if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + //Take a gas sample + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if (isnull(removed)) //in space return - var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) + //Filter it + var/datum/gas_mixture/filtered_out = new + filtered_out.temperature = removed.temperature + if(scrub_Toxins) + filtered_out.phoron = removed.phoron + removed.phoron = 0 + if(scrub_CO2) + filtered_out.carbon_dioxide = removed.carbon_dioxide + removed.carbon_dioxide = 0 - var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + if(removed.trace_gases.len>0) + for(var/datum/gas/trace_gas in removed.trace_gases) + if(istype(trace_gas, /datum/gas/oxygen_agent_b)) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas + else if(istype(trace_gas, /datum/gas/sleeping_agent) && scrub_N2O) + removed.trace_gases -= trace_gas + filtered_out.trace_gases += trace_gas - air_contents.merge(removed) + + //Remix the resulting gases + air_contents.merge(filtered_out) + + loc.assume_air(removed) if(network) network.update = 1 - return 1 -/* //unused piece of code - hide(var/i) //to make the little pipe section invisible, the icon changes. - if(on&&node) - if(scrubbing) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]on" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]in" - else - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]off" - on = 0 + else //Just siphoning all air + if (air_contents.return_pressure()>=50*ONE_ATMOSPHERE) + return + + var/transfer_moles = environment.total_moles()*(volume_rate/environment.volume) + + var/datum/gas_mixture/removed = loc.remove_air(transfer_moles) + + air_contents.merge(removed) + + if(network) + network.update = 1 + + return 1 + +/obj/machinery/atmospherics/unary/vent_scrubber/hide(var/i) //to make the little pipe section invisible, the icon changes. + update_icon() + +/obj/machinery/atmospherics/unary/vent_scrubber/receive_signal(datum/signal/signal) + if(stat & (NOPOWER|BROKEN)) return -*/ + if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) + return 0 - receive_signal(datum/signal/signal) - if(stat & (NOPOWER|BROKEN)) - return - if(!signal.data["tag"] || (signal.data["tag"] != id_tag) || (signal.data["sigtype"]!="command")) - return 0 + if(signal.data["power"] != null) + on = text2num(signal.data["power"]) + if(signal.data["power_toggle"] != null) + on = !on - if(signal.data["power"] != null) - on = text2num(signal.data["power"]) - if(signal.data["power_toggle"] != null) - on = !on + if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing + panic = text2num(signal.data["panic_siphon"] != null) + if(panic) + on = 1 + scrubbing = 0 + volume_rate = 2000 + else + scrubbing = 1 + volume_rate = initial(volume_rate) + if(signal.data["toggle_panic_siphon"] != null) + panic = !panic + if(panic) + on = 1 + scrubbing = 0 + volume_rate = 2000 + else + scrubbing = 1 + volume_rate = initial(volume_rate) - if(signal.data["panic_siphon"]) //must be before if("scrubbing" thing - panic = text2num(signal.data["panic_siphon"] != null) - if(panic) - on = 1 - scrubbing = 0 - volume_rate = 2000 - else - scrubbing = 1 - volume_rate = initial(volume_rate) - if(signal.data["toggle_panic_siphon"] != null) - panic = !panic - if(panic) - on = 1 - scrubbing = 0 - volume_rate = 2000 - else - scrubbing = 1 - volume_rate = initial(volume_rate) + if(signal.data["scrubbing"] != null) + scrubbing = text2num(signal.data["scrubbing"]) + if(signal.data["toggle_scrubbing"]) + scrubbing = !scrubbing - if(signal.data["scrubbing"] != null) - scrubbing = text2num(signal.data["scrubbing"]) - if(signal.data["toggle_scrubbing"]) - scrubbing = !scrubbing + if(signal.data["co2_scrub"] != null) + scrub_CO2 = text2num(signal.data["co2_scrub"]) + if(signal.data["toggle_co2_scrub"]) + scrub_CO2 = !scrub_CO2 - if(signal.data["co2_scrub"] != null) - scrub_CO2 = text2num(signal.data["co2_scrub"]) - if(signal.data["toggle_co2_scrub"]) - scrub_CO2 = !scrub_CO2 + if(signal.data["tox_scrub"] != null) + scrub_Toxins = text2num(signal.data["tox_scrub"]) + if(signal.data["toggle_tox_scrub"]) + scrub_Toxins = !scrub_Toxins - if(signal.data["tox_scrub"] != null) - scrub_Toxins = text2num(signal.data["tox_scrub"]) - if(signal.data["toggle_tox_scrub"]) - scrub_Toxins = !scrub_Toxins + if(signal.data["n2o_scrub"] != null) + scrub_N2O = text2num(signal.data["n2o_scrub"]) + if(signal.data["toggle_n2o_scrub"]) + scrub_N2O = !scrub_N2O - if(signal.data["n2o_scrub"] != null) - scrub_N2O = text2num(signal.data["n2o_scrub"]) - if(signal.data["toggle_n2o_scrub"]) - scrub_N2O = !scrub_N2O + if(signal.data["init"] != null) + name = signal.data["init"] + return - if(signal.data["init"] != null) - name = signal.data["init"] - return - - if(signal.data["status"] != null) - spawn(2) - broadcast_status() - return //do not update_icon - -// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + if(signal.data["status"] != null) spawn(2) broadcast_status() - update_icon() - return + return //do not update_icon - power_change() - if(powered(power_channel)) - stat &= ~NOPOWER - else - stat |= NOPOWER +// log_admin("DEBUG \[[world.timeofday]\]: vent_scrubber/receive_signal: unknown command \"[signal.data["command"]]\"\n[signal.debug_print()]") + spawn(2) + broadcast_status() + update_icon() + return + +/obj/machinery/atmospherics/unary/vent_scrubber/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (!(stat & NOPOWER) && on) - user << "\red You cannot unwrench this [src], turn it off first." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) +/obj/machinery/atmospherics/unary/vent_scrubber/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (!(stat & NOPOWER) && on) + user << "\red You cannot unwrench this [src], turn it off first." + return 1 + var/turf/T = src.loc + if (node && node.level==1 && isturf(T) && T.intact) + user << "\red You must remove the plating first." + return 1 + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) /obj/machinery/atmospherics/unary/vent_scrubber/Del() if(initial_loc) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 09d0b64f866..75282275ebd 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -1,10 +1,11 @@ -obj/machinery/atmospherics/valve - icon = 'icons/obj/atmospherics/valve.dmi' - icon_state = "valve0" +/obj/machinery/atmospherics/valve + icon = 'icons/atmos/valve.dmi' + icon_state = "map_valve0" name = "manual valve" desc = "A pipe valve" + level = 1 dir = SOUTH initialize_directions = SOUTH|NORTH @@ -17,322 +18,297 @@ obj/machinery/atmospherics/valve var/datum/pipe_network/network_node1 var/datum/pipe_network/network_node2 - open - open = 1 - icon_state = "valve1" +/obj/machinery/atmospherics/valve/open + open = 1 + icon_state = "map_valve1" - update_icon(animation) - if(animation) - flick("valve[src.open][!src.open]",src) - else - icon_state = "valve[open]" +/obj/machinery/atmospherics/valve/update_icon(animation) + if(animation) + flick("valve[src.open][!src.open]",src) + else + icon_state = "valve[open]" - New() - switch(dir) - if(NORTH || SOUTH) - initialize_directions = NORTH|SOUTH - if(EAST || WEST) - initialize_directions = EAST|WEST - ..() +/obj/machinery/atmospherics/valve/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node1, get_dir(src, node1)) + add_underlay(T, node2, get_dir(src, node2)) - network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) +/obj/machinery/atmospherics/valve/hide(var/i) + update_underlays() +/obj/machinery/atmospherics/valve/New() + switch(dir) + if(NORTH || SOUTH) + initialize_directions = NORTH|SOUTH + if(EAST || WEST) + initialize_directions = EAST|WEST + ..() - if(reference == node1) - network_node1 = new_network - if(open) - network_node2 = new_network - else if(reference == node2) - network_node2 = new_network - if(open) - network_node1 = new_network - - if(new_network.normal_members.Find(src)) - return 0 - - new_network.normal_members += src - +/obj/machinery/atmospherics/valve/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) + if(reference == node1) + network_node1 = new_network if(open) - if(reference == node1) - if(node2) - return node2.network_expand(new_network, src) - else if(reference == node2) - if(node1) - return node1.network_expand(new_network, src) + network_node2 = new_network + else if(reference == node2) + network_node2 = new_network + if(open) + network_node1 = new_network - return null + if(new_network.normal_members.Find(src)) + return 0 - Del() - loc = null + new_network.normal_members += src - if(node1) - node1.disconnect(src) - del(network_node1) - if(node2) - node2.disconnect(src) - del(network_node2) + if(open) + if(reference == node1) + if(node2) + return node2.network_expand(new_network, src) + else if(reference == node2) + if(node1) + return node1.network_expand(new_network, src) + return null + +/obj/machinery/atmospherics/valve/Del() + loc = null + + if(node1) + node1.disconnect(src) + del(network_node1) + if(node2) + node2.disconnect(src) + del(network_node2) + + node1 = null + node2 = null + + ..() + +/obj/machinery/atmospherics/valve/proc/open() + if(open) return 0 + + open = 1 + update_icon() + + if(network_node1&&network_node2) + network_node1.merge(network_node2) + network_node2 = network_node1 + + if(network_node1) + network_node1.update = 1 + else if(network_node2) + network_node2.update = 1 + + return 1 + +/obj/machinery/atmospherics/valve/proc/close() + if(!open) + return 0 + + open = 0 + update_icon() + + if(network_node1) + del(network_node1) + if(network_node2) + del(network_node2) + + build_network() + + return 1 + +/obj/machinery/atmospherics/valve/proc/normalize_dir() + if(dir==3) + dir = 1 + else if(dir==12) + dir = 4 + +/obj/machinery/atmospherics/valve/attack_ai(mob/user as mob) + return + +/obj/machinery/atmospherics/valve/attack_paw(mob/user as mob) + return attack_hand(user) + +/obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) + src.add_fingerprint(usr) + update_icon(1) + sleep(10) + if (src.open) + src.close() + else + src.open() + +/obj/machinery/atmospherics/valve/process() + ..() + . = PROCESS_KILL + + return + +/obj/machinery/atmospherics/valve/initialize() + normalize_dir() + + var/node1_dir + var/node2_dir + + for(var/direction in cardinal) + if(direction&initialize_directions) + if (!node1_dir) + node1_dir = direction + else if (!node2_dir) + node2_dir = direction + + for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) + if(target.initialize_directions & get_dir(target,src)) + node2 = target + break + + build_network() + + update_icon() + update_underlays() + + if(openDuringInit) + close() + open() + openDuringInit = 0 + +/obj/machinery/atmospherics/valve/build_network() + if(!network_node1 && node1) + network_node1 = new /datum/pipe_network() + network_node1.normal_members += src + network_node1.build_network(node1, src) + + if(!network_node2 && node2) + network_node2 = new /datum/pipe_network() + network_node2.normal_members += src + network_node2.build_network(node2, src) + +/obj/machinery/atmospherics/valve/return_network(obj/machinery/atmospherics/reference) + build_network() + + if(reference==node1) + return network_node1 + + if(reference==node2) + return network_node2 + + return null + +/obj/machinery/atmospherics/valve/reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) + if(network_node1 == old_network) + network_node1 = new_network + if(network_node2 == old_network) + network_node2 = new_network + + return 1 + +/obj/machinery/atmospherics/valve/return_network_air(datum/network/reference) + return null + +/obj/machinery/atmospherics/valve/disconnect(obj/machinery/atmospherics/reference) + if(reference==node1) + del(network_node1) node1 = null + + else if(reference==node2) + del(network_node2) node2 = null - ..() + update_underlays() - proc/open() + return null - if(open) return 0 +/obj/machinery/atmospherics/valve/digital // can be controlled by AI + name = "digital valve" + desc = "A digitally controlled valve." + icon = 'icons/atmos/digital_valve.dmi' + + var/frequency = 0 + var/id = null + var/datum/radio_frequency/radio_connection - open = 1 +/obj/machinery/atmospherics/valve/digital/attack_ai(mob/user as mob) + return src.attack_hand(user) + +/obj/machinery/atmospherics/valve/digital/attack_hand(mob/user as mob) + if(!powered()) + return + if(!src.allowed(user)) + user << "\red Access denied." + return + ..() + +/obj/machinery/atmospherics/valve/digital/open + open = 1 + icon_state = "map_valve1" + +/obj/machinery/atmospherics/valve/digital/power_change() + var/old_stat = stat + ..() + if(old_stat != stat) update_icon() - if(network_node1&&network_node2) - network_node1.merge(network_node2) - network_node2 = network_node1 +/obj/machinery/atmospherics/valve/digital/update_icon() + ..() + if(!powered()) + icon_state = "valve[open]nopower" - if(network_node1) - network_node1.update = 1 - else if(network_node2) - network_node2.update = 1 +/obj/machinery/atmospherics/valve/digital/proc/set_frequency(new_frequency) + radio_controller.remove_object(src, frequency) + frequency = new_frequency + if(frequency) + radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - return 1 +/obj/machinery/atmospherics/valve/digital/initialize() + ..() + if(frequency) + set_frequency(frequency) - proc/close() +/obj/machinery/atmospherics/valve/digital/receive_signal(datum/signal/signal) + if(!signal.data["tag"] || (signal.data["tag"] != id)) + return 0 - if(!open) - return 0 + switch(signal.data["command"]) + if("valve_open") + if(!open) + open() - open = 0 - update_icon() + if("valve_close") + if(open) + close() - if(network_node1) - del(network_node1) - if(network_node2) - del(network_node2) - - build_network() - - return 1 - - proc/normalize_dir() - if(dir==3) - dir = 1 - else if(dir==12) - dir = 4 - - attack_ai(mob/user as mob) - return - - attack_paw(mob/user as mob) - return attack_hand(user) - - attack_hand(mob/user as mob) - src.add_fingerprint(usr) - update_icon(1) - sleep(10) - if (src.open) - src.close() - else - src.open() - - process() - ..() - . = PROCESS_KILL - -/* if(open && (!node1 || !node2)) - close() - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (!node2) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ - - return - - initialize() - normalize_dir() - - var/node1_dir - var/node2_dir - - for(var/direction in cardinal) - if(direction&initialize_directions) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction - - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - - build_network() - - if(openDuringInit) - close() - open() - openDuringInit = 0 - -/* - var/connect_directions - switch(dir) - if(NORTH) - connect_directions = NORTH|SOUTH - if(SOUTH) - connect_directions = NORTH|SOUTH - if(EAST) - connect_directions = EAST|WEST - if(WEST) - connect_directions = EAST|WEST + if("valve_toggle") + if(open) + close() else - connect_directions = dir - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - connect_directions &= ~direction - node1 = target - break - if(node1) - break - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break - if(node1) - break -*/ - build_network() - if(!network_node1 && node1) - network_node1 = new /datum/pipe_network() - network_node1.normal_members += src - network_node1.build_network(node1, src) - - if(!network_node2 && node2) - network_node2 = new /datum/pipe_network() - network_node2.normal_members += src - network_node2.build_network(node2, src) - - - return_network(obj/machinery/atmospherics/reference) - build_network() - - if(reference==node1) - return network_node1 - - if(reference==node2) - return network_node2 - - return null - - reassign_network(datum/pipe_network/old_network, datum/pipe_network/new_network) - if(network_node1 == old_network) - network_node1 = new_network - if(network_node2 == old_network) - network_node2 = new_network + open() +/obj/machinery/atmospherics/valve/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) + if (!istype(W, /obj/item/weapon/wrench)) + return ..() + if (istype(src, /obj/machinery/atmospherics/valve/digital)) + user << "\red You cannot unwrench this [src], it's too complicated." return 1 - - return_network_air(datum/network/reference) - return null - - disconnect(obj/machinery/atmospherics/reference) - if(reference==node1) - del(network_node1) - node1 = null - - else if(reference==node2) - del(network_node2) - node2 = null - - return null - - digital // can be controlled by AI - name = "digital valve" - desc = "A digitally controlled valve." - icon = 'icons/obj/atmospherics/digital_valve.dmi' - - attack_ai(mob/user as mob) - return src.attack_hand(user) - - attack_hand(mob/user as mob) - if(!src.allowed(user)) - user << "\red Access denied." - return - ..() - - //Radio remote control - - proc - set_frequency(new_frequency) - radio_controller.remove_object(src, frequency) - frequency = new_frequency - if(frequency) - radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) - - var/frequency = 0 - var/id = null - var/datum/radio_frequency/radio_connection - - initialize() - ..() - if(frequency) - set_frequency(frequency) - - receive_signal(datum/signal/signal) - if(!signal.data["tag"] || (signal.data["tag"] != id)) - return 0 - - switch(signal.data["command"]) - if("valve_open") - if(!open) - open() - - if("valve_close") - if(open) - close() - - if("valve_toggle") - if(open) - close() - else - open() - - attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (!istype(W, /obj/item/weapon/wrench)) - return ..() - if (istype(src, /obj/machinery/atmospherics/valve/digital)) - user << "\red You cannot unwrench this [src], it's too complicated." - return 1 - var/turf/T = src.loc - if (level==1 && isturf(T) && T.intact) - user << "\red You must remove the plating first." - return 1 - var/datum/gas_mixture/int_air = return_air() - var/datum/gas_mixture/env_air = loc.return_air() - if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) - user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." - add_fingerprint(user) - return 1 - playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) - user << "\blue You begin to unfasten \the [src]..." - if (do_after(user, 40)) - user.visible_message( \ - "[user] unfastens \the [src].", \ - "\blue You have unfastened \the [src].", \ - "You hear ratchet.") - new /obj/item/pipe(loc, make_from=src) - del(src) + var/datum/gas_mixture/int_air = return_air() + var/datum/gas_mixture/env_air = loc.return_air() + if ((int_air.return_pressure()-env_air.return_pressure()) > 2*ONE_ATMOSPHERE) + user << "\red You cannot unwrench this [src], it too exerted due to internal pressure." + add_fingerprint(user) + return 1 + playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) + user << "\blue You begin to unfasten \the [src]..." + if (do_after(user, 40)) + user.visible_message( \ + "[user] unfastens \the [src].", \ + "\blue You have unfastened \the [src].", \ + "You hear ratchet.") + new /obj/item/pipe(loc, make_from=src) + del(src) \ No newline at end of file diff --git a/code/ATMOSPHERICS/mapdebugging.dm b/code/ATMOSPHERICS/mapdebugging.dm deleted file mode 100644 index 2dc39497136..00000000000 --- a/code/ATMOSPHERICS/mapdebugging.dm +++ /dev/null @@ -1,16 +0,0 @@ -client/verb/discon_pipes() - set name = "Show Disconnected Pipes" - set category = "Debug" - - for(var/obj/machinery/atmospherics/pipe/simple/P in world) - if(!P.node1 || !P.node2) - usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]" - - for(var/obj/machinery/atmospherics/pipe/manifold/P in world) - if(!P.node1 || !P.node2 || !P.node3) - usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]" - - for(var/obj/machinery/atmospherics/pipe/manifold4w/P in world) - if(!P.node1 || !P.node2 || !P.node3 || !P.node4) - usr << "[P], [P.x], [P.y], [P.z], [P.loc.loc]" -//With thanks to mini. Check before use, uncheck after. Do Not Use on a live server. \ No newline at end of file diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 11daee64c3d..875c5a67ee5 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1,4 +1,4 @@ -obj/machinery/atmospherics/pipe +/obj/machinery/atmospherics/pipe var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/datum/pipeline/parent @@ -12,51 +12,57 @@ obj/machinery/atmospherics/pipe var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called -obj/machinery/atmospherics/pipe/proc/pipeline_expansion() +/obj/machinery/atmospherics/pipe/New() + ..() + //so pipes under walls are hidden + if(!istype(get_turf(src), /turf/simulated/floor)) + level = 1 + +/obj/machinery/atmospherics/pipe/proc/pipeline_expansion() return null -obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) +/obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) //Return 1 if parent should continue checking other pipes //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null return 1 -obj/machinery/atmospherics/pipe/return_air() +/obj/machinery/atmospherics/pipe/return_air() if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) return parent.air -obj/machinery/atmospherics/pipe/build_network() +/obj/machinery/atmospherics/pipe/build_network() if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) return parent.return_network() -obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) +/obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) return parent.network_expand(new_network, reference) -obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference) if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) return parent.return_network(reference) -obj/machinery/atmospherics/pipe/Del() +/obj/machinery/atmospherics/pipe/Del() del(parent) if(air_temporary) loc.assume_air(air_temporary) ..() -obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) +/obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (istype(src, /obj/machinery/atmospherics/pipe/tank)) return ..() if (istype(src, /obj/machinery/atmospherics/pipe/vent)) @@ -91,10 +97,44 @@ obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/u del(meter) del(src) +/obj/machinery/atmospherics/proc/change_color(var/new_color) + //only pass valid pipe colors please ~otherwise your pipe will turn invisible + if(!pipe_color_check(new_color)) + return -obj/machinery/atmospherics/pipe/simple - icon = 'icons/obj/pipes.dmi' + pipe_color = new_color + update_icon() +/obj/machinery/atmospherics/pipe/add_underlay(var/obj/machinery/atmospherics/node, var/direction) + if(istype(src, /obj/machinery/atmospherics/pipe/tank)) //todo: move tanks to unary devices + return ..() + + if(node) + var/temp_dir = get_dir(src, node) + underlays += icon_manager.get_atmos_icon("pipe_underlay_intact", temp_dir, color_cache_name(node)) + return temp_dir + else if(direction) + underlays += icon_manager.get_atmos_icon("pipe_underlay_exposed", direction, pipe_color) + else + return null + +/obj/machinery/atmospherics/pipe/color_cache_name(var/obj/machinery/atmospherics/node) + if(istype(src, /obj/machinery/atmospherics/pipe/tank)) + return ..() + + if(istype(node, /obj/machinery/atmospherics/pipe/manifold) || istype(node, /obj/machinery/atmospherics/pipe/manifold4w)) + if(pipe_color == node.pipe_color) + return node.pipe_color + else + return null + else if(istype(node, /obj/machinery/atmospherics/pipe/simple)) + return node.pipe_color + else + return pipe_color + +/obj/machinery/atmospherics/pipe/simple + icon = 'icons/atmos/pipes.dmi' + icon_state = "intact" name = "pipe" desc = "A one meter section of regular pipe" @@ -113,12 +153,16 @@ obj/machinery/atmospherics/pipe/simple var/fatigue_pressure = 55*ONE_ATMOSPHERE alert_pressure = 55*ONE_ATMOSPHERE - level = 1 -obj/machinery/atmospherics/pipe/simple/New() +/obj/machinery/atmospherics/pipe/simple/New() ..() + + // Pipe colors and icon states are handled by an image cache - so color and icon should + // be null. For mapping purposes color is defined in the object definitions. + icon = null alpha = 255 + switch(dir) if(SOUTH || NORTH) initialize_directions = SOUTH|NORTH @@ -133,53 +177,18 @@ obj/machinery/atmospherics/pipe/simple/New() if(SOUTHWEST) initialize_directions = SOUTH|WEST - -obj/machinery/atmospherics/pipe/simple/hide(var/i) +/obj/machinery/atmospherics/pipe/simple/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() -obj/machinery/atmospherics/pipe/simple/process() +/obj/machinery/atmospherics/pipe/simple/process() if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle ..() else . = PROCESS_KILL - /*if(!node1) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - - else if(!node2) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 - - - else if(parent) - var/environment_temperature = 0 - - if(istype(loc, /turf/simulated/)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature - - else - environment_temperature = loc:temperature - - var/datum/gas_mixture/pipe_air = return_air() - - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - */ //Screw you heat lag - -obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) +/obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() var/pressure_difference = pressure - environment.return_pressure() @@ -194,7 +203,7 @@ obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) else return 1 -obj/machinery/atmospherics/pipe/simple/proc/burst() +/obj/machinery/atmospherics/pipe/simple/proc/burst() src.visible_message("\red \bold [src] bursts!"); playsound(src.loc, 'sound/effects/bang.ogg', 25, 1) var/datum/effect/effect/system/smoke_spread/smoke = new @@ -202,13 +211,13 @@ obj/machinery/atmospherics/pipe/simple/proc/burst() smoke.start() del(src) -obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() +/obj/machinery/atmospherics/pipe/simple/proc/normalize_dir() if(dir==3) dir = 1 else if(dir==12) dir = 4 -obj/machinery/atmospherics/pipe/simple/Del() +/obj/machinery/atmospherics/pipe/simple/Del() if(node1) node1.disconnect(src) if(node2) @@ -216,42 +225,42 @@ obj/machinery/atmospherics/pipe/simple/Del() ..() -obj/machinery/atmospherics/pipe/simple/pipeline_expansion() +/obj/machinery/atmospherics/pipe/simple/pipeline_expansion() return list(node1, node2) -obj/machinery/atmospherics/pipe/simple/update_icon() - switch(pipe_color) - if ("red") color = COLOR_RED - if ("blue") color = COLOR_BLUE - if ("cyan") color = COLOR_CYAN - if ("green") color = COLOR_GREEN - if ("yellow") color = "#FFCC00" - if ("purple") color = "#5C1EC0" - if ("grey") color = null +/obj/machinery/atmospherics/pipe/simple/change_color(var/new_color) + ..() + //for updating connected atmos device pipes (i.e. vents, manifolds, etc) + if(node1) + node1.update_underlays() + if(node2) + node2.update_underlays() - if(node1 && node2) - icon_state = "intact[invisibility ? "-f" : "" ]" +/obj/machinery/atmospherics/pipe/simple/update_icon(var/safety = 0) + if(!check_icon_cache()) + return - //var/node1_direction = get_dir(src, node1) - //var/node2_direction = get_dir(src, node2) + alpha = 255 - //dir = node1_direction|node2_direction + overlays.Cut() + if(!node1 && !node2) + var/turf/T = get_turf(src) + new /obj/item/pipe(loc, make_from=src) + for (var/obj/machinery/meter/meter in T) + if (meter.target == src) + new /obj/item/pipe_meter(T) + del(meter) + del(src) + else if(node1 && node2) + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "intact") else - if(!node1 && !node2) - var/turf/T = get_turf(src) - new /obj/item/pipe(loc, make_from=src) - for (var/obj/machinery/meter/meter in T) - if (meter.target == src) - new /obj/item/pipe_meter(T) - del(meter) - del(src) - var/have_node1 = node1?1:0 - var/have_node2 = node2?1:0 - icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" + overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "exposed[node1?1:0][node2?1:0]") +/obj/machinery/atmospherics/pipe/simple/update_underlays() + return -obj/machinery/atmospherics/pipe/simple/initialize() +/obj/machinery/atmospherics/pipe/simple/initialize() normalize_dir() var/node1_dir var/node2_dir @@ -276,12 +285,12 @@ obj/machinery/atmospherics/pipe/simple/initialize() del(src) return - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) + var/turf/T = get_turf(src) + if(istype(T)) + hide(T.intact) update_icon() - //update_icon() -obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) del(parent) @@ -296,55 +305,54 @@ obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/ref return null - - - -obj/machinery/atmospherics/pipe/simple/visible +/obj/machinery/atmospherics/pipe/simple/visible level = 2 - icon_state = "intact" -obj/machinery/atmospherics/pipe/simple/visible/scrubbers - name="Scrubbers pipe" - color=COLOR_RED +/obj/machinery/atmospherics/pipe/simple/visible/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/simple/visible/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/simple/visible/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/simple/visible/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/simple/visible/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/simple/visible/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/simple/visible/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/simple/visible/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/simple/visible/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/simple/visible/purple + color = PIPE_COLOR_PURPLE -obj/machinery/atmospherics/pipe/simple/hidden +/obj/machinery/atmospherics/pipe/simple/hidden level = 1 - icon_state = "intact-f" - alpha = 192 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game + alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game -obj/machinery/atmospherics/pipe/simple/hidden/scrubbers - name="Scrubbers pipe" - color=COLOR_RED +/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/simple/hidden/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/simple/hidden/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/simple/hidden/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/simple/hidden/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/simple/hidden/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/simple/hidden/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/simple/hidden/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/simple/hidden/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/simple/hidden/purple + color = PIPE_COLOR_PURPLE -obj/machinery/atmospherics/pipe/simple/insulated +/obj/machinery/atmospherics/pipe/simple/insulated icon = 'icons/obj/atmospherics/red_pipe.dmi' icon_state = "intact" @@ -357,9 +365,9 @@ obj/machinery/atmospherics/pipe/simple/insulated level = 2 -obj/machinery/atmospherics/pipe/manifold - icon = 'icons/obj/atmospherics/pipe_manifold.dmi' - +/obj/machinery/atmospherics/pipe/manifold + icon = 'icons/atmos/manifold.dmi' + icon_state = "map" name = "pipe manifold" desc = "A manifold composed of regular pipes" @@ -375,8 +383,11 @@ obj/machinery/atmospherics/pipe/manifold level = 1 layer = 2.4 //under wires with their 2.44 -obj/machinery/atmospherics/pipe/manifold/New() +/obj/machinery/atmospherics/pipe/manifold/New() + ..() alpha = 255 + icon = null + switch(dir) if(NORTH) initialize_directions = EAST|SOUTH|WEST @@ -387,43 +398,21 @@ obj/machinery/atmospherics/pipe/manifold/New() if(WEST) initialize_directions = NORTH|EAST|SOUTH - ..() - - - -obj/machinery/atmospherics/pipe/manifold/hide(var/i) +/obj/machinery/atmospherics/pipe/manifold/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() -obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() +/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() return list(node1, node2, node3) -obj/machinery/atmospherics/pipe/manifold/process() +/obj/machinery/atmospherics/pipe/manifold/process() if(!parent) ..() else . = PROCESS_KILL -/* - if(!node1) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node2) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node3) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -obj/machinery/atmospherics/pipe/manifold/Del() + +/obj/machinery/atmospherics/pipe/manifold/Del() if(node1) node1.disconnect(src) if(node2) @@ -433,7 +422,7 @@ obj/machinery/atmospherics/pipe/manifold/Del() ..() -obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) del(parent) @@ -453,40 +442,51 @@ obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/r ..() -obj/machinery/atmospherics/pipe/manifold/update_icon() - if(node1&&node2&&node3) - switch(pipe_color) - if ("red") color = COLOR_RED - if ("blue") color = COLOR_BLUE - if ("cyan") color = COLOR_CYAN - if ("green") color = COLOR_GREEN - if ("yellow") color = "#FFCC00" - if ("purple") color = "#5C1EC0" - if ("grey") color = null - icon_state = "manifold[invisibility ? "-f" : "" ]" +/obj/machinery/atmospherics/pipe/manifold/change_color(var/new_color) + ..() + //for updating connected atmos device pipes (i.e. vents, manifolds, etc) + if(node1) + node1.update_underlays() + if(node2) + node2.update_underlays() + if(node3) + node3.update_underlays() +/obj/machinery/atmospherics/pipe/manifold/update_icon(var/safety = 0) + if(!check_icon_cache()) + return + + alpha = 255 + + if(!node1 && !node2 && !node3) + var/turf/T = get_turf(src) + new /obj/item/pipe(loc, make_from=src) + for (var/obj/machinery/meter/meter in T) + if (meter.target == src) + new /obj/item/pipe_meter(T) + del(meter) + del(src) else - var/connected = 0 - var/unconnected = 0 - var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) + overlays.Cut() + overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "core") + overlays += icon_manager.get_atmos_icon("manifold", , , "clamps") + underlays.Cut() + + var/list/directions = list(NORTH, SOUTH, EAST, WEST) + directions -= dir - if(node1) - connected |= get_dir(src, node1) - if(node2) - connected |= get_dir(src, node2) - if(node3) - connected |= get_dir(src, node3) + directions -= add_underlay(node1) + directions -= add_underlay(node2) + directions -= add_underlay(node3) - unconnected = (~connected)&(connect_directions) + for(var/D in directions) + add_underlay(,D) - icon_state = "manifold_[connected]_[unconnected]" +/obj/machinery/atmospherics/pipe/manifold/update_underlays() + ..() + update_icon() - if(!connected) - del(src) - - return - -obj/machinery/atmospherics/pipe/manifold/initialize() +/obj/machinery/atmospherics/pipe/manifold/initialize() var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) for(var/direction in cardinal) @@ -521,61 +521,61 @@ obj/machinery/atmospherics/pipe/manifold/initialize() if (node3) break - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - //update_icon() + var/turf/T = get_turf(src) + if(istype(T)) + hide(T.intact) update_icon() - -obj/machinery/atmospherics/pipe/manifold/visible +/obj/machinery/atmospherics/pipe/manifold/visible level = 2 - icon_state = "manifold" -obj/machinery/atmospherics/pipe/manifold/visible/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/manifold/visible/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/manifold/visible/scrubbers - name="Scrubbers pipe" - color=COLOR_RED +/obj/machinery/atmospherics/pipe/manifold/visible/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/manifold/visible/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/manifold/visible/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/manifold/visible/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/manifold/visible/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/manifold/visible/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold/visible/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold/visible/purple + color = PIPE_COLOR_PURPLE -obj/machinery/atmospherics/pipe/manifold/hidden +/obj/machinery/atmospherics/pipe/manifold/hidden level = 1 - icon_state = "manifold-f" - alpha = 192 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game + alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game -obj/machinery/atmospherics/pipe/manifold/hidden/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers - name="Scrubbers pipe" - color = COLOR_RED +/obj/machinery/atmospherics/pipe/manifold/hidden/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/manifold/hidden/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/manifold/hidden/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/manifold/hidden/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/manifold/hidden/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/manifold/hidden/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold/hidden/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold/hidden/purple + color = PIPE_COLOR_PURPLE - -obj/machinery/atmospherics/pipe/manifold4w - icon = 'icons/obj/atmospherics/pipe_manifold.dmi' - +/obj/machinery/atmospherics/pipe/manifold4w + icon = 'icons/atmos/manifold.dmi' + icon_state = "map_4way" name = "4-way pipe manifold" desc = "A manifold composed of regular pipes" @@ -592,43 +592,21 @@ obj/machinery/atmospherics/pipe/manifold4w level = 1 layer = 2.4 //under wires with their 2.44 -obj/machinery/atmospherics/pipe/manifold4w/New() +/obj/machinery/atmospherics/pipe/manifold4w/New() ..() alpha = 255 + icon = null -obj/machinery/atmospherics/pipe/manifold4w/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion() +/obj/machinery/atmospherics/pipe/manifold4w/pipeline_expansion() return list(node1, node2, node3, node4) -obj/machinery/atmospherics/pipe/manifold4w/process() +/obj/machinery/atmospherics/pipe/manifold4w/process() if(!parent) ..() else . = PROCESS_KILL -/* - if(!node1) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node2) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node3) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -obj/machinery/atmospherics/pipe/manifold4w/Del() + +/obj/machinery/atmospherics/pipe/manifold4w/Del() if(node1) node1.disconnect(src) if(node2) @@ -640,7 +618,7 @@ obj/machinery/atmospherics/pipe/manifold4w/Del() ..() -obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) del(parent) @@ -665,37 +643,58 @@ obj/machinery/atmospherics/pipe/manifold4w/disconnect(obj/machinery/atmospherics ..() -obj/machinery/atmospherics/pipe/manifold4w/update_icon() - overlays.Cut() - if(node1&&node2&&node3&&node4) - switch(pipe_color) - if ("red") color = COLOR_RED - if ("blue") color = COLOR_BLUE - if ("cyan") color = COLOR_CYAN - if ("green") color = COLOR_GREEN - if ("yellow") color = "#FFCC00" - if ("purple") color = "#5C1EC0" - if ("grey") color = null - icon_state = "manifold4w[invisibility ? "-f" : "" ]" +/obj/machinery/atmospherics/pipe/manifold4w/change_color(var/new_color) + ..() + //for updating connected atmos device pipes (i.e. vents, manifolds, etc) + if(node1) + node1.update_underlays() + if(node2) + node2.update_underlays() + if(node3) + node3.update_underlays() + if(node4) + node4.update_underlays() +/obj/machinery/atmospherics/pipe/manifold4w/update_icon(var/safety = 0) + if(!check_icon_cache()) + return + + alpha = 255 + + if(!node1 && !node2 && !node3 && !node4) + var/turf/T = get_turf(src) + new /obj/item/pipe(loc, make_from=src) + for (var/obj/machinery/meter/meter in T) + if (meter.target == src) + new /obj/item/pipe_meter(T) + del(meter) + del(src) else - icon_state = "manifold4w_ex" - var/icon/con = new/icon('icons/obj/atmospherics/pipe_manifold.dmi',"manifold4w_con") //Since 4-ways are supposed to be directionless, they need an overlay instead it seems. + overlays.Cut() + overlays += icon_manager.get_atmos_icon("manifold", , pipe_color, "4way") + overlays += icon_manager.get_atmos_icon("manifold", , , "clamps_4way") + underlays.Cut() + + var/list/directions = list(NORTH, SOUTH, EAST, WEST) - if(node1) - overlays += new/image(con,dir=1) - if(node2) - overlays += new/image(con,dir=2) - if(node3) - overlays += new/image(con,dir=4) - if(node4) - overlays += new/image(con,dir=8) + directions -= add_underlay(node1) + directions -= add_underlay(node2) + directions -= add_underlay(node3) + directions -= add_underlay(node4) - if(!node1 && !node2 && !node3 && !node4) - del(src) - return + for(var/D in directions) + add_underlay(,D) -obj/machinery/atmospherics/pipe/manifold4w/initialize() +/obj/machinery/atmospherics/pipe/manifold4w/update_underlays() + ..() + update_icon() + +/obj/machinery/atmospherics/pipe/manifold4w/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() + +/obj/machinery/atmospherics/pipe/manifold4w/initialize() for(var/obj/machinery/atmospherics/target in get_step(src,1)) if(target.initialize_directions & 2) @@ -717,58 +716,59 @@ obj/machinery/atmospherics/pipe/manifold4w/initialize() node4 = target break - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - //update_icon() + var/turf/T = get_turf(src) + if(istype(T)) + hide(T.intact) update_icon() - -obj/machinery/atmospherics/pipe/manifold4w/visible +/obj/machinery/atmospherics/pipe/manifold4w/visible level = 2 - icon_state = "manifold4w" -obj/machinery/atmospherics/pipe/manifold4w/visible/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers - name="Scrubbers pipe" - color=COLOR_RED +/obj/machinery/atmospherics/pipe/manifold4w/visible/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/manifold4w/visible/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/manifold4w/visible/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/manifold4w/visible/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/manifold4w/visible/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/manifold4w/visible/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold4w/visible/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold4w/visible/purple + color = PIPE_COLOR_PURPLE -obj/machinery/atmospherics/pipe/manifold4w/hidden +/obj/machinery/atmospherics/pipe/manifold4w/hidden level = 1 - icon_state = "manifold4w-f" - alpha = 192 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game + alpha = 128 //set for the benefit of mapping - this is reset to opaque when the pipe is spawned in game -obj/machinery/atmospherics/pipe/manifold4w/hidden/supply - name="Air supply pipe" - color=COLOR_BLUE +/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers + name = "Scrubbers pipe" + color = PIPE_COLOR_RED -obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers - name="Scrubbers pipe" - color=COLOR_RED +/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply + name = "Air supply pipe" + color = PIPE_COLOR_BLUE -obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow - color="#FFCC00" +/obj/machinery/atmospherics/pipe/manifold4w/hidden/yellow + color = PIPE_COLOR_YELLOW -obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan - color=COLOR_CYAN +/obj/machinery/atmospherics/pipe/manifold4w/hidden/cyan + color = PIPE_COLOR_CYAN -obj/machinery/atmospherics/pipe/manifold4w/hidden/green - color=COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold4w/hidden/green + color = PIPE_COLOR_GREEN +/obj/machinery/atmospherics/pipe/manifold4w/hidden/purple + color = PIPE_COLOR_PURPLE -obj/machinery/atmospherics/pipe/cap +/obj/machinery/atmospherics/pipe/cap name = "pipe endcap" desc = "An endcap for pipes" icon = 'icons/obj/pipes.dmi' @@ -783,7 +783,7 @@ obj/machinery/atmospherics/pipe/cap var/obj/machinery/atmospherics/node -obj/machinery/atmospherics/pipe/cap/New() +/obj/machinery/atmospherics/pipe/cap/New() ..() switch(dir) if(SOUTH) @@ -795,26 +795,26 @@ obj/machinery/atmospherics/pipe/cap/New() if(EAST) initialize_directions = WEST -obj/machinery/atmospherics/pipe/cap/hide(var/i) +/obj/machinery/atmospherics/pipe/cap/hide(var/i) if(level == 1 && istype(loc, /turf/simulated)) invisibility = i ? 101 : 0 update_icon() -obj/machinery/atmospherics/pipe/cap/pipeline_expansion() +/obj/machinery/atmospherics/pipe/cap/pipeline_expansion() return list(node) -obj/machinery/atmospherics/pipe/cap/process() +/obj/machinery/atmospherics/pipe/cap/process() if(!parent) ..() else . = PROCESS_KILL -obj/machinery/atmospherics/pipe/cap/Del() +/obj/machinery/atmospherics/pipe/cap/Del() if(node) node.disconnect(src) ..() -obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/reference) if(reference == node) if(istype(node, /obj/machinery/atmospherics/pipe)) del(parent) @@ -824,13 +824,13 @@ obj/machinery/atmospherics/pipe/cap/disconnect(obj/machinery/atmospherics/refere ..() -obj/machinery/atmospherics/pipe/cap/update_icon() +/obj/machinery/atmospherics/pipe/cap/update_icon() overlays = new() icon_state = "cap[invisibility ? "-f" : ""]" return -obj/machinery/atmospherics/pipe/cap/initialize() +/obj/machinery/atmospherics/pipe/cap/initialize() for(var/obj/machinery/atmospherics/target in get_step(src, dir)) if(target.initialize_directions & get_dir(target,src)) node = target @@ -838,151 +838,65 @@ obj/machinery/atmospherics/pipe/cap/initialize() var/turf/T = src.loc // hide if turf is not intact hide(T.intact) - //update_icon() update_icon() -obj/machinery/atmospherics/pipe/cap/visible +/obj/machinery/atmospherics/pipe/cap/visible level = 2 icon_state = "cap" -obj/machinery/atmospherics/pipe/cap/hidden +/obj/machinery/atmospherics/pipe/cap/hidden level = 1 icon_state = "cap-f" -obj/machinery/atmospherics/pipe/tank - icon = 'icons/obj/atmospherics/pipe_tank.dmi' - icon_state = "intact" +/obj/machinery/atmospherics/pipe/tank + icon = 'icons/atmos/tank.dmi' + icon_state = "air_map" name = "Pressure Tank" desc = "A large vessel containing pressurized gas." - volume = 2000 //in liters, 1 meters by 1 meters by 2 meters + volume = 10000 //in liters, 1 meters by 1 meters by 2 meters ~tweaked it a little to simulate a pressure tank without needing to recode them yet + level = 1 dir = SOUTH initialize_directions = SOUTH density = 1 var/obj/machinery/atmospherics/node1 -obj/machinery/atmospherics/pipe/tank/New() +/obj/machinery/atmospherics/pipe/tank/New() + icon_state = "air" initialize_directions = dir ..() -obj/machinery/atmospherics/pipe/tank/process() +/obj/machinery/atmospherics/pipe/tank/process() if(!parent) ..() else . = PROCESS_KILL -/* if(!node1) - parent.mingle_with_turf(loc, 200) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -obj/machinery/atmospherics/pipe/tank/carbon_dioxide - name = "Pressure Tank (Carbon Dioxide)" - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -obj/machinery/atmospherics/pipe/tank/phoron - icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi' - name = "Pressure Tank (Phoron)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.phoron = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -obj/machinery/atmospherics/pipe/tank/oxygen_agent_b - icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi' - name = "Pressure Tank (Oxygen + Phoron)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T0C - - var/datum/gas/oxygen_agent_b/trace_gas = new - trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - air_temporary.trace_gases += trace_gas - - ..() - -obj/machinery/atmospherics/pipe/tank/oxygen - icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi' - name = "Pressure Tank (Oxygen)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -obj/machinery/atmospherics/pipe/tank/nitrogen - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "Pressure Tank (Nitrogen)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -obj/machinery/atmospherics/pipe/tank/air - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "Pressure Tank (Air)" - - New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -obj/machinery/atmospherics/pipe/tank/Del() +/obj/machinery/atmospherics/pipe/tank/Del() if(node1) node1.disconnect(src) ..() -obj/machinery/atmospherics/pipe/tank/pipeline_expansion() +/obj/machinery/atmospherics/pipe/tank/pipeline_expansion() return list(node1) -obj/machinery/atmospherics/pipe/tank/update_icon() - if(node1) - icon_state = "intact" +/obj/machinery/atmospherics/pipe/tank/update_underlays() + if(..()) + underlays.Cut() + var/turf/T = get_turf(src) + if(!istype(T)) + return + add_underlay(T, node1, dir) - dir = get_dir(src, node1) - - else - icon_state = "exposed" - -obj/machinery/atmospherics/pipe/tank/initialize() +/obj/machinery/atmospherics/pipe/tank/hide() + update_underlays() +/obj/machinery/atmospherics/pipe/tank/initialize() var/connect_direction = dir for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) @@ -990,20 +904,23 @@ obj/machinery/atmospherics/pipe/tank/initialize() node1 = target break - update_icon() + update_underlays() -obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) del(parent) node1 = null - update_icon() + update_underlays() return null -obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) +/obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/W as obj, var/mob/user as mob) + if(istype(W, /obj/item/device/pipe_painter)) + return + + if(istype(W, /obj/item/device/analyzer) && in_range(user, src)) for (var/mob/O in viewers(user, null)) O << "\red [user] has used the analyzer on \icon[icon]" @@ -1030,7 +947,95 @@ obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/weapon/W as obj, var/ else user << "\blue Tank is empty!" -obj/machinery/atmospherics/pipe/vent +/obj/machinery/atmospherics/pipe/tank/air + name = "Pressure Tank (Air)" + icon_state = "air_map" + +/obj/machinery/atmospherics/pipe/tank/air/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + icon_state = "air" + +/obj/machinery/atmospherics/pipe/tank/oxygen + name = "Pressure Tank (Oxygen)" + icon_state = "o2_map" + +/obj/machinery/atmospherics/pipe/tank/oxygen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + icon_state = "o2" + +/obj/machinery/atmospherics/pipe/tank/nitrogen + name = "Pressure Tank (Nitrogen)" + icon_state = "n2_map" + +/obj/machinery/atmospherics/pipe/tank/nitrogen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + icon_state = "n2" + +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide + name = "Pressure Tank (Carbon Dioxide)" + icon_state = "co2_map" + +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + icon_state = "co2" + +/obj/machinery/atmospherics/pipe/tank/phoron + name = "Pressure Tank (Phoron)" + icon_state = "phoron_map" + +/obj/machinery/atmospherics/pipe/tank/phoron/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + + air_temporary.phoron = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + ..() + icon_state = "phoron" + +/obj/machinery/atmospherics/pipe/tank/nitrous_oxide + name = "Pressure Tank (Nitrous Oxide)" + icon_state = "n2o_map" + +/obj/machinery/atmospherics/pipe/tank/nitrous_oxide/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T0C + + var/datum/gas/sleeping_agent/trace_gas = new + trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + + air_temporary.trace_gases += trace_gas + + ..() + icon_state = "n2o" + +/obj/machinery/atmospherics/pipe/vent icon = 'icons/obj/atmospherics/pipe_vent.dmi' icon_state = "intact" @@ -1048,15 +1053,15 @@ obj/machinery/atmospherics/pipe/vent var/obj/machinery/atmospherics/node1 -obj/machinery/atmospherics/pipe/vent/New() +/obj/machinery/atmospherics/pipe/vent/New() initialize_directions = dir ..() -obj/machinery/atmospherics/pipe/vent/high_volume +/obj/machinery/atmospherics/pipe/vent/high_volume name = "Larger vent" volume = 1000 -obj/machinery/atmospherics/pipe/vent/process() +/obj/machinery/atmospherics/pipe/vent/process() if(!parent) if(build_killswitch <= 0) . = PROCESS_KILL @@ -1066,24 +1071,17 @@ obj/machinery/atmospherics/pipe/vent/process() return else parent.mingle_with_turf(loc, volume) -/* - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -obj/machinery/atmospherics/pipe/vent/Del() + +/obj/machinery/atmospherics/pipe/vent/Del() if(node1) node1.disconnect(src) ..() -obj/machinery/atmospherics/pipe/vent/pipeline_expansion() +/obj/machinery/atmospherics/pipe/vent/pipeline_expansion() return list(node1) -obj/machinery/atmospherics/pipe/vent/update_icon() +/obj/machinery/atmospherics/pipe/vent/update_icon() if(node1) icon_state = "intact" @@ -1092,7 +1090,7 @@ obj/machinery/atmospherics/pipe/vent/update_icon() else icon_state = "exposed" -obj/machinery/atmospherics/pipe/vent/initialize() +/obj/machinery/atmospherics/pipe/vent/initialize() var/connect_direction = dir for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) @@ -1102,7 +1100,7 @@ obj/machinery/atmospherics/pipe/vent/initialize() update_icon() -obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) del(parent) @@ -1112,7 +1110,7 @@ obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/refer return null -obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. +/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. if(node1) icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" dir = get_dir(src, node1) diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 864e893dc9f..e8ec749a31a 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -52,7 +52,7 @@ Buildable meters if (make_from) src.dir = make_from.dir src.pipename = make_from.name - color = make_from.color + color = make_from.pipe_color var/is_bent if (make_from.initialize_directions in list(NORTH|SOUTH, WEST|EAST)) is_bent = 0 @@ -324,12 +324,12 @@ Buildable meters return 1 // no conflicts found - var/pipefailtext = "\red There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + var/pipefailtext = "\red There's nothing to connect this pipe section to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" switch(pipe_type) if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) - P.color = color + P.pipe_color = color P.dir = src.dir P.initialize_directions = pipe_dir var/turf/T = P.loc @@ -382,7 +382,7 @@ Buildable meters if(PIPE_MANIFOLD) //manifold var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc ) - M.color = color + M.pipe_color = color M.dir = dir M.initialize_directions = pipe_dir //M.New() @@ -390,7 +390,7 @@ Buildable meters M.level = T.intact ? 2 : 1 M.initialize() if (!M) - usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + usr << "There's nothing to connect this manifold to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" return 1 M.build_network() if (M.node1) @@ -405,7 +405,7 @@ Buildable meters if(PIPE_MANIFOLD4W) //4-way manifold var/obj/machinery/atmospherics/pipe/manifold4w/M = new( src.loc ) - M.color = color + M.pipe_color = color M.dir = dir M.initialize_directions = pipe_dir //M.New() @@ -413,7 +413,7 @@ Buildable meters M.level = T.intact ? 2 : 1 M.initialize() if (!M) - usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + usr << "There's nothing to connect this manifold to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" return 1 M.build_network() if (M.node1) @@ -438,7 +438,7 @@ Buildable meters //P.level = T.intact ? 2 : 1 P.initialize() if (!P) - usr << "There's nothing to connect this pipe to!" //(with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" + usr << pipefailtext //"There's nothing to connect this pipe to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" return 1 P.build_network() if (P.node1) @@ -709,7 +709,7 @@ Buildable meters C.node.initialize() C.node.build_network() ///// Z-Level stuff - if(PIPE_UP) //volume pump + if(PIPE_UP) var/obj/machinery/atmospherics/pipe/zpipe/up/P = new(src.loc) P.dir = dir P.initialize_directions = pipe_dir @@ -725,7 +725,7 @@ Buildable meters if (P.node2) P.node2.initialize() P.node2.build_network() - if(PIPE_DOWN) //volume pump + if(PIPE_DOWN) var/obj/machinery/atmospherics/pipe/zpipe/down/P = new(src.loc) P.dir = dir P.initialize_directions = pipe_dir diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 3a062adca48..74374297cc0 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -3,8 +3,15 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "labeler1" item_state = "flight" - var/list/modes = list("grey","red","blue","cyan","green","yellow","purple") - var/mode = "grey" + var/list/modes + var/mode + +/obj/item/device/pipe_painter/New() + ..() + modes = new() + for(var/C in pipe_colors) + modes += "[C]" + mode = pick(modes) /obj/item/device/pipe_painter/afterattack(atom/A, mob/user as mob) if(!istype(A,/obj/machinery/atmospherics/pipe) || istype(A,/obj/machinery/atmospherics/pipe/tank) || istype(A,/obj/machinery/atmospherics/pipe/vent) || istype(A,/obj/machinery/atmospherics/pipe/simple/heat_exchanging) || istype(A,/obj/machinery/atmospherics/pipe/simple/insulated) || !in_range(user, A)) @@ -16,12 +23,10 @@ user << "\red You must remove the plating first." return - P.pipe_color = mode - user.visible_message("[user] paints \the [P] [mode].","You paint \the [P] [mode].") - P.update_icon() + P.change_color(pipe_colors[mode]) /obj/item/device/pipe_painter/attack_self(mob/user as mob) - mode = input("Which colour do you want to use?","Pipe painter") in modes + mode = input("Which colour do you want to use?", "Pipe painter", mode) in modes /obj/item/device/pipe_painter/examine() ..() diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 441dee233ad..c1cf3aa8f0b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -48,11 +48,13 @@ REAGENT SCANNER if(O.invisibility == 101) O.invisibility = 0 + O.alpha = 128 spawn(10) if(O) var/turf/U = O.loc if(U.intact) O.invisibility = 101 + O.alpha = 255 var/mob/living/M = locate() in T if(M && M.invisibility == 2) diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index dec999f0fce..932e40e8c5a 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -53,6 +53,7 @@ icon_state = "engine" thermal_conductivity = 0.025 heat_capacity = 325000 + intact = 0 /turf/simulated/floor/engine/attackby(obj/item/weapon/C as obj, mob/user as mob) if(!C) @@ -154,7 +155,7 @@ name = "skipjack floor" oxygen = 0 nitrogen = MOLES_N2STANDARD + MOLES_O2STANDARD - + /turf/simulated/floor/beach name = "Beach" icon = 'icons/misc/beach.dmi' diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index dd5fee98f6c..f4e163394cb 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -1,11 +1,16 @@ /client/proc/atmosscan() set category = "Mapping" - set name = "Check Plumbing" + set name = "Check Piping" + set background = 1 if(!src.holder) src << "Only administrators may use this command." return feedback_add_details("admin_verb","CP") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + if(alert("WARNING: This command should not be run on a live server. Do you want to continue?", "Check Piping", "No", "Yes") == "No") + return + usr << "Checking for disconnected pipes..." //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in world) if (plumbing.nodealert) @@ -21,6 +26,19 @@ if (!pipe.node1 || !pipe.node2) usr << "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])" + usr << "Checking for overlapping pipes..." + next_turf: + for(var/turf/T in world) + for(var/dir in cardinal) + var/check = 0 + for(var/obj/machinery/atmospherics/pipe in T) + if(dir & pipe.initialize_directions) + check++ + if(check > 1) + usr << "Overlapping pipe ([pipe.name]) located at [T.x],[T.y],[T.z] ([get_area(T)])" + continue next_turf + usr << "Done" + /client/proc/powerdebug() set category = "Mapping" set name = "Check Power" diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 38e1ff3bfbb..0280599d5e7 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -736,10 +736,10 @@ // this will be revealed if a T-scanner is used // if visible, use regular icon_state proc/updateicon() - if(invisibility) +/* if(invisibility) //we hide things with alpha now, no need for transparent icons icon_state = "[base_icon_state]f" else - icon_state = base_icon_state + icon_state = base_icon_state*/ return diff --git a/icons/atmos/connector.dmi b/icons/atmos/connector.dmi new file mode 100644 index 0000000000000000000000000000000000000000..cf4ea7a3c84ee95aff76e501af86f1261828582e GIT binary patch literal 653 zcmV;80&@L{P)P)t-sz`(#0 z6BC1jgC-^>V`F1pUS2aZGebi|xVX3+92{9$S+cUSiHV6HA0M@~wY0RfhK7b38XC8^ zx4F5w85tQJ9UWp~VjCM9z`(%9WsV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+(=$pS zoZ^zil2jm5DLFqcFEzO&zetITGbOXA7^IPlGp#5wHx&jsud z08#ZR;u2G_=>Px$Z%IT!RA_CwMiD2+ew>>|a$wkiC z;O;`34MC(Lvq>G#ZL*noQBI%ExcmNb0DI(Vg6V2yScp6CHv=C0GZUE0wP7Ldynh*)%0K39~AJ$tEx%x zW<_LW&MMHSEjEeIi#}z4a9|C#El~{I_Y6mkeu4(uSe=;03I;CGy(hSP zCWs}_*)sk-$Sa6E(FzcR)MR(f4G~0j4MBp1zQ)`4tQJ@&x4zDAt-u^^@9yz6$FB&4 z5PdGjZ+$;5N`OG`wd}T1O5NxVAz<7vE&3x%FDSEvQf=FwM%18u`-imx_$mUu2k1BX n9z-reXH%QR^??2#ApV*&yDum{zh~AM00000NkvXXu0mjfvKt(3 literal 0 HcmV?d00001 diff --git a/icons/atmos/digital_tvalve.dmi b/icons/atmos/digital_tvalve.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b34d2903b5cffcd485944d8f02723f4755690583 GIT binary patch literal 2486 zcmZWp3p`Z$9v^i{VzpOp8y79NOR1!}*W-$#O;U(r48@F9OhPlrqvml!Y2A|avYVJ5 zYGW`(n(@dOi5{3D2BR74nH^)iW`;A)IXi0aZlBLRpU?T7^FROp`ThRC@8h54zkiQ` zo{1g?gE83a<#7;$(F$L>b(d?tRPX{AnuoW)PvGu`h6W1@i?0m~%*@OH0Pq!IL>SC< z5hf!eBN&f2G&D?LR$RV(S+o_?shNt!h}ak`24iAkLLd;hTyAD&W<*2;hr`k2!QQ}X zrZ8G35AF}ZxR3TkX$IWWfx#y|A`_1!L{m;ilTTnUskZ`xC<#fbxd6(vVtAAHmQC%g zf`CW3ZSSxHgPR3D8((1(E@pF`um`c7*nR774PI%w61YB~xM;Ke&zrm4vo2saR6hKs zDEk7o%*Ni)xXHl-Px31I&+@b7&SI`|@?DPkg)dOj zf$0GZMi;l&V`pIMEm=XTlT|QVfh!@I3ePP4F2lH&;6R|-=^kUd*iJ1SaS2I7r?VKx zn9PeTbo6FKj1 zfHMnXfk_<`mr4dc_4j*dY7qgZZp8Ng>OmvV>`}Ho%6A5Mu(&>LYPz|=9-G7Lm1 z#K`9@rd&ULbK$mwm2tc#5#XYteOVu~dlnHj&u&nLM6yusOo@M$!c=A4>L%u5qbB3Y zXlyEdDZm-(ZR7F}3mMjMW!?*`A(c6+4%@T$RNi zy7+zqY6K=^Ojx$?Wy#eRn$`0(b%}p>NVFVx|JU-85t*s31-XA6R>iFa9iB4A!l<(gio0W8FpEEh$`i7IZ$Qd>E(h#BOgz=OuP)A6ezR6H;Qb42nQZ+4akY`& zVW{RF_Qz0W3a4IP1gahfqX#}(57jCYjqBpTf>z>M{M07;8SokCh^~ChSf+tn43*^A zReKJXYZa(*4z#*7b<;q+=keo3QO*Ac_nAH$w5*F6)5Ufj3!uY0pdL>>pwJDgrKGe?{NdMsu zuW@K6U`pT(n`H(pkbZ^+635Xwv#;{&RsY-8^p)ITw-dX0d!uLVGzGl`H3$VxiPtUz zyc+=hKj7261l<*!Iwi%U-8e;AMK`&i3tE7&0ux)fnXX-#<2ZToCu+Y&xuLv7l|V-* z_asfZZKMz<+-P2-z#6>21J50(g|(p&l&sk#*k7$CWk^#Hq_+nuKyePIKZBHQzOu_a zt2j4YmisXEYA5v1VpTB0k$y>K!{T&dq8^)#51Szy-sz1IYS4kIsw+wrHJc@6&Zc=wy_+>0my7Q+~tPc+9!FjY7P&78@J{}Cy$z> z*uJPwlN!ww&g62?$Yb9cqaDam^#J)- z3;6s~cB4jVOCA>+(~K^}{o}z~EB>OFuR&y&m-n5SkxE@MT8bmO>6a{)MkxI{OLL5# zS&$rZ6!CXeL#?BC(rtHX<2`YgcQjnLO+{ApI7J53rjJ{Gw49;jvh{_R+0YxEB)yb;|FtHE2k!R6%V`)WQR+&o(4TqYn6xb zySFwT;lf%QqvQT0WIr-|AX88vQucgds*h;r?Jo*4y5t@-=Qwmwv>FljzHzwx9)XA;J%!NIYYiq1r z?XPvoSW731(DBk->5=$_(w+K|Z8ChfBfxTcaWQ=){y{8nAU+xg_jS%}C%RsG5=7w- zb(BEeV=n?9y)`8AwG-2MwdpY_UsoyGR&bNGg_D-YrRP5*`^M2-drU#{=l3pOFX9k} c+lhP>vjIyW>^V03Zplo0cklNo|1LcJH_wzR4gdfE literal 0 HcmV?d00001 diff --git a/icons/atmos/digital_valve.dmi b/icons/atmos/digital_valve.dmi new file mode 100644 index 0000000000000000000000000000000000000000..b1adc8b65192d4a843b8eb5d9232ab9cf8c224b6 GIT binary patch literal 3435 zcmb_fc~lek8l4mhh+u4?K&3QVv@U>1sh}bRc@*?jA_$0p3QuHFR1_gVVlq5vrFAJ* z>dF$7B8W;rM3j&ODhetZm0$=Vi5m?`NCJ{YGEVX)80u2(Iq$UjXD0J~^E-3zcklhp z{1}Q0wziyR2>^igisgZ;0RV-Zq5ums(Yw4Q<{hZs5Y<-*3OLJt~Q5 z3JnSQxzrn<7nswv-1YQi-j$w)ef#>&&e#{l^14^2q_G7VUmU`p-a-(^>AOWLh0BIx!y?)@WICM*LxsU(Q#b zt)pWAz$$M=;IfG95*dG4N@UdM9V7Z%w}>ZF4&x(DzHnk6*!;8Wo-=k|4E`2kx6I)q zd;X^AlU=8}PTh+BWJ$zeQ0FQ9$pzErTju$6hXkJttHLK7$?Gl+O<=dQ^hak1DmE7X zURFXR&lc(7)_5^{H%5fhj|y%t)IT^M+jOqhGx<)$Y+Om*la4|jpOz)Ne!vkg>uX#i zbGKd2*WgGx33)|O0J*!j_gE%vy-)UVc?b^IC+E`=n6>91!5LN@-+jehz#*lHcd5B~ znzV5%jgci8jnaHuSBVOZJlx2Wt)(XNRP=BPvpFuW9973)Y)@jYjKB6_sOIIxLvC~v zhflfp(}Z7T3Vl>#XQ5dZOWJB`&UK5eX7Ai0F|POV(f}g8tTDz-s)0P>SeL}aDnBrj zX&XBYxY-mx(d9AiS+SY-hM=IJnKoz_y%|ZM4 z-Mjl^+-_fulIVuIR;mQ-U-&s%wxIX~VPIqSprH{{qBq~yC&g3@ zkaDPKy@1gq^zw8hf4TV?XzBq~;Yu%DEkL8wT(@O}izyV6x&UT^TJi9hvW@dX)x8BK z3$-u<85eO_zoJ&oxu$YQ5L@RGHFEB~ir~1hOrf|tDangj7Y~x3960FiBF6aOyVMF{ znhej2Ie#QFGEpj(KG@!LzGfb;KA`|1ov0q-p4Jvjak@Y!YNjynXtm8qm$S3;C1jp3 z8GH^)aa9S(?>>2GROrc!_o}4nG9dvKybCNMCmc7F_I|*4NwH zI~=#?-o3Ec*jVBKMXVxFU);J7rhj~GAO2x0DmFUW!?OWdv=rAtpbJuEJw1`g=>Zho(;7fXz0J|d$q9E8Puqr&Q6o88d>%oz zr1U3x_Q=L?xUzCqY)lM6Mr7xwMZ?-hhea$(Y!mOW+I`*SI&MW@1VzfE*Mc(Cj!o(5 z&pG*njP5E~=hI*LEjuel_F-tCO41XeA8qjT?7^t0>#p1%Tpyn(+%JvmQ;8M>TBVaF z6%BYcjEY!MvsaZ}Y)EGH!H`CFzw%rB*t3C6g^6d3&be`fJbig&ie}ZX2)msC!%x$%9vEytq|7 zdtS9}QPOFzL?AUa^}&|Lnb@Q2Cps@F zKl0DCUo-JH&#bkx^9L1y{)pm+3wiD8&6|6DL0$jnzJyI^jNiq9fq`DCi*&-a%48Jq z%YS**xd~Q4tA`oz(7^=Qu^$C2x()!JB>=!r9stmhr~aV41Rl1i@YAm)2~egEL&?n1 z2pVQXk7oN09maJF72NMfL=ARl^;11^tbo<{+G-qzd1xQ`c`tl= zKoEt5obX~Vsm!E&m2fA8GRb1m^@`TNK%N_N?AS2}_j(opcs&|<(%~ZE+%+`=>a4$B znCk%i#f?CRv0Pu?6F(;zyY#ne7IqCK3qYAcTt!O-A5E1Iy_f3I*ErY!3LQ|2edHXi zMd)L4hF0mTNd-+iNmv^4u>FuBt&8nwNa!pO!9x*-;=E^(t#Ij{QP zEvz;9C*Kg3JXs&pg4w_}=t?;My}CLGA*h*~uZ&aS?S{t=ei?t~O=MUt{^3~RHR#bb z16*)1)u<6aHk!4zx3_19yPNtG zkaOhqCF%rW25|q0^ScA)J=9E&vEGxezUsUmAwZR5J~h6M0>_S!vm=GHwlU#Y3=vLH z{taHhxkds&U4qOQKGwMh)J5RTiGqBxu@DTJm%l|8(4kP{Ct(_!J}S>L?hz8+QIXOt6?P z0<^n9HlXgu=h}VaIc%M4t!dCtpD4&fMpX8i@E^E^x+(tjHwBd{G@13BV{ s@Xp3K6~T)hOEkLdAG6LowqXcE>uk5ns&@Sy`Fa9Ye1i+D4T#VCA3ebHTL1t6 literal 0 HcmV?d00001 diff --git a/icons/atmos/filter.dmi b/icons/atmos/filter.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8b5cd81c70776c602c94baf2249677e7b564aa4a GIT binary patch literal 17954 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 N002ovPDHLkV1i_fwNL;6 literal 0 HcmV?d00001 diff --git a/icons/atmos/manifold.dmi b/icons/atmos/manifold.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f6b24341c9a04ce1762668022902385e95dace35 GIT binary patch literal 1097 zcmV-P1h)H$P)C0001lP)t-sz`(#9 z92{9$S+cUSiHV6HA0M@~wS$9$w6wH_hK3p%8n?H%xw*L+85v$)UbwipR8&;Dy1Kl) zyf`>Getv$&#>T0ssXsqIK|w)`jEox_8>XhFnVFfZtE+&3fWE%IzrVlB%gdLSm(9)1 zy}i9+VqzT~9U&nhIXO8zJUpbNq`<(y`1uOj00001bW%=J06^y0W&i*Hi+WU8bVOxy zV{&P5bZKvH004NLQ&wGQ37AE4cc(fP)4A4vSHohLiKh0008qNkl{EGVl(zc)5ivaPdPiX6J)+bxiM~mVx*TK= z{eOS}CYB38wuk-`olUs_WP9j8*9G+vAbaRP*CiQ%Y!Cfcj@tob5B*oVroIEn9{R6l zw_E_g9{Nvacid$N?4f_Ng$MxIL;s&XfB8Bm0zmfAe~2A0znGhaEAAKFI?nuL9qL=Ow)8~Q`^_=V=C%x4FVYWS6Non#iTBtp3TbC<+r*v zYx8nVN^)#V$J9@s0_@w)w^jWyj1?Yh;?X4>g3uCKRcE9tf^ALTpYz+N>? zlW+2>O5V)7sXCf&&6Dm$o+nAt^z?--?E>f^fKz+n=n>fKoW07_cf0-}UB|2r3BCiB z%fM&M>5w=5EIMFyNaCL4UprEVbWb#3i#gpRfEt{D(;>N&pX*s2vU!!akkui%lOHNs z9n$@tiw;;FveEL5gw-Kz_RD79kw_#G`40$PAvx3sWP8DbXMI2jU|$~)^j&>GwD+hF z2m$Q#e@geL4+sJ5>jUR?yQ>d~x<`FL2w-0yIIr*P1G0|m1Hu7_;Ms8`5{X12!3kbq z_y7Trbv`}-ZoYtqoiF$U0dVsLH0*o<9{@RDzz0Ci7tpZt1vJ5*`|0@rMCi32_DV_0CY8;|D*YVBkR@S1nV;a09}pe|EKc-gZ}@K zwdt)x@3O9T-+@8?-k%SU`v2Ygy>;Ln=sWG&-|}nE4_wYqI?f~i2acDX z0bHK{1IH`R04~q}fn(2y9U}h+j)lD4=QyAIANme`ABg`y5Q#)0kpTPzrD;e#P{e4b P00000NkvXXu0mjf2esKwuf*9|JZf@Rb4U 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

6XS=6$Dn@OePhLn#fN8jjxD{adoD{mJF<2E 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 literal 0 HcmV?d00001 diff --git a/icons/atmos/pipes.dmi b/icons/atmos/pipes.dmi new file mode 100644 index 0000000000000000000000000000000000000000..019be28ffd8a7a70de8e4cffc0ecfd4c89a1c55b GIT binary patch literal 1433 zcmZ8heKeGL6dr0Cl1MfmgV#qN*r`!=H@j!nYtSNAY9^Z{M9Ai28Wnb0uW3j!HIntQ zjUp9N!x<(+!w_wyjzLcLh$Re_#>lrB@B7>7>|eWo-22@7-1FS${&lkh{Jr$oo3F>= zaQZ&po`*D8`Z;vgXtHEeA*6xC06+S^*49=F3yYwjAfZs0ot+IqkVqura5(k#^%pK& zFgG`EXlQ6`Y&0`73k?kwi^X(0y{V~5B9SyVHwy#;B9X}Da?{h(TUuJAQfXmfVMIhk zadEMwrKOFH4V6j_4i3)B%F4*d@b>oBcqwIfiZs?*rw{qlaBdTSMQfUKztWGK_KZr3 zWX3X1$0jD=a4CFRAcJ{kX`aUTv@q`IyVJ4jrHod4*r~^PWRxWHb9jzpaxaTroDVs_ za^7#vAIHNoj~JplZv~hrbgAh z-MGU2QTU%=liFadeb-Jkb&lr*}Zn#xFXW2f4f*iW|k^a}Iz^5;hS zV(nZr><#=&x~OcXl|`hSr6X_KUA6gUq`kqFpurdT^Awloqg2`O^F{L-|K4Z6bMFCu^>zWALWKglx9>cy6$)NnK!- zcsuKQ&c0t>ZOoa)R*4SEZww9WOlBX(PsPXk%|;JA_;gxYxfy9k4&-f-b5@ewU7b(v zFwtRdaRIM8iKTpe*YH3HrT>@^~OUF%9i)wxp7Z}s?LZxVXu zP6Dl5Rr6|z&WgTq5%LW0sP;e{?{Rah)gJWHCb$FNiFJRBVZ~B9Z7SW~ndCG_F?C3W zD^DJ?wdEGtdRtLj1@yMMXg;SN$sil`l6$dDFadIqdaJ$Y)>9^Ad27GE-k`29aqkfM zu|%ot7`sho&@A^-HY`_mp;E%;rf$3P5$OG))-I#`0M0+(nU?A+q z4!!|BX}Ot;ya9~2$RX7ueTzsvbi52Le+bG^Ydr-dLLmhq=me-#fD`aD=A3GmQFd;3 zn$uS$kmQs0bt2hN44sK!lVD-%lu*X)^g6KgBS;Ye*#LTMLnn)sj&f+|*a9Y%q2;UR z2<;gB8V*%}7s5!qy;2e04W6pJ%7Ah?yi^hvE(N>=-stOVJ=1W;i6zLrUTt7AfMyvg zFprC8fz54Jy8{xwbFxhry9)cx+|Bmh>du_go+TKY_CraPHSiA=whIeSXO7o2W2TEs zu{Cg@5_nWD0h>NGF#Lcb7Y$K_)TRdCZJ5bCWF-MLk%k+{QsDWmNg+A~B#^9 literal 0 HcmV?d00001 diff --git a/icons/atmos/pump.dmi b/icons/atmos/pump.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6350782a2f19321014781667ae10ee020b6a2e77 GIT binary patch literal 1561 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 literal 0 HcmV?d00001 diff --git a/icons/atmos/valve.dmi b/icons/atmos/valve.dmi new file mode 100644 index 0000000000000000000000000000000000000000..04351917b65418a7b61e6e7ee5d68419bceb288c GIT binary patch literal 1544 zcmYk6do+}39LJwAq?@KqH-m;Y>7r=a#^o3zBy_ROlsX$DB3d=A)P&bN6U!b;8cNiP zJvCF=iiiv`@09Mz8@63#nMt^ZcI6_xt;t^W=ta4Yry| zo(TZ33fUC69RPxH2xQZV#@JJ_DaM%2hHqvDNhA_$YikCBQBY7285wD3XSaLz?%LYg z+}vCWg;HN%pOuwWS67#llS3wx8yXrK8yjtGY@(u~L?RKB$!uzBYHn_JUAqmErWdQoS?s(&*AdR^zB{1$tY;xk^ltlI+0FIY2b{P6Z)V z%)i*fYjxUHziPEe*T~D72M*qi^vg)K6#!tK6B6jpJYF_b_5-7zJ~wFpnZSWWvtPVj zWU&h>-sAWYpYUgguAgtq&aZ5j`R;(;2y~bCyh!3Whc4&{ezfMsQ-9k04^Xkdd8i9e z(#2NqQw+{BO^v*V7bWGI!Nw)BAV3j38|zjbl-PI@kW;>_xJKML9~#6~g$4I17AtGy z*OH)NKZ0!hJaD~GT{N1FqjN{nlD$UD!N?md!a*t@=fZ*rU0PVk38F>~VlQ{G9-dj~ znS{`y55%jF4o&h!8ONH0vTZn$3nhrBjThqc+^Bi4?zL6dtEkyM4NV4^6L6O^^y|>E zJJN#+pV&9qxB0HqN-+qIWo=}6ZJC3R?kx6_kLkBY3a8K>(z;sg*Z7n{?@q~OV56iw1;^6%mU9OSJ-L!&|mvf(exW9 zp%tCjN3RymGzVk1LzO-_{*ZUdm)rXzf#Pp$w{%**WQI0l5Iexv>xUmdDz85K5dSKG zriS#^YN~yq5s2?U0c>F65cd&zK{r-}6t>}QqAV75{%P)p>6Q7&o7=4rO*tVm@J66v zOY@X$pW_@@vs}$8|9G_hMSd;pp>U!Ox3N%cQ zs8lOUtHbnZ8e(65O|=r!S1oy2eV&EGlAiwOK3r+XC0()VQy#ZC#=@n?@4{9xMP%cfTkgeC=vsYTx~w%KS4%S z`b_enqtpR`s<<5DVa?K?<=jlDqGb4KX!GZ z05x#{vQ`rVRkk%0hjYj?gWjaK5VPtg@t?Er!Mp^q7K)nM+@dWmt(yY&*}vCG+~a2aD?v!m*1)O_(V71OQN{&& literal 0 HcmV?d00001 diff --git a/icons/atmos/vent_pump.dmi b/icons/atmos/vent_pump.dmi new file mode 100644 index 0000000000000000000000000000000000000000..8846103633c08ac8a9fa0432e769c5e920506d26 GIT binary patch literal 36930 zcmdSBc_376A3uD?UY1cpmQWO>LiQ{}S(0oiq(b(6N%mz1g(yT($dbywg(!Q-7P3>a z%f9c-%=ukM_kBP2{p`>0ecwOcKN>TdGtQiIUEk~T{Vdl*O?743{jB>T2%=TFq;M62 zP)W!?DhlwMIkAEp;76tBHNATZX3i#etsL)JIoLyxd;FV-^8EpVhaOChpQQU3ef4J0 z*&88O+1D6(B5WAG>RriLo0qybg${XtHYNGm2&H(-=o$ip2CNvw$q&+zA5g;Z_`^n;c65n zLbwO@93HnXSwRpNq@o~y%{_ju-0%v!?#Bf}?Ydei$+cjok0w{#OseJ~TB?2_QwMfq zHnw`9M~@HRP|0fNi;6pw_#yZh`GJ$WrrswyxNh!F` z?c2AxsQkHt6JuRGEpXuJB{e?i0GT}fM>$k5c=?rlzZ`gV|Ewl-47~5&2z+C{=JV&z z*joOji5Np!hFQ0Z(-x+tM)vmVDr__qr_Y`xn(nk8wBhLSm)+JN*6-Y2!ECSBSOw9@ zJ%0Qcc3&*t9PL&%F&V=cOQN1ksYa6J_GZTUic~V%arA^BheW~S*t9lX9}*HA>@ix& zkFC7wc3AgjWrze}NS4UiKIzU#=#bg{ik-etYc;r2EppI@Zd4MMUc*SPdrd3`c-gcM z_8)NCNkPj#QkBxI{P=EvOzt`a`AUd}6AZgX1uFG=sIS1StNU~bRnpKy3?*#6b7_0` zlGnv+lZipZ&S4mx`V*D4Ca$MHPrJB6iC-huI}_J?!WE=!Arc&Rd&*>Dab@Lhi$!t= zJR8OE1b z9Lk-uvA4gV+Pvbo-ygTOc8?w78(&({IbB=6o6@Hr5$?6Ad`D=~$lLf}o#KPT?5sNP zOARxXCf}SDVVC@J9bTL6%+vpJ*yVAx!L9pJZpubQ&zFs6j_zMsb;Nc(uzR0he&#pG;krV?{ZuXD_55nB@v{hk82G&fL!LT}IPXObIITDdhx7lRb+=<@$+tVimYYk3`m_ zc7%k4P`I`hW+>;q?*n9r-1Bi}kxg_^q@C()ldZ=&(?faoKh6igO7nK03}XA*-IJ?n zU=SATBU<9L%5=H;a{Gphlr_5RRq>+OsZ;!4J<_Sc#lZVw9({g%nPXSrwwy~mc^=$B zt_MDQi{PsmI+1Lx%b0U-lkeNcK`C&hs|}1NUFr0WhV@`M#0??K#W`d!YV8gU_E*=z z8?9l_365=w{PnUNCOZX08dfb)0Z7{hx>=UY#d6fI!;pj!JXH|2$q&n-8P za&tjyWaCb&*R^k5ql#;xu*qS3ck}bsmV{~XBVD)a)yDZ%u{Mg8DTe8&<-nI~A3l&n zavE;o=9P2NqBliZSXi`XS!eDyEqnI?TyQiA$=v(7kwC;d0(4D?43~Qs|q0u_qC*s>0Y_0chhL$52MLV=1;d zV}nV*60~|lNHlc~QxDsN{y7oekwuej)d`*=|O|2WKNgTu37#l@4M-4Z$ zxrK%3(AXORm4mTyaa^SnjNd=*d`#L^-JA>HQ4z9HjeIR)7T94tT}7BFTa^=lZ!pLe z5?2>UgX>^0sxF+r$7gP*68Tg%Ne@5SPbmk=V*6IxDZ`QA611iB#)-brP|c#u%M2*h zxw?kt=793ru-V=meo@Fk9MeN7A|XPP*cQ~Pdb`PDjx0~iNS;38#fx_B(;I zJB80ebLqn#o2c4RY?%+V_r~BlY=RF2<}v4E_z4|JND2B9M`G32r6aed4Se^h-iEqT zxWL>ihN|+OJ4ZxE2Yw?hy1Z*+M0?4#`7jI1$lDLBW@cuG9qCTp46S?BpL;^j%U;62 zh^-*?(nd z^kZ-A#GYR{@ih8b;2hZ%Q`F(a=l9ztFFFj_nHdiA9o8YuP{CDr-f#TSBc|t^4bk7t zJkce6J@Y`;4++hHi3g7Z8yhZZZ>;W(FziZVF?@iMYjT+0etjc(e%95@Fi%~M3FT3} zBln(Zyv9~6r7-J|vorN`kF_JF#aYt!??(JOJ3FDRO_U^MJUy9wKbY|TTuGBE-z_Rr zIA?pZYu0Ugk5c)cSX{31y+}`XMFZ1eDV!a)dgL+(nS50pHM3TM1EyD&s~m4pBbl#bd?t|ZJSk*E%5zy6uB!2MHs30 zVH!(`yU)EizxMchAEu$`n#*i|RF2LlIMP{7mOm51srzNh4NpFKv3M7n|2L9+5_k`vLjRgmO~JzVX(BCBNX^How;ZSwQ%nJR!wtFrvDrelp2?8l-&W4d>KZr#6>N5_k63lwku;{^ddg;G$?{a{`EjiEMPjNL<^h~Z!R3!& zyF;^Ut&luD*^}7c;G7=`J$RW+eFz7@9o6k5NCAx6DH3wz?H8E;EfW0w(9E;-^w#G- zRy9tN@TO{~Y?|I*9=~&Digy$r1vjQ3a4z3>Gj$1L3XO^$aYKOLT6~yHk8~CzK_LOV z0#ElM)jYKy&ZF)iWKMHWEQ0bEcst_KOS<>ZwF|xP&TPgO>W>9!uS#?b<`t4mFpzXs zhB`Y57Wtm0Hm>uc8*QKTA#&e{IHg5|9j!U4niRkKZ?~MtMavvZn7ap5Iz|>lhBxU^6~pTk z7q?qFPFI$#EM42dxRCG(C~tSI++Chob11<4d__C82s@;zpEiW67vvvTciPm!L+1c~ zyQ#w4zYc~K2~OCe^3&+(F}!c(yW9^S_MJJ?OnHimq@%Ob3BR>`2`gqCug<&hgR>6I zoPkoz{!mHEF@`91jh8Qdv z#Ru?B5`u{WC-dFf>}{I{X;PfHO^a!Ad#U@+q|_QbdiU-eD6}QM^XH{G(6~4CS{!*p zLWgOVw!H=8T0qS|cIFJNY$7_6r+RX=+Pokc;21G82c7e^8(1ys+7C*eE@q67k*_ZY zz-Iv$YXo0hnVK(sOv@%_WVsdg%1(sUY3%120BkK+S_8Ct4-*%r>OpNcOZ*7M+t>wg zQPC?tu|b*EM?4}5FOK@*dwUTGC+8u#U8zJsv*B7fq!F}Dd3)$qVB6%)11Jn(&Y4Dn z5(R-`9l#d?;Wk?7=KAuvKc>)L@Uoz6YHrpl$fXdsAG~07-vM&Dk@D40THS?u1_<(pd zBQxVC^8(}q=AwmUW$F6QjCJ3>o~L&@@27tI;*{<&E{8sq#JHOfw03XPa--S)M#1%{ zCr=I(B~%;f+4ZmQ+aah z&(|;Q6U+HA;%Hf@7i-6$BJZ2<7Ls76djmmo;G*1%U#$A{>B5DzMzHGQ!&|Wlggl#W zICvKq61xAW%0Yl_hr!8B+|9Nmots{$o|`)j5q+RYo@6jX-rY3F&(6%H{)n`Ckvw%- zXH+6r_}DIoz9HSrTx|{5P03*-Ps*uKKMCo6^m@wrbz}bfhv`T-eI6r40ajWcxyC8@ z$p!`PqA*XMDJEYJ{uQTa0FrjCqobqJa;5HrAE5sj z12|pxeeOa=$Lk^A*_IN{i{%En9TZtTbX~^N#Y3Lj+ZcmM9LonuFNV1~#k6nN-=w3S z^@To(iJ|m*c%(P?wyrgB9xyWkz%1rdZXhzPJ; zxeDgx`*#A4hsZ*4qFQE0&vkKML3)Q+8**I4P0{3^C-om2&42b|JuP4>az#lg_Fba5 zfL%eg>AB>>ED=*)qhqAdug)IhfV4zC6d#MYIL!-K-k8049(NOgs+Rm_;f7joIMk%QbzteyfpqNgH|Uv)`K!!F;e%>dF{PD|w=rY1;*QQBIE z*I;rfp*PXh?`_BTEm{eZe8-VWp-6{F!3XTYFE+tH?h5yQxt@VDO{U(e#?^-J-o-q< z>xEK%>}g!CXa4#zvsk)STE8WLGuOuU$J0hL{|Q}9DZC>F+|wI!xNHUY*M@*bIp;iE zzUNzeofGa!sW5aKwuW^(Gjg&zzI3&Q7R_N5P{E9l%onuS8#g0UbW9j!%hL@hS4+Uc)Gmx}2M#CrH6y4*%6kh42x=|qXSl9jk=RoN< zjHTxy8F($>adeFDu@j^;@!o=tcRwl2DpPNBvW;U`W~1QD$)kH%NqjfkQlnPCJzP=h zD&f*w6OGq^B~v6S!!ih?)(Cg6(!0uk)KDiFMA6+^;~RKoTFvw{gaUy@uj(@4+_&LR zE5i%L72a^>iY3VqEty}BW^-P-C;($6L@Q_f^&Sn?eUQ_Wo(RWJ{%Ux$Dj-(X)e2&w z4(y}&Ce3F-@}4(bzT#oD6ZP?Y&W@i4G>V}-kR7};va1#=+7tdF+*%gXb6C1XXC*Yo zKf%3rXU6RQn4*ubZu~C2mBA#3`(;An`TTLp zRrBeKYO&elECLALio8Sz!-Qw>@YM|zfdH>}yG7&CV{XIijm-h6?XVk44=M{~pAdH0 z8KMX(nda?)gGuNiiI?gC1%-fFQR0R@#N_Mwhi-uN=cC zK8cDV1yveQ5YRk#9%!*cna>(KIUR5>d zGDqseIVW>|F_{Oq+k_z0!&QtebiSmRsp_h7Oxt8YzwKwh?SNVifKUX_KCsq^#nB@C z(@C#_j-xuaZ!p#$y|~J@y1EJw51`lrL8k|rSlhll)WsUNLv|_c!EE9VM|myMnH*o2 zqlOD*@c`vv-PXo#*~GomxDA2o41j&`tA--z-D>53#%AF^y~@@a;qjHk-hAEyxGV?7 zwT*XZXr%~`Otge+=xWUEvP5^Shc|b%^mX=E4uyjz9$=cZv@9F|JfgkeSLhU{l!I@& z?H=TR@(r*eY>kCq=E!ipZiRpyv&>d6X?80I2s%_zNbA7veFR)EWD(u@croI~xk2Aq zHT+NUN_l5z1_O*{D7c%@)-7-7=|)$M!`ZQLES_6mUwssz#C~<|pj;!blmUZ*FlOME zwrsjj^QOSkt*BBcss+noW|*x(5PF;oEKS4Xt(@{VHr&eHOOf|~{yfoO?@{+Yr{e4sai;0irN~3gP9%CW<0j$n zk_+|DJ61-zsrx{i%D4IV%iZ>Qc@;wVLD8i7@5RpTWYKZR7ydg8w(vI$);I;0CkUW6 zjS~nlR6mNHcWxWeJPdO$kgj-^TUtq`+a93{GMAE-%~2s$wZn}VJk_TKq<@S0$V~!}4q-_z&(&Qk81>(5(u8 z0Kg=AzXhTuheO1MD~a=`z+@%^*nx|MFxgJ0PE36df2lWJ1@wUCX`-7q?4t*#*!!D2 zefI25m1LUj8KzM4%2=cM4N4wMPd z_hiqR*j0UT+~e{d#*$5?X23My!t=u0yPQs(5nuqz(?89gi#|$4;+atBvmv#U56I(N zm99tpxuD@)4xsNmPw;)+Zmxf1QtGKRl|K&DvsdOrzJM=jtv)(1Gk@`W?|f5*(Mwzw zMJ=@}{wDRx9kDnt<3j*R`$c+(?%ho#pC3mdO@oNIUpNi9*1y=v#&N*>0J1U{tQ+^) zC=ZK4`6q%K8&$vnoSwEaH8(dlH6;U-)AN@v6+JzXc2Gg%W~SS`VImmom# zXMNBCeA=g)bjsMpI%+8*kST5?a0Q<$e$9{ztP_`LS25C8_FJLlp$K&9#Sezci zwTzv_tX{Zt7+b$N#656?Z}f!3dKXja<{UYWG2C-z1UvH~z`g3Ns|0@46VkM1v29jL zSW2Ma&Z8|^y&AJ}8GyC`2!d)UVzNkTBNr7FH6YUcIs@=i za)6TA#+qC2=bhTocn;qo{knthNKQbDMzf@kJy5e|R_Awot7FixAk=llle>ZVMm(9} zv8Y?g5mRxKt&Xbc-~WhX@**JqmB96vHzQMbQh{v{Kybpf$wV8p)(K zUILs-Gwiqt3u|j1fL;5bL$>GVs~R}Y9zpxFjVMPd49DnE=jGK#qeTiz7}NI`}97p6le+ ztPjxBEYfMnG=Ya9B3aAF)rf3nYCseP$2ePUfN<#xnL1G~42{QCN4f?fXCW(qy!PZ{i3lQ5TGUXu)- z1fS71hRvQC#tLs`_dNMRXV^bQ&5|410&s+j+jthnu*5 z&12~ow0jX4X-|_tEUr#Y)8VD51AugYKJYj!mXefXmO%-5mC@egkXbNg#LPFSBeYkV4+xeFW6a=-) zX_3fx`X~D%jVrH8(&zzw)a1Hp(>+zz^&pTt=)(*mG@sjEyDV1-He*l)oiSW$@G?fUD0Ydtgx9sy4bI{a3iH@cKdZtPw5Hb&; z_sB5?n?x_V<+Jp+Zr>p1av=biro;poqIJxRT8{uN3 zS`l)K3uc(dHbAC=hjr$neyn8N)Des)Rqs>1oFdbcBuKgtHc<08uJ}R^4zjeClUA>Y z9es5HEYbjp0ayvxr=z82Wgj#5Glh}^U3BLN;WBNo_}oBi%NYpr{OBdJOIohE$AWQe z=RVjYL9SJF?F|J}X#XBx1tA=k=zoFDl0>;EY)EtZi!nz%AlwV(A*+tFG1OJ>c&h^+ zWDMO1J_OLfUbl@W7#8hQkK}oSPTM1|ly3U~^{DLFkrK|~?-btHuA)~^S9kA8^5M&F z;a5q&RrpAW-*%+|T07_zz=G#UCoyvOgH9o8^WLVBtEh9`{`VUn zCLJ$D8uzH1!yYad3S^T^*AQOpYCN&v?H7QCn8&fk1Vfio8~}nnl60_=-1m#p0!S8t z(}0sx1CR{Td9*K_+?77AKzt+-o@Nvg7ay4~9#nW(u6Ggw>+RQpf&0A~hKf#F$v?f8 zKZPL@`d=^^7g&zL=tacEls6MR#GT?ycfoZ{g78E~pUowY5 zT^#G7NGdaV@`z|y(Zf&-&y_PFsPaC1G!ds)nk>;3ZlW<5VAS4aoDV@OD=SawB%lUF z8l+^Q>!COut^p`vx}19gl~Z-ra-^;DEqsULT0UnpL;$k_7oeGoD6OAu^j5J(0D|<~ zxld}&qD@Urg2U|B-hW|;*7=<@i)utx%v%XKy=`7tyA!CtiHG5f6iG(&fjze}&6|~E z^4jUad}#6={5Lp_nw^}RisYQIuvQf0vrZM|oNdQnMm3PJPgJAZIs(>jKxod%MQq=l zzAReJJs}V%E?~$46>v`?Bst&eCPz;OECK+`{myH>M@ju7uhqBgaHb)s-&P3_(m#JP zA>1pdGvF3Max5I@Wn^e^Shl=h(D2MEB1O9Wk|MRGQCl>MW(X!(0dk2<#I^OrXV?{t z5Yju?vX@jFRRJhPuXuo)n;SfW!u5*J_|6>^cm#Fe72l}?F_T^p@NpQOdjYiXWEOI5 zLpLfwLR~5Gw4EvshPmZi4Bqj*7euE`Cl%vp+_|_f?b?X zn6@i7@RZTKqO_u`@3&riXDPyU$-dt1OGcN$q6z1Ut$qYtnb4<)nl%FT^nx#4jk1pk zwye%OQ%Iq@pIyHbbJ1uTO$1?YSTV~NQl8j%^BLuKtrTgc=dlHCjN75rgJ+?ez9@u!ZfA2>|qJX zJFnJLjspRa+y_je@byxJHVf*cW5KbqvBArOUW;{^;d>UfyClcjV|ex%bl;`H6#b*c ztmf>c&BpX0erzW5trf;+fwzuoZJ!Mi_2}AZKYNMMRw&hSJFVz?R1SaykCjRk(??q_ zrmb?S#Ku(QT3S7;ck~rEwQ!bkecSf623zDS__%1H@*|#dCvM7wvH^BqsFcHR4!buQ z^3-#*M-Cti7yh<^0UacPN@A~i$ZJLR8e{JeKAy@wsyEg?QQ4wgl=$EheDc%rJKQ6+ z)d5Ycv(ZMeKp`w!am-pyd&lGWVa7X1H8W=AaS#I~`Yb{0!fs2)mBbjaq)Hh1^exV7 zt0&jtu?^R=)NAR4@N1xWX2By1l~ARZW8N;d9nw; zp2~n&3vA?Nfe!hgEQ4p9wc!N~qEqdYuE$xka|afpfM?H@IR!U%)Vic%W$b{;ku? zC_VRn{mk6_%Oes!?uUNU9JNSy)(YA{r%DE8-7Ka9g>`5wUv~FJ`pI}89k*1lB3KjX zB$m4$kANkt{kt0*0098Rl7p}6TgeG<tmbaN8BNx*ufqr;O5Pu!yo5)dicD5P>*jUiIUN7qFMHimTu>n4QwHwQX16m&j zNbmz>x)F(~Cn36^izgunn40zjb|Nn?kG^GD@yqa6L15aW%ti_6u{pL>5cV~aLV$=+ zk8=HR3&JfgJ3&7i09`e^{t95InOVAI z@B{E-TVTXIo6juG5J4nH;RSQRlVld6G7&y)2f(yz#PA83L4B_6#Bam`DBhO1D&hLp zFyS@0`4k7|v9&&OD_dlNfs4bJH&;~kW=N7a$N{5S@&h^y2z20?)bvWyvBJ`3A%Zkm z{s%-*a_lqpK>&VfYU}6##x3bxk>2T8g0+9qWFWU*sZgexP3>_`DzR;pw#0qpwQc*pFKFjC8F=>Wz00PZg;`OS%A5ZuYcI^-5s@b8JVwTMG zKm>CZ?LAPOzL*OGhoq2rF@nbBU7MT6POx!EAczR|f&iyaCa?Ma-OWHQswt0-jsC@{ z`j0NNj-Uyn@=t2?lFl0f6{oW^T;$u8%rWnvNJ@En$K_9oU31^tiqKrw2^MPfCP;PG^hwD z;^kUW&M^|>){*1lul6t_7pz1wcfMDukMEEw|?wmDrmHH~9M|}WwrnZQ?Z)%6> z#R=Co4B2NW19zUSbuLtTzBM;^{SL;tUTxD9)(q8XqT1#>0xZq0B(Gl5y=2aUrtbLW zovb6}_9_w4AUNtjbl+BYfNziwgVsE+Sw64O^&p{71%SF%*(&!~JenC#8p9nNQ#C>3 zD(Ce$e@!_9zNt#gpswh3?h8i=gyz7#&uNZF2d7XDufZ&)&sm?*FLISB;t+_Z;5&eJY);^%|M)3 zfc;z5-m0|Tv(g7E_=SPJG{Et(a}N zbBdu>pVt(!wzb9Ado7k1&&2GJRkzo%2y!~mOn&&`?g~9kLb5wbYuW?4&BbbiK@DYrJc5 z1R=GYipakLkwL!9eOnzKEI#txf%6zYKee#1u={eI8lZft`<|<+z`fWr z#^&Y}H*VZ;pLm81QH`5+`2L=@yu3K#$pf@7sNUf2Z@Un$xT>EyeDsj3csqpuDnEUL!+&_;QbZ=H#>W)qLz}JVofRy@| zOaX(h%iCZb1(_cAd)p4HTJsi1J76)1T05sS^pHbGR({2W0wH&xcpes5WMZz4EhV3T z)St%i?*_bSzHYUCbuj;&%zX6|ZrV&@c)R7T{6+jWraqhYGbCg#We|A$WZbIdn@Dg?>KS|B zq4!0y$=7Cq$({q>tjq~eZ*#BpG`!xp@9Z~d>9YX#4c<1=-dfj4l%)mkHDK`qE}9Z&H!>jPqTh17;=-VTZq;Z0J!C}6?FkSCiYN^x zU+vBnw2?se10`XF7KsmjF^N?x+Q=<>yy*7XDG;6SSh> zI4pPOyi_Td3d`jk{5IVoMkeb7{n2hpoP!Lgwv6Fbc#i{zP4>#T-~)Z+mgAoX7&aO?jxP z;X!?tW{`+Wyps;Yj$wV}DIHw7ibeJvgt?iM- zG4S=TTv0ckYizMMHxIOdcKX|BprirQ$Dbd&mkFXFaHa+#EI<=F(Tq~HAbMA?f_u(;e2KCvV4 zqd)+`>-o3fvQ|`5BAh=61Fr)l^+_2AxX)isxmUAs&EVqj9~=HFLwNvlG`9{>Ww`Y} z8~U7bwSMzCe_Gt+*FTL0kpss!rONH^WBQzOifA_umPT$?iO!}x_|Z`C?%h+~B;dzh z^4_HfoUhiMqkqeNJku8sj}yonsIB#Hd(0*-I=wn674huZ1B=cM(9>^*(smn z%b$Ex$2~BgA#nL#mG0(-^!Sk$l{k&PJ?O2M;EqAP#0({q9R&zO+PKM=4BXt(U@!kHC6Lab?HaBVFaBnx66CEs=! zkvaaVf|&c>m(i`?qLN{DeF#LX270mZ8|pm#imuRYL|vzbKnNpcg|^lg4qqE&c4D~Y zq;(Xy$Ur9mXs5BUF=TA~xK18gM*>cZ5axTFWaVFmJos&L{aF2OMl%DZetUcfLL0dnEo z!1g&XZ}NqhIRw6NgGEIk_R8g!V2c8Vya6)tr9={Qb8|s}1J`G1r=}O=b#$UX!(dh) z*MOF`mQA4L?KWRAMZmPY)gCG;_Z`l*72H+h8O1<*4hn65D@bbj`-4751E)qn4 zPcLcb<+DrsHVi^*M!s6+i+n#p;>utmz7sh~aJM~o5@oa;#0f#AuGddiPuKA#t{x_f zcw_y|M1$>gx$|W6VO9=`ye{RM4)9F}NDkPvuH?yOtr-4T{Iv3PW3FJyb8_ib7%%|4E6dfWmy!UC&lq)4dU$wCMBazOx$g3t`&7qRx8 zc`M(;`-*5#1_1FV%Ud%RS2x!i>~Bnm1CK;eOy9Gzx><}=Lb;b4Xhe^$7-`wl%sEH9 zaXf>d63mRg6KPszuD1Ozujdlt^|T~uR>QR$z-7BQ;}1lTzzO}1?Rm=5yxvxTz9ayf zl*7uNi=qF{_R00%**+;>|H<|l?UvvpS4~n?3{ZQ550ezS%bEnrm4{|d$Ze1vQh~;Q zP>!#AE@LZqD*5>MssLw-jP>ul;ky@WYA$2Cz;S_rL0Z@Jf#a8Hs^c5R;}a7n86nrQGJD@FG~c(`Jp)89w(PfH zPsqd$kn9g-!(|k5b)N9#Af@SF2y!Yu(BwaQq~Po=^monP`s96Xy-L*IHGB0~Lhn`W zuNi7aH*UnLF9UQk;kEqAp5*C|b2ClZCCf%0huCexjE=1NfjATznpHgTmRbB{%cHip zZ}-oub7nD~~NtTGlUlM5?5t9Dnfr4h3jb z%|N3{4k?{8gv-8;?N~4_SrR6-wyy&(I_L%eWR(CEeDyISwQDzmX?_v#fWAO+jq9kT zc{J&OuOXjA(M-)o3)G*tbCcvYmz$fKE`Us$)eb5;uF62<#Z!``g@Tdvw)dn~9$P(Q zS`_kmytsvhN^1)Fr5V`hBk10lI52_jB?qcH(n@;1pGAsL#kxCKwolz;I@ISjwwx%_ zo*u57?K1XRt?SuMp@{cu9-#D$Vg%68@UNhf*+0+If}!?sm)V{XfEPeV5w+=V zR0(tgP(!T>U+C0t(;Y|qa}9&IXIg)8VzY^0oF7-0prshqaDU-FAeA+7K?Y=Wq!y^E z)%lBNN+j!onj814OqfWDDx9kxrc!Gf6Y++1E{ zFaJwh?&La0#DA19MC~~yjm$SNcUo>+?)kw$qQ2^ zz;Gxj3rOiPbjKf_Rn%&yjNbLtgK5~v8-}+z==0|M7K1nssksa>BNH=Yl>#&S31)2Uq~+V~g2LXbo~ z<6D)-tG@-KG-U7^{}_y780<7k+r@$PF3)F|&P+cRsks&w%wVW~{<BGDz}rHrOy|5v`fAoNaTcDd7UoMlf1n7dt_KmVq#?Fc@x>ztmD5{)N?T>QIXc+& zv83PF(THE`fBkmEJdrj&J&qDA_8=sESv%hIm^!etgHaFhS#4m;C{TIKLft5?=k-G* zf~+wPtyxwPloo9XT7&ib#JDBmXiL-b=!Fa5^w+}Yc+N&WX>IXX&aMwgBz(bT(YEnx z7|itNkyf!PC>zSf9?HvOPh= zH`h0?r>$9FIP2Z{If}#ccd5#ZP;%jM*t`jvPqzc4ZHRt5nDuq^>9*5HthWQ!IZum9 zo?ru%%I{u)S0pq%8$|euuCDG^wELNc^&kxXsFm*PF73o#f5&`~momf>it@N_N$;eq zpW5O)2cdQZ_Pw0Be;)QzHKIKGBwK0mczz?+pX);Y|A#cgZ+ingxZX=TDs)7ge)s9H zjXdT_XEJZiy}7;k7vinR8d4*Ne-l}3I{ZR89^8D&*XMt?ed!Nxayi%4vYnZ+a98=a z?nN(%Nbdf=LB!>kI$kxZhAkTNSZRb~;g~eMO(Z4It{oG6X^GgE!$F7#xHKOj-ek7~ z4SIC?LZvF9|`n zkWHRfxIgtj_>gr)97Nx;{03(ZGzJT7<-bknZb8FWpH22>n`w4pZAz1MYFp0#-@?T7!K{7i= zHLK&;ke$RYy;z=2I4@;b&&vSNmmum6IwsJhrEJKZ0daUFKLqS9Ek)p0U;}|P1uGXX z)2zG=rMK&2;h0k%NG=Cy;+|zAfND?18I;&M50cxOK-5P3g}_Hb=!x5Eaqta5{HVT3 zOrSoamiARttq36&WGsG+v%TZ)LEz7o{1uG>%NITJ3OJXMP83`KtBQKy5rez!>hi&O zDcD#yT}uROzAtw__+sRVP+kuqylme>qsipJ011?oTB=-N=-M1>cZ{lwYT#X&1Z8|4 z$Yr$KF3!n$cu4-$`vMdo5XS$O_}>^{fI$@<0YBNj)WN%>EW$em{On*T0muR&Cv#N;+H&yrqNf;0Iuxm2!x`37t;YA-;HMxf^- zl4bHJHz+KOzxEy|O$A3dIeTCGz1i4xw^rDTv1=lE_re{x3uKGTtA5U@ZB1f5$$?GX zeK%WN%UD2XzZ~H65g$y^j4ntRq#^DG6X4DNEFP1a1auj2*MYCNWcDa@ie3Rz1YL1q|*bRym(F zCMsi1SCD18uXlUhV-pm< zMNbBJidQF4f7-^Q1l{m&vs)05FMzYZk!@^u3EOO-p1E?+{DMmn^laJ&9 za2j~5?+0n4MTSC|UGcwX@JRrU1*R_q$KGTxk|wSm4#9&^<#4a=kjnWz?us37^oU+J zW|)bHqN)E3>e2lv0}r5H64`r{o59Rg+04w`o68(HpxuD1%fK!U*`5G6U(5|3o6q?e z(Spo>WZYZU70mfRds_|=>=jU#WbzGogg+&KFnvSVCCstD*RCUlq!wT^ggK6jKa$1$ z=L|g=&bNcDYxtssNT{|WUzWdq`kmU{`qg@3FBQ8{Is;MTfb|pDrVVT4akW!Z*dZ4- zO8;EWL@)$t`K(3p>>Ef(*r?NrQfY(HDonIej^OxBdPvqH57GlU7gtHLXoEH{8wrB-wxGtk>TR#^drsJ z*q5_;Z`|h2`3?7#JSHT*is@O5gdg^zOSyjVruydMk2L#Vs%8=i3Dn%d#K)pPTsSu7 z#?JIv8?o$OFRQ16kllx(24Tf)CGL32hv(rZuRW%bAiLZYqfob10??6JJhyUt&~Nj5 z2)Z$_9G1an4%+5yBQR58(P5S<3xA1T0X)Ns;F-de%~W-0Vgg|EWG3B?$`<1DP_evw z_@<$sDc{;IyoPI?6uXAhU+Ni{{D?2OipUbW9BUhJ@t3jdc%2T7H4iJ&on09Cft!hx zo!*xT@Ls0ta?)p*3WU$db~%3%sTEw&VSK=9Jl&akr|7xR3~NAn36ebPqNEJFL=i-(2p-o0xikY6J?OqS$BhVZ9ATm`#FeX=hm z?Y}kQ^m9%Z*_&u+QFlXBTs--W*@q}HkRK*5@OJGT^$tkFAz)Bul)I=KeqmXRKsn{{uOXxl5?f; z+MN6RcCJN`RUB~Jph^Jl6R7ii{QN+|4guS-fTXBp1+&1fBo5f-;$NG3KZC?S&g@r2 z9lIg*E0AndA6BvoMZkz!fFPTcp+#jt^7`VJm48DwU@sqlZUFZR01q&DG%;0$Yz*re zQT*2_tLUA}?p0yQ0H17)al*mT(NT!E0O7Jhw+hxJq%*w}13Ltg zNZn_=L|o}4?g*TG{4@1p$6&u7aHtO)`49vmZ4a_gsIOhPvxc+sE-s=m(vaMLpqJlJ z)UvtSPyS?rAekRBu>?N@9ujc74ejEn;5Lx%UrA>ehgsJ#8PK?+#2)t=3#isef4sCB z3J{-{Q4lWU_Vp==A-@L?9^9Wo?=iO@&>!IFwAVp^GTU_dB#%-T~w#?$2Hm_)?DF^<7*U5YSXs4)hCJaH0|l4q0idfA-z}*un7y+dKYX{ z6A4my^*KEnO7MqGRKBHkz8(a5czA&5-l;?jJMW{hiJ??Ilw5!KcHOe_S-;|(HHG(o z1``oTI8qYb6;PFNtGvEGE7;@e)O@a=DA!)*{eIjDDC@VNI+$%W;Hds{8hYmsM8KGG zIQbGI$k5Yo=bB}2abAbs{nQt|2~wOuRYJ@~U<-hVJWP2#STmkkE5LZf5!O2SX+Okb44vT@0AFuS>)du@88SUY>(M=pM>;mQ% z$W;Ajz=l4*vQ|leMkkY(13ufov2HdXpXEqZ?791O!=?0{fF3VbCTiLL2n=@d06zbx z(FAz@CHBfSUE=1Dqe}_Rt#lKMLw5oVFFZh9C^W7#%*r%QK9wbEYny5HB?lIfjca)u zCmOpY9VZ*Eq7vuOVY~9&{%WE{oI}t1M%M4Suc$MlGv>4v+sP^D4?RaISR4|kqvJlm zf)`2{E3c`-pRXbRSw{TeynuI4lw9;$m>hI&l}V*aNjdvSx&$599XOL=2g!j`mSBha zFqB4C#Q?H>JkB9fZn8(lD@xQI<$~D=(LW4f+IFmogK5AKonXYPX+$ehuZ#c|VG0ADfuH zaSxeXY*JugAV`6+(@|c%di85(XTZ~^hrsqM^eQSUdEe&&a&s*`0-i%vrhL{sL~QW{ znU1o=!Ao{vBMaSTYzLVrGa(VZj=2TjVBf96Z(^oSNSrIG*+|qSh02?_Zk}7YzbEu${jq0VozbHoKHZ%q*rO0ppyj$1jHN>BkoP5+g_U^d$P20Yb zeb9*?GtEJ8(`1-2YBO;c?FfH>Z3*a8&=ZyU_qG|&T{k+5iTZw(@F%I2qa&LtN6k#n z+xGZgv->_{QMsuyWogpX@H%Q4^?c`XwY*Ak-!av$V>} zJy#=A?k8pi8Zw+XV=?U2dfe)ThI1oa0z9{Q=foJk1d%5n19Wr=oKL%nB?@Pf(g)Ry zIQ|qsS=9Ulb%>6abqT5+0ne@vqk_TzNMuy~ddoFGN-jF^-ZT=l9N3VpMvI&S2i_l) zvR@i<0#B3~-Jwx%T-d4q^Z}m=XHn@gN4CA6hsi`rf1&hQz-(d$7VpB76~0{aIO>ig z#JLI2N69&#ryPW`HJ{7|edJ=a@xijTpAD!<^zr9Sl%WtLkXZ7}mvV7X`+Txp8G31W zKSVL~>(bN#pCNIdl8lh_3I`6{R7`cUcIwpZk@WPVxq;_7@otk|x-7KgZgsB|SKkpS zGr_PzTdOPtaL%XZs$RZ)Xi@E1v;g;!lchGU72Yo^w6_NjO~b37Ve-S-tsYA$gb>jl zUaOuhji_hr+!MMOLPsf&qsqR^ff(QIz{bi;8c= zMc~{z$<1(_ssit~Jq8c@dqbVOY8|y~I%eqmi*S3GdY%O7d``bg%>U`_%fq4U+rO_d zBI_t5r3T4TSwa*sgs3EKNQyS3L=wW7k)kM+N=U{|NU}%P+(<%5NGP%|*~gf<-t(&a zex9ED`5nLKIo{(v-un-Cgs$a#eb3K!o)>$J6N^(AV!*L1CoDry*vPxDXc={C)h8?a zKMJ!4lwf#FcDvYU14sSsiIQp<+Xu0;F87`?pO%j$OYzX)E+@yum>WCu+$qb#dBjc8 ztnci%k7FlSH#aLOZNG7S>EYnuXj~^B>3GOAN%b`Ld<+wJxUfr~(ePv}o>Hi(t{-3j z_|8y)inqv)_G1NIodLz4g$G}?-yKaiK60d_{s`qgy+H}VeMWZ-kj@mKO+QG3NK0p1 z2qiDCw=Y%W)d3&m$u4IgDyMQ8;D zt6>v)ZdJlo)Wu)cDYlH`LcAdP?rwa3=Utd=nR8r&*6PsfRs>Oo&zIC)u3TwyVRAf5 zRKQLfnHcj-2<`R&2^sjHhDMQ%(&|R|>s5*;@4SB=b>w(vTReSu8?bJ$L3IDTO*2PY@)MXERA{M{Sx);6mDEkvZptw`nsZXIKBEgUL>{P^($HZo+g>ye;E zJ&kMp9i8LBg9kM4D?1`HPwE}KykgiSMi&sG<@0WABYlF#u7J~r`v=!WHAF-~{SNV5Q{^N6}+T?o*l$i`}s1 z=OphkNSsV3j~Qr>EufE6%8(g23RzLs>MpJPM(^2<2P*`ql58(iyj{4b%q7*;Mc`k) zXttJvgTp4fWAgheWoVmwtZZz5!7<)kCtc#Ew#G0UqI$yN&}cpks&Q1EY@O`7Uu@AK zuOzZ+Ym=04D5HTnz`BASV-Q^htxVh=eMRgY9TPbbiX5P?rKZ4w%$B_gk5Sy zsBi+|tbvIdBxw&GvAWT8P-OS|&jIxg@%d3_J!qA^NLdM?=EEgl@#U@;vO8d^P~^!R za$atpgtqp2a|LVodSJ038=X&ApvQTqsl8x^{~|{u77iXC-SNQ5C+PgzNvr9Yt3;jc ztZZ-o8w_F;D@>b4AEq>tb=r?bU?+Cs_%nNa`tuHsJ@;+iDwX$oP>U+vkr$eX5wRwt z^R<1xtMMkJn=@8wPlf;8sK@y@0v{hpOHct55)x?1$((X>avlql68G=lx5@962$URk z(}X|Ue>tYbnb2hK?7qOSe^CFx0j$HmdFY00pmU)W>>GZ5elQMAdwKOszQ+vWD|E|K zd@rlv1bR%HQ>|?&#F7~5Btx6n?tFK*-@1v5cF@T#DYF*fTYprY@RYN1lI|F5h!UxC#FxtO)O#WOg1t|_mXF%R_TGpI+l$Vo z&@%g7`pQ|SY3+7oyWw-o=BH~&8ZK$pEZVa)dUqS6kwEg1Tn#LFZjmFKuxw~a{=3ko01`w0-lGcz(?KsbY&)98mguzTd{kJ4>AdPq zU=FWjlidkctb$R^q3-C36GI=|SEy20*<1YDhf!lOM#-YXf+7h;!Wwj&p5x&{xr}m7 zMa^a%nBi)gB&BRDoL|+4NA4hQ$rDG4)sHSJ-gy+yK?USvo}Oi*I>*+C`&6_b44`Gd z+0>l}UE4H=?w4)cxG``(XQCMM1 zFW**PoI%eZ8xieCL$%G6?N|J7tIk<#ufrgza9?;q$l`QycD`xt z0@3&VdtCn_-b7)Kl|LW*Sbn zUI0{hxG#DcoaBPtg|#M6pT#r!ILm4eU;WvFrL2Y2QXU7f1SceY8JW*f%|nL|vW=tO zvm_ftW9!a4uY;_0|3oeZWoN7@es23X5pmc&<7C;Ob>FFMxHV0Wk?*tpN(m0`zHGNu z@b|PfQ`m}MHQPZWsqdo^b<=4WSd2%srMyyr!k5kR4%_V-lVcZb2!tHL#QbnGP{2!`dL92HnS zPZ_)dEb}wkxMbH((6nX}UJ+8nDI2Bs>;hZ}AZu`BB&vnulWQs$MB~|^cB($1Rh$`@%GdlqYn4dofBICuB#6rDbJqAah6r>+dso?-}>z6 zJJ&)qYYa?92l|0U>i0NoO{}=KAtC%%)ms;R!nvqxJF2&V93q6A#|yFJpnxHt=5YW= zFr)%(KP7`Hbn`o#7$DtOmUM8T;d5o%x`!c$!}fgQN~EE>KOWmRRjA97J#T_THMHelG$D z9{Q=>zYFZ7-+{|+42(a0`qY_aS0f}M65sVfHy>soWRcc{rpd)UeE2Z2@q_%ehlSER zaGe|+P3>0&MHF9qH}3O6Y7EQaK~vtb(C>^6JVMji5M6n+>b;tn_Ybi-&n-drqq@*!iQRByegsQA`!|Cva&O*99E*p6w!-Zg*J|3WGYv53eY94< zRK3&IG5m|aAd?UMMp3DWj?1z)fk1t2*yl-R%z;^wH+pOiS8tBuImAD3c*2g^A-^t+ zyKG(;>tq6C@STk4>0yB<{s27O=)s{O-MxFc*K2#o`{zBO zv4zTQ2s8O(KzJGreOUP7Ry*FprB86=rpgA#gwQ?vlOyk%jb6knT~o6#`;^X1>Bwts z@RU)H0nyhDMu!R92r-4%8d2CU@FHvB*1LJ`0 zM}Ak_DjpW+htoTz9?nKhn zL31g><-A04^95D7F~5ut*N1|PH$h`HYu5XtJhuKmE0_$qQXOB&Y;*2 zW@T-al9v839~QO|GP$SPU!GerBFM)^cch@A)VMp!D%ot`B~pYB5`1#3v;J5dpNS5f zcW+xbfZl9+`33}{4;xSYl8nMxl@Th&X0l5jb*m(@*jO*YEj2=5Div zi37)3miY_9h>p9vdK66efx#;Im*!6cpSsjFesil9A2jyJ)>z+$lJ=@=GJ6)=_1%iI zwLZo02W~J7E<0;%=wwZL2h$qcyYPUd-2EpcWi)y6y%?e4MQkV3i|$1~ydC&9KVn$D z1?7VQi9mjVb0el-*rIsqx4X}Y!8jI}NfzONFZ*|SD*fzl@>Bye<_yc-Rk=0fCDQkoi$JPrLAl2!m;zagJKIYYv;nc?laR{d?~On{@A7&c1>QaxQ|v z9s|2Q42Oj}g3B=D$?xQY={;^m04Rb0++aEtoCMCpscpl}r9WV15zM7%Y-(QyZJ5|! zd;B=<>eiLe;rV)fy?G|K@~HEVp0o~6{tFaRAig2do65 z3kU)5k-L7Gtb&5ST;+|;;hANZ@;8@M?}gf!zhpPtJ@67uA4Ym!3$Au6>Rq$85^nI* zg02PnTugjP3C>SXZ;*01ZoR1JsWsG93N7HR{TP|ur}W*E7lBe^;m`;eGyT}K29yws zr;*%cokD*cBEiZ>#HFQZrKKTBGEYg^WrU-s$8;(9|NXE;YAMlKNbLL>`EDyf<9=~p zC1KtX)^Gjo2hG({4)iDhSMa65*?ogYBa1V(Th%xTWDGRKH17n>=deAj0N2e8UQ(kT zrv~4)O})5U*SX!hg zP|@7nn6IDOx_dxK#MG#K*BQ*^w)C~E(p++!@+ZLtpTa;x=Hfk1xmxE zPZ5N6@r3A_;k7+3g>iA+P3E zbzcWUbxbA)P}k>4lI5F7wD0U*lNq?iO14Ukh!U%h3mZ|TyynTH5|5ZFaU?qZeCErS zY_Khy_k`Qp)ZV(RtkY2M!#+L^Ti;u%x$S$zAJG*jcqFfVke03(6017o=Q|g(->?kH z*|1G`wMkoJe5~;AQx3@9?Lvim6Frej(o@u7gYp=o)UVcX3q$L-nY;4pb z9a~yTn4RTQ46s|v`;G%w!=S=X#$G%T@%8d*5<{C=p$>X zrQMw~1lADAQ?Kgey9A`5X2>-T7XK?p;1d@)IXHyQmv#EAtrfo4Je1&A=Hh5AfBzB1 z1e`u`vQFLM@ZN58j1S`p0LBS`ygk`co_F};Ip@CFjdbhlmbe#4rG*jCSC0>lR)F4& z{c2F@0^IghCumbCOQkW+cAvZwD_#+76c!ue2vi2KlU4Wg&`-hn3Hu?73XiFJp>QN2soH~bCP+wc8dkR&5{zPhmMzNy-$sA*O!>|B(nx0QPn zsMvPz)oo@S%;v4BP~0ptR>ACz9A?)%_b1!j*yQAZi0`hLotM>vHYa~sL2g#_9dfn5 zR1)|hH!&sCsSH+(kK&=e{ZwF)M>k5Vc3%@k_FMtJvJ7_4FxZcY$V&Yc{)u(=Dre%< zZgZUZFe*#Ltu|IU+lZ?HN(21B^}<^vT-k$8`<^u2sY7|sc|{brN&M6~ca2`GESEn% zX?aos42pH92Qvk?N6JutBOCX$kwaX|baeoJzm2B>G!_I?ZirME-v~zuLVUe(S)KHY zL=OC{^%uL!LopXSbC0l4CVlrS9SHjcCWGHUYuHPTgIi{M{~rz>>tS>(Dt226q{(sjYrE*w0KDiAK(D z+t)*=a}5-KUI$svGDJU8{J%1ozo_k9rFT%#>QV*3IUozz9vLSa2cj+TnITtTG6hx& zFy0h|h+A<+#2aUtcz5xC{U@)vbN$&*VR&%+0*Jyw-9bWAs8iRtK~dtF4_uA&x<-Qkie10Ye_5nqL(xTt5YkG~? zc!W^F_O{7oAD=(%X*ricH=Hv2!GuMs`>g_#kOi zhBO@YQT#5A*I+AJWTKb7D3A!pl!U?JtyQ{wX75uV3R zWzWSsbefSEuMbohu06b4I{J=a*#km*1W(XoEvk&6cIv7i1k59ZA%%$^0FmLq4Py&@T$0Tt^|Rk~Q3F4A|(P>@wM>1~RQ~-wQzFhWgIRP3bOYC8^B6e#!G7nBAJGW4R?pTPBoSVAypb zU0jB0bDfmdo6p|e&ufMcOwziqEyeikJ!S2KQxjRTTerk)rBGOmeZ)X#IbO=5${5Av zlsM|%S<9Fd~{297pKj?^|h;lZ@yBzSW=!o@V@QYTF7 zT8~YcA1D2cADl$(^3mq!oNrERIExp{m0xghkoIA8cJEF<0srWVU|jhir^-4n)mc4y zhUv7D^-QY*C3m*6zS6sCV3y*>AUf;5f_V;`R_&DBS3m5kvBfGSmPhKGt!->k(eW&P zczP?>IxQX7k3hSLC}DB&?z6Flp_X}F7-d0Z+39zbEE=p;j~@%j)=fS(!f3wbCaQmk z@Ih^$e;MU9qa^dki?-&GlJI79BvnK&JMZ2Z@b^Vs_44#8FK7I+z{}(Mb2r{^;G|nR?q1r0sl<|Rh#(vR=luYzE zErt+CATWJP6y)R%V$MKNB~hh`gPK7cjm^CKvaLDs06Jj)ZicjTh7+Eh`Sgz!*0``np&W;(>VOb zL#O_IEpS;MD=SCH^Y9>ivlKlDoq?PTN*eMYzwG-i6-*xkAsxb6wy$moc9TQkld6<( zz&`PLbLS+$g#|@xv@<`Xu%zmAIoNm>_rmT%RtYXdB^a1sipRxg2VGKMx~TOYZM=m! zY|kitH7g(rF*r670D7i+k(Z5f(zo}MC;HCX^}0C`r(DcwBev=!0XxZPdS`~U5tnhwwgFTXidXr~c zFM0-o`-?vsKB@sEGn}s_{Kg=Wl7s!*T$=yjvv~AM%#*qDQ@R>}DflQ9$zy6|#S1(E z^FF&SnR|ykEZH6J+c|~_kRbduI^=@53t}Ib5QT+>_Juz9xBJiejh%p-l=;9Az6)3}kl^$n=&c9M3Pl zi`_Edi$EL8fB6HwZKbSj{9>O%@;7gO0iGuk6{d)EBy}x(Ted`RpzL-WOWr;=tG@l( zGkzduaMIXkm|}gGbW+F3y7a48`b?dAIHY}PDFw^dhj0Q&ob=d<;d-zy;M&2L;G%jy zl%CkkeNI1UDZ5Yo*2n3AhV$z&pFgMmrtPbT16nJg6!9_bACz{m0yN_SpS;;6Pgx~n zjpQ8I(6TtuDY7!vXFC8jbD`&G!hy|VsGpo4)m`VznKMW+o*OtFP|Vd=v^Wr0vlza6 z)pFy;4fZ?1uP`ZUj&e>nlQT@ZAjX6oa{vBH*ZI%8!0I`C5{EOj!sUYhH`10FVi98+ zTDlT$BV12NZ73-zA;9g_+a8wNs{(!81tFE!Y^V9oyMfk)!>EefTxYskl^K6TnnS}= ztw6s}-i@=-b(?nVXrFj-=r=dy;BxemL(3egV-YJT0HYgXNY$`6gFL-!7aO_bq={62 zOlT;TpuJ#I@$HAWf&xEeU7QPxtM5lH`tG)i-q9^!Mz=2b{AL8@vAx11tfsESBps6h z*__+Afn?&4iAQ&QirV|T=6ke}GM@>B8BZ<8z%#o4LvSSHNczy==&riiwP7995Qs?Z zhg1bf-v%2AWp&EZGk+N^WfLzNo0<-WN<2I}z6taS*yj+PlP8~^CL!J|`aqaZa&GR? zSc4B|*Y1Z?vs`p4p-aP2WjXim@}6yVdf`5?VyD*}@71eU!?f4#p*wvk7R5?Zwp{~^ zQz|Wgegf51Q~+h_^600D7j_NAA-lLl%FLklX#2F`PV(Y|VNSmeRzua|#CyexQ}4zX zNsjQstJ`0yE_USL00%z=CIWVPt}bW_Tf^_IU)@JWRx#^*eW>N{SNp`uvh{J#7)3Rtp9EV!GkQZ=Zkjn(KItG19AEC zWmoQd=GJ6*FPrKbuo1{1JA38#taRKPxi=_*JfFP!dkIoQ9odi(+}(#=`zz1iV~9;I~Z{I z&!o%FGkUk&A&wrjXE@xOc|PAA zA9Lm?hXaG?$i!L(3n-{IAd_-G;lRQ%i$|1w`*x2^P^>9$@{zuwb^dw`s$u zfu#kD^DqZ4st2ew)MzR|1z@E~IFNU#`i?9AunKAF?hbhOZVS9Hw`t<#DE=iMZ(R0> zw8BZx_AF@<(id+7xwwdB$o1a{aO*tgt^P@Xe`nU#!C>UHXWPNLxITo3P0*)pyM+5; z{mn35B{mW0*EE`%hcp4crAzlqq%{%WGjoh%vKu_DPbrbPWTp4!|EGQaa^)1_0gFv+mwtd(FVe1;q zE2M9Fw%6Fc&9l30$kkPdeMs?i`L9%w>*|71lQR4D2nf|sxS(G7jc;%)D>2vUKiH`L z%SP^sR5nJG`px)bckb+I<3 zfc@Z&5ra<2I&IoN$?U(Ibb%8F+~@J7khU0m6ud_mOvCMenuhyz{(I9f?mn9NpK?wo zFK3P757hyT{)we)|9oZ?elc^2Hp)k`PHzk9Zy4gdeHVEOt^5(Qhu8=Pz}D}cclNfo zaC^SiPI(trlx#HV=r=#cK12RT-g_RG@wdFU#4+OPeSfFT5cmE&ZHAE=fZ<|jX7sd- zpQ(d@gRFE0)q@!ljOy;+t)VgeMyqHYkB9^9_|m3q$w34m@bA&rJ;J>XClkZh>7F+V zp3>l~f2gvGu-XOEvpmPy>~4mXYtGhlXFt@g#u?N9^dBF)^o42ot8BQ8`H%SX^!F|G z+`q#|^CDKA%q*|%?n%MQO5@quge2b_2w3s^LrUCQ(8SEm#7Oequ1z{AbrLVGvm@I~ zSgfS%pKR7Pm1q>y-#ow$zwYo)G)nZ?kv(&yj(98D@#L723AJ2@4Sr7dMOn8Chwsi? zIqi-byxOg3na@aF%K2i`v=t&Qe%PGI&#~C-bMPyCXL~p&zia z5{o`a@6lBwi1}9l@R=K>Z$Ns&4txss{L1d%hSDpa@ah2M@mQPzA0*`T+)0y*0z_iS zi6Ryr5z01f5K7=$j*wVKsDFMhyjuW}-|E$?J$}&A(G^Nh=v+V0AjQa|Kf3#;o-d_6 z@=328L6;!IMp!H~)aQY2o3e9Koq3HgrmTLj$28q0D>3M`p|cc)ghJ zQRa?ooC&QC_Z~l94sRKQp{}JD!kyzd;i*GC^U zjIFAw`f<=+<=s?&U2b1)N4!8GIvub>lv*R30N<)pSd-K^~wZ>20D3)ieDe|Nv z?8pAZ2~9d}qVGo2N5VtrX(i$>vi&nd_jCD$ND)+GGv{Or z*-DDxuVWL%O_Hy4H0U2DJ?Q4%MwmAEMf5-Kd?!N2E(+6mnwG~hUNO0Y2E7Ektf99c zthDOEE`#Ta*3QGVb|F7LT5q15w=Qm(-j6DJ_3cxsoh45r`lY{q*)H}2hMyuGcq4)=rEmXblfM&tVbMS&gB){j5$ z)UVsM3L;crN_>{GbNOTrv^J5a5NF7OvFk$rwlRS!A648SdaCQ!oc;G6)Y+)wQnA--h1LWJB zY>o}PXo#O?cD%eb+r4;US?E)LsIOSNb$m7t49CH~<;T~m!O>THa%VlYuw=faWu)Z9 z7So@_Xb$cv8^lJLA*-MtK#uw_vtKu}ZS!-TKmAMBeJ2fEUakV|e6^Sud)atH%#Lm< zge9ARjTUr`?{U|uE@5$uJ>o~c4B+(-CUl>{riD-Q$;!!L{YT&c`h&3wd1pTuLJW~3 zU$7!D7ycjCs{MLUr{gZP1bkQ_OJq*XTdVd!pUKMgAps8eFrT#&a$QF{f0+;9zDGRt z?O>(FDk@T7!`HLM60ghqc^W&wJPo$h~h8u@Q+>!T6Z&1#3V z{lm_5sj)ihH8*;YH%&^fmOSusuZhW=X8PyfJWipC(x^4L%#b`E*w=5ErBwlU#$E@e zD)d`rI}u2hPkM3cgT)0dV&LBOh)rKP+2B=XCIP`HFcNsG_kgw+?;T;Hb!XH0o5-mT8o5+hbMm`AecfbHTLnN+09jZ!W>l(cB1w}PF=5rffH8(n*D*% zJrEyZ!ef8_l5Zn~PDFZ@beIz(BbC3i!8RdJs4T(2jIi7wKcxSqL++_rf|2Q6#xV@qwWoy;zRhA zKeL20UR(ZS_rn78558bkWgB4}4X&+@-3lKlwxF6L$nD#=UER*p?I1TXhQEK|-?acupwHc<-(l4&nH_+)+YOrtL^IZcSxfc*BV}9aWW32o_Ul@nS z&ZjBEbyuICDDq!g@;+Ke61dV%>0Tr?vlz|uv(}E7YxWPiMHhIm69R>?SfG#xVL#)! zCdX19W=q&Jk|)-M);k=2EV3VVENFhD9f#M2e^NAzZ|WIs&jzWxJO}5sbA899s7Z!Y zPgQ}>P*v-eCYT|6$bRTi@!KWJvoT7}tm4VyTcGmb5!OsH35P@vx@c7VK&y$ABZHxC zEclym@B+7ln2@9rE5k3UJB2?}(03wetMs6BLEDrI_VSb?R;vBtRC|u!Jw^yLZg9uQ zQ+SAy<}ZZ|F)nnfrTfm`vCl!y&Xdw8^=)*78-%HlV)pWXjWpD8HbaXm#*9 zo@+u6)-1AmSPchIyD=;05(^ED%NhL|!zQIqe7d^D5tn5Z+{#Z}{->6W`u%4;l76;q zaFzY7WkW0fA1xcPc9{*)_mo@X!7}0R}kig

P{fqhhmvKqN zG^gC3hmQWoj#^N5eCF%LJ?|o zKW;)hyKtt1V?=X#nY$S1yXC>|c`6fl%X?vb&~!VYbJ zp?vcoT4c{}eXf02pX-dtAN1>~>tCw=YzH|E?I4vlwtdV?bzI^PqqQTBD23)t7#F7h zgz$Q^&@ePv{EIUHp-Iai?!V5hbJlh!^%2Qv;r09@MN1i-(>f{5S=nXXuHQ?{&B8wL zKJtCMmlUd2*DkZ%P*Vfv!4O)rUMr5V$8z-Iw1Z(SW!o$;!Dz&CsqVLSDo;NFc3uSjlwI>s_Q9MdQ9WP+|N@{4fpSzkea zs+fJudhDR{Df!y5BKEw}!l302inle_%Jf8SerJZ-?InFYh!LKUW&aCl*{Y%OwmujK z;;O2@ChK6#k#$832DG z@ggt8><7okp9*I`bFt#wM(x#fVh+Qd`_q6BrH9MORiM_B~^+hbs& K|9qFt_5TA2Vq!G_ literal 0 HcmV?d00001 diff --git a/icons/atmos/vent_scrubber.dmi b/icons/atmos/vent_scrubber.dmi new file mode 100644 index 0000000000000000000000000000000000000000..a116f6ab67f07a3068a5815ef5e4cf6e66a75efd GIT binary patch literal 1328 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 S?7r>CcWn(lROw~w2mb>*+Pp>p literal 0 HcmV?d00001 diff --git a/icons/obj/atmospherics/omni_devices.dmi b/icons/obj/atmospherics/omni_devices.dmi index 642e90a0f1d5115a3fa463293c25cea2342bc6ca..398fd5f159e80909b4a9c05ae0a08e21cc0bc229 100644 GIT binary patch literal 13197 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 VEetT206((cQ**cFS9JU$Ei(*Lt|vn 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