diff --git a/README.md b/README.md
index 6f8195ab8ea..6bc7c31730d 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# Paradise
-[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [IRC](http://www.nanotrasen.se/phpBB3/viewtopic.php?f=10&t=1113)
+[Website](http://www.nanotrasen.se/) - [Code](https://github.com/ParadiseSS13/Paradise) - [Discord](https://discordapp.com/invite/gXZMc?utm_source=Discord%20Widget&utm_medium=Connect)
---
diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 9ecf54e59c3..d0a629b0dcc 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -416,7 +416,7 @@
"ahZ" = (/obj/structure/stool/bed/chair/comfy/black,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aia" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aib" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 32; pixel_y = 32},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"aic" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
+"aic" = (/obj/machinery/light{dir = 4},/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 29},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
"aid" = (/turf/simulated/wall/r_wall,/area/security/podbay)
"aie" = (/obj/effect/decal/warning_stripes/northwest,/obj/machinery/alarm{pixel_y = 24},/turf/simulated/floor/engine,/area/security/podbay)
"aif" = (/obj/machinery/ai_status_display,/turf/simulated/wall/r_wall,/area/security/podbay)
@@ -544,9 +544,9 @@
"akx" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/terminal,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor/plating,/area/maintenance/auxsolarport)
"aky" = (/turf/simulated/wall/r_wall,/area/maintenance/fpmaint2{name = "Port Maintenance"})
"akz" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable/yellow,/obj/machinery/door/poddoor/preopen{id_tag = "hosprivacy"; name = "privacy shutters"},/turf/simulated/floor/plating,/area/security/hos)
-"akA" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig)
+"akA" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 1},/area/security/brig)
"akB" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/security/brig)
-"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig)
+"akC" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/gas/sechailer,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 4},/area/security/brig)
"akD" = (/turf/simulated/wall,/area/security/brig)
"akE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig)
"akF" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Security Blast Door"; opacity = 0},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/security/brig)
@@ -844,8 +844,8 @@
"aql" = (/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/engine,/area/space)
"aqm" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aqn" = (/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/chicken,/obj/item/weapon/aiModule/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aqo" = (/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aqp" = (/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aqo" = (/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aqp" = (/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aqq" = (/obj/machinery/light/small{dir = 8},/obj/machinery/conveyor{dir = 2; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aqr" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
"aqs" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Danger: Conveyor Access"; req_access_txt = "12"},/obj/machinery/conveyor{dir = 9; id = "garbage"},/turf/simulated/floor/plating,/area/maintenance/disposal)
@@ -906,7 +906,7 @@
"arv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"arw" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/gravitygenerator)
"arx" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"ary" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"ary" = (/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"arz" = (/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"arA" = (/turf/simulated/floor/plating/airless,/area/space)
"arB" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
@@ -984,7 +984,7 @@
"asV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/maintenance/auxsolarstarboard)
"asW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32; pixel_y = 0},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/auxsolarstarboard)
"asX" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/obj/machinery/cell_charger,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/mechanic_workshop)
-"asY" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel,/area/security/podbay)
+"asY" = (/obj/structure/rack,/obj/item/weapon/tank/jetpack/oxygen,/obj/item/weapon/tank/air,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/machinery/camera{c_tag = "Engineering Secure Storage South"; dir = 4; network = list("SS13")},/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel,/area/security/podbay)
"asZ" = (/turf/simulated/floor/engine,/area/security/podbay)
"ata" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating/airless,/area/space)
"atb" = (/obj/machinery/navbeacon{codes_txt = "delivery"; dir = 1; location = "Disposals"},/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/door/window/northright{dir = 2; name = "delivery door"; pixel_y = 0; req_access_txt = "31"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/disposal)
@@ -1649,9 +1649,9 @@
"aFK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/sign/pods{pixel_x = 30; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 2; icon_state = "neutralcorner"},/area/crew_quarters/sleep)
"aFL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/starboard)
"aFM" = (/obj/effect/decal/cleanable/cobweb,/obj/item/weapon/twohanded/required/kirbyplants{icon_state = "plant-20"; layer = 4.1; pixel_y = 3; tag = "icon-plant-20"},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"aFN" = (/obj/item/clothing/head/helmet/space/rig/engineering,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aFN" = (/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFO" = (/obj/structure/dispenser,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
-"aFP" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
+"aFP" = (/obj/machinery/camera{c_tag = "Engineering - Storage"; dir = 2; network = list("SS13")},/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFQ" = (/obj/item/stack/sheet/plasteel{amount = 10; pixel_x = -2; pixel_y = 2},/obj/structure/table,/obj/item/stack/sheet/rglass{amount = 30; pixel_x = 2; pixel_y = -2},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/engine/engineering)
"aFR" = (/turf/simulated/wall,/area/engine/engineering)
"aFS" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/engine/engineering)
@@ -3200,7 +3200,7 @@
"bjB" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/storage/tech)
"bjC" = (/obj/structure/table,/obj/machinery/cell_charger{pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/storage/tech)
"bjD" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/item/device/radio/intercom{frequency = 1459; name = "Station Intercom (General)"; pixel_x = 0; pixel_y = -28},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
-"bjE" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/shoes/magboots/advance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
+"bjE" = (/obj/machinery/computer/security/telescreen/entertainment{pixel_x = 0; pixel_y = -29},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/head/helmet/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/shoes/magboots/advance,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"bjF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/secure/briefcase,/obj/item/clothing/mask/cigarette/cigar,/obj/machinery/computer/security/telescreen{dir = 1; name = "MiniSat Monitor"; network = list("MiniSat","tcomm"); pixel_x = 0; pixel_y = -30},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"bjG" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/lighter/zippo,/obj/item/clothing/glasses/meson,/obj/machinery/door_control{id = "ceprivacy"; name = "Privacy Shutters Control"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
"bjH" = (/obj/structure/filingcabinet/chestdrawer,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 5},/area/engine/chiefs_office)
@@ -5270,7 +5270,7 @@
"bXr" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/theatre)
"bXs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/starboard)
"bXt" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister,/turf/simulated/floor/plating,/area/maintenance/starboard)
-"bXu" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos)
+"bXu" = (/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/obj/structure/rack,/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/atmos)
"bXv" = (/obj/structure/sign/nosmoking_2,/turf/simulated/wall,/area/atmos)
"bXw" = (/obj/machinery/atmospherics/pipe/manifold/visible{dir = 4; initialize_directions = 11},/obj/machinery/meter,/turf/simulated/floor/plasteel,/area/atmos)
"bXx" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/atmos)
@@ -6731,7 +6731,7 @@
"czw" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{req_access_txt = 1},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay{name = "Medbay Central"})
"czx" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plasteel{dir = 4; icon_state = "whitebluecorner"},/area/medical/medbay{name = "Medbay Central"})
"czy" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/light_switch{pixel_x = -28; pixel_y = 0},/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
-"czz" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
+"czz" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"czA" = (/obj/structure/table/glass,/obj/item/weapon/pen,/obj/item/clothing/accessory/stethoscope,/obj/structure/extinguisher_cabinet{pixel_x = 6; pixel_y = -30},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/medical/cmo)
"czB" = (/turf/simulated/wall/r_wall,/area/medical/genetics)
"czC" = (/turf/simulated/wall,/area/medical/genetics)
@@ -8552,7 +8552,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaloalpakIalqalralsaltajBalualvalwajBakyalLakyakyabqabqaaaaaaaaaabqaaaaaaaaaabqabqalMalBalCalBalDalEalFalGakHalHalIalJagBagBagBalKalNagBagBalOagBagBalPagCagCalQamualRamzamwagCagCatzdePalTalUalVaheajgajgalWalWalXalYafbalZakhamaambamcamcamdameamfamgamhaeNairairairairairaeNamiamjaeNaaaabqaaaabqaaaamkamkamkamkamkamkamkabqabqabqadFabqabqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehamlaeGaeGaeGalnaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktammaktamnamoampamqajBajBamramsajBalxalyalzakyakyabqabqabqabqabqabqabqabqaaaaaaamxakDakDakDakDamyamEamAakHamBamCamDagBamFamIamGamHamKamJanYanFagBamMamNamOamPamQamRamSamTamOamUdeRdePamWamXamYaheamZalWalWanaanLajgafbanbancandaneanfanfangameamjanhamhaeNairairairairairaeNanianjaeNabqabqabqabqabqamkankanlanmannankamkabqaaaanoanpanoansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehantanuaglantanuaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaakIanvanwanxanyanzanAanBanCanDanEakyamtanGamvanIakyabqaaaaaaabqaaaaaaaaaakDakDakDamxaouanKanSanManNanOanPakHanQamCanRagBanTanWanUanVanZanXanYaonaoaaobaocaodaoeaofaogaohaoiaojaokdeUaoHaoLaooaopaheaoqaoraosapiapQajgapRaowakhaoxambaoyamcaozameaoAamgaoBaoCairairairairairaoDaoEaoFaoGapeaoGaaaabqaaaamkaoIaoJankaoJaoKamkabqaaaapgaoMapgasTaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaoOaoPaeGaoQaoRaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqoaqpaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaaaktaoSaktaoTaoUaoVaoWaktaoXaoYaoZapaapbapcapdaphakyabqapfapfalLapfapfaaaakDapSapSamxaqaaqHapjapkaplapmapnapoappapqappaprapsapsaptapuapvapwapxapxapyapzapAapBapCapDapEapFapGapHapIdeYdeXapLapMapNaheapOapPalWarMarOajgaipaowakhajpapTapUapVapWapXapYamgapZaqDairairairairairaqbafbaqcaoGaqdaqeaefaefabqamkaqfaqgaqhaqiaqjamkabqanoapgaqkapgansaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaehaqmaqnaeGaqpaqoaehaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqabqaktaqqaqraqraqraqsaqtaktaquaqvaqwakyaqxaqyaqzaqAakyapfapfaqBaqCanEajgajgakDaqFaqEamxaqGarSaqTaqIaqJaqKaqLakHaqMaqNaqOagBaqPaqQaqRaxfaqYaqUaqVaqWakHaqXdfnaqZapCaraarbarcardarearfargalSalSarhaheaheajgariajgarjajgajgafbarkarlajpajparmarnaroarparparqapZaqDairairairairairaqbarrarsaoGaqeaoGaoGapeaoGamkartaruankarvarwamkabqapgapgaoMapgansaoGaoGaoGafdacJaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFarxaryarzaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarBaaaaaaarAaaaarAaaaaaaabqabqabqaaaaaaaaaaaaaaaabqaaaabqaaaabqaaaaktarCarDarEarFarGarHaktanHaqvapdapfarIapdapdapdarJapfarKarUarTarNajgatAarWarParRaumazcaCTarVaCVarXarYarZagBamKasaamKagBagBamKascamKagBarQaseasfasdashdfnasiapCapCaslasmasnasoarfaspasqasrassastasuastasvaswasxasyaszaszasAasBasCasCasDasEasFasGasGasGasHaqDairairairairairaqbasIasJaoGarsasKasLasMasNamkasjasgasQasOasPamkabqansasUasVasWaoGauodgCbkjavNavNblzaaaaaaaaaaaaaaaaaaaaaaaaaaaaflaeFaeFaeFafgaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarAarAabqabqarAarAarAabqaaaarAarAataarAarAaaaabqapfapfalLapfabqaaaabqabqabqabqabqapfalLaktaktatbatcatdaktaktaktaoXateaoZatfapbatgathapdatiapfaoXaElaEjajgajgatlatmatnatoamxamxamxakDakDatpatqatrasSasRatuatsatvattatwazxatxagBatHanYatJakHatBdfnatCatDatEatFatGauHatIarfauOatKatKamOamOamOamOatLafbaeNatMaeNafbatNatOatPatQatRatSatTatUatVatWatXatYatZatZatZatZatZauaaubayuaoGasJasJasJasJaudamkaueaufaugauhavFamkabqansaujaukaulaoGdgCdgCbnGblAbvublBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index ab6a349678c..a4a3334356a 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -758,7 +758,7 @@
"qz" = (/obj/structure/table/woodentable,/obj/item/weapon/retractor,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qA" = (/obj/structure/table/woodentable,/obj/item/clothing/suit/wizrobe/magusblue,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qB" = (/obj/structure/table/woodentable,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"qC" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
+"qC" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qD" = (/obj/effect/decal/cleanable/blood/splatter,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"qO" = (/turf/unsimulated/wall/fakeglass{dir = 8; icon_state = "fakewindows3"; tag = "icon-fakewindows (WEST)"},/area/syndicate_mothership)
"qQ" = (/obj/structure/rack,/obj/item/clothing/under/color/red,/obj/item/clothing/shoes/brown,/obj/item/clothing/suit/armor/tdome/red,/obj/item/clothing/head/helmet/thunderdome,/obj/item/weapon/melee/baton/loaded,/obj/item/weapon/melee/energy/sword/saber/red,/turf/unsimulated/floor{icon_state = "dark"},/area/tdome/arena)
@@ -772,7 +772,7 @@
"qY" = (/turf/unsimulated/wall/fakeglass{color = "#008000"; dir = 1; icon_state = "fakewindows"},/area/wizard_station)
"qZ" = (/obj/structure/cult/tome,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
"ra" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/head/wizard/red,/obj/item/weapon/twohanded/staff,/obj/item/clothing/shoes/sandal,/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/area/wizard_station)
-"rb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/clothing/suit/space/rig/wizard,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
+"rb" = (/obj/effect/decal/cleanable/blood/splatter,/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/wizard,/turf/unsimulated/floor{tag = "icon-cultdamage"; icon_state = "cultdamage"},/area/wizard_station)
"rc" = (/turf/unsimulated/floor{tag = "icon-cult"; icon_state = "cult"},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/wizard_station)
"rd" = (/turf/simulated/shuttle/wall{icon_state = "swall8"; dir = 2},/area/wizard_station)
"rj" = (/obj/structure/closet/syndicate/personal,/turf/unsimulated/floor{icon_state = "vault"; dir = 8},/area/syndicate_mothership)
diff --git a/_maps/map_files/MetaStation/z5.dmm b/_maps/map_files/MetaStation/z5.dmm
index 6e619cc2478..75967b6d744 100644
--- a/_maps/map_files/MetaStation/z5.dmm
+++ b/_maps/map_files/MetaStation/z5.dmm
@@ -1177,8 +1177,8 @@
"wG" = (/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wH" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wI" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/table,/obj/item/weapon/pickaxe,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wK" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wJ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wK" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wL" = (/obj/machinery/light,/turf/simulated/floor/plating/airless/asteroid,/area/mine/dangerous/explored)
"wM" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/obj/item/device/radio/intercom{dir = 8; name = "Station Intercom (General)"; pixel_x = -28},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wN" = (/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
index 0be703c0465..4dffe913be2 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/abandonedzoo.dmm
@@ -43,7 +43,7 @@
"aQ" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
"aR" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aS" = (/obj/machinery/power/apc/worn_out{dir = 8; pixel_x = -24; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/rack,/obj/item/weapon/melee/baton/cattleprod,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
-"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/weapon/tank/emergency_oxygen/double,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
+"aT" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/weapon/tank/emergency_oxygen/double,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aU" = (/obj/structure/rack,/obj/item/weapon/crowbar,/obj/item/weapon/shield/riot,/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aV" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
"aW" = (/obj/structure/table/reinforced,/obj/item/weapon/gun/syringe,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/ruin/unpowered)
diff --git a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
index 482c4eee1a3..cd378f27dd9 100644
--- a/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
+++ b/_maps/map_files/RandomRuins/SpaceRuins/onehalf.dmm
@@ -110,7 +110,7 @@
"cf" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cg" = (/obj/machinery/light{dir = 1; on = 1},/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"ch" = (/obj/structure/computerframe,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
-"cj" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500{pixel_y = 9},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
+"ci" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/table,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500{pixel_y = 9},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"ck" = (/obj/structure/girder/reinforced,/turf/unsimulated/floor/plating/airless,/area/space)
"cl" = (/obj/structure/disposalpipe/junction{tag = "icon-pipe-j1 (NORTH)"; icon_state = "pipe-j1"; dir = 1},/obj/item/weapon/shard,/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg1"},/area/ruin/onehalf/hallway)
"cm" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/stack/rods,/turf/space,/area/ruin/onehalf/hallway)
@@ -139,7 +139,7 @@
"cJ" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cK" = (/obj/machinery/door/poddoor/preopen{id_tag = "onehalf bridge"; name = "bridge blast door"},/obj/machinery/door/airlock/glass_command{name = "Bridge"},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cL" = (/obj/item/weapon/crowbar,/obj/item/device/multitool,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
-"cM" = (/obj/structure/safe/floor,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/suit/space/rig/syndi,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/folder/syndicate/blue,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
+"cM" = (/obj/structure/safe/floor,/obj/item/weapon/tank/oxygen/red,/obj/item/clothing/mask/gas/syndicate,/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/reagent_containers/food/drinks/bottle/rum,/obj/item/weapon/folder/syndicate/blue,/turf/simulated/floor/plating,/area/ruin/onehalf/bridge)
"cN" = (/obj/structure/stool/bed/chair/comfy/black{tag = "icon-comfychair (EAST)"; icon_state = "comfychair"; dir = 4},/turf/simulated/floor/plasteel,/area/ruin/onehalf/bridge)
"cO" = (/obj/structure/lattice,/obj/item/stack/cable_coil/cut{amount = 2; dir = 2; icon_state = "coil_red2"},/turf/space,/area/ruin/onehalf/hallway)
"cP" = (/turf/simulated/floor/plating/airless{broken = 1; icon_state = "platingdmg2"},/area/ruin/onehalf/hallway)
@@ -182,7 +182,7 @@ aaaaawajaxaTaUagagaVagagagaWagagaXbyaZbaaZbaaZbabbarararbcararaa
aaaaawbdbebfbgbhbhbibgbgbjbhbkblbmbnbobnbobnbobnbobnbpbqbrbsbtaa
aaaaaabubvbvbwbwbvbxbwbwaLbzbAbBbCbnbDbEbDbnbDbEbFbGarbHbGbIbtaa
aaaaaabJajakbKbLbMbNbObPbXbRbSbTbTbTbTbTbTbTbTbTbTbTararbtararaa
-aaaaaaaabUbVbJakbWbXbYawbXbZcacbaacccdcecfcgchbQcjbTawaaaaaaaaaa
+aaaaaaaabUbVbJakbWbXbYawbXbZcacbaacccdcecfcgchbQcibTawaaaaaaaaaa
aaaaaaaaaaaaaaaackaaaabUaxaxclcmcncocpcqcrcscrcrctcuadaaaaaaaaaa
aaaaaaaaaaaaaacvcwcxaaaabYcyczbTbTbTcAcrcBcrcrcrcCcDaiaaaaaaaaaa
aaaaaaaaaaaaaaaaaaawcEaacFcGcHcIcJcKcrcBcLcMcrcNchcDaiaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/academy.dmm b/_maps/map_files/RandomZLevels/academy.dmm
index 4bc70976af3..de0c82c304c 100644
--- a/_maps/map_files/RandomZLevels/academy.dmm
+++ b/_maps/map_files/RandomZLevels/academy.dmm
@@ -35,7 +35,7 @@
"aI" = (/obj/structure/table/reinforced,/obj/item/device/laser_pointer/upgraded,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aJ" = (/obj/structure/cult/tome,/obj/item/weapon/twohanded/staff,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aK" = (/obj/structure/stool/bed/chair/wood/wings{dir = 8},/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
-"aL" = (/obj/item/clothing/suit/space/rig/wizard,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
+"aL" = (/obj/item/clothing/suit/space/hardsuit/wizard,/obj/structure/table/woodentable,/turf/simulated/floor/wood,/area/awaymission/academy/headmaster)
"aM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/briefcase,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aN" = (/obj/structure/table/reinforced,/obj/item/weapon/coin/plasma,/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
"aO" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/carpet,/area/awaymission/academy/headmaster)
diff --git a/_maps/map_files/RandomZLevels/beach.dmm b/_maps/map_files/RandomZLevels/beach.dmm
index 04512b660bf..857fab3d750 100644
--- a/_maps/map_files/RandomZLevels/beach.dmm
+++ b/_maps/map_files/RandomZLevels/beach.dmm
@@ -2,7 +2,7 @@
"ab" = (/turf/unsimulated/beach/water/deep,/area/awaymission/undersea)
"ac" = (/obj/machinery/poolcontroller/seacontroller,/turf/unsimulated/beach/water/deep,/area/awaymission/undersea)
"ad" = (/turf/unsimulated/beach/water/deep/rock_wall,/area/awaymission/undersea)
-"ae" = (/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
+"ae" = (/obj/item/stack/spacecash/c500,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"af" = (/obj/structure/constructshell,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"ag" = (/obj/structure/stool/bed/chair/wood/wings,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"ah" = (/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
@@ -47,7 +47,6 @@
"aU" = (/obj/structure/ladder/dive_point/anchor,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aV" = (/obj/structure/barricade/wooden,/turf/unsimulated/beach/water/deep/wood_floor,/area/awaymission/undersea)
"aW" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
-"aX" = (/obj/item/weapon/spacecash/c500,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aY" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/turf/unsimulated/beach/water/deep/sand_floor,/area/awaymission/undersea)
"aZ" = (/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
"ba" = (/obj/structure/flora/rock,/turf/unsimulated/beach/sand{density = 1; icon = 'icons/turf/snow.dmi'; icon_state = "gravsnow"; name = "rough sand"},/area/awaymission/beach)
@@ -217,125 +216,125 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababab
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadadadadadaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadafadagagadafadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahahahahahahahadadahaiadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeaeadaeaeaeaeaeaeaeaeadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahaiajakaiahahahalahamadadanaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadadaeaeadaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadafahahahahahahahahafadahaiadaoaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeadaeadaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahapapapapapapahahadadadadanaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeadadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadahahahahahahahahahahadadadaoaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadaeadadaeadadadadadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadarahapapapapapapahahadadadanaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadaeadaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahahahahahahahahahadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahapapapapapapahahadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaqaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeadadaeadaeadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahahahahahasadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeahahaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadahahatahahatahahahaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeadaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeahahahahaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadauauadadadadasaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeahahadadahahaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadasasadadadasasasaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadaeavadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeahawadadahahaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeahahahahaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeahahaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadadadadadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaqaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeadadaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadadaeadadaeadaeaeadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadadadadadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeadaeaeadaeaeadaeaeaeadaeaeadaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadaeaeadaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaxahahahahayadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadazaAazaAahaBadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadahahahahahahadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadasaeaeaeadadadadaCaCadadadadaeaeaeasadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaDaEaFahadaGadadaHaHaHadaIaEaJahahaIaEaJadaHaHaHadadaGadaKaLahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaMaNadaeaeaeadahahahahahahahahadaOaeaeadaMahadahahahaEadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaCadadaeaPaeadaIaEaJahahaIaEaJadaeaeaeadadaCadahahahaEadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahaCahaQadaeaeaeadahahahahahahahahadaOaeaeadaRahaCahahahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadahahahahadaSaTadaeaeaeadaIaEaJahahaIaEaJadaeaeaeadaSaTadahahahahadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaUaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaCadadadadadaHaHaHadadaVaVahahaVaVadadaHaWaHadadadadadadaCadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeadadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeasadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeadaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeadaeaeadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaqaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeadaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeadadaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeadadaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeadaeaeadaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeadadadaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeadaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadadadadadadadaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeadaeadaeadadadaeadaeaeaeaeaeaeaeaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeadaeaeadaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeadadaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeadadadadadadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeadaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaXaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadaeaeaqaeaeadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadaeaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadaeadaeadaeadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadaeaeaeaeadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadaeadaeaeaeadaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadaeaeadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaqaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeadadadaeaeaeadadadaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeadadadadadadadadadadadadadadadadadadadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeadadadadadaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeadadadadadadadadadadadadadadadadadaYadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeadadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeaeadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadadadadadavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavadadavavavavavavavavavavavavavavavavadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadafadagagadafadadadadadadadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahahahahahahahadadahaiadadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavavadavavavavavavavavadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahaiajakaiahahahalahamadadanavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadadadavavadavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadafahahahahahahahahafadahaiadaoavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavadavadavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahapapapapapapahahadadadadanavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadadavavavavavavavavavavavadadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadahahahahahahahahahahadadadaoavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadadadavavavavavavavavavavavavavavadavavavavavavavavavavadavavavadadadavadadavadadadadadavavavavadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavaqavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadarahapapapapapapahahadadadanavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadavavavadavadavadadadadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahahahahahahahahahadadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadavavadavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadadavadavavavavavavavavavavavavavavavavadavavavadadadadadadadadadadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahapapapapapapahahadadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavaqavadadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavadavadadavadavadavadadavavavavavavavavavavavavavavadavavavadadavavavavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahahahahahasadadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadavavavavadadadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadavavavavavavadadavavavavavavavavavavavavavavavavavadadavavavavavavahahavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadahahatahahatahahahavavadavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavadavadadadadadadadadavavavavavavavavavavavavavavavavadavavavavavavavavadavadavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavahahahahavavavavadavavavavavadavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavadadadadadauauadadadadasavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavahahadadahahavavavadavavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadadasasadadadasasasavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavahawadadahahavavavadavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavadadavavavavavavavahahahahavavavavadavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavahahavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavadadadavavavavadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadadavadavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadadavavavavavavadadadadadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadadadavavavaqavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadadavavavavavavadavavavavadavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavadadadavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavadadadadavadadavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadadavadadavavavavavavavavavadavavavavaqavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavadavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavadavadadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavadadadavadadavadavavadavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavadadadadadadadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaqavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavadavavadavavadavavavadavavadavavadadadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavadavadavavavavadadadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavadavavadavavadavavavavavavavadadadavavavavavavavavadavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavadadavavavavavavavavadavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadavadadadavavavavavavavavadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadaxahahahahayadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadazaAazaAahaBadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadahahahahahahadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadasavavavadadadadaCaCadadadadavavavasadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadaDaEaFahadaGadadaHaHaHadaIaEaJahahaIaEaJadaHaHaHadadaGadaKaLahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaMaNadavavavadahahahahahahahahadaOavavadaMahadahahahaEadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaCadadavaPavadaIaEaJahahaIaEaJadavavavadadaCadahahahaEadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahaCahaQadavavavadahahahahahahahahadaOavavadaRahaCahahahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadahahahahadaSaTadavavavadaIaEaJahahaIaEaJadavavavadaSaTadahahahahadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaUavavavavavavavavavavavavavavavavavavavavadadadaCadadadadadaHaHaHadadaVaVahahaVaVadadaHaWaHadadadadadadaCadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavadadavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavasadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadadavavavavavavavadadavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavaqavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavadavavadavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavaqavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavadadavadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavadavavavavavavavavadadavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavadavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavadavadavavavavadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavavadavadavavadavavadavadadavavavavavavavavavavavavavavavavavavavavadadavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavadadavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavadavadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadavavavavavavavavavavavavavavadavavavavadavavavavaqavavavavadavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavadavavavavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadavadavavavavavavavavavavavadavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadadadavavavavavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavadavavavavavavavavavavadavavadavavavavavavavadavadadadavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavadadavadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavadadavavavavavavadadavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavadadavavavavadavavadavadavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadavavavadadadavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavadavavavavavavavavavavavavavavavadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavadadadadadavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavadavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavavavadavavavavavavavavavadavavavavavavavadavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavavavavavavavavavavadavavavadavavavavavavavavadadadavadadavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavadavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavadadadavavadavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavadavavavavavavavavadavavavavavavavavavavadadadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavadavavavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavadavavadadadadadadadavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavadadadadadadadadadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadavavadavadavadavadadadavadavavavavavavavavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadavavavavavavavavavadadadadadadadadadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavadavavadavavadavavavavavavavavavavavavadavadavadadavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavadadadadadadadadadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadavavavavavavavavadadadadadadadadadavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavadavavavavavavavavadadadadadadadadadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadadadadadadadadadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavadavavavavavavavavavadadadadadadadadavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavadavavavavavavavavavadadadadadadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadadavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavaqavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavadavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavadadadavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadaeavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadavavaqavavadadadadadadadadavavavavavavavavavavavavavavavavavavavadavadadavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadavavavavavadadadadadadadadadavavavavavavavavavavavavavavavavavavadavavavavavavadavavavavavavavavavavavavavavavavavavavavavadavadavadavadavadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadavavavavadadadadadadadadadavavavavavavavavavavavavavavavavavadadavavavavavadadavavavavavavavavavavavavavavavavavavavavavadavavavadavadavavavadavavavaqavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavaqavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadavavadadadadadadadadadadavavavavavavavavavavavavavavavavadadadadavavavadavavavavavavavavavavavavavavavavavavavavavavavadadadavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadavavadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavaqavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavadadadadavavavavavavavavavavavavavavavavavavavavavavadavavavavavadavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavadadadadadavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadadavavavavavavavadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavadadadavavavadadadavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavadadadadadadadadadadadadadadadadadadadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavadadadadadavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavadadadadadadadadadadadadadadadadadaYadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadadavavavavavavavadadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavavadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
index f6bf7d003af..86d30d99fa3 100644
--- a/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
+++ b/_maps/map_files/RandomZLevels/blackmarketpackers.dmm
@@ -61,7 +61,7 @@
"bi" = (/obj/item/weapon/hand_labeler,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bj" = (/obj/structure/largecrate,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bk" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
-"bl" = (/obj/item/weapon/spacecash/c500,/obj/item/weapon/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
+"bl" = (/obj/item/stack/spacecash/c500,/obj/item/stack/spacecash/c100,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bm" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/yellow,/turf/simulated/floor/wood,/area/awaymission/BMPship/Fore)
"bn" = (/turf/simulated/shuttle/wall{tag = "icon-swall3"; icon_state = "swall3"},/area/awaymission/BMPship/Fore)
"bo" = (/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/BMPship/Fore)
@@ -90,7 +90,7 @@
"bL" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bM" = (/obj/machinery/gateway,/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
"bN" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plating,/area/awaymission/BMPship/Aft)
-"bO" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
+"bO" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/BMPship/Aft)
"bP" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/awaymission/BMPship/Fore)
"bQ" = (/turf/simulated/floor/plasteel{tag = "icon-wood-broken"; icon_state = "wood-broken"},/area/awaymission/BMPship/Fore)
"bR" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Fore)
@@ -122,8 +122,8 @@
"cr" = (/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cs" = (/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"ct" = (/obj/structure/kitchenspike,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cu" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
-"cv" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cu" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
+"cv" = (/obj/structure/closet/crate,/obj/item/device/analyzer,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cw" = (/obj/structure/closet/crate/freezer,/obj/item/weapon/reagent_containers/food/snacks/meat,/obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cx" = (/obj/machinery/door_control{id = "packerCargo"; pixel_y = -24},/obj/machinery/light/small,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
"cy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/BMPship/Aft)
@@ -211,6 +211,7 @@
"ec" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/BMPship/Aft)
"ed" = (/obj/item/device/multitool,/turf/simulated/floor/engine,/area/awaymission/BMPship/Aft)
"ee" = (/obj/structure/shuttle/engine/heater{tag = "icon-heater (EAST)"; icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plasteel/airless{tag = "icon-engine"; icon_state = "engine"},/area/awaymission/BMPship/Aft)
+"ef" = (/obj/structure/closet/crate,/obj/item/stack/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"eg" = (/turf/simulated/floor/plasteel{tag = "icon-carpet15-15 (EAST)"; icon_state = "carpet15-15"; dir = 4},/area/awaymission/BMPship/Fore)
"eh" = (/obj/structure/table,/obj/machinery/recharger,/turf/simulated/floor/plasteel{tag = "icon-carpet5-0 (EAST)"; icon_state = "carpet5-0"; dir = 4},/area/awaymission/BMPship/Fore)
"ei" = (/obj/structure/stool,/turf/simulated/floor/plasteel{tag = "icon-carpet13-1 (EAST)"; icon_state = "carpet13-1"; dir = 4},/area/awaymission/BMPship/Fore)
@@ -439,7 +440,6 @@
"ix" = (/obj/structure/toilet{dir = 8},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iy" = (/obj/item/weapon/caution,/turf/simulated/floor/plating/airless,/area/awaymission)
"iz" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating/airless,/area/awaymission)
-"iA" = (/obj/structure/closet/crate,/obj/item/weapon/spacecash/c10,/turf/simulated/floor/plasteel,/area/awaymission/BMPship/Aft)
"iB" = (/obj/structure/sink{dir = 2},/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/area/awaymission/BMPship/Aft)
"iC" = (/turf/simulated/floor/plasteel{icon_state = "cafeteria"; dir = 2},/turf/simulated/shuttle/wall{tag = "icon-swall_f6"; icon_state = "swall_f6"; dir = 2},/area/awaymission/BMPship/Aft)
"iD" = (/obj/item/clothing/gloves/color/yellow,/turf/space,/area/awaymission)
@@ -512,7 +512,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacababacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkblbmbnbobpbqbpbqbpbrbsaaaaaaaaaaasbtaYaHbuaHaHaHaGaHbvaNaNbwbxbybdbzbdbdbAbBbCbDbdbjaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacabababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabEbFbGbnbHararararararbIaaaaaaasaEaFaHbuaYaHbuaHaHaHaZaHaHaHbJbcbKbdbdbdbdbLbMbNbdbdbOaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabPbQbFbnarbRbRbSbRbRbTbUaaaaaaaEbVbtbuaHbWbXaHaHaHbYaHbWbYaHaPbccacbcccccdccccccccbyceaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcucvcwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacfcgchcicjckclclclclclcmclclclcmcnaxaxaxaxaAcpcpcpaCaxaxaxaxbVcqcrcsctcrcrcvcucwcxcyczaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCcCcDcCcEcFcGcHcIcJcKcIcLcGcMcNcOcPcQcRcMcMcMcMcScTcUcScVcWaxaxaxaxaxaxaxaxayaAcXaCcncoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcYcZcYdacCcEcMdbcHdcdcdcdccLcMcMdddedededfcMcMcMcMdgdgcMdgcMdhdididjdkdldmdldnaPdodpdqdrazaxaycoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAcBcCdsdtdsdudvcEcMcMcHdcdwdcdccLcMcMdxdydzdAdBcMcMcMcMcMcMcMcMcMaPdjdCdjbJdDdEdFdGaPdHdpdododIdJcWazaxcoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -532,7 +532,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjhjhjhjhUaaaaaaaaaahValalhWhXgOhXhChYhXhChjhjhjhjhjhjhFachZiahHibicididhHhHhHhHbbhudqdqiedqifdqiedqdqdqigaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahjacihaaaaaaaaaaiiakalbUgBgBhCgzhCgBhChFhjhjhjhFhjhjhjacijacididididhHhHikiliminininininiodqdqdqaCaxaxbVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaipacafagagiqagirhjhChFhjhjhjhjhjhjhjhjhjhjhjhIhZididibidhHishHhHbJdqdqitiudqiedqiedqiviwixaPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPiAiAdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhFachZhHhHhKiyiyiyizaPefefdqbddqdqdqdqdqbJiBiCftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaiDacacachjhjhjhjhjhjhjhjhjhjhjhFhjhjhjhjhjhjhjhjhFiEiFiFiFiFiFiFiFazaxaxaxayaAhgaCayayazaxftaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaiGakhzciiHariIaviJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacachjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjhjacacaaaaaaaaaaapalalaqarariKiJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/challenge.dmm b/_maps/map_files/RandomZLevels/challenge.dmm
deleted file mode 100644
index 397cbe43b65..00000000000
--- a/_maps/map_files/RandomZLevels/challenge.dmm
+++ /dev/null
@@ -1,246 +0,0 @@
-"aa" = (/turf/space,/area/space)
-"ab" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/start)
-"ac" = (/obj/structure/girder,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/start)
-"ad" = (/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"ae" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged5"},/area/awaymission/challenge/start)
-"af" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ag" = (/obj/item/clothing/suit/space/syndicate/blue,/obj/item/clothing/head/helmet/space/syndicate/blue,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ah" = (/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"ai" = (/obj/item/device/flashlight{icon_state = "flashlight-on"; item_state = "flashlight"; on = 1},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"aj" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/start)
-"ak" = (/obj/effect/decal/remains/human,/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/awaymission/challenge/start)
-"al" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"am" = (/obj/item/clothing/suit/space/syndicate/green,/obj/item/clothing/head/helmet/space/syndicate/green,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"an" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/start)
-"ao" = (/obj/item/clothing/suit/space/syndicate/orange,/obj/item/clothing/head/helmet/space/syndicate/orange,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"ap" = (/obj/item/weapon/gun/energy/laser/retro,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"aq" = (/obj/item/stack/rods,/turf/simulated/floor/plasteel,/area/awaymission/challenge/start)
-"ar" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"as" = (/obj/effect/decal/remains/robot,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"at" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"au" = (/turf/simulated/wall,/area/awaymission/challenge/start)
-"av" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged4"},/area/awaymission/challenge/start)
-"aw" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"ax" = (/obj/effect/decal/cleanable/blood/oil,/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plating,/area/awaymission/challenge/start)
-"ay" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/start)
-"az" = (/obj/item/clothing/suit/space/syndicate/black,/obj/item/clothing/head/helmet/space/syndicate/black,/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/start)
-"aA" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/main)
-"aB" = (/obj/structure/girder,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"aC" = (/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"aD" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged3"},/area/awaymission/challenge/main)
-"aE" = (/turf/simulated/wall,/area/awaymission/challenge/main)
-"aF" = (/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aG" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged2"},/area/awaymission/challenge/main)
-"aH" = (/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aI" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aJ" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aK" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aL" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aM" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aN" = (/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aO" = (/obj/structure/window/reinforced,/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aP" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aQ" = (/obj/structure/window/reinforced,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aR" = (/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"aS" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 4; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aT" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aU" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"aV" = (/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aW" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aX" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"aZ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"ba" = (/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/challenge/main)
-"bb" = (/obj/item/device/multitool,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bc" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bd" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHWEST)"; icon_state = "warnplate"; dir = 9},/area/awaymission/challenge/main)
-"be" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/challenge/main)
-"bf" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTH)"; icon_state = "warnplate"; dir = 1},/area/awaymission/challenge/main)
-"bg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (NORTHEAST)"; icon_state = "warnplate"; dir = 5},/area/awaymission/challenge/main)
-"bh" = (/turf/simulated/floor/plasteel,/area/awaymission/challenge/main)
-"bi" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/challenge/main)
-"bj" = (/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bk" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/machinery/light,/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bl" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/challenge/main)
-"bm" = (/obj/machinery/door/window/southleft,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bn" = (/obj/machinery/door/window/southright,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bo" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 2; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating{tag = "icon-warnplate (WEST)"; icon_state = "warnplate"; dir = 8},/area/awaymission/challenge/main)
-"bp" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"bq" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating,/area/awaymission/challenge/main)
-"br" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating{tag = "icon-warnplate (EAST)"; icon_state = "warnplate"; dir = 4},/area/awaymission/challenge/main)
-"bs" = (/obj/structure/window/reinforced{dir = 4},/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bt" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bu" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHWEST)"; icon_state = "warnplate"; dir = 10},/area/awaymission/challenge/main)
-"bv" = (/obj/structure/window/reinforced,/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/awaymission/challenge/main)
-"bw" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/awaymission/challenge/main)
-"bx" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"by" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"bz" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "warning"},/area/awaymission/challenge/main)
-"bA" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bB" = (/obj/item/clothing/gloves/color/yellow,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/awaymission/challenge/main)
-"bC" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 8; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bD" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 4; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bE" = (/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plasteel/airless,/area/awaymission/challenge/main)
-"bF" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitecorner"},/area/awaymission/challenge/main)
-"bG" = (/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/challenge/main)
-"bH" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitecorner"},/area/awaymission/challenge/main)
-"bI" = (/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bJ" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bL" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bM" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bN" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bO" = (/obj/machinery/power/emitter{active = 1; active_power_usage = 0; anchored = 1; dir = 1; idle_power_usage = 0; locked = 1; name = "Energy Cannon"; req_access_txt = "100"; state = 2; use_power = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bP" = (/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/end)
-"bQ" = (/obj/item/weapon/gun/projectile/revolver/russian,/turf/simulated/floor/plasteel{icon_state = "whitehall"; dir = 2},/area/awaymission/challenge/main)
-"bR" = (/obj/structure/table/reinforced,/obj/machinery/light{dir = 1},/obj/machinery/recharger{pixel_y = 4},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"bS" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/obj/item/device/radio/intercom,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"bT" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"bU" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bV" = (/turf/simulated/floor/plasteel{dir = 2; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/awaymission/challenge/main)
-"bW" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/light,/turf/simulated/floor/plating/airless,/area/awaymission/challenge/main)
-"bX" = (/obj/machinery/light{dir = 1},/obj/structure/filingcabinet,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"bY" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching evil areas."; name = "Security Monitor"; network = ""; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"bZ" = (/obj/machinery/door_control{id = "challenge"; name = "Gateway Lockdown"; pixel_x = -4; pixel_y = 26; req_access_txt = "0"},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ca" = (/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cb" = (/obj/structure/mirror{pixel_y = 28},/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cc" = (/obj/machinery/light{dir = 1},/obj/structure/rack,/obj/item/clothing/suit/armor/heavy,/obj/item/clothing/head/helmet/space/deathsquad,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cd" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"ce" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cf" = (/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cg" = (/mob/living/simple_animal/hostile/syndicate/ranged/space{name = "Syndicate Officer"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"ch" = (/obj/machinery/door/airlock/centcom{name = "Airlock"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"ci" = (/obj/item/device/radio/intercom{pixel_x = -28},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cj" = (/obj/structure/stool/bed/chair/comfy/black,/mob/living/simple_animal/hostile/syndicate{name = "Syndicate Commander"},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ck" = (/obj/structure/table/woodentable,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cl" = (/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cm" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/revolver/mateba,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cn" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"co" = (/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cp" = (/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cq" = (/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cr" = (/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cs" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/item/weapon/stamp/granted,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"ct" = (/obj/structure/table/woodentable,/obj/item/weapon/paper{info = "Congratulations,
Your station has been selected to carry out the Gateway Project.
The equipment will be shipped to you at the start of the next quarter.
You are to prepare a secure location to house the equipment as outlined in the attached documents.
--Nanotrasen Blue Space Research"; name = "Confidential Correspondence, Pg 1"; pixel_x = 0; pixel_y = 0},/obj/item/weapon/folder/blue,/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cu" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green{pixel_x = 1; pixel_y = 5},/turf/simulated/floor/carpet,/area/awaymission/challenge/end)
-"cv" = (/obj/structure/rack,/obj/item/mecha_parts/mecha_equipment/weapon/ballistic/silenced,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cw" = (/mob/living/simple_animal/hostile/syndicate/melee,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/challenge/end)
-"cx" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cy" = (/obj/structure/rack,/obj/item/weapon/gun/projectile/automatic/l6_saw,/turf/simulated/floor/wood,/area/awaymission/challenge/end)
-"cz" = (/obj/machinery/door/airlock/centcom{name = "Security"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cA" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cB" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cC" = (/obj/structure/sign/securearea,/turf/simulated/shuttle/wall{icon_state = "wall3"},/area/awaymission/challenge/end)
-"cD" = (/obj/machinery/door/airlock/centcom{name = "Administrator"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cE" = (/obj/item/weapon/storage/toolbox/electrical,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cF" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cG" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cH" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"cI" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cJ" = (/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cK" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/space,/area/space)
-"cL" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cM" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
-"cN" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/space,/area/space)
-"cO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cP" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"cS" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cT" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/challenge/end)
-"cU" = (/obj/machinery/gateway{dir = 1},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cV" = (/obj/machinery/gateway{dir = 5},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/challenge/end)
-"cW" = (/obj/machinery/light{dir = 4},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cX" = (/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"cY" = (/obj/machinery/gateway{dir = 8},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"cZ" = (/obj/machinery/gateway/centeraway{calibrated = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"da" = (/obj/machinery/gateway{dir = 4},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"db" = (/obj/machinery/gateway{dir = 10},/turf/simulated/floor/plasteel{tag = "icon-vault (EAST)"; icon_state = "vault"; dir = 4},/area/awaymission/challenge/end)
-"dc" = (/obj/machinery/gateway,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plasteel{tag = "icon-vault (WEST)"; icon_state = "vault"; dir = 8},/area/awaymission/challenge/end)
-"dd" = (/obj/machinery/gateway{dir = 6},/turf/simulated/floor/plasteel{tag = "icon-vault (NORTH)"; icon_state = "vault"; dir = 1},/area/awaymission/challenge/end)
-"de" = (/obj/structure/window/reinforced,/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"df" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/machinery/door/poddoor{icon_state = "pdoor1"; id_tag = "challenge"; name = "Gateway Shutters"; p_open = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dg" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/space,/area/space)
-"dh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"di" = (/obj/structure/table,/obj/item/weapon/paper/pamphlet,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dj" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/regular,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dk" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dl" = (/obj/structure/table,/obj/machinery/recharger{pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dm" = (/obj/structure/table,/obj/item/weapon/implanter/explosive,/obj/item/weapon/implanter/explosive{pixel_y = 4},/obj/item/weapon/implanter/explosive{pixel_y = 8},/obj/item/weapon/implanter/explosive{pixel_y = 12},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dn" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/space,/area/space)
-"do" = (/obj/machinery/door/airlock/centcom{name = "Gateway Access"; opacity = 1; req_access_txt = "109"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/challenge/end)
-"dq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/mob/living/simple_animal/hostile/syndicate{name = "Syndicate Technician"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"dr" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/awaymission/challenge/end)
-"ds" = (/obj/machinery/light,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dt" = (/obj/structure/closet/emcloset,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"du" = (/obj/structure/cable,/obj/machinery/power/smes/magical,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dv" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-"dw" = (/obj/structure/closet/l3closet/general,/turf/simulated/floor/bluegrid,/area/awaymission/challenge/end)
-
-(1,1,1) = {"
-aaaaaaaaaaaaababababababababababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabacadaeafagahaiahabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabafajakalahalahamabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabananalahalahaladabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabahaoafafapaqarasabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabadafadatauatafavabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabananawafafanavaeabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaabaxavavanayazadavabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaAaAaAaAaAaBaCaDaEaAaAaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaFaFaAaCaGaCaHaAaFaFaFaIaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaIaFaAaJaKaLaMaAaNaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaAaAaAaOaPaQaPaAaRaRaRaRaAaPaOaPaPaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTaHaHaHaHaUaHaHaHaHaUaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaKaHaHaHaHaHaHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaHaHaHaRaRaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaXaFaTaJaHaHaYaZaHaHaHaHaYaZaHaHaMaVaNaXaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHbababbaHaHaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHbcaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHbdbebfbebebgaHaHaHaHaVaWaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTbhaRaRbhbibjaCaCbkblbhaRaRbhaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTaJaYaZbmaAaAaAaAaAaAbnaYaZaMaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHbabaaHbobpbqbqbpbraHbabaaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFbsaHbtaHaHbubvbvbvbvbwaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHaHaKaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaJaHaHaHaHaHaHaHaHaHaHaHaHaMaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaHaHaHaRaRaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaYaZaHaHaHaHaYaZaHaHaHbxaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHbabaaHaHaHaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaSaTbyaRaRaRaHaRaRaRaRaHaRaRaRbzaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaYbAbAaZaHaYbAbAaZaHaYbAbAaZaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTbabababaaHbabababaaHbababBbaaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaSaFaTaHaHaHaHaHaHaHaHaHaHaHaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaRaRaHaRaRaHaRaRaHaHaHbCaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaNbDaJaHaHaYaZbmaYaZbnaYaZaHaHaMaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHbEaHbabaaHbabaaHbabaaHaHaHaVaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaFaFaTaHaHaHaHaHbFbGbGbHaHaHaHaHaHaVaFaWaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aAaAaAaAbIbIbIbIbIbJbGbGbKbIbIbIbLbIaAaAaAaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFbMaFaFaFbNbGbGaVaNaFaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaAaFaFaFaIaFaTbGbGbOaFbMaFaFaFaAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPbPbPbPbPbPaFaTbQbGaVaFbPbPbPbPbPbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbRbSbTbTbSbRbPaFbUbVbVbWbMbPbXbYbZcacbccbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcecfcgcecdbPbPbPchchbPbPbPcicjckcaclcmbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcncfcfcfcdbPcocpcqcqcpcrbPcsctcucaclcvbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcdcdcfcfcwcdbPcocpcfcfcpcrbPclcxclclclcybPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPczczbPbPbPcAcpcfcfcpcBbPbPbPcCcDbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcEcqcqcpcpcFcpcpcfcfcpcpcFcpcpcfcqcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcfcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcGcfcfcfcfcfcfcfcfcfcfcfcfcfcfcHcfcfcpcIbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcpcpcpcfcfcpcpcpcpcpcpcpcpcpcpcpcfcfcpcpbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPcJcKcpcfcfcpcLcJcJcJcJcJcJcJcMcpcfcfcpcNbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcOcPcPcPcPcPcQcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcScTcUcVcWcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcXcYcZdacXcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRcXdbdcddcXcRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpcrcRdededfdedecRcocpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcpdgdhdidjdkdldmdhdncpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcfcfcfcqdocfcfdkcfcfdocqcfcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpcHcfcpcLdpcfcfdqdrcfdpcMcpcfcfcpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPaacocpdscpcpcrdhdtcpdudvdwdhcocpcpdscpcrbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-bPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPbPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-"}
diff --git a/_maps/map_files/RandomZLevels/moonoutpost19.dmm b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
index f2b2f5c9a05..e4378e5143a 100644
--- a/_maps/map_files/RandomZLevels/moonoutpost19.dmm
+++ b/_maps/map_files/RandomZLevels/moonoutpost19.dmm
@@ -172,7 +172,7 @@
"dp" = (/turf/simulated/floor/plasteel/airless{icon_state = "damaged1"; name = "floor"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dq" = (/obj/structure/table/woodentable,/obj/structure/sign/poster{icon_state = "poster24"; pixel_x = 0; pixel_y = -32; serial_number = 24; subtype = 0},/obj/item/weapon/pen,/obj/item/weapon/paper{info = "Log 1:
While mining today I noticed the NT station was finished with its renovations. They placed some huge reinforced tumor on the station – looks so ugly. I wouldn't be surprised if those pigs decided to turn that little astronomy outpost into a prison with that thing, it'd be pretty typical of them.
Log 2:
Really dumb of me, but I just waved at an engineer in the outpost, and he waved back. I hope to god he was too dumb or drunk to recognize the suit, because if he isn't, then we might have to pull out before they come looking for us.
Log 3:
That huge reinforced tumor in their science section has been making a lot of noise lately. I've been hearing some banging and scratching from the other side and I'm kind of glad now that they reinforced this thing so much. I'll be sleeping with my gun under my pillow from now on."; name = "Personal Log"},/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dr" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective_locked"; locked = 1; name = "personal closet"; req_access_txt = "150"},/obj/item/ammo_box/magazine/m10mm,/obj/item/ammo_box/magazine/m10mm,/obj/item/weapon/suppressor,/turf/simulated/floor/plasteel/airless{dir = 8; icon_state = "wood"; name = "floor"; tag = "icon-warningcorner (NORTH)"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
-"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/weapon/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
+"ds" = (/obj/structure/closet/secure_closet{desc = "It's a secure locker for personnel. The first card swiped gains control."; icon_broken = "cabinetdetective_broken"; icon_closed = "cabinetdetective"; icon_locked = "cabinetdetective_locked"; icon_off = "cabinetdetective_broken"; icon_opened = "cabinetdetective_open"; icon_state = "cabinetdetective"; locked = 0; name = "personal closet"; req_access_txt = "150"},/obj/item/stack/spacecash/c50,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dt" = (/obj/structure/stool/bed,/obj/item/weapon/bedsheet/syndie,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/wood,/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"du" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating/airless{name = "plating"},/area/awaycontent/a4{has_gravity = 1; name = "Syndicate Outpost"})
"dv" = (/obj/item/weapon/ore/iron,/obj/item/weapon/ore/iron{pixel_x = -7; pixel_y = -4},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a3{always_unpowered = 1; ambientsounds = list('sound/ambience/ambimine.ogg'); has_gravity = 1; name = "Khonsu 19"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
diff --git a/_maps/map_files/RandomZLevels/spacebattle.dmm b/_maps/map_files/RandomZLevels/spacebattle.dmm
index 3f824e041db..8b0cfa0e30a 100644
--- a/_maps/map_files/RandomZLevels/spacebattle.dmm
+++ b/_maps/map_files/RandomZLevels/spacebattle.dmm
@@ -10,7 +10,7 @@
"aj" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ak" = (/obj/machinery/door/airlock/external,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"al" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
-"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
+"am" = (/obj/structure/table/reinforced,/obj/item/clothing/suit/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"an" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ao" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
"ap" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate2)
@@ -56,7 +56,7 @@
"bd" = (/obj/effect/landmark{name = "awaystart"},/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"be" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate2)
"bf" = (/obj/machinery/door/unpowered/shuttle,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate3)
-"bg" = (/obj/structure/table/reinforced,/obj/item/clothing/head/helmet/space/rig/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
+"bg" = (/obj/structure/table/reinforced,/obj/item/clothing/head/helmet/space/hardsuit/syndi,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bh" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bi" = (/obj/structure/table/reinforced,/obj/item/clothing/gloves/combat,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
"bj" = (/obj/machinery/sleeper,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate1)
@@ -201,7 +201,7 @@
"dS" = (/obj/structure/rack,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/awaymission/spacebattle/cruiser)
"dT" = (/obj/structure/closet/secure_closet/security,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/awaymission/spacebattle/cruiser)
"dU" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/awaymission/spacebattle/cruiser)
-"dV" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Andrew Thorn"; name = "Andrew Thorn"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"dV" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Andrew Thorn"; name = "Andrew Thorn"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"dW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"dX" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"dY" = (/obj/effect/landmark/corpse/engineer{mobname = "Clay Dawson"; name = "Clay Dawson"},/turf/simulated/floor/plasteel{tag = "icon-damaged5"; icon_state = "damaged5"},/area/awaymission/spacebattle/cruiser)
@@ -237,7 +237,7 @@
"eC" = (/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
"eD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"eE" = (/mob/living/simple_animal/hostile/syndicate/melee/space,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
-"eF" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Peter West"; name = "Peter West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"eF" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Peter West"; name = "Peter West"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"eG" = (/turf/simulated/shuttle/wall{tag = "icon-swall13"; icon_state = "swall13"; dir = 2},/area/awaymission/spacebattle/cruiser)
"eH" = (/turf/simulated/shuttle/wall{tag = "icon-swallc4"; icon_state = "swallc4"},/area/awaymission/spacebattle/cruiser)
"eI" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate4)
@@ -256,7 +256,7 @@
"eV" = (/obj/effect/landmark/corpse/bridgeofficer{mobname = "Kurt Kliest"; name = "Kurt Kliest"},/obj/item/weapon/gun/projectile/shotgun/automatic/combat,/obj/item/ammo_casing/shotgun,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"eW" = (/obj/item/ammo_casing/shotgun,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"eX" = (/obj/machinery/computer/crew,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
-"eY" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Eric Abnett"; name = "Eric Abnett"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"eY" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Eric Abnett"; name = "Eric Abnett"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"eZ" = (/obj/structure/closet/crate,/obj/item/clothing/glasses/night,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"fa" = (/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/awaymission/spacebattle/cruiser)
"fb" = (/turf/simulated/floor/plasteel{icon_state = "red"},/area/awaymission/spacebattle/cruiser)
@@ -346,7 +346,7 @@
"gH" = (/mob/living/simple_animal/hostile/syndicate/melee/space,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser)
"gI" = (/obj/machinery/computer/security,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
"gJ" = (/obj/machinery/computer/secure_data,/turf/simulated/floor/plasteel{tag = "icon-bluefull"; icon_state = "bluefull"},/area/awaymission/spacebattle/cruiser)
-"gK" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; name = "Jeremy Tailor"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"gK" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; name = "Jeremy Tailor"},/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"gL" = (/obj/machinery/porta_turret{dir = 8; emagged = 1; installation = /obj/item/weapon/gun/energy/lasercannon},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate7)
"gM" = (/turf/space,/turf/simulated/shuttle/wall{dir = 1; icon_state = "diagonalWall3"},/area/awaymission/spacebattle/syndicate7)
"gN" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/syndicate4)
@@ -364,7 +364,7 @@
"gZ" = (/obj/item/weapon/pickaxe,/obj/item/weapon/gun/energy/plasmacutter,/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"ha" = (/obj/item/weapon/circular_saw,/turf/simulated/floor/plasteel{icon_state = "white"},/area/awaymission/spacebattle/cruiser)
"hb" = (/obj/item/weapon/paper_bin,/turf/simulated/floor/wood,/area/awaymission/spacebattle/cruiser)
-"hc" = (/obj/effect/landmark/corpse/engineer/rig{corpseidjob = "Gunner"; mobname = "Dan Hedricks"; name = "Dan Hedricks"},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
+"hc" = (/obj/effect/landmark/corpse/engineer/hardsuit{corpseidjob = "Gunner"; mobname = "Dan Hedricks"; name = "Dan Hedricks"},/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood,/turf/simulated/floor/plating/airless,/area/awaymission/spacebattle/cruiser)
"hd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/awaymission/spacebattle/syndicate7)
"he" = (/obj/structure/table/reinforced,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate7)
"hf" = (/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/awaymission/spacebattle/syndicate7)
@@ -373,7 +373,7 @@
"hi" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"hj" = (/obj/structure/closet/crate/secure/plasma,/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
"hk" = (/obj/structure/closet/crate/medical,/obj/item/weapon/storage/firstaid/fire,/turf/simulated/floor/plating,/area/awaymission/spacebattle/cruiser)
-"hl" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig,/obj/item/clothing/head/helmet/space/rig,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
+"hl" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit,/obj/item/clothing/head/helmet/space/hardsuit,/turf/simulated/floor/plasteel,/area/awaymission/spacebattle/cruiser)
"hm" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/awaymission/spacebattle/cruiser)
"hn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
"ho" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/engine,/area/awaymission/spacebattle/cruiser)
diff --git a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
index 5a76cbedb96..403221f7c78 100644
--- a/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
+++ b/_maps/map_files/RandomZLevels/undergroundoutpost45.dmm
@@ -100,7 +100,7 @@
"bV" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 14; tag = "icon-manifold-r-f (NORTH)"},/turf/simulated/wall/rust,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bW" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10; level = 1},/turf/simulated/wall,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"bX" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"bY" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"bZ" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"ca" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
"cb" = (/turf/simulated/floor/plating{burnt = 1; icon_state = "panelscorched"; tag = "icon-panelscorched"},/area/awaycontent/a1{has_gravity = 1; name = "UO45 Central Hall"})
@@ -1260,30 +1260,30 @@
"yl" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a4{has_gravity = 1; name = "UO45 Mining"})
"ym" = (/obj/structure/ore_box,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yn" = (/obj/structure/closet/crate,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yo" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yp" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yq" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yr" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib2_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"ys" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yt" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yu" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/glowshroom/single,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yv" = (/obj/structure/alien/weeds,/obj/structure/stool/bed/nest,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yw" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yx" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yy" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yz" = (/obj/structure/alien/resin/membrane,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yA" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yB" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yC" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gib1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yD" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yE" = (/obj/structure/alien/weeds{tag = "icon-weeds2"; icon_state = "weeds2"},/obj/effect/decal/cleanable/blood/splatter{color = "red"},/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yF" = (/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yG" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 4; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yH" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; dir = 5; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yI" = (/obj/effect/decal/cleanable/blood/splatter{color = "red"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"yJ" = (/obj/structure/alien/weeds,/obj/effect/decal/cleanable/blood/gibs{color = "red"; icon_state = "gibdown1_flesh"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/rig,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
-"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yK" = (/obj/structure/alien/weeds{tag = "icon-weeds1"; icon_state = "weeds1"},/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/decal/cleanable/blood/tracks{color = "red"; desc = "Your instincts say you shouldn't be following these."; icon = 'icons/effects/blood.dmi'; icon_state = "tracks"},/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
+"yL" = (/obj/structure/alien/weeds,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating/airless/asteroid,/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/RandomZLevels/wildwest.dmm b/_maps/map_files/RandomZLevels/wildwest.dmm
index 07acec7105d..7d7001dc385 100644
--- a/_maps/map_files/RandomZLevels/wildwest.dmm
+++ b/_maps/map_files/RandomZLevels/wildwest.dmm
@@ -34,7 +34,7 @@
"aH" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/space,/area/space)
"aI" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/space)
"aJ" = (/obj/machinery/door/airlock/vault{locked = 1},/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
-"aK" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
+"aK" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/engine/cult,/area/awaymission/wwvault)
"aL" = (/obj/effect/forcefield{desc = "You can't get in. Heh."; layer = 1; name = "Blocker"},/turf/simulated/mineral,/area/awaymission/wwmines)
"aM" = (/turf/simulated/mineral/random,/area/awaymission/wwmines)
"aN" = (/turf/simulated/mineral,/area/awaymission/wwmines)
@@ -56,7 +56,7 @@
"bd" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"be" = (/turf/simulated/wall/mineral/sandstone,/area/space)
"bf" = (/obj/structure/largecrate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
-"bg" = (/obj/effect/landmark/corpse/miner/rig,/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
+"bg" = (/obj/effect/landmark/corpse/miner/hardsuit,/obj/effect/mine/dnascramble,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"bh" = (/turf/simulated/floor/wood,/area/awaymission/wwmines)
"bi" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"bj" = (/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibup1"; icon_state = "gibup1"},/turf/simulated/floor/wood,/area/awaymission/wwmines)
@@ -64,7 +64,7 @@
"bl" = (/mob/living/simple_animal/hostile/syndicate/ranged,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bm" = (/obj/structure/closet/crate,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bn" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/wood,/area/awaymission/wwmines)
-"bo" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
+"bo" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
"bp" = (/obj/structure/lattice,/turf/space,/area/space)
"bq" = (/obj/effect/mine/dnascramble,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"br" = (/obj/structure/closet/crate,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/awaymission/wwrefine)
@@ -135,7 +135,7 @@
"cE" = (/obj/item/weapon/reagent_containers/food/condiment/peppermill,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"cF" = (/obj/item/weapon/reagent_containers/food/condiment/saltshaker,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"cG" = (/obj/item/toy/sword,/turf/simulated/floor/wood,/area/awaymission/wwgov)
-"cH" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwgov)
+"cH" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cI" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cJ" = (/obj/structure/mineral_door/wood{tag = "icon-woodopening"; icon_state = "woodopening"},/turf/simulated/floor/wood,/area/awaymission/wwgov)
"cK" = (/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/carpet,/area/awaymission/wwgov)
@@ -169,7 +169,7 @@
"dm" = (/obj/effect/mine/gas/plasma,/obj/item/ammo_box/c10mm,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"dn" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
"do" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand4"; icon_state = "ironsand4"},/area/awaymission/wwgov)
-"dp" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"dp" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"dq" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand12"; icon_state = "ironsand12"},/area/awaymission/wwgov)
"dr" = (/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand14"; icon_state = "ironsand14"},/area/awaymission/wwgov)
"ds" = (/obj/structure/toilet,/mob/living/simple_animal/hostile/creature,/turf/simulated/floor/plasteel{tag = "icon-white"; icon_state = "white"},/area/awaymission/wwgov)
@@ -231,7 +231,7 @@
"ex" = (/obj/structure/stool/bed/chair/comfy/beige{dir = 8},/obj/effect/decal/cleanable/blood/gibs/body{tag = "icon-gibdown1"; icon_state = "gibdown1"},/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"ey" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand7"; icon_state = "ironsand7"},/area/awaymission/wwgov)
"ez" = (/obj/structure/sign/vacuum,/turf/simulated/wall/r_wall,/area/awaymission/wwrefine)
-"eA" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
+"eA" = (/obj/effect/decal/cleanable/blood/splatter,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/carpet,/area/awaymission/wwmines)
"eB" = (/obj/effect/decal/cleanable/blood/splatter,/turf/simulated/wall/mineral/sandstone,/area/awaymission/wwmines)
"eC" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand14"; icon_state = "ironsand14"},/area/awaymission/wwgov)
"eD" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/window/reinforced{tag = "icon-fwindow (NORTH)"; icon_state = "fwindow"; dir = 1},/obj/structure/grille,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
@@ -281,7 +281,7 @@
"fv" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/obj/structure/lattice,/turf/space,/area/space)
"fw" = (/mob/living/simple_animal/hostile/syndicate,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"fx" = (/obj/effect/decal/cleanable/blood/gibs/body,/turf/simulated/floor/plating/ironsand{tag = "icon-ironsand1"; icon_state = "ironsand1"},/area/awaymission/wwmines)
-"fy" = (/obj/effect/mine/dnascramble,/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/wood,/area/awaymission/wwmines)
+"fy" = (/obj/effect/mine/dnascramble,/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fz" = (/obj/structure/stool/bed/chair/wood/normal,/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
"fA" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/grass,/area/awaymission/wwgov)
"fB" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/grass,/area/awaymission/wwgov)
@@ -292,7 +292,7 @@
"fG" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{tag = "icon-fwindow"; icon_state = "fwindow"},/turf/simulated/floor/grass,/area/awaymission/wwgov)
"fH" = (/obj/structure/window/reinforced{tag = "icon-fwindow (WEST)"; icon_state = "fwindow"; dir = 8},/turf/simulated/floor/plasteel,/area/space)
"fI" = (/turf/simulated/floor/plasteel,/area/space)
-"fJ" = (/obj/effect/landmark/corpse/miner/rig,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
+"fJ" = (/obj/effect/landmark/corpse/miner/hardsuit,/turf/simulated/floor/plasteel,/area/awaymission/wwrefine)
"fK" = (/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fL" = (/obj/item/weapon/gun/projectile/revolver/russian,/turf/simulated/floor/wood,/area/awaymission/wwmines)
"fM" = (/obj/structure/stool/bed/chair/wood/normal{dir = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "barber"},/area/awaymission/wwmines)
diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 3bd59e019b9..5500643cf4b 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -71,7 +71,7 @@
"abs" = (/obj/structure/stool/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abt" = (/obj/structure/computerframe{anchored = 1},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abu" = (/obj/structure/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
-"abv" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
+"abv" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abw" = (/obj/structure/rack,/obj/item/clothing/suit/space/syndicate/black/med,/obj/item/clothing/head/helmet/space/syndicate/black/med,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"abx" = (/obj/machinery/light/small,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/abandoned)
"aby" = (/turf/simulated/shuttle/plating,/turf/simulated/shuttle/wall/interior{tag = "icon-swall_f5"; icon_state = "swall_f5"},/area/shuttle/abandoned)
@@ -515,7 +515,7 @@
"ajU" = (/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
"ajV" = (/turf/simulated/floor/carpet,/area/security/hos)
"ajW" = (/obj/structure/table/woodentable,/obj/item/device/taperecorder{pixel_y = 0},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/hos)
-"ajX" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
+"ajX" = (/obj/structure/rack,/obj/item/weapon/tank/oxygen,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/item/clothing/shoes/magboots,/obj/item/weapon/tank/jetpack/oxygen,/obj/effect/decal/warning_stripes/east,/turf/simulated/floor/plasteel,/area/security/podbay)
"ajY" = (/obj/structure/shuttle/engine/heater,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating/airless,/area/shuttle/vox)
"ajZ" = (/obj/structure/rack,/obj/item/clothing/accessory/storage/black_vest,/obj/item/clothing/suit/space/vox/medic,/obj/item/clothing/head/helmet/space/vox/medic,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"aka" = (/obj/structure/rack,/obj/item/weapon/pneumatic_cannon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/harpoon,/obj/item/weapon/tank/nitrogen,/obj/machinery/light/spot{tag = "icon-tube1 (EAST)"; icon_state = "tube1"; dir = 4},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
@@ -573,11 +573,11 @@
"ala" = (/obj/machinery/door/firedoor,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 8},/area/security/permabrig)
"alb" = (/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Prison Gate"; name = "Prison Blast Doors"; opacity = 0},/obj/machinery/door/airlock/glass_security{name = "Prison Wing"; req_access_txt = "2"},/turf/simulated/floor/plasteel{icon_state = "red"; dir = 4},/area/security/permabrig)
"alc" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/security/permabrig)
-"ald" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"ald" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/obj/item/device/radio/intercom/department/security{pixel_x = -28},/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"ale" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/decal/warning_stripes/southwest,/obj/structure/rack,/obj/item/key/security,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"alf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/effect/decal/warning_stripes/south,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
"alg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeast,/obj/vehicle/secway,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/security/securearmoury)
-"alh" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/security,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
+"alh" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/security,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/security,/turf/simulated/floor/plasteel{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"ali" = (/turf/simulated/wall/r_wall,/area/security/securehallway)
"alj" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 2; icon_state = "0-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/security/securehallway)
"alk" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/security/securehallway)
@@ -632,8 +632,8 @@
"amh" = (/obj/structure/grille{density = 0; icon_state = "brokengrille"},/obj/structure/lattice,/turf/space,/area/space)
"ami" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"amj" = (/obj/item/clothing/head/collectable/xenom,/obj/item/clothing/head/chicken,/obj/item/weapon/aiModule/syndicate,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"amk" = (/obj/item/weapon/spacecash/c1000,/obj/item/weapon/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"aml" = (/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"amk" = (/obj/item/stack/spacecash/c1000,/obj/item/stack/spacecash/c500,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"aml" = (/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"amm" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel,/area/security/range)
"amn" = (/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor/plasteel,/area/security/range)
"amo" = (/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/range)
@@ -673,7 +673,7 @@
"amW" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space)
"amX" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/power/tracker,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk2"; icon_state = "catwalk2"},/area/solar/auxstarboard)
"amY" = (/obj/structure/AIcore,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
-"amZ" = (/obj/item/weapon/spacecash/c200,/obj/item/weapon/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
+"amZ" = (/obj/item/stack/spacecash/c200,/obj/item/stack/spacecash/c50,/obj/structure/stool/bed/chair{dir = 1},/obj/machinery/light/spot,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"ana" = (/obj/item/weapon/storage/box/zipties,/turf/simulated/shuttle/floor4/vox,/area/shuttle/vox)
"anb" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/brig,/turf/simulated/floor/plasteel,/area/security/prisonlockers)
"anc" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/security/prisonlockers)
@@ -6797,7 +6797,7 @@
"cAK" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/wall/r_wall,/area/toxins/xenobiology)
"cAM" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "xeno_airlock_control"; name = "Xenobiology Access Button"; pixel_x = -24; pixel_y = 0; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "xeno_airlock_exterior"; locked = 1; name = "Xenobiology External Airlock"; req_access_txt = "55"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
-"cAN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
+"cAN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cAO" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_engineering{name = "Mechanic Workshop"; req_access_txt = "70"; req_one_access_txt = "0"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cAP" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
"cAQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/wall/r_wall,/area/toxins/misc_lab)
@@ -6996,8 +6996,8 @@
"cEB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/medical{name = "Isolation B"; req_access_txt = "5"},/turf/simulated/floor/plasteel,/area/medical/patient_b)
"cEC" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"cED" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 10},/area/medical/biostorage)
-"cEE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage)
-"cEF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/rig/medical,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/biostorage)
+"cEE" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{dir = 0; icon_state = "blue"},/area/medical/biostorage)
+"cEF" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/medical,/obj/item/clothing/mask/gas,/obj/item/clothing/head/helmet/space/hardsuit/medical,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 6},/area/medical/biostorage)
"cEG" = (/obj/structure/barricade/wooden,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cEH" = (/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
"cEI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/xenobiology)
@@ -7142,7 +7142,7 @@
"cHr" = (/obj/machinery/atmospherics/binary/valve{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHs" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/misc_lab)
"cHt" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
-"cHu" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
+"cHu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engine/mechanic_workshop)
"cHv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "mechpod"; name = "Mechanic's Workshop Inner Door"; opacity = 0},/turf/simulated/floor/engine,/area/engine/mechanic_workshop)
"cHw" = (/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/engine/mechanic_workshop)
"cHx" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/engine/mechanic_workshop)
@@ -7152,7 +7152,6 @@
"cHB" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Chief Engineer"; req_access_txt = "56"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cHC" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHD" = (/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
-"cHE" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHF" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plasteel{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"cHG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
"cHH" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/plasteel,/area/hallway/primary/aft)
@@ -7807,10 +7806,10 @@
"cUg" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/machinery/light{dir = 1},/obj/item/weapon/cartridge/engineering{pixel_x = 3},/obj/item/weapon/cartridge/engineering{pixel_x = -3; pixel_y = 2},/obj/item/weapon/cartridge/engineering{pixel_x = 4; pixel_y = 5},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cUh" = (/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/power/apc{cell_type = 25000; dir = 1; name = "Engineering Engine Super APC"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/engineering)
"cUi" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/engine/hardsuitstorage)
-"cUj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
-"cUm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUj" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/light{dir = 1},/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUl" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
+"cUm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cUn" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor/plating,/area/engine/chiefs_office)
"cUo" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/obj/structure/table/reinforced,/obj/item/weapon/rcd,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/clothing/glasses/meson{pixel_y = 4},/obj/item/device/megaphone,/obj/item/device/lock_buster,/mob/living/simple_animal/parrot/Poly,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cUp" = (/obj/machinery/requests_console{announcementConsole = 1; department = "Chief Engineer's Desk"; departmentType = 7; name = "Chief Engineer Requests Console"; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/photocopier,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -7867,7 +7866,7 @@
"cVo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cVp" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel,/area/engine/hardsuitstorage)
"cVq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor/plating,/area/engine/chiefs_office)
-"cVr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/rig/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/elite,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
+"cVr" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/item/clothing/shoes/magboots/advance,/obj/item/clothing/suit/space/hardsuit/elite,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/elite,/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cVs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cVt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
"cVu" = (/obj/structure/stool/bed/chair/office/light,/obj/effect/landmark/start{name = "Chief Engineer"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "neutralfull"},/area/engine/chiefs_office)
@@ -8103,7 +8102,7 @@
"cZQ" = (/obj/effect/spawner/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor/plating,/area/engine/engineering)
"cZR" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/wall/r_wall,/area/engine/engineering)
"cZS" = (/turf/simulated/wall/r_wall,/area/atmos)
-"cZT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/atmos)
+"cZT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/turf/simulated/floor/plasteel,/area/atmos)
"cZU" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/turf/simulated/floor/plasteel,/area/atmos)
"cZV" = (/obj/machinery/atmospherics/binary/volume_pump/on{dir = 8; name = "Port to Filter"},/turf/simulated/floor/plasteel,/area/atmos)
"cZW" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/atmospherics/binary/valve,/turf/simulated/floor/plasteel,/area/atmos)
@@ -8145,7 +8144,7 @@
"daG" = (/turf/simulated/floor/plating,/area/engine/engineering)
"daH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/engine/engineering)
"daI" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/atmos)
-"daJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/atmos,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
+"daJ" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/atmos,/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"daK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plasteel,/area/atmos)
"daL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/atmos)
"daM" = (/obj/machinery/atmospherics/pipe/simple/visible/purple,/turf/simulated/floor/plasteel,/area/atmos)
@@ -8170,12 +8169,12 @@
"dbf" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology)
"dbg" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbh" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
-"dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/weapon/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"dbi" = (/obj/structure/closet/crate,/obj/item/clothing/under/color/lightpurple,/obj/item/stack/spacecash/c200,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"dbj" = (/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle)
"dbk" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage North"; dir = 4; network = list("SS13")},/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
"dbl" = (/obj/machinery/floodlight,/turf/simulated/floor/plating,/area/storage/secure)
-"dbm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
-"dbn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/engineering,/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
+"dbm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/obj/machinery/power/apc{dir = 1; name = "north bump Engineering"; pixel_x = 0; pixel_y = 24; shock_proof = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
+"dbn" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/obj/machinery/alarm{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
"dbo" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/plating{dir = 2; icon_state = "warnplate"; tag = "icon-warnplate (NORTH)"},/area/storage/secure)
"dbp" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/dispenser,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel,/area/engine/engineering)
"dbq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/plasteel,/area/engine/engineering)
@@ -9225,7 +9224,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAVcDIcAXcDJcAXcDKcDLcDMcDNcBbcDOcwxcDPcqBcgQcqzcvpaaaaaaaaaaaaaaacvpcDQcvocDRcDRcwFcDScDTcwIcDUcvocoLcqGcvpaaaaaaaaaaaacvqcDVcDWcDXcDXcvxcDYcvxcDZcsBcnycEacEbcEccEdcEecEecEecuHcEgcyDcEhcyDcEicvIcsLcsLcCWcEjcEkcElcEmcEncEocCWcEpcEqcErcEscEtcEucDfcEvcEwcExcDhcEycEzcEAcEBcECczbcxBcEDcEEcEFcxBcsLcBOcBPaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcEHcEIcEJcwXcELcEMcENcEOcDwcDwcEPcDwcDwcDycDAcDAcDAcEQbGHcERbGGbGHaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaciccEScETclAcidciecieckbckcckbciecieaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacEUcEUcEUcEUcEUcwxcEVcEWcEWcEWcEWcEWaXpcEYcEYcEYcEWcEWcEWcEWcEWcEWcEWcEYcEYcEYcvocvocvocvocvocvocvocqFcEZcFacFacFacFacFacvqcvxcvxcvxcvxcvxcvxcvxcFbcsBcnycFccFdcFecFfcFgcFhcFicFjcFkcFlcFmcFncFocvIcsLcsLcCWcFpcFqcFrcFscFscFtcCWcFucFvcFvcFwcFvcFxcFycFzcFzcFzcFAcFBcFCcFDcDlcFEczbcFFcFFcFFcBPcBPcsLcBOcBQaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaacDqcFHcFIcFJcFKcFLcFMcFNcFOcDwcDwcDwcDwcFPcFQcFRcFScFTcFUbGHcERbGGbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacicciccicciccidcidcieciecieciecifaabaabaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFYcFXcFZcFWcGacGbcGccGccGdcGecGfcGgcGhcGicGjcGkcGlcGmcGmcGncGmcGocGpcGpcGqcGrcGscGtcGucGtcGtcGtcGscGtcGtcGvcGwcGxcGycsBcnycGzcGAczVcGCcsDcGDczZcGEcGFcGGcGHcGIcGJcGKcsLcsLcCWcGLcGMcGNcGOcGPcGQcCWcGRcGScGTcGUcGVcGWcGXaaaaaaaaacFAcDhcGYcDhcDhcGZcHacHbcHccHdcHechfcsLcBOcBQaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaacBScBRcAMcHgcBScHhcHicHjcHkcHlcHmcHncDwcDwcHocHpcHqcHrcHsbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcHucFXcHvcHwcHxcHycHzcANcHzcAOcHCcHDcHEcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcFWcFXcFXcFXcFZcFWcHtcFXcANcFXcHvcHwcHxcHycHzcHucHzcAOcHCcHDclXcHDcHDcHFcnzcnzcHDcHGcHDcHDcHDcHDcHDcHDcHDcHDcHDcHDcHHcHIcHJcHKcHLcHMcHNcHOcHPcHQcHRcHScHTcHUcHVcHWcHXcHYcHZcAEcIacIbcIccIdcIecIfcIgcIhcDfcIicErcIjcIkcErcIlcGXaaaaaaaaacImcIncIocIpcIqcGZcIrcIscItcIucIvcracrecIwcBQaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaacBRcIxcIycIzcBRcAPcAPcAPcAPcAPcAPcIAcHncIBcICcIDcIEcAPcAPbGHcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacFVcIFcFXcIGcFXcFZcIHcIIcIJcIKcILcIMcINcIOcIPcIQcIRcIScBrcIUcIVcIWcIXcIYcqVcIZcqVcIUcJacIUcIUcIUcIUcIUcIUcIUcIUcIUcIUcJbcHDcJccJdcJecJfcJgcJhcJicJjcJkcJlcJmcJncJocJpcJqcJrcGHcrecJscJtcJucEmcElcEmcEmcJvcDfcJwcErcErcEscErcJxcGXaaaaaaaaacImcJycJzcJAcJBcJCcJDcJEcJFcHdcsLcuccJGcBOcBPaaaaaaaaaaaaaaaaabcBRcBRcBRcBRcBRcBRcBRcBRcBRcJHcJIcJJcxNcJKcJKcJLcBRaabcAPcAPcJMcAPcJNcJOcJPcAPcJQcuQcERbGGbZZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJRcJScEWcEWcEWcEWcEXcEYcEYcEYcEYcJTcEYcJUcJVcJVcJWcJXcJYcEYcJZcKacKbcKbcKccKbcKdcKbcKbcKecKfcKbcKbcKfcKfcKfcKbcKbcKbcKbcKgcKhcKicKjcKkcKlcCxcKncKocKncKncKncKncKpcKqcKrcKscKtcGKcsLcKucKvcKwcKxcKycKzcKAcKBcDfcKCcKDcKEcKFcKGcKHcFyaaaaaaaaacImcKIcKJcKKcIqcKLcKMcJDcKNcHdcKOchfchfcBOcBPaaaaaaaaaaaaaaaaaacBRcKPcKQcKRcKScKTcKUcKVcxNcKWcKXcKYcxNcJKcKZcLacBRaabaabcLbcLccLdcLecLfcLgcLbbGGbGGcERcLhbGHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaalwalwalwalvalvalwalvalvaabamhaabayiaaaayiayicLicLjcLkcLkcLkcLlcLmcEYcLncLocLpcLqcLrcLscEYcLtcLucKfcLvcLwcLxcLycLzcLAcLBcLCcLDcKbcLCcLEcLFcLGcLGcLHcKbcLIcLJcHCcLKcnycLLcLMcLNcLOcLPcLQcLPcLRcLScLTcLUcLVcLWcGKcGKcKucKvcCWcCWcLXcCWcCWcKvcLYcLZcLZcLZcMacLZcMbcFyaaaaaaaaacImcImcImcImcImcFFcMccMdcMecHdcsLcsLcMfcBOcBPaaaaaaaaaaaaaaaaaacBRcJKcMgcJKcMhcMicEHcJIcxNcxQcEfcxQcxNcJKcJKcMkcBRaabaaacLbcMlcMmcLecLecMncLbcMobGGcERbKlcMpaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z2.dmm b/_maps/map_files/cyberiad/z2.dmm
index 5f561cd6cd3..64462b9f731 100644
--- a/_maps/map_files/cyberiad/z2.dmm
+++ b/_maps/map_files/cyberiad/z2.dmm
@@ -252,6 +252,7 @@
"eR" = (/turf/simulated/floor/holofloor{dir = 4; icon_state = "red"},/area/holodeck/source_boxingcourt)
"eS" = (/turf/unsimulated/floor{tag = "icon-warnplate (SOUTHEAST)"; icon_state = "warnplate"; dir = 6},/area/centcom/control)
"eT" = (/turf/unsimulated/floor{dir = 4; icon_state = "carpetside"},/area/centcom/specops)
+"eU" = (/obj/structure/table/woodentable,/obj/item/stack/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"eX" = (/obj/structure/flora/tree/pine,/turf/simulated/floor/holofloor{tag = "icon-snow"; icon_state = "snow"},/area/holodeck/source_snowfield)
"eY" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor{tag = "icon-grimy"; icon_state = "grimy"; dir = 2},/area/holodeck/source_meetinghall)
"eZ" = (/turf/simulated/floor/holofloor{dir = 1; icon_state = "red"},/area/holodeck/source_basketball)
@@ -506,7 +507,6 @@
"ka" = (/turf/unsimulated/wall/abductor{icon_state = "alien18"},/area/abductor_ship)
"kb" = (/obj/machinery/light/spot{tag = "icon-tube1 (WEST)"; icon_state = "tube1"; dir = 8},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"kc" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/mugwort,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
-"kd" = (/obj/structure/table/woodentable,/obj/item/weapon/spacecash,/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/wizard_station)
"ke" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/red,/obj/item/clothing/shoes/sandal,/obj/item/clothing/head/wizard/red,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"kf" = (/obj/machinery/light/spot,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
"kg" = (/obj/structure/rack,/obj/item/clothing/suit/wizrobe/magusred,/obj/item/clothing/head/wizard/magus,/obj/item/weapon/twohanded/staff,/turf/unsimulated/floor{icon_state = "grimy"},/area/wizard_station)
@@ -1147,7 +1147,7 @@
"DB" = (/obj/structure/rack,/obj/item/clothing/mask/gas/swat{pixel_x = -3; pixel_y = 3},/obj/item/clothing/mask/gas/cyborg,/obj/item/clothing/mask/gas/voice,/obj/item/clothing/mask/balaclava{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DC" = (/obj/structure/rack,/obj/item/clothing/head/bandana,/obj/item/clothing/head/ushanka,/obj/item/clothing/head/helmet/roman/legionaire,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DD" = (/obj/structure/rack,/obj/item/clothing/head/helmet/swat/syndicate{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/deathsquad,/obj/item/clothing/head/helmet/space/deathsquad/beret{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"DE" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/rig/wizard{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/rig/syndi,/obj/item/clothing/head/helmet/space/santahat{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"DE" = (/obj/structure/rack,/obj/item/clothing/head/helmet/space/hardsuit/wizard{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/helmet/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/santahat{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DF" = (/obj/structure/rack,/obj/item/clothing/head/welding/flamedecal{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/welding/flamedecal/blue,/obj/item/clothing/head/welding/white{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DG" = (/obj/structure/rack,/obj/item/clothing/head/soft/black{pixel_x = -3; pixel_y = 3},/obj/item/clothing/head/soft/blue,/obj/item/clothing/head/soft/red{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"DH" = (/obj/structure/rack,/obj/item/weapon/storage/backpack/holding,/obj/item/weapon/storage/backpack/duffel/clown,/obj/item/weapon/storage/backpack/duffel/captain,/obj/item/weapon/storage/backpack/duffel/science,/obj/item/weapon/storage/backpack/duffel/syndie/ammo,/obj/item/weapon/storage/backpack/duffel/syndie/med,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -1176,7 +1176,7 @@
"Ef" = (/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/turf/unsimulated/wall{desc = "This window appears to be reinforced, it looks nearly impossible to break."; dir = 4; icon = 'icons/turf/shuttle.dmi'; icon_state = "window5_end"; name = "window"; opacity = 0; tag = "icon-window5 (EAST)"},/area/admin)
"Eg" = (/obj/structure/rack,/obj/item/clothing/under/syndicate{pixel_x = -3; pixel_y = 3},/obj/item/clothing/under/syndicate/combat,/obj/item/clothing/under/acj{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Eh" = (/obj/structure/mirror{pixel_y = -30},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
-"Ei" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/syndi{pixel_x = -3; pixel_y = 3},/obj/item/clothing/suit/space/rig/wizard,/obj/item/clothing/suit/space/santa{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
+"Ei" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/syndi{pixel_x = -3; pixel_y = 3},/obj/item/clothing/suit/space/hardsuit/wizard,/obj/item/clothing/suit/space/santa{pixel_x = 3; pixel_y = -3},/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ej" = (/obj/mecha/combat/marauder/mauler/loaded,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"Ek" = (/obj/mecha/combat/gygax/dark/loaded,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
"El" = (/obj/effect/decal/mecha_wreckage/phazon,/turf/unsimulated/floor{tag = "icon-floor"; icon_state = "floor"},/area/admin)
@@ -1450,7 +1450,7 @@ ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckck
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihiLiLikikikiMihiNiOiPihaNaNisaNaNaNaNaNititititaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNatauauauataNaNaNaNaNaNaNaNaNbZbZbZiZiZiZiZiZjajbjcjcjcjcjcjcjcjcjcjcjcjcjcjbjaiZiZiZiZiZbZbZbZaNaNaN
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihikikikikjdjdihihjeihihaNaNisaNaNaNaNaNitjgjhitaNaNaNaNaNaNaNaNaNaNmrmrmrmrmrmrmrmrmrmrmrmrmrmxmwatatatatataFaGaGaGaGaGaGaGaHatataIatataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihjAjAikjBjCjDihjEjejFihaNaNisaNaNaNaNaNititititititititititititaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmzmyataJaJaJaKauauauauauauauauaKaKaKauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
-ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkbikikjBkckdihkekfkgihaNaNisaNaNaNaNaNkikjkkklkmknkjkokpkqkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmBmAataKauauauauauauauaMauauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkCkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
+ckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkbikikjBkceUihkekfkgihaNaNisaNaNaNaNaNkikjkkklkmknkjkokpkqkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmBmAataKauauauauauauauaMauauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkCkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkJikikikikihihihihihihaNaNisaNaNaNaNaNkKkjknknkLknkjknkrkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNmDmCmFmEatbhauauauauauaubibibiauauauauauauaJataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpkBkTkBjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihkWkXkYkZiklalblcldleihaNaNisaNaNaNaNaNlgiBknknkLknkjkokpkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmGmEatbhauauauauaubjbibibibjauauauauauaKataNaNaNaNaNaNaNaNaNbZjljmbZbZbZbZbZjnjojpjpjpjpjpjpjpjpjpjpjpjpjpjqjnbZbZbZbZbZjmjrbZaNaNaN
aNckckckckckckckckckckckckckckckckckckckckckckckckckaNaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckckaNckckckckckckckckckckckckckckckckckckckckckckckaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNaNihlolplqikikiklrlsltluihaNaNisaNaNaNaNiClgiBknknknknlxknkrkrkrksaNaNmraNaNaNaNaNaNaNaNaNaNaNmrmEmEatbhauauauauauaubjbjbjauauauauauauauataNaNaNaNaNaNaNaNaNbZbZbZlBlBlBlBlBlClDjpjpjpjpjpjplEjpjpjpjpjpjplDlClBlBlBlBlBbZbZbZaNaNaN
diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm
index 0738ff80065..165e5e245be 100644
--- a/_maps/map_files/cyberiad/z3.dmm
+++ b/_maps/map_files/cyberiad/z3.dmm
@@ -4,6 +4,7 @@
"ad" = (/obj/docking_port/stationary{dheight = 9; dir = 2; dwidth = 5; height = 22; id = "syndicate_z3"; name = "south of telecomms"; width = 18},/turf/space,/area/space)
"ae" = (/obj/machinery/atmospherics/pipe/simple/visible{dir = 4},/obj/machinery/access_button{command = "cycle_interior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "interior access button"; pixel_x = -25; pixel_y = -25; req_access_txt = "61"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/plating,/area/tcommsat/powercontrol)
"af" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1381; master_tag = "telecoms_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "61"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/tcommsat/powercontrol)
+"ag" = (/obj/item/stack/spacecash,/turf/simulated/floor/engine,/area/tcommsat/computer)
"aT" = (/obj/structure/lattice,/turf/space,/area/space)
"ba" = (/turf/simulated/shuttle/wall{tag = "icon-swall_s6"; icon_state = "swall_s6"; dir = 2},/area/space)
"bb" = (/turf/simulated/shuttle/wall{tag = "icon-swall14"; icon_state = "swall14"; dir = 2},/area/space)
@@ -94,7 +95,6 @@
"do" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dp" = (/obj/structure/stool/bed/chair/office/dark{dir = 4},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dq" = (/obj/machinery/computer/telecomms/server{network = list("tcommsat")},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
-"dr" = (/obj/item/weapon/spacecash,/turf/simulated/floor/engine,/area/tcommsat/computer)
"ds" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 4; layer = 2.4; on = 1},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"dt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
"du" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
@@ -493,7 +493,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncncpcsctcucvcwcxcyczcpcqcqcqcqcqcqcqcqcAcqcBcCcDcEcFcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpcscscscHcIcJcKcLcMcNcqcGcOcPcQcRcScqcTcqcUcGcGcGcGcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctcVcWcXcKcYcZdacqdbcGdccGcGddcqcTcqdecGdfcGcGcGcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctctdgdhdidjdkdldmdndodfcGdpdqcqdrcqdsdtcGdudvdwcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctctdgdhdidjdkdldmdndodfcGdpdqcqagcqdsdtcGdudvdwcqcncncraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrcncpctcsctcVdxdydzdAdAdAdBdCdCdDdCdEdHdHdHcqdIdJcGdKdLdMdNdOdOdPdQdRaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWbWbWbWbWbWbWbWbWcbbWbWbWbWbWbWbWbWbWbWcrcncpctcsctcVdSdTdUdVdVdVcqdFcGdYcGcGeaebdHcqcqecedcqcqcqcqcncncrbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWbWcbbWbWbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTcrcncpcseecsefdScNdHdHdHdHdHdGeheiehdWemelemdHdHeneoepcseecscpcncrbWbWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/cyberiad/z4.dmm b/_maps/map_files/cyberiad/z4.dmm
index d1d1e19b27d..49a33f2eace 100644
--- a/_maps/map_files/cyberiad/z4.dmm
+++ b/_maps/map_files/cyberiad/z4.dmm
@@ -105,7 +105,7 @@
"ca" = (/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 4},/area/engiestation)
"cb" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/machinery/power/smes/engineering{input_attempt = 1; input_level = 50000; inputting = 1; output_level = 15000},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/engiestation)
"cc" = (/obj/machinery/power/terminal{dir = 8},/obj/structure/cable,/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 8},/area/engiestation)
-"cd" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/engineering,/obj/item/clothing/head/helmet/space/rig/engineering,/turf/simulated/floor/plasteel,/area/engiestation)
+"cd" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/engineering,/obj/item/clothing/head/helmet/space/hardsuit/engineering,/turf/simulated/floor/plasteel,/area/engiestation)
"ce" = (/obj/machinery/driver_button{id_tag = "constructiondriver1"; name = "Construction Driver #1"; pixel_x = 25},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plasteel,/area/engiestation)
"cf" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/engiestation/solars)
"cg" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/engiestation/solars)
diff --git a/_maps/map_files/cyberiad/z5.dmm b/_maps/map_files/cyberiad/z5.dmm
index 8de12fd2936..378418b3c61 100644
--- a/_maps/map_files/cyberiad/z5.dmm
+++ b/_maps/map_files/cyberiad/z5.dmm
@@ -1150,9 +1150,9 @@
"wf" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/plasteel{icon_state = "bar"},/area/mine/living_quarters)
"wg" = (/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wh" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor/plasteel,/area/mine/living_quarters)
-"wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva)
-"wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
-"wk" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wi" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/obj/machinery/firealarm{dir = 2; pixel_y = 24},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/plasteel,/area/mine/eva)
+"wj" = (/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wk" = (/obj/structure/rack,/obj/machinery/light/small{dir = 1},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wl" = (/turf/simulated/floor/plasteel/airless{dir = 5; icon_state = "asteroidfloor"; tag = "icon-asteroidfloor"},/area/mine/dangerous/explored)
"wm" = (/obj/structure/table,/obj/item/weapon/storage/backpack/satchel,/obj/item/clothing/glasses/meson,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
"wn" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Break Room"; req_access_txt = "54"},/turf/simulated/floor/plasteel,/area/mine/west_outpost)
@@ -1174,7 +1174,7 @@
"wD" = (/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/living_quarters)
"wE" = (/turf/simulated/wall,/area/mine/lobby)
"wF" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{name = "Mining Station Pod Bay"; req_access_txt = "54"},/obj/machinery/atmospherics/pipe/simple/hidden,/turf/simulated/floor/plasteel,/area/mine/lobby)
-"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/rig/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/rig/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
+"wG" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/obj/machinery/camera{c_tag = "Mining Outpost EVA"; dir = 4; network = list("Mining Outpost")},/obj/machinery/light_switch{pixel_x = -23; pixel_y = 0},/obj/structure/rack,/obj/item/clothing/suit/space/hardsuit/mining,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/hardsuit/mining,/turf/simulated/floor/plasteel,/area/mine/eva)
"wH" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4; level = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor/plasteel,/area/mine/eva)
"wJ" = (/obj/machinery/atmospherics/unary/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plasteel,/area/mine/eva)
diff --git a/_maps/map_files/templates/spacehotel/s_04.dmm b/_maps/map_files/templates/spacehotel/s_04.dmm
index 9648a7c707c..2764d377626 100644
--- a/_maps/map_files/templates/spacehotel/s_04.dmm
+++ b/_maps/map_files/templates/spacehotel/s_04.dmm
@@ -4,7 +4,7 @@
"d" = (/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"e" = (/obj/structure/rack,/obj/item/clothing/suit/syndicatefake,/obj/item/clothing/under/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"f" = (/obj/structure/rack,/obj/item/clothing/mask/gas/syndicate,/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
-"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/rig/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
+"g" = (/obj/structure/rack,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/item/clothing/suit/space/hardsuit/syndi,/obj/item/clothing/head/helmet/space/syndicate{pixel_x = -4},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"h" = (/obj/structure/dresser,/obj/structure/sign/poster{dir = 1; pixel_y = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"i" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/storage/fancy/cigarettes/syndicate{pixel_x = 8},/obj/structure/sign/poster{dir = 1; pixel_y = 32},/obj/structure/sign/poster{dir = 4; pixel_x = 32},/turf/unsimulated/floor{icon = 'icons/turf/shuttle.dmi'; icon_state = "floor4"},/area/template_noop)
"j" = (/obj/structure/window/reinforced/polarized{dir = 4; id = "room_s"},/turf/unsimulated/floor{dir = 8; icon_state = "whiteblue"},/area/template_noop)
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index 47c5689054c..0fe1a291b31 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -170,13 +170,13 @@ Pipelines + Other Objects -> Pipe network
var/unsafe_wrenching = FALSE
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src]...")
if(internal_pressure > 2*ONE_ATMOSPHERE)
to_chat(user, "As you begin unwrenching \the [src] a gush of air blows in your face... maybe you should reconsider?")
unsafe_wrenching = TRUE //Oh dear oh dear
- if(do_after(user, 40, target = src) && isnull(gcDestroyed))
+ if(do_after(user, 40 * W.toolspeed, target = src) && isnull(gcDestroyed))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src].", \
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index 993ba4d802f..a9071e5ba13 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -88,20 +88,6 @@
return 1
-/obj/machinery/atmospherics/binary/passive_gate/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
-
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
/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
@@ -142,27 +128,54 @@
to_chat(user, "Access denied.")
return
- interact(user)
-
+ add_fingerprint(user)
+ ui_interact(user)
+
/obj/machinery/atmospherics/binary/passive_gate/attack_ghost(mob/user)
- interact(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 385, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/passive_gate/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ return data
/obj/machinery/atmospherics/binary/passive_gate/Topic(href,href_list)
- if(..())
+ if(..())
return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num
- target_pressure = max(0, min(4500, new_pressure))
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
- update_icon()
- updateUsrDialog()
- return
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure))
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
-/obj/machinery/atmospherics/binary/passive_gate/attackby(var/obj/item/weapon/W, var/mob/user, params)
+ update_icon()
+ nanomanager.update_uis(src)
+
+/obj/machinery/atmospherics/binary/passive_gate/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(on)
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 824d3b1c5f0..908a5318dda 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -103,20 +103,6 @@ Thus, the two variables affect pump operation are set in New():
radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA)
return 1
-/obj/machinery/atmospherics/binary/pump/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
-
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output pressure:
- [round(target_pressure,0.1)]kPa | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
/obj/machinery/atmospherics/binary/pump/initialize()
..()
if(frequency)
@@ -162,24 +148,52 @@ Thus, the two variables affect pump operation are set in New():
to_chat(user, "Access denied.")
return
- interact(user)
-
+ add_fingerprint(user)
+ ui_interact(user)
+
/obj/machinery/atmospherics/binary/pump/attack_ghost(mob/user)
- interact(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 385, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/pump/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ return data
/obj/machinery/atmospherics/binary/pump/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num
- target_pressure = max(0, min(4500, new_pressure))
- investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
- usr.set_machine(src)
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure))
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+
update_icon()
- updateUsrDialog()
+ nanomanager.update_uis(src)
/obj/machinery/atmospherics/binary/pump/power_change()
var/old_stat = stat
@@ -187,7 +201,7 @@ Thus, the two variables affect pump operation are set in New():
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/binary/pump/attackby(var/obj/item/weapon/W, var/mob/user, params)
+/obj/machinery/atmospherics/binary/pump/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!(stat & NOPOWER) && on)
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index 99465e15d88..0ec613cb049 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -99,21 +99,6 @@ Thus, the two variables affect pump operation are set in New():
return 1
-/obj/machinery/atmospherics/binary/volume_pump/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
-
- var/dat = {"Power: [on?"On":"Off"]
- Desirable output flow:
- [round(transfer_rate,1)]l/s | Change
- "}
-
- var/datum/browser/popup = new(user, "atmo_pump", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_pump")
-
-
/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
@@ -153,24 +138,52 @@ Thus, the two variables affect pump operation are set in New():
to_chat(user, "Access denied.")
return
- interact(user)
-
+ add_fingerprint(user)
+ ui_interact(user)
+
/obj/machinery/atmospherics/binary/volume_pump/attack_ghost(mob/user)
- interact(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_pump.tmpl", name, 310, 115, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/binary/volume_pump/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["rate"] = round(transfer_rate)
+ data["max_rate"] = round(MAX_TRANSFER_RATE)
+ return data
/obj/machinery/atmospherics/binary/volume_pump/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
- if(href_list["set_transfer_rate"])
- var/new_transfer_rate = input(usr,"Enter new output volume (0-200l/s)","Flow control",transfer_rate) as num
- transfer_rate = max(0, min(200, new_transfer_rate))
- investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
- usr.set_machine(src)
+ . = TRUE
+ if(href_list["rate"])
+ var/rate = href_list["rate"]
+ if(rate == "max")
+ rate = MAX_TRANSFER_RATE
+ . = TRUE
+ else if(rate == "input")
+ rate = input("New transfer rate (0-[MAX_TRANSFER_RATE] L/s):", name, transfer_rate) as num|null
+ if(!isnull(rate))
+ . = TRUE
+ else if(text2num(rate) != null)
+ rate = text2num(rate)
+ . = TRUE
+ if(.)
+ transfer_rate = Clamp(rate, 0, MAX_TRANSFER_RATE)
+ investigate_log("was set to [transfer_rate] L/s by [key_name(usr)]", "atmos")
+
update_icon()
- updateUsrDialog()
+ nanomanager.update_uis(src)
/obj/machinery/atmospherics/binary/volume_pump/power_change()
var/old_stat = stat
@@ -178,7 +191,7 @@ Thus, the two variables affect pump operation are set in New():
if(old_stat != stat)
update_icon()
-/obj/machinery/atmospherics/binary/volume_pump/attackby(var/obj/item/weapon/W, var/mob/user, params)
+/obj/machinery/atmospherics/binary/volume_pump/attackby(obj/item/weapon/W, mob/user, params)
if(!istype(W, /obj/item/weapon/wrench))
return ..()
if(!(stat & NOPOWER) && on)
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index 2eca090d086..a247d6f93a3 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -107,9 +107,9 @@
to_chat(user, "You cannot unwrench [src], it is too exerted due to internal pressure.")
add_fingerprint(user)
return 1
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src].", \
diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
index b8ecae86b85..109c3a2fa04 100755
--- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm
@@ -6,8 +6,6 @@
name = "gas filter"
- var/temp = null // -- TLE
-
var/target_pressure = ONE_ATMOSPHERE
var/filter_type = 0
@@ -146,9 +144,9 @@ Filter types:
/obj/machinery/atmospherics/trinary/filter/initialize()
set_frequency(frequency)
..()
-
-/obj/machinery/atmospherics/trinary/filter/attack_ghost(mob/user)
- interact(user)
+
+/obj/machinery/atmospherics/trinary/filter/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/atmospherics/trinary/filter/attack_hand(mob/user)
if(..())
@@ -157,63 +155,52 @@ Filter types:
if(!allowed(user))
to_chat(user, "Access denied.")
return
-
- interact(user)
-
-/obj/machinery/atmospherics/trinary/filter/interact(mob/user)
- user.set_machine(src)
+
add_fingerprint(user)
-
- var/dat
- var/current_filter_type
- switch(filter_type)
- if(0)
- current_filter_type = "Toxins"
- if(1)
- current_filter_type = "Oxygen"
- if(2)
- current_filter_type = "Nitrogen"
- if(3)
- current_filter_type = "Carbon Dioxide"
- if(4)
- current_filter_type = "Nitrous Oxide"
- if(-1)
- current_filter_type = "Nothing"
- else
- current_filter_type = "ERROR - Report this bug to the admin, please!"
+ ui_interact(user)
- dat += {"
- Power: [on?"On":"Off"]
- Filtering: [current_filter_type]
- Set Filter Type:
- Toxins
- Oxygen
- Nitrogen
- Carbon Dioxide
- Nitrous Oxide
- Nothing
-
Desirable output pressure:
- [target_pressure]kPa | Change
- "}
+/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_filter.tmpl", name, 475, 155, state = state)
+ ui.open()
- var/datum/browser/popup = new(user, "atmo_filter", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_filter")
+/obj/machinery/atmospherics/trinary/filter/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ data["filter_type"] = filter_type
+ return data
/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list) // -- TLE
if(..())
return 1
- usr.set_machine(src)
- add_fingerprint(usr)
- if(href_list["filterset"])
- filter_type = text2num(href_list["filterset"])
- if(href_list["temp"])
- temp = null
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num
- target_pressure = max(0, min(4500, new_pressure))
+
if(href_list["power"])
- on=!on
+ on = !on
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure) && !..())
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ if(href_list["filter"])
+ filter_type = text2num(href_list["filter"])
+ investigate_log("was set to filter [filter_type] by [key_name(usr)]", "atmos")
+ . = TRUE
+
update_icon()
- updateUsrDialog()
\ No newline at end of file
+ nanomanager.update_uis(src)
\ 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 f859175cdb2..0657f8d9f5f 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/mixer.dm
@@ -16,7 +16,7 @@
icon_state = "mmap"
flipped = 1
-/obj/machinery/atmospherics/trinary/mixer/update_icon(var/safety = 0)
+/obj/machinery/atmospherics/trinary/mixer/update_icon(safety = 0)
if(flipped)
icon_state = "m"
else
@@ -107,9 +107,9 @@
parent3.update = 1
return 1
-
-/obj/machinery/atmospherics/trinary/mixer/attack_ghost(mob/user)
- interact(user)
+
+/obj/machinery/atmospherics/trinary/mixer/attack_ghost(mob/user)
+ ui_interact(user)
/obj/machinery/atmospherics/trinary/mixer/attack_hand(mob/user)
if(..())
@@ -118,52 +118,61 @@
if(!allowed(user))
to_chat(user, "Access denied.")
return
-
- interact(user)
-
-/obj/machinery/atmospherics/trinary/mixer/interact(mob/user)
- user.set_machine(src)
- add_fingerprint(user)
- 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/datum/browser/popup = new(user, "atmo_mixer", name, 400, 400)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "atmo_mixer")
+ add_fingerprint(user)
+ ui_interact(user)
+
+/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
+ user.set_machine(src)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "atmos_mixer.tmpl", name, 370, 165, state = state)
+ ui.open()
+
+/obj/machinery/atmospherics/trinary/mixer/ui_data(mob/user)
+ var/list/data = list()
+ data["on"] = on
+ data["pressure"] = round(target_pressure)
+ data["max_pressure"] = round(MAX_OUTPUT_PRESSURE)
+ data["node1_concentration"] = round(node1_concentration*100)
+ data["node2_concentration"] = round(node2_concentration*100)
+ return data
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
if(..())
return 1
+
if(href_list["power"])
on = !on
- if(href_list["set_press"])
- var/new_pressure = input(usr,"Enter new output pressure (0-4500kPa)","Pressure control",target_pressure) as num
- target_pressure = max(0, min(4500, new_pressure))
- if(href_list["node1_c"])
- var/value = text2num(href_list["node1_c"])
+ investigate_log("was turned [on ? "on" : "off"] by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["pressure"])
+ var/pressure = href_list["pressure"]
+ if(pressure == "max")
+ pressure = MAX_OUTPUT_PRESSURE
+ . = TRUE
+ else if(pressure == "input")
+ pressure = input("New output pressure (0-[MAX_OUTPUT_PRESSURE] kPa):", name, target_pressure) as num|null
+ if(!isnull(pressure) && !..())
+ . = TRUE
+ else if(text2num(pressure) != null)
+ pressure = text2num(pressure)
+ . = TRUE
+ if(.)
+ target_pressure = Clamp(pressure, 0, MAX_OUTPUT_PRESSURE)
+ investigate_log("was set to [target_pressure] kPa by [key_name(usr)]", "atmos")
+ if(href_list["node1"])
+ var/value = text2num(href_list["node1"])
node1_concentration = max(0, min(1, node1_concentration + value))
node2_concentration = max(0, min(1, node2_concentration - value))
- if(href_list["node2_c"])
- var/value = text2num(href_list["node2_c"])
+ investigate_log("was set to [node1_concentration] % on node 1 by [key_name(usr)]", "atmos")
+ . = TRUE
+ if(href_list["node2"])
+ var/value = text2num(href_list["node2"])
node2_concentration = max(0, min(1, node2_concentration + value))
node1_concentration = max(0, min(1, node1_concentration - value))
+ investigate_log("was set to [node2_concentration] % on node 2 by [key_name(usr)]", "atmos")
+ . = TRUE
+
update_icon()
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
\ No newline at end of file
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
index a2ba4429ffa..eabeccb641f 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_pump.dm
@@ -325,9 +325,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the vent.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the vent shut.", "You weld the vent shut.", "You hear welding.")
welded = 1
@@ -345,13 +345,15 @@
if(istype(W, /obj/item/weapon/screwdriver))
if(!welded)
if(open)
- to_chat(user, " Now closing the vent.")
- if(do_after(user, 20, target = src))
+ to_chat(user, "Now closing the vent.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
open = 0
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
else
- to_chat(user, " Now opening the vent.")
- if(do_after(user, 20, target = src))
+ to_chat(user, "Now opening the vent.")
+ if(do_after(user, 20 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
open = 1
user.visible_message("[user] screwdrivers the vent shut.", "You screwdriver the vent shut.", "You hear a screwdriver.")
return
diff --git a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
index 5554723c945..6747b103972 100644
--- a/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary_devices/vent_scrubber.dm
@@ -375,9 +375,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "Now welding the scrubber.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
if(!welded)
user.visible_message("[user] welds the scrubber shut.", "You weld the vent scrubber.", "You hear welding.")
welded = 1
diff --git a/code/datums/cargoprofile.dm b/code/datums/cargoprofile.dm
index becb3ccee56..8576cba828d 100644
--- a/code/datums/cargoprofile.dm
+++ b/code/datums/cargoprofile.dm
@@ -147,7 +147,7 @@
name = "Exotic materials"
id = "exotics"
blacklist = null
- whitelist = list(/obj/item/weapon/coin, /obj/item/weapon/spacecash, /obj/item/seeds,
+ whitelist = list(/obj/item/weapon/coin, /obj/item/stack/spacecash, /obj/item/seeds,
/obj/item/stack/sheet/mineral,/obj/item/stack/sheet/wood,/obj/item/stack/sheet/leather)
/datum/cargoprofile/organics
diff --git a/code/datums/helper_datums/construction_datum.dm b/code/datums/helper_datums/construction_datum.dm
index 0a17435c5c0..04054c17632 100644
--- a/code/datums/helper_datums/construction_datum.dm
+++ b/code/datums/helper_datums/construction_datum.dm
@@ -46,17 +46,20 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
@@ -65,7 +68,7 @@
return 0
else
C.use(4)
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack))
var/obj/item/stack/S = used_atom
if(S.amount < 5)
diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index 27947b9e608..e6a43aae6b9 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -1204,10 +1204,11 @@
else if(href_list["obj_announce"])
var/obj_count = 1
- to_chat(current, "\blue Your current objectives:")
+ to_chat(current, "
Your current objectives:")
for(var/datum/objective/objective in objectives)
to_chat(current, "Objective #[obj_count]: [objective.explanation_text]")
obj_count++
+ current << 'sound/ambience/alarm4.ogg'
log_admin("[key_name(usr)] has announced [key_name(current)]'s objectives")
message_admins("[key_name_admin(usr)] has announced [key_name_admin(current)]'s objectives")
diff --git a/code/datums/outfits/outfit_admin.dm b/code/datums/outfits/outfit_admin.dm
index e0027a71302..9c5448f40c6 100644
--- a/code/datums/outfits/outfit_admin.dm
+++ b/code/datums/outfits/outfit_admin.dm
@@ -46,12 +46,12 @@
-/datum/outfit/admin/rig
+/datum/outfit/admin/hardsuit
back = /obj/item/weapon/tank/jetpack/oxygen
mask = /obj/item/clothing/mask/breath
id = /obj/item/weapon/card/id
-/datum/outfit/admin/rig/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
+/datum/outfit/admin/hardsuit/post_equip(mob/living/carbon/human/H, visualsOnly = FALSE)
. = ..()
if(visualsOnly)
return
@@ -63,42 +63,42 @@
var/obj/item/weapon/card/id/I = H.wear_id
if(istype(I))
- apply_to_card(I, H, get_all_accesses(), "RIG Tester")
+ apply_to_card(I, H, get_all_accesses(), "Hardsuit Tester")
-/datum/outfit/admin/rig/engineer
- name = "Engineer RIG"
- suit = /obj/item/clothing/suit/space/rig
- head = /obj/item/clothing/head/helmet/space/rig
+/datum/outfit/admin/hardsuit/engineer
+ name = "Engineer Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit
+ head = /obj/item/clothing/head/helmet/space/hardsuit
-/datum/outfit/admin/rig/ce
- name = "CE RIG"
- suit = /obj/item/clothing/suit/space/rig/elite
- head = /obj/item/clothing/head/helmet/space/rig/elite
+/datum/outfit/admin/hardsuit/ce
+ name = "CE Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/elite
+ head = /obj/item/clothing/head/helmet/space/hardsuit/elite
-/datum/outfit/admin/rig/mining
- name = "Mining RIG"
- suit = /obj/item/clothing/suit/space/rig/mining
- head = /obj/item/clothing/head/helmet/space/rig/mining
+/datum/outfit/admin/hardsuit/mining
+ name = "Mining Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/mining
+ head = /obj/item/clothing/head/helmet/space/hardsuit/mining
-/datum/outfit/admin/rig/syndi
- name = "Syndi RIG"
- suit = /obj/item/clothing/suit/space/rig/syndi
- head = /obj/item/clothing/head/helmet/space/rig/syndi
+/datum/outfit/admin/hardsuit/syndi
+ name = "Syndi Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi
+ head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
-/datum/outfit/admin/rig/wizard
- name = "Wizard RIG"
- suit = /obj/item/clothing/suit/space/rig/wizard
- head = /obj/item/clothing/head/helmet/space/rig/wizard
+/datum/outfit/admin/hardsuit/wizard
+ name = "Wizard Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/wizard
+ head = /obj/item/clothing/head/helmet/space/hardsuit/wizard
-/datum/outfit/admin/rig/medical
- name = "Medical RIG"
- suit = /obj/item/clothing/suit/space/rig/medical
- head = /obj/item/clothing/head/helmet/space/rig/medical
+/datum/outfit/admin/hardsuit/medical
+ name = "Medical Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/medical
+ head = /obj/item/clothing/head/helmet/space/hardsuit/medical
-/datum/outfit/admin/rig/atmos
- name = "Atmos RIG"
- suit = /obj/item/clothing/suit/space/rig/atmos
- head = /obj/item/clothing/head/helmet/space/rig/atmos
+/datum/outfit/admin/hardsuit/atmos
+ name = "Atmos Hardsuit"
+ suit = /obj/item/clothing/suit/space/hardsuit/atmos
+ head = /obj/item/clothing/head/helmet/space/hardsuit/atmos
/datum/outfit/admin/tournament
@@ -480,7 +480,7 @@
)
var/briefcase_contents = list(
- /obj/item/weapon/spacecash/c1000 = 3,
+ /obj/item/stack/spacecash/c1000 = 3,
/obj/item/weapon/gun/energy/kinetic_accelerator/crossbow = 1,
/obj/item/weapon/gun/projectile/revolver/mateba = 1,
/obj/item/ammo_box/a357 = 1,
@@ -663,9 +663,9 @@
/datum/outfit/admin/syndicate/operative
name = "Syndicate Operative"
- suit = /obj/item/clothing/suit/space/rig/syndi
+ suit = /obj/item/clothing/suit/space/hardsuit/syndi
belt = /obj/item/weapon/storage/belt/military
- head = /obj/item/clothing/head/helmet/space/rig/syndi
+ head = /obj/item/clothing/head/helmet/space/hardsuit/syndi
mask = /obj/item/clothing/mask/gas/syndicate
l_ear = /obj/item/device/radio/headset/syndicate/alt
glasses = /obj/item/clothing/glasses/night
@@ -905,12 +905,12 @@
name = "Singuloth Knight"
uniform = /obj/item/clothing/under/syndicate/combat
- suit = /obj/item/clothing/suit/space/rig/singuloth
+ suit = /obj/item/clothing/suit/space/hardsuit/singuloth
back = /obj/item/weapon/twohanded/knighthammer
belt = /obj/item/weapon/claymore/ceremonial
gloves = /obj/item/clothing/gloves/combat
shoes = /obj/item/clothing/shoes/magboots
- head = /obj/item/clothing/head/helmet/space/rig/singuloth
+ head = /obj/item/clothing/head/helmet/space/hardsuit/singuloth
mask = /obj/item/clothing/mask/breath
l_ear = /obj/item/device/radio/headset/ert
glasses = /obj/item/clothing/glasses/meson/cyber
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index f48f6ca3fc7..652f54af440 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -140,13 +140,13 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/obj/effect/proc_holder/spell/noclothes/clothes_spell = locate() in (user.mob_spell_list | (user.mind ? user.mind.spell_list : list()))
if((ishuman(user) && clothes_req) && !istype(clothes_spell))//clothes check
var/mob/living/carbon/human/H = user
- if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
to_chat(user, "I don't feel strong enough without my robe.")
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
to_chat(user, "I don't feel strong enough without my sandals.")
return 0
- if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
to_chat(user, "I don't feel strong enough without my hat.")
return 0
else if(!ishuman(user))
@@ -442,11 +442,11 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
var/clothcheck = locate(/obj/effect/proc_holder/spell/noclothes) in user.mob_spell_list
var/clothcheck2 = user.mind && (locate(/obj/effect/proc_holder/spell/noclothes) in user.mind.spell_list)
if(clothes_req && !clothcheck && !clothcheck2) //clothes check
- if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/rig/wizard))
+ if(!istype(H.wear_suit, /obj/item/clothing/suit/wizrobe) && !istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit/wizard))
return 0
if(!istype(H.shoes, /obj/item/clothing/shoes/sandal))
return 0
- if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(!istype(H.head, /obj/item/clothing/head/wizard) && !istype(H.head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
return 0
else
if(clothes_req || human_req)
diff --git a/code/datums/spells/conjure.dm b/code/datums/spells/conjure.dm
index fe0ffd9c1c0..2ca7d0fcddd 100644
--- a/code/datums/spells/conjure.dm
+++ b/code/datums/spells/conjure.dm
@@ -23,7 +23,7 @@
targets -= T
playsound(get_turf(src), cast_sound, 50, 1)
- if(do_after(user,delay, target = user))
+ if(do_after(user, delay, target = user))
for(var/i=0,i\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]",
- (A.locked ? "The door bolts have fallen!" : "The door bolts look up."),
- ((A.lights && haspower) ? "The door bolt lights are on." : "The door bolt lights are off!"),
- ((haspower) ? "The test light is on." : "The test light is off!"),
- ((A.aiControlDisabled==0 && !A.emagged && haspower) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."),
- ((A.safe==0 && haspower) ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."),
- ((A.normalspeed==0 && haspower) ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."),
- ((A.emergency && haspower) ? "The emergency lights are on." : "The emergency lights are off."))
-/datum/wires/airlock/UpdateCut(var/index, var/mended)
+ . += "The door bolts [A.locked ? "have fallen!" : "look up."]"
+ . += "The door bolt lights are [(A.lights && haspower) ? "on." : "off!"]"
+ . += "The test light is [haspower ? "on." : "off!"]"
+ . += "The 'AI control allowed' light is [(A.aiControlDisabled == 0 && !A.emagged && haspower) ? "on" : "off"]."
+ . += "The 'Check Wiring' light is [(A.safe == 0 && haspower) ? "on" : "off"]."
+ . += "The 'Check Timing Mechanism' light is [(A.normalspeed == 0 && haspower) ? "on" : "off"]."
+ . += "The emergency lights are [(A.emergency && haspower) ? "on" : "off"]."
+
+/datum/wires/airlock/UpdateCut(index, mended)
var/obj/machinery/door/airlock/A = holder
switch(index)
@@ -113,8 +152,9 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(AIRLOCK_WIRE_LIGHT)
A.lights = mended
A.update_icon()
+ ..()
-/datum/wires/airlock/UpdatePulsed(var/index)
+/datum/wires/airlock/UpdatePulsed(index)
var/obj/machinery/door/airlock/A = holder
switch(index)
@@ -176,4 +216,6 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048
if(AIRLOCK_WIRE_LIGHT)
A.lights = !A.lights
- A.update_icon()
\ No newline at end of file
+ A.update_icon()
+
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm
index a31d075ecc7..f412e96b5ee 100644
--- a/code/datums/wires/alarm.dm
+++ b/code/datums/wires/alarm.dm
@@ -9,19 +9,37 @@ var/const/AALARM_WIRE_SYPHON = 4
var/const/AALARM_WIRE_AI_CONTROL = 8
var/const/AALARM_WIRE_AALARM = 16
+/datum/wires/alarm/GetWireName(index)
+ switch(index)
+ if(AALARM_WIRE_IDSCAN)
+ return "ID Scan"
+
+ if(AALARM_WIRE_POWER)
+ return "Power"
+
+ if(AALARM_WIRE_SYPHON)
+ return "Syphon"
+
+ if(AALARM_WIRE_AI_CONTROL)
+ return "AI Control"
+
+ if(AALARM_WIRE_AALARM)
+ return "Atmospherics Alarm"
-/datum/wires/alarm/CanUse(var/mob/living/L)
+/datum/wires/alarm/CanUse(mob/living/L)
var/obj/machinery/alarm/A = holder
if(A.wiresexposed)
return 1
return 0
-/datum/wires/alarm/GetInteractWindow()
+/datum/wires/alarm/get_status()
+ . = ..()
var/obj/machinery/alarm/A = holder
- . += ..()
- . += text("
\n[(A.locked ? "The Air Alarm is locked." : "The Air Alarm is unlocked.")]
\n[((A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "The Air Alarm is offline." : "The Air Alarm is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+ . += "The Air Alarm is [A.locked ? "" : "un"]locked."
+ . += "The Air Alarm is [(A.shorted || (A.stat & (NOPOWER|BROKEN))) ? "offline." : "working properly!"]"
+ . += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
-/datum/wires/alarm/UpdateCut(var/index, var/mended)
+/datum/wires/alarm/UpdateCut(index, mended)
var/obj/machinery/alarm/A = holder
switch(index)
if(AALARM_WIRE_IDSCAN)
@@ -50,8 +68,9 @@ var/const/AALARM_WIRE_AALARM = 16
if(A.alarm_area.atmosalert(2, A))
A.post_alert(2)
A.update_icon()
+ ..()
-/datum/wires/alarm/UpdatePulsed(var/index)
+/datum/wires/alarm/UpdatePulsed(index)
var/obj/machinery/alarm/A = holder
switch(index)
if(AALARM_WIRE_IDSCAN)
@@ -92,3 +111,4 @@ var/const/AALARM_WIRE_AALARM = 16
if(A.alarm_area.atmosalert(0, A))
A.post_alert(0)
A.update_icon()
+ ..()
diff --git a/code/datums/wires/apc.dm b/code/datums/wires/apc.dm
index ff566bb7e6d..a1ef61513fb 100644
--- a/code/datums/wires/apc.dm
+++ b/code/datums/wires/apc.dm
@@ -7,19 +7,35 @@ var/const/APC_WIRE_MAIN_POWER1 = 2
var/const/APC_WIRE_MAIN_POWER2 = 4
var/const/APC_WIRE_AI_CONTROL = 8
-/datum/wires/apc/GetInteractWindow()
+/datum/wires/apc/GetWireName(index)
+ switch(index)
+ if(APC_WIRE_IDSCAN)
+ return "ID Scan"
+
+ if(APC_WIRE_MAIN_POWER1)
+ return "Primary Power"
+
+ if(APC_WIRE_MAIN_POWER2)
+ return "Secondary Power"
+
+ if(APC_WIRE_AI_CONTROL)
+ return "AI Control"
+
+/datum/wires/apc/get_status()
+ . = ..()
var/obj/machinery/power/apc/A = holder
- . += ..()
- . += text("
\n[(A.locked ? "The APC is locked." : "The APC is unlocked.")]
\n[(A.shorted ? "The APCs power has been shorted." : "The APC is working properly!")]
\n[(A.aidisabled ? "The 'AI control allowed' light is off." : "The 'AI control allowed' light is on.")]")
+ . += "The APC is [A.locked ? "" : "un"]locked."
+ . += A.shorted ? "The APCs power has been shorted." : "The APC is working properly!"
+ . += "The 'AI control allowed' light is [A.aidisabled ? "off" : "on"]."
-/datum/wires/apc/CanUse(var/mob/living/L)
+/datum/wires/apc/CanUse(mob/living/L)
var/obj/machinery/power/apc/A = holder
if(A.wiresexposed)
return 1
return 0
-/datum/wires/apc/UpdatePulsed(var/index)
+/datum/wires/apc/UpdatePulsed(index)
var/obj/machinery/power/apc/A = holder
@@ -51,9 +67,9 @@ var/const/APC_WIRE_AI_CONTROL = 8
A.aidisabled = 0
A.updateDialog()
- A.updateDialog()
+ ..()
-/datum/wires/apc/UpdateCut(var/index, var/mended)
+/datum/wires/apc/UpdateCut(index, mended)
var/obj/machinery/power/apc/A = holder
switch(index)
@@ -75,4 +91,4 @@ var/const/APC_WIRE_AI_CONTROL = 8
else
if(A.aidisabled == 1)
A.aidisabled = 0
- A.updateDialog()
\ No newline at end of file
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/autolathe.dm b/code/datums/wires/autolathe.dm
index 011c2f9dc90..644a472acf3 100644
--- a/code/datums/wires/autolathe.dm
+++ b/code/datums/wires/autolathe.dm
@@ -1,5 +1,4 @@
/datum/wires/autolathe
-
holder_type = /obj/machinery/autolathe
wire_count = 10
@@ -7,10 +6,23 @@ var/const/AUTOLATHE_HACK_WIRE = 1
var/const/AUTOLATHE_SHOCK_WIRE = 2
var/const/AUTOLATHE_DISABLE_WIRE = 4
-/datum/wires/autolathe/GetInteractWindow()
+/datum/wires/autolathe/GetWireName(index)
+ switch(index)
+ if(AUTOLATHE_HACK_WIRE)
+ return "Hack"
+
+ if(AUTOLATHE_SHOCK_WIRE)
+ return "Shock"
+
+ if(AUTOLATHE_DISABLE_WIRE)
+ return "Disable"
+
+/datum/wires/autolathe/get_status()
+ . = ..()
var/obj/machinery/autolathe/A = holder
- . += ..()
- . += text("
The red light is [A.disabled ? "off" : "on"].
The green light is [A.shocked ? "off" : "on"].
The blue light is [A.hacked ? "off" : "on"].
")
+ . += "The red light is [A.disabled ? "off" : "on"]."
+ . += "The green light is [A.shocked ? "off" : "on"]."
+ . += "The blue light is [A.hacked ? "off" : "on"]."
/datum/wires/autolathe/CanUse()
var/obj/machinery/autolathe/A = holder
@@ -27,6 +39,7 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
A.shocked = !mended
if(AUTOLATHE_DISABLE_WIRE)
A.disabled = !mended
+ ..()
/datum/wires/autolathe/UpdatePulsed(index)
if(IsIndexCut(index))
@@ -35,19 +48,27 @@ var/const/AUTOLATHE_DISABLE_WIRE = 4
switch(index)
if(AUTOLATHE_HACK_WIRE)
A.adjust_hacked(!A.hacked)
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.adjust_hacked(0)
- Interact(usr)
+ updateUIs()
if(AUTOLATHE_SHOCK_WIRE)
A.shocked = !A.shocked
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.shocked = 0
- Interact(usr)
+ updateUIs()
if(AUTOLATHE_DISABLE_WIRE)
A.disabled = !A.disabled
+ updateUIs()
spawn(50)
if(A && !IsIndexCut(index))
A.disabled = 0
- Interact(usr)
+ updateUIs()
+
+/datum/wires/autolathe/proc/updateUIs()
+ nanomanager.update_uis(src)
+ if(holder)
+ nanomanager.update_uis(holder)
\ No newline at end of file
diff --git a/code/datums/wires/camera.dm b/code/datums/wires/camera.dm
index f6ffd2ed427..ee25f8c3898 100644
--- a/code/datums/wires/camera.dm
+++ b/code/datums/wires/camera.dm
@@ -5,17 +5,15 @@
holder_type = /obj/machinery/camera
wire_count = 6
-/datum/wires/camera/GetInteractWindow()
-
+/datum/wires/camera/get_status()
. = ..()
var/obj/machinery/camera/C = holder
- . += "
\n[(C.view_range == initial(C.view_range) ? "The focus light is on." : "The focus light is off.")]"
- . += "
\n[(C.can_use() ? "The power link light is on." : "The power link light is off.")]"
- . += "
\n[(C.light_disabled ? "The camera light is off." : "The camera light is on.")]"
- . += "
\n[(C.alarm_on ? "The alarm light is on." : "The alarm light is off.")]"
- return .
+ . += "The focus light is [(C.view_range == initial(C.view_range)) ? "on" : "off"]."
+ . += "The power link light is [C.can_use() ? "on" : "off"]."
+ . += "The camera light is [C.light_disabled ? "off" : "on"]."
+ . += "The alarm light is [C.alarm_on ? "on" : "off"]."
-/datum/wires/camera/CanUse(var/mob/living/L)
+/datum/wires/camera/CanUse(mob/living/L)
var/obj/machinery/camera/C = holder
if(!C.panel_open)
return 0
@@ -28,7 +26,27 @@ var/const/CAMERA_WIRE_ALARM = 8
var/const/CAMERA_WIRE_NOTHING1 = 16
var/const/CAMERA_WIRE_NOTHING2 = 32
-/datum/wires/camera/UpdateCut(var/index, var/mended)
+/datum/wires/camera/GetWireName(index)
+ switch(index)
+ if(CAMERA_WIRE_FOCUS)
+ return "Focus"
+
+ if(CAMERA_WIRE_POWER)
+ return "Power"
+
+ if(CAMERA_WIRE_LIGHT)
+ return "Light"
+
+ if(CAMERA_WIRE_ALARM)
+ return "Alarm"
+
+ if(CAMERA_WIRE_NOTHING1)
+ return "Nothing"
+
+ if(CAMERA_WIRE_NOTHING2)
+ return "Nothing"
+
+/datum/wires/camera/UpdateCut(index, mended)
var/obj/machinery/camera/C = holder
switch(index)
@@ -48,9 +66,9 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
C.triggerCameraAlarm()
else
C.cancelCameraAlarm()
- return
+ ..()
-/datum/wires/camera/UpdatePulsed(var/index)
+/datum/wires/camera/UpdatePulsed(index)
var/obj/machinery/camera/C = holder
if(IsIndexCut(index))
return
@@ -67,7 +85,7 @@ var/const/CAMERA_WIRE_NOTHING2 = 32
if(CAMERA_WIRE_ALARM)
C.visible_message("[bicon(C)] *beep*", "[bicon(C)] *beep*")
- return
+ ..()
/datum/wires/camera/proc/CanDeconstruct()
if(IsIndexCut(CAMERA_WIRE_POWER) && IsIndexCut(CAMERA_WIRE_FOCUS) && IsIndexCut(CAMERA_WIRE_LIGHT) && IsIndexCut(CAMERA_WIRE_NOTHING1) && IsIndexCut(CAMERA_WIRE_NOTHING2))
diff --git a/code/datums/wires/explosive.dm b/code/datums/wires/explosive.dm
index d653729dfd3..db397d63d42 100644
--- a/code/datums/wires/explosive.dm
+++ b/code/datums/wires/explosive.dm
@@ -3,27 +3,34 @@
var/const/WIRE_EXPLODE = 1
+/datum/wires/explosive/GetWireName(index)
+ switch(index)
+ if(WIRE_EXPLODE)
+ return "Explode"
+
/datum/wires/explosive/proc/explode()
return
-/datum/wires/explosive/UpdatePulsed(var/index)
+/datum/wires/explosive/UpdatePulsed(index)
switch(index)
if(WIRE_EXPLODE)
explode()
+ ..()
-/datum/wires/explosive/UpdateCut(var/index, var/mended)
+/datum/wires/explosive/UpdateCut(index, mended)
switch(index)
if(WIRE_EXPLODE)
if(!mended)
explode()
+ ..()
/datum/wires/explosive/gibtonite
holder_type = /obj/item/weapon/twohanded/required/gibtonite
-/datum/wires/explosive/gibtonite/CanUse(var/mob/living/L)
+/datum/wires/explosive/gibtonite/CanUse(mob/L)
return 1
-/datum/wires/explosive/gibtonite/UpdateCut(var/index, var/mended)
+/datum/wires/explosive/gibtonite/UpdateCut(index, mended)
return
/datum/wires/explosive/gibtonite/explode()
diff --git a/code/datums/wires/mulebot.dm b/code/datums/wires/mulebot.dm
index 7b59479720d..ec083c47f48 100644
--- a/code/datums/wires/mulebot.dm
+++ b/code/datums/wires/mulebot.dm
@@ -2,6 +2,7 @@
random = 1
holder_type = /mob/living/simple_animal/bot/mulebot
wire_count = 10
+ window_x = 410
var/const/WIRE_POWER1 = 1 // power connections
var/const/WIRE_POWER2 = 2
@@ -13,19 +14,42 @@ var/const/WIRE_REMOTE_RX = 64 // remote recv functions
var/const/WIRE_REMOTE_TX = 128 // remote trans status
var/const/WIRE_BEACON_RX = 256 // beacon ping recv
-/datum/wires/mulebot/CanUse(var/mob/living/L)
+/datum/wires/mulebot/GetWireName(index)
+ switch(index)
+ if(WIRE_POWER1)
+ return "Primary Power"
+
+ if(WIRE_POWER2)
+ return "Secondary Power"
+
+ if(WIRE_AVOIDANCE)
+ return "Mob Avoidance"
+
+ if(WIRE_LOADCHECK)
+ return "Load Checking"
+
+ if(WIRE_MOTOR1)
+ return "Primary Motor"
+
+ if(WIRE_MOTOR2)
+ return "Secondary Motor"
+
+ if(WIRE_REMOTE_RX)
+ return "Remote Signal Receiver"
+
+ if(WIRE_REMOTE_TX)
+ return "Remote Signal Sender"
+
+ if(WIRE_BEACON_RX)
+ return "Navigation Beacon Receiver"
+
+/datum/wires/mulebot/CanUse(mob/living/L)
var/mob/living/simple_animal/bot/mulebot/M = holder
if(M.open)
return 1
return 0
-// So the wires do not open a new window, handle the interaction ourselves.
-/datum/wires/mulebot/Interact(var/mob/living/user)
- if(CanUse(user))
- var/mob/living/simple_animal/bot/mulebot/M = holder
- M.interact(user)
-
-/datum/wires/mulebot/UpdatePulsed(var/index)
+/datum/wires/mulebot/UpdatePulsed(index)
switch(index)
if(WIRE_POWER1, WIRE_POWER2)
holder.visible_message("\blue [bicon(holder)] The charge light flickers.")
@@ -37,6 +61,7 @@ var/const/WIRE_BEACON_RX = 256 // beacon ping recv
holder.visible_message("\blue [bicon(holder)] The drive motor whines briefly.")
else
holder.visible_message("\blue [bicon(holder)] You hear a radio crackle.")
+ ..()
// HELPER PROCS
diff --git a/code/datums/wires/nuclearbomb.dm b/code/datums/wires/nuclearbomb.dm
index 0297bea8508..5743872acf5 100644
--- a/code/datums/wires/nuclearbomb.dm
+++ b/code/datums/wires/nuclearbomb.dm
@@ -7,33 +7,46 @@ var/const/NUCLEARBOMB_WIRE_LIGHT = 1
var/const/NUCLEARBOMB_WIRE_TIMING = 2
var/const/NUCLEARBOMB_WIRE_SAFETY = 4
-/datum/wires/nuclearbomb/CanUse(var/mob/living/L)
+/datum/wires/nuclearbomb/GetWireName(index)
+ switch(index)
+ if(NUCLEARBOMB_WIRE_LIGHT)
+ return "Bomb Light"
+
+ if(NUCLEARBOMB_WIRE_TIMING)
+ return "Bomb Timing"
+
+ if(NUCLEARBOMB_WIRE_SAFETY)
+ return "Bomb Safety"
+
+/datum/wires/nuclearbomb/CanUse(mob/living/L)
var/obj/machinery/nuclearbomb/N = holder
if(N.panel_open)
return 1
return 0
-/datum/wires/nuclearbomb/GetInteractWindow()
+/datum/wires/nuclearbomb/get_status()
+ . = ..()
var/obj/machinery/nuclearbomb/N = holder
- . += ..()
- . += "
The device is [N.timing ? "shaking!" : "still."]
"
- . += "The device is is [N.safety ? "quiet" : "whirring"].
"
- . += "The lights are [N.lighthack ? "static" : "functional"].
"
+ . += "The device is [N.timing ? "shaking!" : "still."]"
+ . += "The device is is [N.safety ? "quiet" : "whirring"]."
+ . += "The lights are [N.lighthack ? "static" : "functional"]."
-/datum/wires/nuclearbomb/UpdatePulsed(var/index)
+/datum/wires/nuclearbomb/UpdatePulsed(index)
var/obj/machinery/nuclearbomb/N = holder
switch(index)
if(NUCLEARBOMB_WIRE_LIGHT)
N.lighthack = !N.lighthack
+ updateUIs()
spawn(100)
N.lighthack = !N.lighthack
+ updateUIs()
if(NUCLEARBOMB_WIRE_TIMING)
if(N.timing)
- spawn
- message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP)")
- N.explode()
+ message_admins("[key_name_admin(usr)] pulsed a nuclear bomb's detonation wire, causing it to explode (JMP)")
+ N.explode()
if(NUCLEARBOMB_WIRE_SAFETY)
N.safety = !N.safety
+ updateUIs()
spawn(100)
N.safety = !N.safety
if(N.safety == 1)
@@ -45,15 +58,15 @@ var/const/NUCLEARBOMB_WIRE_SAFETY = 4
N.icon_state = "nuclearbomb1"
else
N.visible_message("\blue The [N] emits a quiet whirling noise!")
-
-/datum/wires/nuclearbomb/UpdateCut(var/index, var/mended)
+ updateUIs()
+
+/datum/wires/nuclearbomb/UpdateCut(index, mended)
var/obj/machinery/nuclearbomb/N = holder
switch(index)
if(NUCLEARBOMB_WIRE_SAFETY)
if(N.timing)
- spawn
- message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP)")
- N.explode()
+ message_admins("[key_name_admin(usr)] cut a nuclear bomb's timing wire, causing it to explode (JMP)")
+ N.explode()
if(NUCLEARBOMB_WIRE_TIMING)
if(!N.lighthack)
if(N.icon_state == "nuclearbomb2")
@@ -62,3 +75,8 @@ var/const/NUCLEARBOMB_WIRE_SAFETY = 4
bomb_set = 0
if(NUCLEARBOMB_WIRE_LIGHT)
N.lighthack = !N.lighthack
+
+/datum/wires/nuclearbomb/proc/updateUIs()
+ nanomanager.update_uis(src)
+ if(holder)
+ nanomanager.update_uis(holder)
\ No newline at end of file
diff --git a/code/datums/wires/particle_accelerator.dm b/code/datums/wires/particle_accelerator.dm
index 53a166a79e7..1ed68b799f4 100644
--- a/code/datums/wires/particle_accelerator.dm
+++ b/code/datums/wires/particle_accelerator.dm
@@ -6,15 +6,28 @@ var/const/PARTICLE_TOGGLE_WIRE = 1 // Toggles whether the PA is on or not.
var/const/PARTICLE_STRENGTH_WIRE = 2 // Determines the strength of the PA.
var/const/PARTICLE_INTERFACE_WIRE = 4 // Determines the interface showing up.
var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
-//var/const/PARTICLE_NOTHING_WIRE = 16 // Blank wire
-/datum/wires/particle_acc/control_box/CanUse(var/mob/living/L)
+/datum/wires/particle_acc/control_box/GetWireName(index)
+ switch(index)
+ if(PARTICLE_TOGGLE_WIRE)
+ return "Power Toggle"
+
+ if(PARTICLE_STRENGTH_WIRE)
+ return "Strength"
+
+ if(PARTICLE_INTERFACE_WIRE)
+ return "Interface"
+
+ if(PARTICLE_LIMIT_POWER_WIRE)
+ return "Maximum Power"
+
+/datum/wires/particle_acc/control_box/CanUse(mob/living/L)
var/obj/machinery/particle_accelerator/control_box/C = holder
if(C.construction_state == 2)
return 1
return 0
-/datum/wires/particle_acc/control_box/UpdatePulsed(var/index)
+/datum/wires/particle_acc/control_box/UpdatePulsed(index)
var/obj/machinery/particle_accelerator/control_box/C = holder
switch(index)
@@ -29,8 +42,9 @@ var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
if(PARTICLE_LIMIT_POWER_WIRE)
C.visible_message("[bicon(C)][C] makes a large whirring noise.")
+ ..()
-/datum/wires/particle_acc/control_box/UpdateCut(var/index, var/mended)
+/datum/wires/particle_acc/control_box/UpdateCut(index, mended)
var/obj/machinery/particle_accelerator/control_box/C = holder
switch(index)
@@ -49,4 +63,5 @@ var/const/PARTICLE_LIMIT_POWER_WIRE = 8 // Determines how strong the PA can be.
if(PARTICLE_LIMIT_POWER_WIRE)
C.strength_upper_limit = (mended ? 2 : 3)
if(C.strength_upper_limit < C.strength)
- C.remove_strength()
\ No newline at end of file
+ C.remove_strength()
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/radio.dm b/code/datums/wires/radio.dm
index 6c2fb9713da..ffbff381060 100644
--- a/code/datums/wires/radio.dm
+++ b/code/datums/wires/radio.dm
@@ -6,13 +6,24 @@ var/const/WIRE_SIGNAL = 1
var/const/WIRE_RECEIVE = 2
var/const/WIRE_TRANSMIT = 4
-/datum/wires/radio/CanUse(var/mob/living/L)
+/datum/wires/radio/GetWireName(index)
+ switch(index)
+ if(WIRE_SIGNAL)
+ return "Signal"
+
+ if(WIRE_RECEIVE)
+ return "Receiver"
+
+ if(WIRE_TRANSMIT)
+ return "Transmitter"
+
+/datum/wires/radio/CanUse(mob/living/L)
var/obj/item/device/radio/R = holder
if(R.b_stat)
return 1
return 0
-/datum/wires/radio/UpdatePulsed(var/index)
+/datum/wires/radio/UpdatePulsed(index)
var/obj/item/device/radio/R = holder
switch(index)
if(WIRE_SIGNAL)
@@ -24,8 +35,9 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = !R.broadcasting && !IsIndexCut(WIRE_SIGNAL)
+ ..()
-/datum/wires/radio/UpdateCut(var/index, var/mended)
+/datum/wires/radio/UpdateCut(index, mended)
var/obj/item/device/radio/R = holder
switch(index)
if(WIRE_SIGNAL)
@@ -37,3 +49,4 @@ var/const/WIRE_TRANSMIT = 4
if(WIRE_TRANSMIT)
R.broadcasting = mended && !IsIndexCut(WIRE_SIGNAL)
+ ..()
diff --git a/code/datums/wires/robot.dm b/code/datums/wires/robot.dm
index 082cdd9d6d6..bc03e80c327 100644
--- a/code/datums/wires/robot.dm
+++ b/code/datums/wires/robot.dm
@@ -19,16 +19,32 @@ var/const/BORG_WIRE_CAMERA = 4
var/const/BORG_WIRE_AI_CONTROL = 8 // Not used on MoMMIs
var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
-/datum/wires/robot/GetInteractWindow()
+/datum/wires/robot/GetWireName(index)
+ switch(index)
+ if(BORG_WIRE_MAIN_POWER)
+ return "Main Power"
+
+ if(BORG_WIRE_LOCKED_DOWN)
+ return "Lockdown"
+
+ if(BORG_WIRE_CAMERA)
+ return "Camera"
+
+ if(BORG_WIRE_AI_CONTROL)
+ return "AI Control"
+
+ if(BORG_WIRE_LAWCHECK)
+ return "Law Check"
+/datum/wires/robot/get_status()
. = ..()
var/mob/living/silicon/robot/R = holder
- . += text("
\n[(R.lawupdate ? "The LawSync light is on." : "The LawSync light is off.")]
\n[(R.connected_ai ? "The AI link light is on." : "The AI link light is off.")]")
- . += text("
\n[((!isnull(R.camera) && R.camera.status == 1) ? "The Camera light is on." : "The Camera light is off.")]
\n")
- . += text("
\n[(R.lockcharge ? "The lockdown light is on." : "The lockdown light is off.")]")
- return .
+ . += "The LawSync light is [R.lawupdate ? "on" : "off"]."
+ . += "The AI link light is [R.connected_ai ? "on" : "off"]."
+ . += "The Camera light is [(R.camera && R.camera.status == 1) ? "on" : "off"]."
+ . += "The lockdown light is [R.lockcharge ? "on" : "off"]."
-/datum/wires/robot/UpdateCut(var/index, var/mended)
+/datum/wires/robot/UpdateCut(index, mended)
var/mob/living/silicon/robot/R = holder
switch(index)
@@ -57,9 +73,10 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
if(BORG_WIRE_LOCKED_DOWN)
R.SetLockdown(!mended)
+ ..()
-/datum/wires/robot/UpdatePulsed(var/index)
+/datum/wires/robot/UpdatePulsed(index)
var/mob/living/silicon/robot/R = holder
switch(index)
@@ -76,8 +93,9 @@ var/const/BORG_WIRE_LAWCHECK = 16 // Not used on MoMMIs
if(BORG_WIRE_LOCKED_DOWN)
R.SetLockdown(!R.lockcharge) // Toggle
+ ..()
-/datum/wires/robot/CanUse(var/mob/living/L)
+/datum/wires/robot/CanUse(mob/living/L)
var/mob/living/silicon/robot/R = holder
if(R.wiresexposed)
return 1
diff --git a/code/datums/wires/smartfridge.dm b/code/datums/wires/smartfridge.dm
index b611497e796..53b33e0fd72 100644
--- a/code/datums/wires/smartfridge.dm
+++ b/code/datums/wires/smartfridge.dm
@@ -10,9 +10,20 @@ var/const/SMARTFRIDGE_WIRE_ELECTRIFY = 1
var/const/SMARTFRIDGE_WIRE_THROW = 2
var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
-/datum/wires/smartfridge/CanUse(var/mob/living/L)
+/datum/wires/smartfridge/GetWireName(index)
+ switch(index)
+ if(SMARTFRIDGE_WIRE_ELECTRIFY)
+ return "Electrification"
+
+ if(SMARTFRIDGE_WIRE_THROW)
+ return "Item Throw"
+
+ if(SMARTFRIDGE_WIRE_IDSCAN)
+ return "ID Scan"
+
+/datum/wires/smartfridge/CanUse(mob/living/L)
var/obj/machinery/smartfridge/S = holder
- if(!istype(L, /mob/living/silicon))
+ if(!issilicon(L))
if(S.seconds_electrified)
if(S.shock(L, 100))
return 0
@@ -20,14 +31,14 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
return 1
return 0
-/datum/wires/smartfridge/GetInteractWindow()
+/datum/wires/smartfridge/get_status()
+ . = ..()
var/obj/machinery/smartfridge/S = holder
- . += ..()
- . += "
The orange light is [S.seconds_electrified ? "off" : "on"].
"
- . += "The red light is [S.shoot_inventory ? "off" : "blinking"].
"
- . += "A [S.scan_id ? "purple" : "yellow"] light is on.
"
+ . += "The orange light is [S.seconds_electrified ? "off" : "on"]."
+ . += "The red light is [S.shoot_inventory ? "off" : "blinking"]."
+ . += "A [S.scan_id ? "purple" : "yellow"] light is on."
-/datum/wires/smartfridge/UpdatePulsed(var/index)
+/datum/wires/smartfridge/UpdatePulsed(index)
var/obj/machinery/smartfridge/S = holder
switch(index)
if(SMARTFRIDGE_WIRE_THROW)
@@ -36,8 +47,9 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
S.seconds_electrified = 30
if(SMARTFRIDGE_WIRE_IDSCAN)
S.scan_id = !S.scan_id
+ ..()
-/datum/wires/smartfridge/UpdateCut(var/index, var/mended)
+/datum/wires/smartfridge/UpdateCut(index, mended)
var/obj/machinery/smartfridge/S = holder
switch(index)
if(SMARTFRIDGE_WIRE_THROW)
@@ -49,3 +61,4 @@ var/const/SMARTFRIDGE_WIRE_IDSCAN = 4
S.seconds_electrified = -1
if(SMARTFRIDGE_WIRE_IDSCAN)
S.scan_id = 1
+ ..()
diff --git a/code/datums/wires/syndicatebomb.dm b/code/datums/wires/syndicatebomb.dm
index 3fa81883fce..d1fe6217058 100644
--- a/code/datums/wires/syndicatebomb.dm
+++ b/code/datums/wires/syndicatebomb.dm
@@ -9,14 +9,30 @@ var/const/WIRE_DELAY = 4 // Raises the timer on pulse, does nothing on cut
var/const/WIRE_PROCEED = 8 // Lowers the timer, explodes if cut while the bomb is active
var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if pulsed while already active, will stop a timer a bomb on cut
+/datum/wires/syndicatebomb/GetWireName(index)
+ switch(index)
+ if(WIRE_BOOM)
+ return "Explode"
+
+ if(WIRE_UNBOLT)
+ return "Unbolt"
+
+ if(WIRE_DELAY)
+ return "Delay"
+
+ if(WIRE_PROCEED)
+ return "Proceed"
+
+ if(WIRE_ACTIVATE)
+ return "Activate"
-/datum/wires/syndicatebomb/CanUse(var/mob/living/L)
+/datum/wires/syndicatebomb/CanUse(mob/living/L)
var/obj/machinery/syndicatebomb/P = holder
if(P.open_panel)
return 1
return 0
-/datum/wires/syndicatebomb/UpdatePulsed(var/index)
+/datum/wires/syndicatebomb/UpdatePulsed(index)
var/obj/machinery/syndicatebomb/P = holder
switch(index)
if(WIRE_BOOM)
@@ -47,8 +63,9 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
else
P.loc.visible_message("[bicon(holder)] The bomb seems to hesitate for a moment.")
P.timer += 5
+ ..()
-/datum/wires/syndicatebomb/UpdateCut(var/index, var/mended)
+/datum/wires/syndicatebomb/UpdateCut(index, mended)
var/obj/machinery/syndicatebomb/P = holder
switch(index)
if(WIRE_EXPLODE)
@@ -58,7 +75,7 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
P.timer = 0
else
P.defused = 1
- if(mended)
+ else
P.defused = 0 //cutting and mending all the wires of an inactive bomb will thus cure any sabotage
if(WIRE_UNBOLT)
if(!mended && P.anchored)
@@ -74,4 +91,5 @@ var/const/WIRE_ACTIVATE = 16 // Will start a bombs timer if pulsed, will hint if
P.loc.visible_message("[bicon(holder)] The timer stops! The bomb has been defused!")
P.icon_state = "[initial(P.icon_state)]-inactive[P.open_panel ? "-wires" : ""]"
P.active = 0
- P.defused = 1
\ No newline at end of file
+ P.defused = 1
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/vending.dm b/code/datums/wires/vending.dm
index 574c7961e09..286ac454efc 100644
--- a/code/datums/wires/vending.dm
+++ b/code/datums/wires/vending.dm
@@ -9,7 +9,21 @@ var/const/VENDING_WIRE_CONTRABAND = 2
var/const/VENDING_WIRE_ELECTRIFY = 4
var/const/VENDING_WIRE_IDSCAN = 8
-/datum/wires/vending/CanUse(var/mob/living/L)
+/datum/wires/vending/GetWireName(index)
+ switch(index)
+ if(VENDING_WIRE_THROW)
+ return "Item Throw"
+
+ if(VENDING_WIRE_CONTRABAND)
+ return "Contraband"
+
+ if(VENDING_WIRE_ELECTRIFY)
+ return "Electrification"
+
+ if(VENDING_WIRE_IDSCAN)
+ return "ID Scan"
+
+/datum/wires/vending/CanUse(mob/living/L)
var/obj/machinery/vending/V = holder
if(!istype(L, /mob/living/silicon))
if(V.seconds_electrified)
@@ -19,15 +33,15 @@ var/const/VENDING_WIRE_IDSCAN = 8
return 1
return 0
-/datum/wires/vending/GetInteractWindow()
+/datum/wires/vending/get_status()
+ . = ..()
var/obj/machinery/vending/V = holder
- . += ..()
- . += "
The orange light is [V.seconds_electrified ? "on" : "off"].
"
- . += "The red light is [V.shoot_inventory ? "off" : "blinking"].
"
- . += "The green light is [(V.categories & CAT_HIDDEN) ? "on" : "off"].
"
- . += "A [V.scan_id ? "purple" : "yellow"] light is on.
"
+ . += "The orange light is [V.seconds_electrified ? "on" : "off"]."
+ . += "The red light is [V.shoot_inventory ? "off" : "blinking"]."
+ . += "The green light is [(V.categories & CAT_HIDDEN) ? "on" : "off"]."
+ . += "A [V.scan_id ? "purple" : "yellow"] light is on."
-/datum/wires/vending/UpdatePulsed(var/index)
+/datum/wires/vending/UpdatePulsed(index)
var/obj/machinery/vending/V = holder
switch(index)
if(VENDING_WIRE_THROW)
@@ -38,8 +52,9 @@ var/const/VENDING_WIRE_IDSCAN = 8
V.seconds_electrified = 30
if(VENDING_WIRE_IDSCAN)
V.scan_id = !V.scan_id
+ ..()
-/datum/wires/vending/UpdateCut(var/index, var/mended)
+/datum/wires/vending/UpdateCut(index, mended)
var/obj/machinery/vending/V = holder
switch(index)
if(VENDING_WIRE_THROW)
@@ -52,4 +67,5 @@ var/const/VENDING_WIRE_IDSCAN = 8
else
V.seconds_electrified = -1
if(VENDING_WIRE_IDSCAN)
- V.scan_id = 1
\ No newline at end of file
+ V.scan_id = 1
+ ..()
\ No newline at end of file
diff --git a/code/datums/wires/wires.dm b/code/datums/wires/wires.dm
index 6d8866640e4..a8baf7ad2fb 100644
--- a/code/datums/wires/wires.dm
+++ b/code/datums/wires/wires.dm
@@ -26,7 +26,7 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
var/window_x = 370
var/window_y = 470
-/datum/wires/New(var/atom/holder)
+/datum/wires/New(atom/holder)
..()
src.holder = holder
if(!istype(holder, holder_type))
@@ -68,106 +68,110 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
src.wires[colour] = index
//wires = shuffle(wires)
+/datum/wires/proc/get_status()
+ return list()
-/datum/wires/proc/Interact(var/mob/living/user)
+/datum/wires/proc/Interact(mob/user)
+ if(user && istype(user) && holder && CanUse(user))
+ ui_interact(user)
- var/html = null
- if(holder && CanUse(user))
- html = GetInteractWindow()
- if(html)
- user.set_machine(holder)
- else
- user.unset_machine()
- // No content means no window.
- user << browse(null, "window=wires")
- return
- var/datum/browser/popup = new(user, "wires", holder.name, window_x, window_y)
- popup.set_content(html)
- popup.set_title_image(user.browse_rsc_icon(holder.icon, holder.icon_state))
- popup.open()
+/datum/wires/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "wires.tmpl", holder.name, window_x, window_y)
+ ui.open()
-/datum/wires/proc/GetInteractWindow()
- var/html = ""
- html += "
Exposed Wires
"
- html += "
"
- html += "
"
+ W[++W.len] = list("colour" = capitalize(colour), "cut" = IsColourCut(colour), "index" = can_see_wire_index(user) ? GetWireName(GetIndex(colour)) : null, "attached" = IsAttached(colour))
- return html
+ if(W.len > 0)
+ data["wires"] = W
+
+ var/list/status = get_status()
+ data["status_len"] = status.len
+ data["status"] = status
+
+ return data
+
+/datum/wires/nano_host()
+ return holder
+
+/datum/wires/proc/can_see_wire_index(mob/user)
+ if(user.can_admin_interact())
+ return TRUE
+ else if(istype(user.get_active_hand(), /obj/item/device/multitool))
+ var/obj/item/device/multitool/M = user.get_active_hand()
+ if(M.shows_wire_information)
+ return TRUE
+
+ return FALSE
/datum/wires/Topic(href, href_list)
- ..()
- if(in_range(holder, usr) && isliving(usr))
+ if(..())
+ return 1
- var/mob/living/L = usr
- if(CanUse(L) && href_list["action"])
- var/obj/item/I = L.get_active_hand()
- holder.add_hiddenprint(L)
- if(href_list["cut"]) // Toggles the cut/mend status
- if(istype(I, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 20, 1)
- var/colour = href_list["cut"]
+ var/mob/L = usr
+ if(CanUse(L) && href_list["action"])
+ var/obj/item/I = L.get_active_hand()
+ var/colour = lowertext(href_list["wire"])
+ holder.add_hiddenprint(L)
+ switch(href_list["action"])
+ if("cut") // Toggles the cut/mend status
+ if(istype(I, /obj/item/weapon/wirecutters) || L.can_admin_interact())
+ if(istype(I))
+ playsound(holder, I.usesound, 20, 1)
CutWireColour(colour)
else
to_chat(L, "You need wirecutters!")
-
- else if(href_list["pulse"])
- if(istype(I, /obj/item/device/multitool))
+ if("pulse")
+ if(istype(I, /obj/item/device/multitool) || L.can_admin_interact())
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
- var/colour = href_list["pulse"]
PulseColour(colour)
else
to_chat(L, "You need a multitool!")
-
- else if(href_list["attach"])
- var/colour = href_list["attach"]
- // Detach
+ if("attach")
if(IsAttached(colour))
var/obj/item/O = Detach(colour)
if(O)
L.put_in_hands(O)
-
- // Attach
else
if(istype(I, /obj/item/device/assembly/signaler))
- L.drop_item()
- Attach(colour, I)
+ if(L.drop_item())
+ Attach(colour, I)
+ else
+ to_chat(L, "[L.get_active_hand()] is stuck to your hand!")
else
to_chat(L, "You need a remote signaller!")
-
-
-
- // Update Window
- Interact(usr)
-
- if(href_list["close"])
- usr << browse(null, "window=wires")
- usr.unset_machine(holder)
+ nanomanager.update_uis(src)
+ return 1
//
// Overridable Procs
//
// Called when wires cut/mended.
-/datum/wires/proc/UpdateCut(var/index, var/mended)
- return
+/datum/wires/proc/UpdateCut(index, mended)
+ if(holder)
+ nanomanager.update_uis(holder)
// Called when wire pulsed. Add code here.
-/datum/wires/proc/UpdatePulsed(var/index)
- return
+/datum/wires/proc/UpdatePulsed(index)
+ if(holder)
+ nanomanager.update_uis(holder)
-/datum/wires/proc/CanUse(var/mob/living/L)
+/datum/wires/proc/CanUse(mob/L)
return 1
+/datum/wires/CanUseTopic(mob/user, datum/topic_state/state)
+ if(!CanUse(user))
+ return STATUS_CLOSE
+ return ..()
+
// Example of use:
/*
@@ -194,47 +198,50 @@ var/const/POWER = 8
// Helper Procs
//
-/datum/wires/proc/PulseColour(var/colour)
+/datum/wires/proc/PulseColour(colour)
PulseIndex(GetIndex(colour))
-/datum/wires/proc/PulseIndex(var/index)
+/datum/wires/proc/PulseIndex(index)
if(IsIndexCut(index))
return
UpdatePulsed(index)
-/datum/wires/proc/GetIndex(var/colour)
+/datum/wires/proc/GetIndex(colour)
if(wires[colour])
var/index = wires[colour]
return index
else
CRASH("[colour] is not a key in wires.")
+
+/datum/wires/proc/GetWireName(index)
+ return
//
// Is Index/Colour Cut procs
//
-/datum/wires/proc/IsColourCut(var/colour)
+/datum/wires/proc/IsColourCut(colour)
var/index = GetIndex(colour)
return IsIndexCut(index)
-/datum/wires/proc/IsIndexCut(var/index)
+/datum/wires/proc/IsIndexCut(index)
return (index & wires_status)
//
// Signaller Procs
//
-/datum/wires/proc/IsAttached(var/colour)
+/datum/wires/proc/IsAttached(colour)
if(signallers[colour])
return 1
return 0
-/datum/wires/proc/GetAttached(var/colour)
+/datum/wires/proc/GetAttached(colour)
if(signallers[colour])
return signallers[colour]
return null
-/datum/wires/proc/Attach(var/colour, var/obj/item/device/assembly/signaler/S)
+/datum/wires/proc/Attach(colour, obj/item/device/assembly/signaler/S)
if(colour && S)
if(!IsAttached(colour))
signallers[colour] = S
@@ -242,7 +249,7 @@ var/const/POWER = 8
S.connected = src
return S
-/datum/wires/proc/Detach(var/colour)
+/datum/wires/proc/Detach(colour)
if(colour)
var/obj/item/device/assembly/signaler/S = GetAttached(colour)
if(S)
@@ -252,7 +259,7 @@ var/const/POWER = 8
return S
-/datum/wires/proc/Pulse(var/obj/item/device/assembly/signaler/S)
+/datum/wires/proc/Pulse(obj/item/device/assembly/signaler/S)
for(var/colour in signallers)
if(S == signallers[colour])
@@ -264,11 +271,11 @@ var/const/POWER = 8
// Cut Wire Colour/Index procs
//
-/datum/wires/proc/CutWireColour(var/colour)
+/datum/wires/proc/CutWireColour(colour)
var/index = GetIndex(colour)
CutWireIndex(index)
-/datum/wires/proc/CutWireIndex(var/index)
+/datum/wires/proc/CutWireIndex(index)
if(IsIndexCut(index))
wires_status &= ~index
UpdateCut(index, 1)
diff --git a/code/game/asteroid.dm b/code/game/asteroid.dm
index 77c3179adf5..dd68e1a2f6e 100644
--- a/code/game/asteroid.dm
+++ b/code/game/asteroid.dm
@@ -115,7 +115,7 @@ var/global/max_secret_rooms = 6
floortypes = list(/turf/simulated/floor,/turf/simulated/floor/wood)
treasureitems = list(/obj/item/weapon/melee/energy/sword/pirate=1,/obj/item/weapon/gun/projectile/revolver/doublebarrel=1,/obj/item/weapon/storage/backpack/satchel_flat=1,
/obj/machinery/reagentgrinder=2, /obj/machinery/computer/security/wooden_tv=4, /obj/machinery/vending/coffee=3)
- fluffitems = list(/obj/structure/table/woodentable=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/weapon/spacecash/c500=4,
+ fluffitems = list(/obj/structure/table/woodentable=2,/obj/structure/reagent_dispensers/beerkeg=1,/obj/item/stack/spacecash/c500=4,
/obj/item/weapon/reagent_containers/food/drinks/shaker=1,/obj/item/weapon/reagent_containers/food/drinks/bottle/wine=3,
/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey=3,/obj/item/clothing/shoes/laceup=2)
diff --git a/code/game/dna/dna2.dm b/code/game/dna/dna2.dm
index c8a4d91038e..86e85da4fb0 100644
--- a/code/game/dna/dna2.dm
+++ b/code/game/dna/dna2.dm
@@ -135,6 +135,7 @@ var/global/list/bad_blocks[0]
// FIXME: Species-specific defaults pls
var/obj/item/organ/external/head/H = character.get_organ("head")
var/obj/item/organ/internal/eyes/eyes_organ = character.get_int_organ(/obj/item/organ/internal/eyes)
+ var/datum/species/S = character.species
/*// Body Accessory
if(!character.body_accessory)
@@ -170,7 +171,11 @@ var/global/list/bad_blocks[0]
SetUIValueRange(DNA_UI_SKIN_TONE, 35-character.s_tone, 220, 1) // Value can be negative.
- SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ if(S.has_gender)
+ SetUIState(DNA_UI_GENDER, character.gender!=MALE, 1)
+ else
+ SetUIState(DNA_UI_GENDER, pick(0,1), 1)
+
/*SetUIValueRange(DNA_UI_BACC_STYLE, bodyacc, facial_hair_styles_list.len, 1)*/
SetUIValueRange(DNA_UI_HEAD_MARK_STYLE, head_marks, marking_styles_list.len, 1)
SetUIValueRange(DNA_UI_BODY_MARK_STYLE, body_marks, marking_styles_list.len, 1)
diff --git a/code/game/dna/dna2_helpers.dm b/code/game/dna/dna2_helpers.dm
index c92b75cafc0..743a8ebbe5c 100644
--- a/code/game/dna/dna2_helpers.dm
+++ b/code/game/dna/dna2_helpers.dm
@@ -132,6 +132,7 @@
dna.check_integrity()
var/mob/living/carbon/human/H = src
var/obj/item/organ/external/head/head_organ = H.get_organ("head")
+ var/datum/species/S = H.species
dna.write_head_attributes(head_organ)
H.r_skin = dna.GetUIValueRange(DNA_UI_SKIN_R, 255)
@@ -144,10 +145,11 @@
H.s_tone = 35 - dna.GetUIValueRange(DNA_UI_SKIN_TONE, 220) // Value can be negative.
- if(dna.GetUIState(DNA_UI_GENDER))
- H.change_gender(FEMALE, 0)
- else
- H.change_gender(MALE, 0)
+ if(S.has_gender)
+ if(dna.GetUIState(DNA_UI_GENDER))
+ H.change_gender(FEMALE, 0)
+ else
+ H.change_gender(MALE, 0)
//Head Markings
var/head_marks = dna.GetUIValueRange(DNA_UI_HEAD_MARK_STYLE, marking_styles_list.len)
diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm
index 752e8e353d0..cbfa6e51f11 100644
--- a/code/game/gamemodes/cult/ritual.dm
+++ b/code/game/gamemodes/cult/ritual.dm
@@ -158,8 +158,8 @@
text += "Talisman of Stunning
Attacking a target will knock them down for a long duration in addition to inhibiting their speech. \
Robotic lifeforms will suffer the effects of a heavy electromagnetic pulse instead.
"
- text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, an eldritch longsword, an empowered bola. Any items that cannot \
- be equipped will not be summoned. Attacking a fellow cultist with it will instead equip them.
"
+ text += "Talisman of Armaments
The Talisman of Arming will equip the user with armored robes, a backpack, shoes, an eldritch longsword, and an empowered bola. Any equipment that cannot \
+ be equipped will not be summoned, weaponary will be put on the floor below the user. Attacking a fellow cultist with it will instead equip them.
"
text += "Talisman of Horrors
The Talisman of Horror must be applied directly to the victim, it will shatter your victim's mind with visions of the endtimes that may incapitate them.
"
diff --git a/code/game/gamemodes/cult/talisman.dm b/code/game/gamemodes/cult/talisman.dm
index 1b7d1bee5a9..b518ce7887e 100644
--- a/code/game/gamemodes/cult/talisman.dm
+++ b/code/game/gamemodes/cult/talisman.dm
@@ -270,8 +270,9 @@
var/mob/living/carbon/human/H = user
user.visible_message("Otherworldly armor suddenly appears on [user]!", \
"You speak the words of the talisman, arming yourself!")
- H.equip_or_collect(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
- H.equip_or_collect(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/suit/hooded/cultrobes/alt(user), slot_wear_suit)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/cultpack(user), slot_back)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/cult(user), slot_shoes)
H.put_in_hands(new /obj/item/weapon/melee/cultblade(user))
H.put_in_hands(new /obj/item/weapon/restraints/legcuffs/bola/cult(user))
diff --git a/code/game/gamemodes/miniantags/abduction/abduction.dm b/code/game/gamemodes/miniantags/abduction/abduction.dm
index db86c482f03..ab41b7c24b8 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction.dm
@@ -247,9 +247,10 @@
V.flags |= NODROP
agent.equip_to_slot_or_del(V, slot_wear_suit)
agent.equip_to_slot_or_del(new /obj/item/weapon/abductor_baton(agent), slot_in_backpack)
- agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_belt)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/decloner/alien(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/device/abductor/silencer(agent), slot_in_backpack)
agent.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/abductor(agent), slot_head)
+ agent.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/military/abductor/full(agent), slot_belt)
agent.update_icons()
diff --git a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
index 29f217b44bc..8f026650b7c 100644
--- a/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
+++ b/code/game/gamemodes/miniantags/abduction/abduction_gear.dm
@@ -547,31 +547,37 @@ Congratulations! You are now trained for xenobiology research!"}
name = "alien scalpel"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/hemostat/alien
name = "alien hemostat"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/retractor/alien
name = "alien retractor"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/circular_saw/alien
name = "alien saw"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/surgicaldrill/alien
name = "alien drill"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/weapon/cautery/alien
name = "alien cautery"
icon = 'icons/obj/abductor.dmi'
origin_tech = "materials=2;biotech=2;abductor=2"
+ toolspeed = 0.25
/obj/item/clothing/head/helmet/abductor
name = "agent headgear"
@@ -605,9 +611,9 @@ Congratulations! You are now trained for xenobiology research!"}
/obj/structure/abductor_tableframe/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "You start disassembling [src]...")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
+ if(do_after(user, 30 * I.toolspeed, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
new /obj/item/stack/sheet/mineral/abductor(get_turf(src))
qdel(src)
return
@@ -617,7 +623,7 @@ Congratulations! You are now trained for xenobiology research!"}
to_chat(user, "You need one alien alloy sheet to do this!")
return
to_chat(user, "You start adding [P] to [src]...")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
P.use(1)
new /obj/structure/table/abductor(src.loc)
qdel(src)
diff --git a/code/game/gamemodes/miniantags/abduction/machinery/console.dm b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
index ddac0731249..3922b80a9e5 100644
--- a/code/game/gamemodes/miniantags/abduction/machinery/console.dm
+++ b/code/game/gamemodes/miniantags/abduction/machinery/console.dm
@@ -51,7 +51,7 @@
return
if(!IsAbductor(user))
to_chat(user, "You start mashing alien buttons at random!")
- if(do_after(user,100, target = src))
+ if(do_after(user, 100, target = src))
TeleporterSend()
return
user.set_machine(src)
diff --git a/code/game/gamemodes/miniantags/borer/borer.dm b/code/game/gamemodes/miniantags/borer/borer.dm
index 16f7a4e0847..4cd285b5887 100644
--- a/code/game/gamemodes/miniantags/borer/borer.dm
+++ b/code/game/gamemodes/miniantags/borer/borer.dm
@@ -322,7 +322,7 @@
to_chat(src, "You slither up [M] and begin probing at their ear canal...")
- if(!do_after(src,50, target = M))
+ if(!do_after(src, 50, target = M))
to_chat(src, "As [M] moves away, you are dislodged and fall to the ground.")
return
diff --git a/code/game/gamemodes/miniantags/morph/morph.dm b/code/game/gamemodes/miniantags/morph/morph.dm
index 9bf6be0bbdc..be21008d5f2 100644
--- a/code/game/gamemodes/miniantags/morph/morph.dm
+++ b/code/game/gamemodes/miniantags/morph/morph.dm
@@ -164,7 +164,7 @@
else if(istype(target,/obj/item)) // Eat items just to be annoying
var/obj/item/I = target
if(!I.anchored)
- if(do_after(src,20, target = I))
+ if(do_after(src, 20, target = I))
eat(I)
return
target.attack_animal(src)
diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm
index 2476753b34b..d83011d078b 100644
--- a/code/game/gamemodes/nuclear/nuclearbomb.dm
+++ b/code/game/gamemodes/nuclear/nuclearbomb.dm
@@ -58,12 +58,12 @@ var/bomb_set
panel_open = 1
overlays += image(icon, "npanel_open")
to_chat(user, "You unscrew the control panel of [src].")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
else
panel_open = 0
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
else
if(panel_open == 0)
to_chat(user, "[src] emits a buzzing noise, the panel staying locked in.")
@@ -71,7 +71,7 @@ var/bomb_set
panel_open = 0
overlays -= image(icon, "npanel_open")
to_chat(user, "You screw the control panel of [src] back on.")
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
flick("nuclearbombc", src)
return
diff --git a/code/game/gamemodes/scoreboard.dm b/code/game/gamemodes/scoreboard.dm
index bd391550b62..3a0d531e03a 100644
--- a/code/game/gamemodes/scoreboard.dm
+++ b/code/game/gamemodes/scoreboard.dm
@@ -165,8 +165,8 @@
// has an account?
if(A)
. += A.money
- for(var/obj/item/weapon/spacecash/cash in C.contents)
- . += cash.get_total()
+ for(var/obj/item/stack/spacecash/cash in C.contents)
+ . += cash.amount
for(var/obj/item/weapon/storage/S in C.contents)
. += .(S, level + 1)
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index b04a3012fc3..6bcc43f97af 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -72,8 +72,8 @@
var/datum/data/pda/utility/flashlight/FL = P.find_program(/datum/data/pda/utility/flashlight)
if(FL && FL.fon)
FL.start()
- else if(istype(I, /obj/item/clothing/head/helmet/space/rig))
- var/obj/item/clothing/head/helmet/space/rig/R = I
+ else if(istype(I, /obj/item/clothing/head/helmet/space/hardsuit))
+ var/obj/item/clothing/head/helmet/space/hardsuit/R = I
if(R.on)
R.toggle_light()
R.visible_message("[R]'s light fades and turns off.")
diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm
index 7145a414d7e..b33caa4ef73 100644
--- a/code/game/gamemodes/wizard/rightandwrong.dm
+++ b/code/game/gamemodes/wizard/rightandwrong.dm
@@ -129,8 +129,8 @@
if("staffdoor")
new /obj/item/weapon/gun/magic/staff/door(get_turf(H))
if("armor")
- new /obj/item/clothing/suit/space/rig/wizard(get_turf(H))
- new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(H))
+ new /obj/item/clothing/suit/space/hardsuit/wizard(get_turf(H))
+ new /obj/item/clothing/head/helmet/space/hardsuit/wizard(get_turf(H))
if("scrying")
new /obj/item/weapon/scrying(get_turf(H))
if(!(XRAY in H.mutations))
diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm
index fd554e03c85..54b39d68f88 100644
--- a/code/game/gamemodes/wizard/spellbook.dm
+++ b/code/game/gamemodes/wizard/spellbook.dm
@@ -353,7 +353,7 @@
/datum/spellbook_entry/item/armor
name = "Mastercrafted Armor Set"
desc = "An artefact suit of armor that allows you to cast spells while providing more protection against attacks and the void of space."
- item_path = /obj/item/clothing/suit/space/rig/wizard
+ item_path = /obj/item/clothing/suit/space/hardsuit/wizard
log_name = "HS"
category = "Defensive"
@@ -362,7 +362,7 @@
if(.)
new /obj/item/clothing/shoes/sandal(get_turf(user)) //In case they've lost them.
new /obj/item/clothing/gloves/color/purple(get_turf(user))//To complete the outfit
- new /obj/item/clothing/head/helmet/space/rig/wizard(get_turf(user))
+ new /obj/item/clothing/head/helmet/space/hardsuit/wizard(get_turf(user))
/datum/spellbook_entry/item/contract
name = "Contract of Apprenticeship"
diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm
index 1cdff2ec775..b855c1d671f 100644
--- a/code/game/jobs/job/engineering.dm
+++ b/code/game/jobs/job/engineering.dm
@@ -26,7 +26,7 @@
jobtype = /datum/job/chief_engineer
uniform = /obj/item/clothing/under/rank/chief_engineer
- belt = /obj/item/weapon/storage/belt/utility/full
+ belt = /obj/item/weapon/storage/belt/utility/chief/full
gloves = /obj/item/clothing/gloves/color/black/ce
shoes = /obj/item/clothing/shoes/brown
head = /obj/item/clothing/head/hardhat/white
diff --git a/code/game/jobs/job/supervisor.dm b/code/game/jobs/job/supervisor.dm
index 4394147cb37..af91e7788bd 100644
--- a/code/game/jobs/job/supervisor.dm
+++ b/code/game/jobs/job/supervisor.dm
@@ -210,7 +210,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
access_crematorium, access_kitchen, access_cargo, access_cargo_bot, access_mailsorting, access_qm, access_hydroponics, access_lawyer,
access_theatre, access_chapel_office, access_library, access_research, access_mining, access_heads_vault, access_mining_station,
access_clown, access_mime, access_hop, access_RC_announce, access_keycard_auth, access_gateway, access_magistrate)
- minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate)
+ minimal_access = list(access_security, access_sec_doors, access_brig, access_court, access_maint_tunnels, access_lawyer, access_magistrate, access_heads)
outfit = /datum/outfit/job/judge
@@ -220,6 +220,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 0)
uniform = /obj/item/clothing/under/suit_jacket/really_black
suit = /obj/item/clothing/suit/judgerobe
+ gloves = /obj/item/clothing/gloves/color/white
shoes = /obj/item/clothing/shoes/centcom
head = /obj/item/clothing/head/powdered_wig
l_ear = /obj/item/device/radio/headset/heads/magistrate/alt
diff --git a/code/game/machinery/Freezer.dm b/code/game/machinery/Freezer.dm
index 542ed8b47b4..0c207c8217e 100644
--- a/code/game/machinery/Freezer.dm
+++ b/code/game/machinery/Freezer.dm
@@ -65,7 +65,7 @@
var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
dir = choices[selected]
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
var/node_connect = dir
initialize_directions = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
@@ -224,7 +224,7 @@
var/list/choices = list("West" = WEST, "East" = EAST, "South" = SOUTH, "North" = NORTH)
var/selected = input(user,"Select a direction for the connector.", "Connector Direction") in choices
dir = choices[selected]
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
var/node_connect = dir
initialize_directions = dir
for(var/obj/machinery/atmospherics/target in get_step(src,node_connect))
diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm
index eb610c771a7..0b053831b49 100644
--- a/code/game/machinery/OpTable.dm
+++ b/code/game/machinery/OpTable.dm
@@ -139,8 +139,8 @@
qdel(W)
return
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "You deconstruct the table.")
new /obj/item/stack/sheet/plasteel(loc, 5)
qdel(src)
diff --git a/code/game/machinery/PDApainter.dm b/code/game/machinery/PDApainter.dm
index 24b233a4b41..485bbd58b0e 100644
--- a/code/game/machinery/PDApainter.dm
+++ b/code/game/machinery/PDApainter.dm
@@ -61,7 +61,8 @@
/obj/machinery/pdapainter/attack_hand(mob/user as mob)
- ..()
+ if(..())
+ return 1
src.add_fingerprint(user)
@@ -84,6 +85,9 @@
set name = "Eject PDA"
set category = "Object"
set src in oview(1)
+
+ if(usr.incapacitated())
+ return
if(storedpda)
storedpda.loc = get_turf(src.loc)
diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm
index 2a29e23db73..a17202aa4de 100644
--- a/code/game/machinery/Sleeper.dm
+++ b/code/game/machinery/Sleeper.dm
@@ -312,7 +312,7 @@
else
orient = "RIGHT"
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, G.usesound, 50, 1)
return
if(exchange_parts(user, G))
@@ -519,7 +519,7 @@
if(do_after(user, 20, target = L))
if(src.occupant)
- to_chat(user, ">The sleeper is already occupied!")
+ to_chat(user, "The sleeper is already occupied!")
return
if(!L) return
L.forceMove(src)
diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm
index 1222d3e00b3..151dc377f5d 100644
--- a/code/game/machinery/adv_med.dm
+++ b/code/game/machinery/adv_med.dm
@@ -65,7 +65,7 @@
dir = 8
else
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, G.usesound, 50, 1)
return
if(exchange_parts(user, G))
@@ -293,7 +293,7 @@
dir = 8
else
dir = 4
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
if(exchange_parts(user, G))
return
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 632177d7358..c8f4038f03c 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -581,9 +581,7 @@
return ui_interact(user)
/obj/machinery/alarm/attack_ghost(user as mob)
- if(stat & (BROKEN|MAINT))
- return
- return ui_interact(user)
+ return interact(user)
/obj/machinery/alarm/attack_hand(mob/user)
. = ..()
@@ -595,7 +593,7 @@
if(buildstage != 2)
return
- if(wiresexposed && !istype(user, /mob/living/silicon/ai))
+ if(wiresexposed)
wires.Interact(user)
if(!shorted)
@@ -1004,6 +1002,7 @@
return
to_chat(user, "You wire \the [src]!")
+ playsound(get_turf(src), coil.usesound, 50, 1)
coil.amount -= 5
if(!coil.amount)
qdel(coil)
@@ -1015,8 +1014,8 @@
else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You start prying out the circuit.")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,20, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(buildstage != 1)
return
to_chat(user, "You pry out the circuit!")
@@ -1028,6 +1027,7 @@
if(0)
if(istype(W, /obj/item/weapon/airalarm_electronics))
to_chat(user, "You insert the circuit!")
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(W)
buildstage = 1
update_icon()
@@ -1036,7 +1036,7 @@
else if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You remove the fire alarm assembly from the wall!")
new /obj/item/mounted/frame/alarm_frame(get_turf(user))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return 0
@@ -1067,3 +1067,5 @@ Just an object used in constructing air alarms
desc = "Looks like a circuit. Probably is."
w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm
index f534a86f31c..f6634ff242c 100644
--- a/code/game/machinery/atmo_control.dm
+++ b/code/game/machinery/atmo_control.dm
@@ -75,9 +75,9 @@ obj/machinery/air_sensor
if(bolts)
to_chat(usr, "The [src] is bolted to the floor! You can't detach it like this.")
return 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message("[user] unfastens \the [src].", "\blue You have unfastened \the [src].", "You hear ratchet.")
new /obj/item/pipe_gsensor(src.loc)
qdel(src)
diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm
index 2ffa9301dd7..2533d734b8e 100644
--- a/code/game/machinery/atmoalter/canister.dm
+++ b/code/game/machinery/atmoalter/canister.dm
@@ -631,9 +631,9 @@ update_flag
// Do after stuff here
to_chat(user, "You start to slice away at \the [src]...")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm
index 51d4ebc595c..08615dea6ac 100644
--- a/code/game/machinery/atmoalter/meter.dm
+++ b/code/game/machinery/atmoalter/meter.dm
@@ -123,9 +123,9 @@
if(!istype(W, /obj/item/weapon/wrench))
return ..()
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src].", \
diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm
index 044023c394a..2d714606610 100644
--- a/code/game/machinery/atmoalter/scrubber.dm
+++ b/code/game/machinery/atmoalter/scrubber.dm
@@ -202,7 +202,7 @@
return
anchored = !anchored
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
return
diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm
index b2d934dc9a2..80cfef47d88 100644
--- a/code/game/machinery/buttons.dm
+++ b/code/game/machinery/buttons.dm
@@ -69,8 +69,8 @@
return 1
if(istype(W, /obj/item/weapon/wrench))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You detach \the [src] from the wall.")
new/obj/item/mounted/frame/driver_button(get_turf(src))
qdel(src)
diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm
index db616620244..fa17c5a9c67 100644
--- a/code/game/machinery/camera/camera.dm
+++ b/code/game/machinery/camera/camera.dm
@@ -28,6 +28,8 @@
var/alarm_on = 0
var/busy = 0
var/emped = 0 //Number of consecutive EMP's on this camera
+
+ var/toggle_message = 'sound/items/Wirecutter.ogg'
/obj/machinery/camera/New()
..()
@@ -107,8 +109,12 @@
/obj/machinery/camera/blob_act()
qdel(src)
return
+
+/obj/machinery/camera/attack_ghost(mob/user)
+ if(panel_open)
+ wires.Interact(user)
-/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user as mob)
+/obj/machinery/camera/attack_alien(mob/living/carbon/alien/humanoid/user)
if(!istype(user))
return
user.do_attack_animation(src)
@@ -123,7 +129,7 @@
src.view_range = num
cameranet.updateVisibility(src, 0)
-/obj/machinery/camera/attackby(W as obj, mob/living/user as mob, params)
+/obj/machinery/camera/attackby(obj/item/W, mob/living/user as mob, params)
var/msg = "You attach [W] into the assembly inner circuits."
var/msg2 = "The camera already has that upgrade!"
@@ -134,7 +140,7 @@
panel_open = !panel_open
user.visible_message("[user] screws the camera's panel [panel_open ? "open" : "closed"]!",
"You screw the camera's panel [panel_open ? "open" : "closed"].")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
else if((istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/multitool)) && panel_open)
wires.Interact(user)
@@ -234,7 +240,7 @@
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, loc)
spark_system.start()
- playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
playsound(loc, "sparks", 50, 1)
visible_message("[user] has sliced the camera apart with an energy blade!")
qdel(src)
@@ -271,7 +277,7 @@
else
visible_message("\The [src] [change_msg]!")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, toggle_message, 100, 1)
// now disconnect anyone using the camera
//Apparently, this will disconnect anyone even if the camera was re-activated.
@@ -351,9 +357,9 @@
return 0
to_chat(user, "You start to weld [src]...")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 100, target = src))
+ if(do_after(user, 100 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm
index 5b7d035d461..99e9273b682 100644
--- a/code/game/machinery/camera/camera_assembly.dm
+++ b/code/game/machinery/camera/camera_assembly.dm
@@ -26,7 +26,7 @@
if(0)
// State 0
if(iswrench(W) && isturf(src.loc))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You wrench the assembly into place.")
anchored = 1
state = 1
@@ -44,7 +44,7 @@
return
else if(iswrench(W))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You unattach the assembly from it's place.")
anchored = 0
update_icon()
@@ -57,6 +57,7 @@
var/obj/item/stack/cable_coil/C = W
if(C.use(2))
to_chat(user, "You add wires to the assembly.")
+ playsound(loc, W.usesound, 50, 1)
state = 3
else
to_chat(user, "You need 2 coils of wire to wire the assembly.")
@@ -74,7 +75,7 @@
if(3)
// State 3
if(isscrewdriver(W))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
var/input = strip_html(input(usr, "Which networks would you like to connect this camera to? Seperate networks with a comma. No Spaces!\nFor example: SS13,Security,Secret ", "Set Network", "SS13"))
if(!input)
@@ -116,7 +117,7 @@
else if(iswirecutter(W))
new/obj/item/stack/cable_coil(get_turf(src), 2)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You cut the wires from the circuits.")
state = 2
return
@@ -137,7 +138,7 @@
var/obj/U = locate(/obj) in upgrades
if(U)
to_chat(user, "You unattach an upgrade from the assembly.")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
U.loc = get_turf(src)
upgrades -= U
return
@@ -162,9 +163,9 @@
return 0
to_chat(user, "You start to weld the [src]..")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
busy = 1
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
busy = 0
if(!WT.isOn())
return 0
diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm
index bca8a6d8aa2..a2307f7bea4 100644
--- a/code/game/machinery/cell_charger.dm
+++ b/code/game/machinery/cell_charger.dm
@@ -62,7 +62,7 @@
anchored = !anchored
to_chat(user, "You [anchored ? "attach" : "detach"] the cell charger [anchored ? "to" : "from"] the ground")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(get_turf(src), W.usesound, 75, 1)
attack_hand(mob/user)
if(charging)
diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm
index af452dbdbcd..5d8372607d8 100644
--- a/code/game/machinery/cloning.dm
+++ b/code/game/machinery/cloning.dm
@@ -382,7 +382,7 @@
connected = null
else
anchored = 1
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.")
else
diff --git a/code/game/machinery/computer/ai_core.dm b/code/game/machinery/computer/ai_core.dm
index 29e315ec001..4c55d93e1c2 100644
--- a/code/game/machinery/computer/ai_core.dm
+++ b/code/game/machinery/computer/ai_core.dm
@@ -22,8 +22,8 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "\blue You wrench the frame into place.")
anchored = 1
state = 1
@@ -32,33 +32,33 @@
if(!WT.isOn())
to_chat(user, "The welder must be on for this task.")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(0, user)) return
to_chat(user, "\blue You deconstruct the frame.")
new /obj/item/stack/sheet/plasteel(loc, 4)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "\blue You unfasten the frame.")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard/aicore) && !circuit)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You place the circuit board inside the frame.")
icon_state = "1"
circuit = P
user.drop_item()
P.loc = src
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You screw the circuit board into place.")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the circuit board.")
state = 1
icon_state = "0"
@@ -66,14 +66,14 @@
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You unfasten the circuit board.")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
if(P:amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
P:amount -= 5
if(!P:amount) qdel(P)
to_chat(user, "\blue You add cables to the frame.")
@@ -84,7 +84,7 @@
if(brain)
to_chat(user, "Get that brain out of there first")
else
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the cables.")
state = 2
icon_state = "2"
@@ -93,8 +93,8 @@
if(istype(P, /obj/item/stack/sheet/rglass))
if(P:amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
if(P)
P:amount -= 2
if(!P:amount) qdel(P)
@@ -147,7 +147,7 @@
icon_state = "3b"
if(istype(P, /obj/item/weapon/crowbar) && brain)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the brain.")
brain.loc = loc
brain = null
@@ -155,7 +155,7 @@
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the glass panel.")
state = 3
if(brain)
@@ -166,7 +166,7 @@
return
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor.")
if(!brain)
var/open_for_latejoin = alert(user, "Would you like this core to be open for latejoining AIs?", "Latejoin", "Yes", "Yes", "No") == "Yes"
@@ -199,7 +199,7 @@
else if(istype(W, /obj/item/weapon/wrench))
if(anchored)
user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
user.visible_message("\blue \The [user] decides not to unbolt \the [src].")
return
user.visible_message("\blue \The [user] finishes unfastening \the [src]!")
@@ -207,7 +207,7 @@
return
else
user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
user.visible_message("\blue \The [user] decides not to bolt \the [src].")
return
user.visible_message("\blue \The [user] finishes fastening down \the [src]!")
diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm
index d3d7b8cf3d1..2f5e90e3039 100644
--- a/code/game/machinery/computer/buildandrepair.dm
+++ b/code/game/machinery/computer/buildandrepair.dm
@@ -29,6 +29,8 @@
var/list/records = null
var/frame_desc = null
var/contain_parts = 1
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/weapon/circuitboard/computer
board_type = "computer"
@@ -354,8 +356,8 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You wrench the frame into place.")
anchored = 1
state = 1
@@ -364,23 +366,23 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/sheet/metal(loc, 5)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You unfasten the frame.")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, B.usesound, 50, 1)
to_chat(user, "You place the circuit board inside the frame.")
icon_state = "1"
circuit = P
@@ -389,12 +391,12 @@
else
to_chat(user, "This frame does not accept circuit boards of this type!")
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You screw the circuit board into place.")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the circuit board.")
state = 1
icon_state = "0"
@@ -402,16 +404,16 @@
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You unfasten the circuit board.")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 2 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame.")
state = 3
@@ -424,7 +426,7 @@
return
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables.")
state = 2
icon_state = "2"
@@ -434,9 +436,9 @@
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
if(G.amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
to_chat(user, "You start to add the glass panel to the frame.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * G.toolspeed, target = src))
if(state == 3 && G.amount >= 2 && G.use(2))
to_chat(user, "You put in the glass panel.")
state = 4
@@ -449,13 +451,13 @@
return
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the glass panel.")
state = 3
icon_state = "3"
new /obj/item/stack/sheet/glass(loc, 2)
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor.")
var/B = new circuit.build_path (loc)
if(circuit.powernet) B:powernet = circuit.powernet
@@ -478,7 +480,7 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
if(do_after(user, 20, target = src))
to_chat(user, "You wrench the frame into place.")
anchored = 1
@@ -488,23 +490,23 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You deconstruct the frame.")
new /obj/item/stack/sheet/mineral/bananium(loc, 5)
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "You unfasten the frame.")
anchored = 0
state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "honkcomputer")
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You place the circuit board inside the frame.")
icon_state = "1"
circuit = P
@@ -513,12 +515,12 @@
else
to_chat(user, "This frame does not accept circuit boards of this type!")
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You screw the circuit board into place.")
state = 2
icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the circuit board.")
state = 1
icon_state = "0"
@@ -526,16 +528,16 @@
circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You unfasten the circuit board.")
state = 1
icon_state = "1"
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 2 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame.")
state = 3
@@ -548,7 +550,7 @@
return
if(3)
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables.")
state = 2
icon_state = "2"
@@ -558,9 +560,9 @@
if(istype(P, /obj/item/stack/sheet/glass))
var/obj/item/stack/sheet/glass/G = P
if(G.amount >= 2)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, G.usesound, 50, 1)
to_chat(user, "You start to add the glass panel to the frame.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * G.toolspeed, target = src))
if(state == 3 && G.amount >= 2 && G.use(2))
to_chat(user, "You put in the glass panel.")
state = 4
@@ -573,13 +575,13 @@
return
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You remove the glass panel.")
state = 3
icon_state = "3"
new /obj/item/stack/sheet/glass(loc, 2)
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
to_chat(user, "You connect the monitor.")
var/B = new circuit.build_path (loc)
if(circuit.powernet) B:powernet = circuit.powernet
diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm
index 71f9760c0a6..11778503e9d 100644
--- a/code/game/machinery/computer/computer.dm
+++ b/code/game/machinery/computer/computer.dm
@@ -101,18 +101,19 @@
text = replacetext(text, "\n", "
")
return text
-/obj/machinery/computer/attack_ghost(user as mob)
+/obj/machinery/computer/attack_ghost(mob/user)
return attack_hand(user)
-/obj/machinery/computer/attack_hand(user as mob)
+/obj/machinery/computer/attack_hand(mob/user)
/* Observers can view computers, but not actually use them via Topic*/
if(istype(user, /mob/dead/observer)) return 0
return ..()
-/obj/machinery/computer/attackby(I as obj, user as mob, params)
+/obj/machinery/computer/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ var/obj/item/weapon/screwdriver/S = I
+ playsound(src.loc, S.usesound, 50, 1)
+ if(do_after(user, 20 * S.toolspeed, target = src))
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
diff --git a/code/game/machinery/computer/honkputer.dm b/code/game/machinery/computer/honkputer.dm
index 13f07773404..c998fed7b1a 100644
--- a/code/game/machinery/computer/honkputer.dm
+++ b/code/game/machinery/computer/honkputer.dm
@@ -93,10 +93,11 @@
onclose(user, "honkputer")
-/obj/machinery/computer/HONKputer/attackby(I as obj, user as mob, params)
+/obj/machinery/computer/HONKputer/attackby(obj/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ var/obj/item/weapon/screwdriver/S = I
+ playsound(src.loc, S.usesound, 50, 1)
+ if(do_after(user, 20 * S.toolspeed, target = src))
var/obj/structure/computerframe/HONKputer/A = new /obj/structure/computerframe/HONKputer( src.loc )
var/obj/item/weapon/circuitboard/M = new circuit( A )
A.circuit = M
diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm
index b34ec03c91f..99b53415e5b 100644
--- a/code/game/machinery/constructable_frame.dm
+++ b/code/game/machinery/constructable_frame.dm
@@ -66,9 +66,9 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = P
if(C.amount >= 5)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, C.usesound, 50, 1)
to_chat(user, "You start to add cables to the frame.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(state == 1 && C.amount >= 5 && C.use(5))
to_chat(user, "You add cables to the frame.")
state = 2
@@ -86,13 +86,13 @@
return
G.use(5)
to_chat(user, "You add the glass to the frame.")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), G.usesound, 50, 1)
new /obj/structure/displaycase_frame(src.loc)
qdel(src)
return
if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
to_chat(user, "You dismantle the frame.")
new /obj/item/stack/sheet/metal(src.loc, 5)
qdel(src)
@@ -100,7 +100,7 @@
if(istype(P, /obj/item/weapon/circuitboard))
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "machine")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, B.usesound, 50, 1)
to_chat(user, "You add the circuit board to the frame.")
circuit = P
user.drop_item()
@@ -114,7 +114,7 @@
else
to_chat(user, "This frame does not accept circuit boards of this type!")
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables.")
state = 1
icon_state = "box_0"
@@ -123,7 +123,7 @@
if(3)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
state = 2
circuit.loc = src.loc
circuit = null
@@ -145,7 +145,7 @@
component_check = 0
break
if(component_check)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc)
new_machine.construction()
for(var/obj/O in new_machine.component_parts)
@@ -190,7 +190,7 @@
for(var/I in req_components)
if(istype(P, I) && (req_components[I] > 0) && (!(P.flags & NODROP) || istype(P, /obj/item/stack)))
success=1
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
if(istype(P, /obj/item/stack))
var/obj/item/stack/S = P
var/camt = min(S.amount, req_components[I])
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index 807d3caf261..50489a93a2d 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -333,7 +333,8 @@
else if(O.target && istype(O.target,/datum/mind))
if(O.target == occupant.mind)
if(O.owner && O.owner.current)
- to_chat(O.owner.current, "You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!")
+ to_chat(O.owner.current, "
You get the feeling your target is no longer within reach. Time for Plan [pick("A","B","C","D","X","Y","Z")]. Objectives updated!")
+ O.owner.current << 'sound/ambience/alarm4.ogg'
O.target = null
spawn(1) //This should ideally fire after the occupant is deleted.
if(!O) return
diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm
index b54a2e88a34..c20d8a8bd57 100644
--- a/code/game/machinery/deployable.dm
+++ b/code/game/machinery/deployable.dm
@@ -66,7 +66,7 @@ for reference:
if(istype(W, stacktype))
if(src.health < src.maxhealth)
visible_message("\red [user] begins to repair the [src]!")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
src.health = src.maxhealth
W:use(1)
visible_message("\red [user] repairs the [src]!")
@@ -77,9 +77,9 @@ for reference:
else if(istype(W, /obj/item/weapon/crowbar))
user.changeNext_move(CLICK_CD_MELEE)
user.visible_message("[user] is prying apart \the [src].", "You begin to pry apart \the [src].")
- playsound(src, 'sound/items/Crowbar.ogg', 200, 1)
+ playsound(src, W.usesound, 200, 1)
- if(do_after(user, 300, target = src) && src && !src.gcDestroyed)
+ if(do_after(user, 300 * W.toolspeed, target = src) && src && !src.gcDestroyed)
user.visible_message("[user] pries apart \the [src].", "You pry apart \the [src].")
dismantle()
return
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 0b62f7faf80..3c2c13254cf 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -560,6 +560,8 @@ About the new airlock wires panel:
return
/obj/machinery/door/airlock/attack_ghost(mob/user)
+ if(p_open)
+ wires.Interact(user)
ui_interact(user)
/obj/machinery/door/airlock/attack_ai(mob/user)
@@ -793,7 +795,7 @@ About the new airlock wires panel:
update_icon()
return 1
-/obj/machinery/door/airlock/attackby(C as obj, mob/user as mob, params)
+/obj/machinery/door/airlock/attackby(obj/item/C, mob/user as mob, params)
// to_chat(world, text("airlock attackby src [] obj [] mob []", src, C, user))
if(!istype(usr, /mob/living/silicon))
if(isElectrified())
@@ -828,16 +830,16 @@ About the new airlock wires panel:
else if(istype(C, /obj/item/weapon/pai_cable)) // -- TLE
var/obj/item/weapon/pai_cable/cable = C
cable.plugin(src, user)
- else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe) )
+ else if(istype(C, /obj/item/weapon/crowbar) || istype(C, /obj/item/weapon/twohanded/fireaxe))
var/beingcrowbarred = null
if(istype(C, /obj/item/weapon/crowbar) )
beingcrowbarred = 1 //derp, Agouri
else
beingcrowbarred = 0
if( beingcrowbarred && p_open && (operating == -1 || (density && welded && operating != 1 && !arePowerSystemsOn() && !locked)) )
- playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(loc, C.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * C.toolspeed, target = src))
to_chat(user, "\blue You removed the airlock electronics!")
var/obj/structure/door_assembly/da = new assembly_type(loc)
@@ -871,6 +873,29 @@ About the new airlock wires panel:
qdel(src)
return
+ else if(istype(C, /obj/item/weapon/crowbar/power))
+ if(isElectrified())
+ shock(user, 100)//it's like sticking a fork in a power socket
+ return
+
+ if(!density)//already open
+ return
+
+ if(locked)
+ to_chat(user, "The bolts are down, it won't budge!")
+ return
+
+ if(welded)
+ to_chat(user, "It's welded, it won't budge!")
+ return
+
+ if(arePowerSystemsOn())
+ var/obj/item/weapon/crowbar/power/P = C
+ playsound(src, 'sound/machines/airlock_alien_prying.ogg',100,1) //is it aliens or just the CE being a dick?
+ if(do_after(user, P.airlock_open_time, target = src))
+ open(2)
+ if(density && !open(2))
+ to_chat(user, "Despite your attempts, the [src] refuses to open.")
else if(arePowerSystemsOn())
to_chat(user, "\blue The airlock's motors resist your efforts to force it.")
else if(locked)
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index acad5a5a563..b39e3798ae1 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -14,6 +14,8 @@
var/last_configurator = null
var/locked = TRUE
var/const/max_brain_damage = 60 // Maximum brain damage a mob can have until it can't use the electronics
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/weapon/airlock_electronics/attack_self(mob/user)
if(!ishuman(user) && !isrobot(user))
diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm
index 052f0a99bea..63fed84088a 100644
--- a/code/game/machinery/doors/firedoor.dm
+++ b/code/game/machinery/doors/firedoor.dm
@@ -64,12 +64,12 @@
if(boltslocked)
to_chat(user, "There are screws locking the bolts in place!")
return
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] starts undoing [src]'s bolts...", \
"You start unfastening [src]'s floor bolts...")
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * C.toolspeed, target = src))
return
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] unfastens [src]'s bolts.", \
"You undo [src]'s floor bolts.")
deconstruct(TRUE)
@@ -77,7 +77,7 @@
else if(istype(C, /obj/item/weapon/screwdriver))
user.visible_message("[user] [boltslocked ? "unlocks" : "locks"] [src]'s bolts...", \
"You [boltslocked ? "unlock" : "lock"] [src]'s floor bolts...")
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
boltslocked = !boltslocked
return
else
@@ -250,6 +250,8 @@
desc = "A circuit board used in construction of firelocks."
w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/structure/firelock_frame
name = "firelock frame"
@@ -287,14 +289,14 @@
switch(constructionStep)
if(CONSTRUCTION_PANEL_OPEN)
if(istype(C, /obj/item/weapon/crowbar))
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] starts prying something out from [src]...", \
"You begin prying out the wire cover...")
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * C.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_PANEL_OPEN)
return
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] pries out a metal plate from [src], exposing the wires.", \
"You remove the cover plate from [src], exposing the wires.")
constructionStep = CONSTRUCTION_WIRES_EXPOSED
@@ -304,16 +306,16 @@
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
to_chat(user, "There's already a firelock there.")
return
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] starts bolting down [src]...", \
"You begin bolting [src]...")
- if(!do_after(user, 30, target = src))
+ if(!do_after(user, 30 * C.toolspeed, target = src))
return
if(locate(/obj/machinery/door/firedoor) in get_turf(src))
return
user.visible_message("[user] finishes the firelock.", \
"You finish the firelock.")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
if(reinforced)
new /obj/machinery/door/firedoor/heavy(get_turf(src))
else
@@ -330,23 +332,23 @@
return
user.visible_message("[user] begins reinforcing [src]...", \
"You begin reinforcing [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 60, target = src))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(do_after(user, 60 * C.toolspeed, target = src))
if(constructionStep != CONSTRUCTION_PANEL_OPEN || reinforced || P.get_amount() < 2 || !P)
return
user.visible_message("[user] reinforces [src].", \
"You reinforce [src].")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
P.use(2)
reinforced = 1
return
if(CONSTRUCTION_WIRES_EXPOSED)
if(istype(C, /obj/item/weapon/wirecutters))
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] starts cutting the wires from [src]...", \
"You begin removing [src]'s wires...")
- if(!do_after(user, 60, target = src))
+ if(!do_after(user, 60 * C.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
return
@@ -360,14 +362,14 @@
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(1, user))
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] starts welding a metal plate into [src]...", \
"You begin welding the cover plate back onto [src]...")
- if(!do_after(user, 80, target = src))
+ if(!do_after(user, 80 * C.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_WIRES_EXPOSED)
return
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
user.visible_message("[user] welds the metal plate into [src].", \
"You weld [src]'s cover plate into place, hiding the wires.")
constructionStep = CONSTRUCTION_PANEL_OPEN
@@ -377,15 +379,15 @@
if(istype(C, /obj/item/weapon/crowbar))
user.visible_message("[user] begins removing the circuit board from [src]...", \
"You begin prying out the circuit board from [src]...")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(!do_after(user, 50, target = src))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(!do_after(user, 50 * C.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_GUTTED)
return
user.visible_message("[user] removes [src]'s circuit board.", \
"You remove the circuit board from [src].")
new /obj/item/weapon/firelock_electronics(get_turf(src))
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
constructionStep = CONSTRUCTION_NOCIRCUIT
update_icon()
return
@@ -396,13 +398,13 @@
return
user.visible_message("[user] begins wiring [src]...", \
"You begin adding wires to [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 60, target = src))
+ playsound(get_turf(src), B.usesound, 50, 1)
+ if(do_after(user, 60 * B.toolspeed, target = src))
if(constructionStep != CONSTRUCTION_GUTTED || B.get_amount() < 5 || !B)
return
user.visible_message("[user] adds wires to [src].", \
"You wire [src].")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), B.usesound, 50, 1)
B.use(5)
constructionStep = CONSTRUCTION_WIRES_EXPOSED
update_icon()
@@ -411,16 +413,16 @@
if(istype(C, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = C
if(W.remove_fuel(1,user))
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
user.visible_message("[user] begins cutting apart [src]'s frame...", \
"You begin slicing [src] apart...")
- if(!do_after(user, 80, target = src))
+ if(!do_after(user, 80 * W.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_NOCIRCUIT)
return
user.visible_message("[user] cuts apart [src]!", \
"You cut [src] into metal.")
- playsound(get_turf(src), 'sound/items/Welder2.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
var/turf/T = get_turf(src)
new /obj/item/stack/sheet/metal(T, 3)
if(reinforced)
@@ -430,8 +432,8 @@
if(istype(C, /obj/item/weapon/firelock_electronics))
user.visible_message("[user] starts adding [C] to [src]...", \
"You begin adding a circuit board to [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(!do_after(user, 40, target = src))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(!do_after(user, 40 * C.toolspeed, target = src))
return
if(constructionStep != CONSTRUCTION_NOCIRCUIT)
return
@@ -439,7 +441,7 @@
qdel(C)
user.visible_message("[user] adds a circuit to [src].", \
"You insert and secure [C].")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), C.usesound, 50, 1)
constructionStep = CONSTRUCTION_GUTTED
update_icon()
return
diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm
index 74a65f1a93d..44af5be4cb0 100644
--- a/code/game/machinery/doors/windowdoor.dm
+++ b/code/game/machinery/doors/windowdoor.dm
@@ -227,18 +227,19 @@
/obj/machinery/door/window/attack_hand(mob/user as mob)
return attackby(user, user)
-/obj/machinery/door/window/emag_act(user as mob, weapon as obj)
+/obj/machinery/door/window/emag_act(mob/user, obj/weapon)
if(density)
operating = -1
flick("[base_state]spark", src)
sleep(6)
desc += "
Its access panel is smoking slightly."
if(istype(weapon, /obj/item/weapon/melee/energy/blade))
+ var/obj/item/weapon/melee/energy/blade/B
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, loc)
spark_system.start()
playsound(loc, "sparks", 50, 1)
- playsound(loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(loc, B.usesound, 50, 1)
visible_message(" The glass door was sliced open by [user]!")
open(2)
emagged = 1
@@ -264,17 +265,17 @@
if(density || operating)
to_chat(user, "You need to open the door to access the maintenance panel.")
return
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
p_open = !( p_open )
to_chat(user, "You [p_open ? "open":"close"] the maintenance panel of the [name].")
return
if(istype(I, /obj/item/weapon/crowbar))
if(p_open && !density && !operating)
- playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the [name].", \
"You start to remove electronics from the [name].")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * I.toolspeed, target = src))
if(p_open && !density && !operating && loc)
var/obj/structure/windoor_assembly/WA = new /obj/structure/windoor_assembly(loc)
switch(base_state)
diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm
index 777c2c1bfd5..a54cf0d7e74 100644
--- a/code/game/machinery/doppler_array.dm
+++ b/code/game/machinery/doppler_array.dm
@@ -20,7 +20,7 @@ var/list/doppler_arrays = list()
/obj/machinery/doppler_array/process()
return PROCESS_KILL
-/obj/machinery/doppler_array/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
+/obj/machinery/doppler_array/attackby(var/obj/item/O, var/mob/user, params)
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
anchored = 1
@@ -30,7 +30,7 @@ var/list/doppler_arrays = list()
anchored = 0
power_change()
to_chat(user, "You unfasten [src].")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, O.usesound, 50, 1)
/obj/machinery/doppler_array/verb/rotate()
set name = "Rotate Tachyon-doppler Dish"
diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm
index 3e77a7548b3..b40263599f5 100644
--- a/code/game/machinery/firealarm.dm
+++ b/code/game/machinery/firealarm.dm
@@ -97,7 +97,7 @@ FIRE ALARM
else if(istype(W, /obj/item/weapon/wirecutters)) // cutting the wires out
to_chat(user, "You cut the wires!")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
var/obj/item/stack/cable_coil/new_coil = new /obj/item/stack/cable_coil()
new_coil.amount = 5
new_coil.loc = user.loc
@@ -111,17 +111,18 @@ FIRE ALARM
return
buildstage = 2
+ playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "You wire \the [src]!")
update_icon()
else if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You pry out the circuit!")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(buildstage != 1)
return
var/obj/item/weapon/firealarm_electronics/circuit = new /obj/item/weapon/firealarm_electronics()
- circuit.loc = user.loc
+ circuit.forceMove(get_turf(src))
buildstage = 0
update_icon()
if(0)
@@ -134,7 +135,7 @@ FIRE ALARM
else if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You remove the fire alarm assembly from the wall!")
new /obj/item/mounted/frame/firealarm(get_turf(user))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return
@@ -275,6 +276,8 @@ Just a object used in constructing fire alarms
desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\""
w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/machinery/partyalarm
name = "\improper PARTY BUTTON"
diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm
index cee7706d256..5ae06103766 100644
--- a/code/game/machinery/floodlight.dm
+++ b/code/game/machinery/floodlight.dm
@@ -76,14 +76,14 @@
/obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters.", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters.", \
diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm
index 330fc5e1104..644b5a73ab9 100644
--- a/code/game/machinery/lightswitch.dm
+++ b/code/game/machinery/lightswitch.dm
@@ -152,8 +152,8 @@
return 1
if(istype(W, /obj/item/weapon/wrench))
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You detach \the [src] from the wall.")
new/obj/item/mounted/frame/light_switch(get_turf(src))
qdel(src)
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index e62e54a3a78..90c4d82befe 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -395,7 +395,7 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_crowbar(var/obj/item/weapon/crowbar/C, var/ignore_panel = 0)
if(istype(C) && (panel_open || ignore_panel))
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, C.usesound, 50, 1)
spawn_frame()
for(var/obj/item/I in component_parts)
if(I.reliability != 100 && crit_fail)
@@ -413,7 +413,7 @@ Class Procs:
/obj/machinery/proc/default_deconstruction_screwdriver(var/mob/user, var/icon_state_open, var/icon_state_closed, var/obj/item/weapon/screwdriver/S)
if(istype(S))
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, S.usesound, 50, 1)
if(!panel_open)
panel_open = 1
icon_state = icon_state_open
@@ -427,7 +427,7 @@ Class Procs:
/obj/machinery/proc/default_change_direction_wrench(var/mob/user, var/obj/item/weapon/wrench/W)
if(panel_open && istype(W))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
dir = turn(dir,-90)
to_chat(user, "You rotate [src].")
return 1
@@ -436,14 +436,14 @@ Class Procs:
/obj/proc/default_unfasten_wrench(mob/user, obj/item/weapon/wrench/W, time = 20)
if(istype(W))
to_chat(user, "Now [anchored ? "un" : ""]securing [name].")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, time, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, time * W.toolspeed, target = src))
to_chat(user, "You've [anchored ? "un" : ""]secured [name].")
anchored = !anchored
if(istype(src, /obj/machinery))
var/obj/machinery/M = src
M.power_change() //Turn on or off the machine depending on the status of power in the new area.
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
return 1
return 0
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index 7953f738a40..1d5f4e8cba8 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -22,8 +22,8 @@
if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You begin to unscrew the bolts off the [src]...")
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
var/obj/machinery/mass_driver_frame/F = new(get_turf(src))
F.dir = src.dir
F.anchored = 1
@@ -106,17 +106,17 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to cut the frame apart...")
- if(do_after(user, 30, target = src) && (build == 0))
+ if(do_after(user, 30 * WT.toolspeed, target = src) && (build == 0))
to_chat(user, "You detach the plasteel sheets from each others.")
new /obj/item/stack/sheet/plasteel(get_turf(src),3)
qdel(src)
return 1
if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You begin to anchor \the [src] on the floor.")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 10, target = src) && (build == 0))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 0))
to_chat(user, "You anchor \the [src]!")
anchored = 1
build++
@@ -125,8 +125,8 @@
if(1) // Fixed to the floor
if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You begin to de-anchor \the [src] from the floor.")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 10, target = src) && (build == 1))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 1))
build--
update_icon()
anchored = 0
@@ -137,9 +137,9 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to weld \the [src] to the floor...")
- if(do_after(user, 40, target = src) && (build == 1))
+ if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 1))
to_chat(user, "You welded \the [src] to the floor.")
build++
update_icon()
@@ -150,17 +150,17 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return 1
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
to_chat(user, "You begin to unweld \the [src] to the floor...")
- if(do_after(user, 40, target = src) && (build == 2))
+ if(do_after(user, 40 * WT.toolspeed, target = src) && (build == 2))
to_chat(user, "You unwelded \the [src] to the floor.")
build--
update_icon()
if(istype(W, /obj/item/stack/cable_coil))
- var/obj/item/stack/cable_coil/C=W
+ var/obj/item/stack/cable_coil/C = W
to_chat(user, "You start adding cables to \the [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src) && (C.amount >= 3) && (build == 2))
+ playsound(get_turf(src), C.usesound, 50, 1)
+ if(do_after(user, 20 * C.toolspeed, target = src) && (C.amount >= 3) && (build == 2))
C.use(3)
to_chat(user, "You've added cables to \the [src].")
build++
@@ -168,18 +168,18 @@
if(3) // Wired
if(istype(W, /obj/item/weapon/wirecutters))
to_chat(user, "You begin to remove the wiring from \the [src].")
- if(do_after(user, 10, target = src) && (build == 3))
+ if(do_after(user, 10 * W.toolspeed, target = src) && (build == 3))
new /obj/item/stack/cable_coil(loc,3)
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "You've removed the cables from \the [src].")
build--
update_icon()
return 1
if(istype(W, /obj/item/stack/rods))
- var/obj/item/stack/rods/R=W
+ var/obj/item/stack/rods/R = W
to_chat(user, "You begin to complete \the [src]...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src) && (R.amount >= 3) && (build == 3))
+ playsound(get_turf(src), R.usesound, 50, 1)
+ if(do_after(user, 20 * R.toolspeed, target = src) && (R.amount >= 3) && (build == 3))
R.use(3)
to_chat(user, "You've added the grille to \the [src].")
build++
@@ -188,15 +188,15 @@
if(4) // Grille in place
if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You begin to pry off the grille from \the [src]...")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user, 30, target = src) && (build == 4))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src) && (build == 4))
new /obj/item/stack/rods(loc,2)
build--
update_icon()
return 1
if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You finalize the Mass Driver...")
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
var/obj/machinery/mass_driver/M = new(get_turf(src))
M.dir = src.dir
qdel(src)
diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm
index 4c14df16ec3..428a9eeb8e9 100644
--- a/code/game/machinery/newscaster.dm
+++ b/code/game/machinery/newscaster.dm
@@ -3,28 +3,25 @@
//###-Agouri###################################
/datum/feed_message
- var/author =""
- var/body =""
- var/message_type ="Story"
- //var/parent_channel
- var/backup_body =""
- var/backup_author =""
+ var/author = ""
+ var/body = ""
+ var/message_type = "Story"
+ var/backup_body = ""
+ var/backup_author = ""
var/is_admin_message = 0
var/icon/img = null
var/icon/backup_img
var/view_count = 0
/datum/feed_channel
- var/channel_name=""
+ var/channel_name = ""
var/list/datum/feed_message/messages = list()
- //var/message_count = 0
- var/locked=0
- var/author=""
- var/backup_author=""
- var/censored=0
- var/is_admin_channel=0
+ var/locked = 0
+ var/author = ""
+ var/backup_author = ""
+ var/censored = 0
+ var/is_admin_channel = 0
var/total_view_count = 0
- //var/page = null //For newspapers
/datum/feed_message/proc/clear()
author = ""
@@ -59,468 +56,280 @@ var/datum/feed_network/news_network = new /datum/feed_network //The global n
var/list/obj/machinery/newscaster/allCasters = list() //Global list that will contain reference to all newscasters in existence.
+#define NEWSCASTER_MAIN 0 // Main menu
+#define NEWSCASTER_FC_LIST 1 // Feed channel list
+#define NEWSCASTER_CREATE_FC 2 // Create feed channel
+#define NEWSCASTER_CREATE_FM 3 // Create feed message
+#define NEWSCASTER_PRINT 4 // Print newspaper
+#define NEWSCASTER_VIEW_FC 5 // Read feed channel
+#define NEWSCASTER_NT_CENSOR 6 // Nanotrasen Feed Censorship Tool
+#define NEWSCASTER_D_NOTICE 7 // Nanotrasen D-Notice Handler
+#define NEWSCASTER_CENSOR_FC 8 // Censor feed channel
+#define NEWSCASTER_D_NOTICE_FC 9 // D-Notice feed channel
+#define NEWSCASTER_W_ISSUE_H 10 // Wanted Issue handler
+#define NEWSCASTER_W_ISSUE 11 // STATIONWIDE WANTED ISSUE
+
/obj/machinery/newscaster
name = "newscaster"
desc = "A standard Nanotrasen-licensed newsfeed handler for use in commercial space stations. All the news you absolutely have no use for, in one place!"
icon = 'icons/obj/terminals.dmi'
icon_state = "newscaster_normal"
- var/isbroken = 0 //1 if someone banged it with something heavy
- var/ispowered = 1 //starts powered, changes with power_change()
- //var/list/datum/feed_channel/channel_list = list() //This list will contain the names of the feed channels. Each name will refer to a data region where the messages of the feed channels are stored.
- //OBSOLETE: We're now using a global news network
- var/screen = 0 //Or maybe I'll make it into a list within a list afterwards... whichever I prefer, go fuck yourselves :3
- // 0 = welcome screen - main menu
- // 1 = view feed channels
- // 2 = create feed channel
- // 3 = create feed story
- // 4 = feed story submited sucessfully
- // 5 = feed channel created successfully
- // 6 = ERROR: Cannot create feed story
- // 7 = ERROR: Cannot create feed channel
- // 8 = print newspaper
- // 9 = viewing channel feeds
- // 10 = censor feed story
- // 11 = censor feed channel
- //Holy shit this is outdated, made this when I was still starting newscasters :3
- var/paper_remaining = 0
+ var/screen = NEWSCASTER_MAIN
+ var/paper_remaining = 15
var/securityCaster = 0
// 0 = Caster cannot be used to issue wanted posters
// 1 = the opposite
var/unit_no = 0 //Each newscaster has a unit number
- //var/datum/feed_message/wanted //We're gonna use a feed_message to store data of the wanted person because fields are similar
- //var/wanted_issue = 0 //OBSOLETE
- // 0 = there's no WANTED issued, we don't need a special icon_state
- // 1 = Guess what.
var/alert_delay = 500
var/alert = 0
// 0 = there hasn't been a news/wanted update in the last alert_delay
// 1 = there has
var/scanned_user = "Unknown" //Will contain the name of the person who currently uses the newscaster
- var/msg = ""; //Feed message
+ var/msg = "" //Feed message
var/obj/item/weapon/photo/photo = null
- var/channel_name = ""; //the feed channel which will be receiving the feed, or being created
- var/c_locked=0; //Will our new channel be locked to public submissions?
- var/hitstaken = 0 //Death at 3 hits from an item with force>=15
+ var/channel_name = "" //the feed channel which will be receiving the feed, or being created
+ var/c_locked = 0 //Will our new channel be locked to public submissions?
+ var/hitstaken = 0 //Death at 3 hits from an item with force>=15
var/datum/feed_channel/viewing_channel = null
var/silence = 0
+ var/temp = null
+ var/temp_back_screen = NEWSCASTER_MAIN
+
+ var/static/REDACTED = "\[REDACTED\]"
light_range = 0
anchored = 1
-/obj/machinery/newscaster/security_unit //Security unit
+/obj/machinery/newscaster/security_unit
name = "Security Newscaster"
securityCaster = 1
-/obj/machinery/newscaster/New() //Constructor, ho~
+/obj/machinery/newscaster/New()
allCasters += src
- paper_remaining = 15 // Will probably change this to something better
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) // Let's give it an appropriate unit number
- unit_no++
+ unit_no = allCasters.len
update_icon() //for any custom ones on the map...
- ..() //I just realised the newscasters weren't in the global machines list. The superconstructor call will tend to that
+ ..()
/obj/machinery/newscaster/Destroy()
allCasters -= src
viewing_channel = null
- photo = null
+ if(photo)
+ qdel(photo)
+ photo = null
return ..()
/obj/machinery/newscaster/update_icon()
- if(!ispowered || isbroken)
+ overlays.Cut()
+ if(inoperable())
icon_state = "newscaster_off"
- if(isbroken) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
- overlays.Cut()
+ if(stat & BROKEN) //If the thing is smashed, add crack overlay on top of the unpowered sprite.
overlays += image(icon, "crack3")
- return
+ else
+ if(!news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
+ icon_state = "newscaster_normal"
+ if(alert) //new message alert overlay
+ overlays += "newscaster_alert"
+ else
+ icon_state = "newscaster_wanted"
- overlays.Cut() //reset overlays
-
- if(news_network.wanted_issue) //wanted icon state, there can be no overlays on it as it's a priority message
- icon_state = "newscaster_wanted"
- return
-
- if(alert) //new message alert overlay
- overlays += "newscaster_alert"
-
- if(hitstaken > 0) //Cosmetic damage overlay
- overlays += image(icon, "crack[hitstaken]")
-
- icon_state = "newscaster_normal"
- return
+ if(hitstaken > 0) //Cosmetic damage overlay
+ overlays += image(icon, "crack[hitstaken]")
/obj/machinery/newscaster/power_change()
- if(isbroken) //Broken shit can't be powered.
- return
- if( powered() )
- ispowered = 1
- stat &= ~NOPOWER
- update_icon()
- else
- spawn(rand(0, 15))
- ispowered = 0
- stat |= NOPOWER
- update_icon()
-
+ ..()
+ update_icon()
/obj/machinery/newscaster/ex_act(severity)
switch(severity)
- if(1.0)
+ if(1)
qdel(src)
return
- if(2.0)
- isbroken=1
+ if(2)
+ stat |= BROKEN
if(prob(50))
qdel(src)
else
update_icon() //can't place it above the return and outside the if-else. or we might get runtimes of null.update_icon() if(prob(50)) goes in.
- return
else
if(prob(50))
- isbroken=1
+ stat |= BROKEN
update_icon()
- return
- return
-/obj/machinery/newscaster/attack_ai(mob/user)
- return attack_hand(user)
-
/obj/machinery/newscaster/attack_ghost(mob/user)
return attack_hand(user)
-/obj/machinery/newscaster/attack_hand(mob/user) //########### THE MAIN BEEF IS HERE! And in the proc below this...############
- interact(user)
-
-/obj/machinery/newscaster/interact(mob/user)
- if(!ispowered || isbroken)
+/obj/machinery/newscaster/attack_hand(mob/user)
+ if(..())
return
+ ui_interact(user)
- if(ishuman(user) || issilicon(user) || isobserver(user))
- var/dat
- dat = text("NewscasterNewscaster Unit #[unit_no]
")
+/obj/machinery/newscaster/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1)
+ user.set_machine(src)
+ if(can_scan(user))
+ scan_user(user)
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "newscaster.tmpl", name, 400, 600)
+ ui.open()
- if(can_scan(user))
- scan_user(user) //Newscaster scans you
+/obj/machinery/newscaster/ui_data(user)
+ var/list/data = list()
- switch(screen)
- if(0)
- dat += {"Welcome to Newscasting Unit #[unit_no].
Interface & News networks Operational.
-
Property of Nanotrasen"}
- if(news_network.wanted_issue)
- dat+= "
Read Wanted Issue"
- dat+= {"
Create Feed Channel
-
View Feed Channels
-
Submit new Feed story
-
Print newspaper"}
- if(!silence)
- dat+= "
Silence unit"
+ data["unit_no"] = unit_no
+ data["temp"] = temp
+ data["temp_back_screen"] = temp_back_screen
+ data["screen"] = screen
+
+ switch(screen)
+ if(0)
+ data["wanted_issue"] = news_network.wanted_issue ? 1 : 0
+ data["silence"] = silence
+ data["securityCaster"] = securityCaster
+ if(securityCaster)
+ data["scanned_user"] = scanned_user
+ if(1, 6, 7)
+ var/list/channels = list()
+ data["channels"] = channels
+ for(var/datum/feed_channel/C in news_network.network_channels)
+ channels[++channels.len] = list("name" = C.channel_name, "ref" = "\ref[C]", "censored" = C.censored, "admin" = C.is_admin_channel)
+ if(2)
+ data["scanned_user"] = scanned_user
+ data["channel_name"] = channel_name
+ data["c_locked"] = c_locked
+ if(3)
+ data["scanned_user"] = scanned_user
+ data["channel_name"] = channel_name
+ data["msg"] = msg
+ data["photo"] = photo ? 1 : 0
+ if(4)
+ var/total_num = length(news_network.network_channels)
+ var/active_num = total_num
+ var/message_num=0
+ for(var/datum/feed_channel/FC in news_network.network_channels)
+ if(!FC.censored)
+ message_num += length(FC.messages)
else
- dat+= "
Unsilence unit"
- dat+= {"
Re-scan User
-
Exit"}
- if(securityCaster)
- var/wanted_already = 0
- if(news_network.wanted_issue)
- wanted_already = 1
-
- dat += {"
Feed Security functions:
-
[(wanted_already) ? ("Manage") : ("Publish")] \"Wanted\" Issue
-
Censor Feed Stories
-
Mark Feed Channel with Nanotrasen D-Notice
-
The newscaster recognises you as: [scanned_user]"}
- if(1)
- dat+= "Station Feed Channels
"
- if( isemptylist(news_network.network_channels) )
- dat+="No active channels found..."
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- if(CHANNEL.is_admin_channel)
- dat+="[CHANNEL.channel_name]
"
- else
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
- /*for(var/datum/feed_channel/CHANNEL in channel_list)
- dat+="[CHANNEL.channel_name]:
\[created by: [CHANNEL.author]\]
"
- if( isemptylist(CHANNEL.messages) )
- dat+="No feed messages found in channel...
"
- else
- for(var/datum/feed_message/MESSAGE in CHANNEL.messages)
- dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"*/
-
- dat+="
Refresh"
- dat+="
Back"
- if(2)
- dat+={"Creating new Feed Channel...
-
Channel Name: [channel_name]
- Channel Author: [scanned_user]
- Will Accept Public Feeds: [(c_locked) ? ("NO") : ("YES")]
-
Submit
Cancel
"}
- if(3)
- dat+={"Creating new Feed Message...
-
Receiving Channel: [channel_name]
- Message Author: [scanned_user]
- Message Body: [msg]
- Attach Photo: [(photo ? "Photo Attached" : "No Photo")]
-
Submit
Cancel
"}
- if(4)
- dat+="Feed story successfully submitted to [channel_name].
"
- dat+="
Return
"
- if(5)
- dat+="Feed Channel [channel_name] created successfully.
"
- dat+="
Return
"
- if(6)
- dat+="ERROR: Could not submit Feed story to Network.
"
- if(channel_name=="")
- dat+="Invalid receiving channel name.
"
- if(scanned_user=="Unknown")
- dat+="Channel author unverified.
"
- if(msg == "" || msg == "\[REDACTED\]")
- dat+="Invalid message body.
"
-
- dat+="
Return
"
- if(7)
- dat+="ERROR: Could not submit Feed Channel to Network.
"
- //var/list/existing_channels = list() //Let's get dem existing channels - OBSOLETE
- var/list/existing_authors = list()
- for(var/datum/feed_channel/FC in news_network.network_channels)
- //existing_channels += FC.channel_name //OBSOLETE
- if(FC.author == "\[REDACTED\]")
- existing_authors += FC.backup_author
- else
- existing_authors += FC.author
- if(scanned_user in existing_authors)
- dat+="There already exists a Feed channel under your name.
"
- if(channel_name=="" || channel_name == "\[REDACTED\]")
- dat+="Invalid channel name.
"
- var/check = 0
- for(var/datum/feed_channel/FC in news_network.network_channels)
- if(FC.channel_name == channel_name)
- check = 1
- break
- if(check)
- dat+="Channel name already in use.
"
- if(scanned_user=="Unknown")
- dat+="Channel author unverified.
"
- dat+="
Return
"
- if(8)
- var/total_num=length(news_network.network_channels)
- var/active_num=total_num
- var/message_num=0
- for(var/datum/feed_channel/FC in news_network.network_channels)
- if(!FC.censored)
- message_num += length(FC.messages) //Dont forget, datum/feed_channel's var messages is a list of datum/feed_message
- else
- active_num--
- dat+="Network currently serves a total of [total_num] Feed channels, [active_num] of which are active, and a total of [message_num] Feed Stories." //TODO: CONTINUE
- dat+="
Liquid Paper remaining: [(paper_remaining) *100 ] cm^3"
- dat+="
Print Paper"
- dat+="
Cancel"
- if(9)
- dat+="[viewing_channel.channel_name]: \[created by: [viewing_channel.author]\]
"
- dat+="Feed view count: [viewing_channel.total_view_count]
"
- viewing_channel.total_view_count++
- if(viewing_channel.censored)
- dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
"
- dat+="No further feed story additions are allowed while the D-Notice is in effect.
"
- else
- if( isemptylist(viewing_channel.messages) )
- dat+="No feed messages found in channel...
"
- else
- var/i = 0
- for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
- i++
- dat+="-[MESSAGE.body]
"
- if(MESSAGE.img)
- usr << browse_rsc(MESSAGE.img, "tmp_photo[i].png")
- dat+="
"
- dat+="\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
- dat+="Message view count: [MESSAGE.view_count]
"
- MESSAGE.view_count++
- dat+="
Refresh"
- dat+="
Back"
- if(10)
- dat+="Nanotrasen Feed Censorship Tool
"
- dat+="NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
"
- dat+="Keep in mind that users attempting to view a censored feed will instead see the \[REDACTED\] tag above it."
- dat+="
Select Feed channel to get Stories from:
"
- if(isemptylist(news_network.network_channels))
- dat+="No feed channels found active...
"
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
- dat+="
Cancel"
- if(11)
- dat+="Nanotrasen D-Notice Handler
"
- dat+="A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station's"
- dat+="morale, integrity or disciplinary behaviour. A D-Notice will render a channel unable to be updated by anyone, without deleting any feed"
- dat+="stories it might contain at the time. You can lift a D-Notice if you have the required access at any time.
"
- if(isemptylist(news_network.network_channels))
- dat+="No feed channels found active...
"
- else
- for(var/datum/feed_channel/CHANNEL in news_network.network_channels)
- dat+="[CHANNEL.channel_name] [(CHANNEL.censored) ? ("***") : ()]
"
-
- dat+="
Back"
- if(12)
- dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.author] \]
"
- dat+="[(viewing_channel.author=="\[REDACTED\]") ? ("Undo Author censorship") : ("Censor channel Author")]
"
-
-
- if( isemptylist(viewing_channel.messages) )
- dat+="No feed messages found in channel...
"
- else
- for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
- dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
- dat+="[(MESSAGE.body == "\[REDACTED\]") ? ("Undo story censorship") : ("Censor story")] - [(MESSAGE.author == "\[REDACTED\]") ? ("Undo Author Censorship") : ("Censor message Author")]
"
- dat+="
Back"
- if(13)
- dat+="[viewing_channel.channel_name]: \[ created by: [viewing_channel.author] \]
"
- dat+="Channel messages listed below. If you deem them dangerous to the station, you can Bestow a D-Notice upon the channel.
"
- if(viewing_channel.censored)
- dat+="ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
"
- dat+="No further feed story additions are allowed while the D-Notice is in effect.
"
- else
- if( isemptylist(viewing_channel.messages) )
- dat+="No feed messages found in channel...
"
- else
- for(var/datum/feed_message/MESSAGE in viewing_channel.messages)
- dat+="-[MESSAGE.body]
\[[MESSAGE.message_type] by [MESSAGE.author]\]
"
-
- dat+="
Back"
- if(14)
- dat+="Wanted Issue Handler:"
- var/wanted_already = 0
- var/end_param = 1
- if(news_network.wanted_issue)
- wanted_already = 1
- end_param = 2
-
- if(wanted_already)
- dat+="
A wanted issue is already in Feed Circulation. You can edit or cancel it below."
- dat+="
"
- dat+="Criminal Name: [channel_name]
"
- dat+="Description: [msg]
"
- dat+="Attach Photo: [(photo ? "Photo Attached" : "No Photo")]"
- if(wanted_already)
- dat+="Wanted Issue created by: [news_network.wanted_issue.backup_author]
"
- else
- dat+="Wanted Issue will be created under prosecutor: [scanned_user]
"
- dat+="
[(wanted_already) ? ("Edit Issue") : ("Submit")]"
- if(wanted_already)
- dat+="
Take down Issue"
- dat+="
Cancel"
- if(15)
- dat+="Wanted issue for [channel_name] is now in Network Circulation.
"
- dat+="
Return
"
- if(16)
- dat+="ERROR: Wanted Issue rejected by Network.
"
- if(channel_name=="" || channel_name == "\[REDACTED\]")
- dat+="Invalid name for person wanted.
"
- if(scanned_user=="Unknown")
- dat+="Issue author unverified.
"
- if(msg == "" || msg == "\[REDACTED\]")
- dat+="Invalid description.
"
- dat+="
Return
"
- if(17)
- dat+="Wanted Issue successfully deleted from Circulation
"
- dat+="
Return
"
- if(18)
- dat+="-- STATIONWIDE WANTED ISSUE --
\[Submitted by: [news_network.wanted_issue.backup_author]\]
"
- dat+="Criminal: [news_network.wanted_issue.author]
"
- dat+="Description: [news_network.wanted_issue.body]
"
- dat+="Photo:: "
- if(news_network.wanted_issue.img)
- usr << browse_rsc(news_network.wanted_issue.img, "tmp_photow.png")
- dat+="
"
- else
- dat+="None"
- dat+="
Back
"
- if(19)
- dat+="Wanted issue for [channel_name] successfully edited.
"
- dat+="
Return
"
- if(20)
- dat+="Printing successfull. Please receive your newspaper from the bottom of the machine.
"
- dat+="Return"
- if(21)
- dat+="Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage.
"
- dat+="Return"
+ active_num--
+ data["total_num"] = total_num
+ data["active_num"] = active_num
+ data["message_num"] = message_num
+ data["paper_remaining"] = paper_remaining * 100
+ if(5)
+ data["channel_name"] = viewing_channel.channel_name
+ data["author"] = viewing_channel.author
+ data["total_view_count"] = viewing_channel.total_view_count
+ data["censored"] = viewing_channel.censored
+ var/list/messages = list()
+ data["messages"] = messages
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ messages[++messages.len] = list("body" = M.body, "img" = M.img ? icon2base64(M.img) : null, "message_type" = M.message_type, "author" = M.author, "view_count" = M.view_count)
+ if(8, 9)
+ data["channel_name"] = viewing_channel.channel_name
+ data["ref"] = "\ref[viewing_channel]"
+ data["author"] = viewing_channel.author
+ data["author_redacted"] = viewing_channel.author == REDACTED ? 1 : 0
+ data["total_view_count"] = viewing_channel.total_view_count
+ data["censored"] = viewing_channel.censored
+ var/list/messages = list()
+ data["messages"] = messages
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ messages[++messages.len] = list("body" = M.body, "body_redacted" = (M.body == REDACTED ? 1 : 0) , "message_type" = M.message_type, "author" = M.author, "author_redacted" = (M.author == REDACTED ? 1 : 0), "ref" = "\ref[M]", "view_count" = M.view_count)
+ if(10)
+ var/wanted_already = 0
+ var/end_param = 1
+ if(news_network.wanted_issue)
+ wanted_already = 1
+ end_param = 2
+ data["wanted_already"] = wanted_already
+ data["end_param"] = end_param
+ data["channel_name"] = channel_name
+ data["msg"] = msg
+ data["photo"] = photo ? 1 : 0
+ if(wanted_already)
+ data["author"] = news_network.wanted_issue.backup_author
else
- dat+="I'm sorry to break your immersion. This shit's bugged. Report this bug to Agouri, polyxenitopalidou@gmail.com"
+ data["scanned_user"] = scanned_user
+ if(11)
+ data["author"] = news_network.wanted_issue.backup_author
+ data["criminal"] = news_network.wanted_issue.author
+ data["description"] = news_network.wanted_issue.body
+ data["photo"] = news_network.wanted_issue.img ? icon2base64(news_network.wanted_issue.img) : 0
+ return data
-
- var/datum/browser/popup = new(user, "newscaster_main", name, 400, 600)
- popup.set_content(dat)
- popup.open(0)
- onclose(user, "newscaster_main")
-
/obj/machinery/newscaster/Topic(href, href_list)
if(..())
return 1
- usr.set_machine(src)
if(href_list["set_channel_name"])
channel_name = sanitizeSQL(strip_html_simple(input(usr, "Provide a Feed Channel Name", "Network Channel Handler", "")))
while(findtext(channel_name," ") == 1)
- channel_name = copytext(channel_name,2,lentext(channel_name)+1)
- updateUsrDialog()
- //update_icon()
+ channel_name = copytext(channel_name, 2, lentext(channel_name) + 1)
else if(href_list["set_channel_lock"])
c_locked = !c_locked
- updateUsrDialog()
- //update_icon()
else if(href_list["submit_new_channel"])
- //var/list/existing_channels = list() //OBSOLETE
var/list/existing_authors = list()
for(var/datum/feed_channel/FC in news_network.network_channels)
- //existing_channels += FC.channel_name
- if(FC.author == "\[REDACTED\]")
+ if(FC.author == REDACTED)
existing_authors += FC.backup_author
else
- existing_authors +=FC.author
+ existing_authors += FC.author
var/check = 0
for(var/datum/feed_channel/FC in news_network.network_channels)
if(FC.channel_name == channel_name)
check = 1
break
- if(channel_name == "" || channel_name == "\[REDACTED\]" || scanned_user == "Unknown" || check || (scanned_user in existing_authors) )
- screen=7
+ if(channel_name == "" || channel_name == REDACTED || scanned_user == "Unknown" || check || (scanned_user in existing_authors))
+ temp = "ERROR: Could not submit feed channel to Network."
+ if(scanned_user in existing_authors)
+ temp += "- There already exists a feed channel under your name.
"
+ if(channel_name == "" || channel_name == REDACTED)
+ temp += "- Invalid channel name.
"
+ if(check)
+ temp += "- Channel name already in use.
"
+ if(scanned_user == "Unknown")
+ temp += "- Channel author unverified.
"
+ temp += "
"
+ temp_back_screen = NEWSCASTER_CREATE_FC
else
- var/choice = alert("Please confirm Feed channel creation","Network Channel Handler","Confirm","Cancel")
- if(choice=="Confirm")
+ var/choice = alert("Please confirm feed channel creation", "Network Channel Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
var/datum/feed_channel/newChannel = new /datum/feed_channel
newChannel.channel_name = channel_name
newChannel.author = scanned_user
newChannel.locked = c_locked
- feedback_inc("newscaster_channels",1)
- /*for(var/obj/machinery/newscaster/NEWSCASTER in allCasters) //Let's add the new channel in all casters.
- NEWSCASTER.channel_list += newChannel*/ //Now that it is sane, get it into the list. -OBSOLETE
- news_network.network_channels += newChannel //Adding channel to the global network
- screen=5
- updateUsrDialog()
- //update_icon()
+ feedback_inc("newscaster_channels", 1)
+ news_network.network_channels += newChannel //Adding channel to the global network
+ temp = "Feed channel '[channel_name]' created successfully."
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["set_channel_receiving"])
- //var/list/datum/feed_channel/available_channels = list()
var/list/available_channels = list()
for(var/datum/feed_channel/F in news_network.network_channels)
- if( (!F.locked || F.author == scanned_user) && !F.censored)
+ if((!F.locked || F.author == scanned_user) && !F.censored)
available_channels += F.channel_name
- channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels )
- updateUsrDialog()
+ channel_name = strip_html_simple(input(usr, "Choose receiving Feed Channel", "Network Channel Handler") in available_channels)
else if(href_list["set_new_message"])
msg = strip_html(input(usr, "Write your feed story", "Network Channel Handler", ""))
- while(findtext(msg," ") == 1)
- msg = copytext(msg,2,lentext(msg)+1)
- updateUsrDialog()
+ while(findtext(msg, " ") == 1)
+ msg = copytext(msg, 2, lentext(msg) + 1)
else if(href_list["set_attachment"])
AttachPhoto(usr)
- updateUsrDialog()
else if(href_list["submit_new_message"])
- if(msg =="" || msg=="\[REDACTED\]" || scanned_user == "Unknown" || channel_name == "" )
- screen=6
+ if(msg == "" || msg == REDACTED || scanned_user == "Unknown" || channel_name == "" )
+ temp = "ERROR: Could not submit feed story to Network."
+ if(channel_name == "")
+ temp += "- Invalid receiving channel name.
"
+ if(scanned_user == "Unknown")
+ temp += "- Channel author unverified.
"
+ if(msg == "" || msg == REDACTED)
+ temp += "- Invalid message body.
"
+ temp += "
"
+ temp_back_screen = NEWSCASTER_CREATE_FM
else
var/datum/feed_message/newMsg = new /datum/feed_message
newMsg.author = scanned_user
@@ -534,46 +343,37 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
FC.messages += newMsg //Adding message to the network's appropriate feed_channel
announcement = FC.announce_news()
break
- screen=4
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert(announcement)
-
- updateUsrDialog()
+ temp = "Feed story successfully submitted to [channel_name]."
+ temp_back_screen = NEWSCASTER_MAIN
+ for(var/obj/machinery/newscaster/NC in allCasters)
+ NC.newsAlert(announcement)
else if(href_list["create_channel"])
- screen=2
- updateUsrDialog()
+ screen = NEWSCASTER_CREATE_FC
else if(href_list["create_feed_story"])
- screen=3
- updateUsrDialog()
+ screen = NEWSCASTER_CREATE_FM
else if(href_list["menu_paper"])
- screen=8
- updateUsrDialog()
+ screen = NEWSCASTER_PRINT
+
else if(href_list["print_paper"])
if(!paper_remaining)
- screen=21
+ temp = "Unable to print newspaper. Insufficient paper. Please notify maintenance personnell to refill machine storage."
+ temp_back_screen = NEWSCASTER_MAIN
else
print_paper()
- screen = 20
- updateUsrDialog()
+ temp = "Printing successful. Please receive your newspaper from the bottom of the machine."
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["silence_unit"])
- silence=1
- updateUsrDialog()
-
- else if(href_list["unsilence_unit"])
- silence=0
- updateUsrDialog()
+ silence = !silence
else if(href_list["menu_censor_story"])
- screen=10
- updateUsrDialog()
+ screen = NEWSCASTER_NT_CENSOR
else if(href_list["menu_censor_channel"])
- screen=11
- updateUsrDialog()
+ screen = NEWSCASTER_D_NOTICE
else if(href_list["menu_wanted"])
var/already_wanted = 0
@@ -583,40 +383,46 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
if(already_wanted)
channel_name = news_network.wanted_issue.author
msg = news_network.wanted_issue.body
- screen = 14
- updateUsrDialog()
+ screen = NEWSCASTER_W_ISSUE_H
else if(href_list["set_wanted_name"])
- channel_name = strip_html(input(usr, "Provide the name of the Wanted person", "Network Security Handler", ""))
- while(findtext(channel_name," ") == 1)
- channel_name = copytext(channel_name,2,lentext(channel_name)+1)
- updateUsrDialog()
+ channel_name = strip_html(input(usr, "Provide the name of the wanted person", "Network Security Handler", ""))
+ while(findtext(channel_name, " ") == 1)
+ channel_name = copytext(channel_name, 2, lentext(channel_name) + 1)
else if(href_list["set_wanted_desc"])
- msg = strip_html(input(usr, "Provide the a description of the Wanted person and any other details you deem important", "Network Security Handler", ""))
- while(findtext(msg," ") == 1)
- msg = copytext(msg,2,lentext(msg)+1)
- updateUsrDialog()
+ msg = strip_html(input(usr, "Provide the a description of the wanted person and any other details you deem important", "Network Security Handler", ""))
+ while(findtext(msg, " ") == 1)
+ msg = copytext(msg, 2, lentext(msg) + 1)
else if(href_list["submit_wanted"])
var/input_param = text2num(href_list["submit_wanted"])
if(msg == "" || channel_name == "" || scanned_user == "Unknown")
- screen = 16
+ temp = "ERROR: Wanted issue rejected by Network."
+ if(channel_name == "" || channel_name == REDACTED)
+ temp += "- Invalid name for person wanted.
"
+ if(scanned_user == "Unknown")
+ temp += "- Channel author unverified.
"
+ if(msg == "" || msg == REDACTED)
+ temp += "- Invalid description.
"
+ temp += "
"
+ temp_back_screen = NEWSCASTER_MAIN
else
- var/choice = alert("Please confirm Wanted Issue [(input_param==1) ? ("creation.") : ("edit.")]","Network Security Handler","Confirm","Cancel")
- if(choice=="Confirm")
- if(input_param==1) //If input_param == 1 we're submitting a new wanted issue. At 2 we're just editing an existing one. See the else below
- var/datum/feed_message/WANTED = new /datum/feed_message
- WANTED.author = channel_name
- WANTED.body = msg
- WANTED.backup_author = scanned_user //I know, a bit wacky
+ var/choice = alert("Please confirm wanted issue [input_param == 1 ? "creation." : "edit."]", "Network Security Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
+ if(input_param == 1) //input_param == 1: new wanted issue, input_param == 2: editing an existing one
+ var/datum/feed_message/W = new /datum/feed_message
+ W.author = channel_name
+ W.body = msg
+ W.backup_author = scanned_user //I know, a bit wacky
if(photo)
- WANTED.img = photo.img
- news_network.wanted_issue = WANTED
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.newsAlert()
- NEWSCASTER.update_icon()
- screen = 15
+ W.img = photo.img
+ news_network.wanted_issue = W
+ for(var/obj/machinery/newscaster/NS in allCasters)
+ NS.newsAlert()
+ NS.update_icon()
+ temp = "Wanted issue for [channel_name] is now in Network Circulation."
+ temp_back_screen = NEWSCASTER_MAIN
else
if(news_network.wanted_issue.is_admin_message)
alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot edit it.","Ok")
@@ -626,154 +432,160 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
news_network.wanted_issue.backup_author = scanned_user
if(photo)
news_network.wanted_issue.img = photo.img
- screen = 19
-
- updateUsrDialog()
+ temp = "Wanted issue for [channel_name] successfully edited."
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["cancel_wanted"])
if(news_network.wanted_issue.is_admin_message)
- alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.","Ok")
+ alert("The wanted issue has been distributed by a Nanotrasen higherup. You cannot take it down.", "Ok")
return
- var/choice = alert("Please confirm Wanted Issue removal","Network Security Handler","Confirm","Cancel")
- if(choice=="Confirm")
+ var/choice = alert("Please confirm wanted issue removal", "Network Security Handler", "Confirm", "Cancel")
+ if(choice == "Confirm")
news_network.wanted_issue = null
- for(var/obj/machinery/newscaster/NEWSCASTER in allCasters)
- NEWSCASTER.update_icon()
- screen=17
- updateUsrDialog()
+ for(var/obj/machinery/newscaster/NC in allCasters)
+ NC.update_icon()
+ temp = "Wanted Issue successfully deleted from Circulation"
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["view_wanted"])
- screen=18
- updateUsrDialog()
+ screen = NEWSCASTER_W_ISSUE
else if(href_list["censor_channel_author"])
var/datum/feed_channel/FC = locate(href_list["censor_channel_author"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(FC.author != "\[REDACTED\]")
- FC.backup_author = FC.author
- FC.author = "\[REDACTED\]"
- else
- FC.author = FC.backup_author
- updateUsrDialog()
+ if(FC)
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(FC.author != REDACTED)
+ FC.backup_author = FC.author
+ FC.author = REDACTED
+ else
+ FC.author = FC.backup_author
else if(href_list["censor_channel_story_author"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_author"])
- if(MSG.is_admin_message)
- alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
- return
- if(MSG.author != "\[REDACTED\]")
- MSG.backup_author = MSG.author
- MSG.author = "\[REDACTED\]"
- else
- MSG.author = MSG.backup_author
- updateUsrDialog()
+ var/datum/feed_message/M = locate(href_list["censor_channel_story_author"])
+ if(M)
+ if(M.is_admin_message)
+ alert("This message was created by a Nanotrasen Officer. You cannot censor its author.","Ok")
+ return
+ if(M.author != REDACTED)
+ M.backup_author = M.author
+ M.author = REDACTED
+ else
+ M.author = M.backup_author
else if(href_list["censor_channel_story_body"])
- var/datum/feed_message/MSG = locate(href_list["censor_channel_story_body"])
- if(MSG.is_admin_message)
- alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
- return
- if(MSG.img != null)
- MSG.backup_img = MSG.img
- MSG.img = null
- else
- MSG.img = MSG.backup_img
- if(MSG.body != "\[REDACTED\]")
- MSG.backup_body = MSG.body
- MSG.body = "\[REDACTED\]"
- else
- MSG.body = MSG.backup_body
- updateUsrDialog()
+ var/datum/feed_message/M = locate(href_list["censor_channel_story_body"])
+ if(M)
+ if(M.is_admin_message)
+ alert("This channel was created by a Nanotrasen Officer. You cannot censor it.","Ok")
+ return
+ if(M.img != null)
+ M.backup_img = M.img
+ M.img = null
+ else
+ M.img = M.backup_img
+ if(M.body != REDACTED)
+ M.backup_body = M.body
+ M.body = REDACTED
+ else
+ M.body = M.backup_body
else if(href_list["pick_d_notice"])
var/datum/feed_channel/FC = locate(href_list["pick_d_notice"])
- viewing_channel = FC
- screen=13
- updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ screen = NEWSCASTER_D_NOTICE_FC
else if(href_list["toggle_d_notice"])
var/datum/feed_channel/FC = locate(href_list["toggle_d_notice"])
- if(FC.is_admin_channel)
- alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.","Ok")
- return
- FC.censored = !FC.censored
- updateUsrDialog()
+ if(FC)
+ if(FC.is_admin_channel)
+ alert("This channel was created by a Nanotrasen Officer. You cannot place a D-Notice upon it.", "Ok")
+ return
+ FC.censored = !FC.censored
else if(href_list["view"])
- screen=1
- updateUsrDialog()
+ screen = NEWSCASTER_FC_LIST
else if(href_list["setScreen"]) //Brings us to the main menu and resets all fields~
screen = text2num(href_list["setScreen"])
- if(screen == 0)
- scanned_user = "Unknown";
- msg = "";
- c_locked=0;
- channel_name="";
+ if(screen == NEWSCASTER_MAIN)
+ scanned_user = "Unknown"
+ msg = ""
+ c_locked = 0
+ channel_name = ""
viewing_channel = null
- updateUsrDialog()
+ temp = null
+ temp_back_screen = NEWSCASTER_MAIN
else if(href_list["show_channel"])
var/datum/feed_channel/FC = locate(href_list["show_channel"])
- viewing_channel = FC
- screen = 9
- updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ viewing_channel.total_view_count++
+ for(var/datum/feed_message/M in viewing_channel.messages)
+ M.view_count++
+ screen = NEWSCASTER_VIEW_FC
else if(href_list["pick_censor_channel"])
var/datum/feed_channel/FC = locate(href_list["pick_censor_channel"])
- viewing_channel = FC
- screen = 12
- updateUsrDialog()
+ if(FC)
+ viewing_channel = FC
+ screen = NEWSCASTER_CENSOR_FC
else if(href_list["refresh"])
- updateUsrDialog()
+ if(can_scan(usr))
+ scan_user(usr) //Newscaster scans you
-/obj/machinery/newscaster/attackby(obj/item/I as obj, mob/living/user as mob, params)
+ nanomanager.update_uis(src)
+ return 1
+
+/obj/machinery/newscaster/attackby(obj/item/I, mob/living/user, params)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "Now [anchored ? "un" : ""]securing [name]")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 60, target = src))
+ playsound(loc, I.usesound, 50, 1)
+ if(do_after(user, 60 * I.toolspeed, target = src))
new /obj/item/mounted/frame/newscaster_frame(loc)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
qdel(src)
return
- if(isbroken)
+ if(stat & BROKEN)
playsound(loc, 'sound/effects/hit_on_shattered_glass.ogg', 100, 1)
- visible_message("[user.name] further abuses the shattered [name].", null, 5 )
+ visible_message("[user.name] further abuses the shattered [name].", null, 5)
else
if(istype(I, /obj/item/weapon) )
var/obj/item/weapon/W = I
if(W.damtype == STAMINA)
return
- if(W.force <15)
- visible_message("[user.name] hits the [name] with the [W.name] with no visible effect.", null , 5 )
+ if(W.force < 15)
+ visible_message("[user.name] hits the [name] with the [W.name] with no visible effect.", null , 5)
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
hitstaken++
- if(hitstaken==3)
- visible_message("[user.name] smashes the [name]!", null, 5 )
- isbroken=1
+ if(hitstaken == 3)
+ visible_message("[user.name] smashes the [name]!", null, 5)
+ stat |= BROKEN
playsound(loc, 'sound/effects/Glassbr3.ogg', 100, 1)
else
- visible_message("[user.name] forcefully slams the [name] with the [I.name]!", null, 5 )
+ visible_message("[user.name] forcefully slams the [name] with the [I.name]!", null, 5)
playsound(loc, 'sound/effects/Glasshit.ogg', 100, 1)
else
- to_chat(user, "This does nothing.")
+ to_chat(user, "This does nothing.")
update_icon()
+ ..()
-/obj/machinery/newscaster/proc/AttachPhoto(mob/user as mob)
+/obj/machinery/newscaster/proc/AttachPhoto(mob/user)
if(photo)
if(!issilicon(user))
- photo.loc = loc
+ photo.forceMove(get_turf(src))
user.put_in_inactive_hand(photo)
photo = null
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
photo = user.get_active_hand()
user.drop_item()
- photo.loc = src
- else if(istype(user,/mob/living/silicon))
+ photo.forceMove(src)
+ else if(issilicon(user))
var/mob/living/silicon/tempAI = user
var/obj/item/device/camera/siliconcam/camera = tempAI.aiCamera
@@ -960,7 +772,7 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co
scanned_user = "[ai_user.name] ([ai_user.job])"
else
scanned_user = "Unknown"
-
+
/obj/machinery/newscaster/proc/can_scan(mob/user)
if(ishuman(user) || issilicon(user))
return TRUE
diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm
index bf2eedeaf23..ef42de6ca60 100644
--- a/code/game/machinery/pipe/construction.dm
+++ b/code/game/machinery/pipe/construction.dm
@@ -620,7 +620,7 @@
var/obj/machinery/atmospherics/omni/filter/P = new(loc)
P.construction(dir, pipe_dir, color)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message( \
"[user] fastens the [src].", \
"\blue You have fastened the [src].", \
@@ -645,8 +645,8 @@
if(!locate(/obj/machinery/atmospherics/pipe, src.loc))
to_chat(user, "\red You need to fasten it to a pipe")
return 1
- new/obj/machinery/meter( src.loc )
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ new /obj/machinery/meter(loc)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "\blue You have fastened the meter to the pipe")
qdel(src)
@@ -663,7 +663,7 @@
if(!istype(W, /obj/item/weapon/wrench))
return ..()
new/obj/machinery/air_sensor( src.loc )
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
to_chat(user, "\blue You have fastened the gas sensor")
qdel(src)
diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm
index d7ac49381b9..37836e8f798 100644
--- a/code/game/machinery/pipe/pipe_dispenser.dm
+++ b/code/game/machinery/pipe/pipe_dispenser.dm
@@ -112,9 +112,9 @@
return
else if(istype(W, /obj/item/weapon/wrench))
if(unwrenched==0)
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You begin to unfasten \the [src] from the floor...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"You have unfastened \the [src]. Now it can be pulled somewhere else.", \
@@ -125,9 +125,9 @@
if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
else /*if(unwrenched==1)*/
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You begin to fasten \the [src] to the floor...")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
"You have fastened \the [src]. Now it can dispense pipes.", \
diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm
index 28b3cfe7132..461df0e39f7 100644
--- a/code/game/machinery/portable_turret.dm
+++ b/code/game/machinery/portable_turret.dm
@@ -337,7 +337,7 @@ var/list/turret_icons
//If the turret is destroyed, you can remove it with a crowbar to
//try and salvage its components
to_chat(user, "You begin prying the metal coverings off.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * I.toolspeed, target = src))
if(prob(70))
to_chat(user, "You remove the turret and salvage some components.")
if(installation)
@@ -369,15 +369,15 @@ var/list/turret_icons
)
wrenching = 1
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
//This code handles moving the turret around. After all, it's a portable turret!
if(!anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
anchored = 1
update_icon()
to_chat(user, "You secure the exterior bolts on the turret.")
else if(anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
anchored = 0
to_chat(user, "You unsecure the exterior bolts on the turret.")
update_icon()
@@ -778,14 +778,14 @@ var/list/turret_icons
switch(build_step)
if(0) //first step
if(istype(I, /obj/item/weapon/wrench) && !anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You secure the external bolts.")
anchored = 1
build_step = 1
return
else if(istype(I, /obj/item/weapon/crowbar) && !anchored)
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You dismantle the turret construction.")
new /obj/item/stack/sheet/metal( loc, 5)
qdel(src) // qdel
@@ -803,7 +803,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You unfasten the external bolts.")
anchored = 0
build_step = 0
@@ -812,7 +812,7 @@ var/list/turret_icons
if(2)
if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You bolt the metal armor into place.")
build_step = 3
return
@@ -825,8 +825,8 @@ var/list/turret_icons
to_chat(user, "You need more fuel to complete this task.")
return
- playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(5, user)) return
build_step = 1
to_chat(user, "You remove the turret's interior metal armor.")
@@ -857,7 +857,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
to_chat(user, "You remove the turret's metal armor bolts.")
build_step = 2
return
@@ -876,7 +876,7 @@ var/list/turret_icons
if(5)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
build_step = 6
to_chat(user, "You close the internal access hatch.")
return
@@ -894,7 +894,7 @@ var/list/turret_icons
return
else if(istype(I, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
build_step = 5
to_chat(user, "You open the internal access hatch.")
return
@@ -906,8 +906,8 @@ var/list/turret_icons
if(WT.get_fuel() < 5)
to_chat(user, "You need more fuel to complete this task.")
- playsound(loc, pick('sound/items/Welder.ogg', 'sound/items/Welder2.ogg'), 50, 1)
- if(do_after(user, 30, target = src))
+ playsound(loc, WT.usesound, 50, 1)
+ if(do_after(user, 30 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(5, user))
return
build_step = 8
@@ -924,7 +924,7 @@ var/list/turret_icons
qdel(src) // qdel
else if(istype(I, /obj/item/weapon/crowbar))
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, I.usesound, 75, 1)
to_chat(user, "You pry off the turret's exterior armor.")
new /obj/item/stack/sheet/metal(loc, 2)
build_step = 6
diff --git a/code/game/machinery/programmable_unloader.dm b/code/game/machinery/programmable_unloader.dm
index e41dfd2f79f..e9f7a55b039 100644
--- a/code/game/machinery/programmable_unloader.dm
+++ b/code/game/machinery/programmable_unloader.dm
@@ -198,9 +198,9 @@
/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob, params)
if(istype(I,/obj/item/weapon/wrench)) // code borrowed from pipe dispenser
if(unwrenched==0)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "\blue You begin to unfasten \the [src] from the floor...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * I.toolspeed, target = src))
user.visible_message( \
"[user] unfastens \the [src].", \
"\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
@@ -211,9 +211,9 @@
if(usr.machine==src)
usr << browse(null, "window=pipedispenser")
else /* unwrenched */
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "\blue You begin to fasten \the [src] to the floor...")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * I.toolspeed, target = src))
user.visible_message( \
"[user] fastens \the [src].", \
"\blue You fastened \the [src] into place.", \
@@ -238,8 +238,9 @@
if(istype(I,/obj/item/weapon/crowbar))
if(open)
to_chat(user, "\blue You begin to pry out the [src]'s circuits.")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * I.toolspeed, target = src))
to_chat(user, "\blue You remove the circuitboard.")
+ playsound(loc, I.usesound, 50, 1)
circuit_removed = 1
use_power = 0
on = 0
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 6db7199a7f0..cbf20e838f3 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -57,7 +57,7 @@
return
anchored = !anchored
to_chat(user, "You [anchored ? "attached" : "detached"] the recharger.")
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, G.usesound, 75, 1)
/obj/machinery/recharger/attack_hand(mob/user as mob)
add_fingerprint(user)
diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm
index a3f7ee5189a..fad1ae8de2d 100644
--- a/code/game/machinery/shieldgen.dm
+++ b/code/game/machinery/shieldgen.dm
@@ -238,7 +238,7 @@
update_icon()
else if(istype(W, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
if(is_open)
to_chat(user, "\blue You close the panel.")
is_open = 0
@@ -250,11 +250,12 @@
var/obj/item/stack/cable_coil/coil = W
to_chat(user, "\blue You begin to replace the wires.")
//if(do_after(user, min(60, round( ((maxhealth/health)*10)+(malfunction*10) ), target = src)) //Take longer to repair heavier damage
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * coil.toolspeed, target = src))
if(!src || !coil) return
coil.use(1)
health = max_health
malfunction = 0
+ playsound(loc, coil.usesound, 50, 1)
to_chat(user, "\blue You repair the [src]!")
update_icon()
@@ -263,7 +264,7 @@
to_chat(user, "The bolts are covered, unlocking this would retract the covers.")
return
if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue You unsecure the [src] from the floor!")
if(active)
to_chat(user, "\blue The [src] shuts off!")
@@ -271,7 +272,7 @@
anchored = 0
else
if(istype(get_turf(src), /turf/space)) return //No wrenching these in space!
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue You secure the [src] to the floor!")
anchored = 1
@@ -460,14 +461,14 @@
else if(state == 0)
state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(user, "You secure the external reinforcing bolts to the floor.")
src.anchored = 1
return
else if(state == 1)
state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(user, "You undo the external reinforcing bolts.")
src.anchored = 0
return
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index b50fc3566d8..85d48ceeaaa 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -41,33 +41,33 @@
MASK_TYPE = /obj/item/clothing/mask/gas
/obj/machinery/suit_storage_unit/engine
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/engineering
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/engineering
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/engineering
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/engineering
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/ce
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/elite
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/elite
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/elite
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/elite
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/security
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/security
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/security
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/security
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/security
MASK_TYPE = /obj/item/clothing/mask/gas/sechailer
/obj/machinery/suit_storage_unit/atmos
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/atmos
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/atmos
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/atmos
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/atmos
MASK_TYPE = /obj/item/clothing/mask/gas
/obj/machinery/suit_storage_unit/mining
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/mining
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/mining
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/mining
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/mining
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/cmo
- SUIT_TYPE = /obj/item/clothing/suit/space/rig/medical
- HELMET_TYPE = /obj/item/clothing/head/helmet/space/rig/medical
+ SUIT_TYPE = /obj/item/clothing/suit/space/hardsuit/medical
+ HELMET_TYPE = /obj/item/clothing/head/helmet/space/hardsuit/medical
MASK_TYPE = /obj/item/clothing/mask/breath
/obj/machinery/suit_storage_unit/New()
@@ -503,7 +503,7 @@
return
if(istype(I, /obj/item/weapon/screwdriver))
src.panelopen = !src.panelopen
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, I.usesound, 100, 1)
to_chat(user, text("You [] the unit's maintenance panel.",(src.panelopen ? "open up" : "close") ))
src.updateUsrDialog()
return
@@ -628,7 +628,7 @@
var/target_species = "Human"
var/mob/living/carbon/human/occupant = null
- var/obj/item/clothing/suit/space/rig/suit = null
+ var/obj/item/clothing/suit/space/hardsuit/suit = null
var/obj/item/clothing/head/helmet/space/helmet = null
/obj/machinery/suit_cycler/engineering
@@ -714,7 +714,7 @@
src.updateUsrDialog()
return
- else if(istype(I,/obj/item/clothing/suit/space/rig))
+ else if(istype(I,/obj/item/clothing/suit/space/hardsuit))
if(locked)
to_chat(user, "\red The suit cycler is locked.")
@@ -724,7 +724,7 @@
to_chat(user, "The cycler already contains a hardsuit.")
return
- var/obj/item/clothing/suit/space/rig/S = I
+ var/obj/item/clothing/suit/space/hardsuit/S = I
if(S.helmet)
to_chat(user, "\The [S] will not fit into the cycler with a helmet attached.")
@@ -1049,60 +1049,60 @@
if("Engineering")
if(helmet)
helmet.name = "engineering hardsuit helmet"
- helmet.icon_state = "rig0-engineering"
+ helmet.icon_state = "hardsuit0-engineering"
helmet.item_state = "eng_helm"
helmet.item_color = "engineering"
if(suit)
suit.name = "engineering hardsuit"
- suit.icon_state = "rig-engineering"
+ suit.icon_state = "hardsuit-engineering"
suit.item_state = "eng_hardsuit"
if("Mining")
if(helmet)
helmet.name = "mining hardsuit helmet"
- helmet.icon_state = "rig0-mining"
+ helmet.icon_state = "hardsuit0-mining"
helmet.item_state = "mining_helm"
helmet.item_color = "mining"
if(suit)
suit.name = "mining hardsuit"
- suit.icon_state = "rig-mining"
+ suit.icon_state = "hardsuit-mining"
suit.item_state = "mining_hardsuit"
if("Medical")
if(helmet)
helmet.name = "medical hardsuit helmet"
- helmet.icon_state = "rig0-medical"
+ helmet.icon_state = "hardsuit0-medical"
helmet.item_state = "medical_helm"
helmet.item_color = "medical"
if(suit)
suit.name = "medical hardsuit"
- suit.icon_state = "rig-medical"
+ suit.icon_state = "hardsuit-medical"
suit.item_state = "medical_hardsuit"
if("Security")
if(helmet)
helmet.name = "security hardsuit helmet"
- helmet.icon_state = "rig0-sec"
+ helmet.icon_state = "hardsuit0-sec"
helmet.item_state = "sec_helm"
helmet.item_color = "sec"
if(suit)
suit.name = "security hardsuit"
- suit.icon_state = "rig-sec"
+ suit.icon_state = "hardsuit-sec"
suit.item_state = "sec_hardsuit"
if("Atmos")
if(helmet)
helmet.name = "atmospherics hardsuit helmet"
- helmet.icon_state = "rig0-atmos"
+ helmet.icon_state = "hardsuit0-atmos"
helmet.item_state = "atmos_helm"
helmet.item_color = "atmos"
if(suit)
suit.name = "atmospherics hardsuit"
- suit.icon_state = "rig-atmos"
+ suit.icon_state = "hardsuit-atmos"
suit.item_state = "atmos_hardsuit"
if("^%###^%$")
if(helmet)
helmet.name = "blood-red hardsuit helmet"
- helmet.icon_state = "rig0-syndie"
+ helmet.icon_state = "hardsuit0-syndie"
helmet.item_state = "syndie_helm"
helmet.item_color = "syndie"
if(suit)
suit.name = "blood-red hardsuit"
suit.item_state = "syndie_hardsuit"
- suit.icon_state = "rig-syndie"
+ suit.icon_state = "hardsuit-syndie"
diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm
index f9355a98d37..2f0dc7b2666 100644
--- a/code/game/machinery/syndicatebomb.dm
+++ b/code/game/machinery/syndicatebomb.dm
@@ -59,14 +59,14 @@
to_chat(user, "The bomb must be placed on solid ground to attach it")
else
to_chat(user, "You firmly wrench the bomb to the floor")
- playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
anchored = 1
if(active)
to_chat(user, "The bolts lock in place")
else
if(!active)
to_chat(user, "You wrench the bomb from the floor")
- playsound(loc, 'sound/items/ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
anchored = 0
else
to_chat(user, "The bolts are locked down!")
@@ -89,7 +89,7 @@
else
to_chat(user, "There isn't anything in here to remove!")
else if(open_panel)
- to_chat(user, "The wires conneting the shell to the explosives are holding it down!")
+ to_chat(user, "The wires connecting the shell to the explosives are holding it down!")
else
to_chat(user, "The cover is screwed on, it won't pry off!")
else if(istype(I, /obj/item/weapon/bombcore))
@@ -102,38 +102,51 @@
to_chat(user, "[payload] is already loaded into [src], you'll have to remove it first.")
else
..()
+
+/obj/machinery/syndicatebomb/attack_ghost(mob/user)
+ interact(user)
-/obj/machinery/syndicatebomb/attack_hand(var/mob/user)
+/obj/machinery/syndicatebomb/attack_hand(mob/user)
interact(user)
/obj/machinery/syndicatebomb/attack_ai()
return
-/obj/machinery/syndicatebomb/interact(var/mob/user)
+/obj/machinery/syndicatebomb/interact(mob/user)
if(wires && open_panel)
wires.Interact(user)
- if(!open_panel)
+ if(!open_panel && can_interact(user))
if(!active)
spawn()
settings(user)
return
else if(anchored)
to_chat(user, "The bomb is bolted to the floor!")
- return
+
+/obj/machinery/syndicatebomb/proc/can_interact(mob/user)
+ if(user.can_advanced_admin_interact())
+ return TRUE
+ if(!isliving(user))
+ return FALSE
+ if(user.incapacitated())
+ return FALSE
+ if(!Adjacent(user))
+ return FALSE
+ return TRUE
-/obj/machinery/syndicatebomb/proc/settings(var/mob/user)
+/obj/machinery/syndicatebomb/proc/settings(mob/user)
var/newtime = input(user, "Please set the timer.", "Timer", "[timer]") as num
newtime = Clamp(newtime, 120, 60000)
- if(in_range(src, user) && isliving(user)) //No running off and setting bombs from across the station
+ if(can_interact(user)) //No running off and setting bombs from across the station
timer = newtime
- src.loc.visible_message("[bicon(src)] timer set for [timer] seconds.")
- if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && in_range(src, user) && isliving(user))
+ loc.visible_message("[bicon(src)] timer set for [timer] seconds.")
+ if(alert(user,"Would you like to start the countdown now?",,"Yes","No") == "Yes" && can_interact(user))
if(defused || active)
if(defused)
- src.loc.visible_message("[bicon(src)] Device error: User intervention required.")
+ loc.visible_message("[bicon(src)] Device error: User intervention required.")
return
else
- src.loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.")
+ loc.visible_message("[bicon(src)] [timer] seconds until detonation, please clear the area.")
playsound(loc, 'sound/machines/click.ogg', 30, 1)
active = 1
update_icon()
@@ -143,8 +156,8 @@
var/area/A = get_area(bombturf)
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
msg_admin_attack("[key_name_admin(user)] has primed a [name] ([payload]) for detonation at [A.name] (JMP).")
- log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
- payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
+ log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name] ([bombturf.x], [bombturf.y], [bombturf.z])")
+ payload.adminlog = "\The [src] that [key_name(user)] had primed detonated!"
/obj/machinery/syndicatebomb/proc/isWireCut(var/index)
return wires.IsIndexCut(index)
diff --git a/code/game/machinery/telecomms/logbrowser.dm b/code/game/machinery/telecomms/logbrowser.dm
index 5b799d3a2e4..6f5eaa3f2b5 100644
--- a/code/game/machinery/telecomms/logbrowser.dm
+++ b/code/game/machinery/telecomms/logbrowser.dm
@@ -184,8 +184,8 @@
attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
diff --git a/code/game/machinery/telecomms/machine_interactions.dm b/code/game/machinery/telecomms/machine_interactions.dm
index c1a10cacd48..db436bfb772 100644
--- a/code/game/machinery/telecomms/machine_interactions.dm
+++ b/code/game/machinery/telecomms/machine_interactions.dm
@@ -24,24 +24,24 @@
if(0)
if(istype(P, /obj/item/weapon/screwdriver))
to_chat(user, "You unfasten the bolts.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
construct_op++
if(1)
if(istype(P, /obj/item/weapon/screwdriver))
to_chat(user, "You fasten the bolts.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc,P.usesound, 50, 1)
construct_op--
if(istype(P, /obj/item/weapon/wrench))
to_chat(user, "You dislodge the external plating.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
construct_op++
if(2)
if(istype(P, /obj/item/weapon/wrench))
to_chat(user, "You secure the external plating.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, P.usesound, 75, 1)
construct_op--
if(istype(P, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "You remove the cables.")
construct_op++
var/obj/item/stack/cable_coil/A = new /obj/item/stack/cable_coil( user.loc )
@@ -51,6 +51,7 @@
if(istype(P, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/A = P
if(A.amount >= 5)
+ playsound(loc, A.usesound, 50, 1)
to_chat(user, "You insert the cables.")
A.amount -= 5
if(A.amount <= 0)
@@ -60,8 +61,8 @@
stat &= ~BROKEN // the machine's not borked anymore!
if(istype(P, /obj/item/weapon/crowbar))
to_chat(user, "You begin prying out the circuit board other components...")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(user,60, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 60 * P.toolspeed, target = src))
to_chat(user, "You finish prying out the components.")
// Drop all the component stuff
diff --git a/code/game/machinery/telecomms/telemonitor.dm b/code/game/machinery/telecomms/telemonitor.dm
index 9baa2a1a12f..7340406ed6a 100644
--- a/code/game/machinery/telecomms/telemonitor.dm
+++ b/code/game/machinery/telecomms/telemonitor.dm
@@ -128,8 +128,8 @@
attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
diff --git a/code/game/machinery/telecomms/traffic_control.dm b/code/game/machinery/telecomms/traffic_control.dm
index 001771b7efa..89c36429b14 100644
--- a/code/game/machinery/telecomms/traffic_control.dm
+++ b/code/game/machinery/telecomms/traffic_control.dm
@@ -340,8 +340,8 @@
/obj/machinery/computer/telecomms/traffic/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob, params)
if(istype(D, /obj/item/weapon/screwdriver))
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(get_turf(src), D.usesound, 50, 1)
+ if(do_after(user, 20 * D.toolspeed, target = src))
if(src.stat & BROKEN)
to_chat(user, "\blue The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index f45daee2af5..183bd35da56 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -221,8 +221,8 @@
if(PDA.id)
paid = pay_with_card(PDA.id)
handled = 1
- else if(istype(I, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/C = I
+ else if(istype(I, /obj/item/stack/spacecash))
+ var/obj/item/stack/spacecash/C = I
paid = pay_with_cash(C, user)
handled = 1
@@ -237,7 +237,7 @@
return
if(istype(I, /obj/item/weapon/screwdriver) && anchored)
- playsound(loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
overlays.Cut()
@@ -297,8 +297,8 @@
*
* usr is the mob who gets the change.
*/
-/obj/machinery/vending/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, mob/user)
- if(currently_vending.price > cashmoney.get_total())
+/obj/machinery/vending/proc/pay_with_cash(obj/item/stack/spacecash/cashmoney, mob/user)
+ if(currently_vending.price > cashmoney.amount)
// This is not a status display message, since it's something the character
// themselves is meant to see BEFORE putting the money in
to_chat(usr, "[bicon(cashmoney)] That is not enough money.")
@@ -310,12 +310,7 @@
// just assume that all spacecash that's not something else is a bill
visible_message("[usr] inserts a credit chip into [src].")
- var/left = cashmoney.get_total() - currently_vending.price
- usr.unEquip(cashmoney)
- qdel(cashmoney)
-
- if(left)
- dispense_cash(left, src.loc, user)
+ cashmoney.use(currently_vending.price)
// Vending machines have no idea who paid with cash
credit_purchase("(cash)")
@@ -391,7 +386,7 @@
/obj/machinery/vending/attack_ai(mob/user)
return attack_hand(user)
-
+
/obj/machinery/vending/attack_ghost(mob/user)
return attack_hand(user)
diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm
index 23e18d53a0d..3493f03dd69 100644
--- a/code/game/mecha/equipment/tools/work_tools.dm
+++ b/code/game/mecha/equipment/tools/work_tools.dm
@@ -194,6 +194,8 @@
range = MELEE|RANGED
var/mode = 0 //0 - deconstruct, 1 - wall or floor, 2 - airlock.
var/canRwall = 0
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/mecha_parts/mecha_equipment/rcd/New()
rcd_list += src
@@ -224,7 +226,7 @@
if(do_after_cooldown(W))
chassis.spark_system.start()
W.ChangeTurf(/turf/simulated/floor/plating)
- playsound(W, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(W, usesound, 50, 1)
else if(istype(target, /turf/simulated/floor))
var/turf/simulated/floor/F = target
occupant_message("Deconstructing [target]...")
@@ -232,27 +234,27 @@
chassis.spark_system.start()
F.ChangeTurf(/turf/space)
F.air_update_turf()
- playsound(F, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(F, usesound, 50, 1)
else if(istype(target, /obj/machinery/door/airlock))
occupant_message("Deconstructing [target]...")
if(do_after_cooldown(target))
chassis.spark_system.start()
qdel(target)
- playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(target, usesound, 50, 1)
if(1)
if(istype(target, /turf/space))
var/turf/space/S = target
occupant_message("Building Floor...")
if(do_after_cooldown(S))
S.ChangeTurf(/turf/simulated/floor/plating)
- playsound(S, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(S, usesound, 50, 1)
chassis.spark_system.start()
else if(istype(target, /turf/simulated/floor))
var/turf/simulated/floor/F = target
occupant_message("Building Wall...")
if(do_after_cooldown(F))
F.ChangeTurf(/turf/simulated/wall)
- playsound(F, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(F, usesound, 50, 1)
chassis.spark_system.start()
if(2)
if(istype(target, /turf/simulated/floor))
@@ -261,7 +263,7 @@
chassis.spark_system.start()
var/obj/machinery/door/airlock/T = new /obj/machinery/door/airlock(target)
T.autoclose = 1
- playsound(target, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(target, usesound, 50, 1)
playsound(target, 'sound/effects/sparks2.ogg', 50, 1)
diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm
index 4ec4746a198..78ff22723d9 100644
--- a/code/game/mecha/mecha.dm
+++ b/code/game/mecha/mecha.dm
@@ -734,7 +734,7 @@
// Since having maint protocols available is controllable by the MMI, I see this as a consensual way to remove an MMI without destroying the mech
user.visible_message("[user] begins levering out the MMI from the [src].", "You begin to lever out the MMI from the [src].")
to_chat(occupant, "[user] is prying you out of the exosuit!")
- if(do_after(user,80,target=src))
+ if(do_after(user, 80 * W.toolspeed, target=src))
user.visible_message("[user] pries the MMI out of the [src]!", "You finish removing the MMI from the [src]!")
go_out()
return
diff --git a/code/game/mecha/mecha_construction_paths.dm b/code/game/mecha/mecha_construction_paths.dm
index f1641c94b64..76fa87f6988 100644
--- a/code/game/mecha/mecha_construction_paths.dm
+++ b/code/game/mecha/mecha_construction_paths.dm
@@ -6,22 +6,25 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else
to_chat(user, ("There's not enough cable to finish the task."))
return 0
@@ -38,22 +41,25 @@
if(istype(used_atom, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/W = used_atom
if(W.remove_fuel(0, user))
- playsound(holder, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(holder, W.usesound, 50, 1)
else
return 0
else if(istype(used_atom, /obj/item/weapon/wrench))
- playsound(holder, 'sound/items/Ratchet.ogg', 50, 1)
+ var/obj/item/weapon/wrench/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/screwdriver))
- playsound(holder, 'sound/items/Screwdriver.ogg', 50, 1)
+ var/obj/item/weapon/screwdriver/S = used_atom
+ playsound(holder, S.usesound, 50, 1)
else if(istype(used_atom, /obj/item/weapon/wirecutters))
- playsound(holder, 'sound/items/Wirecutter.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/W = used_atom
+ playsound(holder, W.usesound, 50, 1)
else if(istype(used_atom, /obj/item/stack/cable_coil))
var/obj/item/stack/cable_coil/C = used_atom
if(C.use(4))
- playsound(holder, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(holder, C.usesound, 50, 1)
else
to_chat(user, ("There's not enough cable to finish the task."))
return 0
diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm
index 6bd600eaaa7..29fcd55880e 100644
--- a/code/game/mecha/mecha_wreckage.dm
+++ b/code/game/mecha/mecha_wreckage.dm
@@ -35,7 +35,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(salvage_num <= 0)
user.visible_message("[user] begins to slice apart the now completely stripped [src].", "You begin to slice apart the [src].", "You hear the sound of a welder nearby.")
- if(WT.remove_fuel(0,user) && do_after(user,80,target=src))
+ if(WT.remove_fuel(0,user) && do_after(user, 80 * WT.toolspeed, target = src))
user.visible_message("The now-dilapidated [src] falls apart in a clatter.", "As you slice apart the final support structures, the [src] falls apart in a heap.", "You hear metal clanking to the floor.")
new /obj/item/stack/sheet/metal(src.loc)
var/obj/item/stack/rods/rods = new /obj/item/stack/rods(src.loc)
diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm
index 19cbbd38c5a..122f1741a3c 100644
--- a/code/game/objects/effects/aliens.dm
+++ b/code/game/objects/effects/aliens.dm
@@ -222,7 +222,7 @@
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
@@ -381,7 +381,7 @@
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
user.changeNext_move(CLICK_CD_MELEE)
diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm
index 9c3dd867c74..62395eb3135 100644
--- a/code/game/objects/effects/decals/contraband.dm
+++ b/code/game/objects/effects/decals/contraband.dm
@@ -309,7 +309,7 @@ obj/structure/sign/poster/New(serial,var/subtypeIn = -1)
obj/structure/sign/poster/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wirecutters))
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, I.usesound, 100, 1)
if(ruined)
to_chat(user, "You remove the remnants of the poster.")
qdel(src)
diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm
index b9804e7d9a5..dd92901537f 100644
--- a/code/game/objects/effects/spawners/lootdrop.dm
+++ b/code/game/objects/effects/spawners/lootdrop.dm
@@ -192,7 +192,7 @@
/obj/item/weapon/stock_parts/matter_bin = 1,
/obj/item/weapon/stock_parts/micro_laser = 1,
/obj/item/weapon/stock_parts/scanning_module = 1,
- /obj/item/weapon/spacecash/c200 = 1,
+ /obj/item/stack/spacecash/c200 = 1,
/obj/item/weapon/airlock_electronics = 1,
/obj/item/weapon/gun/energy/kinetic_accelerator = 1,
/obj/item/pizzabox = 3,
diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm
index 8443ac90f17..80cbb208c76 100644
--- a/code/game/objects/effects/spiders.dm
+++ b/code/game/objects/effects/spiders.dm
@@ -33,7 +33,7 @@
if(WT.remove_fuel(0, user))
damage = 15
- playsound(loc, 'sound/items/Welder.ogg', 100, 1)
+ playsound(loc, WT.usesound, 100, 1)
health -= damage
healthcheck()
diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm
index b34cc09ca89..6c9f7fe1feb 100644
--- a/code/game/objects/items.dm
+++ b/code/game/objects/items.dm
@@ -19,6 +19,7 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/r_speed = 1.0
var/health = null
var/hitsound = null
+ var/usesound = null
var/w_class = 3
var/slot_flags = 0 //This is used to determine on which slots an item can fit.
pass_flags = PASSTABLE
@@ -60,6 +61,8 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d
var/block_chance = 0
var/hit_reaction_chance = 0 //If you want to have something unrelated to blocking/armour piercing etc. Maybe not needed, but trying to think ahead/allow more freedom
+ var/toolspeed = 1 // If this item is a tool, the speed multiplier
+
/* Species-specific sprites, concept stolen from Paradise//vg/.
ex:
sprite_sheets = list(
diff --git a/code/game/objects/items/crayons.dm b/code/game/objects/items/crayons.dm
index 2a2237559fb..3852d67e6ff 100644
--- a/code/game/objects/items/crayons.dm
+++ b/code/game/objects/items/crayons.dm
@@ -10,6 +10,7 @@
w_class = 1
slot_flags = SLOT_BELT | SLOT_EARS
attack_verb = list("attacked", "coloured")
+ toolspeed = 1
var/colour = "#FF0000" //RGB
var/drawtype = "rune"
var/list/graffiti = list("body","amyjon","face","matt","revolution","engie","guy","end","dwarf","uboa","up","down","left","right","heart","borgsrogue","voxpox","shitcurity","catbeast","hieroglyphs1","hieroglyphs2","hieroglyphs3","security","syndicate1","syndicate2","nanotrasen","lie","valid","arrowleft","arrowright","arrowup","arrowdown","chicken","hailcrab","brokenheart","peace","scribble","scribble2","scribble3","skrek","squish","tunnelsnake","yip","youaredead")
@@ -86,7 +87,7 @@
else if(graffiti.Find(drawtype))
temp = "graffiti"
to_chat(user, "You start drawing a [temp] on the [target.name].")
- if(instant || do_after(user, 50, target = target))
+ if(instant || do_after(user, 50 * toolspeed, target = target))
var/obj/effect/decal/cleanable/crayon/C = new /obj/effect/decal/cleanable/crayon(target,colour,drawtype,temp)
C.add_hiddenprint(user)
to_chat(user, "You finish drawing [temp].")
diff --git a/code/game/objects/items/devices/modkit.dm b/code/game/objects/items/devices/modkit.dm
index 52603b99a0b..a81f96a1efc 100644
--- a/code/game/objects/items/devices/modkit.dm
+++ b/code/game/objects/items/devices/modkit.dm
@@ -10,11 +10,11 @@
var/target_species = "Human"
var/list/permitted_types = list(
- /obj/item/clothing/head/helmet/space/rig,
- /obj/item/clothing/suit/space/rig
+ /obj/item/clothing/head/helmet/space/hardsuit,
+ /obj/item/clothing/suit/space/hardsuit
)
-/obj/item/device/modkit/afterattack(obj/O, mob/user as mob, proximity)
+/obj/item/device/modkit/afterattack(obj/item/O, mob/user as mob, proximity)
if(!proximity)
return
@@ -47,7 +47,7 @@
to_chat(user, "[O] must be safely placed on the ground for modification.")
return
- playsound(user.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(user.loc, O.usesound, 100, 1)
user.visible_message("\red [user] opens \the [src] and modifies \the [O].","\red You open \the [src] and modify \the [O].")
diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm
index 742afb83c81..e734f22b97f 100644
--- a/code/game/objects/items/devices/multitool.dm
+++ b/code/game/objects/items/devices/multitool.dm
@@ -1,3 +1,7 @@
+#define PROXIMITY_NONE ""
+#define PROXIMITY_ON_SCREEN "_red"
+#define PROXIMITY_NEAR "_yellow"
+
/**
* Multitool -- A multitool is used for hacking electronic devices.
* TO-DO -- Using it as a power measurement tool for cables etc. Nannek.
@@ -10,13 +14,15 @@
icon_state = "multitool"
flags = CONDUCT
force = 5.0
- w_class = 2
- throwforce = 5.0
- throw_range = 15
+ w_class = WEIGHT_CLASS_SMALL
+ throwforce = 0
+ throw_range = 7
throw_speed = 3
- desc = "You can use this on airlocks or APCs to try to hack them without cutting wires."
materials = list(MAT_METAL=50, MAT_GLASS=20)
- origin_tech = "magnets=1;engineering=1"
+ origin_tech = "magnets=1;engineering=2"
+ toolspeed = 1
+ hitsound = 'sound/weapons/tap.ogg'
+ var/shows_wire_information = FALSE // shows what a wire does if set to TRUE
var/obj/machinery/buffer // simple machine buffer for device linkage
/obj/item/device/multitool/proc/IsBufferA(var/typepath)
@@ -28,38 +34,74 @@
/obj/item/device/multitool/ai_detect
- var/track_delay = 0
+ var/track_cooldown = 0
+ var/track_delay = 10 //How often it checks for proximity
+ var/detect_state = PROXIMITY_NONE
+ var/rangealert = 8 //Glows red when inside
+ var/rangewarning = 20 //Glows yellow when inside
+ origin_tech = "magnets=1;engineering=2;syndicate=1"
/obj/item/device/multitool/ai_detect/New()
..()
processing_objects += src
-
/obj/item/device/multitool/ai_detect/Destroy()
processing_objects -= src
return ..()
/obj/item/device/multitool/ai_detect/process()
-
- if(track_delay > world.time)
+ if(track_cooldown > world.time)
return
-
- var/found_eye = 0
-
- for(var/mob/camera/aiEye/A in living_mob_list)
-
- var/turf/our_turf = get_turf(src)
- var/turf/eye_turf = get_turf(A)
-
- if(get_dist(our_turf, eye_turf) < 9)
- found_eye = 1
+ detect_state = PROXIMITY_NONE
+ multitool_detect()
+ icon_state = "[initial(icon_state)][detect_state]"
+ track_cooldown = world.time + track_delay
+
+/obj/item/device/multitool/ai_detect/proc/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/living/silicon/ai/AI in ai_list)
+ if(AI.cameraFollow == src)
+ detect_state = PROXIMITY_ON_SCREEN
break
- if(found_eye)
- icon_state = "[initial(icon_state)]_red"
- else
- icon_state = initial(icon_state)
+ if(!detect_state && cameranet.chunkGenerated(our_turf.x, our_turf.y, our_turf.z))
+ var/datum/camerachunk/chunk = cameranet.getCameraChunk(our_turf.x, our_turf.y, our_turf.z)
+ if(chunk)
+ if(chunk.seenby.len)
+ for(var/mob/camera/aiEye/A in chunk.seenby)
+ var/turf/detect_turf = get_turf(A)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+ if(get_dist(our_turf, detect_turf) < rangewarning)
+ detect_state = PROXIMITY_NEAR
+ break
+
+/obj/item/device/multitool/ai_detect/admin
+ desc = "Used for pulsing wires to test which to cut. Not recommended by doctors. Has a strange tag that says 'Grief in Safety'" //What else should I say for a meme item?
+ track_delay = 5
+ shows_wire_information = TRUE
- track_delay = world.time + 10 // 1 second
- return
+/obj/item/device/multitool/ai_detect/admin/multitool_detect()
+ var/turf/our_turf = get_turf(src)
+ for(var/mob/J in urange(rangewarning,our_turf))
+ if(check_rights(R_ADMIN, 0, J))
+ detect_state = PROXIMITY_NEAR
+ var/turf/detect_turf = get_turf(J)
+ if(get_dist(our_turf, detect_turf) < rangealert)
+ detect_state = PROXIMITY_ON_SCREEN
+ break
+/obj/item/device/multitool/cyborg
+ name = "multitool"
+ desc = "Optimised and stripped-down version of a regular multitool."
+ toolspeed = 0.5
+
+/obj/item/device/multitool/abductor
+ name = "alien multitool"
+ desc = "An omni-technological interface."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "multitool"
+ toolspeed = 0.1
+ origin_tech = "magnets=5;engineering=5;abductor=3"
+ shows_wire_information = TRUE
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index 836da188bba..093d7481c51 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -63,7 +63,7 @@
var/chosen_wire = input(user, "OH GOD OH GOD", "WHAT WIRE?!") in wires
if(!in_range(src, usr) || issilicon(usr) || !usr.canmove || usr.restrained())
return
- playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
+ playsound(src, I.usesound, 50, 1, 1)
user.visible_message("[user] cuts the [chosen_wire] wire!", "You cut the [chosen_wire] wire!")
sleep(5)
if(chosen_wire == correct_wire)
@@ -84,8 +84,8 @@
to_chat(user, "You can't see the box well enough to cut the wires out.")
return
user.visible_message("[user] starts removing the payload and wires from \the [src].")
- if(do_after(user, 40, target = src))
- playsound(src, 'sound/items/Wirecutter.ogg', 50, 1, 1)
+ if(do_after(user, 40 * I.toolspeed, target = src))
+ playsound(src, I.usesound, 50, 1, 1)
user.unEquip(src)
user.visible_message("[user] removes the insides of \the [src]!")
var/obj/item/stack/cable_coil/C = new /obj/item/stack/cable_coil(src.loc)
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index 12b12c14406..43289678591 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -138,8 +138,8 @@
if(3)
if(iswirecutter(W) && b_stat && wires.IsAllCut())
to_chat(user, "You cut out the intercoms wiring and disconnect its electronics.")
- playsound(get_turf(src), 'sound/items/Wirecutter.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 3)
return
new /obj/item/stack/cable_coil(get_turf(src),5)
@@ -152,8 +152,8 @@
else return ..()
if(2)
if(isscrewdriver(W))
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
update_icon()
on = 1
b_stat = 0
@@ -170,15 +170,15 @@
if(coil.amount < 5)
to_chat(user, "You need more cable for this!")
return
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * coil.toolspeed, target = src))
coil.use(5)
to_chat(user, "You wire \the [src]!")
buildstage = 2
return 1
if(iscrowbar(W))
to_chat(user, "You begin removing the electronics...")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(buildstage != 1)
return
new /obj/item/weapon/intercom_electronics(get_turf(src))
@@ -187,19 +187,19 @@
return 1
if(0)
if(istype(W,/obj/item/weapon/intercom_electronics))
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(get_turf(src), W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
qdel(W)
to_chat(user, "You insert \the [W] into \the [src]!")
buildstage = 1
return 1
if(iswelder(W))
var/obj/item/weapon/weldingtool/WT=W
- playsound(get_turf(src), 'sound/items/Welder.ogg', 50, 1)
+ playsound(get_turf(src), WT.usesound, 50, 1)
if(!WT.remove_fuel(3, user))
to_chat(user, "You're out of welding fuel.")
return 1
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * WT.toolspeed, target = src))
to_chat(user, "You cut the intercom frame from the wall!")
new /obj/item/mounted/frame/intercom(get_turf(src))
qdel(src)
@@ -233,6 +233,8 @@
desc = "Looks like a circuit. Probably is."
w_class = 2
materials = list(MAT_METAL=50, MAT_GLASS=50)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/radio/intercom/locked
var/locked_frequency
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 419ba6cc5bc..8703926c13c 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -94,7 +94,7 @@ var/global/list/default_medbay_channels = list(
secure_radio_connections[ch_name] = radio_controller.add_object(src, radiochannels[ch_name], RADIO_CHAT)
/obj/item/device/radio/attack_ghost(mob/user)
- return ui_interact(user)
+ return interact(user)
/obj/item/device/radio/attack_self(mob/user as mob)
user.set_machine(src)
@@ -180,11 +180,6 @@ var/global/list/default_medbay_channels = list(
/mob/dead/observer/has_internal_radio_channel_access(var/mob/user, var/list/req_one_accesses)
return can_admin_interact()
-/obj/item/device/radio/proc/text_wires()
- if(b_stat)
- return wires.GetInteractWindow()
- return
-
/obj/item/device/radio/proc/ToggleBroadcast()
broadcasting = !broadcasting && !(wires.IsIndexCut(WIRE_TRANSMIT) || wires.IsIndexCut(WIRE_SIGNAL))
diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm
index 9a9edbb62ad..7c65242ff06 100644
--- a/code/game/objects/items/devices/scanners.dm
+++ b/code/game/objects/items/devices/scanners.dm
@@ -279,7 +279,7 @@ REAGENT SCANNER
else
to_chat(user, "You install the upgrade in the [src].")
overlays += "advanced"
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, usesound, 50, 1)
upgraded = 1
qdel(W)
@@ -296,6 +296,7 @@ REAGENT SCANNER
desc = "An upgrade unit that can be installed on a health analyzer for expanded functionality."
w_class = 1
origin_tech = "magnets=2;biotech=2"
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/device/analyzer
desc = "A hand-held environmental scanner which reports current gas levels."
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index c573e4ff975..43aff1cb05d 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -303,7 +303,7 @@
/obj/item/device/tape/attackby(obj/item/I, mob/user)
if(ruined && istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "You start winding the tape back in.")
- if(do_after(user, 120, target = src))
+ if(do_after(user, 120 * I.toolspeed, target = src))
to_chat(user, "You wound the tape back in!")
fix()
else if(istype(I, /obj/item/weapon/pen))
diff --git a/code/game/objects/items/mountable_frames/frames.dm b/code/game/objects/items/mountable_frames/frames.dm
index e377cac4015..b8ef9216053 100644
--- a/code/game/objects/items/mountable_frames/frames.dm
+++ b/code/game/objects/items/mountable_frames/frames.dm
@@ -3,6 +3,8 @@
desc = "Place it on a wall."
var/sheets_refunded = 2
var/list/mount_reqs = list() //can contain simfloor, nospace. Used in try_build to see if conditions are needed, then met
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/mounted/frame/attackby(obj/item/weapon/W, mob/user)
..()
diff --git a/code/game/objects/items/stacks/nanopaste.dm b/code/game/objects/items/stacks/nanopaste.dm
index 55e1cc4a722..a21bb504fdc 100644
--- a/code/game/objects/items/stacks/nanopaste.dm
+++ b/code/game/objects/items/stacks/nanopaste.dm
@@ -6,7 +6,7 @@
icon_state = "tube"
origin_tech = "materials=3;engineering=2"
amount = 10
-
+ toolspeed = 1
/obj/item/stack/nanopaste/attack(mob/living/M as mob, mob/user as mob)
if(!istype(M) || !istype(user))
diff --git a/code/game/objects/items/stacks/rods.dm b/code/game/objects/items/stacks/rods.dm
index e4866856e97..aadf2d0b8fe 100644
--- a/code/game/objects/items/stacks/rods.dm
+++ b/code/game/objects/items/stacks/rods.dm
@@ -14,6 +14,8 @@
max_amount = 60
attack_verb = list("hit", "bludgeoned", "whacked")
hitsound = 'sound/weapons/grenadelaunch.ogg'
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/stack/rods/cyborg
materials = list()
diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm
index 46f7b3fb469..3a2d07aa2f6 100644
--- a/code/game/objects/items/stacks/sheets/leather.dm
+++ b/code/game/objects/items/stacks/sheets/leather.dm
@@ -143,7 +143,7 @@ var/global/list/datum/stack_recipe/sinew_recipes = list ( \
/obj/item/stack/sheet/animalhide/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(W.sharp)
user.visible_message("[user] starts cutting hair off \the [src].", "You start cutting the hair off \the [src]...", "You hear the sound of a knife rubbing against flesh.")
- if(do_after(user,50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
to_chat(user, "You cut the hair from this [src.singular_name].")
//Try locating an exisitng stack on the tile and add to there if possible
for(var/obj/item/stack/sheet/hairlesshide/HS in usr.loc)
diff --git a/code/game/objects/items/stacks/sheets/sheets.dm b/code/game/objects/items/stacks/sheets/sheets.dm
index 2a8b2130be6..4e5a0e9fdc8 100644
--- a/code/game/objects/items/stacks/sheets/sheets.dm
+++ b/code/game/objects/items/stacks/sheets/sheets.dm
@@ -9,6 +9,8 @@
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "smashed")
var/perunit = MINERAL_MATERIAL_AMOUNT
var/sheettype = null //this is used for girders in the creation of walls/false walls
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
// Since the sheetsnatcher was consolidated into weapon/storage/bag we now use
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index feb681e47c2..87da0987487 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -1301,7 +1301,7 @@ obj/item/toy/cards/deck/syndicate/black
/obj/item/toy/minigibber/attackby(var/obj/O, var/mob/user, params)
if(istype(O,/obj/item/toy/character) && O.loc == user)
to_chat(user, "You start feeding \the [O] [bicon(O)] into \the [src]'s mini-input.")
- if(do_after(user,10, target = src))
+ if(do_after(user, 10, target = src))
if(O.loc != user)
to_chat(user, "\The [O] is too far away to feed into \the [src]!")
else
diff --git a/code/game/objects/items/weapons/RCD.dm b/code/game/objects/items/weapons/RCD.dm
index bb57a4a2cc2..6c105796150 100644
--- a/code/game/objects/items/weapons/RCD.dm
+++ b/code/game/objects/items/weapons/RCD.dm
@@ -20,6 +20,8 @@ RCD
w_class = 3
materials = list(MAT_METAL = 30000)
origin_tech = "engineering=4;materials=2"
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
var/datum/effect/system/spark_spread/spark_system
var/max_matter = 100
var/matter = 0
@@ -172,7 +174,7 @@ RCD
door_name = temp_t
/obj/item/weapon/rcd/proc/activate()
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, usesound, 50, 1)
/obj/item/weapon/rcd/afterattack(atom/A, mob/user, proximity)
@@ -197,7 +199,7 @@ RCD
if(checkResource(3, user))
to_chat(user, "Building Wall ...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 20, target = A))
+ if(do_after(user, 20 * toolspeed, target = A))
if(!useResource(3, user)) return 0
activate()
var/turf/AT = A
@@ -210,7 +212,7 @@ RCD
if(checkResource(10, user))
to_chat(user, "Building Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(10, user)) return 0
activate()
var/obj/machinery/door/airlock/T = new door_type(A)
@@ -231,7 +233,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Wall...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 40, target = A))
+ if(do_after(user, 40 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -243,7 +245,7 @@ RCD
if(checkResource(5, user))
to_chat(user, "Deconstructing Floor...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(5, user)) return 0
activate()
var/turf/AT = A
@@ -255,7 +257,7 @@ RCD
if(checkResource(20, user))
to_chat(user, "Deconstructing Airlock...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(do_after(user, 50, target = A))
+ if(do_after(user, 50 * toolspeed, target = A))
if(!useResource(20, user)) return 0
activate()
qdel(A)
@@ -270,7 +272,7 @@ RCD
return 0
to_chat(user, "Deconstructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(!do_after(user, 20, target = A))
+ if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/window/full/shuttle) in A.contents)
return 0 // Let's not give shuttle-griefers an easy time.
@@ -307,7 +309,7 @@ RCD
return 0
to_chat(user, "Constructing window...")
playsound(loc, 'sound/machines/click.ogg', 50, 1)
- if(!do_after(user, 20, target = A))
+ if(!do_after(user, 20 * toolspeed, target = A))
return 0
if(locate(/obj/structure/grille) in A.contents)
return 0 // We already have window
diff --git a/code/game/objects/items/weapons/RSF.dm b/code/game/objects/items/weapons/RSF.dm
index 47cf88f9bbc..07a489490e1 100644
--- a/code/game/objects/items/weapons/RSF.dm
+++ b/code/game/objects/items/weapons/RSF.dm
@@ -69,7 +69,7 @@ RSF
if(istype(A, /obj/structure/table) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A.loc )
+ new /obj/item/stack/spacecash/c10( A.loc )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
@@ -83,7 +83,7 @@ RSF
if(istype(A, /turf/simulated/floor) && matter >= 1)
to_chat(user, "Dispensing Dosh...")
playsound(src.loc, 'sound/machines/click.ogg', 10, 1)
- new /obj/item/weapon/spacecash/c10( A )
+ new /obj/item/stack/spacecash/c10( A )
if(isrobot(user))
var/mob/living/silicon/robot/engy = user
engy.cell.charge -= 200 //once money becomes useful, I guess changing this to a high ammount, like 500 units a kick, till then, enjoy dosh!
diff --git a/code/game/objects/items/weapons/cash.dm b/code/game/objects/items/weapons/cash.dm
index 3608d7861f3..c0a9f47fcaf 100644
--- a/code/game/objects/items/weapons/cash.dm
+++ b/code/game/objects/items/weapons/cash.dm
@@ -1,125 +1,58 @@
-var/global/list/moneytypes=list(
- /obj/item/weapon/spacecash/c1000 = 1000,
- /obj/item/weapon/spacecash/c500 = 500,
- /obj/item/weapon/spacecash/c200 = 200,
- /obj/item/weapon/spacecash/c100 = 100,
- /obj/item/weapon/spacecash/c50 = 50,
- /obj/item/weapon/spacecash/c20 = 20,
- /obj/item/weapon/spacecash/c10 = 10,
- /obj/item/weapon/spacecash = 1,
-)
-
-/obj/item/weapon/spacecash
- name = "credit chip"
+/obj/item/stack/spacecash
+ name = "1 Credit"
desc = "Money money money."
- gender = PLURAL
- icon = 'icons/obj/money.dmi'
- icon_state = "cash1"
- opacity = 0
- density = 0
- anchored = 0.0
- force = 1.0
- throwforce = 1.0
+ icon = 'icons/goonstation/objects/money.dmi'
+ icon_state = "cashgreen"
+ hitsound = "swing_hit"
+ force = 1
+ throwforce = 1
throw_speed = 1
- throw_range = 2
- w_class = 1
+ throw_range = 7
+ w_class = WEIGHT_CLASS_TINY
burn_state = FLAMMABLE
- var/access = list()
- access = access_crate_cash
- var/worth = 1 // Per chip
- var/amount = 1 // number of chips
- var/stack_color = "#4E054F"
+ singular_name = "credit"
+ max_amount = 1000000
-/obj/item/weapon/spacecash/New(var/new_loc,var/new_amount=1)
- loc = new_loc
- name = "[worth] credit chip"
- amount = new_amount
+/obj/item/stack/spacecash/New(loc, amt = null)
+ ..()
update_icon()
-/obj/item/weapon/spacecash/examine(mob/user)
- if(amount>1)
- to_chat(user, "[bicon(src)] This is a stack of [amount] [src]s.")
+/obj/item/stack/spacecash/update_icon()
+ ..()
+ name = "[amount == max_amount ? "1000000" : amount] Credit[amount > 1 ? "s" : ""]"
+ if(amount >= 1 && amount < 10)
+ icon_state = "cashgreen"
+ else if(amount >= 10 && amount < 50)
+ icon_state = "spacecash"
+ else if(amount >= 50 && amount < 500)
+ icon_state = "cashblue"
+ else if(amount >= 500 && amount < 1000)
+ icon_state = "cashindi"
+ else if(amount >= 1000 && amount < 1000000)
+ icon_state = "cashpurp"
else
- to_chat(user, "[bicon(src)] This is \a [src]s.")
- to_chat(user, "It's worth [worth*amount] credits.")
+ icon_state = "cashrbow"
-/obj/item/weapon/spacecash/update_icon()
- icon_state = "cash[worth]"
- // Up to 100 items per stack.
- pixel_x=rand(-7,7)
- pixel_y=rand(-14,14)
+/obj/item/stack/spacecash/c10
+ amount = 10
-/obj/item/weapon/spacecash/proc/collect_from(var/obj/item/weapon/spacecash/cash)
- if(cash.worth == src.worth)
- var/taking = min(100-src.amount,cash.amount)
- cash.amount -= taking
- src.amount += taking
- if(cash.amount <= 0)
- qdel(cash)
- return taking
- return 0
+/obj/item/stack/spacecash/c20
+ amount = 20
-/obj/item/weapon/spacecash/afterattack(atom/A as mob|obj, mob/user as mob)
- if(istype(A, /turf) || istype(A, /obj/structure/table) || istype(A, /obj/structure/rack))
- var/turf/T = get_turf(A)
- var/collected = 0
- for(var/obj/item/weapon/spacecash/cash in T)
- if(cash.worth == src.worth)
- collected += collect_from(cash)
- if(collected)
- update_icon()
- to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.")
- else if(istype(A,/obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/cash = A
- var/collected = src.collect_from(cash)
- if(collected)
- update_icon()
- to_chat(user, "You add [collected] credit [amount > 1 ? "chips":"chip"] to your stack of cash.")
+/obj/item/stack/spacecash/c50
+ amount = 50
+/obj/item/stack/spacecash/c100
+ amount = 100
-/obj/item/weapon/spacecash/proc/get_total()
- return worth * amount
+/obj/item/stack/spacecash/c200
+ amount = 200
-/obj/item/weapon/spacecash/c10
- icon_state = "cash10"
- worth = 10
+/obj/item/stack/spacecash/c500
+ amount = 500
-/obj/item/weapon/spacecash/c20
- icon_state = "cash10"
- worth = 20
+/obj/item/stack/spacecash/c1000
+ amount = 1000
-/obj/item/weapon/spacecash/c50
- icon_state = "cash10"
- worth = 50
-
-/obj/item/weapon/spacecash/c100
- icon_state = "cash100"
- worth = 100
-
-/obj/item/weapon/spacecash/c200
- icon_state = "cash200"
- worth = 200
-
-/obj/item/weapon/spacecash/c500
- icon_state = "cash500"
- worth = 500
-
-/obj/item/weapon/spacecash/c1000
- icon_state = "cash1000"
- worth = 1000
-
-/proc/dispense_cash(var/amount, var/loc)
- for(var/cashtype in moneytypes)
- var/slice = moneytypes[cashtype]
- var/dispense_count = Floor(amount/slice)
- amount = amount % slice
- while(dispense_count>0)
- var/dispense_this_time = min(dispense_count,100)
- if(dispense_this_time > 0)
- new cashtype(loc,dispense_this_time)
- dispense_count -= dispense_this_time
-
-/proc/count_cash(var/list/cash)
- . = 0
- for(var/obj/item/weapon/spacecash/C in cash)
- . += C.get_total()
\ No newline at end of file
+/obj/item/stack/spacecash/c1000000
+ amount = 1000000
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cosmetics.dm b/code/game/objects/items/weapons/cosmetics.dm
index e60a68f42d6..f311d56d1ba 100644
--- a/code/game/objects/items/weapons/cosmetics.dm
+++ b/code/game/objects/items/weapons/cosmetics.dm
@@ -87,6 +87,8 @@
icon_state = "razor"
flags = CONDUCT
w_class = 1
+ usesound = 'sound/items/Welder2.ogg'
+ toolspeed = 1
/obj/item/weapon/razor/attack(mob/living/carbon/M as mob, mob/user as mob)
if(ishuman(M))
@@ -106,24 +108,24 @@
if(H == user) //shaving yourself
user.visible_message("[user] starts to shave their facial hair with \the [src].", \
"You take a moment shave your facial hair with \the [src].")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("[user] shaves his facial hair clean with the [src].", \
"You finish shaving with the [src]. Fast and clean!")
C.f_style = "Shaved"
H.update_fhair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("[user] tries to shave [H]'s facial hair with \the [src].", \
"You start shaving [H]'s facial hair.")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("[user] shaves off [H]'s facial hair with \the [src].", \
"You shave [H]'s facial hair clean off.")
C.f_style = "Shaved"
H.update_fhair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
if(user.zone_sel.selecting == "head")
if(!get_location_accessible(H, "head"))
to_chat(user, "The headgear is in the way.")
@@ -137,24 +139,24 @@
if(H == user) //shaving yourself
user.visible_message("[user] starts to shave their head with \the [src].", \
"You start to shave your head with \the [src].")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
user.visible_message("[user] shaves his head with the [src].", \
"You finish shaving with the [src].")
C.h_style = "Skinhead"
H.update_hair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(src.loc, usesound, 40, 1)
else
var/turf/user_loc = user.loc
var/turf/H_loc = H.loc
user.visible_message("[user] tries to shave [H]'s head with \the [src]!", \
"You start shaving [H]'s head.")
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
if(user_loc == user.loc && H_loc == H.loc)
user.visible_message("[user] shaves [H]'s head bald with \the [src]!", \
"You shave [H]'s head bald.")
C.h_style = "Skinhead"
H.update_hair()
- playsound(src.loc, 'sound/items/Welder2.ogg', 40, 1)
+ playsound(src.loc, usesound, 40, 1)
else
..()
else
diff --git a/code/game/objects/items/weapons/defib.dm b/code/game/objects/items/weapons/defib.dm
index 924b5e3d590..4151cdc0d05 100644
--- a/code/game/objects/items/weapons/defib.dm
+++ b/code/game/objects/items/weapons/defib.dm
@@ -256,6 +256,7 @@
force = 0
throwforce = 6
w_class = 4
+ toolspeed = 1
var/revivecost = 1000
var/cooldown = 0
@@ -346,7 +347,7 @@
user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.")
busy = 1
update_icon()
- if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
+ if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -362,7 +363,7 @@
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
var/total_burn = 0
var/total_brute = 0
- if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
+ if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
for(var/obj/item/carried_item in H.contents)
if(istype(carried_item, /obj/item/clothing/suit/space))
if(!defib.combat)
@@ -455,6 +456,7 @@
var/busy = 0
var/safety = 1
flags = NODROP
+ toolspeed = 1
/obj/item/weapon/borg_defib/attack(mob/M, mob/user)
var/tobehealed
@@ -495,7 +497,7 @@
user.visible_message("[user] begins to place [src] on [M.name]'s chest.", "You begin to place [src] on [M.name]'s chest.")
busy = 1
update_icon()
- if(do_after(user, 30, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
+ if(do_after(user, 30 * toolspeed, target = M)) //beginning to place the paddles on patient's chest to allow some time for people to move away to stop the process
user.visible_message("[user] places [src] on [M.name]'s chest.", "You place [src] on [M.name]'s chest.")
playsound(get_turf(src), 'sound/machines/defib_charge.ogg', 50, 0)
var/mob/dead/observer/ghost = H.get_ghost()
@@ -511,7 +513,7 @@
var/tloss = 600 //brain damage starts setting in on the patient after some time left rotting
var/total_burn = 0
var/total_brute = 0
- if(do_after(user, 20, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
+ if(do_after(user, 20 * toolspeed, target = M)) //placed on chest and short delay to shock for dramatic effect, revive time is 5sec total
if(H.stat == 2)
var/health = H.health
M.visible_message("[M]'s body convulses a bit.")
diff --git a/code/game/objects/items/weapons/explosives.dm b/code/game/objects/items/weapons/explosives.dm
index 3269aefde0e..bd6a18b73c1 100644
--- a/code/game/objects/items/weapons/explosives.dm
+++ b/code/game/objects/items/weapons/explosives.dm
@@ -7,6 +7,7 @@
det_time = 10
display_timer = 0
origin_tech = "syndicate=2"
+ toolspeed = 1
var/atom/target = null
var/image_overlay = null
var/obj/item/device/assembly_holder/nadeassembly = null
@@ -36,7 +37,7 @@
update_icon()
return
if(nadeassembly && istype(I, /obj/item/weapon/wirecutters))
- playsound(src, 'sound/items/Wirecutter.ogg', 20, 1)
+ playsound(src, I.usesound, 20, 1)
nadeassembly.loc = get_turf(src)
nadeassembly.master = null
nadeassembly = null
@@ -73,7 +74,7 @@
return
to_chat(user, "You start planting the [src]. The timer is set to [det_time]...")
- if(do_after(user, 50, target = AM))
+ if(do_after(user, 50 * toolspeed, target = AM))
if(!user.unEquip(src))
return
src.target = AM
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index c49b2341f29..6ca1d53e5db 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -11,6 +11,7 @@
var/payload_name = null // used for spawned grenades
w_class = 2
force = 2
+ var/prime_sound = 'sound/items/Screwdriver2.ogg'
var/stage = EMPTY
var/list/beakers = list()
var/list/allowed_containers = list(/obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
@@ -124,7 +125,7 @@
if(stage == WIRED)
if(beakers.len)
to_chat(user, "You lock the assembly.")
- playsound(loc, 'sound/items/Screwdriver.ogg', 25, -3)
+ playsound(loc, prime_sound, 25, -3)
stage = READY
update_icon()
var/contained = ""
@@ -265,7 +266,7 @@
has_reagents = 1
if(!has_reagents)
- playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1)
+ playsound(loc, usesound, 50, 1)
return
if(nadeassembly)
@@ -347,7 +348,7 @@
if(E.reagents.total_volume) has_reagents = 1
if(!has_reagents)
- playsound(loc, 'sound/items/Screwdriver2.ogg', 50, 1)
+ playsound(loc, prime_sound, 50, 1)
return
playsound(loc, 'sound/effects/bamf.ogg', 50, 1)
diff --git a/code/game/objects/items/weapons/handcuffs.dm b/code/game/objects/items/weapons/handcuffs.dm
index 7b1187bcc50..723920e7a5c 100644
--- a/code/game/objects/items/weapons/handcuffs.dm
+++ b/code/game/objects/items/weapons/handcuffs.dm
@@ -130,7 +130,7 @@
to_chat(user, "You need at least six metal sheets to make good enough weights!")
return
to_chat(user, "You begin to apply [I] to [src]...")
- if(do_after(user, 35, target = src))
+ if(do_after(user, 35 * M.toolspeed, target = src))
var/obj/item/weapon/restraints/legcuffs/bola/S = new /obj/item/weapon/restraints/legcuffs/bola
M.use(6)
user.put_in_hands(S)
diff --git a/code/game/objects/items/weapons/implants/implanter.dm b/code/game/objects/items/weapons/implants/implanter.dm
index 6d5efda18b7..8209de8da80 100644
--- a/code/game/objects/items/weapons/implants/implanter.dm
+++ b/code/game/objects/items/weapons/implants/implanter.dm
@@ -9,6 +9,7 @@
w_class = 2
origin_tech = "materials=1;biotech=3;programming=2"
materials = list(MAT_METAL=600, MAT_GLASS=200)
+ toolspeed = 1
var/obj/item/weapon/implant/imp = null
@@ -29,7 +30,7 @@
M.visible_message("[user] is attemping to implant [M].")
var/turf/T = get_turf(M)
- if(T && (M == user || do_after(user, 50, target = M)))
+ if(T && (M == user || do_after(user, 50 * toolspeed, target = M)))
if(user && M && (get_turf(M) == T) && src && imp)
if(imp.implant(M, user))
if(M == user)
diff --git a/code/game/objects/items/weapons/melee/energy.dm b/code/game/objects/items/weapons/melee/energy.dm
index 5e262ce4afa..b40f81bef60 100644
--- a/code/game/objects/items/weapons/melee/energy.dm
+++ b/code/game/objects/items/weapons/melee/energy.dm
@@ -8,6 +8,8 @@
var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut")
no_embed = 1 // Physically impossible for energy weapons to embed themselves into people, this should fix that. -- Dave
hitsound = 'sound/weapons/blade1.ogg' // Probably more appropriate than the previous hitsound. -- Dave
+ usesound = 'sound/weapons/blade1.ogg'
+ toolspeed = 1
/obj/item/weapon/melee/energy/suicide_act(mob/user)
user.visible_message(pick("[user] is slitting \his stomach open with the [src.name]! It looks like \he's trying to commit seppuku.", \
diff --git a/code/game/objects/items/weapons/powerfist.dm b/code/game/objects/items/weapons/powerfist.dm
index 0167ab589be..99bf305df42 100644
--- a/code/game/objects/items/weapons/powerfist.dm
+++ b/code/game/objects/items/weapons/powerfist.dm
@@ -46,7 +46,7 @@
fisto_setting = 3
if(3)
fisto_setting = 1
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You tweak \the [src]'s piston valve to [fisto_setting].")
else if(istype(W, /obj/item/weapon/screwdriver))
if(tank)
diff --git a/code/game/objects/items/weapons/scissors.dm b/code/game/objects/items/weapons/scissors.dm
index 00b85d8ebe1..6cfb677bd21 100644
--- a/code/game/objects/items/weapons/scissors.dm
+++ b/code/game/objects/items/weapons/scissors.dm
@@ -9,6 +9,7 @@
w_class = 2
hitsound = 'sound/weapons/bladeslice.ogg'
attack_verb = list("slices", "cuts", "stabs", "jabs")
+ toolspeed = 1
/obj/item/weapon/scissors/barber
name = "Barber's Scissors"
@@ -16,6 +17,7 @@
icon_state = "bscissor"
item_state = "scissor"
attack_verb = list("beautifully sliced", "artistically cut", "smoothly stabbed", "quickly jabbed")
+ toolspeed = 0.75
/obj/item/weapon/scissors/attack(mob/living/carbon/M as mob, mob/user as mob)
if(user.a_intent != "help")
@@ -79,7 +81,7 @@
var/h_new_style = input(user, "Select a hair style", "Grooming") as null|anything in species_hair
user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!") //arguments for this are: 1. what others see 2. what the user sees. --Fixed grammar, (TGameCo)
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
- if(do_after(user, 50, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
+ if(do_after(user, 50 * toolspeed, target = H)) //this is the part that adds a delay. delay is in deciseconds. --Made it 5 seconds, because hair isn't cut in one second in real life, and I want at least a little bit longer time, (TGameCo)
if(!(M in view(1))) //Adjacency test
user.visible_message("[user] stops cutting [M]'s hair.", "You stop cutting [M]'s hair.")
return
@@ -112,7 +114,7 @@
is_cutting = 1
user.visible_message("[user] starts cutting [M]'s hair!", "You start cutting [M]'s hair!")
playsound(loc, 'sound/goonstation/misc/Scissor.ogg', 100, 1)
- if(do_after(user, 50, target = H))
+ if(do_after(user, 50 * toolspeed, target = H))
playsound(loc, 'sound/weapons/bladeslice.ogg', 50, 1, -1)
user.visible_message("[user] abruptly stops cutting [M]'s hair and slices their throat!", "You stop cutting [M]'s hair and slice their throat!") //Just a little off the top.
H.AdjustLoseBreath(10) //30 Oxy damage over time
diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm
index e6e58196108..74fc3a5be6c 100644
--- a/code/game/objects/items/weapons/stock_parts.dm
+++ b/code/game/objects/items/weapons/stock_parts.dm
@@ -6,7 +6,7 @@
icon_state = "RPED"
item_state = "RPED"
w_class = 5
- can_hold = list("/obj/item/weapon/stock_parts")
+ can_hold = list(/obj/item/weapon/stock_parts)
storage_slots = 50
use_to_pickup = 1
allow_quick_gather = 1
@@ -18,6 +18,8 @@
var/works_from_distance = 0
var/primary_sound = 'sound/items/rped.ogg'
var/alt_sound = null
+ toolspeed = 1
+ usesound = 'sound/items/rped.ogg'
/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params)
if(flag)
@@ -41,6 +43,8 @@
works_from_distance = 1
primary_sound = 'sound/items/PSHOOM.ogg'
alt_sound = 'sound/items/PSHOOM_2.ogg'
+ usesound = 'sound/items/PSHOOM.ogg'
+ toolspeed = 0.5
/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
//Plays the sound for RPED exchanging or installing parts.
@@ -61,9 +65,12 @@
icon = 'icons/obj/stock_parts.dmi'
w_class = 2
var/rating = 1
- New()
- src.pixel_x = rand(-5.0, 5)
- src.pixel_y = rand(-5.0, 5)
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
+
+/obj/item/weapon/stock_parts/New()
+ src.pixel_x = rand(-5.0, 5)
+ src.pixel_y = rand(-5.0, 5)
//Rank 1
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index c664ca9fff9..562d2b2d1b2 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -51,7 +51,7 @@
var/response = alert(user, "Are you sure you want to put the bag of holding inside another bag of holding?","Are you sure you want to die?","Yes","No")
if(response == "Yes")
user.visible_message("[user] grins as \he begins to put a Bag of Holding into a Bag of Holding!", "You begin to put the Bag of Holding into the Bag of Holding!")
- if(do_after(user,30,target=src))
+ if(do_after(user, 30, target=src))
investigate_log("has become a singularity. Caused by [user.key]","singulo")
user.visible_message("[user] erupts in evil laughter as \he puts the Bag of Holding into another Bag of Holding!", "You can't help but laugh wildly as you put the Bag of Holding into another Bag of Holding, complete darkness surrounding you."," You hear the sound of scientific evil brewing! ")
qdel(W)
@@ -189,7 +189,7 @@
/obj/item/weapon/storage/backpack/satchel_norm
name = "satchel"
desc = "A deluxe NT Satchel, made of the highest quality leather."
- icon_state = "satchel"
+ icon_state = "satchel-norm"
/obj/item/weapon/storage/backpack/satchel_eng
name = "industrial satchel"
@@ -447,4 +447,4 @@
/obj/item/weapon/storage/backpack/ert/janitor
name = "emergency response team janitor backpack"
desc = "A spacious backpack with lots of pockets, worn by janitorial members of a Nanotrasen Emergency Response Team."
- icon_state = "ert_janitor"
\ No newline at end of file
+ icon_state = "ert_janitor"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 49ba664619f..ea60db5b20d 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -37,7 +37,7 @@
max_w_class = 2
storage_slots = 30
can_hold = list() // any
- cant_hold = list("/obj/item/weapon/disk/nuclear")
+ cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/trash/suicide_act(mob/user)
user.visible_message("[user] puts the [src.name] over their head and starts chomping at the insides! Disgusting!")
@@ -93,7 +93,7 @@
storage_slots = 7
display_contents_with_number = 0 //or else this will lead to stupid behavior.
can_hold = list() // any
- cant_hold = list("/obj/item/weapon/disk/nuclear")
+ cant_hold = list(/obj/item/weapon/disk/nuclear)
/obj/item/weapon/storage/bag/plasticbag/mob_can_equip(M as mob, slot)
@@ -136,7 +136,7 @@
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
max_w_class = 3
- can_hold = list("/obj/item/weapon/ore")
+ can_hold = list(/obj/item/weapon/ore)
/obj/item/weapon/storage/bag/ore/cyborg
name = "cyborg mining satchel"
@@ -166,7 +166,7 @@
max_combined_w_class = 100 //Doesn't matter what this is, so long as it's more or equal to storage_slots * plants.w_class
max_w_class = 3
w_class = 1
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/grown","/obj/item/seeds","/obj/item/weapon/grown","/obj/item/weapon/reagent_containers/food/snacks/ash_flora")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown,/obj/item/weapon/reagent_containers/food/snacks/ash_flora)
burn_state = FLAMMABLE
/obj/item/weapon/storage/bag/plants/portaseeder
@@ -345,8 +345,7 @@
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * cash.w_class
max_w_class = 3
w_class = 1
-
- can_hold = list("/obj/item/weapon/coin","/obj/item/weapon/spacecash")
+ can_hold = list(/obj/item/weapon/coin,/obj/item/stack/spacecash)
// -----------------------------
// Book bag
@@ -362,7 +361,7 @@
max_combined_w_class = 21
max_w_class = 3
w_class = 4 //Bigger than a book because physics
- can_hold = list("/obj/item/weapon/book", "/obj/item/weapon/storage/bible", "/obj/item/weapon/tome", "/obj/item/weapon/spellbook")
+ can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/bible, /obj/item/weapon/tome, /obj/item/weapon/spellbook)
burn_state = FLAMMABLE
/*
@@ -471,7 +470,7 @@
storage_slots = 50
max_combined_w_class = 200
w_class = 1
- can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/pill,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle)
burn_state = FLAMMABLE
/*
* Biowaste bag (mostly for xenobiologists)
@@ -485,5 +484,5 @@
storage_slots = 25
max_combined_w_class = 200
w_class = 1
- can_hold = list("/obj/item/slime_extract","/obj/item/weapon/reagent_containers/food/snacks/monkeycube","/obj/item/weapon/reagent_containers/syringe","/obj/item/weapon/reagent_containers/glass/beaker","/obj/item/weapon/reagent_containers/glass/bottle","/obj/item/weapon/reagent_containers/blood","/obj/item/weapon/reagent_containers/hypospray/autoinjector")
+ can_hold = list(/obj/item/slime_extract,/obj/item/weapon/reagent_containers/food/snacks/monkeycube,/obj/item/weapon/reagent_containers/syringe,/obj/item/weapon/reagent_containers/glass/beaker,/obj/item/weapon/reagent_containers/glass/bottle,/obj/item/weapon/reagent_containers/blood,/obj/item/weapon/reagent_containers/hypospray/autoinjector)
burn_state = FLAMMABLE
diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm
index fe29ba5c23a..b577df5987e 100644
--- a/code/game/objects/items/weapons/storage/belt.dm
+++ b/code/game/objects/items/weapons/storage/belt.dm
@@ -48,19 +48,18 @@
item_state = "utility"
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/crowbar",
- "/obj/item/weapon/screwdriver",
- "/obj/item/weapon/weldingtool",
- "/obj/item/weapon/wirecutters",
- "/obj/item/weapon/wrench",
- "/obj/item/device/multitool",
- "/obj/item/device/flashlight",
- "/obj/item/stack/cable_coil",
- "/obj/item/device/t_scanner",
- "/obj/item/device/analyzer",
- "/obj/item/taperoll/engineering",
- "/obj/item/weapon/extinguisher/mini")
-
+ /obj/item/weapon/crowbar,
+ /obj/item/weapon/screwdriver,
+ /obj/item/weapon/weldingtool,
+ /obj/item/weapon/wirecutters,
+ /obj/item/weapon/wrench,
+ /obj/item/device/multitool,
+ /obj/item/device/flashlight,
+ /obj/item/stack/cable_coil,
+ /obj/item/device/t_scanner,
+ /obj/item/device/analyzer,
+ /obj/item/taperoll/engineering,
+ /obj/item/weapon/extinguisher/mini)
/obj/item/weapon/storage/belt/utility/full/New()
..()
@@ -69,7 +68,7 @@
new /obj/item/weapon/weldingtool(src)
new /obj/item/weapon/crowbar(src)
new /obj/item/weapon/wirecutters(src)
- new /obj/item/stack/cable_coil(src,30,pick("red","yellow","orange"))
+ new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE))
update_icon()
/obj/item/weapon/storage/belt/utility/full/multitool/New()
@@ -88,7 +87,23 @@
new /obj/item/weapon/extinguisher/mini(src)
update_icon()
+/obj/item/weapon/storage/belt/utility/chief
+ name = "Chief Engineer's toolbelt"
+ desc = "Holds tools, looks snazzy"
+ icon_state = "utilitybelt_ce"
+ item_state = "utility_ce"
+/obj/item/weapon/storage/belt/utility/chief/full/New()
+ ..()
+ new /obj/item/weapon/screwdriver/power(src)
+ new /obj/item/weapon/crowbar/power(src)
+ new /obj/item/weapon/weldingtool/experimental(src)//This can be changed if this is too much
+ new /obj/item/device/multitool(src)
+ new /obj/item/stack/cable_coil(src, 30, pick(COLOR_RED, COLOR_YELLOW, COLOR_ORANGE))
+ new /obj/item/weapon/extinguisher/mini(src)
+ new /obj/item/device/analyzer(src)
+ update_icon()
+ //much roomier now that we've managed to remove two tools
/obj/item/weapon/storage/belt/medical
use_to_pickup = 1 //Allow medical belt to pick up medicine
@@ -98,24 +113,24 @@
item_state = "medical"
use_item_overlays = 1
can_hold = list(
- "/obj/item/device/healthanalyzer",
- "/obj/item/weapon/dnainjector",
- "/obj/item/weapon/reagent_containers/dropper",
- "/obj/item/weapon/reagent_containers/glass/beaker",
- "/obj/item/weapon/reagent_containers/glass/bottle",
- "/obj/item/weapon/reagent_containers/food/pill",
- "/obj/item/weapon/reagent_containers/syringe",
- "/obj/item/weapon/reagent_containers/glass/dispenser",
- "/obj/item/weapon/lighter/zippo",
- "/obj/item/weapon/storage/fancy/cigarettes",
- "/obj/item/weapon/storage/pill_bottle",
- "/obj/item/stack/medical",
- "/obj/item/device/flashlight/pen",
- "/obj/item/clothing/mask/surgical",
- "/obj/item/clothing/gloves/color/latex",
- "/obj/item/weapon/reagent_containers/hypospray/autoinjector",
- "/obj/item/device/rad_laser",
- "/obj/item/device/sensor_device"
+ /obj/item/device/healthanalyzer,
+ /obj/item/weapon/dnainjector,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+ /obj/item/weapon/reagent_containers/food/pill,
+ /obj/item/weapon/reagent_containers/syringe,
+ /obj/item/weapon/lighter/zippo,
+ /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/storage/pill_bottle,
+ /obj/item/stack/medical,
+ /obj/item/device/flashlight/pen,
+ /obj/item/clothing/mask/surgical,
+ /obj/item/clothing/gloves/color/latex,
+ /obj/item/weapon/reagent_containers/hypospray/autoinjector,
+ /obj/item/device/rad_laser,
+ /obj/item/device/sensor_device,
+ /obj/item/weapon/wrench/medical,
)
/obj/item/weapon/storage/belt/medical/response_team
@@ -139,22 +154,19 @@
item_state = "botany"
use_item_overlays = 1
can_hold = list(
- "/obj/item/device/plant_analyzer",
- "/obj/item/weapon/cultivator",
- "/obj/item/weapon/hatchet",
- "/obj/item/weapon/reagent_containers/glass/bottle",
- "/obj/item/weapon/plantspray",
-// "/obj/item/weapon/reagent_containers/syringe",
-// "/obj/item/weapon/reagent_containers/glass/beaker",
- "/obj/item/weapon/lighter/zippo",
- "/obj/item/weapon/storage/fancy/cigarettes",
- "obj/item/weapon/rollingpaperpack",
- "/obj/item/weapon/shovel/spade",
- "/obj/item/device/flashlight/pen",
- "/obj/item/seeds",
- "/obj/item/weapon/wirecutters",
- "/obj/item/weapon/wrench",
- "/obj/item/weapon/disk/botany",
+ /obj/item/device/plant_analyzer,
+ /obj/item/weapon/cultivator,
+ /obj/item/weapon/hatchet,
+ /obj/item/weapon/reagent_containers/glass/bottle,
+// /obj/item/weapon/reagent_containers/syringe,
+// /obj/item/weapon/reagent_containers/glass/beaker,
+ /obj/item/weapon/lighter/zippo,
+ /obj/item/weapon/storage/fancy/cigarettes,
+ /obj/item/weapon/shovel/spade,
+ /obj/item/device/flashlight/pen,
+ /obj/item/seeds,
+ /obj/item/weapon/wirecutters,
+ /obj/item/weapon/wrench,
)
@@ -167,22 +179,22 @@
max_w_class = 3
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/grenade/flashbang",
- "/obj/item/weapon/grenade/chem_grenade/teargas",
- "/obj/item/weapon/reagent_containers/spray/pepper",
- "/obj/item/weapon/restraints/handcuffs",
- "/obj/item/device/flash",
- "/obj/item/clothing/glasses",
- "/obj/item/ammo_casing/shotgun",
- "/obj/item/ammo_box",
- "/obj/item/weapon/reagent_containers/food/snacks/donut",
- "/obj/item/weapon/kitchen/knife/combat",
- "/obj/item/weapon/melee/baton",
- "/obj/item/weapon/melee/classic_baton",
- "/obj/item/device/flashlight/seclite",
- "/obj/item/taperoll/police",
- "/obj/item/weapon/melee/classic_baton/telescopic",
- "/obj/item/weapon/restraints/legcuffs/bola")
+ /obj/item/weapon/grenade/flashbang,
+ /obj/item/weapon/grenade/chem_grenade/teargas,
+ /obj/item/weapon/reagent_containers/spray/pepper,
+ /obj/item/weapon/restraints/handcuffs,
+ /obj/item/device/flash,
+ /obj/item/clothing/glasses,
+ /obj/item/ammo_casing/shotgun,
+ /obj/item/ammo_box,
+ /obj/item/weapon/reagent_containers/food/snacks/donut,
+ /obj/item/weapon/kitchen/knife/combat,
+ /obj/item/weapon/melee/baton,
+ /obj/item/weapon/melee/classic_baton,
+ /obj/item/device/flashlight/seclite,
+ /obj/item/taperoll/police,
+ /obj/item/weapon/melee/classic_baton/telescopic,
+ /obj/item/weapon/restraints/legcuffs/bola)
/obj/item/weapon/storage/belt/security/sec/New()
..()
@@ -236,6 +248,24 @@
desc = "A syndicate belt designed to be used by boarding parties. Its style is modelled after the hardsuits they wear."
icon_state = "militarybelt"
item_state = "military"
+ max_w_class = WEIGHT_CLASS_SMALL
+
+/obj/item/weapon/storage/belt/military/abductor
+ name = "agent belt"
+ desc = "A belt used by abductor agents."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "belt"
+ item_state = "security"
+
+/obj/item/weapon/storage/belt/military/abductor/full/New()
+ ..()
+ new /obj/item/weapon/screwdriver/abductor(src)
+ new /obj/item/weapon/wrench/abductor(src)
+ new /obj/item/weapon/weldingtool/abductor(src)
+ new /obj/item/weapon/crowbar/abductor(src)
+ new /obj/item/weapon/wirecutters/abductor(src)
+ new /obj/item/device/multitool/abductor(src)
+ new /obj/item/stack/cable_coil(src, 30, COLOR_WHITE)
/obj/item/weapon/storage/belt/military/assault
name = "assault belt"
@@ -253,12 +283,12 @@
max_w_class = 4 // Set to this so the light replacer can fit.
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/grenade/chem_grenade/cleaner",
- "/obj/item/device/lightreplacer",
- "/obj/item/device/flashlight",
- "/obj/item/weapon/reagent_containers/spray",
- "/obj/item/weapon/soap",
- "/obj/item/weapon/holosign_creator"
+ /obj/item/weapon/grenade/chem_grenade/cleaner,
+ /obj/item/device/lightreplacer,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/reagent_containers/spray,
+ /obj/item/weapon/soap,
+ /obj/item/weapon/holosign_creator
)
/obj/item/weapon/storage/belt/janitor/full/New()
@@ -280,7 +310,7 @@
max_w_class = 1
max_combined_w_class = 6
storage_slots = 6
- can_hold = list("/obj/item/device/mobcapsule")
+ can_hold = list(/obj/item/device/mobcapsule)
/obj/item/weapon/storage/belt/lazarus/New()
..()
@@ -309,7 +339,7 @@
item_state = "bandolier"
storage_slots = 8
can_hold = list(
- "/obj/item/ammo_casing/shotgun"
+ /obj/item/ammo_casing/shotgun
)
/obj/item/weapon/storage/belt/bandolier/New()
@@ -351,8 +381,8 @@
storage_slots = 1
max_w_class = 3
can_hold = list(
- "/obj/item/weapon/gun/projectile/automatic/pistol",
- "/obj/item/weapon/gun/projectile/revolver/detective"
+ /obj/item/weapon/gun/projectile/automatic/pistol,
+ /obj/item/weapon/gun/projectile/revolver/detective
)
/obj/item/weapon/storage/belt/wands
@@ -363,7 +393,7 @@
storage_slots = 6
use_item_overlays = 1
can_hold = list(
- "/obj/item/weapon/gun/magic/wand"
+ /obj/item/weapon/gun/magic/wand
)
/obj/item/weapon/storage/belt/wands/full/New()
@@ -447,7 +477,7 @@
storage_slots = 1
w_class = 4
max_w_class = 4
- can_hold = list("/obj/item/weapon/melee/rapier")
+ can_hold = list(/obj/item/weapon/melee/rapier)
/obj/item/weapon/storage/belt/rapier/update_icon()
icon_state = "[initial(icon_state)]"
@@ -505,8 +535,8 @@
origin_tech = "bluespace=4;syndicate=2"
allow_quick_empty = 1
can_hold = list(
- "/obj/item/weapon/grenade/smokebomb",
- "/obj/item/weapon/restraints/legcuffs/bola"
+ /obj/item/weapon/grenade/smokebomb,
+ /obj/item/weapon/restraints/legcuffs/bola
)
flags = NODROP
@@ -554,48 +584,6 @@
if(H.s_active && H.s_active == src)
H.s_active.show_to(H)
-
-/* DEPRECATED DUE TO SUPERHERO CODE AND NODROP
- // As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
- // Of course, it could be worse. It could spawn a singularity!
-/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
- if(!flag)
- return
- if(istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
- return
- to_chat(user, "Planting explosives...")
- user.visible_message("[user.name] is fiddling with their toolbelt.")
- if(ismob(target))
- user.create_attack_log(" [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])")
- log_attack(" [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])")
- user.visible_message("\red [user.name] is trying to strap a belt to [target.name]!")
-
-
- if(do_after(user, 50, target = target) && in_range(user, target))
- user.drop_item()
- target = target
- loc = null
- var/location
- if(isturf(target)) location = target
- if(ismob(target))
- target:create_attack_log(" Had the [name] planted on them by [user.real_name] ([user.ckey])")
- user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
- target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
- to_chat(user, "You sacrifice your belt for the sake of justice. Timer counting down from 15.")
- spawn(150)
- if(target)
- if(ismob(target) || isobj(target))
- location = target.loc // These things can move
- explosion(location, -1, -1, 2, 3)
- if(istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
- else target.ex_act(1)
- if(isobj(target))
- if(target)
- qdel(target)
- if(src)
- qdel(src)
-*/
-
/obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone)
return
diff --git a/code/game/objects/items/weapons/storage/bible.dm b/code/game/objects/items/weapons/storage/bible.dm
index 21731113466..cb6405c9516 100644
--- a/code/game/objects/items/weapons/storage/bible.dm
+++ b/code/game/objects/items/weapons/storage/bible.dm
@@ -23,9 +23,9 @@
..()
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
new /obj/item/weapon/reagent_containers/food/drinks/cans/beer(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
- new /obj/item/weapon/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
+ new /obj/item/stack/spacecash(src)
//BS12 EDIT
// All cult functionality moved to Null Rod
/obj/item/weapon/storage/bible/proc/bless(mob/living/carbon/M as mob)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 88820290a48..793e5761b26 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -390,7 +390,7 @@
icon = 'icons/obj/food/food.dmi'
icon_state = "monkeycubebox"
storage_slots = 7
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/monkeycube)
var/monkey_cube_type = /obj/item/weapon/reagent_containers/food/snacks/monkeycube
/obj/item/weapon/storage/box/monkeycubes/New()
@@ -561,7 +561,7 @@
icon = 'icons/obj/toy.dmi'
icon_state = "spbox"
storage_slots = 8
- can_hold = list("/obj/item/toy/snappop")
+ can_hold = list(/obj/item/toy/snappop)
New()
..()
for(var/i=1; i <= storage_slots; i++)
@@ -621,7 +621,7 @@
item_state = "syringe_kit"
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots=21
- can_hold = list("/obj/item/weapon/light/tube", "/obj/item/weapon/light/bulb")
+ can_hold = list(/obj/item/weapon/light/tube, /obj/item/weapon/light/bulb)
max_combined_w_class = 21
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index 168196f0480..c20cec521c6 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -48,7 +48,7 @@
icon_type = "donut"
name = "donut box"
storage_slots = 6
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/donut")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/donut)
/obj/item/weapon/storage/fancy/donut_box/New()
@@ -66,7 +66,7 @@
icon_type = "egg"
name = "egg box"
storage_slots = 12
- can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/egg")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/egg)
/obj/item/weapon/storage/fancy/egg_box/New()
..()
@@ -119,7 +119,7 @@
storage_slots = 6
icon_type = "crayon"
can_hold = list(
- "/obj/item/toy/crayon"
+ /obj/item/toy/crayon
)
/obj/item/weapon/storage/fancy/crayons/New()
@@ -163,12 +163,12 @@
slot_flags = SLOT_BELT
storage_slots = 6
max_combined_w_class = 6
- can_hold = list("/obj/item/clothing/mask/cigarette",
- "/obj/item/weapon/lighter",
- "/obj/item/weapon/match")
- cant_hold = list("/obj/item/clothing/mask/cigarette/cigar",
- "/obj/item/clothing/mask/cigarette/pipe",
- "/obj/item/weapon/lighter/zippo")
+ can_hold = list(/obj/item/clothing/mask/cigarette,
+ /obj/item/weapon/lighter,
+ /obj/item/weapon/match)
+ cant_hold = list(/obj/item/clothing/mask/cigarette/cigar,
+ /obj/item/clothing/mask/cigarette/pipe,
+ /obj/item/weapon/lighter/zippo)
icon_type = "cigarette"
var/list/unlaced_cigarettes = list() // Cigarettes that haven't received reagents yet
var/default_reagents = list("nicotine" = 15) // List of reagents to pre-generate for each cigarette
@@ -323,7 +323,7 @@
icon_state = "cig_paper_pack"
storage_slots = 10
icon_type = "rolling paper"
- can_hold = list("/obj/item/weapon/rollingpaper")
+ can_hold = list(/obj/item/weapon/rollingpaper)
/obj/item/weapon/storage/fancy/rollingpapers/New()
..()
@@ -345,7 +345,7 @@
icon_type = "vial"
name = "vial storage box"
storage_slots = 6
- can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
+ can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
/obj/item/weapon/storage/fancy/vials/New()
@@ -361,7 +361,7 @@
icon_state = "vialbox0"
item_state = "syringe_kit"
max_w_class = 3
- can_hold = list("/obj/item/weapon/reagent_containers/glass/beaker/vial")
+ can_hold = list(/obj/item/weapon/reagent_containers/glass/beaker/vial)
max_combined_w_class = 14 //The sum of the w_classes of all the items in this storage item.
storage_slots = 6
req_access = list(access_virology)
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 67d44c53b2d..5ab8713a49a 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -184,8 +184,8 @@
max_w_class = 4
max_combined_w_class = 21
storage_slots = 10
- can_hold = list("/obj/item/roller","/obj/item/weapon/bonesetter","/obj/item/weapon/bonegel", "/obj/item/weapon/scalpel", "/obj/item/weapon/hemostat",
- "/obj/item/weapon/cautery", "/obj/item/weapon/retractor", "/obj/item/weapon/FixOVein", "/obj/item/weapon/surgicaldrill", "/obj/item/weapon/circular_saw")
+ can_hold = list(/obj/item/roller,/obj/item/weapon/bonesetter,/obj/item/weapon/bonegel, /obj/item/weapon/scalpel, /obj/item/weapon/hemostat,
+ /obj/item/weapon/cautery, /obj/item/weapon/retractor, /obj/item/weapon/FixOVein, /obj/item/weapon/surgicaldrill, /obj/item/weapon/circular_saw)
/obj/item/weapon/storage/firstaid/surgery/New()
..()
@@ -210,7 +210,7 @@
icon = 'icons/obj/chemical.dmi'
item_state = "contsolid"
w_class = 2
- can_hold = list("/obj/item/weapon/reagent_containers/food/pill","/obj/item/weapon/dice","/obj/item/weapon/paper")
+ can_hold = list(/obj/item/weapon/reagent_containers/food/pill, /obj/item/weapon/dice, /obj/item/weapon/paper)
allow_quick_gather = 1
use_to_pickup = 1
storage_slots = 14
diff --git a/code/game/objects/items/weapons/storage/secure.dm b/code/game/objects/items/weapons/storage/secure.dm
index e848eec1aca..e06cbb91255 100644
--- a/code/game/objects/items/weapons/storage/secure.dm
+++ b/code/game/objects/items/weapons/storage/secure.dm
@@ -37,7 +37,7 @@
emag_act(user, W)
if(istype(W, /obj/item/weapon/screwdriver))
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
open = !open
user.show_message("You [open ? "open" : "close"] the service panel.", 1)
return
@@ -45,18 +45,18 @@
if((istype(W, /obj/item/device/multitool)) && (open == 1) && (!l_hacking))
user.show_message("Now attempting to reset internal memory, please hold.", 1)
l_hacking = 1
- if(do_after(usr, 100, target = src))
+ if(do_after(usr, 100 * W.toolspeed, target = src))
if(prob(40))
l_setshort = 1
l_set = 0
- user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1)
+ user.show_message("Internal memory reset. Please give it a few seconds to reinitialize.", 1)
sleep(80)
l_setshort = 0
l_hacking = 0
else
user.show_message("Unable to reset internal memory.", 1)
l_hacking = 0
- else
+ else
l_hacking = 0
return
//At this point you have exhausted all the special things to do when locked
@@ -212,9 +212,9 @@
force = 15
/obj/item/weapon/storage/secure/briefcase/syndie/New()
- ..()
+ ..()
for(var/i = 0, i < storage_slots - 2, i++)
- handle_item_insertion(new /obj/item/weapon/spacecash/c1000, 1)
+ handle_item_insertion(new /obj/item/stack/spacecash/c1000, 1)
// -----------------------------
// Secure Safe
@@ -232,7 +232,7 @@
max_w_class = 8
anchored = 1
density = 0
- cant_hold = list("/obj/item/weapon/storage/secure/briefcase")
+ cant_hold = list(/obj/item/weapon/storage/secure/briefcase)
/obj/item/weapon/storage/secure/safe/New()
..()
diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm
index cdf123f2982..c212fcc476e 100644
--- a/code/game/objects/items/weapons/storage/storage.dm
+++ b/code/game/objects/items/weapons/storage/storage.dm
@@ -242,23 +242,15 @@
return 0 //Storage item is full
if(can_hold.len)
- var/ok = 0
- for(var/A in can_hold)
- if(istype(W, text2path(A) ))
- ok = 1
- break
- if(!ok)
+ if(!is_type_in_typecache(W, can_hold))
if(!stop_messages)
- if(istype(W, /obj/item/weapon/hand_labeler))
- return 0
to_chat(usr, "[src] cannot hold [W].")
return 0
- for(var/A in cant_hold) //Check for specific items which this container can't hold.
- if(istype(W, text2path(A) ))
- if(!stop_messages)
- to_chat(usr, "[src] cannot hold [W].")
- return 0
+ if(is_type_in_typecache(W, cant_hold)) //Check for specific items which this container can't hold.
+ if(!stop_messages)
+ to_chat(usr, "[src] cannot hold [W].")
+ return 0
if(W.w_class > max_w_class)
if(!stop_messages)
@@ -432,6 +424,8 @@
remove_from_storage(I, T)
/obj/item/weapon/storage/New()
+ can_hold = typecacheof(can_hold)
+ cant_hold = typecacheof(cant_hold)
if(allow_quick_empty)
verbs += /obj/item/weapon/storage/verb/quick_empty
@@ -455,7 +449,6 @@
src.closer.layer = 20
src.closer.plane = HUD_PLANE
orient2hud()
- return
/obj/item/weapon/storage/Destroy()
for(var/obj/O in contents)
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 74d4093beb5..a6ecd3d45ac 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -15,41 +15,35 @@
attack_verb = list("robusted")
hitsound = 'sound/weapons/smash.ogg'
- New()
- ..()
- if(src.type == /obj/item/weapon/storage/toolbox)
- to_chat(world, "BAD: [src] ([src.type]) spawned at [src.x] [src.y] [src.z]")
- qdel(src)
-
/obj/item/weapon/storage/toolbox/emergency
name = "emergency toolbox"
icon_state = "red"
item_state = "toolbox_red"
- New()
- ..()
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/weldingtool/mini(src)
- new /obj/item/weapon/extinguisher/mini(src)
- if(prob(50))
- new /obj/item/device/flashlight(src)
- else
- new /obj/item/device/flashlight/flare(src)
- new /obj/item/device/radio(src)
+/obj/item/weapon/storage/toolbox/emergency/New()
+ ..()
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/weldingtool/mini(src)
+ new /obj/item/weapon/extinguisher/mini(src)
+ if(prob(50))
+ new /obj/item/device/flashlight(src)
+ else
+ new /obj/item/device/flashlight/flare(src)
+ new /obj/item/device/radio(src)
/obj/item/weapon/storage/toolbox/mechanical
name = "mechanical toolbox"
icon_state = "blue"
item_state = "toolbox_blue"
- New()
- ..()
- new /obj/item/weapon/screwdriver(src)
- new /obj/item/weapon/wrench(src)
- new /obj/item/weapon/weldingtool(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/device/analyzer(src)
- new /obj/item/weapon/wirecutters(src)
+/obj/item/weapon/storage/toolbox/mechanical/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/device/analyzer(src)
+ new /obj/item/weapon/wirecutters(src)
/obj/item/weapon/storage/toolbox/mechanical/greytide
flags = NODROP
@@ -59,19 +53,19 @@
icon_state = "yellow"
item_state = "toolbox_yellow"
- New()
- ..()
- var/color = pick("red","yellow","green","blue","pink","orange","cyan","white")
- new /obj/item/weapon/screwdriver(src)
- new /obj/item/weapon/wirecutters(src)
- new /obj/item/device/t_scanner(src)
- new /obj/item/weapon/crowbar(src)
- new /obj/item/stack/cable_coil(src,30,color)
- new /obj/item/stack/cable_coil(src,30,color)
- if(prob(5))
- new /obj/item/clothing/gloves/color/yellow(src)
- else
- new /obj/item/stack/cable_coil(src,30,color)
+/obj/item/weapon/storage/toolbox/electrical/New()
+ ..()
+ var/pickedcolor = pick(COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_PINK, COLOR_ORANGE, COLOR_CYAN, COLOR_WHITE)
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/t_scanner(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ if(prob(5))
+ new /obj/item/clothing/gloves/color/yellow(src)
+ else
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
/obj/item/weapon/storage/toolbox/syndicate
name = "suspicious looking toolbox"
@@ -82,12 +76,47 @@
force = 15.0
throwforce = 18.0
- New()
- ..()
- new /obj/item/weapon/screwdriver(src, "red")
- new /obj/item/weapon/wrench(src)
- new /obj/item/weapon/weldingtool/largetank(src)
- new /obj/item/weapon/crowbar/red(src)
- new /obj/item/weapon/wirecutters(src, "red")
- new /obj/item/device/multitool(src)
- new /obj/item/clothing/gloves/combat(src)
\ No newline at end of file
+/obj/item/weapon/storage/toolbox/syndicate/New()
+ ..()
+ new /obj/item/weapon/screwdriver(src, "red")
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool/largetank(src)
+ new /obj/item/weapon/crowbar/red(src)
+ new /obj/item/weapon/wirecutters(src, "red")
+ new /obj/item/device/multitool(src)
+ new /obj/item/clothing/gloves/combat(src)
+
+/obj/item/weapon/storage/toolbox/drone
+ name = "mechanical toolbox"
+ icon_state = "blue"
+ item_state = "toolbox_blue"
+
+/obj/item/weapon/storage/toolbox/drone/New()
+ ..()
+ var/pickedcolor = pick(pick(COLOR_RED, COLOR_YELLOW, COLOR_GREEN, COLOR_BLUE, COLOR_PINK, COLOR_ORANGE, COLOR_CYAN, COLOR_WHITE))
+ new /obj/item/weapon/screwdriver(src)
+ new /obj/item/weapon/wrench(src)
+ new /obj/item/weapon/weldingtool(src)
+ new /obj/item/weapon/crowbar(src)
+ new /obj/item/stack/cable_coil(src, 30, pickedcolor)
+ new /obj/item/weapon/wirecutters(src)
+ new /obj/item/device/multitool(src)
+
+/obj/item/weapon/storage/toolbox/brass
+ name = "brass box"
+ desc = "A huge brass box with several indentations in its surface."
+ icon_state = "brassbox"
+ item_state = null
+ w_class = WEIGHT_CLASS_HUGE
+ max_w_class = WEIGHT_CLASS_NORMAL
+ max_combined_w_class = 28
+ storage_slots = 28
+ attack_verb = list("robusted", "crushed", "smashed")
+
+/obj/item/weapon/storage/toolbox/brass/prefilled/New()
+ ..()
+ new /obj/item/weapon/screwdriver/brass(src)
+ new /obj/item/weapon/wirecutters/brass(src)
+ new /obj/item/weapon/wrench/brass(src)
+ new /obj/item/weapon/crowbar/brass(src)
+ new /obj/item/weapon/weldingtool/experimental/brass(src)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/storage/uplink_kits.dm b/code/game/objects/items/weapons/storage/uplink_kits.dm
index e3f21a93d30..b7d87710064 100644
--- a/code/game/objects/items/weapons/storage/uplink_kits.dm
+++ b/code/game/objects/items/weapons/storage/uplink_kits.dm
@@ -88,7 +88,7 @@
/obj/item/weapon/storage/box/syndie_kit/space
name = "Boxed Space Suit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/syndicate/black/red", "/obj/item/clothing/head/helmet/space/syndicate/black/red")
+ can_hold = list(/obj/item/clothing/suit/space/syndicate/black/red, /obj/item/clothing/head/helmet/space/syndicate/black/red)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/space/New()
@@ -99,34 +99,34 @@
/obj/item/weapon/storage/box/syndie_kit/hardsuit
name = "Boxed Blood Red Suit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/syndi", "/obj/item/clothing/head/helmet/space/rig/syndi")
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi, /obj/item/clothing/head/helmet/space/hardsuit/syndi)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/syndi(src)
- new /obj/item/clothing/head/helmet/space/rig/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src)
return
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit
name = "Boxed Elite Syndicate Hardsuit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/syndi/elite", "/obj/item/clothing/head/helmet/space/rig/syndi/elite")
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/syndi/elite, /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite)
max_w_class = 3
/obj/item/weapon/storage/box/syndie_kit/elite_hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/syndi/elite(src)
- new /obj/item/clothing/head/helmet/space/rig/syndi/elite(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi/elite(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite(src)
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit
name = "Boxed Shielded Syndicate Hardsuit and Helmet"
- can_hold = list("/obj/item/clothing/suit/space/rig/shielded/syndi", "/obj/item/clothing/head/helmet/space/rig/shielded/syndi")
+ can_hold = list(/obj/item/clothing/suit/space/hardsuit/shielded/syndi, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi)
max_w_class = 4
/obj/item/weapon/storage/box/syndie_kit/shielded_hardsuit/New()
..()
- new /obj/item/clothing/suit/space/rig/shielded/syndi(src)
- new /obj/item/clothing/head/helmet/space/rig/shielded/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/shielded/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi(src)
/obj/item/weapon/storage/box/syndie_kit/conversion
name = "box (CK)"
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 5bc1ae65e84..0d9712ed43f 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -7,25 +7,25 @@
w_class = 2
burn_state = FLAMMABLE
can_hold = list(
- "/obj/item/weapon/spacecash",
- "/obj/item/weapon/card",
- "/obj/item/clothing/mask/cigarette",
- "/obj/item/device/flashlight/pen",
- "/obj/item/seeds",
- "/obj/item/stack/medical",
- "/obj/item/toy/crayon",
- "/obj/item/weapon/coin",
- "/obj/item/weapon/dice",
- "/obj/item/weapon/disk",
- "/obj/item/weapon/implanter",
- "/obj/item/weapon/lighter",
- "/obj/item/weapon/match",
- "/obj/item/weapon/paper",
- "/obj/item/weapon/pen",
- "/obj/item/weapon/photo",
- "/obj/item/weapon/reagent_containers/dropper",
- "/obj/item/weapon/screwdriver",
- "/obj/item/weapon/stamp")
+ /obj/item/stack/spacecash,
+ /obj/item/weapon/card,
+ /obj/item/clothing/mask/cigarette,
+ /obj/item/device/flashlight/pen,
+ /obj/item/seeds,
+ /obj/item/stack/medical,
+ /obj/item/toy/crayon,
+ /obj/item/weapon/coin,
+ /obj/item/weapon/dice,
+ /obj/item/weapon/disk,
+ /obj/item/weapon/implanter,
+ /obj/item/weapon/lighter,
+ /obj/item/weapon/match,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/reagent_containers/dropper,
+ /obj/item/weapon/screwdriver,
+ /obj/item/weapon/stamp)
slot_flags = SLOT_ID
var/obj/item/weapon/card/id/front_id = null
@@ -76,18 +76,18 @@
/obj/item/weapon/storage/wallet/random/New()
..()
- var/item1_type = pick(/obj/item/weapon/spacecash,
- /obj/item/weapon/spacecash/c10,
- /obj/item/weapon/spacecash/c100,
- /obj/item/weapon/spacecash/c500,
- /obj/item/weapon/spacecash/c1000)
+ var/item1_type = pick(/obj/item/stack/spacecash,
+ /obj/item/stack/spacecash/c10,
+ /obj/item/stack/spacecash/c100,
+ /obj/item/stack/spacecash/c500,
+ /obj/item/stack/spacecash/c1000)
var/item2_type
if(prob(50))
- item2_type = pick(/obj/item/weapon/spacecash,
- /obj/item/weapon/spacecash/c10,
- /obj/item/weapon/spacecash/c100,
- /obj/item/weapon/spacecash/c500,
- /obj/item/weapon/spacecash/c1000)
+ item2_type = pick(/obj/item/stack/spacecash,
+ /obj/item/stack/spacecash/c10,
+ /obj/item/stack/spacecash/c100,
+ /obj/item/stack/spacecash/c500,
+ /obj/item/stack/spacecash/c1000)
var/item3_type = pick( /obj/item/weapon/coin/silver, /obj/item/weapon/coin/silver, /obj/item/weapon/coin/gold, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron, /obj/item/weapon/coin/iron )
spawn(2)
diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm
index 7e0c7296fc9..5679ca7f02d 100644
--- a/code/game/objects/items/weapons/tools.dm
+++ b/code/game/objects/items/weapons/tools.dm
@@ -22,60 +22,137 @@
slot_flags = SLOT_BELT
force = 5
throwforce = 7
- w_class = 2
+ usesound = 'sound/items/Ratchet.ogg'
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=150)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
+
+/obj/item/weapon/wrench/suicide_act(mob/user)
+ user.visible_message("[user] is beating themself to death with [src]! It looks like they're trying to commit suicide!")
+ playsound(loc, 'sound/weapons/genhit.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/wrench/cyborg
+ name = "automatic wrench"
+ desc = "An advanced robotic wrench. Can be found in construction cyborgs."
+ toolspeed = 0.5
+
+/obj/item/weapon/wrench/brass
+ name = "brass wrench"
+ desc = "A brass wrench. It's faintly warm to the touch."
+ icon_state = "wrench_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/wrench/abductor
+ name = "alien wrench"
+ desc = "A polarized wrench. It causes anything placed between the jaws to turn."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "wrench"
+ usesound = 'sound/effects/EMPulse.ogg'
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=5;abductor=3"
+
+/obj/item/weapon/wrench/power
+ name = "Hand Drill"
+ desc = "A simple powered drill with a bolt bit."
+ icon_state = "drill_bolt"
+ item_state = "drill"
+ usesound = 'sound/items/drill_use.ogg'
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ attack_verb = list("drilled", "screwed", "jabbed")
+ toolspeed = 0.25
+
+/obj/item/weapon/wrench/power/attack_self(mob/user)
+ playsound(get_turf(user),'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/power/s_drill = new /obj/item/weapon/screwdriver/power
+ to_chat(user, "You attach the screwdriver bit to [src].")
+ qdel(src)
+ user.put_in_active_hand(s_drill)
+
+/obj/item/weapon/wrench/power/suicide_act(mob/user)
+ user.visible_message("[user] is pressing [src] against their head! It looks like they're trying to commit suicide!")
+ return (BRUTELOSS)
+
+/obj/item/weapon/wrench/medical
+ name = "medical wrench"
+ desc = "A medical wrench with common (medical?) uses. Can be found in your hand."
+ icon_state = "wrench_medical"
+ force = 2 //MEDICAL
+ throwforce = 4
+ origin_tech = "materials=1;engineering=1;biotech=3"
+ attack_verb = list("wrenched", "medicaled", "tapped", "jabbed", "whacked")
+
+/obj/item/weapon/wrench/medical/suicide_act(mob/user)
+ user.visible_message("[user] is praying to the medical wrench to take their soul. It looks like they're trying to commit suicide!")
+ // TODO Make them glow with the power of the M E D I C A L W R E N C H
+ // during their ascension
+
+ // Stun stops them from wandering off
+ user.Stun(5)
+ playsound(loc, 'sound/effects/pray.ogg', 50, 1, -1)
+
+ // Let the sound effect finish playing
+ sleep(20)
+
+ if(!user)
+ return
+
+ for(var/obj/item/W in user)
+ user.unEquip(W)
+
+ var/obj/item/weapon/wrench/medical/W = new /obj/item/weapon/wrench/medical(loc)
+ W.add_fingerprint(user)
+ W.desc += " For some reason, it reminds you of [user.name]."
+
+ if(!user)
+ return
+
+ user.dust()
+ return OXYLOSS
//Screwdriver
/obj/item/weapon/screwdriver
name = "screwdriver"
desc = "You can be totally screwy with this."
icon = 'icons/obj/tools.dmi'
- icon_state = "screwdriver"
+ icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
throwforce = 5
throw_speed = 3
throw_range = 5
materials = list(MAT_METAL=75)
attack_verb = list("stabbed")
hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/Screwdriver.ogg'
+ toolspeed = 1
+
+/obj/item/weapon/screwdriver/nuke
+ name = "screwdriver"
+ desc = "A screwdriver with an ultra thin tip."
+ icon_state = "screwdriver_nuke"
+ toolspeed = 0.5
/obj/item/weapon/screwdriver/suicide_act(mob/user)
- to_chat(viewers(user), pick("[user] is stabbing the [name] into \his temple! It looks like \he's trying to commit suicide.", \
- "[user] is stabbing the [name] into \his heart! It looks like \he's trying to commit suicide."))
+ user.visible_message("[user] is stabbing [src] into their [pick("temple", "heart")]! It looks like they're trying to commit suicide!")
return(BRUTELOSS)
-/obj/item/weapon/screwdriver/New()
- switch(pick("red","blue","purple","brown","green","cyan","yellow"))
- if("red")
- icon_state = "screwdriver2"
- item_state = "screwdriver"
- if("blue")
- icon_state = "screwdriver"
- item_state = "screwdriver_blue"
- if("purple")
- icon_state = "screwdriver3"
- item_state = "screwdriver_purple"
- if("brown")
- icon_state = "screwdriver4"
- item_state = "screwdriver_brown"
- if("green")
- icon_state = "screwdriver5"
- item_state = "screwdriver_green"
- if("cyan")
- icon_state = "screwdriver6"
- item_state = "screwdriver_cyan"
- if("yellow")
- icon_state = "screwdriver7"
- item_state = "screwdriver_yellow"
+/obj/item/weapon/screwdriver/New(loc, var/param_color = null)
+ ..()
+ if(!icon_state)
+ if(!param_color)
+ param_color = pick("red","blue","pink","brown","green","cyan","yellow")
+ icon_state = "screwdriver_[param_color]"
- if(prob(75))
+ if (prob(75))
src.pixel_y = rand(0, 16)
- return
/obj/item/weapon/screwdriver/attack(mob/living/carbon/M, mob/living/carbon/user)
if(!istype(M) || user.a_intent == I_HELP)
@@ -85,49 +162,150 @@
if((CLUMSY in user.mutations) && prob(50))
M = user
return eyestab(M,user)
+
+/obj/item/weapon/screwdriver/brass
+ name = "brass screwdriver"
+ desc = "A screwdriver made of brass. The handle feels freezing cold."
+ icon_state = "screwdriver_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/screwdriver/abductor
+ name = "alien screwdriver"
+ desc = "An ultrasonic screwdriver."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "screwdriver"
+ usesound = 'sound/items/PSHOOM.ogg'
+ toolspeed = 0.1
+
+/obj/item/weapon/screwdriver/power
+ name = "Hand Drill"
+ desc = "A simple hand drill with a screwdriver bit attached."
+ icon_state = "drill_screw"
+ item_state = "drill"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_GOLD=25)
+ origin_tech = "materials=2;engineering=2" //done for balance reasons, making them high value for research, but harder to get
+ force = 8 //might or might not be too high, subject to change
+ throwforce = 8
+ throw_speed = 2
+ throw_range = 3//it's heavier than a screw driver/wrench, so it does more damage, but can't be thrown as far
+ attack_verb = list("drilled", "screwed", "jabbed","whacked")
+ hitsound = 'sound/items/drill_hit.ogg'
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.25
+
+/obj/item/weapon/screwdriver/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting [src] to their temple. It looks like they're trying to commit suicide!")
+ return(BRUTELOSS)
+
+/obj/item/weapon/screwdriver/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_drill.ogg', 50, 1)
+ var/obj/item/weapon/wrench/power/b_drill = new /obj/item/weapon/wrench/power
+ to_chat(user, "You attach the bolt driver bit to [src].")
+ qdel(src)
+ user.put_in_active_hand(b_drill)
+
+/obj/item/weapon/screwdriver/cyborg
+ name = "powered screwdriver"
+ desc = "An electrical screwdriver, designed to be both precise and quick."
+ usesound = 'sound/items/drill_use.ogg'
+ toolspeed = 0.5
//Wirecutters
/obj/item/weapon/wirecutters
name = "wirecutters"
desc = "This cuts wires."
icon = 'icons/obj/tools.dmi'
- icon_state = "cutters"
+ icon_state = null
flags = CONDUCT
slot_flags = SLOT_BELT
force = 6
throw_speed = 3
throw_range = 7
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=80)
origin_tech = "materials=1;engineering=1"
attack_verb = list("pinched", "nipped")
hitsound = 'sound/items/Wirecutter.ogg'
+ usesound = 'sound/items/Wirecutter.ogg'
sharp = 1
edge = 1
+ toolspeed = 1
/obj/item/weapon/wirecutters/New(loc, param_color = null)
..()
- if((!param_color && prob(50)) || param_color == "yellow")
- icon_state = "cutters-y"
- item_state = "cutters_yellow"
+ if(!icon_state)
+ if(!param_color)
+ param_color = pick("yellow", "red")
+ icon_state = "cutters_[param_color]"
-/obj/item/weapon/wirecutters/attack(mob/living/carbon/human/H, mob/user)
- if(istype(H) && H.handcuffed)
- if(istype(H.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
- usr.visible_message("\The [usr] cuts \the [H]'s restraints with \the [src]!",\
- "You cut \the [H]'s restraints with \the [src]!",\
- "You hear cable being cut.")
- H.handcuffed = null
- if(H.buckled && H.buckled.buckle_requires_restraints)
- H.buckled.unbuckle_mob()
- H.update_handcuffed()
- return
+/obj/item/weapon/wirecutters/attack(mob/living/carbon/C, mob/user)
+ if(istype(C) && C.handcuffed && istype(C.handcuffed, /obj/item/weapon/restraints/handcuffs/cable))
+ user.visible_message("[user] cuts [C]'s restraints with [src]!")
+ qdel(C.handcuffed)
+ C.handcuffed = null
+ if(C.buckled && C.buckled.buckle_requires_restraints)
+ C.buckled.unbuckle_mob(C)
+ C.update_handcuffed()
+ return
else
..()
+
+/obj/item/weapon/wirecutters/suicide_act(mob/user)
+ user.visible_message("[user] is cutting at their arteries with [src]! It looks like they're trying to commit suicide!")
+ playsound(loc, usesound, 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/wirecutters/brass
+ name = "brass wirecutters"
+ desc = "A pair of wirecutters made of brass. The handle feels freezing cold to the touch."
+ icon_state = "cutters_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/wirecutters/abductor
+ name = "alien wirecutters"
+ desc = "Extremely sharp wirecutters, made out of a silvery-green metal."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "cutters"
+ toolspeed = 0.1
+ origin_tech = "materials=5;engineering=4;abductor=3"
+
+/obj/item/weapon/wirecutters/cyborg
+ name = "wirecutters"
+ desc = "This cuts wires."
+ toolspeed = 0.5
+
+/obj/item/weapon/wirecutters/power
+ name = "Jaws of Life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a cutting head."
+ icon_state = "jaws_cutter"
+ item_state = "jawsoflife"
+ origin_tech = "materials=2;engineering=2"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ usesound = 'sound/items/jaws_cut.ogg'
+ toolspeed = 0.25
+
+/obj/item/weapon/wirecutters/power/suicide_act(mob/user)
+ user.visible_message("[user] is wrapping \the [src] around their neck. It looks like they're trying to rip their head off!")
+ playsound(loc, 'sound/items/jaws_cut.ogg', 50, 1, -1)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/organ/external/head/head = H.organs_by_name["head"]
+ if(head)
+ head.droplimb(0, DROPLIMB_BLUNT, FALSE, TRUE)
+ playsound(loc,pick('sound/misc/desceration-01.ogg','sound/misc/desceration-02.ogg','sound/misc/desceration-01.ogg') ,50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/wirecutters/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/weapon/crowbar/power/pryjaws = new /obj/item/weapon/crowbar/power
+ to_chat(user, "You attach the pry jaws to [src].")
+ qdel(src)
+ user.put_in_active_hand(pryjaws)
//Welding Tool
/obj/item/weapon/weldingtool
name = "welding tool"
+ desc = "A standard edition welder provided by Nanotrasen."
icon = 'icons/obj/tools.dmi'
icon_state = "welder"
item_state = "welder"
@@ -137,15 +315,21 @@
throwforce = 5
throw_speed = 3
throw_range = 5
- w_class = 2
+ hitsound = "swing_hit"
+ usesound = 'sound/items/Welder.ogg'
+ var/acti_sound = 'sound/items/WelderActivate.ogg'
+ var/deac_sound = 'sound/items/WelderDeactivate.ogg'
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=70, MAT_GLASS=30)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=1;plasmatech=1"
+ toolspeed = 1
var/welding = 0 //Whether or not the welding tool is off(0), on(1) or currently welding(2)
var/status = 1 //Whether the welder is secured or unsecured (able to attach rods to it to make a flamethrower)
var/max_fuel = 20 //The max amount of fuel the welder can hold
var/change_icons = 1
var/can_off_process = 0
var/light_intensity = 2 //how powerful the emitted light is when used.
+ var/nextrefueltick = 0
/obj/item/weapon/weldingtool/New()
..()
@@ -158,7 +342,7 @@
to_chat(user, "It contains [get_fuel()] unit\s of fuel out of [max_fuel].")
/obj/item/weapon/weldingtool/suicide_act(mob/user)
- user.visible_message("[user] welds \his every orifice closed! It looks like \he's trying to commit suicide..")
+ user.visible_message("[user] welds their every orifice closed! It looks like they're trying to commit suicide!")
return (FIRELOSS)
/obj/item/weapon/weldingtool/proc/update_torch()
@@ -179,13 +363,6 @@
icon_state = "[initial(icon_state)][ratio]"
update_torch()
-/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
- if(isscrewdriver(I))
- flamethrower_screwdriver(I, user)
- if(istype(I, /obj/item/stack/rods))
- flamethrower_rods(I, user)
- ..()
-
/obj/item/weapon/weldingtool/process()
switch(welding)
if(0)
@@ -211,6 +388,14 @@
location = get_turf(M)
if(isturf(location))
location.hotspot_expose(700, 5)
+
+/obj/item/weapon/weldingtool/attackby(obj/item/I, mob/user, params)
+ if(isscrewdriver(I))
+ flamethrower_screwdriver(I, user)
+ else if(istype(I, /obj/item/stack/rods))
+ flamethrower_rods(I, user)
+ else
+ ..()
/obj/item/weapon/weldingtool/attack(mob/M, mob/user)
if(ishuman(M))
@@ -233,7 +418,7 @@
if(!do_mob(user, H, 10))
return 1
if(remove_fuel(1,null))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, usesound, 50, 1)
S.heal_damage(15,0,0,1)
user.visible_message("\The [user] patches some dents on \the [M]'s [S.name] with \the [src].")
else if(S.open != 2)
@@ -250,10 +435,13 @@
/obj/item/weapon/weldingtool/afterattack(atom/O, mob/user, proximity)
if(!proximity)
return
+
if(welding)
remove_fuel(1)
var/turf/location = get_turf(user)
location.hotspot_expose(700, 50, 1)
+ if(get_fuel() <= 0)
+ set_light(0)
if(isliving(O))
var/mob/living/L = O
@@ -262,7 +450,10 @@
log_game("[key_name(user)] set [key_name(L)] on fire")
/obj/item/weapon/weldingtool/attack_self(mob/user)
- toggle(user)
+ switched_on(user)
+ if(welding)
+ set_light(light_intensity)
+
update_icon()
//Returns the amount of fuel in the welder
@@ -272,17 +463,17 @@
//Removes fuel from the welding tool. If a mob is passed, it will try to flash the mob's eyes. This should probably be renamed to use()
/obj/item/weapon/weldingtool/proc/remove_fuel(amount = 1, mob/living/M = null)
if(!welding || !check_fuel())
- return 0
+ return FALSE
if(get_fuel() >= amount)
reagents.remove_reagent("fuel", amount)
check_fuel()
if(M)
M.flash_eyes(light_intensity)
- return 1
+ return TRUE
else
if(M)
to_chat(M, "\blue You need more welding fuel to complete this task.")
- return 0
+ return FALSE
//Returns whether or not the welding tool is currently on.
/obj/item/weapon/weldingtool/proc/isOn()
@@ -291,43 +482,48 @@
//Turns off the welder if there is no more fuel (does this really need to be its own proc?)
/obj/item/weapon/weldingtool/proc/check_fuel(mob/user)
if(get_fuel() <= 0 && welding)
- toggle(user, 1)
+ switched_on(user)
update_icon()
//mob icon update
if(ismob(loc))
var/mob/M = loc
M.update_inv_r_hand(0)
M.update_inv_l_hand(0)
-
return 0
return 1
-//Toggles the welder off and on
-/obj/item/weapon/weldingtool/proc/toggle(mob/user, message = 0)
+//Switches the welder on
+/obj/item/weapon/weldingtool/proc/switched_on(mob/user)
if(!status)
- to_chat(user, "[src] can't be turned on while unsecured!")
+ to_chat(user, "span class='warning'>[src] can't be turned on while unsecured!")
return
welding = !welding
if(welding)
if(get_fuel() >= 1)
to_chat(user, "You switch [src] on.")
+ playsound(loc, acti_sound, 50, 1)
force = 15
damtype = "fire"
hitsound = 'sound/items/welder.ogg'
update_icon()
- processing_objects |= src
+ processing_objects.Add(src)
else
to_chat(user, "You need more fuel!")
- welding = 0
+ switched_off(user)
else
- if(!message)
- to_chat(user, "You switch [src] off.")
- else
- visible_message("[src] shuts off!")
- force = 3
- damtype = "brute"
- hitsound = "swing_hit"
- update_icon()
+ to_chat(user, "You switch [src] off.")
+ playsound(loc, deac_sound, 50, 1)
+ switched_off(user)
+
+//Switches the welder off
+/obj/item/weapon/weldingtool/proc/switched_off(mob/user)
+ welding = 0
+ set_light(0)
+
+ force = 3
+ damtype = "brute"
+ hitsound = "swing_hit"
+ update_icon()
/obj/item/weapon/weldingtool/proc/flamethrower_screwdriver(obj/item/I, mob/user)
if(welding)
@@ -354,7 +550,6 @@
user.put_in_hands(F)
else
to_chat(user, "You need one rod to start building a flamethrower!")
- return
/obj/item/weapon/weldingtool/largetank
name = "Industrial Welding Tool"
@@ -362,9 +557,12 @@
icon_state = "indwelder"
max_fuel = 40
materials = list(MAT_METAL=70, MAT_GLASS=60)
- origin_tech = "engineering=2"
+ origin_tech = "engineering=2;plasmatech=2"
/obj/item/weapon/weldingtool/largetank/cyborg
+ name = "integrated welding tool"
+ desc = "An advanced welder designed to be used in robotic systems."
+ toolspeed = 0.5
/obj/item/weapon/weldingtool/largetank/flamethrower_screwdriver()
return
@@ -374,12 +572,28 @@
desc = "A miniature welder used during emergencies."
icon_state = "miniwelder"
max_fuel = 10
- w_class = 1
+ w_class = WEIGHT_CLASS_TINY
materials = list(MAT_METAL=30, MAT_GLASS=10)
change_icons = 0
/obj/item/weapon/weldingtool/mini/flamethrower_screwdriver()
return
+
+/obj/item/weapon/weldingtool/abductor
+ name = "alien welding tool"
+ desc = "An alien welding tool. Whatever fuel it uses, it never runs out."
+ icon = 'icons/obj/abductor.dmi'
+ icon_state = "welder"
+ toolspeed = 0.1
+ light_intensity = 0
+ change_icons = 0
+ origin_tech = "plasmatech=5;engineering=5;abductor=3"
+ can_off_process = 1
+
+/obj/item/weapon/weldingtool/abductor/process()
+ if(get_fuel() <= max_fuel)
+ reagents.add_reagent("fuel", 1)
+ ..()
/obj/item/weapon/weldingtool/hugetank
name = "Upgraded Welding Tool"
@@ -387,9 +601,8 @@
icon_state = "upindwelder"
item_state = "upindwelder"
max_fuel = 80
- w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=3"
+ origin_tech = "engineering=3;plasmatech=2"
/obj/item/weapon/weldingtool/experimental
name = "Experimental Welding Tool"
@@ -397,25 +610,25 @@
icon_state = "exwelder"
item_state = "exwelder"
max_fuel = 40
- w_class = 3
materials = list(MAT_METAL=70, MAT_GLASS=120)
- origin_tech = "engineering=4;plasmatech=3"
+ origin_tech = "materials=4;engineering=4;bluespace=3;plasmatech=4"
change_icons = 0
can_off_process = 1
light_intensity = 1
+ toolspeed = 0.5
var/last_gen = 0
+
+/obj/item/weapon/weldingtool/experimental/brass
+ name = "brass welding tool"
+ desc = "A brass welder that seems to constantly refuel itself. It is faintly warm to the touch."
+ icon_state = "brasswelder"
+ item_state = "brasswelder"
-/obj/item/weapon/weldingtool/experimental/proc/fuel_gen()
- if(!welding && !last_gen)
- last_gen = 1
- reagents.add_reagent("fuel",1)
- spawn(10)
- last_gen = 0
-
-/obj/item/weapon/weldingtool/experimental/process()
+obj/item/weapon/weldingtool/experimental/process()
..()
- if(reagents.total_volume < max_fuel)
- fuel_gen()
+ if(get_fuel() < max_fuel && nextrefueltick < world.time)
+ nextrefueltick = world.time + 10
+ reagents.add_reagent("fuel", 1)
//Crowbar
/obj/item/weapon/crowbar
@@ -423,37 +636,89 @@
desc = "A small crowbar. This handy tool is useful for lots of things, such as prying floor tiles or opening unpowered doors."
icon = 'icons/obj/tools.dmi'
icon_state = "crowbar"
+ item_state = "crowbar"
+ usesound = 'sound/items/Crowbar.ogg'
flags = CONDUCT
slot_flags = SLOT_BELT
force = 5
throwforce = 7
item_state = "crowbar"
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
materials = list(MAT_METAL=50)
- origin_tech = "engineering=1"
+ origin_tech = "engineering=1;combat=1"
attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked")
+ toolspeed = 1
/obj/item/weapon/crowbar/red
- icon_state = "red_crowbar"
- item_state = "crowbar_red"
+ icon_state = "crowbar_red"
+ force = 8
+
+/obj/item/weapon/crowbar/brass
+ name = "brass crowbar"
+ desc = "A brass crowbar. It feels faintly warm to the touch."
+ icon_state = "crowbar_brass"
+ toolspeed = 0.5
+
+/obj/item/weapon/crowbar/abductor
+ name = "alien crowbar"
+ desc = "A hard-light crowbar. It appears to pry by itself, without any effort required."
+ icon = 'icons/obj/abductor.dmi'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
+ icon_state = "crowbar"
+ toolspeed = 0.1
+ origin_tech = "combat=4;engineering=4;abductor=3"
/obj/item/weapon/crowbar/large
name = "crowbar"
desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big."
force = 12
- w_class = 3
+ w_class = WEIGHT_CLASS_NORMAL
throw_speed = 3
throw_range = 3
materials = list(MAT_METAL=70)
icon_state = "crowbar_large"
+ item_state = "crowbar"
+ toolspeed = 0.5
+
+/obj/item/weapon/crowbar/cyborg
+ name = "hydraulic crowbar"
+ desc = "A hydraulic prying tool, compact but powerful. Designed to replace crowbar in construction cyborgs."
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 10
+ toolspeed = 0.5
+/obj/item/weapon/crowbar/power
+ name = "Jaws of Life"
+ desc = "A set of jaws of life, the magic of science has managed to fit it down into a device small enough to fit in a tool belt. It's fitted with a prying head"
+ icon_state = "jaws_pry"
+ item_state = "jawsoflife"
+ materials = list(MAT_METAL=150,MAT_SILVER=50,MAT_TITANIUM=25)
+ origin_tech = "materials=2;engineering=2"
+ usesound = 'sound/items/jaws_pry.ogg'
+ force = 15
+ toolspeed = 0.25
+ var/airlock_open_time = 100 // Time required to open powered airlocks
+
+/obj/item/weapon/crowbar/power/suicide_act(mob/user)
+ user.visible_message("[user] is putting their head in [src], it looks like they're trying to commit suicide!")
+ playsound(loc, 'sound/items/jaws_pry.ogg', 50, 1, -1)
+ return (BRUTELOSS)
+
+/obj/item/weapon/crowbar/power/attack_self(mob/user)
+ playsound(get_turf(user), 'sound/items/change_jaws.ogg', 50, 1)
+ var/obj/item/weapon/wirecutters/power/cutjaws = new /obj/item/weapon/wirecutters/power
+ to_chat(user, "You attach the cutting jaws to [src].")
+ qdel(src)
+ user.put_in_active_hand(cutjaws)
+
+// Conversion kit
/obj/item/weapon/conversion_kit
name = "\improper Revolver Conversion Kit"
desc = "A professional conversion kit used to convert any knock off revolver into the real deal capable of shooting lethal .357 rounds without the possibility of catastrophic failure"
icon = 'icons/obj/weapons.dmi'
icon_state = "kit"
flags = CONDUCT
- w_class = 2
+ w_class = WEIGHT_CLASS_SMALL
origin_tech = "combat=2"
var/open = 0
@@ -466,5 +731,5 @@
/obj/item/weapon/conversion_kit/attack_self(mob/user)
open = !open
- to_chat(user, "\blue You [open?"open" : "close"] the conversion kit.")
+ to_chat(user, "You [open ? "open" : "close"] the conversion kit.")
update_icon()
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 5c66759dc52..3086afd5ad4 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -169,6 +169,7 @@
force_wielded = 24
attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut")
hitsound = 'sound/weapons/bladeslice.ogg'
+ usesound = 'sound/items/Crowbar.ogg'
/obj/item/weapon/twohanded/fireaxe/update_icon() //Currently only here to fuck with the on-mob icons.
icon_state = "fireaxe[wielded]"
diff --git a/code/game/objects/items/weapons/whetstone.dm b/code/game/objects/items/weapons/whetstone.dm
index d19c411899f..d498d4c75e8 100644
--- a/code/game/objects/items/weapons/whetstone.dm
+++ b/code/game/objects/items/weapons/whetstone.dm
@@ -4,6 +4,7 @@
icon_state = "whetstone"
desc = "A block of stone used to sharpen things."
w_class = 2
+ usesound = 'sound/items/Screwdriver.ogg'
var/used = 0
var/increment = 4
var/max = 30
@@ -43,7 +44,7 @@
I.force = Clamp(I.force + increment, 0, max)
I.throwforce = Clamp(I.throwforce + increment, 0, max)
I.name = "[prefix] [I.name]"
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), usesound, 50, 1)
name = "worn out [name]"
desc = "[desc] At least, it used to."
used = 1
@@ -54,7 +55,7 @@
var/datum/unarmed_attack/attack = H.species.unarmed
if(istype(attack, /datum/unarmed_attack/claws))
H.visible_message("[H] sharpens \his claws on the [src]!", "You sharpen your claws on the [src].")
- playsound(get_turf(H), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(H), usesound, 50, 1)
/obj/item/weapon/whetstone/super
name = "super whetstone block"
diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm
index 70b3e3c1d67..116204d599f 100644
--- a/code/game/objects/structures.dm
+++ b/code/game/objects/structures.dm
@@ -85,7 +85,7 @@
usr.visible_message("[user] starts climbing onto \the [src]!")
climber = user
- if(!do_after(user,50, target = src))
+ if(!do_after(user, 50, target = src))
climber = null
return
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index e213c555c43..4b3a5d6896c 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -13,7 +13,7 @@
var/lastbang
var/cutting_tool = /obj/item/weapon/weldingtool
var/sound = 'sound/machines/click.ogg'
- var/cutting_sound = 'sound/items/Welder.ogg'
+ var/cutting_sound
var/storage_capacity = 30 //This is so that someone can't pack hundreds of items in a locker/crate then open it in a populated area to crash clients.
var/material_drop = /obj/item/stack/sheet/metal
var/material_drop_amount = 2
@@ -22,7 +22,7 @@
..()
spawn(1)
if(!opened) // if closed, any item at the crate's loc is put in the contents
- for(var/obj/item/I in src.loc)
+ for(var/obj/item/I in loc)
if(I.density || I.anchored || I == src) continue
I.forceMove(src)
@@ -39,7 +39,7 @@
return (!density)
/obj/structure/closet/proc/can_open()
- if(src.welded)
+ if(welded)
return 0
return 1
@@ -59,46 +59,46 @@
throwing = 0
/obj/structure/closet/proc/open()
- if(src.opened)
+ if(opened)
return 0
- if(!src.can_open())
+ if(!can_open())
return 0
- src.dump_contents()
+ dump_contents()
- src.icon_state = src.icon_opened
- src.opened = 1
+ icon_state = icon_opened
+ opened = 1
if(sound)
- playsound(src.loc, src.sound, 15, 1, -3)
+ playsound(loc, sound, 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 0
return 1
/obj/structure/closet/proc/close()
- if(!src.opened)
+ if(!opened)
return 0
- if(!src.can_close())
+ if(!can_close())
return 0
var/itemcount = 0
//Cham Projector Exception
- for(var/obj/effect/dummy/chameleon/AD in src.loc)
+ for(var/obj/effect/dummy/chameleon/AD in loc)
if(itemcount >= storage_capacity)
break
AD.forceMove(src)
itemcount++
- for(var/obj/item/I in src.loc)
+ for(var/obj/item/I in loc)
if(itemcount >= storage_capacity)
break
if(!I.anchored)
I.forceMove(src)
itemcount++
- for(var/mob/M in src.loc)
+ for(var/mob/M in loc)
if(itemcount >= storage_capacity)
break
if(istype (M, /mob/dead/observer))
@@ -109,37 +109,37 @@
M.forceMove(src)
itemcount++
- src.icon_state = src.icon_closed
- src.opened = 0
+ icon_state = icon_closed
+ opened = 0
if(sound)
- playsound(src.loc, src.sound, 15, 1, -3)
+ playsound(loc, sound, 15, 1, -3)
else
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
density = 1
return 1
-/obj/structure/closet/proc/toggle(mob/user as mob)
- if(!(src.opened ? src.close() : src.open()))
+/obj/structure/closet/proc/toggle(mob/user)
+ if(!(opened ? close() : open()))
to_chat(user, "It won't budge!")
// this should probably use dump_contents()
/obj/structure/closet/ex_act(severity)
switch(severity)
if(1)
- for(var/atom/movable/A as mob|obj in src)//pulls everything out of the locker and hits it with an explosion
- A.forceMove(src.loc)
+ for(var/atom/movable/A in src)//pulls everything out of the locker and hits it with an explosion
+ A.forceMove(loc)
A.ex_act(severity++)
qdel(src)
if(2)
if(prob(50))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
new /obj/item/stack/sheet/metal(loc)
qdel(src)
if(3)
if(prob(5))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
A.ex_act(severity++)
new /obj/item/stack/sheet/metal(loc)
@@ -150,32 +150,32 @@
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
health -= Proj.damage
if(health <= 0)
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
-/obj/structure/closet/attack_animal(mob/living/simple_animal/user as mob)
+/obj/structure/closet/attack_animal(mob/living/simple_animal/user)
if(user.environment_smash)
user.do_attack_animation(src)
visible_message("\red [user] destroys the [src]. ")
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
// this should probably use dump_contents()
/obj/structure/closet/blob_act()
if(prob(75))
- for(var/atom/movable/A as mob|obj in src)
+ for(var/atom/movable/A in src)
A.forceMove(loc)
qdel(src)
-/obj/structure/closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
- if(istype(W, /obj/item/weapon/rcs) && !src.opened)
+/obj/structure/closet/attackby(obj/item/weapon/W, mob/user, params)
+ if(istype(W, /obj/item/weapon/rcs) && !opened)
if(user in contents) //to prevent self-teleporting.
return
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
- if(!is_level_reachable(src.z))
+ if(!is_level_reachable(z))
to_chat(user, "The rapid-crate-sender can't locate any telepads!")
return
if(E.mode == 0)
@@ -193,10 +193,10 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "\blue Teleporting [name]...")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -215,10 +215,10 @@
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
- to_chat(user, "\blue Teleporting [src.name]...")
+ playsound(E.loc, E.usesound, 50, 1)
+ to_chat(user, "\blue Teleporting [name]...")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50, E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -237,9 +237,9 @@
to_chat(user, "Out of charges.")
return
- if(src.opened)
+ if(opened)
if(istype(W, /obj/item/weapon/grab))
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
+ MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
if(istype(W,/obj/item/tk_grab))
return 0
if(istype(W, cutting_tool))
@@ -248,11 +248,11 @@
if(!WT.remove_fuel(0, user))
return
to_chat(user, "You begin cutting \the [src] apart...")
- playsound(loc, cutting_sound, 40, 1)
- if(do_after(user, 40, 1, target = src))
+ playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 40, 1)
+ if(do_after(user, 40 * WT.toolspeed, 1, target = src))
if(!opened || !WT.isOn())
return
- playsound(loc, cutting_sound, 50, 1)
+ playsound(loc, cutting_sound ? cutting_sound : WT.usesound, 50, 1)
visible_message("[user] slices apart \the [src].",
"You cut \the [src] apart with \the [WT].",
"You hear welding.")
@@ -276,14 +276,14 @@
if(!WT.remove_fuel(0,user))
to_chat(user, "You need more welding fuel to complete this task.")
return
- src.welded = !src.welded
- src.update_icon()
+ welded = !welded
+ update_icon()
for(var/mob/M in viewers(src))
M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "You hear welding.", 2)
else
- src.attack_hand(user)
+ attack_hand(user)
-/obj/structure/closet/MouseDrop_T(atom/movable/O as mob|obj, mob/user as mob)
+/obj/structure/closet/MouseDrop_T(atom/movable/O, mob/user)
..()
if(istype(O, /obj/screen)) //fix for HUD elements making their way into the world -Pete
return
@@ -297,24 +297,24 @@
return
if(!istype(user.loc, /turf)) // are you in a container/closet/pod/etc?
return
- if(!src.opened)
+ if(!opened)
return
if(istype(O, /obj/structure/closet))
return
- step_towards(O, src.loc)
+ step_towards(O, loc)
if(user != O)
user.visible_message("[user] stuffs [O] into [src]!", "You stuff [O] into [src]!")
- src.add_fingerprint(user)
+ add_fingerprint(user)
/obj/structure/closet/attack_ai(mob/user)
- if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) //Robots can open/close it, but not the AI
+ if(isrobot(user) && Adjacent(user)) //Robots can open/close it, but not the AI
attack_hand(user)
-/obj/structure/closet/relaymove(mob/user as mob)
- if(user.stat || !isturf(src.loc))
+/obj/structure/closet/relaymove(mob/user)
+ if(user.stat || !isturf(loc))
return
- if(!src.open())
+ if(!open())
to_chat(user, "It won't budge!")
if(!lastbang)
lastbang = 1
@@ -323,14 +323,18 @@
spawn(30)
lastbang = 0
-/obj/structure/closet/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- src.toggle(user)
+/obj/structure/closet/attack_hand(mob/user)
+ add_fingerprint(user)
+ toggle(user)
+
+/obj/structure/closet/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
// tk grab then use on self
-/obj/structure/closet/attack_self_tk(mob/user as mob)
- src.add_fingerprint(user)
- if(!src.toggle())
+/obj/structure/closet/attack_self_tk(mob/user)
+ add_fingerprint(user)
+ if(!toggle())
to_chat(usr, "It won't budge!")
/obj/structure/closet/verb/verb_toggleopen()
@@ -338,12 +342,12 @@
set category = null
set name = "Toggle Open"
- if(!usr.canmove || usr.stat || usr.restrained())
+ if(usr.incapacitated())
return
if(ishuman(usr))
- src.add_fingerprint(usr)
- src.toggle(usr)
+ add_fingerprint(usr)
+ toggle(usr)
else
to_chat(usr, "This mob type can't use this verb.")
@@ -399,8 +403,8 @@
to_chat(usr, "You successfully break out!")
for(var/mob/O in viewers(L.loc))
O.show_message("\the [usr] successfully broke out of \the [src]!", 1)
- if(istype(src.loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
- var/obj/structure/bigDelivery/BD = src.loc
+ if(istype(loc, /obj/structure/bigDelivery)) //nullspace ect.. read the comment above
+ var/obj/structure/bigDelivery/BD = loc
BD.attack_hand(usr)
open()
diff --git a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
index 715d16f9ebd..61cb2f654da 100644
--- a/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/fireaxe.dm
@@ -25,7 +25,7 @@
if(istype(O, /obj/item/device/multitool))
to_chat(user, "\red Resetting circuitry...")
playsound(user, 'sound/machines/lockreset.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
src.locked = 0
to_chat(user, " You disable the locking modules.")
update_icon()
@@ -89,7 +89,7 @@
src.locked = 1
to_chat(user, "\blue You re-enable the locking modules.")
playsound(user, 'sound/machines/lockenable.ogg', 50, 1)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
src.locked = 1
to_chat(user, " You re-enable the locking modules.")
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index a008e3843e9..395b3b47cce 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -87,11 +87,14 @@
icon_off = "fridge1"
req_access = list(access_heads_vault)
-
- New()
- ..()
- dispense_cash(6700, src)
-
+/obj/structure/closet/secure_closet/freezer/money/New()
+ ..()
+ for(var/i in 1 to 3)
+ new /obj/item/stack/spacecash/c1000(src)
+ for(var/i in 1 to 5)
+ new /obj/item/stack/spacecash/c500(src)
+ for(var/i in 1 to 6)
+ new /obj/item/stack/spacecash/c200(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index db589c027e6..cf7c2eec052 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -19,14 +19,14 @@
/obj/structure/closet/secure_closet/can_open()
if(!..())
return 0
- if(src.locked)
+ if(locked)
return 0
return ..()
/obj/structure/closet/secure_closet/close()
if(..())
if(broken)
- icon_state = src.icon_off
+ icon_state = icon_off
return 1
else
return 0
@@ -36,29 +36,29 @@
O.emp_act(severity)
if(!broken)
if(prob(50/severity))
- src.locked = !src.locked
- src.update_icon()
+ locked = !locked
+ update_icon()
if(prob(20/severity) && !opened)
if(!locked)
open()
else
- src.req_access = list()
- src.req_access += pick(get_all_accesses())
+ req_access = list()
+ req_access += pick(get_all_accesses())
..()
-/obj/structure/closet/secure_closet/proc/togglelock(mob/user as mob)
- if(src.opened)
+/obj/structure/closet/secure_closet/proc/togglelock(mob/user)
+ if(opened)
to_chat(user, "Close the locker first.")
return
- if(src.broken)
+ if(broken)
to_chat(user, "The locker appears to be broken.")
return
if(user.loc == src)
to_chat(user, "You can't reach the lock from inside.")
return
- if(src.allowed(user))
- src.locked = !src.locked
- playsound(src.loc, 'sound/machines/click.ogg', 15, 1, -3)
+ if(allowed(user))
+ locked = !locked
+ playsound(loc, 'sound/machines/click.ogg', 15, 1, -3)
for(var/mob/O in viewers(user, 3))
if((O.client && !( O.blinded )))
to_chat(O, "The locker has been [locked ? null : "un"]locked by [user].")
@@ -66,14 +66,14 @@
else
to_chat(user, "Access Denied")
-/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/secure_closet/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/rcs))
return ..()
- if(src.opened)
+ if(opened)
if(istype(W, /obj/item/weapon/grab))
- if(src.large)
- src.MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
+ if(large)
+ MouseDrop_T(W:affecting, user) //act like they were dragged onto the closet
else
to_chat(user, "The locker is too small to stuff [W:affecting] into!")
if(isrobot(user))
@@ -88,7 +88,7 @@
else
togglelock(user)
-/obj/structure/closet/secure_closet/emag_act(user as mob)
+/obj/structure/closet/secure_closet/emag_act(mob/user)
if(!broken)
broken = 1
locked = 0
@@ -97,24 +97,24 @@
flick(icon_broken, src)
to_chat(user, "You unlock \the [src].")
-/obj/structure/closet/secure_closet/attack_hand(mob/user as mob)
- src.add_fingerprint(user)
- if(src.locked)
- src.togglelock(user)
+/obj/structure/closet/secure_closet/attack_hand(mob/user)
+ add_fingerprint(user)
+ if(locked)
+ togglelock(user)
else
- src.toggle(user)
+ toggle(user)
/obj/structure/closet/secure_closet/verb/verb_togglelock()
set src in oview(1) // One square distance
set category = "Object"
set name = "Toggle Lock"
- if(!usr.canmove || usr.stat || usr.restrained()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
+ if(usr.incapacitated()) // Don't use it if you're not able to! Checks for stuns, ghost and restrain
return
if(ishuman(usr))
- src.add_fingerprint(usr)
- src.togglelock(usr)
+ add_fingerprint(usr)
+ togglelock(usr)
else
to_chat(usr, "This mob type can't use this verb.")
@@ -170,7 +170,7 @@
to_chat(usr, "\red You successfully break out!")
for(var/mob/O in viewers(L.loc))
O.show_message("\the [usr] successfully broke out of \the [src]!", 1)
- if(istype(src.loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
- var/obj/structure/bigDelivery/BD = src.loc
+ if(istype(loc, /obj/structure/bigDelivery)) //Do this to prevent contents from being opened into nullspace (read: bluespace)
+ var/obj/structure/bigDelivery/BD = loc
BD.attack_hand(usr)
open()
diff --git a/code/game/objects/structures/crates_lockers/closets/syndicate.dm b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
index e4aa901436e..26bd0d88759 100644
--- a/code/game/objects/structures/crates_lockers/closets/syndicate.dm
+++ b/code/game/objects/structures/crates_lockers/closets/syndicate.dm
@@ -23,9 +23,9 @@
/obj/structure/closet/syndicate/suits/New()
..()
- new /obj/item/clothing/head/helmet/space/rig/syndi(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/syndi(src)
new /obj/item/clothing/mask/gas/syndicate(src)
- new /obj/item/clothing/suit/space/rig/syndi(src)
+ new /obj/item/clothing/suit/space/hardsuit/syndi(src)
new /obj/item/weapon/tank/jetpack/oxygen/harness(src)
/obj/structure/closet/syndicate/nuclear
diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm
index 23f5330e48a..c7e76fe08d4 100644
--- a/code/game/objects/structures/crates_lockers/crates.dm
+++ b/code/game/objects/structures/crates_lockers/crates.dm
@@ -80,7 +80,7 @@
src.opened = 0
return 1
-/obj/structure/closet/crate/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/crate/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/rcs) && !src.opened)
var/obj/item/weapon/rcs/E = W
if(E.rcell && (E.rcell.charge >= E.chargecost))
@@ -102,10 +102,10 @@
L[tmpname] = R
var/desc = input("Please select a telepad.", "RCS") in L
E.pad = L[desc]
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "\blue Teleporting [src.name]...")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -120,10 +120,10 @@
E.rand_x = rand(50,200)
E.rand_y = rand(50,200)
var/L = locate(E.rand_x, E.rand_y, 6)
- playsound(E.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(E.loc, E.usesound, 50, 1)
to_chat(user, "\blue Teleporting [src.name]...")
E.teleporting = 1
- if(!do_after(user, 50, target = src))
+ if(!do_after(user, 50 * E.toolspeed, target = src))
E.teleporting = 0
return
E.teleporting = 0
@@ -166,7 +166,7 @@
else if(istype(W, /obj/item/weapon/wirecutters))
if(rigged)
to_chat(user, "You cut away the wiring.")
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
rigged = 0
return
else return attack_hand(user)
@@ -191,7 +191,7 @@
else
return
-/obj/structure/closet/crate/attack_hand(mob/user as mob)
+/obj/structure/closet/crate/attack_hand(mob/user)
if(manifest)
to_chat(user, "You tear the manifest off of the crate.")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1)
@@ -250,7 +250,7 @@
/obj/structure/closet/crate/secure/can_open()
return !locked
-/obj/structure/closet/crate/secure/proc/togglelock(mob/user as mob)
+/obj/structure/closet/crate/secure/proc/togglelock(mob/user)
if(src.opened)
to_chat(user, "Close the crate first.")
return
@@ -280,7 +280,7 @@
else
to_chat(usr, "This mob type can't use this verb.")
-/obj/structure/closet/crate/secure/attack_hand(mob/user as mob)
+/obj/structure/closet/crate/secure/attack_hand(mob/user)
if(manifest)
to_chat(user, "You tear the manifest off of the crate.")
playsound(src.loc, 'sound/items/poster_ripped.ogg', 75, 1)
@@ -296,7 +296,7 @@
src.toggle(user)
-/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/obj/structure/closet/crate/secure/attackby(obj/item/weapon/W, mob/user, params)
if(is_type_in_list(W, list(/obj/item/stack/packageWrap, /obj/item/stack/cable_coil, /obj/item/device/radio/electropack, /obj/item/weapon/wirecutters,/obj/item/weapon/rcs)))
return ..()
if((istype(W, /obj/item/weapon/card/emag) || istype(W, /obj/item/weapon/melee/energy/blade)))
@@ -307,7 +307,7 @@
return
return ..()
-/obj/structure/closet/crate/secure/emag_act(user as mob)
+/obj/structure/closet/crate/secure/emag_act(mob/user)
if(locked)
overlays += sparks
spawn(6) overlays -= sparks //Tried lots of stuff but nothing works right. so i have to use this *sadface*
diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm
index 30e7031db2f..2ced72cbcfe 100644
--- a/code/game/objects/structures/displaycase.dm
+++ b/code/game/objects/structures/displaycase.dm
@@ -33,14 +33,14 @@ var/global/list/captain_display_cases = list()
circuit.forceMove(src)
state++
to_chat(user, "You add the airlock electronics to the frame.")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src),W.usesound, 50, 1)
if(istype(W, /obj/item/weapon/crowbar))
new /obj/machinery/constructable_frame/machine_frame(T)
var/obj/item/stack/sheet/glass/G = new /obj/item/stack/sheet/glass(T)
G.amount = 5
qdel(src)
to_chat(user, "You pry the glass out of the frame.")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
return
if(DISPLAYCASE_FRAME_SCREWDRIVER)
@@ -54,7 +54,7 @@ var/global/list/captain_display_cases = list()
C.req_one_access = null
if(isprox(sensor))
C.burglar_alarm = 1
- playsound(get_turf(src), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
qdel(src)
return
if(istype(W, /obj/item/weapon/crowbar))
@@ -65,13 +65,13 @@ var/global/list/captain_display_cases = list()
sensor = null
state--
to_chat(user, "You pry the electronics out of the frame.")
- playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(get_turf(src), W.usesound, 50, 1)
if(isprox(W) && !isprox(sensor))
user.drop_item()
sensor = W
sensor.forceMove(src)
to_chat(user, "You add the proximity sensor to the frame.")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
if(pstate != state)
pstate = state
@@ -227,7 +227,7 @@ var/global/list/captain_display_cases = list()
"You pry \the [src] apart.", \
"You hear something pop.")
var/turf/T = get_turf(src)
- playsound(T, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(T, W.usesound, 50, 1)
dump()
var/obj/item/weapon/airlock_electronics/C = circuit
if(!C)
diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm
index dc7152bbd5f..ec9fd4968b9 100644
--- a/code/game/objects/structures/door_assembly.dm
+++ b/code/game/objects/structures/door_assembly.dm
@@ -166,10 +166,10 @@
if(istype(W, /obj/item/weapon/weldingtool) && ( (istext(glass)) || (glass == 1) || (!anchored) ))
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0, user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
if(istext(glass))
user.visible_message("[user] welds the [glass] plating off the airlock assembly.", "You start to weld the [glass] plating off the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue You welded the [glass] plating off!")
var/M = text2path("/obj/item/stack/sheet/mineral/[glass]")
@@ -177,14 +177,14 @@
glass = 0
else if(glass == 1)
user.visible_message("[user] welds the glass panel out of the airlock assembly.", "You start to weld the glass panel out of the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue You welded the glass panel out!")
new /obj/item/stack/sheet/rglass(src.loc)
glass = 0
else if(!anchored)
user.visible_message("[user] dissassembles the airlock assembly.", "You start to dissassemble the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue You dissasembled the airlock assembly!")
new /obj/item/stack/sheet/metal(src.loc, 4)
@@ -194,13 +194,13 @@
return
else if(istype(W, /obj/item/weapon/wrench) && state == 0)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
if(anchored)
user.visible_message("[user] unsecures the airlock assembly from the floor.", "You start to unsecure the airlock assembly from the floor.")
else
user.visible_message("[user] secures the airlock assembly to the floor.", "You start to secure the airlock assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You [anchored? "un" : ""]secured the airlock assembly!")
anchored = !anchored
@@ -208,29 +208,29 @@
else if(istype(W, /obj/item/stack/cable_coil) && state == 0 && anchored )
var/obj/item/stack/cable_coil/coil = W
user.visible_message("[user] wires the airlock assembly.", "You start to wire the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * coil.toolspeed, target = src))
if(!src) return
coil.use(1)
src.state = 1
to_chat(user, "\blue You wire the Airlock!")
else if(istype(W, /obj/item/weapon/wirecutters) && state == 1 )
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You cut the airlock wires.!")
new/obj/item/stack/cable_coil(src.loc, 1)
src.state = 0
else if(istype(W, /obj/item/weapon/airlock_electronics) && state == 1 && W:icon_state != "door_electronics_smoked")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
user.drop_item()
W.loc = src
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You installed the airlock electronics!")
src.state = 2
@@ -240,10 +240,10 @@
W.loc = src.loc
else if(istype(W, /obj/item/weapon/crowbar) && state == 2 )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to install electronics into the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You removed the airlock electronics!")
src.state = 1
@@ -261,27 +261,27 @@
if(S)
if(S.amount>=1)
if(istype(S, /obj/item/stack/sheet/rglass))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, S.usesound, 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * S.toolspeed, target = src))
to_chat(user, "\blue You installed reinforced glass windows into the airlock assembly!")
S.use(1)
glass = 1
else if(istype(S, /obj/item/stack/sheet/mineral) && S.sheettype)
var/M = S.sheettype
if(S.amount>=2)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, S.usesound, 100, 1)
user.visible_message("[user] adds [S.name] to the airlock assembly.", "You start to install [S.name] into the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * S.toolspeed, target = src))
to_chat(user, "\blue You installed [M] plating into the airlock assembly!")
S.use(2)
glass = "[M]"
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 )
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now finishing the airlock.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You finish the airlock!")
var/path
diff --git a/code/game/objects/structures/electricchair.dm b/code/game/objects/structures/electricchair.dm
index 7719f9b547d..2995bda23c3 100644
--- a/code/game/objects/structures/electricchair.dm
+++ b/code/game/objects/structures/electricchair.dm
@@ -24,7 +24,7 @@
/obj/structure/stool/bed/chair/e_chair/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
var/obj/structure/stool/bed/chair/C = new /obj/structure/stool/bed/chair(loc)
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
C.dir = dir
part.loc = loc
part.master = null
diff --git a/code/game/objects/structures/engicart.dm b/code/game/objects/structures/engicart.dm
index 742664b68b0..594139f8d70 100644
--- a/code/game/objects/structures/engicart.dm
+++ b/code/game/objects/structures/engicart.dm
@@ -81,14 +81,14 @@
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters.", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters.", \
diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm
index a10d5add7fb..57909ebc6d7 100644
--- a/code/game/objects/structures/false_walls.dm
+++ b/code/game/objects/structures/false_walls.dm
@@ -38,7 +38,14 @@
/obj/structure/falsewall/CanAtmosPass(turf/T)
return !density
+/obj/structure/falsewall/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
+
/obj/structure/falsewall/attack_hand(mob/user)
+ toggle(user)
+
+/obj/structure/falsewall/proc/toggle(mob/user)
if(opening)
return
diff --git a/code/game/objects/structures/foodcart.dm b/code/game/objects/structures/foodcart.dm
index de103cc5d57..614f4dc27aa 100644
--- a/code/game/objects/structures/foodcart.dm
+++ b/code/game/objects/structures/foodcart.dm
@@ -56,14 +56,14 @@
to_chat(user, fail_msg)
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters.", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters.", \
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 6051bbebef6..e770bef2a69 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -32,25 +32,26 @@
/obj/structure/girder/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench) && state == 0)
if(anchored && !istype(src,/obj/structure/girder/displaced))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now disassembling the girder")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You dissasembled the girder!")
refundMetal(metalUsed)
qdel(src)
else if(!anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now securing the girder")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
to_chat(user, "\blue You secured the girder!")
new/obj/structure/girder( src.loc )
qdel(src)
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "\blue Now slicing apart the girder")
- if(do_after(user,30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
if(!src) return
+ playsound(loc, W.usesound, 100, 1)
to_chat(user, "\blue You slice apart the girder!")
refundMetal(metalUsed)
qdel(src)
@@ -61,32 +62,32 @@
qdel(src)
else if(istype(W, /obj/item/weapon/pickaxe/drill/jackhammer))
- playsound(src.loc, 'sound/weapons/sonic_jackhammer.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You Disintegrate the girder!")
refundMetal(metalUsed)
qdel(src)
else if(istype(W, /obj/item/weapon/screwdriver) && state == 2 && istype(src,/obj/structure/girder/reinforced))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now unsecuring support struts")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You unsecured the support struts!")
state = 1
else if(istype(W, /obj/item/weapon/wirecutters) && istype(src,/obj/structure/girder/reinforced) && state == 1)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now removing support struts")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You removed the support struts!")
new/obj/structure/girder( src.loc )
qdel(src)
else if(istype(W, /obj/item/weapon/crowbar) && state == 0 && anchored )
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "\blue Now dislodging the girder")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src) return
to_chat(user, "\blue You dislodged the girder!")
new/obj/structure/girder/displaced( src.loc )
@@ -107,7 +108,7 @@
else
if(S.amount < 2) return ..()
to_chat(user, "\blue Now adding plating...")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !S || S.amount < 2) return
S.use(2)
to_chat(user, "\blue You added the plating!")
@@ -240,15 +241,16 @@
/obj/structure/cultgirder/attackby(obj/item/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
to_chat(user, "\blue Now disassembling the girder")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
to_chat(user, "\blue You dissasembled the girder!")
dismantle()
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "\blue Now slicing apart the girder")
- if(do_after(user,30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 100, 1)
to_chat(user, "\blue You slice apart the girder!")
dismantle()
diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm
index 4cb2b20f99e..3d88b9ecc8f 100644
--- a/code/game/objects/structures/grille.dm
+++ b/code/game/objects/structures/grille.dm
@@ -141,7 +141,7 @@
user.changeNext_move(CLICK_CD_MELEE)
if(iswirecutter(W))
if(!shock(user, 100))
- playsound(loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
if(!destroyed)
new /obj/item/stack/rods(loc, 2)
else
@@ -149,7 +149,7 @@
qdel(src)
else if((isscrewdriver(W)) && (istype(loc, /turf/simulated) || anchored))
if(!shock(user, 90))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
anchored = !anchored
user.visible_message("[user] [anchored ? "fastens" : "unfastens"] the grille.", \
"You have [anchored ? "fastened the grille to" : "unfastened the grill from"] the floor.")
@@ -180,7 +180,7 @@
to_chat(user, "There is already a window facing this way there.")
return
to_chat(user, "You start placing the window.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src) return //Grille destroyed while waiting
for(var/obj/structure/window/WINDOW in loc)
if(WINDOW.dir == dir_to_set)//checking this for a 2nd time to check if a window was made while we were waiting.
diff --git a/code/game/objects/structures/janicart.dm b/code/game/objects/structures/janicart.dm
index c5abbad1c96..614af2d4ff4 100644
--- a/code/game/objects/structures/janicart.dm
+++ b/code/game/objects/structures/janicart.dm
@@ -85,20 +85,20 @@
to_chat(user, "[src] can't hold any more signs.")
else if(istype(I, /obj/item/weapon/crowbar))
user.visible_message("[user] begins to empty the contents of [src].")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * I.toolspeed, target = src))
to_chat(usr, "You empty the contents of [src]'s bucket onto the floor.")
reagents.reaction(src.loc)
src.reagents.clear_reagents()
else if(istype(I, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters.", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]'s casters.", \
diff --git a/code/game/objects/structures/kitchen_spike.dm b/code/game/objects/structures/kitchen_spike.dm
index 31ab9c94ca2..043177551ff 100644
--- a/code/game/objects/structures/kitchen_spike.dm
+++ b/code/game/objects/structures/kitchen_spike.dm
@@ -43,8 +43,8 @@
/obj/structure/kitchenspike/attackby(obj/item/weapon/grab/G as obj, mob/user as mob)
if(istype(G, /obj/item/weapon/crowbar))
if(!buckled_mob)
- playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, G.usesound, 100, 1)
+ if(do_after(user, 20 * G.toolspeed, target = src))
to_chat(user, "You pry the spikes out of the frame.")
new /obj/item/stack/rods(loc, 4)
new /obj/structure/kitchenspike_frame(loc)
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index 824759b35cb..7c32823ec17 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -115,7 +115,7 @@
if(istype(W,/obj/item/weapon/pickaxe))
var/obj/item/weapon/pickaxe/digTool = W
to_chat(user, "You start digging the [name].")
- if(do_after(user,digTool.digspeed*hardness, target = src) && src)
+ if(do_after(user,digTool.digspeed * hardness, target = src) && src)
to_chat(user, "You finished digging.")
Dismantle()
else if(istype(W,/obj/item/weapon)) //not sure, can't not just weapons get passed to this proc?
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index be81c338c08..32e8b388778 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -27,6 +27,7 @@
"The tray contains a body that might be responsive."
)
anchored = 1.0
+ var/open_sound = 'sound/items/Deconstruct.ogg'
/obj/structure/morgue/initialize()
. = ..()
@@ -100,11 +101,11 @@
for(var/atom/movable/A as mob|obj in connected.loc)
if(!( A.anchored ))
A.forceMove(src)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
qdel(connected)
connected = null
else
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
connected = new /obj/structure/m_tray( loc )
step(connected, dir)
connected.layer = OBJ_LAYER
@@ -258,6 +259,7 @@
var/cremating = 0
var/id = 1
var/locked = 0
+ var/open_sound = 'sound/items/Deconstruct.ogg'
/obj/structure/crematorium/proc/update()
if(connected)
@@ -305,11 +307,11 @@
for(var/atom/movable/A as mob|obj in connected.loc)
if(!( A.anchored ))
A.forceMove(src)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
qdel(connected)
connected = null
else if(locked == 0)
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, open_sound, 50, 1)
connected = new /obj/structure/c_tray( loc )
step(connected, SOUTH)
connected.layer = OBJ_LAYER
diff --git a/code/game/objects/structures/musician.dm b/code/game/objects/structures/musician.dm
index 9b4059f1d1d..b2a4dfd3299 100644
--- a/code/game/objects/structures/musician.dm
+++ b/code/game/objects/structures/musician.dm
@@ -307,18 +307,18 @@
/obj/structure/piano/attackby(obj/item/O as obj, mob/user as mob, params)
if(istype(O, /obj/item/weapon/wrench))
if(!anchored && !isinspace())
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
to_chat(user, " You begin to tighten \the [src] to the floor...")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] tightens \the [src]'s casters.", \
" You have tightened \the [src]'s casters. Now it can be played again.", \
"You hear ratchet.")
anchored = 1
else if(anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
to_chat(user, " You begin to loosen \the [src]'s casters...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * O.toolspeed, target = src))
user.visible_message( \
"[user] loosens \the [src]'s casters.", \
" You have loosened \the [src]. Now it can be pulled somewhere else.", \
diff --git a/code/game/objects/structures/statues.dm b/code/game/objects/structures/statues.dm
index f62ae7ed342..e1c42feb07c 100644
--- a/code/game/objects/structures/statues.dm
+++ b/code/game/objects/structures/statues.dm
@@ -14,10 +14,10 @@
user.changeNext_move(CLICK_CD_MELEE)
if(iswrench(W))
if(anchored)
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] is loosening the [name]'s bolts.", \
"You are loosening the [name]'s bolts...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc || !anchored)
return
user.visible_message("[user] loosened the [name]'s bolts!", \
@@ -27,10 +27,10 @@
if(!isfloorturf(loc))
user.visible_message("A floor must be present to secure the [name]!")
return
- playsound(loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] is securing the [name]'s bolts...", \
"You are securing the [name]'s bolts...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc || anchored)
return
user.visible_message("[user] has secured the [name]'s bolts.", \
@@ -38,10 +38,10 @@
anchored = 1
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
user.visible_message("[user] is slicing apart the [name]...", \
"You are slicing apart the [name]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc)
return
user.visible_message("[user] slices apart the [name].", \
@@ -58,13 +58,13 @@
qdel(src)
else if(iswelder(W) && !anchored)
- playsound(loc, 'sound/items/Welder.ogg', 40, 1)
+ playsound(loc, W.usesound, 40, 1)
user.visible_message("[user] is slicing apart the [name].", \
"You are slicing apart the [name]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!loc)
return
- playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] slices apart the [name].", \
"You slice apart the [name]!")
Dismantle(TRUE)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
index 301cf1c2053..b2581112ea7 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -32,7 +32,7 @@
return
user.drop_item()
var/obj/structure/stool/bed/chair/e_chair/E = new /obj/structure/stool/bed/chair/e_chair(src.loc)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
E.dir = dir
E.part = SK
SK.loc = E
@@ -99,7 +99,7 @@
/obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
new /obj/item/stack/sheet/wood(get_turf(src))
@@ -161,7 +161,7 @@
/obj/structure/stool/bed/chair/comfy/attackby(obj/item/weapon/W, mob/user, params)
if(iswrench(W))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/metal(get_turf(src))
qdel(src)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
index da69c025bb8..09b92f00ac4 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm
@@ -29,10 +29,9 @@
/obj/structure/stool/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
new /obj/item/stack/sheet/metal(src.loc)
qdel(src)
- return
/obj/structure/stool/MouseDrop(atom/over_object, src_location, over_location, src_control, over_control, params, skip_fucking_stool_shit = 0)
if(skip_fucking_stool_shit)
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index ae9e6b41d05..2d46b2bffb9 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -227,9 +227,9 @@
if(istype(W, /obj/item/weapon/wrench))
user.visible_message("[user] is disassembling \a [src].", "You start disassembling \the [src].")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 50, target = src))
- playsound(loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, 50 * W.toolspeed, target = src))
+ playsound(loc, W.usesound, 50, 1)
destroy()
return
@@ -240,7 +240,7 @@
var/datum/effect/system/spark_spread/spark_system = new /datum/effect/system/spark_spread()
spark_system.set_up(5, 0, src.loc)
spark_system.start()
- playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
playsound(src.loc, "sparks", 50, 1)
for(var/mob/O in viewers(user, 4))
O.show_message("\blue The [src] was sliced apart by [user]!", 1, "\red You hear [src] coming apart.", 2)
@@ -421,10 +421,10 @@
var/obj/item/stack/sheet/glass/G = I
if(G.amount >= 2)
to_chat(user, "You start to add the glass to \the [src].")
- if(do_after(user, 10, target = src))
+ if(do_after(user, 10 * G.toolspeed, target = src))
G.use(2)
to_chat(user, "You add the glass to \the [src].")
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(get_turf(src), G.usesound, 50, 1)
new /obj/structure/table/glass(loc)
qdel(src)
else
@@ -433,9 +433,9 @@
if(iswrench(I))
to_chat(user, "You start to deconstruct \the [src].")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
- if(do_after(user, 10, target = src))
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ playsound(src.loc, I.usesound, 75, 1)
+ if(do_after(user, 10 * I.toolspeed, target = src))
+ playsound(src.loc, I.usesound, 75, 1)
to_chat(user, "You dismantle \the [src].")
new /obj/item/stack/sheet/metal(loc)
new /obj/item/stack/sheet/metal(loc)
@@ -495,15 +495,15 @@
if(WT.remove_fuel(0, user))
if(src.status == 2)
to_chat(user, "\blue Now weakening the reinforced table")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue Table weakened")
src.status = 1
else
to_chat(user, "\blue Now strengthening the reinforced table")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue Table strengthened")
src.status = 2
@@ -586,7 +586,7 @@
/obj/structure/rack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
new /obj/item/weapon/rack_parts( src.loc )
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
qdel(src)
return
if(isrobot(user))
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index 8d0962857f5..fb176ce9dba 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -10,18 +10,16 @@
var/list/oxytanks = list() //sorry for the similar var names
var/list/platanks = list()
-
/obj/structure/dispenser/oxygen
plasmatanks = 0
/obj/structure/dispenser/plasma
oxygentanks = 0
-
/obj/structure/dispenser/New()
+ ..()
update_icon()
-
/obj/structure/dispenser/update_icon()
overlays.Cut()
switch(oxygentanks)
@@ -31,40 +29,51 @@
if(1 to 4) overlays += "plasma-[plasmatanks]"
if(5 to INFINITY) overlays += "plasma-5"
+/obj/structure/dispenser/attack_hand(mob/user)
+ if(..())
+ return 1
+ add_fingerprint(user)
+ ui_interact(user)
-/obj/structure/dispenser/attack_hand(mob/user as mob)
+/obj/structure/dispenser/attack_ghost(mob/user)
+ ui_interact(user)
+
+/obj/structure/dispenser/ui_interact(mob/user, ui_key = "main", datum/nanoui/ui = null, force_open = 1, var/master_ui = null, var/datum/topic_state/state = default_state)
user.set_machine(src)
- var/dat = "[src]
"
- dat += "Oxygen tanks: [oxygentanks] - [oxygentanks ? "Dispense" : "empty"]
"
- dat += "Plasma tanks: [plasmatanks] - [plasmatanks ? "Dispense" : "empty"]"
- user << browse(dat, "window=dispenser")
- onclose(user, "dispenser")
- return
+ ui = nanomanager.try_update_ui(user, src, ui_key, ui, force_open)
+ if(!ui)
+ ui = new(user, src, ui_key, "tank_dispenser.tmpl", name, 275, 100, state = state)
+ ui.open()
+/obj/structure/dispenser/ui_data(user)
+ var/list/data = list()
+ data["o_tanks"] = oxygentanks
+ data["p_tanks"] = plasmatanks
+ return data
-/obj/structure/dispenser/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/structure/dispenser/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/tank/oxygen) || istype(I, /obj/item/weapon/tank/air) || istype(I, /obj/item/weapon/tank/anesthetic))
if(oxygentanks < 10)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
oxytanks.Add(I)
oxygentanks++
+ update_icon()
to_chat(user, "You put [I] in [src].")
else
to_chat(user, "[src] is full.")
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
if(istype(I, /obj/item/weapon/tank/plasma))
if(plasmatanks < 10)
user.drop_item()
- I.loc = src
+ I.forceMove(src)
platanks.Add(I)
plasmatanks++
+ update_icon()
to_chat(user, "You put [I] in [src].")
else
to_chat(user, "[src] is full.")
- updateUsrDialog()
- return
+ nanomanager.update_uis(src)
if(istype(I, /obj/item/weapon/wrench))
if(anchored)
to_chat(user, "You lean down and unwrench [src].")
@@ -72,11 +81,11 @@
else
to_chat(user, "You wrench [src] into place.")
anchored = 1
- return
/obj/structure/dispenser/Topic(href, href_list)
- if(usr.stat || usr.restrained())
- return
+ if(..())
+ return 1
+
if(Adjacent(usr))
usr.set_machine(src)
if(href_list["oxygen"])
@@ -105,7 +114,7 @@
update_icon()
add_fingerprint(usr)
updateUsrDialog()
+ nanomanager.update_uis(src)
else
- usr << browse(null, "window=dispenser")
- return
- return
\ No newline at end of file
+ nanomanager.close_user_uis(usr,src)
+ return 1
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index bbbecf6695d..26d97a52671 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -52,7 +52,7 @@
if(istype(I, /obj/item/weapon/crowbar))
to_chat(user, "You start to [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]...")
playsound(loc, 'sound/effects/stonedoor_openclose.ogg', 50, 1)
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * I.toolspeed, target = src))
user.visible_message("[user] [cistern ? "replaces the lid on the cistern" : "lifts the lid off the cistern"]!", "You [cistern ? "replace the lid on the cistern" : "lift the lid off the cistern"]!", "You hear grinding porcelain.")
cistern = !cistern
update_icon()
diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm
index 4e41daef289..5aa14e66adf 100644
--- a/code/game/objects/structures/windoor_assembly.dm
+++ b/code/game/objects/structures/windoor_assembly.dm
@@ -78,9 +78,9 @@ obj/structure/windoor_assembly/Destroy()
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
user.visible_message("[user] dissassembles the windoor assembly.", "You start to dissassemble the windoor assembly.")
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "You dissasembled the windoor assembly!")
var/obj/item/stack/sheet/rglass/RG = new (get_turf(src), 5)
@@ -98,10 +98,10 @@ obj/structure/windoor_assembly/Destroy()
if(WD.dir == src.dir)
to_chat(user, "There is already a windoor in that location.")
return
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] secures the windoor assembly to the floor.", "You start to secure the windoor assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.anchored)
return
for(var/obj/machinery/door/window/WD in src.loc)
@@ -117,10 +117,10 @@ obj/structure/windoor_assembly/Destroy()
//Unwrenching an unsecure assembly un-anchors it. Step 4 undone
else if(istype(W, /obj/item/weapon/wrench) && anchored)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
user.visible_message("[user] unsecures the windoor assembly to the floor.", "You start to unsecure the windoor assembly to the floor.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !src.anchored)
return
to_chat(user, "You've unsecured the windoor assembly!")
@@ -138,9 +138,10 @@ obj/structure/windoor_assembly/Destroy()
return
to_chat(user, "You start to reinforce the windoor with plasteel.")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40 * P.toolspeed, target = src))
if(!src || secure)
return
+ playsound(loc, P.usesound, 100, 1)
P.use(2)
to_chat(user, "You reinforce the windoor.")
@@ -154,12 +155,13 @@ obj/structure/windoor_assembly/Destroy()
else if(istype(W, /obj/item/stack/cable_coil) && anchored)
user.visible_message("[user] wires the windoor assembly.", "You start to wire the windoor assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !src.anchored || src.state != "01")
return
var/obj/item/stack/cable_coil/CC = W
CC.use(1)
to_chat(user, "You wire the windoor!")
+ playsound(loc, CC.usesound, 100, 1)
src.state = "02"
if(src.secure)
src.name = "secure wired windoor assembly"
@@ -172,10 +174,10 @@ obj/structure/windoor_assembly/Destroy()
//Removing wire from the assembly. Step 5 undone.
if(istype(W, /obj/item/weapon/wirecutters))
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] cuts the wires from the airlock assembly.", "You start to cut the wires from airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.state != "02")
return
@@ -189,12 +191,12 @@ obj/structure/windoor_assembly/Destroy()
//Adding airlock electronics for access. Step 6 complete.
else if(istype(W, /obj/item/weapon/airlock_electronics))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] installs the electronics into the airlock assembly.", "You start to install electronics into the airlock assembly.")
user.drop_item()
W.loc = src
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || src.electronics)
W.loc = src.loc
return
@@ -209,10 +211,10 @@ obj/structure/windoor_assembly/Destroy()
if(!electronics)
return
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to uninstall electronics from the airlock assembly.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(!src || !electronics)
return
to_chat(user, "You've removed the airlock electronics!")
@@ -239,10 +241,10 @@ obj/structure/windoor_assembly/Destroy()
to_chat(usr, "The assembly is missing electronics.")
return
usr << browse(null, "window=windoor_access")
- playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
user.visible_message("[user] pries the windoor into the frame.", "You start prying the windoor into the frame.")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(src.loc && src.electronics)
diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm
index 22331e4f484..ec457101b16 100644
--- a/code/game/objects/structures/window.dm
+++ b/code/game/objects/structures/window.dm
@@ -212,24 +212,24 @@ var/global/wcCommon = pick(list("#379963", "#0d8395", "#58b5c3", "#49e46e", "#8f
if(istype(W, /obj/item/weapon/screwdriver))
if(reinf && state >= 1)
state = 3 - state
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (state == 1 ? "You have unfastened the window from the frame." : "You have fastened the window to the frame."))
else if(reinf && state == 0)
anchored = !anchored
update_nearby_icons()
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? "You have fastened the frame to the floor." : "You have unfastened the frame from the floor."))
else if(!reinf)
anchored = !anchored
update_nearby_icons()
- playsound(loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (anchored ? "You have fastened the window to the floor." : "You have unfastened the window."))
else if(istype(W, /obj/item/weapon/crowbar) && reinf && state <= 1)
state = 1 - state
- playsound(loc, 'sound/items/Crowbar.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
to_chat(user, (state ? "You have pried the window into the frame." : "You have pried the window out of the frame."))
else if(istype(W, /obj/item/weapon/wrench) && !anchored && health > 7) //Disassemble deconstructed window into parts
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
for(var/i=0;iYou unscrew the planks.")
new floor_tile(src)
make_plating()
- playsound(src, 'sound/items/Screwdriver.ogg', 80, 1)
+ playsound(src, C.usesound, 80, 1)
return
/turf/simulated/floor/grass
diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm
index e9770536b73..c5dc58f4f26 100644
--- a/code/game/turfs/simulated/floor/plating.dm
+++ b/code/game/turfs/simulated/floor/plating.dm
@@ -35,10 +35,10 @@
return 1
else
to_chat(user, "You begin reinforcing the floor...")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * C.toolspeed, target = src))
if(R.get_amount() >= 2 && !istype(src, /turf/simulated/floor/engine))
ChangeTurf(/turf/simulated/floor/engine)
- playsound(src, 'sound/items/Deconstruct.ogg', 80, 1)
+ playsound(src, C.usesound, 80, 1)
R.use(2)
to_chat(user, "You reinforce the floor.")
return 1
@@ -59,7 +59,7 @@
if( welder.isOn() && (broken || burnt) )
if(welder.remove_fuel(0,user))
to_chat(user, "You fix some dents on the broken plating.")
- playsound(src, 'sound/items/Welder.ogg', 80, 1)
+ playsound(src, welder.usesound, 80, 1)
icon_state = icon_plating
burnt = 0
broken = 0
@@ -99,8 +99,8 @@
return
if(istype(C, /obj/item/weapon/wrench))
to_chat(user, "You begin removing rods...")
- playsound(src, 'sound/items/Ratchet.ogg', 80, 1)
- if(do_after(user, 30, target = src))
+ playsound(src, C.usesound, 80, 1)
+ if(do_after(user, 30 * C.toolspeed, target = src))
if(!istype(src, /turf/simulated/floor/engine))
return
new /obj/item/stack/rods(src, 2)
@@ -236,7 +236,7 @@
if(istype(T, /turf/simulated/floor/plating/airless/catwalk))
var/turf/simulated/floor/plating/airless/catwalk/CW=T
CW.update_icon(0)
- playsound(src, 'sound/items/Screwdriver.ogg', 80, 1)
+ playsound(src, C.usesound, 80, 1)
/turf/simulated/floor/plating/metalfoam
name = "foamed metal plating"
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index cb7cd8be813..217ae5e9c5b 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -272,7 +272,7 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You burn away the fungi with \the [WT].")
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
+ playsound(src, WT.usesound, 10, 1)
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
rotting = 0
@@ -300,7 +300,7 @@
EB.spark_system.start()
to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!")
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
thermitemelt(user)
return
@@ -317,16 +317,16 @@
if(WT.remove_fuel(0,user))
if(response == "Repair")
to_chat(user, "You start repairing the damage to [src].")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn())
+ playsound(src, WT.usesound, 100, 1)
+ if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You finish repairing the damage to [src].")
take_damage(-damage)
else if(response == "Dismantle")
to_chat(user, "You begin slicing through the outer plating.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 100, target = src) && WT && WT.isOn())
+ if(do_after(user, 100 * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You remove the outer plating.")
dismantle_wall()
@@ -341,9 +341,9 @@
else if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the outer plating.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 * W.toolspeed : 60 * W.toolspeed, target = src))
to_chat(user, "You remove the outer plating.")
dismantle_wall()
visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart.")
@@ -353,7 +353,7 @@
to_chat(user, "You begin to drill though the wall.")
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 120 : 60, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 480 * W.toolspeed : 240 * W.toolspeed, target = src)) // Diamond pickaxe has 0.25 toolspeed, so 120/60
to_chat(user, "Your drill tears though the last of the reinforced plating.")
dismantle_wall()
visible_message("[user] drills through \the [src]!","You hear the grinding of metal.")
@@ -362,8 +362,8 @@
to_chat(user, "You begin to disintegrates the wall.")
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 60 : 30, target = src))
- to_chat(user, "Your jackhammer disintegrate the reinforced plating.")
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 600 * W.toolspeed : 300 * W.toolspeed, target = src)) // Jackhammer has 0.1 toolspeed, so 60/30
+ to_chat(user, "Your sonic jackhammer disintegrate the reinforced plating.")
dismantle_wall()
visible_message("[user] disintegrates \the [src]!","You hear the grinding of metal.")
@@ -374,10 +374,10 @@
to_chat(user, "You stab \the [EB] into the wall and begin to slice it apart.")
playsound(src, "sparks", 50, 1)
- if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 : 70, target = src))
+ if(do_after(user, istype(sheet_type, /obj/item/stack/sheet/mineral/diamond) ? 140 * EB.toolspeed : 70 * EB.toolspeed, target = src))
EB.spark_system.start()
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
dismantle_wall(1)
visible_message("[user] slices apart \the [src]!","You hear metal being sliced apart and sparks flying.")
@@ -400,7 +400,7 @@
"[user] starts drilling a hole in \the [src].", \
"\blue You start drilling a hole in \the [src].", \
"You hear ratchet.")
- if(do_after(user, 80, target = src))
+ if(do_after(user, 80 * W.toolspeed, target = src))
user.visible_message( \
"[user] drills a hole in \the [src] and pushes \a [P] into the void", \
"\blue You have finished drilling in \the [src] and push the [P] into the void.", \
diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm
index 49cfa1ace0f..2cc77fc46b8 100644
--- a/code/game/turfs/simulated/walls_reinforced.dm
+++ b/code/game/turfs/simulated/walls_reinforced.dm
@@ -28,7 +28,7 @@
var/obj/item/weapon/weldingtool/WT = W
if( WT.remove_fuel(0,user) )
to_chat(user, "You burn away the fungi with \the [WT].")
- playsound(src, 'sound/items/Welder.ogg', 10, 1)
+ playsound(src, WT.usesound, 10, 1)
for(var/obj/effect/overlay/wall_rot/WR in src)
qdel(WR)
rotting = 0
@@ -56,7 +56,7 @@
EB.spark_system.start()
to_chat(user, "You slash \the [src] with \the [EB]; the thermite ignites!")
playsound(src, "sparks", 50, 1)
- playsound(src, 'sound/weapons/blade1.ogg', 50, 1)
+ playsound(src, EB.usesound, 50, 1)
thermitemelt(user)
return
@@ -69,8 +69,8 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You start repairing the damage to [src].")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
- if(do_after(user, max(5, damage / 5), target = src) && WT && WT.isOn())
+ playsound(src, WT.usesound, 100, 1)
+ if(do_after(user, max(5, damage / 5) * WT.toolspeed, target = src) && WT && WT.isOn())
to_chat(user, "You finish repairing the damage to [src].")
take_damage(-damage)
return
@@ -83,7 +83,7 @@
switch(d_state)
if(0)
if(istype(W, /obj/item/weapon/wirecutters))
- playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
d_state = 1
update_icon()
new /obj/item/stack/rods(src)
@@ -93,9 +93,9 @@
if(1)
if(istype(W, /obj/item/weapon/screwdriver))
to_chat(user, "You begin removing the support lines.")
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40, target = src) && d_state == 1)
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == 1)
d_state = 2
update_icon()
to_chat(user, "You remove the support lines.")
@@ -117,9 +117,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You begin slicing through the metal cover.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 60, target = src) && d_state == 2)
+ if(do_after(user, 60 * WT.toolspeed, target = src) && d_state == 2)
d_state = 3
update_icon()
to_chat(user, "You press firmly on the cover, dislodging it.")
@@ -130,9 +130,9 @@
if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the metal cover.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40, target = src) && d_state == 2)
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == 2)
d_state = 3
update_icon()
to_chat(user, "You press firmly on the cover, dislodging it.")
@@ -141,9 +141,9 @@
if(3)
if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You struggle to pry off the cover.")
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 100, target = src) && d_state == 3)
+ if(do_after(user, 100 * W.toolspeed, target = src) && d_state == 3)
d_state = 4
update_icon()
to_chat(user, "You pry off the cover.")
@@ -152,9 +152,9 @@
if(4)
if(istype(W, /obj/item/weapon/wrench))
to_chat(user, "You start loosening the anchoring bolts which secure the support rods to their frame.")
- playsound(src, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 40, target = src) && d_state == 4)
+ if(do_after(user, 40 * W.toolspeed, target = src) && d_state == 4)
d_state = 5
update_icon()
to_chat(user, "You remove the bolts anchoring the support rods.")
@@ -165,9 +165,9 @@
var/obj/item/weapon/weldingtool/WT = W
if(WT.remove_fuel(0,user))
to_chat(user, "You begin slicing through the support rods.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, WT.usesound, 100, 1)
- if(do_after(user, 100, target = src) && d_state == 5)
+ if(do_after(user, 100 * WT.toolspeed, target = src) && d_state == 5)
d_state = 6
update_icon()
new /obj/item/stack/rods(src)
@@ -178,9 +178,9 @@
if(istype(W, /obj/item/weapon/gun/energy/plasmacutter))
to_chat(user, "You begin slicing through the support rods.")
- playsound(src, 'sound/items/Welder.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 70, target = src) && d_state == 5)
+ if(do_after(user, 70 * W.toolspeed, target = src) && d_state == 5)
d_state = 6
update_icon()
new /obj/item/stack/rods( src )
@@ -190,9 +190,9 @@
if(6)
if(istype(W, /obj/item/weapon/crowbar))
to_chat(user, "You struggle to pry off the outer sheath.")
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src, W.usesound, 100, 1)
- if(do_after(user, 100, target = src) && d_state == 6)
+ if(do_after(user, 100 * W.toolspeed, target = src) && d_state == 6)
to_chat(user, "You pry off the outer sheath.")
dismantle_wall()
return
@@ -203,14 +203,14 @@
if(istype(W, /obj/item/weapon/pickaxe/drill/diamonddrill))
to_chat(user, "You begin to drill though the wall.")
- if(do_after(user, 200, target = src))
+ if(do_after(user, 800 * W.toolspeed, target = src)) // Diamond drill has 0.25 toolspeed, so 200
to_chat(user, "Your drill tears through the last of the reinforced plating.")
dismantle_wall()
if(istype(W,/obj/item/weapon/pickaxe/drill/jackhammer))
to_chat(user, "You begin to disintegrate the wall.")
- if(do_after(user, 100, target = src))
+ if(do_after(user, 1000 * W.toolspeed, target = src)) // Jackhammer has 0.1 toolspeed, so 100
to_chat(user, "Your sonic jackhammer disintegrates the reinforced plating.")
dismantle_wall()
@@ -220,7 +220,7 @@
to_chat(user, "You begin patching-up the wall with \a [MS].")
- if(do_after(user, max(20 * d_state, 100), target = src) && d_state)
+ if(do_after(user, max(20 * d_state, 100) * MS.toolspeed, target = src) && d_state)
if(!MS.use(1))
to_chat(user, "You don't have enough metal for that!")
return
@@ -238,7 +238,7 @@
return
to_chat(user, "You begin adding an additional layer of coating to the wall with \a [MS].")
- if(do_after(user, 40, target = src) && !d_state)
+ if(do_after(user, 40 * MS.toolspeed, target = src) && !d_state)
if(!MS.use(2))
to_chat(user, "You don't have enough plasteel for that!")
return
@@ -269,7 +269,7 @@
"[user] starts drilling a hole in \the [src].", \
"\blue You start drilling a hole in \the [src]. This is going to take a while.", \
"You hear ratchet.")
- if(do_after(user, 160, target = src))
+ if(do_after(user, 160 * V.toolspeed, target = src))
user.visible_message( \
"[user] drills a hole in \the [src] and pushes \a [P] into the void", \
"\blue You have finished drilling in \the [src] and push the [P] into the void.", \
diff --git a/code/modules/admin/verbs/infiltratorteam_syndicate.dm b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
index 86a899ab847..4e691979507 100644
--- a/code/modules/admin/verbs/infiltratorteam_syndicate.dm
+++ b/code/modules/admin/verbs/infiltratorteam_syndicate.dm
@@ -122,8 +122,8 @@ var/global/sent_syndicate_infiltration_team = 0
syndimgmtmob.update_internals_hud_icon(1)
syndimgmtmob.faction += "syndicate"
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/glasses/thermal(src), slot_glasses)
- syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/rig/syndi/elite, slot_wear_suit)
- syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/rig/syndi/elite, slot_head)
+ syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/suit/space/hardsuit/syndi/elite, slot_wear_suit)
+ syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite, slot_head)
syndimgmtmob.equip_to_slot_or_del(new /obj/item/clothing/mask/gas/syndicate, slot_wear_mask)
var/datum/atom_hud/antag/opshud = huds[ANTAG_HUD_OPS]
opshud.join_hud(syndimgmtmob.mind.current)
diff --git a/code/modules/arcade/arcade_base.dm b/code/modules/arcade/arcade_base.dm
index 3c68c7142f4..b043eb934c9 100644
--- a/code/modules/arcade/arcade_base.dm
+++ b/code/modules/arcade/arcade_base.dm
@@ -61,7 +61,7 @@
/obj/machinery/arcade/attackby(var/obj/item/O as obj, var/mob/user as mob, params)
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
update_icon()
@@ -72,8 +72,8 @@
if(pay_with_card(C))
tokens += 1
return
- else if(istype(O, /obj/item/weapon/spacecash))
- var/obj/item/weapon/spacecash/C = O
+ else if(istype(O, /obj/item/stack/spacecash))
+ var/obj/item/stack/spacecash/C = O
if(pay_with_cash(C, user))
tokens += 1
return
@@ -83,16 +83,12 @@
/obj/machinery/arcade/update_icon()
return
-/obj/machinery/arcade/proc/pay_with_cash(var/obj/item/weapon/spacecash/cashmoney, var/mob/user)
- if(cashmoney.get_total() < token_price)
+/obj/machinery/arcade/proc/pay_with_cash(obj/item/stack/spacecash/cashmoney, mob/user)
+ if(cashmoney.amount < token_price)
to_chat(user, "[bicon(cashmoney)] That is not enough money.")
return 0
visible_message("[usr] inserts a credit chip into [src].")
- var/left = cashmoney.get_total() - token_price
- user.unEquip(cashmoney)
- qdel(cashmoney)
- if(left)
- dispense_cash(left, src.loc, user)
+ cashmoney.use(token_price)
return 1
/obj/machinery/arcade/proc/pay_with_card(var/obj/item/weapon/card/id/I, var/mob/user)
diff --git a/code/modules/arcade/mob_hunt/mob_cards.dm b/code/modules/arcade/mob_hunt/mob_cards.dm
index 16aea7ba55f..0479644ad85 100644
--- a/code/modules/arcade/mob_hunt/mob_cards.dm
+++ b/code/modules/arcade/mob_hunt/mob_cards.dm
@@ -35,7 +35,7 @@
/obj/item/weapon/storage/box/nanomob_booster_pack
name = "Nano-Mob Hunter Trading Card Booster Pack"
desc = "Contains 6 random Nano-Mob Hunter Trading Cards. May contain a holographic card!"
- can_hold = list("/obj/item/weapon/nanomob_card")
+ can_hold = list(/obj/item/weapon/nanomob_card)
/obj/item/weapon/storage/box/nanomob_booster_pack/New()
..()
diff --git a/code/modules/arcade/prize_counter.dm b/code/modules/arcade/prize_counter.dm
index e1636fa4e33..93ffbe7e419 100644
--- a/code/modules/arcade/prize_counter.dm
+++ b/code/modules/arcade/prize_counter.dm
@@ -41,7 +41,7 @@
to_chat(user, "\The [T] seems stuck to your hand!")
return
if(istype(O, /obj/item/weapon/screwdriver) && anchored)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
panel_open = !panel_open
to_chat(user, "You [panel_open ? "open" : "close"] the maintenance panel.")
update_icon()
diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm
index 84e10835215..fbbb4e0cd4b 100644
--- a/code/modules/assembly/assembly.dm
+++ b/code/modules/assembly/assembly.dm
@@ -10,6 +10,8 @@
throw_speed = 3
throw_range = 10
origin_tech = "magnets=1"
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
var/bomb_name = "bomb" // used for naming bombs / mines
diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm
index 4c050e0d4f3..be88df0c4e4 100644
--- a/code/modules/awaymissions/corpse.dm
+++ b/code/modules/awaymissions/corpse.dm
@@ -116,12 +116,12 @@
/obj/effect/landmark/corpse/syndicatecommando
name = "Syndicate Commando"
corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/space/rig/syndi
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
corpseid = 1
@@ -170,10 +170,10 @@
corpseidjob = "Station Engineer"
corpseidaccess = "Station Engineer"
-/obj/effect/landmark/corpse/engineer/rig
- corpsesuit = /obj/item/clothing/suit/space/rig
+/obj/effect/landmark/corpse/engineer/hardsuit
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit
corpsemask = /obj/item/clothing/mask/breath
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit
/obj/effect/landmark/corpse/clown
@@ -255,10 +255,10 @@
corpseidjob = "Shaft Miner"
corpseidaccess = "Shaft Miner"
-/obj/effect/landmark/corpse/miner/rig
- corpsesuit = /obj/item/clothing/suit/space/rig/mining
+/obj/effect/landmark/corpse/miner/hardsuit
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/mining
corpsemask = /obj/item/clothing/mask/breath
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/mining
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/mining
/////////////////Officers//////////////////////
diff --git a/code/modules/client/preference/preferences.dm b/code/modules/client/preference/preferences.dm
index 04d1f470327..a849b2576f4 100644
--- a/code/modules/client/preference/preferences.dm
+++ b/code/modules/client/preference/preferences.dm
@@ -279,7 +279,8 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
dat += "You are banned from using custom names and appearances. \
You can continue to adjust your characters, but you will be randomised once you join the game.\
"
- dat += "Gender: [gender == MALE ? "Male" : "Female"]
"
+ dat += "Gender: [gender == MALE ? "Male" : (gender == FEMALE ? "Female" : "Genderless")]"
+ dat += "
"
dat += "Age: [age]
"
dat += "Body: (®)
"
dat += "Species: [species]
"
@@ -1031,6 +1032,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
/datum/preferences/proc/process_link(mob/user, list/href_list)
if(!user) return
+ var/datum/species/S = all_species[species]
if(href_list["preference"] == "job")
switch(href_list["task"])
if("close")
@@ -1266,9 +1268,9 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
// var/whitelisted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- for(var/S in whitelisted_species)
- if(is_alien_whitelisted(user,S))
- new_species += S
+ for(var/Spec in whitelisted_species)
+ if(is_alien_whitelisted(user,Spec))
+ new_species += Spec
// whitelisted = 1
// if(!whitelisted)
// alert(user, "You cannot change your species as you need to be whitelisted. If you wish to be whitelisted contact an admin in-game, on the forums, or on IRC.")
@@ -1276,8 +1278,10 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
new_species += whitelisted_species
species = input("Please select a species", "Character Generation", null) in new_species
-
+ var/datum/species/NS = all_species[species]
if(prev_species != species)
+ if(NS.has_gender && gender == PLURAL)
+ gender = pick(MALE,FEMALE)
var/datum/robolimb/robohead
if(species == "Machine")
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
@@ -1315,16 +1319,16 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
m_colours["tail"] = "#000000"
// Don't wear another species' underwear!
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(!S || !(species in S.species_allowed))
+ var/datum/sprite_accessory/SA = underwear_list[underwear]
+ if(!SA || !(species in SA.species_allowed))
underwear = random_underwear(gender, species)
- S = undershirt_list[undershirt]
- if(!S || !(species in S.species_allowed))
+ SA = undershirt_list[undershirt]
+ if(!SA || !(species in SA.species_allowed))
undershirt = random_undershirt(gender, species)
- S = socks_list[socks]
- if(!S || !(species in S.species_allowed))
+ SA = socks_list[socks]
+ if(!SA || !(species in SA.species_allowed))
socks = random_socks(gender, species)
//reset skin tone and colour
@@ -1402,7 +1406,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("h_style")
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
- var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
+ var/datum/sprite_accessory/SA = hair_styles_list[hairstyle]
if(hairstyle == "Bald") //Just in case.
valid_hairstyles += hairstyle
@@ -1414,14 +1418,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else
head_model = rlimb_data["head"]
var/datum/robolimb/robohead = all_robolimbs[head_model]
- if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((species in SA.species_allowed) && robohead.is_monitor && ((SA.models_allowed && (robohead.company in SA.models_allowed)) || !SA.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
else
- if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ if(!robohead.is_monitor && ("Human" in SA.species_allowed)) /*If the hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the hairstyle can fit humans, let them use it as a wig. */
valid_hairstyles += hairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(species in S.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
+ if(species in SA.species_allowed) //If the user's head is of a species the hairstyle allows, add it to the list.
valid_hairstyles += hairstyle
var/new_h_style = input(user, "Choose your character's hair style:", "Character Preference") as null|anything in valid_hairstyles
@@ -1609,14 +1613,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("f_style")
var/list/valid_facial_hairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
- var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
+ var/datum/sprite_accessory/SA = facial_hair_styles_list[facialhairstyle]
if(facialhairstyle == "Shaved") //Just in case.
valid_facial_hairstyles += facialhairstyle
continue
- if(gender == MALE && S.gender == FEMALE)
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
if(species == "Machine") //Species that can use prosthetic heads.
var/head_model
@@ -1625,14 +1629,14 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
else
head_model = rlimb_data["head"]
var/datum/robolimb/robohead = all_robolimbs[head_model]
- if((species in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
+ if((species in SA.species_allowed) && robohead.is_monitor && ((SA.models_allowed && (robohead.company in SA.models_allowed)) || !SA.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
valid_facial_hairstyles += facialhairstyle //Give them their facial hairstyles if they do.
else
- if(!robohead.is_monitor && ("Human" in S.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
+ if(!robohead.is_monitor && ("Human" in SA.species_allowed)) /*If the facial hairstyle is not native to the user's species and they're using a head with an ipc-style screen, don't let them access it.
But if the user has a robotic humanoid head and the facial hairstyle can fit humans, let them use it as a wig. */
valid_facial_hairstyles += facialhairstyle
else //If the user is not a species who can have robotic heads, use the default handling.
- if(species in S.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
+ if(species in SA.species_allowed) //If the user's head is of a species the facial hair style allows, add it to the list.
valid_facial_hairstyles += facialhairstyle
var/new_f_style = input(user, "Choose your character's facial-hair style:", "Character Preference") as null|anything in valid_facial_hairstyles
@@ -1642,12 +1646,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("underwear")
var/list/valid_underwear = list()
for(var/underwear in underwear_list)
- var/datum/sprite_accessory/S = underwear_list[underwear]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = underwear_list[underwear]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_underwear[underwear] = underwear_list[underwear]
var/new_underwear = input(user, "Choose your character's underwear:", "Character Preference") as null|anything in valid_underwear
@@ -1657,12 +1661,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("undershirt")
var/list/valid_undershirts = list()
for(var/undershirt in undershirt_list)
- var/datum/sprite_accessory/S = undershirt_list[undershirt]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = undershirt_list[undershirt]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_undershirts[undershirt] = undershirt_list[undershirt]
var/new_undershirt = input(user, "Choose your character's undershirt:", "Character Preference") as null|anything in valid_undershirts
@@ -1673,12 +1677,12 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
if("socks")
var/list/valid_sockstyles = list()
for(var/sockstyle in socks_list)
- var/datum/sprite_accessory/S = socks_list[sockstyle]
- if(gender == MALE && S.gender == FEMALE)
+ var/datum/sprite_accessory/SA = socks_list[sockstyle]
+ if(gender == MALE && SA.gender == FEMALE)
continue
- if(gender == FEMALE && S.gender == MALE)
+ if(gender == FEMALE && SA.gender == MALE)
continue
- if(!(species in S.species_allowed))
+ if(!(species in SA.species_allowed))
continue
valid_sockstyles[sockstyle] = socks_list[sockstyle]
var/new_socks = input(user, "Choose your character's socks:", "Character Preference") as null|anything in valid_sockstyles
@@ -1909,10 +1913,20 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
toggles ^= DONATOR_PUBLIC
if("gender")
- if(gender == MALE)
- gender = FEMALE
+ if(!S.has_gender)
+ var/newgender = input(user, "Choose Gender:") as null|anything in list("Male", "Female", "Genderless")
+ switch(newgender)
+ if("Male")
+ gender = MALE
+ if("Female")
+ gender = FEMALE
+ if("Genderless")
+ gender = PLURAL
else
- gender = MALE
+ if(gender == MALE)
+ gender = FEMALE
+ else
+ gender = MALE
underwear = random_underwear(gender)
if("hear_adminhelps")
@@ -2153,7 +2167,7 @@ var/global/list/special_role_times = list( //minimum age (in days) for accounts
character.backbag = backbag
//Debugging report to track down a bug, which randomly assigned the plural gender to people.
- if(character.gender in list(PLURAL, NEUTER))
+ if(S.has_gender && (character.gender in list(PLURAL, NEUTER)))
if(isliving(src)) //Ghosts get neuter by default
message_admins("[key_name_admin(character)] has spawned with their gender as plural or neuter. Please notify coders.")
character.change_gender(MALE)
diff --git a/code/modules/client/preference/preferences_mysql.dm b/code/modules/client/preference/preferences_mysql.dm
index b4a589f35a5..02d246b4f70 100644
--- a/code/modules/client/preference/preferences_mysql.dm
+++ b/code/modules/client/preference/preferences_mysql.dm
@@ -270,6 +270,7 @@
gear = params2list(query.item[65])
//Sanitize
+ var/datum/species/SP = all_species[species]
metadata = sanitize_text(metadata, initial(metadata))
real_name = reject_bad_name(real_name, 1)
if(isnull(species)) species = "Human"
@@ -278,7 +279,7 @@
if(isnull(speciesprefs)) speciesprefs = initial(speciesprefs)
if(!real_name) real_name = random_name(gender,species)
be_random_name = sanitize_integer(be_random_name, 0, 1, initial(be_random_name))
- gender = sanitize_gender(gender)
+ gender = sanitize_gender(gender, FALSE, !SP.has_gender)
age = sanitize_integer(age, AGE_MIN, AGE_MAX, initial(age))
r_hair = sanitize_integer(r_hair, 0, 255, initial(r_hair))
g_hair = sanitize_integer(g_hair, 0, 255, initial(g_hair))
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index fd8ebf045b6..6c6af907ba5 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -2,7 +2,7 @@
name = "clothing"
burn_state = FLAMMABLE
var/list/species_restricted = null //Only these species can wear this kit.
- var/rig_restrict_helmet = 0 // Stops the user from equipping a rig helmet without attaching it to the suit first.
+ var/hardsuit_restrict_helmet = 0 // Stops the user from equipping a hardsuit helmet without attaching it to the suit first.
var/scan_reagents = 0 //Can the wearer see reagents while it's equipped?
/*
@@ -201,7 +201,7 @@ BLIND // can't see anything
/obj/item/clothing/gloves/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wirecutters))
if(!clipped)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, W>usesound, 100, 1)
user.visible_message("[user] snips the fingertips off [src].","You snip the fingertips off [src].")
clipped = 1
name = "mangled [name]"
@@ -399,7 +399,7 @@ BLIND // can't see anything
if(istype(I, /obj/item/weapon/wirecutters))
if(can_cut_open)
if(!cut_open)
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(src.loc, I.usesound, 100, 1)
user.visible_message("[user] cuts open the toes of [src].","You cut open the toes of [src].")
cut_open = 1
icon_state = "[icon_state]_opentoe"
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 11503b40278..a3a38e3af58 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -78,7 +78,7 @@
if(istype(W, /obj/item/weapon/wirecutters))
if(can_be_cut && icon_state == initial(icon_state))//only if not dyed
to_chat(user, "You snip the fingertips off of [src].")
- playsound(user.loc,'sound/items/Wirecutter.ogg', rand(10,50), 1)
+ playsound(user.loc, W.usesound, rand(10,50), 1)
var/obj/item/clothing/gloves/fingerless/F = new/obj/item/clothing/gloves/fingerless(user.loc)
if(pickpocket)
F.pickpocket = 1
diff --git a/code/modules/clothing/spacesuits/ert.dm b/code/modules/clothing/spacesuits/ert.dm
index 6e484d27ff7..82c4a832c6c 100644
--- a/code/modules/clothing/spacesuits/ert.dm
+++ b/code/modules/clothing/spacesuits/ert.dm
@@ -1,16 +1,16 @@
-/obj/item/clothing/head/helmet/space/rig/ert
+/obj/item/clothing/head/helmet/space/hardsuit/ert
name = "emergency response team helmet"
desc = "A helmet worn by members of the Nanotrasen Emergency Response Team. Armoured and space ready."
- icon_state = "rig0-ert_commander"
+ icon_state = "hardsuit0-ert_commander"
item_state = "helm-command"
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
- rig_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
+ hardsuit_restrict_helmet = 0 // ERT helmets can be taken on and off at will.
var/obj/machinery/camera/camera
var/has_camera = TRUE
strip_delay = 130
-/obj/item/clothing/head/helmet/space/rig/ert/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/ert/attack_self(mob/user)
if(camera || !has_camera)
..(user)
else
@@ -20,11 +20,11 @@
camera.c_tag = user.name
to_chat(user, "User scanned as [camera.c_tag]. Camera activated.")
-/obj/item/clothing/head/helmet/space/rig/ert/examine(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/ert/examine(mob/user)
if(..(user, 1) && has_camera)
to_chat(user, "This helmet has a built-in camera. It's [camera ? "" : "in"]active.")
-/obj/item/clothing/suit/space/rig/ert
+/obj/item/clothing/suit/space/hardsuit/ert
name = "emergency response team suit"
desc = "A suit worn by members of the Nanotrasen Emergency Response Team. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
@@ -39,110 +39,110 @@
strip_delay = 130
//Commander
-/obj/item/clothing/head/helmet/space/rig/ert/commander
+/obj/item/clothing/head/helmet/space/hardsuit/ert/commander
name = "emergency response team commander helmet"
desc = "A helmet worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured and space ready."
- icon_state = "rig0-ert_commander"
+ icon_state = "hardsuit0-ert_commander"
item_state = "helm-command"
item_color = "ert_commander"
-/obj/item/clothing/suit/space/rig/ert/commander
+/obj/item/clothing/suit/space/hardsuit/ert/commander
name = "emergency response team commander suit"
desc = "A suit worn by the commander of a Nanotrasen Emergency Response Team. Has blue highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_commander"
item_state = "suit-command"
//Security
-/obj/item/clothing/head/helmet/space/rig/ert/security
+/obj/item/clothing/head/helmet/space/hardsuit/ert/security
name = "emergency response team security helmet"
desc = "A helmet worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured and space ready."
- icon_state = "rig0-ert_security"
+ icon_state = "hardsuit0-ert_security"
item_state = "syndicate-helm-black-red"
item_color = "ert_security"
-/obj/item/clothing/suit/space/rig/ert/security
+/obj/item/clothing/suit/space/hardsuit/ert/security
name = "emergency response team security suit"
desc = "A suit worn by security members of a Nanotrasen Emergency Response Team. Has red highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_security"
item_state = "syndicate-black-red"
//Engineer
-/obj/item/clothing/head/helmet/space/rig/ert/engineer
+/obj/item/clothing/head/helmet/space/hardsuit/ert/engineer
name = "emergency response team engineer helmet"
desc = "A helmet worn by engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured and space ready."
- icon_state = "rig0-ert_engineer"
+ icon_state = "hardsuit0-ert_engineer"
+ item_state = "helm-orange"
item_color = "ert_engineer"
-/obj/item/clothing/suit/space/rig/ert/engineer
+/obj/item/clothing/suit/space/hardsuit/ert/engineer
name = "emergency response team engineer suit"
desc = "A suit worn by the engineers of a Nanotrasen Emergency Response Team. Has yellow highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_engineer"
+ item_state = "suit-orange"
//Medical
-/obj/item/clothing/head/helmet/space/rig/ert/medical
+/obj/item/clothing/head/helmet/space/hardsuit/ert/medical
name = "emergency response team medical helmet"
desc = "A helmet worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
- icon_state = "rig0-ert_medical"
+ icon_state = "hardsuit0-ert_medical"
item_color = "ert_medical"
-/obj/item/clothing/suit/space/rig/ert/medical
+/obj/item/clothing/suit/space/hardsuit/ert/medical
name = "emergency response team medical suit"
desc = "A suit worn by medical members of a Nanotrasen Emergency Response Team. Has white highlights. Armoured and space ready."
icon_state = "ert_medical"
//Janitor
-/obj/item/clothing/head/helmet/space/rig/ert/janitor
+/obj/item/clothing/head/helmet/space/hardsuit/ert/janitor
name = "emergency response team janitor helmet"
desc = "A helmet worn by janitorial members of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured and space ready."
- icon_state = "rig0-ert_janitor"
+ icon_state = "hardsuit0-ert_janitor"
item_color = "ert_janitor"
-/obj/item/clothing/suit/space/rig/ert/janitor
+/obj/item/clothing/suit/space/hardsuit/ert/janitor
name = "emergency response team janitor suit"
desc = "A suit worn by the janitorial of a Nanotrasen Emergency Response Team. Has purple highlights. Armoured, space ready, and fire resistant."
icon_state = "ert_janitor"
//Paranormal
-/obj/item/clothing/head/helmet/space/rig/ert/paranormal
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal
name = "paranormal response unit helmet"
desc = "A helmet worn by those who deal with paranormal threats for a living."
- icon_state = "rig0-ert_paranormal"
+ icon_state = "hardsuit0-ert_paranormal"
item_color = "ert_paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
sprite_sheets = null
- icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
actions_types = list()
has_camera = 0
-/obj/item/clothing/suit/space/rig/ert/paranormal
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal
name = "paranormal response team suit"
desc = "Powerful wards are built into this hardsuit, protecting the user from all manner of paranormal threats."
- icon_state = "rig-paranormal"
+ icon_state = "hardsuit-paranormal"
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
- icon_override = 'icons/mob/clothing/paranormal_hardsuit.dmi'
actions_types = list()
-/obj/item/clothing/suit/space/rig/ert/paranormal/New()
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/New()
..()
new /obj/item/weapon/nullrod(src)
-/obj/item/clothing/head/helmet/space/rig/ert/paranormal/inquisitor
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor
name = "inquisitor's helmet"
- icon_state = "rig0-inquisitor"
+ icon_state = "hardsuit0-inquisitor"
item_color = "inquisitor"
-
-/obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor
- name = "inquisitor's hardsuit"
- icon_state = "rig-inquisitor"
-/obj/item/clothing/head/helmet/space/rig/ert/paranormal/berserker
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor
+ name = "inquisitor's hardsuit"
+ icon_state = "hardsuit-inquisitor"
+
+/obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker
name = "champion's helmet"
desc = "Peering into the eyes of the helmet is enough to seal damnation."
- icon_state = "rig0-berserker"
- item_color = "berserker"
-
-/obj/item/clothing/suit/space/rig/ert/paranormal/berserker
+ icon_state = "hardsuit0-berserker"
+ item_color = "berserker"
+
+/obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker
name = "champion's hardsuit"
desc = "Voices echo from the hardsuit, driving the user insane."
- icon_state = "rig-berserker"
\ No newline at end of file
+ icon_state = "hardsuit-berserker"
diff --git a/code/modules/clothing/spacesuits/rig.dm b/code/modules/clothing/spacesuits/hardsuit.dm
similarity index 82%
rename from code/modules/clothing/spacesuits/rig.dm
rename to code/modules/clothing/spacesuits/hardsuit.dm
index 1c8bd73c47f..ce6b5ebd410 100644
--- a/code/modules/clothing/spacesuits/rig.dm
+++ b/code/modules/clothing/spacesuits/hardsuit.dm
@@ -1,15 +1,15 @@
-//Regular rig suits
-/obj/item/clothing/head/helmet/space/rig
+//Baseline hardsuits
+/obj/item/clothing/head/helmet/space/hardsuit
name = "hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment."
- icon_state = "rig0-engineering"
+ icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
- rig_restrict_helmet = 1
+ hardsuit_restrict_helmet = 1
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight)
var/brightness_on = 4 //luminosity when on
var/on = 0
- item_color = "engineering" //Determines used sprites: rig[on]-[color] and rig[on]-[color]2 (lying down sprite)
+ item_color = "engineering" //Determines used sprites: hardsuit[on]-[color] and hardsuit[on]-[color]2 (lying down sprite)
actions_types = list(/datum/action/item_action/toggle_helmet_light)
//Species-specific stuff.
@@ -30,18 +30,18 @@
"Vulpkanin" = 'icons/obj/clothing/species/vulpkanin/hats.dmi',
)
-/obj/item/clothing/head/helmet/space/rig/equip_to_best_slot(mob/M)
- if(rig_restrict_helmet)
- to_chat(M, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)") // Stop RIG helmet equipping
+/obj/item/clothing/head/helmet/space/hardsuit/equip_to_best_slot(mob/M)
+ if(hardsuit_restrict_helmet)
+ to_chat(M, "You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)") // Stop hardsuit helmet equipping
return 0
..()
-/obj/item/clothing/head/helmet/space/rig/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/attack_self(mob/user)
toggle_light(user)
-/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/proc/toggle_light(mob/user)
on = !on
- icon_state = "rig[on]-[item_color]"
+ icon_state = "hardsuit[on]-[item_color]"
if(on)
set_light(brightness_on)
@@ -56,14 +56,14 @@
var/datum/action/A = X
A.UpdateButtonIcon()
-/obj/item/clothing/head/helmet/space/rig/item_action_slot_check(slot)
+/obj/item/clothing/head/helmet/space/hardsuit/item_action_slot_check(slot)
if(slot == slot_head)
return 1
-/obj/item/clothing/suit/space/rig
+/obj/item/clothing/suit/space/hardsuit
name = "hardsuit"
desc = "A special space suit for environments that might pose hazards beyond just the vacuum of space. Provides more protection than a standard space suit."
- icon_state = "rig-engineering"
+ icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
@@ -103,7 +103,7 @@
var/list/mounted_devices = null // Holder for the above device.
var/obj/item/active_device = null // Currently deployed device, if any.
-/obj/item/clothing/suit/space/rig/equipped(mob/M)
+/obj/item/clothing/suit/space/hardsuit/equipped(mob/M)
..()
var/mob/living/carbon/human/H = M
@@ -133,7 +133,7 @@
H.equip_to_slot(boots, slot_shoes)
boots.flags |= NODROP
-/obj/item/clothing/suit/space/rig/dropped()
+/obj/item/clothing/suit/space/hardsuit/dropped()
..()
var/mob/living/carbon/human/H
@@ -154,7 +154,7 @@
H.unEquip(boots)
boots.forceMove(src)
-/obj/item/clothing/suit/space/rig/verb/toggle_helmet()
+/obj/item/clothing/suit/space/hardsuit/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
set src in usr
@@ -189,7 +189,7 @@
to_chat(H, "You deploy your hardsuit helmet, sealing you off from the world.")
H.update_inv_head()
-/obj/item/clothing/suit/space/rig/attackby(obj/item/W, mob/user, params)
+/obj/item/clothing/suit/space/hardsuit/attackby(obj/item/W, mob/user, params)
if(!isliving(user))
return
@@ -238,43 +238,43 @@
return ..()
..()
-
-/obj/item/clothing/suit/space/rig/proc/can_modify(mob/living/user)
+
+/obj/item/clothing/suit/space/hardsuit/proc/can_modify(mob/living/user)
if(isliving(loc))
to_chat(user, "You can not modify the hardsuit while it is being worn.")
return 0
-
+
return 1
-//Engineering rig
-/obj/item/clothing/head/helmet/space/rig/engineering
+//Engineering hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/engineering
name = "engineering hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding."
- icon_state = "rig0-engineering"
+ icon_state = "hardsuit0-engineering"
item_state = "eng_helm"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
-/obj/item/clothing/suit/space/rig/engineering
+/obj/item/clothing/suit/space/hardsuit/engineering
name = "engineering hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding."
- icon_state = "rig-engineering"
+ icon_state = "hardsuit-engineering"
item_state = "eng_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 75)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/t_scanner, /obj/item/weapon/rcd)
-//Chief Engineer's rig
-/obj/item/clothing/head/helmet/space/rig/elite
+//Chief Engineer's hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/elite
name = "advanced hardsuit helmet"
desc = "An advanced helmet designed for work in a hazardous, low pressure environment. Shines with a high polish."
- icon_state = "rig0-white"
+ icon_state = "hardsuit0-white"
item_state = "ce_helm"
item_color = "white"
armor = list(melee = 40, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 90)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/rig/elite
- icon_state = "rig-white"
+/obj/item/clothing/suit/space/hardsuit/elite
+ icon_state = "hardsuit-white"
name = "advanced hardsuit"
desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish."
item_state = "ce_hardsuit"
@@ -282,18 +282,18 @@
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
-//Mining rig
-/obj/item/clothing/head/helmet/space/rig/mining
+//Mining hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/mining
name = "mining hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating."
- icon_state = "rig0-mining"
+ icon_state = "hardsuit0-mining"
item_state = "mining_helm"
item_color = "mining"
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE
armor = list(melee = 30, bullet = 5, laser = 10, energy = 5, bomb = 50, bio = 100, rad = 50)
-/obj/item/clothing/suit/space/rig/mining
- icon_state = "rig-mining"
+/obj/item/clothing/suit/space/hardsuit/mining
+ icon_state = "hardsuit-mining"
name = "mining hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating."
item_state = "mining_hardsuit"
@@ -301,11 +301,11 @@
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/storage/bag/ore,/obj/item/weapon/pickaxe)
-//Syndicate rig
-/obj/item/clothing/head/helmet/space/rig/syndi
+//Syndicate hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/syndi
name = "blood-red hardsuit helmet"
desc = "A dual-mode advanced helmet designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
@@ -313,10 +313,10 @@
flags = HEADCOVERSEYES | BLOCKHAIR | HEADCOVERSMOUTH | STOPSPRESSUREDMAGE | THICKMATERIAL
actions_types = list(/datum/action/item_action/toggle_helmet_mode)
-/obj/item/clothing/head/helmet/space/rig/syndi/update_icon()
- icon_state = "rig[on]-[item_color]"
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/update_icon()
+ icon_state = "hardsuit[on]-[item_color]"
-/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
to_chat(user, "You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.")
@@ -343,10 +343,10 @@
var/datum/action/A = X
A.UpdateButtonIcon()
-/obj/item/clothing/suit/space/rig/syndi
+/obj/item/clothing/suit/space/hardsuit/syndi
name = "blood-red hardsuit"
desc = "A dual-mode advanced hardsuit designed for work in special operations. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
w_class = 3
@@ -355,10 +355,10 @@
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword/saber,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
-/obj/item/clothing/suit/space/rig/syndi/update_icon()
- icon_state = "rig[on]-[item_color]"
+/obj/item/clothing/suit/space/hardsuit/syndi/update_icon()
+ icon_state = "hardsuit[on]-[item_color]"
-/obj/item/clothing/suit/space/rig/syndi/attack_self(mob/user)
+/obj/item/clothing/suit/space/hardsuit/syndi/attack_self(mob/user)
on = !on
if(on)
to_chat(user, "You switch your hardsuit to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.")
@@ -387,17 +387,17 @@
A.UpdateButtonIcon()
//Elite Syndie suit
-/obj/item/clothing/head/helmet/space/rig/syndi/elite
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit helmet"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in travel mode. Property of Gorlex Marauders."
- icon_state = "rig0-syndielite"
+ icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = HEAD
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
-/obj/item/clothing/head/helmet/space/rig/syndi/elite/attack_self(mob/user)
+/obj/item/clothing/head/helmet/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit helmet"
@@ -406,17 +406,17 @@
name = "elite syndicate hardsuit helmet (combat)"
desc = "An elite version of the syndicate helmet, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
-/obj/item/clothing/suit/space/rig/syndi/elite
+/obj/item/clothing/suit/space/hardsuit/syndi/elite
name = "elite syndicate hardsuit"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in travel mode."
- icon_state = "rig0-syndielite"
+ icon_state = "hardsuit0-syndielite"
item_color = "syndielite"
armor = list(melee = 60, bullet = 60, laser = 50, energy = 25, bomb = 55, bio = 100, rad = 70)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/syndi/elite/attack_self(mob/user)
+/obj/item/clothing/suit/space/hardsuit/syndi/elite/attack_self(mob/user)
..()
if(on)
name = "elite syndicate hardsuit"
@@ -425,11 +425,11 @@
name = "elite syndicate hardsuit (combat)"
desc = "An elite version of the syndicate hardsuit, with improved armour and fire shielding. It is in combat mode. Property of Gorlex Marauders."
-//Wizard Rig
-/obj/item/clothing/head/helmet/space/rig/wizard
+//Wizard hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/wizard
name = "gem-encrusted hardsuit helmet"
desc = "A bizarre gem-encrusted helmet that radiates magical energies."
- icon_state = "rig0-wiz"
+ icon_state = "hardsuit0-wiz"
item_state = "wiz_helm"
item_color = "wiz"
unacidable = 1 //No longer shall our kind be foiled by lone chemists with spray bottles!
@@ -439,8 +439,8 @@
unacidable = 1
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/wizard
- icon_state = "rig-wiz"
+/obj/item/clothing/suit/space/hardsuit/wizard
+ icon_state = "hardsuit-wiz"
name = "gem-encrusted hardsuit"
desc = "A bizarre gem-encrusted suit that radiates magical energies."
item_state = "wiz_hardsuit"
@@ -453,11 +453,11 @@
unacidable = 1
sprite_sheets = null
-//Medical Rig
-/obj/item/clothing/head/helmet/space/rig/medical
+//Medical hardsuit
+/obj/item/clothing/head/helmet/space/hardsuit/medical
name = "medical hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort, but does not protect the eyes from intense light."
- icon_state = "rig0-medical"
+ icon_state = "hardsuit0-medical"
item_state = "medical_helm"
item_color = "medical"
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
@@ -465,8 +465,8 @@
flash_protect = 0
scan_reagents = 1 //Generally worn by the CMO, so they'd get utility off of seeing reagents
-/obj/item/clothing/suit/space/rig/medical
- icon_state = "rig-medical"
+/obj/item/clothing/suit/space/hardsuit/medical
+ icon_state = "hardsuit-medical"
name = "medical hardsuit"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Built with lightweight materials for extra comfort."
item_state = "medical_hardsuit"
@@ -474,16 +474,16 @@
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 50)
//Security
-/obj/item/clothing/head/helmet/space/rig/security
+/obj/item/clothing/head/helmet/space/hardsuit/security
name = "security hardsuit helmet"
desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
- icon_state = "rig0-sec"
+ icon_state = "hardsuit0-sec"
item_state = "sec_helm"
item_color = "sec"
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
-/obj/item/clothing/suit/space/rig/security
- icon_state = "rig-sec"
+/obj/item/clothing/suit/space/hardsuit/security
+ icon_state = "hardsuit-sec"
name = "security hardsuit"
desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
item_state = "sec_hardsuit"
@@ -491,20 +491,20 @@
allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/melee/baton,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/restraints/handcuffs)
-//Atmospherics Rig (BS12)
-/obj/item/clothing/head/helmet/space/rig/atmos
+//Atmospherics hardsuit (BS12)
+/obj/item/clothing/head/helmet/space/hardsuit/atmos
desc = "A special helmet designed for work in a hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
name = "atmospherics hardsuit helmet"
- icon_state = "rig0-atmos"
+ icon_state = "hardsuit0-atmos"
item_state = "atmos_helm"
item_color = "atmos"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
-/obj/item/clothing/suit/space/rig/atmos
+/obj/item/clothing/suit/space/hardsuit/atmos
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
- icon_state = "rig-atmos"
+ icon_state = "hardsuit-atmos"
name = "atmos hardsuit"
item_state = "atmos_hardsuit"
armor = list(melee = 10, bullet = 5, laser = 10, energy = 5, bomb = 10, bio = 100, rad = 0)
@@ -512,16 +512,16 @@
max_heat_protection_temperature = FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
//Singuloth armor
-/obj/item/clothing/head/helmet/space/rig/singuloth
+/obj/item/clothing/head/helmet/space/hardsuit/singuloth
name = "singuloth knight's helmet"
desc = "This is an adamantium helmet from the chapter of the Singuloth Knights. It shines with a holy aura."
- icon_state = "rig0-singuloth"
+ icon_state = "hardsuit0-singuloth"
item_state = "singuloth_helm"
item_color = "singuloth"
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
-/obj/item/clothing/suit/space/rig/singuloth
- icon_state = "rig-singuloth"
+/obj/item/clothing/suit/space/hardsuit/singuloth
+ icon_state = "hardsuit-singuloth"
name = "singuloth knight's armor"
desc = "This is a ceremonial armor from the chapter of the Singuloth Knights. It's made of pure forged adamantium."
item_state = "singuloth_hardsuit"
@@ -529,17 +529,17 @@
armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 100)
-/obj/item/clothing/head/helmet/space/rig/security/hos
+/obj/item/clothing/head/helmet/space/hardsuit/security/hos
name = "head of security's hardsuit helmet"
desc = "a special bulky helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor."
- icon_state = "rig0-hos"
+ icon_state = "hardsuit0-hos"
item_color = "hos"
armor = list(melee = 45, bullet = 25, laser = 30,energy = 10, bomb = 25, bio = 100, rad = 50)
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/security/hos
- icon_state = "rig-hos"
+/obj/item/clothing/suit/space/hardsuit/security/hos
+ icon_state = "hardsuit-hos"
name = "head of security's hardsuit"
desc = "A special bulky suit that protects against hazardous, low pressure environments. Has an additional layer of armor."
armor = list(melee = 45, bullet = 25, laser = 30, energy = 10, bomb = 25, bio = 100, rad = 50)
@@ -548,10 +548,10 @@
/////////////SHIELDED//////////////////////////////////
-/obj/item/clothing/suit/space/rig/shielded
+/obj/item/clothing/suit/space/hardsuit/shielded
name = "shielded hardsuit"
desc = "A hardsuit with built in energy shielding. Will rapidly recharge when not under fire."
- icon_state = "rig-hos"
+ icon_state = "hardsuit-hos"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank, /obj/item/weapon/gun,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs)
armor = list(melee = 30, bullet = 15, laser = 30, energy = 10, bomb = 10, bio = 100, rad = 50)
var/current_charges = 3
@@ -563,7 +563,7 @@
var/shield_on = "shield-old"
sprite_sheets = null
-/obj/item/clothing/suit/space/rig/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
+/obj/item/clothing/suit/space/hardsuit/shielded/hit_reaction(mob/living/carbon/human/owner, attack_text)
if(current_charges > 0)
var/datum/effect/system/spark_spread/s = new
s.set_up(2, 1, src)
@@ -580,11 +580,11 @@
return 0
-/obj/item/clothing/suit/space/rig/shielded/Destroy()
+/obj/item/clothing/suit/space/hardsuit/shielded/Destroy()
processing_objects.Remove(src)
return ..()
-/obj/item/clothing/suit/space/rig/shielded/process()
+/obj/item/clothing/suit/space/hardsuit/shielded/process()
if(world.time > recharge_cooldown && current_charges < max_charges)
current_charges = Clamp((current_charges + recharge_rate), 0, max_charges)
playsound(loc, 'sound/magic/Charge.ogg', 50, 1)
@@ -598,10 +598,10 @@
//////Syndicate Version
-/obj/item/clothing/suit/space/rig/shielded/syndi
+/obj/item/clothing/suit/space/hardsuit/shielded/syndi
name = "blood-red hardsuit"
desc = "An advanced hardsuit with built in energy shielding."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_hardsuit"
item_color = "syndi"
armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
@@ -616,10 +616,10 @@
"Drask" = 'icons/mob/species/drask/suit.dmi'
)
-/obj/item/clothing/head/helmet/space/rig/shielded/syndi
+/obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi
name = "blood-red hardsuit helmet"
desc = "An advanced hardsuit helmet with built in energy shielding."
- icon_state = "rig1-syndi"
+ icon_state = "hardsuit1-syndi"
item_state = "syndie_helm"
item_color = "syndi"
- armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
\ No newline at end of file
+ armor = list(melee = 40, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
diff --git a/code/modules/clothing/spacesuits/rig/modules/modules.dm b/code/modules/clothing/spacesuits/rig/modules/modules.dm
index e64084a0beb..b527a615c5d 100644
--- a/code/modules/clothing/spacesuits/rig/modules/modules.dm
+++ b/code/modules/clothing/spacesuits/rig/modules/modules.dm
@@ -13,6 +13,8 @@
desc = "It looks pretty sciency."
icon = 'icons/obj/rig_modules.dmi'
icon_state = "module"
+
+ toolspeed = 1
var/damage = 0
var/obj/item/weapon/rig/holder
@@ -73,7 +75,7 @@
to_chat(user, "You start mending the damaged portions of \the [src]...")
- if(!do_after(user,30, target = src) || !W || !src)
+ if(!do_after(user, 30 * W.toolspeed, target = src) || !W || !src)
return
var/obj/item/stack/nanopaste/paste = W
@@ -98,7 +100,7 @@
return
to_chat(user, "You start mending the damaged portions of \the [src]...")
- if(!do_after(user, 30, target = src) || !W || !src)
+ if(!do_after(user, 30 * W.toolspeed, target = src) || !W || !src)
return
damage = 1
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index fbdf5609cae..bf40cf7127e 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -1025,7 +1025,7 @@
if(!can_touch(user, wearer) || !has_emergency_release)
return can_touch(user,wearer)
usr.visible_message("[user] starts activating \the [src] emergency seals release!")
- if(!do_after(user,240, target = wearer))
+ if(!do_after(user, 240, target = wearer))
to_chat(user, "You need to focus on activating the emergency release.")
return 0
usr.visible_message("[user] activated \the [src] emergency seals release!")
diff --git a/code/modules/clothing/spacesuits/rig/rig_attackby.dm b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
index a57c2258b04..01793ef360d 100644
--- a/code/modules/clothing/spacesuits/rig/rig_attackby.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_attackby.dm
@@ -80,7 +80,7 @@
var/obj/item/rig_module/mod = W
to_chat(user, "You begin installing \the [mod] into \the [src].")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
return
if(!user || !W)
return
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index ef20bbd0362..77c486590c1 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -106,7 +106,7 @@
icon_state = "judge"
item_state = "judge"
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS
- allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/spacecash)
+ allowed = list(/obj/item/weapon/storage/fancy/cigarettes,/obj/item/stack/spacecash)
flags_inv = HIDEJUMPSUIT
diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm
index 9482ee7d080..93952434d2a 100644
--- a/code/modules/clothing/under/accessories/accessory.dm
+++ b/code/modules/clothing/under/accessories/accessory.dm
@@ -65,7 +65,7 @@
var/obj/item/clothing/under/U = H.w_uniform
if(istype(U))
user.visible_message("[user] is putting a [src.name] on [H]'s [U.name]!", "You begin to put a [src.name] on [H]'s [U.name]...")
- if(do_after(user,40,target=H) && H.w_uniform == U)
+ if(do_after(user, 40, target=H) && H.w_uniform == U)
user.visible_message("[user] puts a [src.name] on [H]'s [U.name]!", "You finish putting a [src.name] on [H]'s [U.name].")
U.attackby(src, user)
else
diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm
index aea6cf139f3..72fbdbc9b92 100644
--- a/code/modules/clothing/under/accessories/storage.dm
+++ b/code/modules/clothing/under/accessories/storage.dm
@@ -103,8 +103,7 @@
/obj/item/clothing/accessory/storage/knifeharness/New()
..()
hold.max_combined_w_class = 4
- hold.can_hold = list("/obj/item/weapon/hatchet/unathiknife",\
- "/obj/item/weapon/kitchen/knife")
+ hold.can_hold = list(/obj/item/weapon/hatchet/unathiknife, /obj/item/weapon/kitchen/knife)
new /obj/item/weapon/hatchet/unathiknife(hold)
new /obj/item/weapon/hatchet/unathiknife(hold)
\ No newline at end of file
diff --git a/code/modules/computer3/buildandrepair.dm b/code/modules/computer3/buildandrepair.dm
index 2165205e354..94b09c680b6 100644
--- a/code/modules/computer3/buildandrepair.dm
+++ b/code/modules/computer3/buildandrepair.dm
@@ -18,6 +18,8 @@
var/frame_desc = null
var/datum/file/program/OS = new/datum/file/program/ntos
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/machinery/computer3/proc/disassemble(mob/user as mob) // todo
return
@@ -30,6 +32,8 @@
icon = 'icons/obj/stock_parts.dmi'
icon_state = "0"
var/state = 0
+
+ var/remove_sound = 'sound/items/Crowbar.ogg'
var/obj/item/part/computer/circuitboard/circuit = null
var/completed = /obj/machinery/computer
@@ -80,8 +84,8 @@
switch(state)
if(0)
if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "\blue You wrench the frame into place.")
src.anchored = 1
src.state = 1
@@ -90,23 +94,23 @@
if(!WT.remove_fuel(0, user))
to_chat(user, "The welding tool must be on to complete this task.")
return
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
to_chat(user, "\blue You deconstruct the frame.")
new /obj/item/stack/sheet/metal( src.loc, 5 )
qdel(src)
if(1)
if(istype(P, /obj/item/weapon/wrench))
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
to_chat(user, "\blue You unfasten the frame.")
src.anchored = 0
src.state = 0
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
var/obj/item/weapon/circuitboard/B = P
if(B.board_type == "computer")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, B.usesound, 50, 1)
to_chat(user, "\blue You place the circuit board inside the frame.")
src.icon_state = "1"
src.circuit = P
@@ -115,12 +119,12 @@
else
to_chat(user, "\red This frame does not accept circuit boards of this type!")
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You screw the circuit board into place.")
src.state = 2
src.icon_state = "2"
if(istype(P, /obj/item/weapon/crowbar) && circuit)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the circuit board.")
src.state = 1
src.icon_state = "0"
@@ -128,15 +132,15 @@
src.circuit = null
if(2)
if(istype(P, /obj/item/weapon/screwdriver) && circuit)
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You unfasten the circuit board.")
src.state = 1
src.icon_state = "1"
if(istype(P, /obj/item/weapon/crowbar))
if(battery)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(10, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(10 * P.toolspeed, target = src))
battery.loc = loc
to_chat(user, "\blue You remove [battery].")
battery = null
@@ -145,8 +149,8 @@
if(istype(P, /obj/item/weapon/stock_parts/cell))
if(!battery)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(5, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(5 * P.toolspeed, target = src))
battery = P
P.loc = src
to_chat(user, "\blue You insert [battery].")
@@ -156,8 +160,8 @@
if(istype(P, /obj/item/stack/cable_coil))
if(P:amount >= 5)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
if(P)
P:amount -= 5
if(!P:amount) qdel(P)
@@ -169,7 +173,7 @@
if(components.len)
to_chat(user, "There are parts in the way!")
return
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the cables.")
src.state = 2
src.icon_state = "2"
@@ -181,8 +185,8 @@
if(istype(P, /obj/item/stack/sheet/glass))
if(P:amount >= 2)
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, P.usesound, 50, 1)
+ if(do_after(user, 20 * P.toolspeed, target = src))
if(P)
P:use(2)
to_chat(user, "\blue You put in the glass panel.")
@@ -190,13 +194,13 @@
src.icon_state = "4"
if(4)
if(istype(P, /obj/item/weapon/crowbar))
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You remove the glass panel.")
src.state = 3
src.icon_state = "3"
new /obj/item/stack/sheet/glass( src.loc, 2 )
if(istype(P, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, P.usesound, 50, 1)
to_chat(user, "\blue You connect the monitor.")
var/obj/machinery/computer3/B = new src.circuit.build_path ( src.loc, built=1 )
/*if(circuit.powernet) B:powernet = circuit.powernet
@@ -226,8 +230,8 @@
I = input(usr, "Remove which component?","Remove component", null) as null|obj in components
if(I)
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
- if(do_after(usr,25, target = src))
+ playsound(src.loc, remove_sound, 50, 1)
+ if(do_after(usr, 25, target = src))
if(I==hdd)
components -= hdd
hdd.loc = loc
diff --git a/code/modules/computer3/lapvend.dm b/code/modules/computer3/lapvend.dm
index 0eb665f70b2..e77298dc35e 100644
--- a/code/modules/computer3/lapvend.dm
+++ b/code/modules/computer3/lapvend.dm
@@ -61,7 +61,15 @@
..()
-/obj/machinery/lapvend/attack_hand(mob/user as mob)
+/obj/machinery/lapvend/attack_hand(mob/user)
+ if(..())
+ return 1
+ interact(user)
+
+/obj/machinery/lapvend/attack_ghost(mob/user)
+ interact(user)
+
+/obj/machinery/lapvend/interact(mob/user)
user.set_machine(src)
var/vendorname = (src.name) //import the machine's name
var/dat = "[vendorname]
" //display the name, and added a horizontal rule
@@ -133,8 +141,10 @@
/obj/machinery/lapvend/Topic(href, href_list)
- if((usr.contents.Find(src) || (in_range(src, usr) && istype(src.loc, /turf))))
- usr.set_machine(src)
+ if(..())
+ return 1
+
+ usr.set_machine(src)
switch(href_list["choice"])
if("single_add")
cardreader = 1
diff --git a/code/modules/customitems/item_defines.dm b/code/modules/customitems/item_defines.dm
index 98c658c9856..6f51d07ca04 100644
--- a/code/modules/customitems/item_defines.dm
+++ b/code/modules/customitems/item_defines.dm
@@ -26,6 +26,8 @@
var/tattoo_r = 1 // RGB values for the body markings
var/tattoo_g = 1
var/tattoo_b = 1
+ toolspeed = 1
+ usesound = 'sound/items/Welder2.ogg'
/obj/item/device/fluff/tattoo_gun/attack(mob/living/carbon/M as mob, mob/user as mob)
if(user.a_intent == "harm")
@@ -61,7 +63,7 @@
else
user.visible_message("[user] begins to apply a [tattoo_name] [target] with the [src].", "You begin to tattoo [target] with the [src]!")
- if(!do_after(user,30, target = M))
+ if(!do_after(user, 30 * toolspeed, target = M))
return
user.visible_message("[user] finishes the [tattoo_name] on [target].", "You finish the [tattoo_name].")
@@ -69,7 +71,7 @@
target.change_markings(tattoo_icon, "body")
target.change_marking_color(rgb(tattoo_r, tattoo_g, tattoo_b), "body")
- playsound(src.loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(src.loc, usesound, 20, 1)
used = 1
update_icon()
diff --git a/code/modules/detective_work/footprints_and_rag.dm b/code/modules/detective_work/footprints_and_rag.dm
index 64ade59adee..cc93863cc95 100644
--- a/code/modules/detective_work/footprints_and_rag.dm
+++ b/code/modules/detective_work/footprints_and_rag.dm
@@ -25,6 +25,7 @@
volume = 5
can_be_placed_into = null
flags = OPENCONTAINER | NOBLUDGEON
+ var/wipespeed = 30
/obj/item/weapon/reagent_containers/glass/rag/attack(atom/target as obj|turf|area, mob/user as mob , flag)
if(ismob(target) && target.reagents && reagents.total_volume)
@@ -39,7 +40,7 @@
if(!proximity) return
if(istype(A) && src in user)
user.visible_message("[user] starts to wipe down [A] with [src]!")
- if(do_after(user,30, target = A))
+ if(do_after(user, wipespeed, target = A))
user.visible_message("[user] finishes wiping off the [A]!")
A.clean_blood()
return
diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm
index 46c8aaeb560..a1e00546ed4 100644
--- a/code/modules/economy/ATM.dm
+++ b/code/modules/economy/ATM.dm
@@ -63,16 +63,15 @@ log transactions
if(authenticated_account)
var/turf/T = get_turf(src)
- if(istype(T) && locate(/obj/item/weapon/spacecash) in T)
- var/list/cash_found = list()
- for(var/obj/item/weapon/spacecash/S in T)
- cash_found += S
- if(cash_found.len > 0)
+ if(istype(T) && locate(/obj/item/stack/spacecash) in T)
+ var/cash_amount = 0
+ for(var/obj/item/stack/spacecash/S in T)
+ cash_amount += S.amount
+ if(cash_amount)
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
- var/amount = count_cash(cash_found)
- for(var/obj/item/weapon/spacecash/S in cash_found)
- qdel(S)
- authenticated_account.charge(-amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal")
+ for(var/obj/item/stack/spacecash/S in T)
+ S.use(S.amount)
+ authenticated_account.charge(-cash_amount, null, "Credit deposit", terminal_id = machine_id, dest_name = "Terminal")
/obj/machinery/atm/proc/reconnect_database()
for(var/obj/machinery/computer/account_database/DB in machines)
@@ -90,17 +89,17 @@ log transactions
authenticated_account = null
nanomanager.update_uis(src)
else if(authenticated_account)
- if(istype(I, /obj/item/weapon/spacecash))
+ if(istype(I, /obj/item/stack/spacecash))
//consume the money
- var/obj/item/weapon/spacecash/C = I
- authenticated_account.money += C.get_total()
+ var/obj/item/stack/spacecash/C = I
+ authenticated_account.money += C.amount
playsound(loc, pick('sound/items/polaroid1.ogg', 'sound/items/polaroid2.ogg'), 50, 1)
//create a transaction log entry
var/datum/transaction/T = new()
T.target_name = authenticated_account.owner_name
T.purpose = "Credit deposit"
- T.amount = C.get_total()
+ T.amount = C.amount
T.source_terminal = machine_id
T.date = current_date_string
T.time = worldtime2text()
@@ -108,7 +107,7 @@ log transactions
to_chat(user, "You insert [C] into [src].")
nanomanager.update_uis(src)
- qdel(I)
+ C.use(C.amount)
else
..()
@@ -317,7 +316,7 @@ log transactions
//create the most effective combination of notes to make up the requested amount
/obj/machinery/atm/proc/withdraw_arbitrary_sum(arbitrary_sum)
- dispense_cash(arbitrary_sum, get_step(get_turf(src), turn(dir, 180))) // Spawn on the ATM.
+ new /obj/item/stack/spacecash(get_step(get_turf(src), turn(dir, 180)), arbitrary_sum)
//stolen wholesale and then edited a bit from newscasters, which are awesome and by Agouri
/obj/machinery/atm/proc/scan_user(mob/living/carbon/human/H)
diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm
index 6baf7103338..76109d3d981 100644
--- a/code/modules/economy/POS.dm
+++ b/code/modules/economy/POS.dm
@@ -512,7 +512,7 @@ var/const/POS_HEADER = {"
acct.charge(credits_needed,linked_account,"Purchase at POS #[id].")
credits_needed=0
screen=POS_SCREEN_ORDER
- else if(istype(A,/obj/item/weapon/spacecash))
+ else if(istype(A, /obj/item/stack/spacecash))
if(!linked_account)
visible_message("\red The machine buzzes, and flashes \"NO LINKED ACCOUNT\" on the screen.","You hear a buzz.")
flick(src,"pos-error")
@@ -521,8 +521,8 @@ var/const/POS_HEADER = {"
visible_message("\blue The machine buzzes.","\red You hear a buzz.")
flick(src,"pos-error")
return
- var/obj/item/weapon/spacecash/C=A
- credits_held += C.get_total()
+ var/obj/item/stack/spacecash/C = A
+ credits_held += C.amount
if(credits_held >= credits_needed)
visible_message("\blue The machine beeps, and begins printing a receipt","You hear a beep and the sound of paper being shredded.")
PrintReceipt()
@@ -531,9 +531,6 @@ var/const/POS_HEADER = {"
credits_needed=0
screen=POS_SCREEN_ORDER
if(credits_held)
- var/obj/item/weapon/storage/box/B = new(loc)
- dispense_cash(credits_held,B)
- B.name="change"
- B.desc="A box of change."
+ new /obj/item/stack/spacecash(loc, credits_held)
credits_held=0
..()
diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm
index 56d7d374167..98fe9fad27f 100644
--- a/code/modules/events/event_container.dm
+++ b/code/modules/events/event_container.dm
@@ -146,17 +146,17 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Nothing", /datum/event/nothing, 1230),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Appendicitis", /datum/event/spontaneous_appendicitis, 0, list(ASSIGNMENT_MEDICAL = 10), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Carp School", /datum/event/carp_migration, 200, list(ASSIGNMENT_ENGINEER = 10, ASSIGNMENT_SECURITY = 20), 1),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 40, list(ASSIGNMENT_SECURITY = 20)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Rogue Drones", /datum/event/rogue_drone, 0, list(ASSIGNMENT_SECURITY = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Space Vines", /datum/event/spacevine, 250, list(ASSIGNMENT_ENGINEER = 10)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 20)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meaty Ores", /datum/event/dust/meaty, 0, list(ASSIGNMENT_ENGINEER = 30)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meteor Shower", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Meaty Ores", /datum/event/dust/meaty, 0, list(ASSIGNMENT_ENGINEER = 20)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Communication Blackout", /datum/event/communications_blackout, 500, list(ASSIGNMENT_AI = 150, ASSIGNMENT_SECURITY = 120)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Prison Break", /datum/event/prison_break, 0, list(ASSIGNMENT_SECURITY = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Virology Breach", /datum/event/prison_break/virology, 0, list(ASSIGNMENT_MEDICAL = 100)),
//new /datum/event_meta(EVENT_LEVEL_MODERATE, "Xenobiology Breach", /datum/event/prison_break/xenobiology, 0, list(ASSIGNMENT_SCIENCE = 100)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Grid Check", /datum/event/grid_check, 200, list(ASSIGNMENT_ENGINEER = 60)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Electrical Storm", /datum/event/electrical_storm, 250, list(ASSIGNMENT_ENGINEER = 20, ASSIGNMENT_JANITOR = 150)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 0, list(ASSIGNMENT_MEDICAL = 50), 1),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Radiation Storm", /datum/event/radiation_storm, 25, list(ASSIGNMENT_MEDICAL = 50), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Spider Infestation", /datum/event/spider_infestation, 100, list(ASSIGNMENT_SECURITY = 30), 1),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Ion Storm", /datum/event/ion_storm, 0, list(ASSIGNMENT_AI = 50, ASSIGNMENT_CYBORG = 50, ASSIGNMENT_ENGINEER = 15, ASSIGNMENT_SCIENTIST = 5)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Borer Infestation", /datum/event/borer_infestation, 40, list(ASSIGNMENT_SECURITY = 30), 1),
@@ -169,10 +169,10 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Dimensional Tear", /datum/event/tear, 0, list(ASSIGNMENT_SECURITY = 35)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vent Clog", /datum/event/vent_clog, 250),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Wormholes", /datum/event/wormholes, 150),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 100, list(ASSIGNMENT_ENGINEER = 60)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vortex Anomaly", /datum/event/anomaly/anomaly_vortex, 50, list(ASSIGNMENT_ENGINEER = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 50, list(ASSIGNMENT_ENGINEER = 25)),
- new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 50, list(ASSIGNMENT_ENGINEER = 50)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Pyro Anomaly", /datum/event/anomaly/anomaly_pyro, 75, list(ASSIGNMENT_ENGINEER = 60)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Vortex Anomaly", /datum/event/anomaly/anomaly_vortex, 75, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Bluespace Anomaly", /datum/event/anomaly/anomaly_bluespace, 75, list(ASSIGNMENT_ENGINEER = 25)),
+ new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 75, list(ASSIGNMENT_ENGINEER = 50)),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150),
new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = 1),
@@ -187,9 +187,9 @@ var/list/event_last_fired = list()
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Carp Migration", /datum/event/carp_migration, 0, list(ASSIGNMENT_SECURITY = 3), 1),
//new /datum/event_meta(EVENT_LEVEL_MAJOR, "Containment Breach", /datum/event/prison_break/station, 0, list(ASSIGNMENT_ANY = 5)),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Blob", /datum/event/blob, 0, list(ASSIGNMENT_ENGINEER = 30), 1),
- new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 3), 1),
+ new /datum/event_meta(EVENT_LEVEL_MAJOR, "Meteor Wave", /datum/event/meteor_wave, 0, list(ASSIGNMENT_ENGINEER = 5), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Abductor Visit", /datum/event/abductor, 80, is_one_shot = 1),
- new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 30), 1),
+ new /datum/event_meta/alien(EVENT_LEVEL_MAJOR, "Alien Infestation", /datum/event/alien_infestation, 0, list(ASSIGNMENT_SECURITY = 15), 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Traders", /datum/event/traders, 0, is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Terror Spiders", /datum/event/spider_terror, 0, list(ASSIGNMENT_SECURITY = 15), is_one_shot = 1),
new /datum/event_meta(EVENT_LEVEL_MAJOR, "Slaughter Demon", /datum/event/spawn_slaughter, 15, is_one_shot = 1)
diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm
index 005fce56df0..6dc1c6870b2 100644
--- a/code/modules/fish/fishtank.dm
+++ b/code/modules/fish/fishtank.dm
@@ -606,6 +606,7 @@
if(user.a_intent == I_HELP)
if(W.isOn())
if(cur_health < max_health)
+ playsound(loc, W.usesound, 50, 1)
to_chat(usr, "You repair some of the cracks on \the [src].")
cur_health += 20
check_health()
@@ -613,7 +614,7 @@
to_chat(usr, "There is no damage to fix!")
else
if(cur_health < max_health)
- to_chat(usr, "[W.name] must on to repair this damage.")
+ to_chat(usr, "[W.name] must be on to repair this damage.")
else
user.changeNext_move(CLICK_CD_MELEE)
hit(W.force)
@@ -672,8 +673,8 @@
if(istype(O, /obj/item/weapon/wrench))
if(water_level == 0)
to_chat(usr, "Now disassembling [src].")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
- if(do_after(user,50, target = src))
+ playsound(src.loc, O.usesound, 50, 1)
+ if(do_after(user, 50 * O.toolspeed, target = src))
destroy(1)
else
to_chat(usr, "[src] must be empty before you disassemble it!")
diff --git a/code/modules/food_and_drinks/drinks/bottler/bottler.dm b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
index 81974b39c0e..75270faf0e0 100644
--- a/code/modules/food_and_drinks/drinks/bottler/bottler.dm
+++ b/code/modules/food_and_drinks/drinks/bottler/bottler.dm
@@ -41,7 +41,7 @@
/obj/machinery/bottler/attackby(obj/item/O, mob/user, params)
if(iswrench(O)) //This being before the canUnequip check allows borgs to (un)wrench bottlers in case they need move them to fix stuff
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "[src] can now be moved.")
diff --git a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
index baf5e8e98ee..a69b0a718ef 100644
--- a/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
+++ b/code/modules/food_and_drinks/kitchen_machinery/kitchen_machine.dm
@@ -65,7 +65,7 @@
if(exchange_parts(user, O))
return
if(!broken && istype(O, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "\The [src] can now be moved.")
@@ -83,7 +83,7 @@
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] fixes part of \the [src].", \
"You have fixed part of \the [src]." \
@@ -94,7 +94,7 @@
"[user] starts to fix part of \the [src].", \
"You start to fix part of \the [src]." \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] fixes \the [src].", \
"You have fixed \the [src]." \
@@ -112,7 +112,7 @@
"[user] starts to clean \the [src].", \
"You start to clean \the [src]." \
)
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * O.toolspeed, target = src))
user.visible_message( \
"[user] has cleaned \the [src].", \
"You have cleaned \the [src]." \
diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm
index 8cbca85a521..27ae9684f5b 100644
--- a/code/modules/hydroponics/hydroponics.dm
+++ b/code/modules/hydroponics/hydroponics.dm
@@ -874,8 +874,8 @@
if(!anchored && !isinspace())
user.visible_message("[user] begins to wrench [src] into place.", "You begin to wrench [src] in place...")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if (do_after(user, 20, target = src))
+ playsound(loc, O.usesound, 50, 1)
+ if (do_after(user, 20 * O.toolspeed, target = src))
if(anchored)
return
anchored = 1
@@ -884,8 +884,8 @@
else if(anchored)
user.visible_message("[user] begins to unwrench [src].", \
"You begin to unwrench [src]...")
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
- if (do_after(user, 20, target = src))
+ playsound(loc, O.usesound, 50, 1)
+ if (do_after(user, 20 * O.toolspeed, target = src))
if(!anchored)
return
anchored = 0
@@ -894,7 +894,7 @@
else if(iswirecutter(O) && wrenchable)
using_irrigation = !using_irrigation
- playsound(src, 'sound/items/Wirecutter.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
user.visible_message("[user] [using_irrigation ? "" : "dis"]connects [src]'s irrigation hoses.", \
"You [using_irrigation ? "" : "dis"]connect [src]'s irrigation hoses.")
for(var/obj/machinery/hydroponics/h in range(1,src))
@@ -905,11 +905,11 @@
to_chat(user, "[src] doesn't have any plants or weeds!")
return
user.visible_message("[user] starts digging out [src]'s plants...", "You start digging out [src]'s plants...")
- playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
- if(!do_after(user, 50, target = src) || (!myseed && !weedlevel))
+ playsound(src, O.usesound, 50, 1)
+ if(!do_after(user, 25 * O.toolspeed, target = src) || (!myseed && !weedlevel))
return
user.visible_message("[user] digs out the plants in [src]!", "You dig out all of [src]'s plants!")
- playsound(src, 'sound/effects/shovel_dig.ogg', 50, 1)
+ playsound(src, O.usesound, 50, 1)
if(myseed) //Could be that they're just using it as a de-weeder
age = 0
plant_health = 0
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index f2272c97e96..a32b31611cc 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -31,7 +31,7 @@
I.forceMove(src)
update_icon()
-/obj/structure/bookcase/attackby(obj/O as obj, mob/user as mob, params)
+/obj/structure/bookcase/attackby(obj/item/O as obj, mob/user as mob, params)
if(busy) //So that you can't mess with it while deconstructing
return 1
if(is_type_in_list(O, allowed_books))
@@ -51,11 +51,11 @@
else if(istype(O, /obj/item/weapon/wrench))
user.visible_message("[user] starts disassembling \the [src].", \
"You start disassembling \the [src].")
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
busy = 1
- if(do_after(user,50, target = src))
- playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 75, 1)
+ if(do_after(user, 50 * O.toolspeed, target = src))
+ playsound(get_turf(src), O.usesound, 75, 1)
user.visible_message("[user] disassembles \the [src].", \
"You disassemble \the [src].")
busy = 0
@@ -276,7 +276,7 @@
if(carved)
return 1
to_chat(user, "You begin to carve out [title].")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You carve out the pages from [title]! You didn't want to read it anyway.")
carved = 1
return 1
diff --git a/code/modules/mining/equipment_locker.dm b/code/modules/mining/equipment_locker.dm
index 621e2cc80cd..f5176827095 100644
--- a/code/modules/mining/equipment_locker.dm
+++ b/code/modules/mining/equipment_locker.dm
@@ -143,11 +143,14 @@
qdel(O)//No refined type? Purge it.
return
-/obj/machinery/mineral/ore_redemption/attack_hand(user as mob)
+/obj/machinery/mineral/ore_redemption/attack_hand(mob/user)
if(..())
return
interact(user)
+/obj/machinery/mineral/ore_redemption/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/mineral/ore_redemption/interact(mob/user)
user.set_machine(src)
@@ -198,7 +201,8 @@
/obj/machinery/mineral/ore_redemption/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
@@ -215,11 +219,12 @@
var/obj/item/weapon/card/id/I = usr.get_active_hand()
if(istype(I))
if(!usr.drop_item())
- return
+ return 1
I.loc = src
inserted_id = I
else
to_chat(usr, "No valid ID.")
+
if(href_list["release"])
if(check_access(inserted_id) || allowed(usr)) //Check the ID inside, otherwise check the user.
if(!(text2path(href_list["release"]) in stack_list)) return
@@ -234,6 +239,7 @@
stack_list -= text2path(href_list["release"])
else
to_chat(usr, "Required access not found.")
+
if(href_list["plasteel"])
if(check_access(inserted_id) || allowed(usr))
if(!(/obj/item/stack/sheet/metal in stack_list)) return
@@ -250,6 +256,7 @@
unload_mineral(plasteelout)
else
to_chat(usr, "Required access not found.")
+
if(href_list["plasglass"])
if(check_access(inserted_id) || allowed(usr))
if(!(/obj/item/stack/sheet/glass in stack_list)) return
@@ -267,7 +274,6 @@
else
to_chat(usr, "Required access not found.")
updateUsrDialog()
- return
/obj/machinery/mineral/ore_redemption/ex_act(severity, target)
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -343,7 +349,7 @@
new /datum/data/mining_equipment("Lazarus Capsule", /obj/item/device/mobcapsule, 800),
new /datum/data/mining_equipment("Lazarus Capsule belt",/obj/item/weapon/storage/belt/lazarus, 200),
new /datum/data/mining_equipment("Jetpack", /obj/item/weapon/tank/jetpack/carbondioxide/mining, 2000),
- new /datum/data/mining_equipment("Space Cash", /obj/item/weapon/spacecash/c1000, 2000),
+ new /datum/data/mining_equipment("Space Cash", /obj/item/stack/spacecash/c1000, 2000),
new /datum/data/mining_equipment("Diamond Pickaxe", /obj/item/weapon/pickaxe/diamond, 2000),
new /datum/data/mining_equipment("Super Resonator", /obj/item/weapon/resonator/upgraded, 2500),
new /datum/data/mining_equipment("KA White Tracer Rounds", /obj/item/borg/upgrade/modkit/tracer, 100),
@@ -387,13 +393,15 @@
icon_state = initial(icon_state)
else
icon_state = "[initial(icon_state)]-off"
- return
-/obj/machinery/mineral/equipment_vendor/attack_hand(user as mob)
+/obj/machinery/mineral/equipment_vendor/attack_hand(mob/user)
if(..())
return
interact(user)
+/obj/machinery/mineral/equipment_vendor/attack_ghost(mob/user)
+ interact(user)
+
/obj/machinery/mineral/equipment_vendor/interact(mob/user)
user.set_machine(src)
@@ -411,11 +419,11 @@
var/datum/browser/popup = new(user, "miningvendor", "Mining Equipment Vendor", 400, 350)
popup.set_content(dat)
popup.open()
- return
/obj/machinery/mineral/equipment_vendor/Topic(href, href_list)
if(..())
- return
+ return 1
+
if(href_list["choice"])
if(istype(inserted_id))
if(href_list["choice"] == "eject")
@@ -431,19 +439,18 @@
inserted_id = I
else
to_chat(usr, "No valid ID.")
+
if(href_list["purchase"])
if(istype(inserted_id))
var/datum/data/mining_equipment/prize = locate(href_list["purchase"])
- if(!prize || !(prize in prize_list))
+ if(!prize || !(prize in prize_list) || prize.cost > inserted_id.mining_points)
return
- if(prize.cost > inserted_id.mining_points)
- else
- inserted_id.mining_points -= prize.cost
- new prize.equipment_path(src.loc)
- updateUsrDialog()
- return
-/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I as obj, mob/user as mob, params)
+ inserted_id.mining_points -= prize.cost
+ new prize.equipment_path(src.loc)
+ updateUsrDialog()
+
+/obj/machinery/mineral/equipment_vendor/attackby(obj/item/I, mob/user, params)
if(default_deconstruction_screwdriver(user, "mining-open", "mining", I))
updateUsrDialog()
return
@@ -514,7 +521,7 @@
icon_state = "data"
var/points = 500
-/obj/item/weapon/card/mining_point_card/attackby(obj/item/I as obj, mob/user as mob, params)
+/obj/item/weapon/card/mining_point_card/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/card/id))
if(points)
var/obj/item/weapon/card/id/C = I
@@ -543,7 +550,7 @@
throw_range = 5
origin_tech = "bluespace=2"
-/obj/item/device/wormhole_jaunter/attack_self(mob/user as mob)
+/obj/item/device/wormhole_jaunter/attack_self(mob/user)
var/turf/device_turf = get_turf(user)
if(!device_turf||is_teleport_allowed(device_turf.z))
to_chat(user, "You're having difficulties getting the [src.name] to work.")
@@ -624,7 +631,7 @@
spawn(burst_time)
fieldsactive--
-/obj/item/weapon/resonator/attack_self(mob/user as mob)
+/obj/item/weapon/resonator/attack_self(mob/user)
if(burst_time == 50)
burst_time = 30
to_chat(user, "You set the resonator's fields to detonate after 3 seconds.")
@@ -713,7 +720,7 @@
icon_state = "implant"
max_w_class = 3
storage_slots = 2
- can_hold = list("/obj/item/weapon/mining_drone_cube","/obj/item/weapon/weldingtool/hugetank")
+ can_hold = list(/obj/item/weapon/mining_drone_cube, /obj/item/weapon/weldingtool/hugetank)
/obj/item/weapon/storage/box/drone_kit/New()
..()
diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm
index 3910baf10de..6c34b6e0570 100644
--- a/code/modules/mining/lavaland/necropolis_chests.dm
+++ b/code/modules/mining/lavaland/necropolis_chests.dm
@@ -40,8 +40,8 @@
if(10)
new /obj/item/ship_in_a_bottle(src)
if(11)
- new /obj/item/clothing/head/helmet/space/rig/ert/paranormal/berserker(src)
- new /obj/item/clothing/suit/space/rig/ert/paranormal/berserker(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/berserker(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/berserker(src)
if(12)
new /obj/item/weapon/sord(src)
if(13)
@@ -66,7 +66,7 @@
new /obj/item/weapon/grenade/clusterbuster/inferno(src)
if(23)
new /obj/item/weapon/reagent_containers/food/drinks/bottle/holywater/hell(src)
- new /obj/item/clothing/head/helmet/space/rig/ert/paranormal/inquisitor(src)
- new /obj/item/clothing/suit/space/rig/ert/paranormal/inquisitor(src)
+ new /obj/item/clothing/head/helmet/space/hardsuit/ert/paranormal/inquisitor(src)
+ new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src)
if(24)
new /obj/item/weapon/spellbook/oneuse/summonitem(src)
\ No newline at end of file
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index defa8a930ff..395f6842a1f 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -89,6 +89,8 @@
sharp = 1
edge = 1
var/excavation_amount = 100
+ usesound = 'sound/effects/picaxe1.ogg'
+ toolspeed = 1
/obj/item/weapon/pickaxe/proc/playDigSound()
playsound(src, pick(digsound),20,1)
@@ -100,6 +102,16 @@
digspeed = 30 //mines faster than a normal pickaxe, bought from mining vendor
origin_tech = "materials=3;engineering=2"
desc = "A silver-plated pickaxe that mines slightly faster than standard-issue."
+ toolspeed = 0.75
+
+/obj/item/weapon/pickaxe/gold
+ name = "golden pickaxe"
+ icon_state = "gpickaxe"
+ item_state = "gpickaxe"
+ digspeed = 20
+ origin_tech = "materials=4;engineering=2"
+ desc = "A gold-plated pickaxe that mines faster than standard-issue."
+ toolspeed = 0.6
/obj/item/weapon/pickaxe/diamond
name = "diamond-tipped pickaxe"
@@ -108,6 +120,7 @@
digspeed = 20 //mines twice as fast as a normal pickaxe, bought from mining vendor
origin_tech = "materials=4;engineering=3"
desc = "A pickaxe with a diamond pick head. Extremely robust at cracking rock walls and digging up dirt."
+ toolspeed = 0.5
/obj/item/weapon/pickaxe/drill
name = "mining drill"
@@ -116,8 +129,10 @@
digspeed = 25 //available from roundstart, faster than a pickaxe.
digsound = list('sound/weapons/drill.ogg')
hitsound = 'sound/weapons/drill.ogg'
+ usesound = 'sound/weapons/drill.ogg'
origin_tech = "materials=2;powerstorage=3;engineering=2"
desc = "An electric mining drill for the especially scrawny."
+ toolspeed = 0.5
/obj/item/weapon/pickaxe/drill/cyborg
name = "cyborg mining drill"
@@ -130,6 +145,7 @@
digspeed = 10
origin_tech = "materials=6;powerstorage=4;engineering=5"
desc = "Yours is the drill that will pierce the heavens!"
+ toolspeed = 0.25
/obj/item/weapon/pickaxe/diamonddrill/traitor //Pocket-sized traitor diamond drill.
name = "supermatter drill"
@@ -142,6 +158,7 @@
name = "diamond-tipped cyborg mining drill" //To inherit the NODROP flag, and easier to change borg specific drill mechanics.
icon_state = "diamonddrill"
digspeed = 10
+ toolspeed = 0.25
/obj/item/weapon/pickaxe/drill/jackhammer
name = "sonic jackhammer"
@@ -151,23 +168,10 @@
origin_tech = "materials=3;powerstorage=2;engineering=2"
digsound = list('sound/weapons/sonic_jackhammer.ogg')
hitsound = 'sound/weapons/sonic_jackhammer.ogg'
+ usesound = 'sound/weapons/sonic_jackhammer.ogg'
desc = "Cracks rocks with sonic blasts, and doubles as a demolition power tool for smashing walls."
+ toolspeed = 0.1
-/obj/item/weapon/pickaxe/silver
- name = "silver pickaxe"
- icon_state = "spickaxe"
- item_state = "spickaxe"
- digspeed = 30
- origin_tech = "materials=3"
- desc = "This makes no metallurgic sense."
-
-/obj/item/weapon/pickaxe/gold
- name = "golden pickaxe"
- icon_state = "gpickaxe"
- item_state = "gpickaxe"
- digspeed = 20
- origin_tech = "materials=4"
- desc = "This makes no metallurgic sense."
/*****************************Shovel********************************/
/obj/item/weapon/shovel
@@ -184,6 +188,8 @@
materials = list(MAT_METAL=50)
origin_tech = "materials=1;engineering=1"
attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked")
+ usesound = 'sound/effects/shovel_dig.ogg'
+ toolspeed = 1
/obj/item/weapon/shovel/spade
name = "spade"
@@ -193,6 +199,7 @@
force = 5.0
throwforce = 7.0
w_class = 2
+ toolspeed = 2
/**********************Mining car (Crate like thing, not the rail car)**************************/
@@ -393,10 +400,10 @@
/obj/item/device/gps/computer/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles the gps.", \
"You start to disassemble the gps...", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/device/gps(loc)
qdel(src)
return ..()
@@ -471,10 +478,10 @@
/obj/structure/fans/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles the fan.", \
"You start to disassemble the fan...", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
deconstruct()
return ..()
@@ -522,10 +529,10 @@
/obj/structure/tubes/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] disassembles [src].", \
"You start to disassemble [src]...", "You hear clanking and banging noises.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
new /obj/item/stack/rods(loc)
qdel(src)
return ..()
diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm
index 623192ff820..d57f509e13e 100644
--- a/code/modules/mining/mine_turfs.dm
+++ b/code/modules/mining/mine_turfs.dm
@@ -470,14 +470,14 @@ var/global/list/rockTurfEdgeCache = list(
src.gets_dug()
return
-/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
+/turf/simulated/floor/plating/airless/asteroid/attackby(obj/item/weapon/W, mob/user, params)
//note that this proc does not call ..()
if(!W || !user)
return 0
if((istype(W, /obj/item/weapon/shovel)))
- var/turf/T = user.loc
- if(!( istype(T, /turf) ))
+ var/turf/T = get_turf(user)
+ if(!istype(T))
return
if(dug)
@@ -485,17 +485,15 @@ var/global/list/rockTurfEdgeCache = list(
return
to_chat(user, "You start digging...")
-
- sleep(20)
- if((user.loc == T && user.get_active_hand() == W))
+ if(do_after(user, 20 * W.toolspeed, target = src))
to_chat(user, "You dig a hole.")
gets_dug()
return
if((istype(W, /obj/item/weapon/pickaxe)))
var/obj/item/weapon/pickaxe/P = W
- var/turf/T = user.loc
- if(!( istype(T, /turf) ))
+ var/turf/T = get_turf(user)
+ if(!istype(T))
return
if(dug)
@@ -504,8 +502,7 @@ var/global/list/rockTurfEdgeCache = list(
to_chat(user, "You start digging...")
- sleep(P.digspeed)
- if((user.loc == T && user.get_active_hand() == W))
+ if(do_after(user, P.digspeed, target = src))
to_chat(user, "You dig a hole.")
gets_dug()
return
diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm
index 9e4d268281c..2b671317b64 100644
--- a/code/modules/mining/ore.dm
+++ b/code/modules/mining/ore.dm
@@ -192,8 +192,12 @@
quality = 1
return
..()
+
+/obj/item/weapon/twohanded/required/gibtonite/attack_ghost(mob/user)
+ if(wires)
+ wires.Interact(user)
-/obj/item/weapon/twohanded/required/gibtonite/attack_self(user)
+/obj/item/weapon/twohanded/required/gibtonite/attack_self(mob/user)
if(wires)
wires.Interact(user)
else
diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm
index 10bd7c3884f..1621cffbd16 100644
--- a/code/modules/mob/dead/observer/observer.dm
+++ b/code/modules/mob/dead/observer/observer.dm
@@ -657,6 +657,9 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
return TRUE
return FALSE
+
+/mob/dead/observer/incapacitated()
+ return TRUE
//this is a mob verb instead of atom for performance reasons
//see /mob/verb/examinate() in mob.dm for more info
diff --git a/code/modules/mob/living/carbon/human/appearance.dm b/code/modules/mob/living/carbon/human/appearance.dm
index ad1ab28c435..3cedf2d1f3f 100644
--- a/code/modules/mob/living/carbon/human/appearance.dm
+++ b/code/modules/mob/living/carbon/human/appearance.dm
@@ -16,7 +16,7 @@
/mob/living/carbon/human/proc/change_gender(var/new_gender, var/update_dna = 1)
var/obj/item/organ/external/head/H = organs_by_name["head"]
- if(gender == new_gender)
+ if(gender == new_gender || (gender == PLURAL && species.has_gender))
return
gender = new_gender
@@ -488,4 +488,4 @@
valid_alt_heads += alternate_head
- return valid_alt_heads
\ No newline at end of file
+ return valid_alt_heads
diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm
index ac1d98e848f..06d49959b60 100644
--- a/code/modules/mob/living/carbon/human/emote.dm
+++ b/code/modules/mob/living/carbon/human/emote.dm
@@ -836,11 +836,11 @@
// playsound(loc, 'sound/effects/fart.ogg', 50, 1, -3) //Admins still vote no to fun
if(locate(/obj/item/weapon/storage/bible) in get_turf(src))
to_chat(viewers(src), "[src] farts on the Bible!")
- to_chat(viewers(src), "A mysterious force smites [src]!")
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- gib()
+ var/image/cross = image('icons/obj/storage.dmi',"bible")
+ var/adminbfmessage = "\blue [bicon(cross)] Bible Fart: [key_name(src, 1)] (?) (PP) (VV) (SM) ([admin_jump_link(src)]) (CA) (SMITE):"
+ for(var/client/X in admins)
+ if(check_rights(R_EVENT,0,X.mob))
+ to_chat(X, adminbfmessage)
else if(TOXIC_FARTS in mutations)
message = "[src] unleashes a [pick("horrible","terrible","foul","disgusting","awful")] fart."
else if(SUPER_FART in mutations)
diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm
index ffd759b3295..93d9a49d6df 100644
--- a/code/modules/mob/living/carbon/human/examine.dm
+++ b/code/modules/mob/living/carbon/human/examine.dm
@@ -33,7 +33,7 @@
var/msg = "*---------*\nThis is "
- if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender
+ if((skipjumpsuit && skipface)) //big suits/masks/helmets make it hard to tell their gender
t_He = "They"
t_his = "their"
t_him = "them"
@@ -51,6 +51,12 @@
t_He = "She"
t_his = "her"
t_him = "her"
+ if(PLURAL)
+ t_He = "They"
+ t_his = "their"
+ t_him = "them"
+ t_has = "have"
+ t_is = "are"
msg += "[name]"
@@ -494,7 +500,7 @@
msg += "Medical records: \[View\] \[Add comment\]\n"
- if(print_flavor_text() && !skipface)
+ if(print_flavor_text() && !skipface)
msg += "[print_flavor_text()]\n"
msg += "*---------*"
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ed578e20dd1..bcb0f286aa0 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -1479,6 +1479,7 @@
/mob/living/carbon/human/proc/set_species(var/new_species, var/default_colour, var/delay_icon_update = 0)
var/datum/species/oldspecies = species
+ var/datum/species/NS = all_species[new_species]
if(!dna)
if(!new_species)
new_species = "Human"
@@ -1498,6 +1499,8 @@
if(species.default_language)
remove_language(species.default_language)
+ if(gender == PLURAL && NS.has_gender)
+ change_gender(pick(MALE,FEMALE))
species.handle_pre_change(src)
species = all_species[new_species]
@@ -1884,7 +1887,7 @@
threatcount += 2
//Check for dresscode violations
- if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/rig/wizard))
+ if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
threatcount += 2
diff --git a/code/modules/mob/living/carbon/human/interactive/functions.dm b/code/modules/mob/living/carbon/human/interactive/functions.dm
index 272b95d3577..ad4d8226c4a 100644
--- a/code/modules/mob/living/carbon/human/interactive/functions.dm
+++ b/code/modules/mob/living/carbon/human/interactive/functions.dm
@@ -86,7 +86,7 @@
custom_emote(1, "[src]'s chest opens up, revealing a large mass of explosives and tangled wires!")
if(inactivity_period <= 0)
inactivity_period = 9999 // technically infinite
- if(do_after(src, 60, target=traitorTarget))
+ if(do_after(src, 60, target = traitorTarget))
custom_emote(1, "A fire bursts from [src]'s eyes, igniting white hot and consuming their body in a flaming explosion!")
explosion(src, 6, 6, 6)
else
diff --git a/code/modules/mob/living/carbon/human/species/apollo.dm b/code/modules/mob/living/carbon/human/species/apollo.dm
index 4c871405c8d..7c6e01a69dd 100644
--- a/code/modules/mob/living/carbon/human/species/apollo.dm
+++ b/code/modules/mob/living/carbon/human/species/apollo.dm
@@ -66,21 +66,21 @@
M.visible_message("[M] begins to violently pull off [H]'s antennae.")
to_chat(H, "[M] grips your antennae and starts violently pulling!")
- do_after(H, 250, target = src)
- if(p_loc == M.loc && p_loc_m == H.loc)
- var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode
- H.remove_language("Wryn Hivemind")
- node.remove(H)
- node.loc = M.loc
- to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.")
- to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].")
- to_chat(H, "It's so quiet...")
- head_organ.h_style = "Bald"
- H.update_hair()
+ if(do_after(H, 250, target = src))
+ if(p_loc == M.loc && p_loc_m == H.loc)
+ var/obj/item/organ/internal/wryn/hivenode/node = new /obj/item/organ/internal/wryn/hivenode
+ H.remove_language("Wryn Hivemind")
+ node.remove(H)
+ node.loc = M.loc
+ to_chat(M, "You hear a loud crunch as you mercilessly pull off [H]'s antennae.")
+ to_chat(H, "You hear a loud crunch as your antennae is ripped off your head by [M].")
+ to_chat(H, "It's so quiet...")
+ head_organ.h_style = "Bald"
+ H.update_hair()
- M.create_attack_log("removed antennae [H.name] ([H.ckey])")
- H.create_attack_log("Has had their antennae removed by [M.name] ([M.ckey])")
- msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
+ M.create_attack_log("removed antennae [H.name] ([H.ckey])")
+ H.create_attack_log("Has had their antennae removed by [M.name] ([M.ckey])")
+ msg_admin_attack("[key_name(M)] removed [key_name(H)]'s antennae")
return 0
/datum/species/nucleation
diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm
index fec4da6fae4..4e0cf476879 100644
--- a/code/modules/mob/living/carbon/human/species/species.dm
+++ b/code/modules/mob/living/carbon/human/species/species.dm
@@ -110,6 +110,7 @@
var/show_ssd = 1
var/virus_immune
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
+ var/has_gender = TRUE
//Death vars.
var/death_message = "seizes up and falls limp, their eyes dead and lifeless..."
diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm
index b7ca9d991d1..b39e880e718 100644
--- a/code/modules/mob/living/carbon/human/species/station.dm
+++ b/code/modules/mob/living/carbon/human/species/station.dm
@@ -899,6 +899,7 @@
default_hair = "Blue IPC Screen"
virus_immune = 1
can_revive_by_healing = 1
+ has_gender = FALSE
reagent_tag = PROCESS_SYN
male_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
female_scream_sound = 'sound/goonstation/voice/robot_scream.ogg'
@@ -911,7 +912,8 @@
has_organ = list(
"brain" = /obj/item/organ/internal/brain/mmi_holder/posibrain,
"cell" = /obj/item/organ/internal/cell,
- "optics" = /obj/item/organ/internal/eyes/optical_sensor //Default darksight of 2.
+ "optics" = /obj/item/organ/internal/eyes/optical_sensor, //Default darksight of 2.
+ "charger" = /obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
)
vision_organ = /obj/item/organ/internal/eyes/optical_sensor
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index 6f4ad8840c7..31fed13fdc5 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -847,7 +847,7 @@
return tally
/mob/living/proc/can_use_guns(var/obj/item/weapon/gun/G)
- if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
+ if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser() && !issmall(src))
to_chat(src, "You don't have the dexterity to do this!")
return 0
return 1
diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm
index 33e74cb6266..908102b8a06 100644
--- a/code/modules/mob/living/silicon/ai/ai.dm
+++ b/code/modules/mob/living/silicon/ai/ai.dm
@@ -1062,7 +1062,7 @@ var/list/ai_verbs_default = list(
if(istype(W, /obj/item/weapon/wrench))
if(anchored)
user.visible_message("\blue \The [user] starts to unbolt \the [src] from the plating...")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
user.visible_message("\blue \The [user] decides not to unbolt \the [src].")
return
user.visible_message("\blue \The [user] finishes unfastening \the [src]!")
@@ -1070,7 +1070,7 @@ var/list/ai_verbs_default = list(
return
else
user.visible_message("\blue \The [user] starts to bolt \the [src] to the plating...")
- if(!do_after(user,40, target = src))
+ if(!do_after(user, 40 * W.toolspeed, target = src))
user.visible_message("\blue \The [user] decides not to bolt \the [src].")
return
user.visible_message("\blue \The [user] finishes fastening down \the [src]!")
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 3df660dc117..cea257d1234 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone_items.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone_items.dm
@@ -44,6 +44,10 @@
// /obj/item/weapon/paper_bundle,
/obj/item/weapon/card/id
)
+
+/obj/item/weapon/gripper/New()
+ ..()
+ can_hold = typecacheof(can_hold)
/obj/item/weapon/gripper/attack_self(mob/user as mob)
if(wrapped)
@@ -118,10 +122,9 @@
//Check if the item is blacklisted.
var/grab = 0
- for(var/typepath in can_hold)
- if(istype(I,typepath))
+ if(can_hold.len)
+ if(is_type_in_typecache(I, can_hold))
grab = 1
- break
//We can grab the item, finally.
if(grab)
@@ -200,7 +203,7 @@
to_chat(D, "You begin decompiling the other drone.")
- if(!do_after(D,50, target = target))
+ if(!do_after(D, 50, target = target))
to_chat(D, "You need to remain still while decompiling such a large object.")
return
diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm
index d3aaaaea909..8ca615ae9b0 100644
--- a/code/modules/mob/living/silicon/robot/robot.dm
+++ b/code/modules/mob/living/silicon/robot/robot.dm
@@ -617,7 +617,7 @@ var/list/robot_verbs_default = list(
var/obj/item/weapon/weldingtool/WT = W
user.changeNext_move(CLICK_CD_MELEE)
if(WT.remove_fuel(0))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
adjustBruteLoss(-30)
updatehealth()
add_fingerprint(user)
@@ -651,7 +651,7 @@ var/list/robot_verbs_default = list(
return
to_chat(user, "You jam the crowbar into the robot and begin levering [mmi].")
- if(do_after(user,3 SECONDS, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You damage some parts of the chassis, but eventually manage to rip out [mmi]!")
var/obj/item/robot_parts/robot_suit/C = new/obj/item/robot_parts/robot_suit(loc)
C.l_leg = new/obj/item/robot_parts/l_leg(C)
@@ -945,9 +945,11 @@ var/list/robot_verbs_default = list(
adjustStaminaLoss(damage)
updatehealth()
+/mob/living/silicon/robot/attack_ghost(mob/user)
+ if(wiresexposed)
+ wires.Interact(user)
/mob/living/silicon/robot/attack_hand(mob/user)
-
add_fingerprint(user)
if(opened && !wiresexposed && (!istype(user, /mob/living/silicon)))
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 152ed03fec8..55c3a8fba0f 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -115,8 +115,8 @@
..()
modules += new /obj/item/weapon/melee/baton/loaded(src)
modules += new /obj/item/weapon/extinguisher(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/device/healthanalyzer(src)
emag = new /obj/item/weapon/melee/energy/sword/cyborg(src)
@@ -193,11 +193,11 @@
modules += new /obj/item/weapon/rcd/borg(src)
modules += new /obj/item/weapon/extinguisher(src)
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- modules += new /obj/item/weapon/screwdriver(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
- modules += new /obj/item/weapon/wirecutters(src)
- modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/weapon/screwdriver/cyborg(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
+ modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ modules += new /obj/item/device/multitool/cyborg(src)
modules += new /obj/item/device/t_scanner(src)
modules += new /obj/item/device/analyzer(src)
modules += new /obj/item/taperoll/engineering(src)
@@ -353,7 +353,7 @@
modules += new /obj/item/weapon/gun/energy/printer(src)
modules += new /obj/item/weapon/gun/projectile/revolver/grenadelauncher/multi/cyborg(src)
modules += new /obj/item/weapon/card/emag(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
@@ -391,7 +391,7 @@
modules += new /obj/item/weapon/surgicaldrill(src)
modules += new /obj/item/weapon/melee/energy/sword/cyborg/saw(src) //Energy saw -- primary weapon
modules += new /obj/item/weapon/card/emag(src)
- modules += new /obj/item/weapon/crowbar(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
modules += new /obj/item/weapon/pinpointer/operative(src)
emag = null
@@ -411,7 +411,7 @@
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
- modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -427,7 +427,7 @@
modules += new /obj/item/weapon/pickaxe/drill/jackhammer(src)
modules += new /obj/item/borg/combat/shield(src)
modules += new /obj/item/borg/combat/mobility(src)
- modules += new /obj/item/weapon/wrench(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
emag = new /obj/item/weapon/gun/energy/lasercannon/cyborg(src)
fix_modules()
@@ -474,11 +474,11 @@
/obj/item/weapon/robot_module/drone/New()
modules += new /obj/item/weapon/weldingtool/largetank/cyborg(src)
- modules += new /obj/item/weapon/screwdriver(src)
- modules += new /obj/item/weapon/wrench(src)
- modules += new /obj/item/weapon/crowbar(src)
- modules += new /obj/item/weapon/wirecutters(src)
- modules += new /obj/item/device/multitool(src)
+ modules += new /obj/item/weapon/screwdriver/cyborg(src)
+ modules += new /obj/item/weapon/wrench/cyborg(src)
+ modules += new /obj/item/weapon/crowbar/cyborg(src)
+ modules += new /obj/item/weapon/wirecutters/cyborg(src)
+ modules += new /obj/item/device/multitool/cyborg(src)
modules += new /obj/item/device/lightreplacer(src)
modules += new /obj/item/weapon/gripper(src)
modules += new /obj/item/weapon/matter_decompiler(src)
diff --git a/code/modules/mob/living/simple_animal/bot/bot.dm b/code/modules/mob/living/simple_animal/bot/bot.dm
index 50a7afc64b5..23466c3e7b4 100644
--- a/code/modules/mob/living/simple_animal/bot/bot.dm
+++ b/code/modules/mob/living/simple_animal/bot/bot.dm
@@ -326,7 +326,7 @@
to_chat(user, "Close the access panel before manipulating the personality slot!")
else
to_chat(user, "You attempt to pull [paicard] free...")
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * W.toolspeed, target = src))
if(paicard)
user.visible_message("[user] uses [W] to pull [paicard] out of [bot_name]!","You pull [paicard] out of [bot_name] with [W].")
ejectpai(user)
diff --git a/code/modules/mob/living/simple_animal/bot/construction.dm b/code/modules/mob/living/simple_animal/bot/construction.dm
index 27bfe821502..d524ffd8e06 100644
--- a/code/modules/mob/living/simple_animal/bot/construction.dm
+++ b/code/modules/mob/living/simple_animal/bot/construction.dm
@@ -139,10 +139,11 @@
to_chat(user, "You need one length of cable to wire the ED-209!")
return
to_chat(user, "You start to wire [src]...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
if(coil.get_amount() >= 1 && build_step == 6)
coil.use(1)
build_step = 7
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You wire the ED-209 assembly.")
name = "wired ED-209 assembly"
@@ -174,9 +175,9 @@
if(8)
if(istype(W, /obj/item/weapon/screwdriver))
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
to_chat(user, "You start attaching the gun to the frame...")
- if(do_after(user, 40, target = src))
+ if(do_after(user, 40 * W.toolspeed, target = src))
build_step++
name = "armed [name]"
to_chat(user, "Taser gun attached.")
diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm
index 14f7030243e..871c8694725 100644
--- a/code/modules/mob/living/simple_animal/bot/mulebot.dm
+++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm
@@ -311,7 +311,7 @@
else
dat += "Removed
"
- dat += wires.GetInteractWindow()
+ wires.Interact(user)
else
dat += "The bot is in maintenance mode and cannot be controlled.
"
diff --git a/code/modules/mob/living/simple_animal/corpse.dm b/code/modules/mob/living/simple_animal/corpse.dm
index ef5a8ec3719..e8196b4d3ac 100644
--- a/code/modules/mob/living/simple_animal/corpse.dm
+++ b/code/modules/mob/living/simple_animal/corpse.dm
@@ -103,12 +103,12 @@
/obj/effect/landmark/mobcorpse/syndicatecommando
name = "Syndicate Commando"
corpseuniform = /obj/item/clothing/under/syndicate
- corpsesuit = /obj/item/clothing/suit/space/rig/syndi
+ corpsesuit = /obj/item/clothing/suit/space/hardsuit/syndi
corpseshoes = /obj/item/clothing/shoes/combat
corpsegloves = /obj/item/clothing/gloves/combat
corpseradio = /obj/item/device/radio/headset
corpsemask = /obj/item/clothing/mask/gas/syndicate
- corpsehelmet = /obj/item/clothing/head/helmet/space/rig/syndi
+ corpsehelmet = /obj/item/clothing/head/helmet/space/hardsuit/syndi
corpseback = /obj/item/weapon/tank/jetpack/oxygen
corpsepocket1 = /obj/item/weapon/tank/emergency_oxygen
corpseid = 1
diff --git a/code/modules/mob/living/simple_animal/friendly/corgi.dm b/code/modules/mob/living/simple_animal/friendly/corgi.dm
index dfc0bce32a3..746442f8649 100644
--- a/code/modules/mob/living/simple_animal/friendly/corgi.dm
+++ b/code/modules/mob/living/simple_animal/friendly/corgi.dm
@@ -87,9 +87,9 @@
to_chat(user, "You can't shave this corgi, it's already been shaved!")
return
user.visible_message("[user] starts to shave [src] using \the [O].", "You start to shave [src] using \the [O]...")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * O.toolspeed, target = src))
user.visible_message("[user] shaves [src]'s hair using \the [O].")
- playsound(loc, 'sound/items/Welder2.ogg', 20, 1)
+ playsound(loc, O.usesound, 20, 1)
shaved = 1
icon_living = "[initial(icon_living)]_shaved"
icon_dead = "[initial(icon_living)]_shaved_dead"
@@ -174,7 +174,7 @@
var/list/allowed_types = list(
/obj/item/clothing/suit/armor/vest,
/obj/item/clothing/suit/space/deathsquad,
- /obj/item/clothing/suit/space/rig/engineering,
+ /obj/item/clothing/suit/space/hardsuit/engineering,
/obj/item/device/radio,
/obj/item/device/radio/off,
/obj/item/clothing/suit/cardborg,
@@ -356,7 +356,7 @@
desc = "That's not red paint. That's real corgi blood."
valid = 1
- if(/obj/item/clothing/head/helmet/space/rig/engineering)
+ if(/obj/item/clothing/head/helmet/space/hardsuit/engineering)
name = "Space Explorer [real_name]"
desc = "That's one small step for a corgi. One giant yap for corgikind."
valid = 1
diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
index f3ed8a34f51..80227526cbc 100644
--- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
+++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm
@@ -227,7 +227,7 @@
/obj/item/asteroid/goliath_hide/afterattack(atom/target, mob/user, proximity_flag)
if(proximity_flag)
- if(istype(target, /obj/item/clothing/suit/space/rig/mining) || istype(target, /obj/item/clothing/head/helmet/space/rig/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
+ if(istype(target, /obj/item/clothing/suit/space/hardsuit/mining) || istype(target, /obj/item/clothing/head/helmet/space/hardsuit/mining) || istype(target, /obj/item/clothing/suit/space/eva/plasmaman/miner) || istype(target, /obj/item/clothing/head/helmet/space/eva/plasmaman/miner))
var/obj/item/clothing/C = target
var/current_armor = C.armor
if(current_armor.["melee"] < 60)
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index 4da4a47945b..86edf8e0f35 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -171,7 +171,7 @@
if(istype(W))
if(istype(W, /obj/item/clothing))
var/obj/item/clothing/C = W
- if(C.rig_restrict_helmet)
+ if(C.hardsuit_restrict_helmet)
to_chat(src, "\red You must fasten the helmet to a hardsuit first. (Target the head and use on a hardsuit)")// Stop eva helms equipping.
else
@@ -1057,7 +1057,7 @@ var/list/slot_equipment_priority = list( \
visible_implants += O
return visible_implants
-mob/proc/yank_out_object()
+/mob/proc/yank_out_object()
set category = "Object"
set name = "Yank out object"
set desc = "Remove an embedded item at the cost of bleeding and pain."
diff --git a/code/modules/nano/modules/human_appearance.dm b/code/modules/nano/modules/human_appearance.dm
index 21636465d4a..95738cd6354 100644
--- a/code/modules/nano/modules/human_appearance.dm
+++ b/code/modules/nano/modules/human_appearance.dm
@@ -223,6 +223,7 @@
data["specimen"] = owner.species.name
data["gender"] = owner.gender
+ data["has_gender"] = owner.species.has_gender
data["change_race"] = can_change(APPEARANCE_RACE)
if(data["change_race"])
var/species[0]
diff --git a/code/modules/ninja/suit/suit_attackby.dm b/code/modules/ninja/suit/suit_attackby.dm
index ad4c64decca..0229dbf1e99 100644
--- a/code/modules/ninja/suit/suit_attackby.dm
+++ b/code/modules/ninja/suit/suit_attackby.dm
@@ -6,7 +6,7 @@
var/obj/item/weapon/stock_parts/cell/CELL
if(CELL.maxcharge > cell.maxcharge && suitGloves)
to_chat(U, "Higher maximum capacity detected.\nUpgrading...")
- if(n_gloves && n_gloves.candrain && do_after(U,s_delay, target = U))
+ if(n_gloves && n_gloves.candrain && do_after(U, s_delay, target = U))
U.drop_item()
CELL.loc = src
CELL.charge = min(CELL.charge+cell.charge, CELL.maxcharge)
diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm
index c7be9890a4f..a759ab2c850 100644
--- a/code/modules/paperwork/filingcabinet.dm
+++ b/code/modules/paperwork/filingcabinet.dm
@@ -43,7 +43,7 @@
icon_state = initial(icon_state)
updateUsrDialog()
else if(istype(P, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, P.usesound, 50, 1)
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
else
diff --git a/code/modules/paperwork/frames.dm b/code/modules/paperwork/frames.dm
index 46f4e12d97e..6a2e7d2d8b9 100644
--- a/code/modules/paperwork/frames.dm
+++ b/code/modules/paperwork/frames.dm
@@ -3,6 +3,8 @@
desc = "Its patented design allows it to be folded larger or smaller to accommodate standard paper, photo, and poster, and canvas sizes."
icon = 'icons/obj/bureaucracy.dmi'
+ usesound = 'sound/items/Deconstruct.ogg'
+
var/icon_base
var/obj/displayed
@@ -58,7 +60,7 @@
/obj/item/weapon/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
if(displayed)
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] unfastens \the [displayed] out of \the [src].", "You unfasten \the [displayed] out of \the [src].")
if(istype(displayed, /obj/structure/sign/poster))
@@ -72,7 +74,7 @@
else
to_chat(user, "There is nothing to remove from \the [src].")
else if(istype(I, /obj/item/weapon/crowbar))
- playsound(src, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] breaks down \the [src].", "You break down \the [src].")
for(var/A in contents)
if(istype(A, /obj/structure/sign/poster))
@@ -135,7 +137,7 @@
PF.pixel_x = px
PF.pixel_y = py
- playsound(PF.loc, 'sound/items/Deconstruct.ogg', 100, 1)
+ playsound(PF.loc, usesound, 100, 1)
/obj/item/weapon/picture_frame/examine(mob/user, var/distance = -1, var/infix = "", var/suffix = "")
..()
@@ -213,10 +215,10 @@
/obj/structure/sign/picture_frame/attackby(obj/item/I, mob/user)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] begins to unfasten \the [src] from the wall.", "You begin to unfasten \the [src] from the wall.")
- if(do_after(user, 100, target = src))
- playsound(src, 'sound/items/Deconstruct.ogg', 100, 1)
+ if(do_after(user, 100 * I.toolspeed, target = src))
+ playsound(src, I.usesound, 100, 1)
user.visible_message("[user] unfastens \the [src] from the wall.", "You unfasten \the [src] from the wall.")
frame.forceMove(user.loc)
frame = null
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index a5f04461551..b9915369f46 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -31,6 +31,9 @@
var/offset_y[0] //usage by the photocopier
var/rigged = 0
var/spam_flag = 0
+ var/contact_poison // Reagent ID to transfer on contact
+ var/contact_poison_volume = 0
+ var/contact_poison_poisoner = null
var/const/deffont = "Verdana"
var/const/signfont = "Times New Roman"
@@ -278,6 +281,8 @@
info += t // Oh, he wants to edit to the end of the file, let him.
updateinfolinks()
+ i.on_write(src,usr)
+
show_content(usr, forceshow = 1, infolinks = 1)
update_icon()
@@ -653,3 +658,13 @@
/obj/item/weapon/paper/evilfax/proc/evilpaper_selfdestruct()
visible_message("[src] spontaneously catches fire, and burns up!")
qdel(src)
+
+/obj/item/weapon/paper/pickup(user)
+ if(contact_poison && ishuman(user))
+ var/mob/living/carbon/human/H = user
+ var/obj/item/clothing/gloves/G = H.gloves
+ if(!istype(G) || G.transfer_prints)
+ H.reagents.add_reagent(contact_poison, contact_poison_volume)
+ contact_poison = null
+ add_logs(user, src, "picked up [src], the paper poisoned by [contact_poison_poisoner]")
+ ..()
\ No newline at end of file
diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm
index d7f86727d87..3b8a10ffbc0 100644
--- a/code/modules/paperwork/pen.dm
+++ b/code/modules/paperwork/pen.dm
@@ -182,3 +182,22 @@
else
icon_state = initial(icon_state) //looks like a normal pen when off.
item_state = initial(item_state)
+
+/obj/item/proc/on_write(obj/item/weapon/paper/P, mob/user)
+ return
+
+/obj/item/weapon/pen/poison
+ var/uses_left = 3
+
+/obj/item/weapon/pen/poison/on_write(obj/item/weapon/paper/P, mob/user)
+ if(P.contact_poison_volume)
+ to_chat(user, "[P] is already coated.")
+ else if(uses_left)
+ uses_left--
+ P.contact_poison = "amanitin"
+ P.contact_poison_volume = 15
+ P.contact_poison_poisoner = user.name
+ add_logs(user, P, "used poison pen on")
+ to_chat(user, "You apply the poison to [P].")
+ else
+ to_chat(user, "[src] clicks. It seems to be depleted.")
\ No newline at end of file
diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm
index f2f25d58a2d..a438d98afdc 100644
--- a/code/modules/paperwork/photocopier.dm
+++ b/code/modules/paperwork/photocopier.dm
@@ -150,7 +150,7 @@
else
to_chat(user, "This cartridge is not yet ready for replacement! Use up the rest of the toner.")
else if(istype(O, /obj/item/weapon/wrench))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = !anchored
to_chat(user, "You [anchored ? "wrench" : "unwrench"] \the [src].")
else if(istype(O, /obj/item/weapon/grab)) //For ass-copying.
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index c24dec2413f..afca7fcd953 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -109,7 +109,7 @@
icon = 'icons/obj/items.dmi'
icon_state = "album"
item_state = "briefcase"
- can_hold = list("/obj/item/weapon/photo")
+ can_hold = list(/obj/item/weapon/photo)
burn_state = FLAMMABLE
/obj/item/weapon/storage/photo_album/MouseDrop(obj/over_object as obj)
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 56da9cf9b07..9e1618aa280 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -126,6 +126,8 @@
w_class = 2
item_state = "electronic"
flags = CONDUCT
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
/obj/machinery/power/apc/connect_to_network()
//Override because the APC does not directly connect to the network; it goes through a terminal.
@@ -431,10 +433,10 @@
if(terminal)
to_chat(user, "Disconnect wires first.")
return
- playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You are trying to remove the power control board...")//lpeters - fixed grammar issues
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
if(has_electronics==1)
has_electronics = 0
if((stat & BROKEN) || malfhack)
@@ -472,6 +474,7 @@
user.visible_message(\
"[user.name] has inserted the power cell to [src.name]!",\
"You insert the power cell.")
+ playsound(loc, W.usesound, 50, 1)
chargecount = 0
update_icon()
else if(istype(W, /obj/item/weapon/screwdriver)) // haxing
@@ -484,12 +487,12 @@
if(has_electronics==1 && terminal)
has_electronics = 2
stat &= ~MAINT
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You screw the circuit electronics into place.")
else if(has_electronics==2)
has_electronics = 1
stat |= MAINT
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
to_chat(user, "You unfasten the electronics.")
else /* has_electronics==0 */
to_chat(user, "There is nothing to secure.")
@@ -527,8 +530,8 @@
to_chat(user, "You need more wires.")
return
to_chat(user, "You start adding cables to the APC frame...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, C.usesound, 50, 1)
+ if(do_after(user, 20 * C.toolspeed, target = src))
if(C.amount >= 10 && !terminal && opened && has_electronics != 2)
var/turf/T = get_turf(src)
var/obj/structure/cable/N = T.get_cable_node()
@@ -548,8 +551,8 @@
to_chat(user, "You must remove the floor plating in front of the APC first.")
return
to_chat(user, "You begin to cut the cables...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 50 * W.toolspeed, target = src))
if(terminal && opened && has_electronics!=2)
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal))
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
@@ -561,8 +564,8 @@
qdel(terminal) // qdel
else if(istype(W, /obj/item/weapon/apc_electronics) && opened && has_electronics==0 && !((stat & BROKEN) || malfhack))
to_chat(user, "You trying to insert the power control board into the frame...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(do_after(user, 10, target = src))
+ playsound(src.loc, W.usesound, 50, 1)
+ if(do_after(user, 10 * W.toolspeed, target = src))
if(has_electronics==0)
has_electronics = 1
to_chat(user, "You place the power control board inside the frame.")
@@ -578,8 +581,8 @@
user.visible_message("[user.name] welds [src].", \
"You start welding the APC frame...", \
"You hear welding.")
- playsound(src.loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 50, target = src))
+ playsound(src.loc, WT.usesound, 50, 1)
+ if(do_after(user, 50 * WT.toolspeed, target = src))
if(!src || !WT.remove_fuel(3, user)) return
if(emagged || malfhack || (stat & BROKEN) || opened==2)
new /obj/item/stack/sheet/metal(loc)
@@ -609,7 +612,7 @@
to_chat(user, "You cannot repair this APC until you remove the electronics still inside.")
return
to_chat(user, "You begin to replace the damaged APC frame...")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
user.visible_message(\
"[user.name] has replaced the damaged APC frame with new one.",\
"You replace the damaged APC frame with new one.")
@@ -640,6 +643,9 @@
(istype(W, /obj/item/device/multitool) || \
istype(W, /obj/item/weapon/wirecutters) || istype(W, /obj/item/device/assembly/signaler)))
return src.attack_hand(user)
+ if(W.flags & NOBLUDGEON)
+ return
+ user.changeNext_move(CLICK_CD_MELEE)
user.do_attack_animation(src)
user.visible_message("The [src.name] has been hit with the [W.name] by [user.name]!", \
"You hit the [src.name] with your [W.name]!", \
@@ -667,36 +673,6 @@
if(!user)
return
src.add_fingerprint(user)
- //Synthetic human mob goes here.
- if(istype(user,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = user
- if(H.get_int_organ(/obj/item/organ/internal/cell) && H.a_intent == I_GRAB)
- if(emagged || stat & BROKEN)
- var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
- s.set_up(3, 1, src)
- s.start()
- to_chat(H, "The APC power currents surge erratically, damaging your chassis!")
- H.adjustFireLoss(10,0)
- else if(src.cell && src.cell.charge > 0)
- if(H.nutrition < NUTRITION_LEVEL_WELL_FED)
- if(src.cell.charge >= 500)
- H.nutrition += 50
- src.cell.charge -= 500
- else
- H.nutrition += src.cell.charge/10
- src.cell.charge = 0
-
- to_chat(user, "You slot your fingers into the APC interface and siphon off some of the stored charge for your own use.")
- if(src.cell.charge < 0)
- src.cell.charge = 0
- if(H.nutrition > NUTRITION_LEVEL_WELL_FED + 50)
- H.nutrition = NUTRITION_LEVEL_WELL_FED + 50
- src.charging = 1
- else
- to_chat(user, "You are already fully charged.")
- else
- to_chat(user, "There is no charge to draw from that APC.")
- return
if(usr == user && opened && (!issilicon(user)))
if(cell)
@@ -745,16 +721,16 @@
beenhit += 1
return
-/obj/machinery/power/apc/attack_ghost(user as mob)
- if(stat & (BROKEN|MAINT))
- return
+/obj/machinery/power/apc/attack_ghost(mob/user)
+ if(wiresexposed)
+ wires.Interact(user)
return ui_interact(user)
/obj/machinery/power/apc/interact(mob/user)
if(!user)
return
- if(wiresexposed /*&& (!istype(user, /mob/living/silicon))*/) //Commented out the typecheck to allow engiborgs to repair damaged apcs.
+ if(wiresexposed)
wires.Interact(user)
return ui_interact(user)
diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm
index daf15729120..176ce72f005 100644
--- a/code/modules/power/cable.dm
+++ b/code/modules/power/cable.dm
@@ -486,21 +486,21 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
slot_flags = SLOT_BELT
item_state = "coil"
attack_verb = list("whipped", "lashed", "disciplined", "flogged")
+ usesound = 'sound/items/Deconstruct.ogg'
+ toolspeed = 1
/obj/item/stack/cable_coil/suicide_act(mob/user)
if(locate(/obj/structure/stool) in user.loc)
- user.visible_message("[user] is making a noose with the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is making a noose with the [name]! It looks like \he's trying to commit suicide.")
else
- user.visible_message("[user] is strangling \himself with the [src.name]! It looks like \he's trying to commit suicide.")
+ user.visible_message("[user] is strangling \himself with the [name]! It looks like \he's trying to commit suicide.")
return(OXYLOSS)
/obj/item/stack/cable_coil/New(loc, length = MAXCOIL, var/paramcolor = null)
..()
- src.amount = length
+ amount = length
if(paramcolor)
color = paramcolor
- else
- color = color
pixel_x = rand(-2,2)
pixel_y = rand(-2,2)
update_icon()
@@ -549,7 +549,6 @@ var/global/list/datum/stack_recipe/cable_coil_recipes = list(
/obj/item/stack/cable_coil/update_icon()
if(!color)
color = pick(COLOR_RED, COLOR_BLUE, COLOR_GREEN, COLOR_ORANGE, COLOR_WHITE, COLOR_PINK, COLOR_YELLOW, COLOR_CYAN)
- color = color
if(amount == 1)
icon_state = "coil1"
name = "cable piece"
diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm
index a61aca5661c..ed3146d4be7 100644
--- a/code/modules/power/generator.dm
+++ b/code/modules/power/generator.dm
@@ -166,7 +166,7 @@
power_change()
else
connect()
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [anchored ? "secure" : "unsecure"] the bolts holding [src] to the floor.")
else if(ismultitool(W))
if(cold_dir == WEST)
diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm
index e3be67f7aca..5b015fcf58d 100644
--- a/code/modules/power/gravitygenerator.dm
+++ b/code/modules/power/gravitygenerator.dm
@@ -184,14 +184,14 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(GRAV_NEEDS_SCREWDRIVER)
if(istype(I, /obj/item/weapon/screwdriver))
to_chat(user, "You secure the screws of the framework.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
broken_state++
if(GRAV_NEEDS_WELDING)
if(istype(I, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = I
if(WT.remove_fuel(1, user))
to_chat(user, "You mend the damaged framework.")
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
broken_state++
if(GRAV_NEEDS_PLASTEEL)
if(istype(I, /obj/item/stack/sheet/plasteel))
@@ -199,14 +199,14 @@ var/const/GRAV_NEEDS_WRENCH = 3
if(PS.amount >= 10)
PS.use(10)
to_chat(user, "You add the plating to the framework.")
- playsound(src.loc, 'sound/machines/click.ogg', 75, 1)
+ playsound(src.loc, PS.usesound, 75, 1)
broken_state++
else
to_chat(user, "You need 10 sheets of plasteel.")
if(GRAV_NEEDS_WRENCH)
if(istype(I, /obj/item/weapon/wrench))
to_chat(user, "You secure the plating to the framework.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, I.usesound, 75, 1)
set_fix()
else
..()
diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm
index 2b2b3e20183..b08f66a5119 100644
--- a/code/modules/power/lighting.dm
+++ b/code/modules/power/lighting.dm
@@ -40,14 +40,14 @@
src.add_fingerprint(user)
if(istype(W, /obj/item/weapon/wrench))
if(src.stage == 1)
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
to_chat(usr, "You begin deconstructing [src].")
- if(!do_after(usr, 30, target = src))
+ if(!do_after(usr, 30 * W.toolspeed, target = src))
return
new /obj/item/stack/sheet/metal( get_turf(src.loc), sheets_refunded )
user.visible_message("[user.name] deconstructs [src].", \
"You deconstruct [src].", "You hear a noise.")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
qdel(src)
if(src.stage == 2)
to_chat(usr, "You have to remove the wires first.")
@@ -65,10 +65,10 @@
src.icon_state = "tube-construct-stage1"
if("bulb")
src.icon_state = "bulb-construct-stage1"
- new /obj/item/stack/cable_coil(get_turf(src.loc), 1, "red")
+ new /obj/item/stack/cable_coil(get_turf(src.loc), 1, COLOR_RED)
user.visible_message("[user.name] removes the wiring from [src].", \
"You remove the wiring from [src].", "You hear a noise.")
- playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
+ playsound(loc, W.usesound, 100, 1)
return
if(istype(W, /obj/item/stack/cable_coil))
@@ -81,6 +81,7 @@
if("bulb")
src.icon_state = "bulb-construct-stage2"
src.stage = 2
+ playsound(loc, coil.usesound, 50, 1)
user.visible_message("[user.name] adds wires to [src].", \
"You add wires to [src].")
return
@@ -95,7 +96,7 @@
src.stage = 3
user.visible_message("[user.name] closes [src]'s casing.", \
"You close [src]'s casing.", "You hear a noise.")
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
switch(fixture_type)
@@ -348,7 +349,7 @@
// attempt to stick weapon into light socket
else if(status == LIGHT_EMPTY)
if(istype(W, /obj/item/weapon/screwdriver)) //If it's a screwdriver open it.
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
user.visible_message("[user.name] opens [src]'s casing.", \
"You open [src]'s casing.", "You hear a noise.")
var/obj/machinery/light_construct/newlight = null
diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm
index 0abb033e3e8..70be5b747c1 100644
--- a/code/modules/power/port_gen.dm
+++ b/code/modules/power/port_gen.dm
@@ -288,12 +288,12 @@
disconnect_from_network()
to_chat(user, "You unsecure the generator from the floor.")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
anchored = !anchored
else if(istype(O, /obj/item/weapon/screwdriver))
panel_open = !panel_open
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, O.usesound, 50, 1)
if(panel_open)
to_chat(user, "You open the access panel.")
else
diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm
index bab046450a3..278b4513d2f 100644
--- a/code/modules/power/power.dm
+++ b/code/modules/power/power.dm
@@ -317,12 +317,16 @@
//source is an object caused electrocuting (airlock, grille, etc)
//No animations will be performed by this proc.
/proc/electrocute_mob(mob/living/carbon/M as mob, var/power_source, var/obj/source, var/siemens_coeff = 1.0)
- if(istype(M.loc,/obj/mecha)) return 0 //feckin mechs are dumb
+ if(!istype(M))
+ return 0
+ if(istype(M.loc,/obj/mecha))
+ return 0 //feckin mechs are dumb
if(istype(M,/mob/living/carbon/human))
var/mob/living/carbon/human/H = M
if(H.gloves)
var/obj/item/clothing/gloves/G = H.gloves
- if(G.siemens_coefficient == 0) return 0 //to avoid spamming with insulated glvoes on
+ if(G.siemens_coefficient == 0)
+ return 0 //to avoid spamming with insulated glvoes on
var/area/source_area
if(istype(power_source,/area))
diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm
index 5ec69cf0233..c4b44be0524 100644
--- a/code/modules/power/singularity/collector.dm
+++ b/code/modules/power/singularity/collector.dm
@@ -74,7 +74,7 @@ var/global/list/rad_collectors = list()
if(P)
to_chat(user, "\blue Remove the plasma tank first.")
return 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
src.anchored = !src.anchored
user.visible_message("[user.name] [anchored? "secures":"unsecures"] the [src.name].", \
"You [anchored? "secure":"undo"] the external bolts.", \
diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm
index 9d42e8d7613..76472ab0321 100644
--- a/code/modules/power/singularity/emitter.dm
+++ b/code/modules/power/singularity/emitter.dm
@@ -236,14 +236,14 @@
switch(state)
if(0)
state = 1
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear a ratchet")
src.anchored = 1
if(1)
state = 0
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc,W.usesound, 75, 1)
user.visible_message("[user.name] unsecures [src.name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear a ratchet")
@@ -262,11 +262,11 @@
to_chat(user, "\red The [src.name] needs to be wrenched to the floor.")
if(1)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to weld the [src.name] to the floor.", \
"You start to weld the [src] to the floor.", \
"You hear welding")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
state = 2
to_chat(user, "You weld the [src] to the floor.")
@@ -275,11 +275,11 @@
to_chat(user, "\red You need more welding fuel to complete this task.")
if(2)
if(WT.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(src.loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to cut the [src.name] free from the floor.", \
"You start to cut the [src] free from the floor.", \
"You hear welding")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn()) return
state = 1
to_chat(user, "You cut the [src] free from the floor.")
diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm
index 89c3c8b61e1..aebee058c18 100644
--- a/code/modules/power/singularity/field_generator.dm
+++ b/code/modules/power/singularity/field_generator.dm
@@ -87,14 +87,14 @@ field_generator power level display
if(FG_UNSECURED)
if(isinspace()) return
state = FG_SECURED
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
user.visible_message("[user.name] secures [name] to the floor.", \
"You secure the external reinforcing bolts to the floor.", \
"You hear ratchet.")
anchored = 1
if(FG_SECURED)
state = FG_UNSECURED
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, W.usesound, 75, 1)
user.visible_message("[user.name] unsecures [name] reinforcing bolts from the floor.", \
"You undo the external reinforcing bolts.", \
"You hear ratchet.")
@@ -110,11 +110,11 @@ field_generator power level display
if(FG_SECURED)
if(WT.remove_fuel(0,user))
- playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to weld the [name] to the floor.", \
"You start to weld \the [src] to the floor...", \
"You hear welding.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn())
return
state = FG_WELDED
@@ -122,11 +122,11 @@ field_generator power level display
if(FG_WELDED)
if(WT.remove_fuel(0,user))
- playsound(loc, 'sound/items/Welder2.ogg', 50, 1)
+ playsound(loc, WT.usesound, 50, 1)
user.visible_message("[user.name] starts to cut the [name] free from the floor.", \
"You start to cut \the [src] free from the floor...", \
"You hear welding.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * WT.toolspeed, target = src))
if(!src || !WT.isOn())
return
state = FG_SECURED
diff --git a/code/modules/power/singularity/generator.dm b/code/modules/power/singularity/generator.dm
index 11ffbf5a3f6..276d3fe80b8 100644
--- a/code/modules/power/singularity/generator.dm
+++ b/code/modules/power/singularity/generator.dm
@@ -23,7 +23,7 @@
/obj/machinery/the_singularitygen/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/weapon/wrench))
anchored = !anchored
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 75, 1)
if(anchored)
user.visible_message("[user.name] secures [src.name] to the floor.", \
"You secure the [src.name] to the floor.", \
diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
index 7fba50784b8..0ce1159743e 100644
--- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
+++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm
@@ -214,7 +214,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
-/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+/obj/structure/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
if(!(O) || !(user))
return 0
if(!ismob(user) || !isobj(O))
@@ -224,14 +224,14 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O) && !isinspace())
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 1
user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
temp_state++
if(1)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 0
user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
@@ -239,6 +239,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
else if(iscoil(O))
var/obj/item/stack/cable_coil/C = O
if(C.use(1))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
@@ -247,15 +248,18 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
@@ -352,7 +356,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
return 0
-/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/O, var/mob/user)
+/obj/machinery/particle_accelerator/proc/process_tool_hit(var/obj/item/O, var/mob/user)
if(!(O) || !(user))
return 0
if(!ismob(user) || !isobj(O))
@@ -361,7 +365,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
switch(construction_state)//TODO:Might be more interesting to have it need several parts rather than a single list of steps
if(0)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 1
user.visible_message("[user.name] secures the [name] to the floor.", \
"You secure the external bolts.")
@@ -369,7 +373,7 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
power_change()
if(1)
if(iswrench(O))
- playsound(loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(loc, O.usesound, 50, 1)
anchored = 0
user.visible_message("[user.name] detaches the [name] from the floor.", \
"You remove the external bolts.")
@@ -377,20 +381,24 @@ So, hopefully this is helpful if any more icons are to be added/changed/wonderin
power_change()
else if(iscoil(O))
if(O:use(1))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] adds wires to the [name].", \
"You add some wires.")
temp_state++
if(2)
if(iswirecutter(O))//TODO:Shock user if its on?
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] removes some wires from the [name].", \
"You remove some wires.")
temp_state--
else if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] closes the [name]'s access panel.", \
"You close the access panel.")
temp_state++
if(3)
if(isscrewdriver(O))
+ playsound(loc, O.usesound, 50, 1)
user.visible_message("[user.name] opens the [name]'s access panel.", \
"You open the access panel.")
temp_state--
diff --git a/code/modules/power/smes.dm b/code/modules/power/smes.dm
index 02597b46840..b8c0133d8f3 100644
--- a/code/modules/power/smes.dm
+++ b/code/modules/power/smes.dm
@@ -180,9 +180,9 @@
return
to_chat(user, "You begin to dismantle the power terminal...")
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * I.toolspeed, target = src))
if(prob(50) && electrocute_mob(usr, terminal.powernet, terminal)) //animate the electrocution if uncautious and unlucky
var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
s.set_up(5, 1, src)
diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm
index 5f137f4cb74..dea4c4797e8 100644
--- a/code/modules/power/solar.dm
+++ b/code/modules/power/solar.dm
@@ -60,12 +60,12 @@
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar panel.", "You begin to take the glass off the solar panel...")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message("[user] takes the glass off the solar panel.", "You take the glass off the solar panel.")
qdel(src)
return
@@ -227,20 +227,20 @@
if(istype(W, /obj/item/weapon/wrench))
anchored = 1
user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 50, 1)
return 1
else
if(istype(W, /obj/item/weapon/wrench))
anchored = 0
user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 75, 1)
+ playsound(src.loc, W.usesound, 50, 1)
return 1
if(istype(W, /obj/item/stack/sheet/glass) || istype(W, /obj/item/stack/sheet/rglass))
var/obj/item/stack/sheet/S = W
if(S.use(2))
glass_type = W.type
- playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
+ playsound(loc, S.usesound, 50, 1)
user.visible_message("[user] places the glass on the solar assembly.", "You place the glass on the solar assembly.")
if(tracker)
new /obj/machinery/power/tracker(get_turf(src), src)
@@ -263,6 +263,7 @@
if(istype(W, /obj/item/weapon/crowbar))
new /obj/item/weapon/tracker_electronics(src.loc)
tracker = 0
+ playsound(loc, W.usesound, 50, 1)
user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.")
return 1
..()
@@ -411,10 +412,10 @@
return data
-/obj/machinery/power/solar_control/attackby(I as obj, user as mob, params)
+/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/screwdriver))
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(src.loc, I.usesound, 50, 1)
+ if(do_after(user, 20 * I.toolspeed, target = src))
if(src.stat & BROKEN)
to_chat(user, "The broken glass falls out.")
var/obj/structure/computerframe/A = new /obj/structure/computerframe( src.loc )
diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm
index 63653eab9d1..7b4b7a0d02e 100644
--- a/code/modules/power/tracker.dm
+++ b/code/modules/power/tracker.dm
@@ -63,12 +63,12 @@
if(istype(W, /obj/item/weapon/crowbar))
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
user.visible_message("[user] begins to take the glass off the solar tracker.")
- if(do_after(user, 50, target = src))
+ if(do_after(user, 50 * W.toolspeed, target = src))
var/obj/item/solar_assembly/S = locate() in src
if(S)
S.loc = src.loc
S.give_glass()
- playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
+ playsound(src.loc, W.usesound, 50, 1)
user.visible_message("[user] takes the glass off the tracker.")
qdel(src) // qdel
return
diff --git a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
index 9a4445d111d..fb811c19d78 100644
--- a/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
+++ b/code/modules/projectiles/guns/energy/kinetic_accelerator.dm
@@ -34,7 +34,7 @@
if(istype(A, /obj/item/weapon/crowbar))
if(modkits.len)
to_chat(user, "You pry the modifications out.")
- playsound(loc, 'sound/items/Crowbar.ogg', 100, 1)
+ playsound(loc, A.usesound, 100, 1)
for(var/obj/item/borg/upgrade/modkit/M in modkits)
M.uninstall(src)
else
@@ -230,6 +230,7 @@
origin_tech = "programming=2;materials=2;magnets=4"
require_module = 1
module_type = /obj/item/weapon/robot_module/miner
+ usesound = 'sound/items/Screwdriver.ogg'
var/denied_type = null
var/maximum_of_type = 1
var/cost = 30
@@ -266,7 +267,7 @@
if(KA.get_remaining_mod_capacity() >= cost)
if(.)
to_chat(user, "You install the modkit.")
- playsound(loc, 'sound/items/Screwdriver.ogg', 100, 1)
+ playsound(loc, usesound, 100, 1)
user.unEquip(src)
forceMove(KA)
KA.modkits += src
diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm
index 12eb34e8c54..3131e49c4f2 100644
--- a/code/modules/projectiles/guns/energy/special.dm
+++ b/code/modules/projectiles/guns/energy/special.dm
@@ -139,6 +139,8 @@
origin_tech = "combat=1;materials=3;magnets=2;plasmatech=2;engineering=1"
ammo_type = list(/obj/item/ammo_casing/energy/plasma)
fire_sound = 'sound/weapons/laser.ogg'
+ usesound = 'sound/items/Welder.ogg'
+ toolspeed = 1
flags = CONDUCT | OPENCONTAINER
attack_verb = list("attacked", "slashed", "cut", "sliced")
force = 12
diff --git a/code/modules/projectiles/guns/projectile/revolver.dm b/code/modules/projectiles/guns/projectile/revolver.dm
index 884b97c8ffb..80192a3091d 100644
--- a/code/modules/projectiles/guns/projectile/revolver.dm
+++ b/code/modules/projectiles/guns/projectile/revolver.dm
@@ -121,7 +121,7 @@
afterattack(user, user) //you know the drill
user.visible_message("[src] goes off!", "[src] goes off in your face!")
return
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * A.toolspeed, target = src))
if(magazine.ammo_count())
to_chat(user, "You can't modify it!")
return
@@ -134,7 +134,7 @@
afterattack(user, user) //and again
user.visible_message("[src] goes off!", "[src] goes off in your face!")
return
- if(do_after(user, 30, target = src))
+ if(do_after(user, 30 * A.toolspeed, target = src))
if(magazine.ammo_count())
to_chat(user, "You can't modify it!")
return
diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
index 9a3ecffedb6..3904e923886 100644
--- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
+++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm
@@ -358,7 +358,7 @@
return
if(istype(I, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, I.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, "[src] can now be moved.")
diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm
index 3d57f950995..1127271c17e 100644
--- a/code/modules/recycling/conveyor2.dm
+++ b/code/modules/recycling/conveyor2.dm
@@ -129,12 +129,13 @@
var/obj/item/conveyor_construct/C = new/obj/item/conveyor_construct(src.loc)
C.id = id
transfer_fingerprints_to(C)
+ playsound(loc, I.usesound, 50, 1)
to_chat(usr,"You remove the conveyor belt.")
qdel(src)
else if(istype(I, /obj/item/weapon/wrench))
if(!(stat & BROKEN))
- playsound(loc, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(loc, I.usesound, 50, 1)
dir = turn(dir,-45)
update_move_direction()
to_chat(user, "You rotate [src].")
@@ -253,9 +254,20 @@
// attack with hand, switch position
/obj/machinery/conveyor_switch/attack_hand(mob/user)
- if(!allowed(user)) //this is in Para but not TG. I don't think there's any which are set anyway.
+ if(..())
+ return 1
+
+ toggle(user)
+
+/obj/machinery/conveyor_switch/attack_ghost(mob/user)
+ if(user.can_advanced_admin_interact())
+ toggle(user)
+
+/obj/machinery/conveyor_switch/proc/toggle(mob/user)
+ if(!allowed(user) && !user.can_advanced_admin_interact()) //this is in Para but not TG. I don't think there's any which are set anyway.
to_chat(user, "Access denied.")
return
+
add_fingerprint(user)
if(position == 0)
if(convdir) //is it a oneway switch
@@ -280,8 +292,7 @@
S.position = position
S.update()
CHECK_TICK
-
-
+
/obj/machinery/conveyor_switch/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/crowbar))
var/obj/item/conveyor_switch_construct/C = new/obj/item/conveyor_switch_construct(src.loc)
diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm
index 4e720f39c00..fd915caa4a8 100644
--- a/code/modules/recycling/disposal-construction.dm
+++ b/code/modules/recycling/disposal-construction.dm
@@ -212,16 +212,16 @@
else
density = 1 // We don't want disposal bins or outlets to go density 0
to_chat(user, "You attach the [nicetype] to the underfloor.")
- playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1)
+ playsound(src.loc, I.usesound, 100, 1)
update()
else if(istype(I, /obj/item/weapon/weldingtool))
if(anchored)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "Welding the [nicetype] in place.")
- if(do_after(user, 20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "The [nicetype] has been welded in place!")
update() // TODO: Make this neat
diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm
index b9cb76b31b0..075a2113e79 100644
--- a/code/modules/recycling/disposal.dm
+++ b/code/modules/recycling/disposal.dm
@@ -74,12 +74,12 @@
return
if(mode==0) // It's off but still not unscrewed
mode=-1 // Set it to doubleoff l0l
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(mode==-1)
mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && mode==-1)
@@ -88,10 +88,10 @@
return
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You start slicing the floorweld off the disposal unit.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the disposal unit.")
var/obj/structure/disposalconstruct/C = new (src.loc)
@@ -882,8 +882,8 @@
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0, user))
to_chat(user, "You begin slicing \the [src].")
- playsound(loc, 'sound/items/Welder2.ogg', 100, 1)
- if(do_after(user, 30, target = src))
+ playsound(loc, W.usesound, 100, 1)
+ if(do_after(user, 30 * W.toolspeed, target = src))
to_chat(user, "You finish slicing \the [src].")
welded()
else
@@ -1190,19 +1190,14 @@
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
- // check if anything changed over 2 seconds
- var/turf/uloc = user.loc
- var/atom/wloc = W.loc
- to_chat(user, "Slicing the disposal pipe.")
- sleep(30)
- if(!W.isOn()) return
- if(user.loc == uloc && wloc == W.loc)
+ playsound(loc, W.usesound, 100, 1)
+ to_chat(user, "Slicing the disposal pipe.")
+ if(do_after(user, 30 * W.toolspeed, target = src))
+ if(!W.isOn())
+ return
welded()
- else
- to_chat(user, "You must stay still while welding the pipe.")
else
- to_chat(user, "You need more welding fuel to cut the pipe.")
+ to_chat(user, "You need more welding fuel to cut the pipe.")
return
// would transfer to next pipe segment, but we are in a trunk
@@ -1308,20 +1303,20 @@
if(istype(I, /obj/item/weapon/screwdriver))
if(mode==0)
mode=1
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(mode==1)
mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You start slicing the floorweld off the disposal outlet.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the disposal outlet.")
var/obj/structure/disposalconstruct/C = new (src.loc)
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index a0e9d59a803..104036d5c0a 100755
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -331,20 +331,20 @@
if(istype(I, /obj/item/weapon/screwdriver))
if(c_mode==0)
c_mode=1
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You remove the screws around the power connection.")
return
else if(c_mode==1)
c_mode=0
- playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src.loc, I.usesound, 50, 1)
to_chat(user, "You attach the screws around the power connection.")
return
else if(istype(I,/obj/item/weapon/weldingtool) && c_mode==1)
var/obj/item/weapon/weldingtool/W = I
if(W.remove_fuel(0,user))
- playsound(src.loc, 'sound/items/Welder2.ogg', 100, 1)
+ playsound(src.loc, W.usesound, 100, 1)
to_chat(user, "You start slicing the floorweld off the delivery chute.")
- if(do_after(user,20, target = src))
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the delivery chute.")
var/obj/structure/disposalconstruct/C = new (src.loc)
diff --git a/code/modules/research/designs/equipment_designs.dm b/code/modules/research/designs/equipment_designs.dm
index 0f23b2a6532..e63211dc35b 100644
--- a/code/modules/research/designs/equipment_designs.dm
+++ b/code/modules/research/designs/equipment_designs.dm
@@ -189,4 +189,84 @@
build_type = PROTOLATHE
materials = list("$metal" = 200, "$glass" = 200, "$uranium" = 1000, "$plasma" = 200)
build_path = /obj/item/clothing/glasses/hud/hydroponic/night
+ category = list("Equipment")
+
+/datum/design/handdrill
+ name = "Hand Drill"
+ desc = "A small electric hand drill with an interchangable screwdriver and bolt bit"
+ id = "handdrill"
+ req_tech = list("materials" = 4, "engineering" = 6)
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 3500, MAT_SILVER = 1500, MAT_GOLD = 1000)
+ build_path = /obj/item/weapon/screwdriver/power
+ category = list("Equipment")
+
+/datum/design/jawsoflife
+ name = "Jaws of Life"
+ desc = "A small, compact Jaws of Life with an interchangable pry jaws and cutting jaws"
+ id = "jawsoflife"
+ req_tech = list("materials" = 4, "engineering" = 6, "magnets" = 6) // added one more requirment since the Jaws of Life are a bit OP
+ build_path = /obj/item/weapon/crowbar/power
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 4500, MAT_SILVER = 2500, MAT_DIAMOND = 1000)
+ category = list("Equipment")
+
+/datum/design/alienwrench
+ name = "Alien Wrench"
+ desc = "An advanced wrench obtained through Abductor technology."
+ id = "alien_wrench"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/wrench/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienwirecutters
+ name = "Alien Wirecutters"
+ desc = "Advanced wirecutters obtained through Abductor technology."
+ id = "alien_wirecutters"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/wirecutters/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienscrewdriver
+ name = "Alien Screwdriver"
+ desc = "An advanced screwdriver obtained through Abductor technology."
+ id = "alien_screwdriver"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/screwdriver/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/aliencrowbar
+ name = "Alien Crowbar"
+ desc = "An advanced crowbar obtained through Abductor technology."
+ id = "alien_crowbar"
+ req_tech = list("engineering" = 5, "materials" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/crowbar/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 1000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienwelder
+ name = "Alien Welding Tool"
+ desc = "An advanced welding tool obtained through Abductor technology."
+ id = "alien_welder"
+ req_tech = list("engineering" = 5, "plasmatech" = 5, "abductor" = 4)
+ build_path = /obj/item/weapon/weldingtool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000)
+ category = list("Equipment")
+
+/datum/design/alienmultitool
+ name = "Alien Multitool"
+ desc = "An advanced multitool obtained through Abductor technology."
+ id = "alien_multitool"
+ req_tech = list("engineering" = 5, "programming" = 5, "abductor" = 4)
+ build_path = /obj/item/device/multitool/abductor
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 5000, MAT_SILVER = 2500, MAT_PLASMA = 5000, MAT_DIAMOND = 2000)
category = list("Equipment")
\ No newline at end of file
diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm
index 7bcc42e4979..4163b36f573 100644
--- a/code/modules/research/designs/medical_designs.dm
+++ b/code/modules/research/designs/medical_designs.dm
@@ -198,6 +198,65 @@
build_path = /obj/item/weapon/scalpel/manager
category = list("Medical")
+/datum/design/alienscalpel
+ name = "Alien Scalpel"
+ desc = "An advanced scalpel obtained through Abductor technology."
+ id = "alien_scalpel"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/scalpel/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/alienhemostat
+ name = "Alien Hemostat"
+ desc = "An advanced hemostat obtained through Abductor technology."
+ id = "alien_hemostat"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/hemostat/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/alienretractor
+ name = "Alien Retractor"
+ desc = "An advanced retractor obtained through Abductor technology."
+ id = "alien_retractor"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/retractor/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
+
+/datum/design/aliensaw
+ name = "Alien Circular Saw"
+ desc = "An advanced surgical saw obtained through Abductor technology."
+ id = "alien_saw"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/circular_saw/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000)
+ category = list("Medical")
+
+/datum/design/aliendrill
+ name = "Alien Drill"
+ desc = "An advanced drill obtained through Abductor technology."
+ id = "alien_drill"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/surgicaldrill/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 10000, MAT_SILVER = 2500, MAT_GOLD = 1000, MAT_PLASMA = 1000)
+ category = list("Medical")
+
+/datum/design/aliencautery
+ name = "Alien Cautery"
+ desc = "An advanced cautery obtained through Abductor technology."
+ id = "alien_cautery"
+ req_tech = list("biotech" = 4, "materials" = 4, "abductor" = 3)
+ build_path = /obj/item/weapon/cautery/alien
+ build_type = PROTOLATHE
+ materials = list(MAT_METAL = 2000, MAT_SILVER = 1500, MAT_GOLD = 500, MAT_PLASMA = 500)
+ category = list("Medical")
/////////////////////////////////////////
//////////Cybernetic Implants////////////
diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm
index d7ca9ef883d..8386c79377d 100644
--- a/code/modules/research/research.dm
+++ b/code/modules/research/research.dm
@@ -220,7 +220,7 @@ datum/tech/engineering
name = "Engineering Research"
desc = "Development of new and improved engineering parts and methods."
id = "engineering"
- max_level = 5
+ max_level = 6
datum/tech/plasmatech
name = "Plasma Research"
diff --git a/code/modules/research/xenoarchaeology/artifact/artifact.dm b/code/modules/research/xenoarchaeology/artifact/artifact.dm
index 57759308aee..fc4cda15541 100644
--- a/code/modules/research/xenoarchaeology/artifact/artifact.dm
+++ b/code/modules/research/xenoarchaeology/artifact/artifact.dm
@@ -80,7 +80,7 @@
if(istype(W, /obj/item/device/measuring_tape))
var/obj/item/device/measuring_tape/P = W
user.visible_message("\blue[user] extends [P] towards [src].","\blue You extend [P] towards [src].")
- if(do_after(user,40, target = src))
+ if(do_after(user, 40, target = src))
to_chat(user, "\blue [bicon(P)] [src] has been excavated to a depth of [2*src.excavation_level]cm.")
return
@@ -89,7 +89,7 @@
to_chat(user, "\red You start [P.drill_verb] [src].")
- if(!do_after(user,P.digspeed, target = src))
+ if(!do_after(user, P.digspeed, target = src))
return
to_chat(user, "\blue You finish [P.drill_verb] [src].")
diff --git a/code/modules/research/xenoarchaeology/tools/gearbelt.dm b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
index e2d4839d2b4..8912e9248c8 100644
--- a/code/modules/research/xenoarchaeology/tools/gearbelt.dm
+++ b/code/modules/research/xenoarchaeology/tools/gearbelt.dm
@@ -5,24 +5,24 @@
icon_state = "gearbelt"
item_state = "utility"
can_hold = list(
- "/obj/item/weapon/storage/box/samplebags",
- "/obj/item/device/core_sampler",
- "/obj/item/device/beacon_locator",
- "/obj/item/device/radio/beacon",
- "/obj/item/device/gps",
- "/obj/item/device/measuring_tape",
- "/obj/item/device/flashlight",
- "/obj/item/weapon/pickaxe",
- "/obj/item/device/depth_scanner",
- "/obj/item/device/camera",
- "/obj/item/weapon/paper",
- "/obj/item/weapon/photo",
- "/obj/item/weapon/folder",
- "/obj/item/weapon/pen",
- "/obj/item/weapon/folder",
- "/obj/item/weapon/clipboard",
- "/obj/item/weapon/anodevice",
- "/obj/item/clothing/glasses",
- "/obj/item/weapon/wrench",
- "/obj/item/weapon/storage/box/excavation",
- "/obj/item/weapon/anobattery")
+ /obj/item/weapon/storage/box/samplebags,
+ /obj/item/device/core_sampler,
+ /obj/item/device/beacon_locator,
+ /obj/item/device/radio/beacon,
+ /obj/item/device/gps,
+ /obj/item/device/measuring_tape,
+ /obj/item/device/flashlight,
+ /obj/item/weapon/pickaxe,
+ /obj/item/device/depth_scanner,
+ /obj/item/device/camera,
+ /obj/item/weapon/paper,
+ /obj/item/weapon/photo,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/pen,
+ /obj/item/weapon/folder,
+ /obj/item/weapon/clipboard,
+ /obj/item/weapon/anodevice,
+ /obj/item/clothing/glasses,
+ /obj/item/weapon/wrench,
+ /obj/item/weapon/storage/box/excavation,
+ /obj/item/weapon/anobattery)
diff --git a/code/modules/research/xenoarchaeology/tools/tools.dm b/code/modules/research/xenoarchaeology/tools/tools.dm
index 39dc6738f4f..6ac7aee6a2b 100644
--- a/code/modules/research/xenoarchaeology/tools/tools.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools.dm
@@ -21,4 +21,4 @@
storage_slots = 50
max_combined_w_class = 200 //Doesn't matter what this is, so long as it's more or equal to storage_slots * ore.w_class
max_w_class = 3
- can_hold = list("/obj/item/weapon/fossil")
+ can_hold = list(/obj/item/weapon/fossil)
diff --git a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
index 1dd6b769390..4e6e48b49b5 100644
--- a/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
+++ b/code/modules/research/xenoarchaeology/tools/tools_pickaxe.dm
@@ -126,13 +126,13 @@
foldable = /obj/item/stack/sheet/cardboard //BubbleWrap
storage_slots = 7
w_class = 2
- can_hold = list("/obj/item/weapon/pickaxe/brush",\
- "/obj/item/weapon/pickaxe/one_pick",\
- "/obj/item/weapon/pickaxe/two_pick",\
- "/obj/item/weapon/pickaxe/three_pick",\
- "/obj/item/weapon/pickaxe/four_pick",\
- "/obj/item/weapon/pickaxe/five_pick",\
- "/obj/item/weapon/pickaxe/six_pick")
+ can_hold = list(/obj/item/weapon/pickaxe/brush,\
+ /obj/item/weapon/pickaxe/one_pick,\
+ /obj/item/weapon/pickaxe/two_pick,\
+ /obj/item/weapon/pickaxe/three_pick,\
+ /obj/item/weapon/pickaxe/four_pick,\
+ /obj/item/weapon/pickaxe/five_pick,\
+ /obj/item/weapon/pickaxe/six_pick)
max_combined_w_class = 17
max_w_class = 4
use_to_pickup = 1 // for picking up broken bulbs, not that most people will try
diff --git a/code/modules/space_management/heap_space_level.dm b/code/modules/space_management/heap_space_level.dm
index 8d5a3971ba1..640080095a3 100644
--- a/code/modules/space_management/heap_space_level.dm
+++ b/code/modules/space_management/heap_space_level.dm
@@ -1,15 +1,62 @@
// This represents a level we can carve up as we please, and hand out
// chunks of to whatever requests it
/datum/space_level/heap
- var/datum/space_chunk/top
- linkage = UNAFFECTED
+ name = "Heap level #ERROR"
+ var/datum/space_chunk/top
+ linkage = UNAFFECTED
-/datum/space_level/heap/New()
- ..()
- top = new
+/datum/space_level/heap/New(z, name, transition_type, traits)
+ ..(z, "Heap level #[z]", UNAFFECTED, traits)
+ top = new(1, 1, zpos, world.maxx, world.maxy)
+ flags = traits
/datum/space_level/heap/proc/request(width, height)
- return 1 // All are welcome! At least until I add code for this
+ return top.can_fit_space(width, height)
-/datum/zlevel/heap/proc/allocate(width, height)
- return
+// Returns a space chunk datum for some nerd to work with - tells them what's safe to write into, and such
+/datum/space_level/heap/proc/allocate(width, height)
+ if(!request(width, height))
+ return null
+
+ var/datum/space_chunk/C = top.get_optimal_chunk(width, height)
+ if(!C)
+ return null
+ C.children.Cut()
+
+ if(C.width == width && C.height == height && C.is_empty)
+ C.set_occupied(TRUE)
+ return C
+
+ // Split the chunk into 4 pieces
+ var/datum/space_chunk/return_chunk = new(C.x, C.y, C.zpos, width, height)
+ C.children += return_chunk
+ C.children += new /datum/space_chunk(C.x+width, C.y, C.zpos, C.width-width, height)
+ C.children += new /datum/space_chunk(C.x, C.y+height, C.zpos, width, C.height-height)
+ C.children += new /datum/space_chunk(C.x+width, C.y+height, C.zpos, C.width-width, C.height-height)
+
+ for(var/datum/space_chunk/C2 in C.children)
+ C2.parent = C
+ return_chunk.set_occupied(TRUE)
+ return return_chunk
+
+/datum/space_level/heap/proc/free(datum/space_chunk/C)
+ if(!istype(C))
+ return
+ if(C.zpos != zpos)
+ return
+ C.set_occupied(FALSE)
+ for(var/turf/T in block(locate(C.x, C.y, C.zpos), locate(C.x+C.width-1, C.y+C.height-1, C.zpos)))
+ for(var/atom/movable/M in T)
+ if(istype(M, /mob/dead/observer))
+ continue
+ M.loc = null
+ qdel(M, TRUE)
+ T.ChangeTurf(/turf/space)
+ var/datum/space_chunk/last_empty_parent = C
+ while(last_empty_parent.parent && last_empty_parent.parent.is_empty)
+ last_empty_parent = last_empty_parent.parent
+ // Prevent a self-qdel from killing this proc
+ src = null
+ for(var/datum/space_chunk/child in last_empty_parent.children)
+ qdel(child)
+ last_empty_parent.children.Cut()
diff --git a/code/modules/space_management/space_chunk.dm b/code/modules/space_management/space_chunk.dm
index a150d25d2f3..8b6e5b6974e 100644
--- a/code/modules/space_management/space_chunk.dm
+++ b/code/modules/space_management/space_chunk.dm
@@ -10,14 +10,81 @@
var/width
var/height
var/zpos
+ // Whether dedicated for use or not
+ var/occupied = FALSE
+ // Whether the chunk contains used children or not
+ var/is_empty = TRUE
+ var/list/children = list()
+ var/datum/space_chunk/parent = null
-/datum/space_chunk/New(w, h, z, new_x, new_y)
+/datum/space_chunk/New(new_x, new_y, z, w, h)
x = new_x
y = new_y
zpos = z
width = w
height = h
+/datum/space_chunk/Destroy()
+ set_occupied(FALSE)
+ if(parent)
+ parent.children -= src
+ for(var/datum/space_chunk/child in children)
+ qdel(child)
+ children.Cut()
+ parent = null
+ . = ..()
+
+/datum/space_chunk/proc/can_fit_space(w, h)
+ if(w > width || h > height)
+ return FALSE
+ if(occupied)
+ return FALSE
+ if(is_empty)
+ return TRUE
+ for(var/datum/space_chunk/C in children)
+ if(C.can_fit_space(w, h))
+ return TRUE
+ return FALSE
+
+// Recursively drops down the tree and finds the most efficient chunk to use
+/datum/space_chunk/proc/get_optimal_chunk(w, h)
+ if(w > width || h > height)
+ return null
+ if(occupied)
+ return null
+ if(is_empty)
+ return src
+ var/datum/space_chunk/optimal_chunk
+ var/optimal_chunk_optimalness = 99999
+ for(var/datum/space_chunk/C in children)
+ var/datum/space_chunk/C2 = C.get_optimal_chunk(w, h)
+ if(!C2)
+ continue
+ var/optimalness = C2.width + C2.height-w-h
+ if(optimalness < optimal_chunk_optimalness)
+ optimal_chunk_optimalness = optimalness
+ optimal_chunk = C2
+ return optimal_chunk
+
+/datum/space_chunk/proc/set_occupied(new_occupied)
+ var/datum/space_chunk/C = parent
+ if(new_occupied)
+ occupied = TRUE
+ while(C)
+ C.is_empty = FALSE
+ C = C.parent
+ else
+ occupied = FALSE
+ while(C)
+ var/is_children_empty = TRUE
+ for(var/datum/space_chunk/C2 in C.children)
+ if(!C2.is_empty || C2.occupied)
+ is_children_empty = FALSE
+ if(!is_children_empty)
+ break
+ C.is_empty = TRUE
+ C = C.parent
+
/datum/space_chunk/proc/check_sanity()
var/i_am_sane = 1
i_am_sane |= (x > 0)
diff --git a/code/modules/space_management/zlevel_manager.dm b/code/modules/space_management/zlevel_manager.dm
index d0bb9455eb8..087a70657ed 100644
--- a/code/modules/space_management/zlevel_manager.dm
+++ b/code/modules/space_management/zlevel_manager.dm
@@ -134,18 +134,36 @@ var/global/datum/zlev_manager/space_manager = new
/datum/zlev_manager/proc/add_new_heap()
world.maxz++
var/our_z = world.maxz
- var/datum/space_level/yup = new /datum/space_level/heap(our_z)
+ var/datum/space_level/yup = new /datum/space_level/heap(our_z, traits = list(BLOCK_TELEPORT, ADMIN_LEVEL))
z_list["[our_z]"] = yup
return yup
// This is what you can call to allocate a section of space
// Later, I'll add an argument to let you define the flags on the region
/datum/zlev_manager/proc/allocate_space(width, height)
+ if(width > world.maxx || height > world.maxy)
+ throw EXCEPTION("Too much space requested! \[[width],[height]\]")
if(!heaps.len)
heaps.len++
heaps[heaps.len] = add_new_heap()
var/datum/space_level/heap/our_heap
+ var/weve_got_vacancy = 0
for(our_heap in heaps)
- var/weve_got_vacancy = our_heap.request(width, height)
+ weve_got_vacancy = our_heap.request(width, height)
if(weve_got_vacancy)
break // We're sticking with the present value of `our_heap` - it's got room
+ // This loop will also run out if no vacancies are found
+
+ if(!weve_got_vacancy)
+ heaps.len++
+ our_heap = add_new_heap()
+ heaps[heaps.len] = our_heap
+ return our_heap.allocate(width, height)
+
+/datum/zlev_manager/proc/free_space(datum/space_chunk/C)
+ if(!istype(C))
+ return
+ var/datum/space_level/heap/heap = z_list["[C.zpos]"]
+ if(!istype(heap))
+ throw EXCEPTION("Attempted to free chunk at invalid z-level ([C.x],[C.y],[C.zpos]) [C.width]x[C.height]")
+ heap.free(C)
diff --git a/code/modules/spacepods/parts.dm b/code/modules/spacepods/parts.dm
index d1aefb535e6..757d7a95dcc 100644
--- a/code/modules/spacepods/parts.dm
+++ b/code/modules/spacepods/parts.dm
@@ -55,7 +55,7 @@
return 0
return connectedparts
-/obj/item/pod_parts/pod_frame/attackby(var/obj/O, mob/user)
+/obj/item/pod_parts/pod_frame/attackby(var/obj/item/O, mob/user)
if(istype(O, /obj/item/stack/rods))
var/obj/item/stack/rods/R = O
var/list/linkedparts = find_square()
@@ -71,12 +71,12 @@
//log_admin("Repositioning")
pod.loc = F.loc
qdel(F)
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
if(istype(O, /obj/item/weapon/wrench))
to_chat(user, "You [!anchored ? "secure \the [src] in place." : "remove the securing bolts."]")
anchored = !anchored
density = anchored
- playsound(get_turf(src), 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(get_turf(src), O.usesound, 50, 1)
/obj/item/pod_parts/pod_frame/verb/rotate()
set name = "Rotate Frame"
diff --git a/code/modules/spacepods/spacepod.dm b/code/modules/spacepods/spacepod.dm
index af18daa893a..1d883771b25 100644
--- a/code/modules/spacepods/spacepod.dm
+++ b/code/modules/spacepods/spacepod.dm
@@ -311,7 +311,7 @@
if(iscrowbar(W))
if(!equipment_system.lock_system || unlocked || hatch_open)
hatch_open = !hatch_open
- playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
+ playsound(loc, W.usesound, 50, 1)
to_chat(user, "You [hatch_open ? "open" : "close"] the maintenance hatch.")
else
to_chat(user, "The hatch is locked shut!")
@@ -369,8 +369,8 @@
return
if(health < initial(health))
to_chat(user, "\blue You start welding the spacepod...")
- playsound(loc, 'sound/items/Welder.ogg', 50, 1)
- if(do_after(user, 20, target = src))
+ playsound(loc, W.usesound, 50, 1)
+ if(do_after(user, 20 * W.toolspeed, target = src))
if(!src || !WT.remove_fuel(3, user)) return
repair_damage(10)
to_chat(user, "\blue You mend some [pick("dents","bumps","damage")] with \the [WT]")
@@ -383,7 +383,7 @@
if(L.on && equipment_system.lock_system)
user.visible_message(user, "[user] is drilling through the [src]'s lock!",
"You start drilling through the [src]'s lock!")
- if(do_after(user, 100, target = src))
+ if(do_after(user, 100 * W.toolspeed, target = src))
qdel(equipment_system.lock_system)
equipment_system.lock_system = null
user.visible_message(user, "[user] has destroyed the [src]'s lock!",
diff --git a/code/modules/station_goals/bsa.dm b/code/modules/station_goals/bsa.dm
index 89a58d7cc9e..a2f3a047dae 100644
--- a/code/modules/station_goals/bsa.dm
+++ b/code/modules/station_goals/bsa.dm
@@ -312,7 +312,7 @@
ui.open()
ui.set_auto_update(1)
-/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state)
+/obj/machinery/computer/bsa_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/list/data = list()
data["connected"] = cannon
data["notice"] = notice
diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm
index 26d00e6360d..03f119d62c4 100644
--- a/code/modules/station_goals/dna_vault.dm
+++ b/code/modules/station_goals/dna_vault.dm
@@ -211,7 +211,7 @@ var/list/non_simple_animals = typecacheof(list(/mob/living/carbon/human/monkey,/
L += pick_n_take(possible_powers)
power_lottery[user] = L
-/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state) //TODO Make it % bars maybe
+/obj/machinery/dna_vault/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state) //TODO Make it % bars maybe
var/list/data = list()
data["plants"] = plants.len
data["plants_max"] = plants_max
diff --git a/code/modules/station_goals/shield.dm b/code/modules/station_goals/shield.dm
index 36f8c868cf6..8a7484626be 100644
--- a/code/modules/station_goals/shield.dm
+++ b/code/modules/station_goals/shield.dm
@@ -71,7 +71,7 @@
if(S.id == id && atoms_share_level(src, S))
S.toggle()
-/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = physical_state)
+/obj/machinery/computer/sat_control/ui_data(mob/user, ui_key = "main", datum/topic_state/state = default_state)
var/list/data = list()
data["satellites"] = list()
diff --git a/code/modules/surgery/organs/augments_internal.dm b/code/modules/surgery/organs/augments_internal.dm
index 153f169efca..ffd0b4f0b1e 100644
--- a/code/modules/surgery/organs/augments_internal.dm
+++ b/code/modules/surgery/organs/augments_internal.dm
@@ -8,17 +8,17 @@
var/implant_overlay
tough = 1 //not easyly broken by combat damage
sterile = 1 //not very germy
+ robotic = 2 // these are cybernetic after all
/obj/item/organ/internal/cyberimp/New(var/mob/M = null)
- if(iscarbon(M))
- src.insert(M)
+ . = ..()
if(implant_overlay)
var/image/overlay = new /image(icon, implant_overlay)
overlay.color = implant_color
overlays |= overlay
- return ..()
-
+/obj/item/organ/internal/cyberimp/emp_act()
+ return // These shouldn't be hurt by EMPs in the standard way
//[[[[BRAIN]]]]
@@ -270,9 +270,15 @@
var/lasthand = null
/obj/item/organ/internal/cyberimp/chest/arm_mod/ui_action_click()
+ toggle_item()
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/toggle_item()
if(overloaded)//ensure the implant isn't broken
to_chat(owner, "The implant doesn't respond. It seems to be broken...")
return
+ owner.changeNext_move(CLICK_CD_MELEE)
+ if(owner.next_move < world.time)
+ return // No spam
if(out)//check if the owner has the item out already
owner.unEquip(holder, 1)//if he does, take it away. then,
holder.loc = null//stash it in nullspace
@@ -297,6 +303,9 @@
holder.loc = null
out = 0
owner.visible_message("[holder] forcibly retracts into [owner]'s arm.")
+ overload() // Make sure this doesn't happen again
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/proc/overload()
owner.visible_message("A loud bang comes from [owner]...")
playsound(get_turf(owner), 'sound/effects/bang.ogg', 100, 1)
to_chat(owner, "You feel an explosion erupt inside you as your chest implant breaks. Is it hot in here?")
@@ -312,7 +321,7 @@
limb.droplimb(0, DROPLIMB_EDGE)
owner.say("I HAVE BEEN DISARMED!!!")
owner.adjustFireLoss(25)//severely injure him!
- overloaded = 1//then make sure this can't happen again by breaking the implant.
+ overloaded = TRUE
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase//mounted, self-charging taser!
name = "Arm-cannon taser implant"
@@ -322,6 +331,7 @@
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/tase/New()//when the implant is created...
+ ..()
holder = new /obj/item/weapon/gun/energy/gun/advtaser/mounted(src)//assign a brand new item to it. (in this case, a gun)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase//mounted, self-charging laser!
@@ -332,8 +342,88 @@
actions_types = list(/datum/action/item_action/organ_action/toggle)
/obj/item/organ/internal/cyberimp/chest/arm_mod/lase/New()
+ ..()
holder = new /obj/item/weapon/gun/energy/laser/mounted(src)
+// lets make IPCs even *more* vulnerable to EMPs!
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord
+ name = "APC-compatible power adapter implant"
+ desc = "An implant commonly installed inside IPCs in order to allow them to easily collect energy from their environment"
+ origin_tech = "materials=3;biotech=2;powerstorage=3"
+ slot = "shoulders2"
+ actions_types = list(/datum/action/item_action/organ_action/toggle)
+
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/New()
+ ..()
+ holder = new /obj/item/apc_powercord(src)
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/overload()
+ // To allow repair via nanopaste/screwdriver
+ // also so IPCs don't also catch on fire and fall even more apart upon EMP
+ damage = 1
+ overloaded = TRUE
+
+/obj/item/organ/internal/cyberimp/chest/arm_mod/power_cord/surgeryize()
+ if(overloaded && owner)
+ to_chat(owner, "Your [src] feels functional again.")
+ overloaded = FALSE
+
+
+/obj/item/apc_powercord
+ name = "power cable"
+ desc = "Insert into a nearby APC to draw power from it."
+ icon = 'icons/obj/power.dmi'
+ icon_state = "wire1"
+ flags = NODROP | NOBLUDGEON
+
+/obj/item/apc_powercord/afterattack(atom/target, mob/user, proximity_flag, click_parameters)
+ if(!istype(target, /obj/machinery/power/apc) || !ishuman(user) || !proximity_flag)
+ return ..()
+ user.changeNext_move(CLICK_CD_MELEE)
+ var/obj/machinery/power/apc/A = target
+ var/mob/living/carbon/human/H = user
+ if(H.get_int_organ(/obj/item/organ/internal/cell))
+ if(A.emagged || A.stat & BROKEN)
+ var/datum/effect/system/spark_spread/s = new /datum/effect/system/spark_spread
+ s.set_up(3, 1, A)
+ s.start()
+ to_chat(H, "The APC power currents surge erratically, damaging your chassis!")
+ H.adjustFireLoss(10,0)
+ else if(A.cell && A.cell.charge > 0)
+ if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
+ to_chat(user, "You are already fully charged!")
+ else
+ addtimer(src, "powerdraw_loop", 0, TRUE, A, H)
+ else
+ to_chat(user, "There is no charge to draw from that APC.")
+ else
+ to_chat(user, "You lack a cell in which to store charge!")
+
+/obj/item/apc_powercord/proc/powerdraw_loop(obj/machinery/power/apc/A, mob/living/carbon/human/H)
+ H.visible_message("[H] inserts a power connector into \the [A].", "You begin to draw power from \the [A].")
+ while(do_after(H, 10, target = A))
+ if(loc != H)
+ to_chat(H, "You must keep your connector out while charging!")
+ break
+ if(A.cell.charge == 0)
+ to_chat(H, "\The [A] has no more charge.")
+ break
+ A.charging = 1
+ if(A.cell.charge >= 500)
+ H.nutrition += 50
+ A.cell.charge -= 500
+ to_chat(H, "You siphon off some of the stored charge for your own use.")
+ else
+ H.nutrition += A.cell.charge/10
+ A.cell.charge = 0
+ to_chat(H, "You siphon off the last of \the [A]'s charge.")
+ break
+ if(H.nutrition > NUTRITION_LEVEL_WELL_FED)
+ to_chat(H, "You are now fully charged.")
+ break
+ H.visible_message("[H] unplugs from \the [A].", "You unplug from \the [A].")
+
//BOX O' IMPLANTS
/obj/item/weapon/storage/box/cyber_implants
diff --git a/code/modules/surgery/organs/autoimplanter.dm b/code/modules/surgery/organs/autoimplanter.dm
index 5c2aa1193d9..4af88abc52f 100644
--- a/code/modules/surgery/organs/autoimplanter.dm
+++ b/code/modules/surgery/organs/autoimplanter.dm
@@ -4,6 +4,7 @@
icon_state = "autoimplanter"
item_state = "walkietalkie"//left as this so as to intentionally not have inhands
w_class = 2
+ usesound = 'sound/weapons/circsawhit.ogg'
var/obj/item/organ/internal/cyberimp/storedorgan
/obj/item/device/autoimplanter/attack_self(mob/user)//when the object it used...
@@ -12,7 +13,7 @@
return
storedorgan.insert(user)//insert stored organ into the user
user.visible_message("[user] presses a button on [src], and you hear a short mechanical noise.", "You feel a sharp sting as [src] plunges into your body.")
- playsound(get_turf(user), 'sound/weapons/circsawhit.ogg', 50, 1)
+ playsound(get_turf(user), usesound, 50, 1)
storedorgan = null
/obj/item/device/autoimplanter/attackby(obj/item/I, mob/user, params)
@@ -32,4 +33,4 @@
storedorgan.forceMove(get_turf(user))
storedorgan = null
to_chat(user, "You remove the [storedorgan] from [src].")
- playsound(get_turf(user), 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(get_turf(user), I.usesound, 50, 1)
diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm
index 8de7cccd2d6..0906b3c63c5 100644
--- a/code/modules/surgery/organs/organ_internal.dm
+++ b/code/modules/surgery/organs/organ_internal.dm
@@ -11,9 +11,9 @@
var/non_primary = 0
/obj/item/organ/internal/New(var/mob/living/carbon/holder)
+ ..()
if(istype(holder))
insert(holder)
- ..()
/obj/item/organ/internal/Destroy()
if(owner)
@@ -412,7 +412,8 @@
colourmatrix = null
dark_view = 2
..() //Make sure the organ's got the robotic status indicators before updating the client colour.
- owner.update_client_colour(0) //Since both mechassisted and mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine as mechassist() will call it anyway.
+ if(owner)
+ owner.update_client_colour(0) //Since both mechassisted and mechanical eyes give dark_view of 2 and full colour vision atm, just having this here is fine as mechassist() will call it anyway.
/obj/item/organ/internal/mechassist()
..() //Go back, call robotize(), adjust the robotic status indicators and the organ damage parameters.
diff --git a/code/modules/surgery/robotics.dm b/code/modules/surgery/robotics.dm
index d3d5345cb0b..e1dc252412d 100644
--- a/code/modules/surgery/robotics.dm
+++ b/code/modules/surgery/robotics.dm
@@ -398,11 +398,16 @@
return
var/obj/item/organ/external/affected = target.get_organ(target_zone)
+ var/found_damaged_organ = FALSE
for(var/obj/item/organ/internal/I in affected.internal_organs)
- if(I && I.damage > 0)
- if(I.robotic >= 2)
- user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
- "You start mending the damage to [target]'s [I.name]'s mechanisms." )
+ if(I && I.damage > 0 && I.robotic >= 2)
+ user.visible_message("[user] starts mending the damage to [target]'s [I.name]'s mechanisms.", \
+ "You start mending the damage to [target]'s [I.name]'s mechanisms.")
+ found_damaged_organ = TRUE
+
+ if(!found_damaged_organ)
+ to_chat(user, "There are no damaged components in [affected].")
+ return -1
target.custom_pain("The pain in your [affected.name] is living hell!",1)
@@ -425,6 +430,7 @@
user.visible_message(" [user] repairs [target]'s [I.name] with [tool].", \
" You repair [target]'s [I.name] with [tool]." )
I.damage = 0
+ I.surgeryize()
else if(current_type == "insert")
var/obj/item/organ/internal/I = tool
diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm
index defa57b3ca4..9ed77cd2c9f 100644
--- a/code/modules/surgery/surgery.dm
+++ b/code/modules/surgery/surgery.dm
@@ -109,13 +109,8 @@
if(implement_type) //this means it isn't a require nd or any item step.
prob_chance = min(allowed_tools[implement_type], 100)
prob_chance *= get_location_modifier(target)
-
- if(prob_chance > 100)//if we are using a super tool
- time = time/prob_chance //PLACEHOLDER VALUES
- if(do_after(user, time, target = target))
-
-
+ if(do_after(user, time * tool.toolspeed, target = target))
if(prob(prob_chance) || isrobot(user))
if(end_step(user, target, target_zone, tool, surgery))
advance = 1
diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm
index 2e47438eb44..27ed3895a2c 100644
--- a/code/modules/surgery/tools.dm
+++ b/code/modules/surgery/tools.dm
@@ -89,6 +89,7 @@
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.8
/obj/item/weapon/scalpel/laser2
name = "laser scalpel"
@@ -97,6 +98,7 @@
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.6
/obj/item/weapon/scalpel/laser3
name = "laser scalpel"
@@ -105,6 +107,7 @@
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.4
/obj/item/weapon/scalpel/manager //super tool! Retractor/hemostat
name = "incision management system"
@@ -113,6 +116,7 @@
item_state = "scalpel"
damtype = "fire"
hitsound = 'sound/weapons/sear.ogg'
+ toolspeed = 0.2
/obj/item/weapon/circular_saw
name = "circular saw"
diff --git a/code/modules/telesci/bscrystal.dm b/code/modules/telesci/bscrystal.dm
index a2ee8cc85ca..113d2abd751 100644
--- a/code/modules/telesci/bscrystal.dm
+++ b/code/modules/telesci/bscrystal.dm
@@ -9,6 +9,8 @@
points = 50
var/blink_range = 8 // The teleport range when crushed/thrown at someone.
refined_type = /obj/item/stack/sheet/bluespace_crystal
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/weapon/ore/bluespace_crystal/New()
..()
@@ -58,6 +60,8 @@ var/global/list/datum/stack_recipe/bluespace_crystal_recipes = list(new/datum/st
desc = "A stable polycrystal, made of fused-together bluespace crystals. You could probably break one off."
origin_tech = "bluespace=4;materials=3"
attack_verb = list("bluespace polybashed", "bluespace polybattered", "bluespace polybludgeoned", "bluespace polythrashed", "bluespace polysmashed")
+ toolspeed = 1
+ usesound = 'sound/items/Deconstruct.ogg'
/obj/item/stack/sheet/bluespace_crystal/New()
..()
diff --git a/code/modules/telesci/telepad.dm b/code/modules/telesci/telepad.dm
index 0f1f7c8f582..ed330821f06 100644
--- a/code/modules/telesci/telepad.dm
+++ b/code/modules/telesci/telepad.dm
@@ -67,7 +67,7 @@
var/stage = 0
/obj/machinery/telepad_cargo/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/wrench))
- playsound(src, 'sound/items/Ratchet.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
if(anchored)
anchored = 0
to_chat(user, " The [src] can now be moved.")
@@ -76,15 +76,15 @@
to_chat(user, " The [src] is now secured.")
if(istype(W, /obj/item/weapon/screwdriver))
if(stage == 0)
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You unscrew the telepad's tracking beacon.")
stage = 1
else if(stage == 1)
- playsound(src, 'sound/items/Screwdriver.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You screw in the telepad's tracking beacon.")
stage = 0
if(istype(W, /obj/item/weapon/weldingtool) && stage == 1)
- playsound(src, 'sound/items/Welder.ogg', 50, 1)
+ playsound(src, W.usesound, 50, 1)
to_chat(user, " You disassemble the telepad.")
new /obj/item/stack/sheet/metal(get_turf(src))
new /obj/item/stack/sheet/glass(get_turf(src))
@@ -119,6 +119,8 @@
throwforce = 10.0
throw_speed = 2
throw_range = 5
+ toolspeed = 1
+ usesound = 'sound/machines/click.ogg'
var/obj/item/weapon/stock_parts/cell/high/rcell = null
var/obj/machinery/pad = null
var/mode = 0
diff --git a/config/example/away_mission_config.txt b/config/example/away_mission_config.txt
index fe3980fef8f..1fc8b0ce3b6 100644
--- a/config/example/away_mission_config.txt
+++ b/config/example/away_mission_config.txt
@@ -10,7 +10,6 @@
#===================================#
# BROKEN / INCOMPLETE AWAY MISSIONS #
#===================================#
-#_maps/map_files/RandomZLevels/challenge.dmm
#_maps/map_files/RandomZLevels/centcomAway.dmm
#_maps/map_files/RandomZLevels/example.dmm
#_maps/map_files/RandomZLevels/spacebattle.dmm
diff --git a/html/changelog.html b/html/changelog.html
index 40498438f45..d13d886de36 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,86 @@
-->
+
09 March 2017
+
Markolie updated:
+
+ - Tools now have a "usesound" and "toolspeed" variable which allows different tool (levels) to have different sounds and speeds.
+ - Robots spawn with tools that are twice as fast as regular tools.
+ - Abductor agents now spawn with a toolbelt with specialized abductor tools that are very fast.
+ - Abductor surgery tools are now much faster.
+ - Abductor (surgery) tools can now be constructed in R&D with a sufficiently high "abductor" research level.
+ - The abductor multitool will now display what each wire does.
+ - Admin ghosts can now interact with wires and see what each wire does.
+ - Adds a set of unique tools for the Chief Engineer that he is given in a unique toolbelt at roundstart. These tools are faster and can be created in R&D with a sufficiently high R&D level.
+ - The AI detector has been refactored to have much more robust AI tracking.
+
+
+
08 March 2017
+
Alffd updated:
+
+ - Farting on a bible now puts you at the mercy of the gods.
+ - Removed automatic biblefarting gibbing.
+
+
FlaaaaaattestGuitar updated:
+
+ - Magistrate now starts their shift with a pair of white gloves as well as Bridge and Meeting Room access.
+
+
Fox McCloud updated:
+
+ - money is now far easier to use, and distribute in amounts you would like
+
+
Kyep updated:
+
+ - Changed event probabilities, aiming for a more fun late game. In general, events that do very little (e.g: meaty ores, rogue drones) are less likely. Events that will keep people on their toes (e.g: anomalies) are more likely. Events that might cause people to observe rather than joining the round (e.g: Xenos) are less likely.
+
+
uraniummeltdown updated:
+
+ - Wizard Hardsuit helmet and suit now have inhand sprites
+
+
+
07 March 2017
+
Crazylemon64 updated:
+
+ - IPCs now come with a power cord implant to use to recharge from APCs.
+ - IPCs can now be genderless.
+
+
Kyep updated:
+
+ - Deleted 'challenge' away mission.
+
+
MarsM0nd updated:
+
+ - Cultists get shoes on usage of the armor talisman.
+ - Cultists only get equipment if they have the slot for it free, weapons are always spawned.
+ - The tome does a more fitting description of the talisman of armor.
+
+
+
05 March 2017
+
Kyep updated:
+
+ - Added Poison Pen, a stealthy way of applying a contact-based poison to paper. Available to Syndicate HoPs, QMs, and Cargo Techs.
+ - Antags whose objectives are manually announced by an admin, or altered automatically as a result of their target cryoing, will now hear a warning sound. The sound is the same as the 'crew transfer vote called' sound. Additionally, the text notice for changed objectives is more obvious.
+
+
MarsM0nd updated:
+
+ - The grey satchel uses now the correct sprite instead of the leather one.
+
+
+
04 March 2017
+
Markolie updated:
+
+ - Ghosts can now interact with ore dispensers, mining equipment vendors and laptop vendors.
+ - Admins can now interact with crates, closets, false walls and conveyor switches if they have advanced interaction enabled.
+
+
davipatury updated:
+
+ - Newscaster now uses Nano-UI.
+ - Tank dispenser now uses Nano-UI.
+ - Passive gate, pump and volume pump now uses Nano-UI.
+ - Atmospherics filter and mixer now uses Nano-UI.
+ - Wires now uses Nano-UI.
+
+
03 March 2017
FlauntestGuitar updated:
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index 4c1ad6a3789..92654fb69a1 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -3953,3 +3953,69 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscadd: You can now change the input/output directons for Ore Redemption Machines
by using a multitool on them with the panel open.
- rscadd: Bluespace RPED beams have a new sprite
+2017-03-04:
+ Markolie:
+ - rscadd: Ghosts can now interact with ore dispensers, mining equipment vendors
+ and laptop vendors.
+ - rscadd: Admins can now interact with crates, closets, false walls and conveyor
+ switches if they have advanced interaction enabled.
+ davipatury:
+ - rscadd: Newscaster now uses Nano-UI.
+ - rscadd: Tank dispenser now uses Nano-UI.
+ - rscadd: Passive gate, pump and volume pump now uses Nano-UI.
+ - rscadd: Atmospherics filter and mixer now uses Nano-UI.
+ - rscadd: Wires now uses Nano-UI.
+2017-03-05:
+ Kyep:
+ - rscadd: Added Poison Pen, a stealthy way of applying a contact-based poison to
+ paper. Available to Syndicate HoPs, QMs, and Cargo Techs.
+ - tweak: Antags whose objectives are manually announced by an admin, or altered
+ automatically as a result of their target cryoing, will now hear a warning sound.
+ The sound is the same as the 'crew transfer vote called' sound. Additionally,
+ the text notice for changed objectives is more obvious.
+ MarsM0nd:
+ - bugfix: The grey satchel uses now the correct sprite instead of the leather one.
+2017-03-07:
+ Crazylemon64:
+ - rscadd: IPCs now come with a power cord implant to use to recharge from APCs.
+ - tweak: IPCs can now be genderless.
+ Kyep:
+ - rscdel: Deleted 'challenge' away mission.
+ MarsM0nd:
+ - rscadd: Cultists get shoes on usage of the armor talisman.
+ - rscadd: Cultists only get equipment if they have the slot for it free, weapons
+ are always spawned.
+ - tweak: The tome does a more fitting description of the talisman of armor.
+2017-03-08:
+ Alffd:
+ - rscadd: Farting on a bible now puts you at the mercy of the gods.
+ - rscdel: Removed automatic biblefarting gibbing.
+ FlaaaaaattestGuitar:
+ - tweak: Magistrate now starts their shift with a pair of white gloves as well as
+ Bridge and Meeting Room access.
+ Fox McCloud:
+ - tweak: money is now far easier to use, and distribute in amounts you would like
+ Kyep:
+ - tweak: 'Changed event probabilities, aiming for a more fun late game. In general,
+ events that do very little (e.g: meaty ores, rogue drones) are less likely.
+ Events that will keep people on their toes (e.g: anomalies) are more likely.
+ Events that might cause people to observe rather than joining the round (e.g:
+ Xenos) are less likely.'
+ uraniummeltdown:
+ - rscadd: Wizard Hardsuit helmet and suit now have inhand sprites
+2017-03-09:
+ Markolie:
+ - tweak: Tools now have a "usesound" and "toolspeed" variable which allows different
+ tool (levels) to have different sounds and speeds.
+ - tweak: Robots spawn with tools that are twice as fast as regular tools.
+ - rscadd: Abductor agents now spawn with a toolbelt with specialized abductor tools
+ that are very fast.
+ - tweak: Abductor surgery tools are now much faster.
+ - rscadd: Abductor (surgery) tools can now be constructed in R&D with a sufficiently
+ high "abductor" research level.
+ - tweak: The abductor multitool will now display what each wire does.
+ - rscadd: Admin ghosts can now interact with wires and see what each wire does.
+ - rscadd: Adds a set of unique tools for the Chief Engineer that he is given in
+ a unique toolbelt at roundstart. These tools are faster and can be created in
+ R&D with a sufficiently high R&D level.
+ - tweak: The AI detector has been refactored to have much more robust AI tracking.
diff --git a/icons/goonstation/objects/money.dmi b/icons/goonstation/objects/money.dmi
new file mode 100644
index 00000000000..c4f6508f025
Binary files /dev/null and b/icons/goonstation/objects/money.dmi differ
diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi
index b6089236f2a..93630adce9a 100644
Binary files a/icons/mob/belt.dmi and b/icons/mob/belt.dmi differ
diff --git a/icons/mob/clothing/paranormal_hardsuit.dmi b/icons/mob/clothing/paranormal_hardsuit.dmi
deleted file mode 100644
index f06e81ab1e7..00000000000
Binary files a/icons/mob/clothing/paranormal_hardsuit.dmi and /dev/null differ
diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi
index 1113f10464a..71fd4a13455 100644
Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ
diff --git a/icons/mob/inhands/clothing_lefthand.dmi b/icons/mob/inhands/clothing_lefthand.dmi
index 34e2a6ce696..5f799ea0643 100644
Binary files a/icons/mob/inhands/clothing_lefthand.dmi and b/icons/mob/inhands/clothing_lefthand.dmi differ
diff --git a/icons/mob/inhands/clothing_righthand.dmi b/icons/mob/inhands/clothing_righthand.dmi
index 2753f52dfee..c7046c1051d 100644
Binary files a/icons/mob/inhands/clothing_righthand.dmi and b/icons/mob/inhands/clothing_righthand.dmi differ
diff --git a/icons/mob/species/drask/helmet.dmi b/icons/mob/species/drask/helmet.dmi
index 9c4ccd89c4b..b1ffbe8056f 100644
Binary files a/icons/mob/species/drask/helmet.dmi and b/icons/mob/species/drask/helmet.dmi differ
diff --git a/icons/mob/species/drask/suit.dmi b/icons/mob/species/drask/suit.dmi
index b7631041271..6e608313eda 100644
Binary files a/icons/mob/species/drask/suit.dmi and b/icons/mob/species/drask/suit.dmi differ
diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi
index 8e2965371c0..97f3c7626c4 100644
Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ
diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi
index d0a12f2d0da..5e6d99b2ae8 100644
Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ
diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi
index 49f209387bf..c32a10e3e68 100644
Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ
diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi
index eedf3501cb1..d433101f40e 100644
Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ
diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi
index 9f40a0620f6..c7f59be3103 100644
Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ
diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi
index 7b02fd15c85..dda4c5eebf7 100644
Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ
diff --git a/icons/mob/species/vox/helmet.dmi b/icons/mob/species/vox/helmet.dmi
index 3510b731987..4f76b05427b 100644
Binary files a/icons/mob/species/vox/helmet.dmi and b/icons/mob/species/vox/helmet.dmi differ
diff --git a/icons/mob/species/vox/suit.dmi b/icons/mob/species/vox/suit.dmi
index 503eb3a0161..cbf9508096d 100644
Binary files a/icons/mob/species/vox/suit.dmi and b/icons/mob/species/vox/suit.dmi differ
diff --git a/icons/mob/species/vulpkanin/helmet.dmi b/icons/mob/species/vulpkanin/helmet.dmi
index 9be69155ee3..1fb7f5be545 100644
Binary files a/icons/mob/species/vulpkanin/helmet.dmi and b/icons/mob/species/vulpkanin/helmet.dmi differ
diff --git a/icons/mob/species/vulpkanin/suit.dmi b/icons/mob/species/vulpkanin/suit.dmi
index ad946a3805b..ea5e2b4c71e 100644
Binary files a/icons/mob/species/vulpkanin/suit.dmi and b/icons/mob/species/vulpkanin/suit.dmi differ
diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi
index f93e02f0c61..7c532ab179f 100644
Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ
diff --git a/icons/mob/suit_fat.dmi b/icons/mob/suit_fat.dmi
index a5cb6b72066..79bed1d0538 100644
Binary files a/icons/mob/suit_fat.dmi and b/icons/mob/suit_fat.dmi differ
diff --git a/icons/obj/abductor.dmi b/icons/obj/abductor.dmi
index 9a171b97645..7bcd0607116 100644
Binary files a/icons/obj/abductor.dmi and b/icons/obj/abductor.dmi differ
diff --git a/icons/obj/clothing/belts.dmi b/icons/obj/clothing/belts.dmi
index ae8fa296794..cfcfec6e283 100644
Binary files a/icons/obj/clothing/belts.dmi and b/icons/obj/clothing/belts.dmi differ
diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi
index bd1ef93cb93..eda858cea16 100644
Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi
index f5a7f54df0d..c2d81d0d54f 100644
Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ
diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi
index 64bee068fa8..0d67f1f9c71 100644
Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi
index e83fc173fee..e41451f71f8 100644
Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ
diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi
index c107c13e415..34fe4b4529c 100644
Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ
diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi
index 6023ff01ee5..be2fb4f62aa 100644
Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ
diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi
index d5875e74191..79937731e82 100644
Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ
diff --git a/icons/obj/clothing/species/vox/hats.dmi b/icons/obj/clothing/species/vox/hats.dmi
index 714e98e1878..d8b26b1239f 100644
Binary files a/icons/obj/clothing/species/vox/hats.dmi and b/icons/obj/clothing/species/vox/hats.dmi differ
diff --git a/icons/obj/clothing/species/vox/suits.dmi b/icons/obj/clothing/species/vox/suits.dmi
index 1d0873b9661..b90b92ae3b2 100644
Binary files a/icons/obj/clothing/species/vox/suits.dmi and b/icons/obj/clothing/species/vox/suits.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/hats.dmi b/icons/obj/clothing/species/vulpkanin/hats.dmi
index ee64e02158f..7255d8aef43 100644
Binary files a/icons/obj/clothing/species/vulpkanin/hats.dmi and b/icons/obj/clothing/species/vulpkanin/hats.dmi differ
diff --git a/icons/obj/clothing/species/vulpkanin/suits.dmi b/icons/obj/clothing/species/vulpkanin/suits.dmi
index 22617558677..edc41bffec4 100644
Binary files a/icons/obj/clothing/species/vulpkanin/suits.dmi and b/icons/obj/clothing/species/vulpkanin/suits.dmi differ
diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi
index a0fd3b51210..a131fc14f04 100644
Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index 6e749fc11ec..afa4f586504 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/icons/obj/money.dmi b/icons/obj/money.dmi
deleted file mode 100644
index 5a053c07e05..00000000000
Binary files a/icons/obj/money.dmi and /dev/null differ
diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi
index 6c3fdcf2bee..d021f5d02b1 100644
Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ
diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi
index 77ca6983164..00f5ac98691 100644
Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ
diff --git a/nano/templates/appearance_changer.tmpl b/nano/templates/appearance_changer.tmpl
index 47a3ce113e2..5e705b2fe46 100644
--- a/nano/templates/appearance_changer.tmpl
+++ b/nano/templates/appearance_changer.tmpl
@@ -19,6 +19,9 @@
{{:helper.link('Male', null, { 'gender' : 'male'}, null, data.gender == 'male' ? 'selected' : null)}}
{{:helper.link('Female', null, { 'gender' : 'female'}, null, data.gender == 'female' ? 'selected' : null)}}
+ {{if !data.has_gender}}
+ {{:helper.link('Genderless', null, { 'gender' : 'plural'}, null, data.gender == 'plural' ? 'selected' : null)}}
+ {{/if}}
{{/if}}
diff --git a/nano/templates/atmos_filter.tmpl b/nano/templates/atmos_filter.tmpl
new file mode 100644
index 00000000000..e0715e243c5
--- /dev/null
+++ b/nano/templates/atmos_filter.tmpl
@@ -0,0 +1,24 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+
+
Filter:
+
+ {{:helper.link('Nothing', null, {'filter' : -1}, data.filter_type == -1 ? 'selected' : null)}}
+ {{:helper.link('Plasma', null, {'filter' : 0}, data.filter_type == 0 ? 'selected' : null)}}
+ {{:helper.link('O2', null, {'filter' : 1}, data.filter_type == 1 ? 'selected' : null)}}
+ {{:helper.link('N2', null, {'filter' : 2}, data.filter_type == 2 ? 'selected' : null)}}
+ {{:helper.link('CO2', null, {'filter' : 3}, data.filter_type == 3 ? 'selected' : null)}}
+ {{:helper.link('N2O', null, {'filter' : 4}, data.filter_type == 4 ? 'selected' : null)}}
+
+
+
diff --git a/nano/templates/atmos_mixer.tmpl b/nano/templates/atmos_mixer.tmpl
new file mode 100644
index 00000000000..3bae7f993bd
--- /dev/null
+++ b/nano/templates/atmos_mixer.tmpl
@@ -0,0 +1,32 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+
+
Node 1:
+
+ {{:helper.link('', null, {'node1' : -0.1}, data.node1_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node1' : -0.01}, data.node1_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node1' : 0.01}, data.node1_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node1' : 0.1}, data.node1_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.node1_concentration)}}%
+
+
+
+
Node 2:
+
+ {{:helper.link('', null, {'node2' : -0.1}, data.node2_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node2' : -0.01}, data.node2_concentration == 0 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node2' : 0.01}, data.node2_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.link('', null, {'node2' : 0.1}, data.node2_concentration == 100 ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.node2_concentration)}}%
+
+
\ No newline at end of file
diff --git a/nano/templates/atmos_pump.tmpl b/nano/templates/atmos_pump.tmpl
new file mode 100644
index 00000000000..a27e5b710dd
--- /dev/null
+++ b/nano/templates/atmos_pump.tmpl
@@ -0,0 +1,24 @@
+
+
Power:
+
{{:helper.link(data.on ? 'On' : 'Off', data.on ? 'power-off' : 'times', {'power' : 1}, null, data.on ? 'selected' : null)}}
+
+{{if data.max_rate}}
+
+
Transfer Rate:
+
+ {{:helper.link('Set', 'pencil', {'rate' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'rate' : 'max'}, data.rate == data.max_rate ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.rate)}} L/s
+
+
+{{else}}
+
+
Output Pressure:
+
+ {{:helper.link('Set', 'pencil', {'pressure' : 'input'})}}
+ {{:helper.link('Max', 'plus', {'pressure' : 'max'}, data.pressure == data.max_pressure ? 'disabled' : null)}}
+ {{:helper.smoothRound(data.pressure)}} kPa
+
+
+{{/if}}
+
diff --git a/nano/templates/newscaster.tmpl b/nano/templates/newscaster.tmpl
new file mode 100644
index 00000000000..af4edb702ad
--- /dev/null
+++ b/nano/templates/newscaster.tmpl
@@ -0,0 +1,301 @@
+
+
+
+
+Welcome to Newscasting Unit #{{:data.unit_no}}.
+Interface & News networks Operational.
+Property of Nanotrasen
+
+{{if data.temp}}
+ {{:data.temp}}
+ {{:helper.link('Return', 'arrow-left', {'setScreen' : data.temp_back_screen})}}
+{{else}}
+ {{if data.screen == 0}}
+
+ {{if data.wanted_issue}}
+
{{:helper.link('Read Wanted issue', 'exclamation-triangle', {'view_wanted' : 1})}}
+ {{/if}}
+
{{:helper.link('Create feed channel', 'plus', {'create_channel' : 1})}}
+
{{:helper.link('View feed channels', 'arrow-right', {'view' : 1})}}
+
{{:helper.link('Submit new feed story', 'share', {'create_feed_story' : 1})}}
+
{{:helper.link('Print newspaper', 'print', {'menu_paper' : 1})}}
+
{{:helper.link(data.silence ? 'Unsilence unit' : 'Silence unit', data.silence ? 'volume-up' : 'volume-off', {'silence_unit' : 1})}}
+
{{:helper.link('Re-scan user', 'refresh', {'refresh' : 1})}}
+ {{if data.securityCaster}}
+
Feed Security functions:
+
{{:helper.link(data.wanted_issue ? 'Manage wanted issue' : 'Publish wanted issue', data.wanted_issue ? 'pencil' : 'share', {'menu_wanted' : 1})}}
+
{{:helper.link('Censor feed stories', 'ban', {'menu_censor_story' : 1})}}
+
{{:helper.link('Mark feed channel with Nanotrasen D-Notice', 'thumb-tack', {'menu_censor_channel' : 1})}}
+
The newscaster recognises you as: {{:data.scanned_user}}
+ {{/if}}
+
+ {{else data.screen == 1}}
+ Station Feed Channels
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + '', 'arrow-right', {'show_channel' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'show_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No active channels found...
+ {{/for}}
+
+
+
+
{{:helper.link('Refresh', 'refresh', {'refresh' : 1})}}
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 2}}
+ Creating new feed channel...
+
+
+
Channel author:
+
{{:data.scanned_user}}
+
+
+
Accept public feeds:
+
{{:helper.link(data.c_locked ? 'NO' : 'YES', data.c_locked ? 'times' : 'check', {'set_channel_lock' : 1})}}
+
+
+ {{:helper.link('Submit', 'share', {'submit_new_channel' : 1})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 3}}
+ Creating new feed message...
+
+
Receiving channel:
+
+
{{:data.channel_name}}
+ {{:helper.link('Edit', 'pencil', {'set_channel_receiving' : 1})}}
+
+
+
+
Message body:
+
+
{{:data.msg}}
+ {{:helper.link('Edit', 'pencil', {'set_new_message' : 1})}}
+
+
+
+
Attached photo:
+
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
+
+
+ {{:helper.link('Submit', 'share', {'submit_new_message' : 1})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 4}}
+ Network currently serves a total of {{:data.total_num}} feed channels, {{:data.active_num}} of which are active, and a total of {{:data.message_num}} feed stories.
+
+
Liquid paper remaining:
+
{{:data.paper_remaining}} cm3
+
+
+ {{:helper.link('Print paper', 'print', {'print_paper' : 0})}}
+ {{:helper.link('Cancel', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 5}}
+ {{:data.channel_name}} [created by: {{:data.author}}]
+ Feed view count: {{:data.total_view_count}}
+ {{if data.censored}}
+
+ ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
+ No further feed story additions are allowed while the D-Notice is in effect.
+
+ {{else}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+

+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}}]
+
Message view count: {{:value.view_count}}
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+ {{/if}}
+
+
+
{{:helper.link('Refresh', 'refresh', {'refresh' : 0})}}
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 1})}}
+
+ {{else data.screen == 6}}
+ Nanotrasen Feed Censorship Tool
+ NOTE: Due to the nature of news Feeds, total deletion of a Feed Story is not possible.
+ Keep in mind that users attempting to view a censored feed will instead see the [REDACTED] tag above it.
+
+ Select feed channel to get stories from:
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + '', 'arrow-right', {'pick_censor_channel' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'pick_censor_channel' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No feed channels found active...
+ {{/for}}
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 7}}
+ Nanotrasen D-Notice Handler
+ A D-Notice is to be bestowed upon the channel if the handling Authority deems it as harmful for the station<>s morale, integrity or disciplinary behaviour.
+ A D-Notice will render a channel unable to be updated by anyone, without deleting any feedstories it might contain at the time.
+ You can lift a D-Notice if you have the required access at any time.
+
+
+ {{for data.channels}}
+
+ {{if value.admin}}
+ {{:helper.link('' + value.name + '', 'arrow-right', {'pick_d_notice' : value.ref})}}
+ {{else}}
+ {{:helper.link(value.name, 'arrow-right', {'pick_d_notice' : value.ref}, null, value.censored ? 'link linkDanger' : null)}}
+ {{/if}}
+
+ {{empty}}
+
No feed channels found active...
+ {{/for}}
+
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 8}}
+ {{:data.channel_name}} [created by: {{:data.author}}]
+ {{:helper.link(data.author_redacted ? 'Undo author censorship' : 'Censor channel author', null, {'censor_channel_author' : data.ref})}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+

+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}}]
+
+ {{:helper.link(value.body_redacted ? 'Undo story censorship' : 'Censor story', null, {'censor_channel_story_body' : value.ref})}}
+ {{:helper.link(value.author_redacted ? 'Undo author censorship' : 'Censor message author', null, {'censor_channel_story_author' : value.ref})}}
+
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 6})}}
+
+ {{else data.screen == 9}}
+ {{:data.channel_name}} [created by: {{:data.author}}]
+ Channel messages listed below. If you deem them dangerous to the station, you can {{:helper.link('Bestow a D-Notice upon the channel', null, {'toggle_d_notice' : data.ref})}}
+ {{if data.censored}}
+
+ ATTENTION: This channel has been deemed as threatening to the welfare of the station, and marked with a Nanotrasen D-Notice.
+ No further feed story additions are allowed while the D-Notice is in effect.
+
+ {{else}}
+ {{for data.messages}}
+
+ - {{:value.body}}
+ {{if value.img}}
+

+ {{/if}}
+
[{{:value.message_type}} by {{:value.author}}]
+
+ {{empty}}
+ No feed messages found in channel...
+ {{/for}}
+ {{/if}}
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 7})}}
+
+ {{else data.screen == 10}}
+ Wanted Issue handler:
+ {{if data.wanted_already}}
+ A wanted issue is already in Feed Circulation. You can edit or cancel it below.
+ {{/if}}
+
+
+
Description:
+
+
{{:data.msg}}
+ {{:helper.link('Edit', 'pencil', {'set_wanted_desc' : 1})}}
+
+
+
+
Attached photo:
+
{{:helper.link(data.photo ? 'Dettach photo' : 'Attach photo', data.photo ? 'times' : 'paperclip', {'set_attachment' : 1})}}
+
+
+
Author:
+
{{:data.wanted_already ? data.author : data.scanned_user}}
+
+
+
+ {{:helper.link(data.wanted_already ? 'Edit issue' : 'Submit', data.wanted_already ? 'pencil' : 'share', {'submit_wanted' : data.end_param})}}
+ {{if data.wanted_already}}
+ {{:helper.link('Take down issue', 'times', {'cancel_wanted' : 1})}}
+ {{/if}}
+ {{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{else data.screen == 11}}
+ STATIONWIDE WANTED ISSUE
+ [Submitted by: {{:data.author}}]
+
+
Criminal:
+
{{:data.criminal}}
+
+
+
Description:
+
{{:data.description}}
+
+
+
Photo:
+
+ {{if data.photo}}
+

+ {{else}}
+ None
+ {{/if}}
+
+
+
+
{{:helper.link('Back', 'arrow-left', {'setScreen' : 0})}}
+
+ {{/if}}
+{{/if}}
\ No newline at end of file
diff --git a/nano/templates/tank_dispenser.tmpl b/nano/templates/tank_dispenser.tmpl
new file mode 100644
index 00000000000..a634a2dde8e
--- /dev/null
+++ b/nano/templates/tank_dispenser.tmpl
@@ -0,0 +1,7 @@
+
+
Dispense:
+
+ {{:helper.link('Plasma (' + helper.smoothRound(data.p_tanks) + ')', data.p_tanks ? 'square' : 'square-o', {'plasma' : 1}, data.p_tanks ? null : 'disabled')}}
+ {{:helper.link('Oxygen (' + helper.smoothRound(data.o_tanks) + ')', data.o_tanks ? 'square' : 'square-o', {'oxygen' : 1}, data.o_tanks ? null : 'disabled')}}
+
+
\ No newline at end of file
diff --git a/nano/templates/wires.tmpl b/nano/templates/wires.tmpl
new file mode 100644
index 00000000000..a661fa3e851
--- /dev/null
+++ b/nano/templates/wires.tmpl
@@ -0,0 +1,24 @@
+
+
+ {{for data.wires}}
+
+ | {{:value.colour}} {{if value.index}}({{:value.index}}){{/if}} |
+
+ {{:helper.link(value.cut ? 'Mend' : 'Cut', null, {'action' : 'cut', 'wire' : value.colour})}}
+ {{:helper.link('Pulse', null, {'action' : 'pulse', 'wire' : value.colour})}}
+ {{:helper.link(value.attached ? 'Detach' : 'Attach', null, {'action' : 'attach', 'wire' : value.colour})}}
+ |
+
+ {{/for}}
+
+
+{{if data.status_len}}
+
+
+
+ {{for data.status}}
+
{{:value}}
+ {{/for}}
+
+
+{{/if}}
diff --git a/paradise.dme b/paradise.dme
index 2e041fd8c5b..9466b0dceee 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -1168,9 +1168,9 @@
#include "code\modules\clothing\spacesuits\breaches.dm"
#include "code\modules\clothing\spacesuits\chronosuit.dm"
#include "code\modules\clothing\spacesuits\ert.dm"
+#include "code\modules\clothing\spacesuits\hardsuit.dm"
#include "code\modules\clothing\spacesuits\miscellaneous.dm"
#include "code\modules\clothing\spacesuits\plasmamen.dm"
-#include "code\modules\clothing\spacesuits\rig.dm"
#include "code\modules\clothing\spacesuits\syndi.dm"
#include "code\modules\clothing\spacesuits\void.dm"
#include "code\modules\clothing\spacesuits\rig\rig.dm"
diff --git a/sound/effects/pray.ogg b/sound/effects/pray.ogg
new file mode 100644
index 00000000000..beadd3916f1
Binary files /dev/null and b/sound/effects/pray.ogg differ
diff --git a/sound/items/WelderActivate.ogg b/sound/items/WelderActivate.ogg
new file mode 100644
index 00000000000..5218f2ab1cf
Binary files /dev/null and b/sound/items/WelderActivate.ogg differ
diff --git a/sound/items/WelderDeactivate.ogg b/sound/items/WelderDeactivate.ogg
new file mode 100644
index 00000000000..22ac4f445cb
Binary files /dev/null and b/sound/items/WelderDeactivate.ogg differ
diff --git a/sound/items/change_drill.ogg b/sound/items/change_drill.ogg
new file mode 100644
index 00000000000..406027a5955
Binary files /dev/null and b/sound/items/change_drill.ogg differ
diff --git a/sound/items/change_jaws.ogg b/sound/items/change_jaws.ogg
new file mode 100644
index 00000000000..b6a41eca806
Binary files /dev/null and b/sound/items/change_jaws.ogg differ
diff --git a/sound/items/drill_hit.ogg b/sound/items/drill_hit.ogg
new file mode 100644
index 00000000000..0f8fa631aa1
Binary files /dev/null and b/sound/items/drill_hit.ogg differ
diff --git a/sound/items/drill_use.ogg b/sound/items/drill_use.ogg
new file mode 100644
index 00000000000..82f37cd35bb
Binary files /dev/null and b/sound/items/drill_use.ogg differ
diff --git a/sound/items/jaws_cut.ogg b/sound/items/jaws_cut.ogg
new file mode 100644
index 00000000000..a0bfd855029
Binary files /dev/null and b/sound/items/jaws_cut.ogg differ
diff --git a/sound/items/jaws_pry.ogg b/sound/items/jaws_pry.ogg
new file mode 100644
index 00000000000..05178bd4663
Binary files /dev/null and b/sound/items/jaws_pry.ogg differ