diff --git a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
index 11d43cc22db..b3d9ccfe523 100644
--- a/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
+++ b/_maps/map_files/MetaStation/MetaStation.v41A.II.dmm
@@ -1356,7 +1356,7 @@
"aAd" = (/obj/structure/closet/crate,/obj/machinery/light/small{dir = 4},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aAe" = (/obj/structure/closet/emcloset,/obj/machinery/status_display{density = 0; pixel_x = 0; pixel_y = 32; supply_display = 1},/turf/simulated/floor/plasteel{dir = 9; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aAf" = (/obj/structure/closet/crate,/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
-"aAg" = (/obj/machinery/power/apc{dir = 1; name = "Mining APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 38},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
+"aAg" = (/obj/machinery/power/apc{dir = 1; name = "Mining APC"; pixel_y = 24},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 38},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aAh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aAi" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/emergency{pixel_x = 2; pixel_y = -3},/obj/item/weapon/storage/toolbox/emergency,/turf/simulated/floor/plasteel{dir = 5; icon_state = "brown"},/area/quartermaster/miningdock{name = "\improper Mining Office"})
"aAj" = (/obj/structure/table,/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plasteel{icon_state = "floorgrime"},/area/quartermaster/sorting{name = "\improper Warehouse"})
@@ -2818,7 +2818,7 @@
"bcj" = (/obj/item/device/radio/beacon,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/bridge)
"bck" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/computer/security/mining,/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge)
"bcl" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/recharger{pixel_y = 3},/obj/item/weapon/restraints/handcuffs{pixel_y = 3},/obj/structure/table/glass,/turf/simulated/floor/plasteel{dir = 4; icon_state = "darkredcorners"},/area/bridge)
-"bcm" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/quartermaster/storage)
+"bcm" = (/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/engine/engineering)
"bcn" = (/obj/machinery/door/airlock/maintenance{req_access_txt = "12"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/storage/tools)
"bco" = (/turf/simulated/wall,/area/quartermaster/office{name = "\improper Cargo Office"})
"bcp" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_mining{glass = 0; icon = 'icons/obj/doors/Doormining.dmi'; name = "Cargo Bay"; opacity = 1; req_access_txt = "0"; req_one_access_txt = "48;50"},/turf/simulated/floor/plasteel{icon_state = "delivery"; name = "floor"},/area/quartermaster/office{name = "\improper Cargo Office"})
@@ -3256,7 +3256,7 @@
"bkF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge)
"bkG" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_command{name = "Bridge"; req_access_txt = "19"},/turf/simulated/floor/plasteel{dir = 1; icon_state = "darkblue"; tag = "icon-darkbluecorners (WEST)"},/area/bridge)
"bkH" = (/obj/machinery/light_switch{pixel_x = -38},/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plasteel{dir = 8; icon_state = "warning"},/area/quartermaster/storage)
-"bkI" = (/obj/structure/closet/secure_closet/cargotech,/obj/structure/disposalpipe/segment,/obj/item/clothing/suit/hooded/wintercoat/cargo,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage)
+"bkI" = (/obj/structure/closet/wardrobe/cargotech,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plasteel{dir = 6; icon_state = "warning"; tag = "icon-warnwhite (NORTHEAST)"},/area/quartermaster/storage)
"bkJ" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{icon_state = "vault"; dir = 8},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bkK" = (/obj/structure/window/reinforced{dir = 4; pixel_x = 0},/obj/machinery/door/window{dir = 8; name = "MiniSat Airlock Access"; req_access_txt = "0"},/turf/simulated/floor/plasteel{icon_state = "dark"},/area/construction/hallway{name = "\improper MiniSat Exterior"})
"bkL" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/wall/r_wall,/area/turret_protected/ai)
@@ -5171,7 +5171,7 @@
"bVw" = (/obj/item/weapon/crowbar,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
"bVx" = (/obj/structure/table,/obj/item/weapon/folder/yellow,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/weapon/storage/firstaid/regular{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plasteel{icon_state = "bot"; dir = 1},/area/gateway)
"bVy" = (/obj/machinery/computer/security/telescreen/entertainment,/turf/simulated/wall,/area/crew_quarters/kitchen)
-"bVz" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/obj/item/clothing/suit/hooded/wintercoat/engineering/atmos,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
+"bVz" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/plasteel{icon_state = "dark"},/area/atmos)
"bVA" = (/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 4; name = "Atmos RC"; pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/visible,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/shower{dir = 8; icon_state = "shower"; name = "emergency shower"; tag = "icon-shower (WEST)"},/turf/simulated/floor/plasteel,/area/atmos)
"bVB" = (/obj/machinery/atmospherics/binary/pump{dir = 0; name = "Port to Filter"; on = 0},/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Atmospherics - Starboard"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/atmos)
"bVC" = (/obj/machinery/atmospherics/pipe/manifold/general/visible{dir = 8},/obj/structure/stool,/turf/simulated/floor/plasteel,/area/atmos)
@@ -5417,7 +5417,7 @@
"cai" = (/obj/machinery/hydroponics/constructable,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/hydroponics)
"caj" = (/obj/machinery/hydroponics/constructable,/turf/simulated/floor/plasteel,/area/hydroponics)
"cak" = (/obj/machinery/seed_extractor,/turf/simulated/floor/plasteel{dir = 9; icon_state = "warning"},/area/hydroponics)
-"cal" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"cal" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/structure/closet/wardrobe/botanist,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"cam" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; on = 1},/obj/machinery/firealarm{pixel_y = 29},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"can" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
"cao" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -5542,7 +5542,7 @@
"ccD" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/turf/simulated/floor/plasteel{dir = 9; icon_state = "green"},/area/hydroponics)
"ccE" = (/obj/effect/landmark/start{name = "Botanist"},/turf/simulated/floor/plasteel{icon_state = "green"; dir = 8},/area/hydroponics)
"ccF" = (/obj/machinery/biogenerator,/obj/machinery/light_switch{pixel_x = 26; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warning"},/area/hydroponics)
-"ccG" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/obj/item/weapon/storage/backpack/satchel_hyd,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"ccG" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"ccH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"ccI" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 8; initialize_directions = 11},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/starboard)
"ccJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/starboard)
@@ -5796,7 +5796,7 @@
"chx" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chy" = (/obj/structure/girder,/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9; pixel_y = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chz" = (/obj/machinery/light/small,/turf/simulated/floor/plasteel{dir = 2; icon_state = "purplecorner"},/area/hallway/primary/central)
-"chA" = (/obj/structure/closet/secure_closet/hydroponics,/obj/item/weapon/storage/bag/plants/portaseeder,/obj/item/weapon/storage/backpack/satchel_hyd,/obj/item/clothing/suit/hooded/wintercoat/hydro,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"chA" = (/obj/structure/closet/secure_closet/hydroponics,/obj/machinery/light_switch{pixel_x = -26; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
"chB" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chC" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"chD" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/obj/effect/spawner/lootdrop{loot = list("/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/structure/grille","/obj/item/weapon/cigbutt","/obj/item/trash/cheesie","/obj/item/trash/candy","/obj/item/trash/chips","/obj/item/trash/deadmouse","/obj/item/trash/pistachios","/obj/item/trash/plate","/obj/item/trash/popcorn","/obj/item/trash/raisins","/obj/item/trash/sosjerky","/obj/item/trash/syndi_cakes"); name = "maint grille or trash spawner"},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6035,6 +6035,7 @@
"cmc" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology)
"cmd" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable/yellow{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/medical/virology)
"cme" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_virology{name = "Test Subject Cell"; req_access_txt = "39"},/turf/simulated/floor/plasteel{icon_state = "freezerfloor"},/area/medical/virology)
+"cmf" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
"cmg" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area)
"cmh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/iv_drip,/turf/simulated/floor/plasteel{dir = 1; icon_state = "whitegreen"},/area/medical/virology)
"cmi" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plating{tag = "icon-platingdmg1"; icon_state = "platingdmg1"},/area/maintenance/aft{name = "Aft Maintenance"})
@@ -6198,6 +6199,7 @@
"cpk" = (/obj/effect/decal/cleanable/blood,/obj/effect/decal/cleanable/blood/gibs/limb,/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cpl" = (/obj/structure/rack,/obj/item/clothing/suit/apron,/obj/item/clothing/mask/surgical,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
"cpm" = (/obj/machinery/chem_master/condimaster{name = "CondiMaster Neo"; pixel_x = -4},/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
+"cpn" = (/obj/machinery/light_switch{pixel_y = 28},/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cpo" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"cpp" = (/obj/machinery/power/turbine{luminosity = 2},/obj/structure/cable,/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"cpq" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos)
@@ -6900,7 +6902,7 @@
"cCL" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden{req_access_txt = 1},/turf/simulated/floor/plasteel{dir = 8; icon_state = "whiteblue"},/area/medical/medbay3{name = "Medbay Aft"})
"cCM" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
"cCN" = (/obj/machinery/power/apc{dir = 4; name = "Medbay Aft APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/disposalpipe/junction,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{dir = 4; initialize_directions = 11},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay3{name = "Medbay Aft"})
-"cCO" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{dir = 1; icon_state = "warning"},/area/toxins/explab)
+"cCO" = (/obj/structure/closet/wardrobe/science_white,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cCP" = (/obj/structure/table/glass,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen/red,/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{dir = 8; icon_state = "whitegreen"},/area/medical/virology)
"cCQ" = (/obj/structure/closet/secure_closet/personal/patient,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics_cloning)
"cCR" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/closet/wardrobe/genetics_white,/turf/simulated/floor/plasteel{tag = "icon-vault"; icon_state = "vault"},/area/medical/genetics)
@@ -7118,7 +7120,6 @@
"cGV" = (/obj/machinery/camera{c_tag = "Research Testing Range"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/plating,/area/toxins/misc_lab{name = "\improper Research Testing Range"})
"cGW" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 2; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"})
"cGX" = (/turf/simulated/floor/plating{icon_plating = "warnplate"; icon_state = "warnplate"},/area/toxins/misc_lab{name = "\improper Research Testing Range"})
-"cGY" = (/obj/structure/closet/secure_closet/scientist,/obj/machinery/light_switch{pixel_y = 28},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cGZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/turf/simulated/floor/plasteel{dir = 9; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"cHa" = (/obj/structure/lattice,/turf/space,/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHb" = (/obj/machinery/door/poddoor{id = "mixvent"; name = "Mixer Room Vent"},/turf/simulated/floor/engine/vacuum,/area/toxins/mixing{name = "\improper Toxins Lab"})
@@ -7130,7 +7131,6 @@
"cHh" = (/obj/machinery/atmospherics/binary/valve{dir = 4; name = "manual outlet valve"},/turf/simulated/floor/plasteel{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHi" = (/obj/machinery/atmospherics/unary/portables_connector/visible{dir = 8},/obj/structure/window/reinforced{dir = 1; pixel_y = 2},/obj/machinery/light{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 5; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHj" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/aft{name = "Aft Maintenance"})
-"cHk" = (/obj/structure/closet/secure_closet/scientist,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel{dir = 2; icon_state = "warning"},/area/toxins/mixing{name = "\improper Toxins Lab"})
"cHl" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area)
"cHm" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area)
"cHn" = (/turf/simulated/wall,/area/medical/virology)
@@ -8025,7 +8025,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahatJatJatJatJatJatJatJaahatJaahaahatJatJaahaahalWalWardawwalWalWaaaauraxtaxtaxtaBLaBuaBvaBvaCTaBxaByaBzaBAaBBaBCaBDaBEaCVaBGaDHayWayYaheaaaaxCaAraAqaBJaAsaBKaxCaaaaoOaFwawDawDaOZaBOauAaboaBQaAyaBRagKaBQaAyaBSagKaBQaAyaBTagKaBUaBVaBWagKaBXaBYaBZaCaaCbazxaCcaCdaCeaCfaCgaChazBaCiapjapjapjaCjaCkaykaClaCmaCnaykaCoaCpaCpaCqaCraCsaCtarWarWarWarWarWaocaCuatHaSuaCwaCxaCyavraCAaCBaCCaCCaCCaCCaCDaCEaCFavsaCHayFaCIaahaahaaaaaaaaaaahaahaaaaaaaahaaaatJazRayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaatJatJatJatJatJaahaahaahatJatJatJaafaaaaahaahaahalWalWalOalOaCJagAaaaaaaaqQaxsaxsaxsaqQarCaCLaCMaCNaBxaBvaCOaCPavtayUaCRaCSaEhaCUaEsayWayYaheaahaxCaCWaCzaCYaCXaTEaxCaaaaoOaPeaPeaPeaoOausaDeaboavvavxavwahCavvavxavwahCavvavxavwahCaxDazqayPahCahCauhazrahCaDnazxaDoaDpaDqaDraDsaDtazBaDuaheaheaheaDvaheaykaDwaDxaykaykaDyaDzaDAaDBaDCaDDaDEavRaDFaDGatxarWaFDaDIatHaDJaDKaDLaDLaDMawzazLaDOaDPaDQaDQaDQaDRaDSawAaDUawBaaaaaaaahaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDWaDXaDWaagaaaaahaaaaahalWaHcaFHakBawwalWalWaaaauraPPaPfaPQaurarCarCarCayUaEdaBvaEeaCPaEfayUaEgaHFaEiaEjaEkayWayYaheaaaaxCaDbaDaaDTaEmaxCaxCaaaaPUaQuaQuaQuaQvaEraxvaEraEtaEuaEtaEvaEtaEuaEtaEwaEtaEuaExaEyaEzaEAaEBaxEaAJaEEaDmahCavNazBaEGaEHaEIaEJaEKaELazBaEMaykaENaEOaEPaEQaEQaERaESaETaEUaEVaEWaEXaEYaEZaFaauLaFbaFcaFdaFearWaqKaDIatHaFfaFgaFhaFiaFjaFkaFlaDVaFnaFoaFoaFoaFpaFqawAaDUawBaaaaahaahaahaahaahaahaahaahaahaahaahaaaaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWaWhaotaotaFtaFualWaaaaQyarlaQzarlaQBaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaWiaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDaGEaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaahaaaaDWaFsaDWaahaahaahaahaahalWaWhaotaotaFtaFualWaaaaQyarlaQzarlaQBaahaahaaharCaFzaFAaFBaFCaHIayUaFEaFFaWiaIfaFIayWayYaheaaaaahaaaaDYaFLayNaaaaahaaaaErausausausaEraErayOaFOaExaFPaFQaFRaFSaFTaFTaFUaFTaFVaFSaFWaFXaFYaFZaGbaEFaGdaGcahCavNazBazBayQaGfazBaDZazBazBaDuaykaykaykaGhaGiaGjaGkaGlaGmaGnaGoaGpaGqaGraGraGsaGtarWarWarWarWarWaqJaDIatHaGuaGvaGwaGxaGyayRaGAaGBaGCaGDbcmaGFaGGaGHawAaDUawBawBaahaGKaaaaaaaaaaaaaGKaaaaaaaGKaahaahaahayFaGLaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaaaaahaaaaDWaDXaDWaDWaySaySaySaDWaDWaDWaDWaDWaGQaGRalWaaaaaaaaaaaaaaaaaaaaaaaaaaharCaGTaGUaGVaGWaGXayUaGYaGZayWayWayWayWaEaaheaHbaElazfaEnaHfazhazkazjaHbaEraHjaHkaHkaHlaHmaHnaHoaHpaHqaHraHsaHtaHuaHvaHwaHuaHxaHyaHzaHAaHBaHCazmaGPaHEaGSahCavNaHHazBaznaHJazBaHKaHLaplaHMaykaHNaHOaHPaHQaykaHRaHSaHTaykaHUaHVaHWaHXaHWaHYaHZaIaaIbaIcaIdarWapxaDIatHaIeazpaIgaIhaIiaCAaIjaIkaGCaIlayFayFaImbbLayFawBawBawBaahaaaaaaaaaaaaaaaaIqaaaaaaaaaaahaahaahayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaahaDWaDWaIraIsaItaIuaIuaIvaIwaIxaIyaIzaDWaDWawwalWaaaaaaaaaaaaaaaaaaaaaaaaaahayUayUayUazsaICayUayUaIDaIEaIFaIGaIHaIIaIJaIKaILaFJaINaGgaIOaINaIPaIQaIRaEraISaITaIUaIVaIVaztaIVaIVaIVaIVaIVaIVaIVaIVaztaIVaIXaIYaIZaJaaJaaJaaJbaJbaJbaJbaJbaJaaJcaJaaJdaJdaJdaJdaGMaJdaDuaykaykaykaJfaJgaykaJhaykaJiaykaJjaJkaJlavRaIAaJnaJoavRaJpaJqaJrarWaJsaJtatHayFayFayFayFayFaCAaJuaJvaGCaJwayFaJxaJyaJzaJAaJzaJBawBaahaaaaaaaahaahaahaahaahaaaaaaaahaahatJayFazXaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaDWaJCaJCaJCaIuaIuaIuaIuaIuaIuaJCaJCaJDaDWawwagAaaaaaaaaaaaaaaaaaaaaaaaaaahaahazwaJGaLbaJHaJIaJJaJKaJLaJMaJNaJOaJPaJQaJRaIIaJSaJTaJUaJVaJWaJXaJYaJZaKaaKbaKcaKdazyaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaazAaKfaKgaKhaJaaXbaKjaKkaKlaKmaKnaKoaKpaKqaJaaKraKsaKtaXLaKvaJdaKwaykaKxaKyaGiaJgaykaKzaykaKAaykaKBaKCaKDaKEaKEaKEaKEaKEaKEaKEaKEaKEaocaKFatHaKGaKHaKIaKJayFaKKaFgaJvaKLaKMaKNaKOaKPaKQaKRaKSaKTawBaahaGKaahaahaAaazZaAbaahaKUaaaaahaaaaraayFazXaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8041,7 +8041,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaGObdgaXcaXdaXeaXfaXcaXgaXhaXiaXhaXjaXkaXhaXlaJmaTVaXoaXpalWaaaaaaaaaaaaaaaaaaaaaaaaaahaVZaHdaUSaMsaNUaNUaHeaHgaLhaXsaXtaXuaXvaXwaXxaXyaXzalWawwaLnaLnaLnaAuaAuaHhaLraXDaXEaLraXFaXGaXHaWraXIaXJaXKaWrbdlaXMaXNaXOaXPaXQaXRaXSaXTaXUbeOaJaaJaaXWaXXaXWaJaaJaaFKaYaaYbaFKbcTaYcaYdaYeaYfaYgaocaocaocaocaYhaocaocaocaocaocaocaDIapwapxaYiaYiaYiaYiaYiaYiaYiaWPaYjaYkaYlaWPaHiaYnaWPaYoaYpaCAaCAaYqaYraYsazOaYtazOaYuazRaYvazRayHayIaYwayIayKazRaYvazRayLazWazXaahaahaagaagaafaahaafaagaagaafaafaagaagaagaafaahaahaahaahaahaQxaTiaYxaYyaYyaYyaYyaYyaYzaYzaYzaYAaYzaYzaYzaYyaYBaYyaYyaYyaYCaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaHDaYEaYFaYFaYGaYFaYFaYFaYHaYIaYJaYKaYLaYLaYLaYMaYNaYOaYPalWaaaaaaaahaahaaaaaaaahaahaahaVZbgqbgjbiRaYRaNUbjwaInaYUaYTaYVaYWaYXaYYaYZaZaaZbalWaZcaZdaZeaZfaZgaZhaZiaZjaZkaZlaZmaZnaZoaZnbeTaZqaZraZsbeZaZnbGzaZuaZvaZxaZwaZzaZyaZAaZCaZDaZDaZDaZEaZFaZDaZDaZGaZDaZHaZIaZDaZDaZDaZKaZLaocaZMaZNaZOaZPaZQaZRaZQaZSaZQaZTawhaWOawiaqJapxaYibfWaZUaZVaZWbhfaZZaWPbaababbabbacbabbadaWPbaeaWUbafbagbagbagbagbagbahayFbaiayIbajayIazVayFayFayFbaiayIazVayLayLayFaahaahaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaQxaUvaUwaUCaaaaUzbakbakbalbambanbaobapbambaqbakbaraUzaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaHDaHDbauaHDaTqaHDbawaHDaYEaYFbaxbayaHDbawaHDbhPbaAbaBbaCalWalWalWalWagAagAagAalWalWalWaVZbkHbaJbaJbaJbaJbaKaNUbaLbaMbaNbaOaUXaUXaUXaUXaIBalWalWbaQalWalWbaRbaSbaTbaUbaVbaWbaXbaUbaVbaYbaZbaWbbabaUbaUbaUaZBbbbbbcbbebbdbbfbbgbbhbaUbaUbaUbaUbbjbbkbaUbaUbaXbblbbmbaUbaUbaUbaUbbnbbobbpbbpbbpbcnbbpbbpbbpaocbbqaocaDIaocaocbbrbbrbbrbbrbbsbbtbbtbbubbvbbwaWPbbxbbyaIWbbAbbBbbCaWPbbDbbEbbFbagbbGbbHbbIbagbbJayFayFayFayFayFayFayFbbKayFayFayFayFayFbbLayFaahaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaafaQxaQxaQxaQxaQxaQxaQxaQxaTiaUwaUCaaaaUzbakbanbbMbbNbbObbPbbQbbNbbRbanbaraUzaaaaVRaUwaUCbbSbbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKebcmbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbjzbdhbdibdjbdkbmIaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaHDaahaaaaahaaaaHDbbUaHDbbVbbVbbWbbXaHDbbUaHDaHDaTqbbZbcabcbasuasvbccasvbcdasvbcebcfaswbeqbchaJEaJEaJFaKYaKeaJEbkIbcobcpbcqbcobcrbcsblvbctbcubcvbcwbcxbcybczbcAbcBbcCbcCbcDbcEbcFbcGbcHbcIbcJbcKbcKbcKbcKbcKbcKbcKbcLbcMbcNbcNbcNbcNbcNbcNbcNbcNbcObcPbcQbcRbcNbcSbcObcNbcNbmTbcUbcVbbpbcWbcXbcYbcZbdabbpbdbbdcaocbddaocaaabbrbdebdfbbrbjzbdhbdibdjbdkbmIaWPbdmbdnbdobdpbdqbdraWPbdsbdtbdubagbdvbdwbdxbagbdyaKRaKRbdzaKRbdAaKRaKRaKRbdBaKRbdCbdDbdCbdDabjabjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaRJbdEaUwaUCaaaaUzbakbdFbdGbakbdHaKZbdJbakbdKbdLbaraUzaaaaVRaUwbdMaaabbSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaaaaHDbawaHDaHDaHDaHDaHDaHDbawaHDaaaaTqbdQbdRbdSbdSbdSbdSbdSbdSbdSbdSbdTbmMbcobcoaLoaMraLobcobcobcobdYbcobdZbeabebbecbedbeebefbegbehbeibejbcybekbcAbelbembembenbembeobembgbbeRbgbaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGaMGbeubeubevbeubeubeubeubeubeubewbcAbexbbpbnjbezbeAbeBbeCbbpbeDbeEaocaDIajVaaaaOfbeGbeHbeIbeJbeKbeLbeMbeNbncaWPbePaOhaOFaOFaOXaOWaWPbeUbeVbeUbagbeWbeXbeYbagaOYayFayFayFayFayFayFayFayFayFawBayFayFbahayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaQxbfbbfcbfdbfeaUzaUzaUzbakbffbfgbfhbakbakbakbfibfjbfkbaraUzaUzaUzbflaToaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaFaXCbaIaXCbdNaXCaXCbdNaXCbaIbdPbdOaTqbdQbfsbftbfubfvbfwbfxbfybfzbdSbfAbfBbfCbfDbnsbfEbnsbfEbfGbfEbfHbcobfIbfJbfKbfLbfMaPgbfObfPbfQbfRbfSaPobfUbfVbotbembfXbfYbfZbgabembhobgcbhraahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbeubgdbgebgfbggbghbgibnVbeubgkbglbgmbbpbgnbgobgpboqbgrbbpaocaocaocbgsaocaaabbrbgtbgubbrbgvbgwbgxbgybgzbgAaWPbgBaPAbgDbgEbgFbgGaWPaCAbgHaCAbagbgIbgJbgKbagbgLbgLbgLaaKaaEaaaaaaaaaaaaaahaaaaaaayFbdDayFaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaRIaRIbgMbgNaUwbgObgPaaaaaaaUzbgQbgRbgSbakbakbgTbakbakbdKbgUbgVaUzaaaaaabgWaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaFaXCaXCbdVbdUbdXbdWbhcbhbbUqboGcDRbdXcVVcVUaHDbdQbdRaQTbhibhjbhkbhlbhmbhnbhMbhpbhqbhNbhsbhsbhtbhubhvbcobcobcobcobhwbhxbhybhzbhAaLobhCbegbehbhDbhEbhFbhGbcAbhHbembhIbhJbhKbhLbhObiQbiqbjAaahaahaQYaRcaRbaRdbhUaRfaRcaRdbhUaRfaRbaRbaRgaahaahbeubhZaRhbibbicbibbidbiebeubifbcAbigboHbbpaRjbiiaRqbbpbbpbikbilaocbinaocbimbbrbbrbbrbbraYiaYiaYibiobipaYiaWPaWPaWPaWPaWPboOboNaWPbisbitbisbagaRzbivaRAbagbiyaRHcVWcVXcVXcVYaaaaaaaaaaahaaaaaaaaaabjaaaaahaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahabjbiCbiDbiEbiDbiFaUCaaaaaaaaaaUzbiGbanbiHbiIbiJbiKaRKbiIbiMbanbaraUzaaaaaaaVRaUwaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8071,8 +8071,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWCbWCbWDbWEbWFalWbWGalWalWalWaUObWHbWHbWHbWHbWHbWHbWHaotbWIbWJcbZbwLbWLbWMbyUbWObEobTdbWPbWQbWRavialWbWSbwPbWTbWUbWVbWWbWXbWXbWXbWYbWZbXabXbbWXbXcbXdbWVbWVbXebXfbXfbXfbXgbXfbXhbXibXibXjbXkbXlbXmbXnbXobWXbWXbWXbXpbXqbXibXraXQbXsbXtbyVbXvbXwbXxbyWbyXbXAbXxbXBbXCbXDbXEbNrbXFbXGbWwbXIbXJbXKbXLbWtbXMaocaocaocaocaocbXNbXObzBbzBbzBbWxbGDbKobWzbWybWAbGGbXzbWKbXHbSxbXPbMjbFgbFsbIzbYZbZabZabFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRaUwbJhaRIaRIaRIaRIaRIaRIbWBaRIaRIaRIaRIaRIaRIbgNaUwaTpaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFbXZbYabYbbWFaotbYcbMAcesalWbYebWHceGbYgbYhbYiceIbWHaotalObWJalObwLbwLbwLbwLbwLbwLbwLbwLbwLatRalOalWbYkbwPbYlbYmbaUbaUbaUbaUbaUbaUbaXbaUbYnbYobYpbaWbaUbaUbYqbYrbYsbYtbYubYvbYwbaUbaUbaUbYybYzbaUbaUbaXbaUbaUbaUbaUbYAbaUbYnbYBbYCbYDbYEbYFbYGbYFbYHbYHbYIbYJbYKbYHbYGbYLbNrbNrbNrbNrbYMbYNapwaoaceWbYPapwbYPbYQbYRaocauWaocbzBbXQbXUbXTbXWbXVbYdbYdbYdbINcgpcgpcgpbNRbYSbNSbBIaahbBIbZbcaDcaCbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaVRbZcaTkaTkaTkaTkaTkaTkaTkbZdaTkaTkaTkaTkaTkaTkaTkbZeaUCaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahbWFbZfbZgbZhbWFaotbZibZjalWalWbZkbWHbZlbZmbZnbZobZpbWHawqaotbZqbVKbVIbVKbVNbVKbZrbZsbZsbZsbZsbZtaZebZubZvbZwbZxbZybZzbZAbZBbZybZybZybZCbZybZDaZCbZEbZFaZCaZCbZGbZHbZIbZJbZKbZLbZMaZCaZCbZObZPbZQbZQbZRbZSbZRbZRbZRbZTbZUbZVbZWbZXbZYbZZcaacabcaccadcaecafcagcahcaicajcagcakbWicalcambWicanbYNapwapwapwapwapwcaocapcaqcarcascatbYUbYTbYWbYVbYYbYXcgpcgpcgpcgpcgpbEScgpbNRcaubPvbIVbJdbLAcaVbZacbibFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaUyaUyaUyaUyaUyaUyaUyaUycaEaUyaUyaUyaUyaUyaUyaUyaUyaaaaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardccuarhcklcklcklcklcklcklcklcchcchcchcchcchcdzcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecdKbepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWichAcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWFbzocbMbzobWFalWalWalWalWbWHcbObWHcbPchBcbRcbScbTbWHcbUcbVcbWbWHcbXcbYchQbWHccabWHbWHbWHbWHbWHbWHcklccbbBhbCRbCKcibccgcchcciccjcckcchbASccmbASccnccobASccmbASciKccqccrccsciWbATccvbATccwccxbATccvbATcctccyccyccyccyccycczbepbAUccBbAVbyVccDbYGcahcajcajcagccEcajcajcagccFbWiccGccHbWibYMccIccJcbCcbCcbEcbCcbCccKcbucbdcbucbubzBcbvcbGcbFcbIcbHbEScgpcgpcaybMdcbJbPubNRcbKbNSbzBaahaahaahaahaahaahaahaahbMoaahbMpaahbNWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaabWFcaFcaGcaHbWFcgvaotcaJalWcaKcaLbWHcaMcaNcaOcaPcaQbWHbWHbWHbWHbWHbWHcaRbWHbWHcaSchcchdalOardccuarhcklcklcklcklcklcklcklcchcchcchcchcchcdzcaWcaWcaXcaYcaWcaZcaWcbacbbaXQcbcchzcbecbfcbecbgcbhcbecbecdKbepaXFaXHaXHcbjbepcbkbepbzacbmbzabWibzkbzbcahcbpcbqcagcahcbrcbscbtbzlbWiccGcbwbWicbxcbycbzcaqcaqcaqcaqcbAcbBcbCcbDcbCcbEbzGcavcaxcawcgpcaybMdbMdbMdbMdbMdcazcgpbNRbRecaAbzBaahbFvbFvbFvbFvbFvaahaaabCaaaabBZaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbSaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaQxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaabWFbzocbMbzobWFalWalWalWalWbWHcbObWHcbPchBcbRcbScbTbWHcbUcbVcbWbWHcbXcbYchQbWHccabWHbWHbWHbWHbWHbWHcklccbbBhbCRbCKcibccgcchcciccjcckcchbASccmbASccnccobASccmbASciKccqccrccsciWbATccvbATccwccxbATccvbATcctccyccyccyccyccycczbepbAUccBbAVbyVccDbYGcahcajcajcagccEcajcajcagccFbWichAccHbWibYMccIccJcbCcbCcbEcbCcbCccKcbucbdcbucbubzBcbvcbGcbFcbIcbHbEScgpcgpcaybMdcbJbPubNRcbKbNSbzBaahaahaahaahaahaahaahaahbMoaahbMpaahbNWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaaaaabzocbQbzoaaaaahaaaaaaaaabWHcbObWHbWHbWHbWHccZbWHbWHcdacdbcdabWHbWHbWHbWHbWHcdccddbWHcdecdfcjgcdhccdcdjcdkcdlcdkcdmcdncdocdpcdqcdrbBbcggbBfcdvcdwcdxcdycghchmccmcdBcdCcdDccvcdEcdFcdGcdHcdIcdJchncdLcdMccycdNbBjcdPccycdQbepcdRcdScdTcdUcdVcdWcdXcdYcdZcdWcdXcdYcdYcdWceacebceccedccLcefbYNapwcegcehcbucbucbucbucbuceicejcekbzBccMccNcgpcgpbPqccObFbbFbccPccQccPbFbccRccSbNSbzBbzBbzBaRJaRIaRJaRIaRJaaabCaaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahaahbzocbMbzoaahaahaahaahaahbWHcewcexceybWHcezceAceBbWHceCceDceEceFckXceHckZbWHceJceKceLceMbBlceObBRccUceRceSceTceUceVbDVbDWcchceXceYbCmcfacfbcfccfdcfecffcfgcfhcficdBcdCcdDcfjcfkcflcfmcfncfocfpcfpcfqcfqbCncfscftcfuccycfvbepcfwcfxcfybyVcfzcfAcfBcfCcfDcfCcfEcfCcfFcfCbCJbWibCLcfIcfJcfKccKaocaocaoccbucfLcfMccVcfOcfPcfQcfRbzBccWccYccXcdscdicelceecencemcepceocerceqcevbNSceQchMceQchVchVchVchVciIaahaafaaaaahaaabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaacfHaaaaaaaahaaaaahaaabWHbWHbWHcbObWHcgicgjcgkcglcgmcgncgoceHceHceBclLbWHcgqcgrbWHcaQcgscgtcgucklbCTbCScmDcgycgzcgAcmEccpccpcgCccpcgDcgEcgFcgFcgGcgHcgIcgJcgKcgLcgMcgNcfjcfkcfkcfkcgOcgPcgQcgRcgScgTbDucgVcgWcgXccycgYbepbepbepbepbWibWicfNbWibWibWibWibWibWibWibWibWibWibWibWibWichachbaoccnHcnqcbuchechfbbichhchichjchkbzBcfScfScfTcfScfUcfScfTcfVcfUcfUbNScfScfWcfYcfXbzBbzBbzBcjjcjochVcjpcjjaaabCaaaaaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8086,14 +8086,14 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaahaaaaaaaQxaaacgcaaaaaaaaaaaaaahaaabLQbSccocbTrbSQcmCcqBcqCcaRcljcmMcqDcqEcqFcqGcqHcmMcqIcqJcqKcmMciZcqMcqNcqOctPbTNcqRcdwcqScpMcuCbUabUcbUbckUcpMbZncjhcqYcuHcuObUCbEFcrbcrccrdcrecrfcjCcuZcvbcvacvNcvfbUNcrmcrncrocrpcrqcfkcrrcrscrtcfkcrucrvcrwcfkcwwbQSbUPckfcwDbUTcwHclkbUVbEHcjDbWHbWHcrFbWHcrGcwMceHceHcrIcwXbLQaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaahaaachVcpScnVbzBcnVaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaaaaaaaahaaaaaaaafaaabBkaahaaaaaaaaaaahaaabLQbLQcoccmCcmCcoccoccrPcaRcljcmMbVbcrRcrScrTcrUcmMcllcrWcrXbVTcrZcsacsbcsccsdcsecsfcdwcdxbPdcshcsicsjcxkcslcpMceBcjhcsmcxxcxycspcsqcsrcsschUcstcsucxOcxNcsxcsycszcsAbVZcsCcsDcsEcsFcsGcsHcsIcsJcsKcsLcsKcsMcsNcsOcsPcxlbWabXubWNclmbXybXSbXRcnjcsZbWHctactbctcbYicqsceHceHctdctebWHctfaahaaaaaaaaaaahaaaaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaQxaaacfHaaaaaaaaaaaaaahaaabLQcthcoccticoccoccpxbWHbWHctjcpIctlcrRctmcrTctnctoctpctqctrctscttctuctvctwctxctyctzctAcgEcblctCcxPctEctFctEcpQctHcjhctIcyKczGcyLbEFcsrcsschUcstctMcgdczNcASczOctQctRbUNctSctTctUctVctWctXctYctZcfpcfpcuacubcuccudcuecbocbncxzcxoccccbNccfcqdbEHcjDbWHcuncuocupcpjcuqcrIcjEceHcurbLQaaaaahaaaaaaaaaaahaahaafbBZbBZbBZbBZbBZbBZaafbBZbCabBZbMpaahbCaaahaahaafbNWbNWbNWaafaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcBmcuBcBpcmMcuDcoecuFcuGcBqbTNcuIcdwcuJcpMcuKcuLcuMcuNcBscpMcuPcjhcjhcrKcjhcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecCfcvdbEHbEHbEHctkcsBcdtcCObEHcjDbWHctacdubWHcvlcvmcdAcDacDacdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaahaaaaaaaahaaaaahaahaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaQxaaabEzaaaaaaaahaahaahaaabLQcuscmCcodcmCcutceBcclbWHcljcmMcuvcuwcuxcuycuzcmMcBmcuBcBpcmMcuDcoecuFcuGcBqbTNcuIcdwcuJcpMcuKcuLcuMcuNcBscpMcuPcjhcjhcrKcjhcjhcjhcjhcuRcuScuTcjqcjqcjqcjqcjqcuUcrVcjqcjAcjAcrYcuXcuYccCccAccTcvccvccvccvccvdcvecCfcvdbEHbEHbEHctkcsBcdtcmfbEHcjDbWHctacdubWHcvlcvmcdAcDacDacdObWHaahaahaahaahaahaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaabCaaaaaaaaahaaaaaaaahaaaaahaahaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaQxaahaafaQxaaaaafaQxaQxaahaahaahbEzaahaahaahaaaaahaahbLQcmCcutcmCcvpcqscxAcxBcmFcmGcmMcvrcvscetcvuceucmMcuAcvxcvycmMcuQcvAcvAcvAcvAcvAcvBcvCcvDcvEcvFcvGceNcvIcePcpMcvKcvLcvMcvOcDbcvPceKcvQcvRcvScvTcvUcuVcvLcvXcvYcvZcwacuWcwccvzcvicwfcwgceZcwicwjcwkcwlcwmcwncvdcwocwpcwqcwrcwsbEHbEHbEHbEHbEHbEHcwtbWHbWHbWHbWHbWHbWHbWHbLQbWHbWHbWHaaaaahaaaaaaaaaaahaahaahaafbCabCabCaaafbCabCabCaaafbCabNWbCabCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaachsaaaaaaaaaaahaaaaaaaaaaahaaaaaaaahaaacgcaaaaaaaahaaaaahaaabLQbLQbLQbLQbWHcwycxEbWHbWHcljcmMcmMcmMcmMcmMcmMcmMcmMcvVcmMcmMcwAbWHcwBcfGcDdcwEctzcwFcwGcpMcDicwIcwJcwKcwKcwKcwKcwKcwKcwKcwLcvWcwLcxScwNcwOcwPcxWcwdcwbcwebWHcEicEicEucEicEicwScwVcwWceZcEVcwYcwZcxacxbcxccvdcxdcxecxfcxgcxhcoUcddciRbWHcxickdcxjbWHcylcddbWHaaaaahaaaaaaaaaaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaahaaaaahaaaaaaaahaaaaahaaaaahaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahaahaahbEybEybEybBkbEyaaaaQxaaaaahaaaaaaaaaaaaaahbWHbWHbWHbWHcyrcljchEcyXcyEceHczbcaQchEciPbZnbWHcxpceHbWHcxqcxrcxscxncxucxvcxwcpMcpMcpMcpMcwKcgUcgxchGchtchJcwKcxCcxDcxIcxFcxGcdCcxHbWHcxKcxJcxMcxLcEicEWcFPcEXcEicyIcxQcxRciDcxTcxUcxVczdcxXcxYcvdcxZcyacybcyccydcoUcyecyfcygcyhchEcyicygcyjctdbLQaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahaahaahaahaahaahaahaahaahabjbWHcykbWHczecymciiciiciiciiciiciiciiciociicynceHcyobWHcypcyqcyqcyqcyscytcyucyvcywcyxcyycwKcyzcyAcyBcyCcyDcwKcqXcyFcyGcyHcxGcdCcCZcwRcyJcwRcwRcwRcEicFTcFUcFPcGrczocyMcyNcyOcyPcyQcyRcyRcyScxXcvdcyTcyacyUcyVcyWcoUciEcyYbWHcyZceHczabWHceHczlbWHaaaaahaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabEzaaabJebJebJebJebJeaaaaQxaaaaaaaaaaaaaahaahciGciFciLczfczgczfceEceBceHceHceHczhcziczjceHceHczkbZpcznbWHczmciHczJczIczqczrczscyvcztczuczvcwKczwczxczyczzczAcwKciJczCcwLcwLczDcdCcjncwRczKczHczMczLcEicGtcFPcGucEicABczPczQcvcczRczSczTczUczVczWcvdczXczYczZcAacyVcoUbWHbWHbWHcqobWHcAbbWHbWHbWHbWHaahaahaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaahaaaaahaahaahaaabKIaaaaahaaaaahaaaaahaaaaQxaaaaaaaaaaahaahaaaabjabjbWHczpbWHceHchEceHceHcAdbWHbWHbWHbWHbWHchEczkcaQcgsbWHcAecAfcAgcAhcAicAjcAkciUcAmcAncAociVcAqcArcAscAtcAuciXcjbcAwcAxcwLcjmcAycAzcAAcAEcADcADcAGcEicGNcGNcGVcEicdHczPcAHcvccvccvccvccvccvccvccvdcvdcvdcAIcvdcvdcoUcxicAJckdcAKbWHceHcALcAMcANcAMabjabjaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocEicGWcGXcGXcEicBrcBtcBucBvcGYcHkcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaaabEybEybEybEybEyaahbEzaahbEybEybEybEybEyaahaQxaaaaaaaaaaafaaaaaaaahabjbWHbWHbWHcdebWHcgscAcczBbWHcAQcARcAQbWHcdeczkcBPcBPcBPcBPcBPcBPcBPcATcAUcAVcAWcAXcAYcAZcBacBbcBccBdcBecBfcBgcBhcBicBjcBkcBlcdCczEczFcBncACcACcBocEicGWcGXcGXcEicBrcBtcBucBvcpncCOcBycBzcBAcBBcBCcBDcBEcBFcBGcBHcdecBIceHceHbWHbWHcBJbWHbWHbWHbWHaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbEXbFabFabFabFabFfbEzbFtbFrbFrbFrbFrbFEaahcrMaahaahaahaQxaahaahaahaahaahaaabWHbWHbWHbWHbWHbWHbWHbWHbWHbWHbWHcqsczkcBPcjQcBLcBMcBNcBOcBPcBQcBRcBScyvcBTcBUcBVcwKcBWcBXcBXcBXcBYcwKcBZcCacCbcCccCdcCecCgcwRcChczHcCYcDccEicHocHqcHpcGrcIScCicCjcDecClcCmcCncCocCpcCqcCrcCscCqcCtcCucBHbWHcCwbWHcCvcCvcCxcCycCzcCAcCBaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcCCcjScCCaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaQxaahbJebJebJebJebJeaaabSbaahbJebJebJebJebJeaaaaQxaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaahaaaaaaaaaaahaaaaaabWHceHcCEcDfcCFcCGcCHcCIcCJcCKcCLcCMcCNcyvcjUcjTcCQcwKcCRcCScCTcCUcCVcwKcCWcCXcCXcwLbSLcDgcDUcDScEScDVcEUcETcEicHrcHBcHvcHDcEYcFQcDhcHMcDjcDkcDlcDmcDmcDncDocDpcDqcDrcjVcDtcDucDvcDwcDxcDycDzcDzcDzcDAcjWaahaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjScCCckncCCcjSaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrMaaaaahaaaaahaaaaahaaabBkaaaaahaaaaahaahaahaahcrMaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaaaaahaaaaaaaaaaahaaaaaabWHchEcDEcBPcDFcDGcDHcDIcDJckqcDLcDMcDNcyvcyvckMcyvcwKcwKcwKcwKcwKcwKcwKckNcwLcwLcAlcFRcwOcwPcApcFScFScGTcGRcEicIhcItcImcIucHLcHQcHPcIdcDXcDYcDZcEacEbcEccEdcEecEfcEgcEhcIycEjcEkcElcEmcEncEocEpcEqcErcjWaahaahaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcEtcjScEvckRcExcjScEtaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/MetaStation/z2.dmm b/_maps/map_files/MetaStation/z2.dmm
index 3ecffff05b3..11c23c50af0 100644
--- a/_maps/map_files/MetaStation/z2.dmm
+++ b/_maps/map_files/MetaStation/z2.dmm
@@ -190,7 +190,7 @@
"dH" = (/turf/simulated/wall/shuttle{icon_state = "swall_s10"; dir = 2},/area/shuttle/supply)
"dI" = (/turf/simulated/floor/plasteel/shuttle,/area/shuttle/supply)
"dJ" = (/turf/simulated/wall/shuttle{icon_state = "swall3"; dir = 2},/area/shuttle/supply)
-"dK" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply)
+"dK" = (/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply)
"dL" = (/obj/structure/closet,/turf/simulated/floor{tag = "icon-warningcorner (NORTH)"; icon_state = "warningcorner"; dir = 1},/area/centcom/supply)
"dM" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor{dir = 1; icon_state = "loadingarea"},/area/centcom/supply)
"dN" = (/obj/structure/closet,/turf/simulated/floor{icon_state = "floor"},/area/centcom/supply)
diff --git a/_maps/map_files/MiniStation/MiniStation.dmm b/_maps/map_files/MiniStation/MiniStation.dmm
index 181a961b31a..7eaad41fb6b 100644
--- a/_maps/map_files/MiniStation/MiniStation.dmm
+++ b/_maps/map_files/MiniStation/MiniStation.dmm
@@ -281,11 +281,11 @@
"fu" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/research{name = "Xenobiology Lab"; req_access_txt = "7"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fv" = (/obj/effect/landmark/start{name = "Scientist"},/obj/structure/stool,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"fw" = (/obj/effect/spawner/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/primary/central)
-"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage)
+"fx" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel{icon_state = "browncorner"; dir = 1},/area/quartermaster/storage)
"fy" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fA" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"fB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/secure_closet/cargotech,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/quartermaster/storage)
+"fB" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/cargotech,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellow"},/area/quartermaster/storage)
"fC" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/quartermaster/storage)
"fD" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/autolathe,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"fE" = (/obj/machinery/atmospherics/pipe/manifold/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -328,7 +328,7 @@
"gp" = (/obj/structure/table,/obj/item/weapon/wrench,/obj/item/weapon/crowbar/red,/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"gq" = (/obj/structure/table,/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas,/obj/item/clothing/glasses/science,/obj/item/clothing/glasses/science,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gr" = (/obj/machinery/newscaster{pixel_y = 32},/obj/structure/closet/l3closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"gs" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
+"gs" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"gt" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
"gu" = (/obj/machinery/door_control{dir = 2; id = "rnd"; name = "Shutters Control Button"; pixel_x = -24; pixel_y = -6},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -27; pixel_y = 3},/turf/simulated/floor/plasteel{icon_state = "whitepurple"; dir = 8},/area/medical/research{name = "Research Division"})
"gv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/research{name = "Research Division"})
@@ -1205,6 +1205,7 @@
"xi" = (/obj/machinery/microwave{pixel_x = -3; pixel_y = 6},/obj/structure/table/wood,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xj" = (/obj/structure/closet/crate/bin,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xk" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor/plasteel,/area/engine/engineering)
+"xl" = (/obj/structure/closet/wardrobe/white/medical,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"xm" = (/obj/structure/table,/obj/item/weapon/storage/firstaid/fire{pixel_x = 2; pixel_y = 6},/obj/item/weapon/storage/firstaid/fire{pixel_x = -2; pixel_y = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"xn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/door/firedoor,/turf/simulated/floor/plasteel,/area/engine/engineering)
"xo" = (/obj/machinery/atmospherics/pipe/simple/cyan/visible{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/plating{icon_state = "warnplate"; dir = 1},/area/engine/engineering)
@@ -1220,6 +1221,7 @@
"xy" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/wall,/area/crew_quarters/bar)
"xz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/item/device/radio/intercom{broadcasting = 0; freerange = 0; listening = 1; name = "Common Channel"; pixel_x = -25; pixel_y = 0},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/wood,/area/crew_quarters/bar)
+"xB" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/engine/engineering)
"xC" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/landmark/start{name = "Bartender"},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"xE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/bar)
@@ -1296,7 +1298,6 @@
"yY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/vending/snack,/turf/simulated/floor/plasteel,/area/hallway/primary/central)
"yZ" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor/plasteel,/area/engine/engineering)
"za" = (/turf/simulated/floor/plasteel,/area/engine/engineering)
-"zb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/plasteel{icon_state = "blue"; dir = 4},/area/engine/engineering)
"zc" = (/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engine/engineering)
"zd" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/turf/simulated/wall/r_wall,/area/engine/engineering)
"ze" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/yellow/visible{tag = "icon-intact (NORTH)"; icon_state = "intact"; dir = 1},/turf/simulated/floor/plating{icon_state = "warnplatecorner"; dir = 1},/area/engine/engineering)
@@ -1799,12 +1800,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwawvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxwAwBwCwDwEwFlPbxfXfXfXsusuwGsususuttwIsuwJsutCsufXwLwMwNwObxaaaaaaaaamamnPwPwQwRwStDnPamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaphvSvSvqvSwwvSwwwzwwvSwwvSwxvZambxbNbSbNbxbNwWwXwYwZnDbObxfXfXiUsuxaxbueufxeuGxgxhxixjuHsuidbxbxbxbxbxaaaaaaaaaaamhxxmuJpfuUxphxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavYwUwvwuvSwwvSwwvSwwvSwwvSwxvZambxbNbSbNbxbNxrxspxxsbTxubxfXfXfXsuxvxwxxxyxzxAqCxCxDxExFsubNbxamamaaaaaaaaaaaaaaaanPxGpfpfpfxHnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPnPxZyaybnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamamnPhxhxhxnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqwVvmvsvSvSvSvSvSvSvSvSvSvYvZambxcxnNprprprxLbxxMbxbTbObxxNfXxOsuuVsAxRwIxSsMxUxVxWsNuHsubNbxbxbxamaaaaaaaaaaaaaanPxZyaybpfxlnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxqvmvmvmvmvmvmvmvmvmwVxIambxyddtmGbNbNxrbxvobxyfygtNksksksyhyiyjykylsusususususuymsubNbMbNbMbLamamamamamamamnPnPhxhxhxnPnPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabxbybxbxbxbxbxbNxrbxbxbxbNmsynyojqypyqyrysytpryuyvbNmubNbNbNbNbNbxbybxamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaambxbNbMcTprprywpryxprprprprpryylYlYlYyzmYyAyAyAyAyAyAyAyAyAyAyAbxbxamamaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamuIbMbNyByCyAyAyAyAyAyAyAyAyAyAyDyEfXyFyGyAyAyHyHyIyIyJyJyKyLuTyBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzazbyByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaameXeXyBvgyOyPyRyQySyTyUyVyWyAyXikfXinyYyAyZyHyHyIyIyJyJyKzaxByByBamamzczczdzdzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamqIzazfzazgzgzgzazavwziyAzjfXfXfXzkyAyZyHyHyIyIyJyJzlzazmznqIaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqIzazqzrzsztztzrzazuzvzwzxzyzzzAzByAzCzDzDzEzEzFzFzGzHzIzJqJzLzLrmwyzOzPzcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaqIzazqzazRzSzSzTzTzUzazVzWzXvhzXzZvKAbAcAcAcAcAcAcAdAezmznqIaaaazczozozozcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/TgStation/tgstation.2.1.3.dmm b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
index 95d017a4a21..67e8dbb493b 100644
--- a/_maps/map_files/TgStation/tgstation.2.1.3.dmm
+++ b/_maps/map_files/TgStation/tgstation.2.1.3.dmm
@@ -3123,8 +3123,8 @@
"bic" = (/obj/structure/table,/obj/item/clothing/head/soft,/obj/item/clothing/head/soft,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bid" = (/obj/structure/table,/obj/item/weapon/hand_labeler,/obj/item/weapon/hand_labeler,/obj/machinery/requests_console{department = "Cargo Bay"; departmentType = 2; pixel_x = 0; pixel_y = 30},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bie" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/item/device/radio/intercom{broadcasting = 0; listening = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"bif" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
-"big" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
+"bif" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/botanist,/turf/simulated/floor/plasteel{icon_state = "hydrofloor"},/area/hydroponics)
+"big" = (/obj/machinery/camera{c_tag = "Cargo Bay North"},/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bih" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 30},/obj/machinery/light{dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bii" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/storage)
"bij" = (/obj/machinery/door_control{id = "qm_warehouse"; name = "Warehouse Door Control"; pixel_x = -1; pixel_y = 24; req_access_txt = "31"},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -3151,7 +3151,7 @@
"biE" = (/obj/structure/table,/obj/item/weapon/restraints/handcuffs,/turf/simulated/floor/plasteel{icon_state = "red"; dir = 10},/area/security/prison)
"biF" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"biG" = (/turf/simulated/floor/plasteel{dir = 4; icon_state = "warning"},/area/ai_monitored/security/armory)
-"biH" = (/obj/structure/grille,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/chemistry)
+"biH" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/floor/plating,/area/medical/chemistry)
"biI" = (/obj/machinery/hologram/holopad,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"biJ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor/plasteel{dir = 2; icon_state = "whitebluecorner"},/area/medical/medbay)
"biK" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel{dir = 2; icon_state = "whiteblue"},/area/medical/medbay)
@@ -3510,7 +3510,6 @@
"bpz" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Chemistry Lab"; req_access_txt = "5; 33"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/chemistry)
"bpA" = (/obj/structure/grille,/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/window/reinforced/fulltile,/turf/simulated/floor/plating,/area/medical/chemistry)
"bpB" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southleft{dir = 1; name = "Chemistry Desk"; req_access_txt = "33"},/obj/machinery/door/firedoor,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/medical/chemistry)
-"bpC" = (/obj/machinery/smartfridge/chemistry,/turf/simulated/wall,/area/medical/chemistry)
"bpD" = (/obj/structure/stool/bed/roller,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bpE" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (WEST)"; dir = 8},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
"bpF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/medbay)
@@ -4232,7 +4231,7 @@
"bDt" = (/obj/machinery/computer/security/mining,/obj/machinery/camera{c_tag = "Mining Dock"; dir = 4; network = list("SS13")},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"bDu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"bDv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
-"bDw" = (/obj/structure/rack{dir = 1},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/shovel{pixel_x = -5},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
+"bDw" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/closet/wardrobe/miner,/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"bDx" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall,/area/quartermaster/miningdock)
"bDy" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
"bDz" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft)
@@ -4496,7 +4495,7 @@
"bIx" = (/obj/structure/extinguisher_cabinet{pixel_x = -27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{dir = 5; icon_state = "whitehall"},/area/medical/research{name = "Research Division"})
"bIy" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
"bIz" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/plasteel{icon_state = "white"},/area/medical/research{name = "Research Division"})
-"bIA" = (/obj/structure/closet/secure_closet/scientist,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
+"bIA" = (/obj/structure/closet/wardrobe/science_white,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bIB" = (/obj/item/device/assembly/signaler{pixel_x = 0; pixel_y = 8},/obj/item/device/assembly/signaler{pixel_x = -8; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = 6; pixel_y = 5},/obj/item/device/assembly/signaler{pixel_x = -2; pixel_y = -2},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bIC" = (/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = -5},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 0},/obj/item/device/transfer_valve{pixel_x = 5},/obj/item/device/transfer_valve{pixel_x = 5},/obj/machinery/requests_console{department = "Science"; departmentType = 2; name = "Science Requests Console"; pixel_x = 0; pixel_y = -30},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"bID" = (/obj/item/device/assembly/timer{pixel_x = 5; pixel_y = 4},/obj/item/device/assembly/timer{pixel_x = -4; pixel_y = 2},/obj/item/device/assembly/timer{pixel_x = 6; pixel_y = -4},/obj/item/device/assembly/timer{pixel_x = 0; pixel_y = 0},/obj/structure/table/reinforced,/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
@@ -6009,7 +6008,7 @@
"clC" = (/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plasteel,/area/engine/engineering)
"clD" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
"clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plasteel,/area/engine/engineering)
-"clF" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/suit/hazardvest,/obj/item/clothing/suit/hazardvest,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/item/weapon/tank/internals/emergency_oxygen/engi,/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
+"clF" = (/obj/structure/closet/l3closet/scientist{pixel_x = -2},/turf/simulated/floor/plasteel{icon_state = "white"},/area/toxins/mixing)
"clG" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1; frequency = 1443; id = "air_in"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"clH" = (/obj/machinery/igniter{icon_state = "igniter0"; id = "Incinerator"; luminosity = 2; on = 0},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
"clI" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; initialize_directions = 1; internal_pressure_bound = 4000; on = 0; pressure_checks = 2; pump_direction = 0},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/engine/vacuum,/area/maintenance/incinerator)
@@ -6488,6 +6487,7 @@
"cuN" = (/turf/space,/turf/simulated/wall/shuttle{dir = 2; icon_state = "swall_f10"; layer = 2},/area/shuttle/pod_4)
"cuO" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/wall/shuttle{icon_state = "swall_f6"; dir = 2},/area/shuttle/pod_4)
"cuP" = (/obj/machinery/door/airlock/engineering{name = "Telecommunications"; req_access_txt = "61"},/turf/simulated/floor/plasteel,/area/tcommsat/computer)
+"cuQ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/weapon/pickaxe{pixel_x = 5},/obj/item/weapon/shovel{pixel_x = -5},/turf/simulated/floor/plasteel,/area/quartermaster/miningdock)
"cuR" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{dir = 4; on = 1},/obj/machinery/doorButtons/access_button{idSelf = "virology_airlock_control"; idDoor = "virology_airlock_interior"; name = "Virology Access Button"; pixel_x = 8; pixel_y = -28},/turf/simulated/floor/plasteel{dir = 10; icon_state = "warnwhite"},/area/medical/virology)
"cuS" = (/obj/machinery/atmospherics/binary/pump{dir = 1; on = 1},/obj/structure/sign/fire{pixel_x = 32; pixel_y = 0},/obj/machinery/doorButtons/access_button{idSelf = "incinerator_access_control"; idDoor = "incinerator_airlock_interior"; name = "Incinerator airlock control"; pixel_x = -8; pixel_y = 24},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/maintenance/incinerator)
"cuT" = (/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (NORTH)"; dir = 1},/turf/simulated/floor/plasteel,/area/quartermaster/storage)
@@ -6505,6 +6505,7 @@
"cvf" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_interior"; locked = 1; name = "Turbine Interior Airlock"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator)
"cvg" = (/obj/machinery/door/airlock/glass{autoclose = 0; frequency = 1449; heat_proof = 1; icon_state = "door_locked"; id_tag = "incinerator_airlock_exterior"; locked = 1; name = "Turbine Exterior Airlock"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/engine,/area/maintenance/incinerator)
"cvh" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2)
+"cvi" = (/obj/machinery/camera{c_tag = "Engineering East"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{tag = "icon-manifold-r-f (EAST)"; dir = 4},/obj/structure/closet/wardrobe/engineering_yellow,/turf/simulated/floor/plasteel{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6619,7 +6620,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDccsOcsOcsYarraDbarraDbarraDbarraDbarraCXaDeavMaBGaEqaAvaEraEsaEtaEuaEvaEwayuaExazEaEyaEzaEzaEAaEBaECaEDaEEaEFawKaEGaEGaEGawKaEHaEIaAEaafazNaEJaDyaEKaELaEMazNaafaxoaENaEOaEPaEQaDCaERaESaETaEUaEVaxKaEWaEXaDJaDJaDJaEYaEZaxKaFaaFaaxKaDJaxKaFbaoeaFcacAaeUaeUaeUaeUaeUamXawvaFdaFeaFfaFgaFeayoaFeaFiaFeaFjayZaFkaFlaFmaBdaFnaFoaFpaFqaFraFsaFtaFuaFuaFuaFuaFvaFwaFuaFuaFxaFyaFzaFAaBpaFBaFCaFDaFEaFFaFEaFGaFHaEfaEfaFIaEfaFJaFKaFLaEfaEiaFMaEiaFNaFOaFPaFQaFRaFSaFTaFUaFVaFWaFXaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcarrarrctiarraDbarraDbctaaDbarraDbarraCXaDeavMaBGaGcaAvaAvaGdaGeaGfaGgaAvayuayuayuayuaGhazEaAzaGiayuaGjaGkaBYaBYaBYaFhaBYaBYaBYaGmaAEaaaazNazNaGnaGoaGnazNazNaaaaxoaxuaxvaGpaGqaGraGsaGtaxvapNaGuaxKaGvaEXaDJaDJaDJaEYaGwaxKaAgaAgaxKaCsaxKaGxaGyaGzacAamXacAacAacAacAacAaGAaGBayZaGlaAmayZaGDayZaGEayZaGFayZaGGaGHaFmaBdaGIaGJaGKaGLaGMaGMaGNaGMaGMaGOaSOaGPaGQauwauwauwauwaGRaGSaGTaGUaGVamlaGWaGWaGWaGWaGXaEfaGYaGZaHaaGCaHcaHdaEfaLyaHfaEiaHgaHhaHiaHjaFRaHkaEjaEkaCTaHlaHmaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaDcaDdaDdaDaarraDbarraDbarraDbarraDbarraCXaDeavMaHpaHqaHraHsaHsaHtaHuaxaaHvaHwaHxaHyayuaHzazEazEaHAayuaHBaHCaBYaHDaHEaOwaHGaHHaHIaHJaAEaaaaafaaaaHKaHLaHKaaaaafaaaaxoaxuaxvaDCaHMaHNaHOaHPaxvapNasJaxKaHQaHRaDJaDJaDJaHSaHTaxKaaaaaaaHUaHVaHWaHXaHYbzZaIaaIbaHUaaaaaaaIcaIdaIeaIfayZaIgaAmaAmaAmaCxaAmaAmaAmayZaBdaIhaIiaBdaBdaApaIjaIkaIkaIlaImaInaIkaIoaIpaIpaIqaIpaIraIpaIsaGWaGWaItaGWaGWaGWaGWaIuaIvaGWaGXaEfaGZaIwaIxaIyaIzaIAaEfaIBaICaIDaIEaIFaIGaIHaIIaIJaBAaIKaFVaFWaILaFYaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaBEarsartarrarrarrarrarrarraCZarraCXaCYavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEaJFaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaBEarsartarrarrarrarrarrarraCZarraCXaCYavMaBGaxaaIOaIPaIPaIPaIPaIPaIPaIPaIQaxaayuaIRaISaIRayuayuaITaIUaIVaADaADaADaADaIVaIWaIXaAEaIYaIZaIZaJaaJbaJaaIZaIZaJcaxoaJdaxvaJeaxvaJfaJfaJgaxvaJhaJiaxKaxKaxKaAgaDHaAgaxKaxKaxKaHUaHUaHUaJjaHYaHYaHYaHYaHYaJkaHUaHUaHUaIcaJlaIeaJmayZayZayZayZayZayZayZayZayZayZaJnaJoaJpaJqaJraJsaJtaJuaIkaJvaImaJwaJxaJwaIpaJyaJzaIpaJAaIpaJBaJCaJDaJEbifaJFaJFaJGaJHaJIaGWaGXaEfaJJaIwaJKaIyaIzaJLaEfaJMaJNaJOaJPaJQaJRaJSaJTaJUaJVaJWaCTaHlaHmaFYaaaaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaBFaBEaDfaBEaDcaDcaDcaDcaBEaDgaEmaEnaqpaJZaxaaKaaHbaKbaKcaKbaKdarpaKeaKfaxaaKgaKhaKiaKiaKjaKiaKkaKlaKiaKiaKiaKiaKiaKiaKiaKmaKnaKoaKpaKqaKqaKraKsaKqaKqaKqaKtaKuaKvaKraKqaKqaKqaKwaGyaKxaHYaKyaKzaHZaIaaIaaIaaHXaHYaHYaKAaHYaHYaKBaKCaKDaKEaKFaKGaKHaHYaHYaKAaKJaKKaKLaKMaKNaKOaKPaKQaHYaKRaHYaBdaKSaKTaKUaJoaKVaKWaKXaKYaKZaLaaIkaLbaLcaLdaLeaLfaIpaLgaJzaLhaLiaIpaIpaLjaLkaLlaLmaLnaLoaLpaLqaLraGWaGXaEfaLsaLtaLuaLvaLwaLxaEfbhpaLzaEiaLAaLAaLAaLAaEiaLBaCRaJWaCTaBDaBDaBDaLCaLCaLCaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaavMaylavMavMavMavMavMavMaylavMaaaaqpaAuaLEaKaaLFaLGaLHaLHaLIarpaLJaKfaLKaLLaKhaLMaLNaLOaLPaLQaLRaKiaKiaKiaKiaKiaKiaKiaKmaKiaKhaKiaKiaKiaLSaLTaLUaLUaLUaLUaLVaLUaLWaLUaLUaLXaKhaGyaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaKAaHYaHYaLYaLZaMaaKIaMcaMbaMeaHYaHYaKAaHYaHYaHYaHYaHYaHYaHYaHYaHYaMgaHYaBdaKUaKUaKUaMhaMiaMjaMkaMlaMmaMnaIkaMoaImaMpaIkaIkaIpaMqaJzaMraLiaMsaIpaGWaGWaGWaGWaGWaGWaMtaMuaMvaGWaGXaEfaMwaGZaMxaMyaGZaMzaEfaEiaEiaEiaEiaEiaEiaMAaEiaEjaEjaEkaCTaMCaMDaBDaMEaMFaMGaMHaMIaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaafaafaafaafaztaqpavMatBavMaNTaNUaNVaNWavMatBavMavMaqpaBGaxaaKaaMJaMKaLHaLHaLIarpaMLaKfaxaaLLaKhaKiaMMaMNaMNaMNaMOaMPaMQaMNaMRaMNaMNaMNaMSaMNaMTaMNaMNaMNaMUaMVaMWaMXaMXaMYaMZaNaaNbaNcaKicrraKhaGyaHYaNeaHYaNfaNfaNfaNfaNfaNfaNfaNfaNgaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNfaNhaNfaNfaNfaNfaNfaNfaNfaNfaHYaHYaHYaBdaNiaNiaNiaNiaNiaNjaNkaJsaODaRdaIkaNmaNnaNoaIkaNpaIpaNqaNraNsaLiaNtaIpaGWaNuaNvaNwaNxaNwaNyaNzaNAaGWaGXaEfaNBaNBaNCaNDaNEaNEbqoaEfaNGaNHaNIaBDaNJaNKaNLaEjaEjaNMaNNaBDaNOaBDaNPaNQaNRaNRaNSaLDaLDaLDaLDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6638,12 +6639,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarpavMbdyavMaBGaxaaxaaMBavMbdAavMayqbdBbdCbdCbdDbdEbdFbdGbdHbdIbdJbdKbdLbdMbdMbdNbdOaWAaWAaWAbdPbdQaWAaOcaOcaOcaOcbdRaVbbdSbdTaVbbdUaYoaYpbdVaZGaZGbdWbdXaYpbdYaYvbdZbaHbaHbeabebbecbedaHYaWUaYxbaObeebaPbaPbefbaRbaSbegbcWaXfbeibejbekbekbekbelbemaXkbdzbeobepbeqberbajbesbajbetaYHaXqaHYaHYbeubeubeubeubeubeubeubevbewbewbexbeybeybevbezbezbezbezbezbeAbeAbeBbeCbeAbeAbeAbeAbeDaXFbeEbeFbeGbeHbeIaXFaXFaXFbeJbeJbeKbeKbeKbeKbeKbeLbeMbeMbeMbeNbeMbeObePbeMbeMbeQbeRbeRbeRbeRbeSbeTbeUbeVaLDaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaztaqpazuatBavMaymaynbeWbeXavMatBazuavMaqpaztarpbdDbeYbeZbeZbeZbfabdJbfbbfcbfdbfdbfebffaWAaYdbfgbdPbfhaWAbfibfiaQEaQEbfjbfkbflbfmbflbflbfnaYpbfobfpaZGaZGbdXbfqbfraYvbfsbaHbaHbeabftbfubedaHYbfvaYxbfwaYAbfxbfybfzbfAbaSbfBaYxaafbfCbfDbfDbfDbfEbfFbfGaafaYHbfHbfIbfJbfKbajbfLbajbfMaYHaXqaHYbfNbeubfObotbfQbfRbfSbeubehbfVbfVbfWbfXbfXbfXbfYbfZbgabgbbezbgcbgdbgebgdbgdbgfbggbeAbeGbghbeGbeGbeGbgibeIbeIbgjbeIbgkbgkbeKbglbgmbgnbeKbgobgpbgobeKbgqbgrbgqbeRbgsbgtbgsbeRbgubgvbeRbgwbgxaLDaLDaLDaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaafaafavMbdyavMavMavMavMavMavMbdAavMaafaafaafaaabdDbgybdDbgzbeZbgAbgBbcraVbbgCbgDbgEbgFbgGbgGbgGbgGbgGbgGbgHbgIbgJbfdbgKbgLaYpaYpaYpaYpaYpaYpbgMaYpaYpaYpbgNbgObgPbgQbgRbaHbaHbeabgSbecbedaHYbgTaYxbgUaYAaYAaYAaYAbfAbaSbgVaYxaafbfCbfDbgWbgXbgYbfDbgZaafaYHbhabbYbhbbhcbajbesbajbajaYHaXqaHYaHYbeubqqbhebhfbhgbhhbhibfXbhjbfXbhkbfXbfXbhlbfYbhmbhnbhobezbhqbgdbkibgdbhqbhrbgdbeAbhsbhsbhubhvbeGbhwbeIbhxbhybhzbhAbhAbeKbhBbhCbhDbhEbhFbhGbhHbeKbhIbhJbhKbeRbhLbhMbhLbhNbhObhObeRbhPbgxaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebifbigbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhqbgdbkibiPbhqbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaacuzaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbhQbhRbhSbhTbhTbhUbhVaWPbhWaOcbhXbhYbhZbhZbhZbiabiabiabiabiabiabiabibbgNbicbidbiebigbjxbihbiibijaYpbikbilbimbinbinbiobaHbaHbeabaHaYvbedaHYaWUbipbiqbirbisbitaYAbiubaSaYxaYxaafbfCbfDbgXbfDbgXbfDbgZaafaYHaYHbivbcZbiwbajbixbiybizaYHaXqaHYbiAbiBbiCbiDbqrbiFbrWbiHbfXbiIbiJbiKbiLbiLbiMbfYbiNbhnbiObezbhqbgdbkibiPbhqbiQbiRbeAbiSbiTbiUbiVbeGbgibeIbiWbiXbiXbiYbiZbjabjbbjcbjcbjcbjdbjebjfbeKbjgbhJbjhbeRbjibjjbjkbjlbjmbjnbeRbhPbgxbjobjobjobjoaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaFZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafaafaaabdDbjpbdDbjqbjrbjrbjsbdDbjtbjtaOcbjubjvbjubjubjubjvbjuaOcaOcaYpaYpaYpbjwbgNbjxbjxbjybjxbjxbjxbiibjxbjzbjAbjBbjCbjDbjEbjEbjEbjEbjFbjGbjHbjIbjJbjKbjLbjMbjNbjObjPaYAbfAbaSaYxaafaafbfCbfDbgYbjQbgWbjRbgZaafaafaYHbjSbjTaYHaYHaYHaYHbjUaYHbjVaHYaHYbeubjWbhebjXbhgbhhbjYbfXbjZbkabkbbkcbtmbkebezbkfbkgbkhbezbhqbgdbnZbkjbhqbkkbgdbeAbeGbeGbeGbeGbeGbgibeIbklbkmbknbkobkpbkqbkrbksbktbktbkubkvbkwbeKbkxbhJbkybeRbkzbkAbkBbkCbkDbkEbeRbhPbkFbkGbkHbkIbkHaaaaaaaafaaaaafaaaaafaaaaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaafaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbkJbhRbkKbjrbkLbkMbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbkObkPbkQbkRbkSbkSbkTcuTbkSbkSbkUbkSbkVbkWbkXbkYbkZbecbecbecblaaYvblbaYvblcbldaKAbipbleblfblfblfblfblgblhbliaafaaabljblkbllbfDbfDblmbgZaaaaafblnbloblpblqblrblsblnbltblnbluaHYaHYbeublvbhectCblwblxbeublybjZbkablzblAbfXblBbezblCblDblEbezblFblGblHblIblJblKblLblMblNblOblNblNblNblPbeIblQbhyblRblSblTbkqblUblVblWblWblXblYblZbeKbmabgrbmbbeRbmcbmdbmebkCbhObmfbeRbhPbmgbmhbmibmibmibmibmibmibmjaafaaaaafaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaafaaabdDbmkbhRbhRbhRbdDbdDbdDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkNbmlbjxbmmbmnbmobmnbmncuUbmnbmnbmpbmnbmqbmrbmsbmtbmubmvbecbmwbaHbmxbmybmzbedbmAbmBbipbipblibmCbmDbmEbmFbmGbliaaaaaabfCbmHbmIbmJbmIbmKbgZaaaaaablnbmLbmMbmNblnbmOblnbltblnbluaHYaHYbeubmPbhebjXbmQbmRbeubmSbmTbmUbmVbmWbfXbmXbezbfYbmYbmZbezbeAbnabeAbeBbnbbncbncbncbncbncbncbncbncbgibeIbndbkmbknbnebnfbngbnhbnibnibniblXbkvbnjbnkbnlbnmbnnbnobnpbnqbnpbnrbhObnsbeRbntbnubnubnubnubnubnubnubnvbgxbjobjobjoaaaaaaaafaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbnxbjxbjxbjxbnybnzbnzcuVbjxbjxbjxbjxbjzbnAbeabnBbnCbnDbnEbnFbnGbnHbaHbmzbnIbnJbnKbnLbnMbnNbnObnPbnQbnRbnSbliaafaaabfCbnTbnUbnUbnUbnVbgZaaaaafblnbnWbnXbnYblnbRIblnbltblnboaaHYaKJbobbocbodboebofbogbeubohbjZbhkbmVboibojbmSbmSbokbolbombonboobopbfXboqborbosbvtboubovbowboxboybncbgibeIbozboAboBboCboDbeKboEbnibniboFboGbkvboHboIboJboKboLbnoboMboNbhOboOboPboQbeRboRbrVbrVbrVbrVbrVbrVbrVbhPbgxboTboUbjobjoaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxcuWbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbpCbeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbenbrZbfUbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaboVboWboVboXboYbjxbjxbiibjxbjxcuWbjxbjxboZaYpaYpbpabpbbjEbpcbpdbecbpebaHbpfbaHbpgblubmAbphbpibpjbpkbplbpmbpnbpobppbliaaaaaabfCbpqbprbpsbprbptbgZaaaaaabpubpvbpwbpubpubpubpubpxbpubpyaKAaKAbeubeubpzbpAbpBbeubeubpDbjZbpEbpFbpFbpFbpFbpFbpGbpHbpIbpJbpFbpKbpFbpLbpMbosbpNbpObpPbpQbpRbpSbncbpTbpUbpVbpWbpWbpXbpYbpZbqabqbbqbbqcbqdbkvbqebqfbqgbqhbqibnobnobqjbqkbqlbqmbnobeRbrVbrVbrXbenbrZbfUbsabrVbqsbqtbqubqvbqwbjoaaaaafaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqxbqybqxbqzbjxbjxbjxbnybnzbnzcuVbjxbjxbqAbqBaYpbqCbaHbaHbqDbqEbqFbqGbaHbaHbaHbpgblubqHaHYbpibpjbqIbqKbqJbqLbqMbqNbliaafaafbqObqPbqQbqRbqSbqTbqUaafaafbqVbqWbqXbqYbqZbrabrbbrcbpubrdaHYaHYbmVbrebrfbrgbrhbribrjbrkbrlbrmbrnbrnbrnbrnbrnbrobrpbrqbrrbrsbrtbrubrvbrwbosbrxbrybrzbrAbrBboybncbgibeIbrCbrDbrEbrFbrFbeKbrGbrHbrIbnkbrJbkvbrKbnkbrLbrMbrNbrObrPbrQbrRbrSbrTbrUbhtbthbtgbtjbtibtibtibtlbtkbqnbgxbsdbsebsebjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnwbkNbkNbsfbjxbjxbjxbiibjxbjxcuWbjxbjxbqAbsgaYpbshbsibjEbsjbskbslbeabaHbaHaZhbmzbsnbqHaHYbpibpjblibsobspbsqbsrbssbliaaaaaaaafbfCbstbsubstbgZaafaaaaaabqVbsvbswbsxbsybszbszbsAbsBbsCaHYaHYbmVbsDbfXbsEbsFbsGbsHbsGbsIbsJbsKbsLbsKbsKbsKbsMbsNbfXbhkbsObsPbsPbsQbsRbosbosbsSbsTbsUbpRboybncbeHbeIbsVbsVbsVbsVbsVbeKbnkbnkbnkbnkbsWbsXbsYbnkbsZbtabtbbtcbtcbtcbtcbtdbtebtfbrYbuAbuzbuCbuBbuBbuDbwabrVbsbbgxbsdbsebseabtaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabtobqxbqybqxbmlbtpbjxbjxbtqbjxbtpcuWbjxbjxbqAbtraYpbtsbttbnGbtubtvbecbpbbjEbtwbtxbmzbsnbqHaWUbpibtyblibtzbtAbtBbtCbmGbliaaaaaaaafbtDbtEbnUbtFbtGaafaaaaaabqVbtHbtIbtJbtKbtLbtMbtNbpubtOaHYaHYbmSbmSbtPbtQbpGbtRbtSbtTbtUbtVbtWbtXbtWbtXbtWbtXbtWbtXbtYbtZbsPbuabubbucbudbuebufbugbuhbuibujbncbukbulbumbnmbunbhJbhJbuobhJbhJbupbuqburbusbutbtcbuubuvbuwbuxbuxbuxbuybuybuybuybuybwcbwbbwebwdbwebwfbwebrVbsbbgxbwgbqvbwhbjoaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6657,8 +6658,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaelctjaekctjaejaaaaafaaabwlbwlbDtbxrbDubDvbDwbDxbDybDybDzbDAbDBbDCaafbDDbDEbDFbDGbDHbDIbDJbDIbDKbDIbDIbDIbBdbDLbDMbDNbBhbDObDPbDQbDRbDSbCvbDTbBjbBhbDUbDVbDWbDXbDYbDZbEabEbbCCbEcbCCbxQbEdbEebEfbEgbtXbEhbEibCCbCCbEjbEkbmSbmSbmSbmSbmSbElbEmbpGbEnbEobEpbBKbEqbAwbzibgibBMbCWbCWbCWbCWbCWbCWbCWbBMbErbEsbEtbEubEvbBNbEwbExbEybEzbEAbEBbECbEDbEDbEDbEDbEEbEFbEGbDnbjobvZbEIbEJbEJbEKbELbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbENbEObENaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNcuCctMcuCafNbERbERbERbwlbESbxrbETbEUbEVbEWbwlbBcbEXbBcbBcbEYbEZaaabFabFbbFcbFdbDIbDIbFebDIbFfbFgbFhbDIbBdbDLbFibFjbBhbFkbFlbFmbFnbFobCvbFpbBjbzibFqbFrbFsbFrbFtbFubtXbFvbCIbFwbCIbFxbtSbFybCJbFAbtXbFCbCCbCCbCCbCCbGNbmSbPIbFEbFFbFGbBEbFHbvlbFIbBKbBKbFJbFKbFLbFMbFNbBMbCWbCWbCWbCWbCWbCWbCWbBMbFObFPbFQbFRbFSbFTbFUbFVbtbbFWbFXbEDbFYbEDbEDbEDbEDbEDbEDbEDbDnbFZbDpbGbbGcbGdbGebGfbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbGgbENbEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekajxctyajxaekbERbGhbGibwlbGjbxrbGkbxrbxrbEWbwlbGlbGmbGnbBcbEYbEZaafbFabGobGpbGqbGrbGsbGrbGrbGtbGubGrbGrbGvbGwbGxbGybBhbGzbBhbBhbBhbBhbGAbGBbGCbGDbGEbGFbGGbGHbGIbGIbtXbGJbGKcltbGMbGQbtXbGObGPbGSbtXbGRbDqbEHbDrbFDbGWbmSbGXbGYbpFbGZbHabHbbHcbCRbHdbAQbBKbHebAwbzibgibBMbBMbHfbCWbCWbHgbHfbBMbBMbHhbHibHjbHkbHlbBNbHmbHnbtbbHobHpbHqbHqbHrbHsbHtbHqbHubHvbHwbHxbHybGabHAbHBbHCbHDbHEbEMaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObHGbHHbHIbEObHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdbIAbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrbxrbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajxajxajxctLbHKbxrbxrbHLbGjbxrbxrbxrbxrbEWbwlbHMbGnbHNbBcbEYbEZaaabFabHObHPbHQbDIbDIbHRbDIbHSbHTbHUbHVbBdbHWbHXbHYbHZbIabIbbIbbIbbIbbIbbIcbIbbIdbIebIfbIgbIhbIibIjbtSbtSbtSbtSbtSbtSbtSbtSbtSbtSbMNbMNbMNbMNbMNbMNbOnbOCbmSbmSbmSbmSbIlbImbhjbAwbAwbAwbAwbAwbAwbzibgibBMbInbIobIpbIqbIrbIsbInbItbHhbHibHjbIubIvbIwbIxbIybuwbIzbDdclFbIAbIBbICbIDbIEbEDbEDbIFbDnbIGbGLbIIbDdbIJbIKbIKbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObILbIMbIMbIMbINbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaekctyctyctyaekbERbIObIPbIQbIRbxrcuQbISbITbIUbwlbBcbBcbBcbBcbEYbDCaafbIVbDEbIWbDGbIXbDIbIYbDIbDIbDIbDIbDIbBdbDLbIZbJabJbbJcbJcbJcbJcbJcbJcbJdbJebJfbJgbJhbJibJjbJkbJlbJmbJnbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJmbJobJpbmSbGXcqlbBDbJrbBEbJsbJtbJubJvbJvbJwbJxbJgbJybJzbBMbJAbJBbJCbJDbJEbJFbJGbItbItbItbItbItbItbJHbJIbJJbJKbJLbDdbDnbDnbDnbDnbDnbDnbJMbEDbEDbDnbjobvZbgxbDdbJNbJObJPbJQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabJRbJSbJRbIMbJTbIMctxctlbENaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafNajZctzctAafNbERbERbERbwlbwlbERbERbERbwlbwlbwlaaaaaaaaabJYbJZbEZaaaaaaaafaaabBdbKabKbbKcbDIbKdbKebKfbKgbKhbKibKjbKkbKlbKmbKnbKobKpbKqbKmbKmbKmbKmbKmbKrbKsbKmbKmbKtbKmbKubKmbKmbKmbKmbKmbyebyebyebyebyebyebyebyebKvbKwbmSbKxbKybKzbKAbKBbKCbKDbKEbKFbKFbKGbKFbKFbKHbKIbBMbKJbKKbKLbKKbKMbKKbKNbKObKPbKQbKRbKSbKTbKUbyqbHnbqibKVaafbKWbKXbKYbKZbLabKZbLbbLcbLdbDnbLebsbbLfbDdbDdbDdbDdbDdaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafaafbEObEObLgbIMbIMbIMbLhbEObEOaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeYctjctkctjaeWaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaafbJYbEYbEZaafaafaafaafbBdbBdbBdbBdbBdbBdbBdbBdbBdbBdbLjbLkbLlbLmbKmbKnbKobKpbKqbLnbLnbLobLpbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLBaVQbLDbLDbLDbLDbLDbLDbLEbyebKvbLFbLGbLGbLGbLGbLGbLHbLIbLJbLGbLGbLGbLGbLGbLGbLFbLKbLLbLMbLNbLObLNbLPbLQbLRbLSbLSbLSbLSbLSbLSbLTbLUbLVbqibKVaafbKWbLWbLWcuEbLYcuFbMabMbbMcbDnbMdbsbbkFbjobMebMfbjoaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaafaafbHFbEObMgbMhbMibMjbHFaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaaIaafaaaaafaaIaafaaaaaaaaaaaabJYbEYbEZaaaaaaaaaaafbMkbMlbMlbMmbMnbMobMobMpbMpbMkbDLbMqbKkbMrbKmbMsbMtbMtbMubMvbLnbMwbMxbMybMzbMAbMBbMCbMDbMEbMFbMGbMFbMHbMIbMJaafbMKbMKbMKbMKbMKbMLbyebKvbMMcqzbMObMPbMQbLGbMRbMSbMTbLGbMUbMVbMWbMVbMUbLFbMXbBMbKKbKKbKKbMYbKKbKKbMZbNabNbbNbbNcbNbbNbbNdbNebNfbNgbKVaafbKWbLWbNhbKZbNibKZbNjbNkbNlbDnbsebsbbkFbjobsebsebjoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbEObENbNmbENbMjaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -6688,7 +6689,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaabZXchEbZZaafbZXchEbZZaafbZXchEbZZaaaaafaafaafaaaaaaaaaaagcjucjvcjubGnbGnbBcaaaaaachGcjwcjxcjycjzcjAchGaaabBccaXbGnciBchIceKciCciCciDceKcjBcgccjCcjDcjEcjFcjCcgccjCcjCcgccjGcjHcjIciIcjJcjKcjLceScjMceKbMKciVciWciVbMKciXciYciXbMKciZcjacjbbMKaafaafaafaafcnDaafcdjcdjcdjcjQcjRcjScvfcjUcjRaafaaaaafcfDaaaaaaaaaaaaaaaabtaafaafaafaafaafaafaaaaaaaaaaaaaaaaaabXkbsecjWbjocjXbsebjocjYbmhbmhcjZbmhbmibmibmickackackbchBckcckdckechBaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaafbZXchEbZZaaabZXchEbZZaaabZXchEbZZaafaafaaaaafaafaaaaaaaagbBcbBcbBcbBcbGnbBcaafaafchGckfckgckhckickfchGaafbBcceKckjckkcklceKciCciDciDceKckmcknckockpceSckqckrcksckrckrcktckuckvckwckxckyckyckyckzckAceKbMKciVcjNciVbMKciXcjOciXbMKcjbcjPcjbbMKaaaaaaaafaafaaaaaaaaaaaaaaackBcjRckCckDcuScjRaafaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkckFbsebWwcgEbsebjobjobjobjobjobsebjoaafaaaaaaaaaaafckGckGckHckGckGaafaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqaaabZXckIbZZaaabZXckIbZZaaabZXckIbZZaaaabfaaaaaaaafaafaaaaaaaaaaaaaaabJYbGnbJYaaaaaachGccNckKckLckMckNchGchGchGceKckOckkckPceKceKceKceKceKckQceRckRciHceSceRceRceRckSckTckUceSceSciHceRckVceRceRckWckXceKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKbMKaaaaafaafaaaaaaaaaaaaaaaaaackYcjRcjScvgcjUcjRaaaaafaaaaaaaaaaaaaaaaaaaaaabtaaaaaaaaaaaaaaaaafaaaaaaaaaaaaaaaaaabXkbsebuEbjoclabsebsebsebsebsebsebsebjoaafaaaaaaaaaaafaaackGclbckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEclFceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfaaaaafaaaaafaaaaafaaaaafaaaaafaaaaafaaaabfaaaaaaaaaaafaafaaaaaaaaaaaabJYbGnbJYaaaaaachGclccldcleclfclgclhclicljclhclkcllclmclncloclpclqclrclschLcqqcluclvclwclxclyclzclyclzclAclBclCchLchLclDchLclEcviceKceKceKceKceKcgccgccgccgcceKaafaafaafaafaafaafaaaaaaaaaaaaaaaaaaaaackYcjRclGclHclIclJaaaaafaafaafaafaaeaafaaaaaaaafaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaabXkbXkbXkbjocipbjobjoclKclLbLebMdbjobjoaafaaaaaaaaaaafaaackGckHckGaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabfabfabfabfabfabqabfabfabfabfabfabfabfabfabfaaaaaaaaaaaaaafaafaaaaaaaafbJYbGnbJYaafaafchGclMclNclOclPclQclRclSclTclRclUclVclWclXclYclZcmaclZcmbcmccmdcmecmfcmgcmhcmicmjcmkcmjcmlcmmcmnchPcmecmochPcmpcmqchPcmrceRcmsceKcmtcgccuOcuLcuLcuNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYcjRcjRcmvcjRcjRaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaaaaaaaafcmwaafbjobjobXkbXkbjobjoaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaabJYbGnbJYaaaaaachGcmycmzcmAcmBcmCchGcmDcmEchGcmFceRcmGciHceScmHcjCcmIciIcmJcmKcmLcmLcmLcmMcmNcmOcmPcmQcmRcmMcmScmSckUceRckVciIcmTcmUcmVchLcmWcmXcgUcmXcuGcuJcuIcuHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaackYaagcjRcmZcjRcnaaafaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaeaaaaaaaaaaaaaaaaafcnbaafaaaaafaaaaaaaafaaaaaaaafaaaaaaaaaaafaaaaaacmxaaaaaaaafaaaaafaaaaaaaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafbBcbBcbRAbBcbBcaaachGcnccndcnechGchGchGchGchGceKcnfceRcmGcngcnhcnicjCcnjciIcnkcnlcnmcnncnoceKcnpcnqcnrcnscntceKcnucnvcnvcnlcnkciIcnwcnxceSceRcnyceKcnzcgccuKcuLcuLcuMaaaaaaaaaaaaaaaaaaaaaaaeaaaaaaaaaaaacfDaagcnBcnCcnBaagaafaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafaafaaaaaaaaaaaaaaaaafcnDaafaaaaafaaaaaaaafaaaabfabfabfabqaafaafaafaafcmxaafaafaafaafaafabqabfabfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
diff --git a/_maps/map_files/generic/z2.dmm b/_maps/map_files/generic/z2.dmm
index 9dc7e9110c2..da78e2558b4 100644
--- a/_maps/map_files/generic/z2.dmm
+++ b/_maps/map_files/generic/z2.dmm
@@ -271,7 +271,7 @@
"fk" = (/obj/machinery/door_control{desc = "A remote control switch for port-side blast doors."; icon_state = "doorctrl0"; id = "CentComPort"; name = "Security Doors"; pixel_y = 28; req_access_txt = "101"},/obj/structure/showcase/fakeid,/turf/simulated/floor/plasteel/black,/area/centcom/control)
"fl" = (/obj/structure/table/reinforced,/obj/item/weapon/pen,/turf/simulated/floor/plasteel/red/side{dir = 2},/area/centcom/evac)
"fm" = (/obj/structure/table/reinforced,/obj/item/toy/carpplushie,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plasteel/red/side{dir = 6},/area/centcom/evac)
-"fn" = (/obj/structure/closet/secure_closet/cargotech,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply)
+"fn" = (/obj/structure/closet/wardrobe/cargotech,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply)
"fo" = (/obj/structure/closet,/turf/simulated/floor/plasteel/warning/corner{dir = 1},/area/centcom/supply)
"fp" = (/obj/structure/closet,/turf/simulated/floor/plasteel,/area/centcom/supply)
"fq" = (/obj/structure/closet/secure_closet/quartermaster,/turf/simulated/floor/plasteel/loadingarea,/area/centcom/supply)
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 1aebe1bce3b..008fa9a04a2 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -81,7 +81,8 @@
#define MINERAL_MATERIAL_AMOUNT 2000
//The amount of materials you get from a sheet of mineral like iron/diamond/glass etc
-
+#define MAX_STACK_SIZE 50
+//The maximum size of a stack object.
#define CLICK_CD_MELEE 8
#define CLICK_CD_RANGE 4
diff --git a/code/__HELPERS/names.dm b/code/__HELPERS/names.dm
index 85eb94093cd..ca085a415c4 100644
--- a/code/__HELPERS/names.dm
+++ b/code/__HELPERS/names.dm
@@ -131,7 +131,7 @@ var/syndicate_name = null
syndicate_name = name
return name
-var/gang_name_pool = list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron")
+var/gang_name_pool = list("Clandestine", "Prima", "Zero-G", "Max", "Blasto", "Waffle", "North", "Omni", "Newton", "Cyber", "Donk", "Gene", "Gib", "Tunnel", "Diablo", "Psyke", "Osiron", "Sleeping Carp")
var/gang_A_name = null
var/gang_B_name = null
/proc/gang_name(var/gang)
diff --git a/code/controllers/subsystem/lighting.dm b/code/controllers/subsystem/lighting.dm
index cd74bb16b84..a039417c3a3 100644
--- a/code/controllers/subsystem/lighting.dm
+++ b/code/controllers/subsystem/lighting.dm
@@ -32,62 +32,55 @@ var/datum/subsystem/lighting/SSlighting
/datum/subsystem/lighting/fire()
changed_lights_workload = MC_AVERAGE(changed_lights_workload, changed_lights.len)
-// for(var/area/A in sortedAreas)
-// A.luminosity = 1
-
- for(var/datum/light_source/thing in changed_lights)
- thing.check()
+ for(var/thing in changed_lights)
+ var/datum/light_source/LS = thing
+ LS.check()
changed_lights.Cut()
changed_turfs_workload = MC_AVERAGE(changed_turfs_workload, changed_turfs.len)
- for(var/turf/thing in changed_turfs)
- if(thing && thing.lighting_changed)
- thing.redraw_lighting()
+ for(var/thing in changed_turfs)
+ var/turf/T = thing
+ if(T.lighting_changed)
+ T.redraw_lighting()
changed_turfs.Cut()
-// for(var/area/A in sortedAreas)
-// A.luminosity = !A.lighting_use_dynamic
-
//same as above except it attempts to shift ALL turfs in the world regardless of lighting_changed status
//Does not loop. Should be run prior to process() being called for the first time.
//Note: if we get additional z-levels at runtime (e.g. if the gateway thin ever gets finished) we can initialize specific
//z-levels with the z_level argument
/datum/subsystem/lighting/Initialize(timeofday, z_level)
-// for(var/area/A in sortedAreas)
-// A.luminosity = 1
- for(var/datum/light_source/thing in changed_lights)
- thing.add_effect()
- thing.changed = 0
+ for(var/thing in changed_lights)
+ var/datum/light_source/LS = thing
+ LS.check()
changed_lights.Cut()
var/z_start = 1
var/z_finish = world.maxz
- if(1 <= z_level && z_level <= world.maxz)
+ if(z_level >= 1 && z_level <= world.maxz)
z_level = round(z_level)
z_start = z_level
z_finish = z_level
var/list/turfs_to_init = block(locate(1, 1, z_start), locate(world.maxx, world.maxy, z_finish))
- for(var/turf/T in turfs_to_init)
+ for(var/thing in turfs_to_init)
+ var/turf/T = thing
T.init_lighting()
if(z_level)
//we need to loop through to clear only shifted turfs from the list. or we will cause errors
var/i=1
- for(var/turf/thing in changed_turfs)
- if(thing && thing.z < z_start && z_finish < thing.z)
+ for(var/thing in changed_turfs)
+ var/turf/T = thing
+ if(T.z in z_start to z_finish)
++i
continue
changed_turfs.Cut(i, i+1)
else
changed_turfs.Cut()
-// for(var/area/A in sortedAreas)
-// A.luminosity = !A.lighting_use_dynamic
-
..()
//Used to strip valid information from an existing instance and transfer it to the replacement. i.e. when a crash occurs
@@ -99,14 +92,13 @@ var/datum/subsystem/lighting/SSlighting
if(!istype(SSlighting.changed_lights))
SSlighting.changed_lights = list()
-// for(var/area/A in sortedAreas)
-// A.luminosity = 1
-
- for(var/datum/light_source/L in SSlighting.changed_lights)
+ for(var/thing in SSlighting.changed_lights)
+ var/datum/light_source/LS = thing
spawn(-1) //so we don't crash the loop (inefficient)
- L.check()
+ LS.check()
- for(var/turf/T in changed_turfs)
+ for(var/thing in changed_turfs)
+ var/turf/T = thing
if(T.lighting_changed)
spawn(-1)
T.redraw_lighting()
@@ -123,6 +115,3 @@ var/datum/subsystem/lighting/SSlighting
varval2 = "/list([length(varval2)])"
msg += "\t [varname] = [varval1] -> [varval2]\n"
world.log << msg
-
-// for(var/area/A in sortedAreas)
-// A.luminosity = !A.lighting_use_dynamic
\ No newline at end of file
diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm
index ccd49428120..35236b38fb6 100644
--- a/code/controllers/subsystem/objects.dm
+++ b/code/controllers/subsystem/objects.dm
@@ -9,6 +9,7 @@ var/datum/subsystem/objects/SSobj
priority = 12
var/list/processing = list()
+ var/list/burning = list()
/datum/subsystem/objects/New()
NEW_SS_GLOBAL(SSobj)
@@ -37,5 +38,9 @@ var/datum/subsystem/objects/SSobj
++i
continue
SSobj.processing.Cut(i, i+1)
-
-
+ for(var/obj/burningobj in SSobj.burning)
+ if(burningobj && (burningobj.burn_state == 1))
+ if(burningobj.burn_world_time < world.time)
+ burningobj.burn()
+ else
+ SSobj.burning -= burningobj
\ No newline at end of file
diff --git a/code/datums/martial.dm b/code/datums/martial.dm
index 865209ab97e..8c5c136980e 100644
--- a/code/datums/martial.dm
+++ b/code/datums/martial.dm
@@ -265,7 +265,132 @@
return 1
+//Used by the gang of the same name. Uses combos. Basic attacks bypass armor and never miss
+#define WRIST_WRENCH_COMBO "DD"
+#define BACK_KICK_COMBO "HG"
+#define STOMACH_KNEE_COMBO "GH"
+#define HEAD_KICK_COMBO "DHH"
+#define ELBOW_DROP_COMBO "HDHDH"
+/datum/martial_art/the_sleeping_carp
+ name = "The Sleeping Carp"
+
+/datum/martial_art/the_sleeping_carp/proc/check_streak(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(findtext(streak,WRIST_WRENCH_COMBO))
+ streak = ""
+ wristWrench(A,D)
+ return 1
+ if(findtext(streak,BACK_KICK_COMBO))
+ streak = ""
+ backKick(A,D)
+ return 1
+ if(findtext(streak,STOMACH_KNEE_COMBO))
+ streak = ""
+ kneeStomach(A,D)
+ return 1
+ if(findtext(streak,HEAD_KICK_COMBO))
+ streak = ""
+ headKick(A,D)
+ return 1
+ if(findtext(streak,ELBOW_DROP_COMBO))
+ streak = ""
+ elbowDrop(A,D)
+ return 1
+ return 0
+
+/datum/martial_art/the_sleeping_carp/proc/wristWrench(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(!D.stat && !D.stunned && !D.weakened)
+ D.visible_message("[A] grabs [D]'s wrist and wrenches it sideways!", \
+ "[A] grabs your wrist and violently wrenches it to the side!")
+ playsound(get_turf(A), 'sound/weapons/thudswoosh.ogg', 50, 1, -1)
+ D.emote("scream")
+ D.drop_item()
+ D.apply_damage(5, BRUTE, pick("l_arm", "r_arm"))
+ D.Stun(2)
+ return 1
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/backKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(A.dir == D.dir && !D.stat && !D.weakened)
+ D.visible_message("[A] kicks [D] in the back!", \
+ "[A] kicks you in the back, making you stumble and fall!")
+ step_to(D,get_step(D,D.dir),1)
+ D.Weaken(4)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ return 1
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/kneeStomach(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(!D.stat && !D.weakened)
+ D.visible_message("[A] knees [D] in the stomach!", \
+ "[A] winds you with a knee in the stomach!")
+ D.audible_message("[D] gags!")
+ D.losebreath += 3
+ D.Stun(1)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ return 1
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/headKick(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(!D.stat && !D.weakened)
+ D.visible_message("[A] kicks [D] in the head!", \
+ "[A] kicks you in the jaw!")
+ D.apply_damage(20, BRUTE, "head")
+ D.drop_item()
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 75, 1, -1)
+ return 1
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/proc/elbowDrop(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ if(D.weakened || D.resting || D.stat)
+ D.visible_message("[A] elbow drops [D]!", \
+ "[A] piledrives you with their elbow!")
+ if(D.stat)
+ D.death() //FINISH HIM!
+ D.apply_damage(50, BRUTE, "chest")
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 100, 1, -1)
+ return 1
+ return basic_hit(A,D)
+
+/datum/martial_art/the_sleeping_carp/grab_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ add_to_streak("G")
+ if(check_streak(A,D))
+ return 1
+ ..()
+ var/obj/item/weapon/grab/G = A.get_active_hand()
+ if(G)
+ G.state = GRAB_AGGRESSIVE //Instant aggressive grab
+
+/datum/martial_art/the_sleeping_carp/harm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ add_to_streak("H")
+ if(check_streak(A,D))
+ return 1
+ D.visible_message("[A] [pick("punches", "kicks", "chops", "hits", "slams")] [D]!", \
+ "[A] hits you!")
+ D.apply_damage(10, BRUTE)
+ playsound(get_turf(D), 'sound/weapons/punch1.ogg', 50, 1, -1)
+ return 1
+
+
+/datum/martial_art/the_sleeping_carp/disarm_act(var/mob/living/carbon/human/A, var/mob/living/carbon/human/D)
+ add_to_streak("D")
+ if(check_streak(A,D))
+ return 1
+ return ..()
+
+/mob/living/carbon/human/proc/sleeping_carp_help()
+ set name = "Recall Teachings"
+ set desc = "Remember the martial techniques of the Sleeping Carp clan."
+ set category = "Sleeping Carp"
+
+ usr << "You retreat inward and recall the teachings of the Sleeping Carp..."
+ usr << "Wrist Wrench: Disarm Disarm. Forces opponent to drop item in hand."
+ usr << "Back Kick: Harm Grab. Opponent must be facing away. Knocks down."
+ usr << "Stomach Knee: Grab Harm. Knocks the wind out of opponent and stuns."
+ usr << "Head Kick: Disarm Harm Harm. Decent damage, forces opponent to drop item in hand."
+ usr << "Elbow Drop: Harm Disarm Harm Disarm Harm. Opponent must be on the ground. Deals huge damage, instantly kills anyone in critical condition."
+
//ITEMS
+
/obj/item/clothing/gloves/boxing
var/datum/martial_art/boxing/style = new
@@ -306,8 +431,8 @@
return
/obj/item/weapon/plasma_fist_scroll
- name = "Plasma Fist Scroll"
- desc = "Teaches the traditional wizard martial art."
+ name = "frayed scroll"
+ desc = "An aged and frayed scrap of paper written in shifting runes. There are hand-drawn illustrations of pugilism."
icon = 'icons/obj/wizard.dmi'
icon_state ="scroll2"
var/used = 0
@@ -319,6 +444,105 @@
var/mob/living/carbon/human/H = user
var/datum/martial_art/plasma_fist/F = new/datum/martial_art/plasma_fist(null)
F.teach(H)
- H << "You learn the PLASMA FIST style"
+ H << "You have learned the ancient martial art of Plasma Fist."
used = 1
- desc += "It looks like it's magic was used up."
+ desc = "It's completely blank."
+ name = "empty scroll"
+ icon_state = "blankscroll"
+
+/obj/item/weapon/sleeping_carp_scroll
+ name = "mysterious scroll"
+ desc = "A scroll filled with strange markings. It seems to be drawings of some sort of martial art."
+ icon = 'icons/obj/wizard.dmi'
+ icon_state = "scroll2"
+
+/obj/item/weapon/sleeping_carp_scroll/attack_self(mob/living/carbon/human/user as mob)
+ if(!istype(user) || !user)
+ return
+ user << "You begin to read the scroll..."
+ user << "And all at once the secrets of the Sleeping Carp fill your mind. The ancient clan's martial teachings have been imbued into this scroll. As you read through it, \
+ these secrets flood into your mind and body. You now know the martial techniques of the Sleeping Carp. Your hand-to-hand combat has become much more effective, and you may now perform powerful \
+ combination attacks. To learn more about these combos, use the Recall Teachings ability in the Sleeping Carp tab."
+ user.verbs += /mob/living/carbon/human/proc/sleeping_carp_help
+ var/datum/martial_art/the_sleeping_carp/theSleepingCarp = new(null)
+ theSleepingCarp.teach(user)
+ user.drop_item()
+ visible_message("[src] lights up in fire and quickly burns to ash.")
+ new /obj/effect/decal/cleanable/ash(get_turf(src))
+ qdel(src)
+
+/obj/item/weapon/twohanded/bostaff
+ name = "bo staff"
+ desc = "A long, tall staff made of polished wood. Traditionally used in ancient old-Earth martial arts. Can be wielded to both kill and incapacitate."
+ force = 10
+ w_class = 4
+ slot_flags = SLOT_BACK
+ force_unwielded = 10
+ force_wielded = 24
+ throwforce = 20
+ throw_speed = 2
+ attack_verb = list("smashed", "slammed", "whacked", "thwacked")
+ icon = 'icons/obj/weapons.dmi'
+ icon_state = "bostaff0"
+
+/obj/item/weapon/twohanded/bostaff/update_icon()
+ icon_state = "bostaff[wielded]"
+ return
+
+/obj/item/weapon/twohanded/bostaff/attack(mob/target, mob/living/user)
+ add_fingerprint(user)
+ if((CLUMSY in user.disabilities) && prob(50))
+ user << "You club yourself over the head with [src]."
+ user.Weaken(3)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ H.apply_damage(2*force, BRUTE, "head")
+ else
+ user.take_organ_damage(2*force)
+ return
+ if(isrobot(target))
+ return ..()
+ if(!isliving(target))
+ return ..()
+ var/mob/living/carbon/C = target
+ if(C.stat)
+ user << "It would be dishonorable to attack a foe while they cannot retaliate."
+ return
+ switch(user.a_intent)
+ if("disarm")
+ if(!wielded)
+ return ..()
+ if(!ishuman(target))
+ return ..()
+ var/mob/living/carbon/human/H = target
+ var/list/fluffmessages = list("[user] clubs [H] with [src]!", \
+ "[user] smacks [H] with the butt of [src]!", \
+ "[user] broadsides [H] with [src]!", \
+ "[user] smashes [H]'s head with [src]!", \
+ "[user] beats [H] with front of [src]!", \
+ "[user] twirls and slams [H] with [src]!")
+ H.visible_message("[pick(fluffmessages)]", \
+ "[pick(fluffmessages)]")
+ playsound(get_turf(user), 'sound/effects/woodhit.ogg', 75, 1, -1)
+ H.adjustStaminaLoss(rand(13,20))
+ if(prob(10))
+ H.visible_message("[H] collapses!", \
+ "Your legs give out!")
+ H.Weaken(4)
+ if(H.staminaloss && !H.sleeping)
+ var/total_health = (H.health - H.staminaloss)
+ if(total_health <= config.health_threshold_crit && !H.stat)
+ H.visible_message("[user] delivers a heavy hit to [H]'s head, knocking them out cold!", \
+ "[user] knocks you unconscious!")
+ H.sleeping += 30
+ H.adjustBrainLoss(25)
+ return
+ else
+ return ..()
+ return ..()
+
+/obj/item/weapon/twohanded/bostaff/IsShield()
+ if(wielded)
+ return 1
+ else
+ return 0
diff --git a/code/datums/mineral_container.dm b/code/datums/mineral_container.dm
new file mode 100644
index 00000000000..78894e8223c
--- /dev/null
+++ b/code/datums/mineral_container.dm
@@ -0,0 +1,117 @@
+/*
+ This datum should be used for handling mineral contents of machines and whatever else is supposed to hold minerals and make use of them.
+ One mineral_container var can only handle one type of mineral.
+
+ Variables:
+ amount - raw amount of the mineral this container is holding, calculated by the defined value MINERAL_MATERIAL_AMOUNT=2000.
+ max_amount - max raw amount of mineral this container can hold.
+ sheet_type - type of the mineral sheet the container handles, used for output.
+ owner - object that this container is being used by, used for output.
+ MAX_STACK_SIZE - size of a stack of mineral sheets. Constant.
+*/
+/datum/mineral_container
+ var/amount
+ var/max_amount
+ var/sheet_type
+ var/obj/owner
+ //MAX_STACK_SIZE = 50
+ //MINERAL_MATERIAL_AMOUNT = 2000
+
+/datum/mineral_container/New(obj/O, type, max_amt = 0, amt = 0)
+ if(!O) return
+ owner = O
+ sheet_type = type
+ amount = max(0, amt)
+ max_amount = max(0, max_amt)
+
+//For inserting an amount of mineral sheets
+/datum/mineral_container/proc/insert(sheet_amt)
+ if(sheet_amt > 0)
+ var/amt = sheet_amt * MINERAL_MATERIAL_AMOUNT
+ if(amt <= (max_amount - amount))
+ amount += amt
+ return sheet_amt
+ return 0
+
+//For inserting a mineral sheet
+/datum/mineral_container/proc/insert_sheet(obj/S)
+ if(accepts(S))
+ if(!isFull())
+ var/obj/item/stack/sheet/sheet = S
+ var/sht_amt = amount2sheet(max_amount - amount)
+ if(sht_amt >= sheet.amount)
+ return insert(sheet.amount)
+ else
+ return insert(sht_amt)
+ return 0
+ return -1
+
+//For inserting an amount of material
+/datum/mineral_container/proc/insert_amount(amt)
+ if(amt > 0 & !isFull())
+ if(amt <= max_amount - amount)
+ amount += amt
+ return amt
+ return 0
+
+//For consuming material (amt = amount of material)
+/datum/mineral_container/proc/use_amount(amt)
+ if(amt > 0 & !isEmpty())
+ if(amount >= amt)
+ amount -= amt
+ return amt
+ return 0
+
+//For consuming material (sheet_amt = amount of material equivalent to a number of sheets)
+/datum/mineral_container/proc/use_sheets(sheet_amt)
+ if(sheet_amt > 0 & !isEmpty())
+ if(amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT))
+ amount -= sheet_amt
+ return sheet_amt
+ return 0
+
+//For spawning mineral sheets
+/datum/mineral_container/proc/retrieve(sheet_amt)
+ if(sheet_amt > 0 && amount >= (sheet_amt * MINERAL_MATERIAL_AMOUNT))
+ var/count = 0
+ var/obj/item/stack/sheet/S
+
+ while(sheet_amt > MAX_STACK_SIZE)
+ S = new sheet_type(get_turf(owner))
+ S.amount = MAX_STACK_SIZE
+ count += MAX_STACK_SIZE
+ amount -= MAX_STACK_SIZE * MINERAL_MATERIAL_AMOUNT
+ sheet_amt -= MAX_STACK_SIZE
+
+ if(round(amount / MINERAL_MATERIAL_AMOUNT))
+ S = new sheet_type(get_turf(owner))
+ S.amount = sheet_amt
+ count += sheet_amt
+ amount -= sheet_amt * MINERAL_MATERIAL_AMOUNT
+ return count
+ return 0
+
+/datum/mineral_container/proc/retrieve_amount(amt)
+ return retrieve(amount2sheet(amt))
+
+/datum/mineral_container/proc/retrieve_all()
+ return retrieve(amount2sheet(amount))
+
+/datum/mineral_container/proc/accepts(obj/O)
+ return istype(O,sheet_type)
+
+/datum/mineral_container/proc/isFull(amt = 0)
+ return (amount + amt) >= max_amount
+
+/datum/mineral_container/proc/isEmpty(amt = 0)
+ return (amount - amt) <= 0
+
+/datum/mineral_container/proc/amount2sheet(amt)
+ if(amt >= MINERAL_MATERIAL_AMOUNT)
+ return round(amt / MINERAL_MATERIAL_AMOUNT)
+ return 0
+
+/datum/mineral_container/proc/sheet2amount(sheet_amt)
+ if(sheet_amt > 0)
+ return sheet_amt * MINERAL_MATERIAL_AMOUNT
+ return 0
diff --git a/code/datums/spell.dm b/code/datums/spell.dm
index c01f7c427e6..ec7d7f0a6e8 100644
--- a/code/datums/spell.dm
+++ b/code/datums/spell.dm
@@ -198,20 +198,20 @@ var/list/spells = typesof(/obj/effect/proc_holder/spell) //needed for the badmin
if(istype(target,/mob/living) && message)
target << text("[message]")
if(sparks_spread)
- var/datum/effect/effect/system/spark_spread/sparks = new /datum/effect/effect/system/spark_spread()
+ var/datum/effect/effect/system/spark_spread/sparks = new
sparks.set_up(sparks_amt, 0, location) //no idea what the 0 is
sparks.start()
if(smoke_spread)
if(smoke_spread == 1)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // if more than one smoke, spread it around
smoke.start()
else if(smoke_spread == 2)
- var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/bad/smoke = new
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here
smoke.start()
else if(smoke_spread == 3)
- var/datum/effect/effect/system/sleep_smoke_spread/smoke = new /datum/effect/effect/system/sleep_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/sleeping/smoke = new
smoke.set_up(smoke_amt, 0, location, smoke_amt == 1 ? 15 : 0) // same here
smoke.start()
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 2275c00a0e3..865fa8d1506 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -664,9 +664,11 @@ var/list/uplink_items = list()
/datum/uplink_item/implants/microbomb
name = "Microbomb Implant"
- desc = "An implant injected into the body, and later activated either manually or automatically upon death. The more implants inside of you, the higher the explosive power."
+ desc = "An implant injected into the body, and later activated either manually or automatically upon death. The more implants inside of you, the higher the explosive power. \
+ Will permanently destroy your body, however."
item = /obj/item/weapon/storage/box/syndie_kit/imp_microbomb
- cost = 1
+ cost = 2
+ gamemodes = list(/datum/game_mode/nuclear)
//CYBERNETIC IMPLANTS
@@ -759,6 +761,7 @@ var/list/uplink_items = list()
desc = "An implant injected into the body, and later activated either manually or automatically upon death. Maximum explosion power."
item = /obj/item/weapon/storage/box/syndie_kit/imp_macrobomb
cost = 20
+ gamemodes = list(/datum/game_mode/nuclear)
/datum/uplink_item/badass/random
name = "Random Item"
diff --git a/code/game/gamemodes/antag_spawner.dm b/code/game/gamemodes/antag_spawner.dm
index a621168182a..99a9cafeedc 100644
--- a/code/game/gamemodes/antag_spawner.dm
+++ b/code/game/gamemodes/antag_spawner.dm
@@ -64,7 +64,7 @@
H << "Unable to reach your apprentice! You can either attack the spellbook with the contract to refund your points, or wait and try again later."
/obj/item/weapon/antag_spawner/contract/spawn_antag(var/client/C, var/turf/T, var/type = "")
- PoolOrNew(/obj/effect/effect/harmless_smoke, T)
+ PoolOrNew(/obj/effect/effect/smoke, T)
var/mob/living/carbon/human/M = new/mob/living/carbon/human(T)
C.prefs.copy_to(M)
M.key = C.key
diff --git a/code/game/gamemodes/blob/blobs/blob_mobs.dm b/code/game/gamemodes/blob/blobs/blob_mobs.dm
index 3a6ef5e1d26..8580c480ab1 100644
--- a/code/game/gamemodes/blob/blobs/blob_mobs.dm
+++ b/code/game/gamemodes/blob/blobs/blob_mobs.dm
@@ -90,7 +90,7 @@
/mob/living/simple_animal/hostile/blob/blobspore/death(gibbed)
..(1)
// On death, create a small smoke of harmful gas (s-Acid)
- var/datum/effect/effect/system/chem_smoke_spread/S = new
+ var/datum/effect/effect/system/smoke_spread/chem/S = new
var/turf/location = get_turf(src)
// Create the reagents to put into the air
diff --git a/code/game/gamemodes/blob/overmind.dm b/code/game/gamemodes/blob/overmind.dm
index 40ccd99868f..005c40b3364 100644
--- a/code/game/gamemodes/blob/overmind.dm
+++ b/code/game/gamemodes/blob/overmind.dm
@@ -15,7 +15,7 @@
var/blob_points = 0
var/max_blob_points = 100
var/last_attack = 0
- var/datum/reagent/blob_reagent_datum = new/datum/reagent()
+ var/datum/reagent/blob/blob_reagent_datum = new/datum/reagent/blob()
var/list/blob_mobs = list()
var/ghostimage = null
diff --git a/code/game/gamemodes/blob/powers.dm b/code/game/gamemodes/blob/powers.dm
index a9e9bb233ae..446e324b486 100644
--- a/code/game/gamemodes/blob/powers.dm
+++ b/code/game/gamemodes/blob/powers.dm
@@ -276,7 +276,8 @@
last_attack = world.time
OB.expand(T, 0, blob_reagent_datum.color)
for(var/mob/living/L in T)
- blob_reagent_datum.reaction_mob(L, TOUCH)
+ blob_reagent_datum.reaction_mob(L, TOUCH, 25)
+ blob_reagent_datum.send_message(L)
OB.color = blob_reagent_datum.color
return
diff --git a/code/game/gamemodes/gang/gang.dm b/code/game/gamemodes/gang/gang.dm
index 1ccf81b290c..99bda1527f3 100644
--- a/code/game/gamemodes/gang/gang.dm
+++ b/code/game/gamemodes/gang/gang.dm
@@ -11,6 +11,8 @@
var/datum/gang_points/gang_points
var/A_style
var/B_style
+ var/A_fighting_style
+ var/B_fighting_style
var/list/A_territory = list()
var/list/B_territory = list()
var/list/A_territory_new = list()
@@ -32,8 +34,8 @@
var/A_timer = "OFFLINE"
var/B_timer = "OFFLINE"
//How many attempts at domination each team is allowed
- var/A_dominations = 3
- var/B_dominations = 3
+ var/A_dominations = 2
+ var/B_dominations = 2
///////////////////////////
//Announces the game type//
///////////////////////////
@@ -77,6 +79,7 @@
modePlayer += A_bosses
modePlayer += B_bosses
+ assign_gang_fighting_style()
..()
/datum/game_mode/gang/process(seconds)
@@ -110,6 +113,17 @@
rival_obj.explanation_text = "Preform a hostile takeover of the station with a Dominator."
boss_mind.objectives += rival_obj
+/datum/game_mode/proc/assign_gang_fighting_style()
+ var/aName = gang_name("A")
+ if(aName == "Sleeping Carp")
+ A_fighting_style = "martial"
+ else
+ A_fighting_style = "normal"
+ var/bName = gang_name("B")
+ if(bName == "Sleeping Carp")
+ B_fighting_style = "martial"
+ else
+ B_fighting_style = "normal"
/datum/game_mode/proc/greet_gang(var/datum/mind/boss_mind, var/you_are=1)
var/obj_count = 1
@@ -439,8 +453,8 @@
//////////////////////////////////////////////////////////
/datum/gang_points
- var/A = 20
- var/B = 20
+ var/A = 15
+ var/B = 15
var/next_point_interval = 1800
var/next_point_time
@@ -508,7 +522,7 @@
ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*
[gang_name("A")] Gang Status Report:")
var/A_message = ""
if(gangmode && isnum(gangmode.A_timer))
- var/new_time = max(180,gangmode.A_timer - ((ticker.mode.A_territory.len + A_uniformed) * 2))
+ var/new_time = max(300,gangmode.A_timer - ((ticker.mode.A_territory.len + A_uniformed) * 2))
if(new_time < gangmode.A_timer)
A_message += "Takeover shortened by [gangmode.A_timer - new_time] seconds for defending [ticker.mode.A_territory.len] territories and [A_uniformed] uniformed gangsters.
"
gangmode.A_timer = new_time
@@ -524,7 +538,7 @@
ticker.mode.message_gangtools(ticker.mode.B_tools,"[gang_name("B")] Gang Status Report:")
var/B_message = ""
if(gangmode && isnum(gangmode.B_timer))
- var/new_time = max(180,gangmode.B_timer - ((ticker.mode.B_territory.len + B_uniformed) * 2))
+ var/new_time = max(300,gangmode.B_timer - ((ticker.mode.B_territory.len + B_uniformed) * 2))
if(new_time < gangmode.B_timer)
A_message += "Takeover shortened by [gangmode.B_timer - new_time] seconds for defending [ticker.mode.B_territory.len] territories and [B_uniformed] uniformed gangsters.
"
gangmode.B_timer = new_time
@@ -578,7 +592,7 @@
//Increase outfit stock
for(var/obj/item/device/gangtool/tool in (ticker.mode.A_tools | ticker.mode.B_tools))
- tool.outfits = min(tool.outfits+2,10)
+ tool.outfits = min(tool.outfits+2,5)
//Restart the counter
start()
diff --git a/code/game/gamemodes/gang/recaller.dm b/code/game/gamemodes/gang/recaller.dm
index 6f586dc5764..51d8102eda2 100644
--- a/code/game/gamemodes/gang/recaller.dm
+++ b/code/game/gamemodes/gang/recaller.dm
@@ -10,9 +10,8 @@
throw_range = 7
flags = CONDUCT
var/gang //Which gang uses this?
- var/boss = 1 //If it has the power to promote gang members
+ var/boss = 1 //Is this the original boss?
var/recalling = 0
- var/promotions = 0
var/outfits = 3
var/free_pen = 0
@@ -27,19 +26,26 @@
if (!can_use(user))
return
+ var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len)
+
var/dat
if(!gang)
- dat += "This device is not registered.
"
+ dat += "This device is not registered.
"
if(user.mind in (ticker.mode.A_bosses | ticker.mode.B_bosses))
- dat += "Give this device to another member of your organization to use.
"
- else
+ dat += "Give this device to another member of your organization to use to promote them.
"
+ dat += "If this is meant as a spare device for yourself:
"
dat += "Register Device
"
+ else if (gang_bosses < 3)
+ dat += "You have been selected for a promotion!
"
+ dat += "Register Device
"
+ else
+ dat += "No promotions available: All positions filled."
else
var/datum/game_mode/gang/gangmode
if(istype(ticker.mode, /datum/game_mode/gang))
gangmode = ticker.mode
- var/gang_size = ((gang == "A")? (ticker.mode.A_gang.len + ticker.mode.A_bosses.len) : (ticker.mode.B_gang.len + ticker.mode.B_bosses.len))
+ var/gang_size = gang_bosses + ((gang == "A")? ticker.mode.A_gang.len : ticker.mode.B_gang.len)
var/gang_territory = ((gang == "A")? ticker.mode.A_territory.len : ticker.mode.B_territory.len)
var/points = ((gang == "A") ? ticker.mode.gang_points.A : ticker.mode.gang_points.B)
var/timer
@@ -66,37 +72,71 @@
dat += "
"
dat += "Purchase Weapons:
"
- dat += "(10 Influence) "
- if(points >= 10)
- dat += "Switchblade
"
- else
- dat += "Switchblade
"
+ /////////////////
+ // NORMAL GANG //
+ /////////////////
- dat += "(20 Influence) "
- if(points >= 20)
- dat += "10mm Pistol
"
- else
- dat += "10mm Pistol
"
+ if(!gangmode || (gang == "A" && gangmode.A_fighting_style == "normal") || (gang == "B" && gangmode.B_fighting_style == "normal")) //If the gamemode is not gang, always use standard loadout.
+ dat += "(10 Influence) "
+ if(points >= 10)
+ dat += "Switchblade
"
+ else
+ dat += "Switchblade
"
- dat += "(10 Influence) "
- if(points >= 10)
- dat += "10mm Ammo
"
- else
- dat += "10mm Ammo
"
+ dat += "(25 Influence) "
+ if(points >= 25)
+ dat += "10mm Pistol
"
+ else
+ dat += "10mm Pistol
"
- dat += "(40 Influence) "
- if(points >= 40)
- dat += "Mini Uzi
"
- else
- dat += "Mini Uzi
"
+ dat += "(10 Influence) "
+ if(points >= 10)
+ dat += "10mm Ammo
"
+ else
+ dat += "10mm Ammo
"
- dat += "(25 Influence) "
- if(points >= 25)
- dat += "Uzi Ammo
"
- else
- dat += "Uzi Magazine
"
+ dat += "(50 Influence) "
+ if(points >= 50)
+ dat += "Mini Uzi
"
+ else
+ dat += "Mini Uzi
"
+
+ dat += "(20 Influence) "
+ if(points >= 20)
+ dat += "Uzi Ammo
"
+ else
+ dat += "Uzi Magazine
"
+
+ dat += "
"
+
+ //////////////////
+ // MARTIAL ARTS //
+ //////////////////
+
+ else if((gang == "A" && gangmode.A_fighting_style == "martial") || (gang == "B" && gangmode.B_fighting_style == "martial"))
+ dat += "(10 Influence) "
+ if(points >= 10)
+ dat += "Bo Staff
"
+ else
+ dat += "Bo Staff
"
+
+ dat += "(20 Influence) "
+ if(points >= 20)
+ dat += "Wrestling Belt
"
+ else
+ dat += "Wrestling Belt
"
+
+ dat += "(30 Influence) "
+ if(points >= 30)
+ dat += "Sleeping Carp Scroll (one-use)
"
+ else
+ dat += "Sleeping Carp Scroll (one-use)
"
+ dat += "
"
+
+ ////////////////////////
+ // STANDARD EQUIPMENT //
+ ////////////////////////
- dat += "
"
dat += "Purchase Equipment:
"
dat += "(5 Influence) "
@@ -120,15 +160,16 @@
else
dat += "Recruitment Pen
"
- if(boss)
- if(promotions >= 3)
- dat += "(Out of stock) Promote a Gangster
"
- else
- dat += "([(promotions*10)+10] Influence, [3-promotions] left) "
- if(points >= (promotions*10)+10)
- dat += "Promote a Gangster
"
- else
- dat += "Promote a Gangster
"
+ var/tool_cost = (boss ? 10 : 30)
+ var/gangtooldesc = "Promote a Gangster ([3-gang_bosses] left)"
+ if(gang_bosses >= 3)
+ gangtooldesc = "Additional Gangtools"
+ dat += "([tool_cost] Influence) "
+ if(points >= tool_cost)
+ dat += "[gangtooldesc]
"
+ else
+ dat += "[gangtooldesc]
"
+
if(gangmode)
if(gang == "A" ? !gangmode.A_dominations : !gangmode.B_dominations)
dat += "(Out of stock) Station Dominator"
@@ -178,21 +219,33 @@
item_type = /obj/item/weapon/switchblade
points = 10
if("pistol")
- if(points >= 20)
+ if(points >= 25)
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
- points = 20
+ points = 25
if("10mmammo")
if(points >= 10)
item_type = /obj/item/ammo_box/magazine/m10mm
points = 10
if("uzi")
- if(points >= 40)
+ if(points >= 50)
item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi
- points = 40
+ points = 50
+ if("scroll")
+ if(points >= 30)
+ item_type = /obj/item/weapon/sleeping_carp_scroll
+ points = 30
+ if("wrestlingbelt")
+ if(points >= 20)
+ item_type = /obj/item/weapon/storage/belt/champion/wrestling
+ points = 20
+ if("bostaff")
+ if(points >= 10)
+ item_type = /obj/item/weapon/twohanded/bostaff
+ points = 10
if("9mmammo")
- if(points >= 25)
+ if(points >= 20)
item_type = /obj/item/ammo_box/magazine/uzim9mm
- points = 25
+ points = 20
if("C4")
if(points >= 10)
item_type = /obj/item/weapon/c4
@@ -206,10 +259,10 @@
item_type = /obj/item/weapon/pen/gang
points = 50
if("gangtool")
- if((promotions < 3) && (points >= (promotions*10)+10))
+ var/tool_cost = (boss ? 10 : 30)
+ if(points >= tool_cost)
item_type = /obj/item/device/gangtool/lt
- points = (promotions*10)+10
- promotions++
+ points = tool_cost
if("dominator")
if(istype(ticker.mode, /datum/game_mode/gang))
var/datum/game_mode/gang/mode = ticker.mode
@@ -288,6 +341,12 @@
/obj/item/device/gangtool/proc/register_device(var/mob/user)
+ if(!(user.mind in (ticker.mode.B_bosses|ticker.mode.B_bosses)))
+ var/gang_bosses = ((gang == "A")? ticker.mode.A_bosses.len : ticker.mode.B_bosses.len)
+ if(gang_bosses >= 3)
+ user << "\icon[src] Error: All positions filled."
+ return
+
if(jobban_isbanned(user, "gangster") || jobban_isbanned(user, "Syndicate"))
user << "\icon[src] ACCESS DENIED: Blacklisted user."
return 0
diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm
index 77d9ce4db78..e88fa9dc3e7 100644
--- a/code/game/gamemodes/shadowling/shadowling_abilities.dm
+++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm
@@ -346,7 +346,7 @@
B.reagents.clear_reagents() //Just in case!
B.icon_state = null //Invisible
B.reagents.add_reagent("blindness_smoke", 10)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
+ var/datum/effect/effect/system/smoke_spread/chem/S = new
S.attach(B)
if(S)
S.set_up(B.reagents, 10, 0, B.loc)
diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm
index 1eab122f4e6..c76cb0df026 100644
--- a/code/game/machinery/autolathe.dm
+++ b/code/game/machinery/autolathe.dm
@@ -179,7 +179,7 @@
if(href_list["make"])
- var/turf/T = get_step(src.loc, get_dir(src,usr))
+ var/turf/T = loc
/////////////////
//href protection
diff --git a/code/game/machinery/bots/medbot.dm b/code/game/machinery/bots/medbot.dm
index 46151d9d19f..0b60c45b1b7 100644
--- a/code/game/machinery/bots/medbot.dm
+++ b/code/game/machinery/bots/medbot.dm
@@ -488,8 +488,9 @@
if ((get_dist(src, patient) <= 1) && (on))
if(reagent_id == "internal_beaker")
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
+ var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1)
+ reagent_glass.reagents.reaction(patient, INGEST, fraction)
reagent_glass.reagents.trans_to(patient,injection_amount) //Inject from beaker instead.
- reagent_glass.reagents.reaction(patient, INGEST)
else
patient.reagents.add_reagent(reagent_id,injection_amount)
C.visible_message("[src] injects [patient] with its syringe!", \
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 0c600860d7c..73bd48b5df5 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -108,7 +108,8 @@
if(istype(beaker, /obj/item/weapon/reagent_containers/blood))
// speed up transfer on blood packs
transfer_amount = 10
- beaker.reagents.reaction(attached, INGEST, 1,0) //make reagents reacts, but don't spam messages
+ var/fraction = min(transfer_amount/beaker.volume, 1) //the fraction that is transfered of the total volume
+ beaker.reagents.reaction(attached, INGEST, fraction,0) //make reagents reacts, but don't spam messages
beaker.reagents.trans_to(attached, transfer_amount)
update_icon()
diff --git a/code/game/mecha/combat/marauder.dm b/code/game/mecha/combat/marauder.dm
index 15dadd6456d..89580944e01 100644
--- a/code/game/mecha/combat/marauder.dm
+++ b/code/game/mecha/combat/marauder.dm
@@ -13,7 +13,7 @@
var/smoke = 5
var/smoke_ready = 1
var/smoke_cooldown = 100
- var/datum/effect/effect/system/harmless_smoke_spread/smoke_system = new
+ var/datum/effect/effect/system/smoke_spread/smoke_system = new
operation_req_access = list(access_cent_specops)
wreckage = /obj/structure/mecha_wreckage/marauder
add_req_access = 0
diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm
index 749d413b446..a8d591495d4 100644
--- a/code/game/mecha/mech_fabricator.dm
+++ b/code/game/mecha/mech_fabricator.dm
@@ -169,7 +169,7 @@
overlays -= "fab-active"
desc = initial(desc)
- var/location = get_step(src,SOUTH)
+ var/location = get_step(src,(dir))
var/obj/item/I = new D.build_path(location)
I.m_amt = get_resource_cost_w_coeff(D,"$metal")
I.g_amt = get_resource_cost_w_coeff(D,"$glass")
@@ -305,7 +305,7 @@
if (..())
return
user.set_machine(src)
- var/turf/exit = get_step(src,SOUTH)
+ var/turf/exit = get_step(src,(dir))
if(exit.density)
visible_message("\icon[src] \The [src] beeps, \"Error! Part outlet is obstructed.\"")
return
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 43cd9f186cf..0c781f27f9b 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -47,6 +47,9 @@
M.update_canmove()
post_buckle_mob(M)
M.throw_alert("buckled", new_master = src)
+ if(burn_state == 1) //Sets the mob on fire if you buckle them to a burning object
+ M.adjust_fire_stacks(1)
+ M.IgniteMob()
return 1
/obj/proc/unbuckle_mob()
diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm
index efd1624bbf0..a31877f27f1 100644
--- a/code/game/objects/effects/anomalies.dm
+++ b/code/game/objects/effects/anomalies.dm
@@ -27,7 +27,7 @@
/obj/effect/anomaly/proc/anomalyNeutralize()
- PoolOrNew(/obj/effect/effect/bad_smoke, loc)
+ PoolOrNew(/obj/effect/effect/smoke/bad, loc)
for(var/atom/movable/O in src)
O.loc = src.loc
diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm
index 71d209de6a6..1a205f1607a 100644
--- a/code/game/objects/effects/decals/Cleanable/misc.dm
+++ b/code/game/objects/effects/decals/Cleanable/misc.dm
@@ -19,6 +19,9 @@
/obj/effect/decal/cleanable/ash/New()
..()
reagents.add_reagent("ash", 30)
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
+
/obj/effect/decal/cleanable/greenglow
name = "green glow"
@@ -71,6 +74,8 @@
layer = 3
icon = 'icons/effects/effects.dmi'
icon_state = "cobweb1"
+ burn_state = 0 //Burnable
+ burntime = 1
/obj/effect/decal/cleanable/molten_item
name = "gooey grey mass"
@@ -142,4 +147,18 @@
gender = PLURAL
icon = 'icons/obj/objects.dmi'
icon_state = "ash"
- anchored = 1
\ No newline at end of file
+ anchored = 1
+
+/obj/effect/decal/cleanable/shreds
+ name = "shreds"
+ desc = "The shredded remains of what appears to be clothing."
+ icon = 'icons/effects/effects.dmi'
+ icon_state = "shreds"
+ gender = PLURAL
+ density = 0
+ anchored = 1
+ layer = 2
+
+/obj/effect/decal/cleanable/shreds/New()
+ pixel_x = rand(-5, 5)
+ pixel_y = rand(-5, 5)
\ No newline at end of file
diff --git a/code/game/objects/effects/effect_system/effect_system.dm b/code/game/objects/effects/effect_system/effect_system.dm
index eb84812588f..8953cc09c7a 100644
--- a/code/game/objects/effects/effect_system/effect_system.dm
+++ b/code/game/objects/effects/effect_system/effect_system.dm
@@ -16,7 +16,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
/obj/effect/effect/Destroy()
..()
return QDEL_HINT_PUTINPOOL
-
+/*
/datum/effect/effect/proc/fadeOut(var/atom/A, var/frames = 16)
if(A.alpha == 0) //Handle already transparent case
return
@@ -27,7 +27,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
A.alpha -= step
sleep(world.tick_lag)
return
-
+*/
/datum/effect/effect/system
var/number = 3
var/cardinals = 0
diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm
index 96d7433cead..81031ea3985 100644
--- a/code/game/objects/effects/effect_system/effects_foam.dm
+++ b/code/game/objects/effects/effect_system/effects_foam.dm
@@ -10,7 +10,6 @@
layer = TURF_LAYER + 0.1
mouse_opacity = 0
var/amount = 3
- var/expand = 1
animate_movement = 0
var/metal = 0
var/lifetime = 6
@@ -37,15 +36,13 @@
SSobj.processing.Remove(src)
return ..()
-/obj/effect/effect/foam/metal/New(loc)
- ..()
- var/obj/structure/foamedmetal/M = new(src.loc)
- M.metal = metal
- M.updateicon()
-
/obj/effect/effect/foam/proc/kill_foam()
SSobj.processing.Remove(src)
+ if(metal)
+ var/obj/structure/foamedmetal/M = new(src.loc)
+ M.metal = metal
+ M.updateicon()
flick("[icon_state]-disolve", src)
spawn(5)
qdel(src)
@@ -55,21 +52,40 @@
lifetime--
if(lifetime < 1)
kill_foam()
+ return
+
+ var/fraction = 1/initial(lifetime)
+ for(var/obj/O in range(0,src))
+ if(O.type == src.type)
+ continue
+ reagents.reaction(O, TOUCH, fraction)
+ var/hit = 0
+ for(var/mob/living/L in range(0,src))
+ hit += foam_mob(L)
+ if(hit)
+ lifetime++ //this is so the decrease from mobs hit and the natural decrease don't cumulate.
+ var/T = get_turf(src)
+ reagents.reaction(T, TOUCH, fraction)
+
if(--amount < 0)
return
- for(var/atom/M in view(1,src))
- if(M == src)
- continue
- reagents.reaction(M, TOUCH)
spread_foam()
+/obj/effect/effect/foam/proc/foam_mob(var/mob/living/L as mob)
+ if(lifetime<1)
+ return 0
+ if(!istype(L))
+ return 0
+ var/fraction = 1/initial(lifetime)
+ reagents.reaction(L, TOUCH, fraction)
+ lifetime--
+ return 1
/obj/effect/effect/foam/Crossed(var/atom/movable/AM)
if(istype(AM, /mob/living/carbon))
var/mob/living/carbon/M = AM
M.slip(5, 2, src)
-
/obj/effect/effect/foam/metal/Crossed(var/atom/movable/AM)
return
@@ -87,10 +103,13 @@
if(foundfoam)
continue
- var/obj/effect/effect/foam/F = PoolOrNew(/obj/effect/effect/foam, T)
+ for(var/mob/living/L in T)
+ foam_mob(L)
+ var/obj/effect/effect/foam/F = PoolOrNew(src.type, T)
F.amount = amount
reagents.copy_to(F, (reagents.total_volume))
F.color = color
+ F.metal = metal
/obj/effect/effect/foam/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume)
@@ -136,7 +155,6 @@
amount = round(sqrt(amt / 2), 1)
carry.copy_to(chemholder, carry.total_volume)
-
/datum/effect/effect/system/foam_spread/metal/set_up(amt=5, loca, var/datum/reagents/carry = null, var/metaltype)
..()
metal = metaltype
@@ -148,7 +166,7 @@
else
var/obj/effect/effect/foam/F = PoolOrNew(foamtype, location)
var/foamcolor = mix_color_from_reagents(chemholder.reagents.reagent_list)
- chemholder.reagents.copy_to(F, chemholder.reagents.total_volume)
+ chemholder.reagents.copy_to(F, chemholder.reagents.total_volume/amount) //how much reagents each foam cell holds
F.color = foamcolor
F.amount = amount
F.metal = metal
diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm
index c2954010ca4..1f447c5c1f9 100644
--- a/code/game/objects/effects/effect_system/effects_smoke.dm
+++ b/code/game/objects/effects/effect_system/effects_smoke.dm
@@ -6,37 +6,84 @@
/obj/effect/effect/smoke
name = "smoke"
- icon = 'icons/effects/water.dmi'
- icon_state = "smoke"
- opacity = 1
- anchored = 0.0
- mouse_opacity = 0
- var/amount = 8.0
-
-/obj/effect/effect/harmless_smoke
- name = "smoke"
- icon_state = "smoke"
- opacity = 1
- anchored = 0.0
- mouse_opacity = 0
- var/amount = 6.0
- //Remove this bit to use the old smoke
icon = 'icons/effects/96x96.dmi'
pixel_x = -32
pixel_y = -32
-
-/obj/effect/effect/harmless_smoke/New()
- ..()
- spawn (100)
- qdel(src)
-
-/datum/effect/effect/system/harmless_smoke_spread
- var/total_smoke = 0 // To stop it being spammed and lagging!
+ icon_state = "smoke"
+ opacity = 1
+ anchored = 0
+ mouse_opacity = 0
+ var/steps = 0
+ var/lifetime = 5
var/direction
-/datum/effect/effect/system/harmless_smoke_spread/set_up(n = 5, c = 0, loca, direct)
- if(n > 10)
- n = 10
+
+/obj/effect/effect/smoke/proc/fade_out(var/frames = 16)
+ if(alpha == 0) //Handle already transparent case
+ return
+ if(frames == 0)
+ frames = 1 //We will just assume that by 0 frames, the coder meant "during one frame".
+ var/step = alpha / frames
+ for(var/i = 0, i < frames, i++)
+ alpha -= step
+ sleep(world.tick_lag)
+
+/obj/effect/effect/smoke/New()
+ ..()
+ create_reagents(500)
+ SSobj.processing.Add(src)
+ lifetime += rand(-1,1)
+
+/obj/effect/effect/smoke/Destroy()
+ SSobj.processing.Remove(src)
+ ..()
+
+/obj/effect/effect/smoke/proc/kill_smoke()
+ SSobj.processing.Remove(src)
+ spawn(0)
+ fade_out()
+ spawn(10)
+ qdel(src)
+
+/obj/effect/effect/smoke/process()
+ lifetime--
+ if(lifetime < 1)
+ kill_smoke()
+ return 0
+ if(steps >= 1)
+ step(src,direction)
+ steps--
+ return 1
+
+/obj/effect/effect/smoke/Crossed(mob/living/M as mob)
+ if(!istype(M))
+ return
+ smoke_mob(M)
+
+/obj/effect/effect/smoke/proc/smoke_mob(mob/living/carbon/M as mob)
+ if(!istype(M))
+ return 0
+ if(lifetime<1)
+ return 0
+ if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
+ return 0
+ if(M.smoke_delay)
+ return 0
+ M.smoke_delay++
+ spawn(10)
+ if(M)
+ M.smoke_delay = 0
+ return 1
+
+
+
+/datum/effect/effect/system/smoke_spread
+ var/direction
+ var/smoke_type = /obj/effect/effect/smoke
+
+/datum/effect/effect/system/smoke_spread/set_up(n = 5, c = 0, loca, direct)
+ if(n > 20)
+ n = 20
number = n
cardinals = c
if(istype(loca, /turf/))
@@ -46,70 +93,42 @@
if(direct)
direction = direct
+/datum/effect/effect/system/smoke_spread/start()
+ for(var/i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/harmless_smoke/smoke = PoolOrNew(/obj/effect/effect/harmless_smoke, location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 20)
- n = 20
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
-
-/datum/effect/effect/system/bad_smoke_spread/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/bad_smoke/smoke = PoolOrNew(/obj/effect/effect/bad_smoke, location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i= 1)
- reagents.reaction(A, TOUCH)
- reagents.trans_to(A.reagents, 10)
- return
-
-
-/obj/effect/effect/chem_smoke/Crossed(mob/living/carbon/M as mob )
- ..()
- if(reagents.total_volume >= 1)
- reagents.reaction(M, TOUCH)
- reagents.trans_to(M.reagents, 10)
-
-/datum/effect/effect/system/chem_smoke_spread
- var/total_smoke = 0 // To stop it being spammed and lagging!
- var/direction
+/datum/effect/effect/system/smoke_spread/chem
var/obj/chemholder
+ smoke_type = /obj/effect/effect/smoke/chem
-
-/datum/effect/effect/system/chem_smoke_spread/New()
+/datum/effect/effect/system/smoke_spread/chem/New()
..()
chemholder = PoolOrNew(/obj)
var/datum/reagents/R = new/datum/reagents(500)
chemholder.reagents = R
R.my_atom = chemholder
-/datum/effect/effect/system/chem_smoke_spread/Destroy()
+/datum/effect/effect/system/smoke_spread/chem/Destroy()
chemholder = null
..()
return QDEL_HINT_PUTINPOOL
-/datum/effect/effect/system/chem_smoke_spread/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
+/datum/effect/effect/system/smoke_spread/chem/set_up(var/datum/reagents/carry = null, n = 5, c = 0, loca, direct, silent = 0)
if(n > 20)
n = 20
number = n
cardinals = c
- carry.copy_to(chemholder, carry.total_volume)
-
-
if(istype(loca, /turf/))
location = loca
else
location = get_turf(loca)
-
if(direct)
direction = direct
+ carry.copy_to(chemholder, carry.total_volume)
if(!silent)
var/contained = ""
@@ -270,140 +232,66 @@
log_game("A chemical smoke reaction has taken place in ([where])[contained]. No associated key.")
-/datum/effect/effect/system/chem_smoke_spread/start()
- var/i = 0
+/datum/effect/effect/system/smoke_spread/chem/start()
var/color = mix_color_from_reagents(chemholder.reagents.reagent_list)
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/chem_smoke/smoke = PoolOrNew(/obj/effect/effect/chem_smoke, location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
-
- if(chemholder.reagents.total_volume != 1) // can't split 1 very well
- chemholder.reagents.copy_to(smoke, chemholder.reagents.total_volume / number) // copy reagents to each smoke, divide evenly
-
- if(color)
- smoke.color = color // give the smoke color, if it has any to begin with
+ for(var/i=0, i 1) // can't split 1 very well
+ chemholder.reagents.copy_to(S, chemholder.reagents.total_volume/number) // copy reagents to each smoke, divide evenly
+ if(color)
+ S.color = color // give the smoke color, if it has any to begin with
+ else
+ // if no color, just use the old smoke icon
+ S.icon = 'icons/effects/96x96.dmi'
+ S.icon_state = "smoke"
+
+ S.process() //calling process right now so the smoke immediately attacks mobs.
/////////////////////////////////////////////
// Sleep smoke
/////////////////////////////////////////////
-/obj/effect/effect/sleep_smoke
- name = "smoke"
- icon_state = "smoke"
- opacity = 1
- anchored = 0.0
- mouse_opacity = 0
- var/amount = 6.0
- //Remove this bit to use the old smoke
- icon = 'icons/effects/96x96.dmi'
- pixel_x = -32
- pixel_y = -32
+/obj/effect/effect/smoke/sleeping
color = "#9C3636"
+ lifetime = 10
-/obj/effect/effect/sleep_smoke/New()
- ..()
- spawn (200+rand(10,30))
- qdel(src)
+/obj/effect/effect/smoke/sleeping/process()
+ for(var/mob/living/carbon/M in range(1,src))
+ smoke_mob(M)
-/obj/effect/effect/sleep_smoke/Move()
- ..()
- for(var/mob/living/carbon/M in get_turf(src))
- if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
-// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // I'll work on it later
- else
- M.drop_item()
- M:sleeping += 5
- if (M.coughedtime != 1)
- M.coughedtime = 1
- M.emote("cough")
- spawn(20)
- if(M && M.loc)
- M.coughedtime = 0
- return
-
-/obj/effect/effect/sleep_smoke/Crossed(mob/living/carbon/M as mob )
- ..()
- if(istype(M, /mob/living/carbon))
- if (M.internal != null && M.wear_mask && (M.wear_mask.flags & MASKINTERNALS))
-// if (M.wear_suit, /obj/item/clothing/suit/wizrobe && (M.hat, /obj/item/clothing/head/wizard) && (M.shoes, /obj/item/clothing/shoes/sandal)) // Work on it later
+/obj/effect/effect/smoke/sleeping/smoke_mob(mob/living/carbon/M as mob)
+ if(..())
+ if(M.internal != null || (M.wear_mask && (M.wear_mask.flags & BLOCK_GAS_SMOKE_EFFECT)))
return
else
M.drop_item()
- M:sleeping += 5
- if (M.coughedtime != 1)
- M.coughedtime = 1
- M.emote("cough")
- spawn(20)
- if(M && M.loc)
- M.coughedtime = 0
- return
-
-/datum/effect/effect/system/sleep_smoke_spread
- var/total_smoke = 0 // To stop it being spammed and lagging!
- var/direction
-
-/datum/effect/effect/system/sleep_smoke_spread/set_up(n = 5, c = 0, loca, direct)
- if(n > 20)
- n = 20
- number = n
- cardinals = c
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
- if(direct)
- direction = direct
+ M.sleeping = max(M.sleeping,10)
+ M.emote("cough")
-/datum/effect/effect/system/sleep_smoke_spread/start()
- var/i = 0
- for(i=0, i 20)
- return
- spawn(0)
- if(holder)
- src.location = get_turf(holder)
- var/obj/effect/effect/sleep_smoke/smoke = PoolOrNew(/obj/effect/effect/sleep_smoke, location)
- src.total_smoke++
- var/direction = src.direction
- if(!direction)
- if(src.cardinals)
- direction = pick(cardinal)
- else
- direction = pick(alldirs)
- for(i=0, i 360))
+ extinguish()
+ user << "You put out the fire on [src]."
+ else
+ user << "You burn your hand on [src]!"
+ var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm")
+ if(affecting.take_damage( 0, 5 )) // 5 burn damage
+ H.update_damage_overlays(0)
+ H.updatehealth()
+ return
+ else
+ extinguish()
+
if (istype(src.loc, /obj/item/weapon/storage))
//If the item is in a storage item, take it out
var/obj/item/weapon/storage/S = src.loc
@@ -415,27 +434,34 @@
throw_at(S,14,3)
else ..()
-/obj/item/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
+/obj/item/acid_act(var/acidpwr, var/acid_volume)
. = 1
if(unacidable)
return
+ var/meltingpwr = acid_volume*acidpwr
+ var/melting_threshold = 100
+ if(meltingpwr <= melting_threshold) // so a single unit can't melt items. You need 5.1+ unit for fluoro and 10.1+ for sulphuric
+ return
+
for(var/V in armor)
if(armor[V] > 0)
.-- //it survives the acid...
break
- if(.)
+ if(. && prob(min(meltingpwr/10,90))) //chance to melt depends on acid power and volume.
var/turf/T = get_turf(src)
if(T)
- T.visible_message("[src] melts away!")
var/obj/effect/decal/cleanable/molten_item/I = new (T)
I.pixel_x = rand(-16,16)
I.pixel_y = rand(-16,16)
I.desc = "Looks like this was \an [src] some time ago."
+ if(istype(src,/obj/item/weapon/storage))
+ var/obj/item/weapon/storage/S = src
+ S.do_quick_empty() //melted storage item drops its content.
qdel(src)
else
for(var/armour_value in armor) //but is weakened
- armor[armour_value] = max(armor[armour_value]-acidpwr,0)
+ armor[armour_value] = max(armor[armour_value]-min(acidpwr,meltingpwr/10),0)
if(!findtext(desc, "it looks slightly melted...")) //it looks slightly melted... it looks slightly melted... it looks slightly melted... etc.
desc += " it looks slightly melted..." //needs a space at the start, formatting
diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm
index 5d63211a30d..276d614a9ad 100644
--- a/code/game/objects/items/candle.dm
+++ b/code/game/objects/items/candle.dm
@@ -6,7 +6,6 @@
icon_state = "candle1"
item_state = "candle1"
w_class = 1
-
var/wax = 200
var/lit = 0
proc
@@ -46,6 +45,10 @@
if(M.lit)
light()
+/obj/item/candle/fire_act()
+ if(!src.lit)
+ light() //honk
+ return
/obj/item/candle/light(var/flavor_text = "[usr] lights the [name].")
if(!src.lit)
diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm
index 6ecc1a86125..dcfaceeffc3 100644
--- a/code/game/objects/items/devices/instruments.dm
+++ b/code/game/objects/items/devices/instruments.dm
@@ -1,6 +1,8 @@
//copy pasta of the space piano, don't hurt me -Pete
/obj/item/device/instrument
name = "generic instrument"
+ burn_state = 0 //Burnable
+ burntime = 20
var/datum/song/handheld/song
var/instrumentId = "generic"
var/instrumentExt = "ogg"
diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm
index 6a1cdcd1151..a77f96f1e9b 100644
--- a/code/game/objects/items/devices/pizza_bomb.dm
+++ b/code/game/objects/items/devices/pizza_bomb.dm
@@ -3,6 +3,7 @@
desc = "A box suited for pizzas."
icon = 'icons/obj/food/containers.dmi'
icon_state = "pizzabox1"
+ burn_state = 0 //Burnable
var/timer = 10 //Adjustable timer
var/timer_set = 0
var/primed = 0
@@ -54,6 +55,10 @@
sleep(timer)
return go_boom()
+/obj/item/device/pizza_bomb/burn() //Instead of burning to ashes, it will just explode
+ go_boom()
+ return
+
/obj/item/device/pizza_bomb/proc/go_boom()
if(disarmed)
visible_message("\icon[src] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!")
diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm
index 206e6f64739..60e0ba98c3a 100644
--- a/code/game/objects/items/devices/taperecorder.dm
+++ b/code/game/objects/items/devices/taperecorder.dm
@@ -56,6 +56,9 @@
mytape = null
update_icon()
+/obj/item/device/taperecorder/fire_act()
+ mytape.ruin() //Fires destroy the tape
+ return()
/obj/item/device/taperecorder/attack_hand(mob/user)
if(loc == user)
@@ -264,6 +267,8 @@
var/list/timestamp = list()
var/ruined = 0
+/obj/item/device/tape/fire_act()
+ ruin()
/obj/item/device/tape/attack_self(mob/user)
if(!ruined)
diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm
index 6c391dcc3e6..eff17423b61 100644
--- a/code/game/objects/items/stacks/cash.dm
+++ b/code/game/objects/items/stacks/cash.dm
@@ -10,6 +10,7 @@
throw_speed = 2
throw_range = 2
w_class = 1.0
+ burn_state = 0 //Burnable
/obj/item/stack/spacecash/c10
icon_state = "spacecash10"
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 55493399fad..33c7ad85fed 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -7,6 +7,8 @@
w_class = 1
throw_speed = 3
throw_range = 7
+ burn_state = 0 //Burnable
+ burntime = 5
var/heal_brute = 0
var/heal_burn = 0
var/stop_bleeding = 0
diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm
index 34c8445a8d5..28794e5bd7a 100644
--- a/code/game/objects/items/stacks/sheets/sheet_types.dm
+++ b/code/game/objects/items/stacks/sheets/sheet_types.dm
@@ -108,6 +108,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
icon = 'icons/obj/items.dmi'
origin_tech = "materials=1;biotech=1"
sheettype = "wood"
+ burn_state = 0 //Burnable
/obj/item/stack/sheet/mineral/wood/New(var/loc, var/amount=null)
recipes = wood_recipes
@@ -122,6 +123,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \
singular_name = "cloth roll"
icon_state = "sheet-cloth"
origin_tech = "materials=2"
+ burn_state = 0 //Burnable
/*
* Cardboard
@@ -143,6 +145,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \
singular_name = "cardboard sheet"
icon_state = "sheet-card"
origin_tech = "materials=1"
+ burn_state = 0 //Burnable
/obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null)
recipes = cardboard_recipes
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index 6d81c36bb2c..e498bc3ebce 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -84,6 +84,7 @@
max_amount = 60
origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/fancy/grass
+ burn_state = 0 //Burnable
/*
* Wood
@@ -101,6 +102,7 @@
max_amount = 60
origin_tech = "biotech=1"
turf_type = /turf/simulated/floor/wood
+ burn_state = 0 //Burnable
/*
* Carpets
@@ -117,6 +119,7 @@
throw_range = 7
max_amount = 60
turf_type = /turf/simulated/floor/fancy/carpet
+ burn_state = 0 //Burnable
/*
* High-traction
diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm
index 515176b16a2..5bc5733aa4b 100644
--- a/code/game/objects/items/toys.dm
+++ b/code/game/objects/items/toys.dm
@@ -271,6 +271,7 @@
item_state = "arm_blade"
attack_verb = list("pricked", "absorbed", "gored")
w_class = 2
+ burn_state = 0 //Burnable
/*
@@ -527,6 +528,10 @@
icon_state = "snappop"
w_class = 1
+/obj/item/toy/snappop/fire_act()
+ throw_impact()
+ return
+
/obj/item/toy/snappop/throw_impact(atom/hit_atom)
..()
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
@@ -710,6 +715,8 @@
/obj/item/toy/cards
+ burn_state = 0 //Burnable
+ burntime = 5
var/parentdeck = null
var/deckstyle = "nanotrasen"
var/card_hitsound = null
@@ -949,7 +956,8 @@
newobj.card_throw_speed = sourceobj.card_throw_speed
newobj.card_throw_range = sourceobj.card_throw_range
newobj.card_attack_verb = sourceobj.card_attack_verb
-
+ if(sourceobj.burn_state == -1)
+ newobj.burn_state = -1
/obj/item/toy/cards/singlecard
name = "card"
@@ -1065,6 +1073,7 @@
card_throw_speed = 3
card_throw_range = 7
card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut")
+ burn_state = -1 //Not Burnable
/*
* Fake nuke
@@ -1123,6 +1132,7 @@
icon_state = "carpplushie"
w_class = 2.0
attack_verb = list("bitten", "eaten", "fin slapped")
+ burn_state = 0 //Burnable
var/bitesound = 'sound/weapons/bite.ogg'
// Attack mob
diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm
index 2e22500c790..12e705d193b 100644
--- a/code/game/objects/items/trash.dm
+++ b/code/game/objects/items/trash.dm
@@ -3,6 +3,7 @@
icon = 'icons/obj/janitor.dmi'
desc = "This is rubbish."
w_class = 1.0
+ burn_state = 0 //Burnable
/obj/item/trash/raisins
name = "\improper 4no raisins"
@@ -51,6 +52,7 @@
/obj/item/trash/tray
name = "tray"
icon_state = "tray"
+ burn_state = -1 //Not Burnable
/obj/item/trash/candle
name = "candle"
@@ -60,6 +62,7 @@
/obj/item/trash/can
name = "crushed can"
icon_state = "cola"
+ burn_state = -1 //Not Burnable
/obj/item/trash/attack(mob/M, mob/living/user)
return
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm
index 5d728df3a9d..921ca4479a1 100644
--- a/code/game/objects/items/weapons/cigs_lighters.dm
+++ b/code/game/objects/items/weapons/cigs_lighters.dm
@@ -201,14 +201,16 @@ CIGARETTE PACKETS ARE IN FANCY.DM
/obj/item/clothing/mask/cigarette/proc/handle_reagents()
- if(iscarbon(loc))
- var/mob/living/carbon/C = loc
- if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
- if(prob(15)) // so it's not an instarape in case of acid
- reagents.reaction(C, INGEST)
- reagents.trans_to(C, REAGENTS_METABOLISM)
- return
- reagents.remove_any(REAGENTS_METABOLISM)
+ if(reagents.total_volume)
+ if(iscarbon(loc))
+ var/mob/living/carbon/C = loc
+ if (src == C.wear_mask) // if it's in the human/monkey mouth, transfer reagents to the mob
+ if(prob(15)) // so it's not an instarape in case of acid
+ var/fraction = min(REAGENTS_METABOLISM/reagents.total_volume, 1)
+ reagents.reaction(C, INGEST, fraction)
+ reagents.trans_to(C, REAGENTS_METABOLISM)
+ return
+ reagents.remove_any(REAGENTS_METABOLISM)
/obj/item/clothing/mask/cigarette/process()
diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm
index c3f62193260..408cbe25a01 100644
--- a/code/game/objects/items/weapons/courtroom.dm
+++ b/code/game/objects/items/weapons/courtroom.dm
@@ -11,6 +11,7 @@
throwforce = 6.0
w_class = 2.0
attack_verb = list("bashed", "battered", "judged", "whacked")
+ burn_state = 0 //Burnable
/obj/item/weapon/gavelhammer/suicide_act(mob/user)
user.visible_message("[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.")
@@ -25,6 +26,7 @@
force = 2.0
throwforce = 2.0
w_class = 1.0
+ burn_state = 0 //Burnable
/obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/gavelhammer))
diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm
index 2dfa4b44c66..19e57dbb30b 100644
--- a/code/game/objects/items/weapons/extinguisher.dm
+++ b/code/game/objects/items/weapons/extinguisher.dm
@@ -151,6 +151,9 @@
if(isliving(atm)) //For extinguishing mobs on fire
var/mob/living/M = atm
M.ExtinguishMob()
+ if(istype(atm,/obj/item))
+ var/obj/item/Item = atm
+ Item.extinguish()
if(W.loc == my_target) break
sleep(2)
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index 242abdf81f6..9f1ba40f4c1 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -13,7 +13,7 @@
icon = 'icons/obj/storage.dmi'
icon_state = "giftcrate3"
item_state = "gift1"
-
+ burn_state = 0 //Burnable
/obj/item/weapon/a_gift/New()
..()
@@ -86,6 +86,7 @@
flags = NOBLUDGEON
amount = 25
max_amount = 25
+ burn_state = 0 //Burnable
/obj/item/stack/wrapping_paper/attack_self(mob/user)
user << "You need to use it on a package that has already been wrapped!"
diff --git a/code/game/objects/items/weapons/grenades/chem_grenade.dm b/code/game/objects/items/weapons/grenades/chem_grenade.dm
index 2823aa83d0f..2ab9f5a64dd 100644
--- a/code/game/objects/items/weapons/grenades/chem_grenade.dm
+++ b/code/game/objects/items/weapons/grenades/chem_grenade.dm
@@ -182,31 +182,29 @@
mix_reagents()
- if(reagents.total_volume) //The possible reactions didnt use up all reagents.
+ if(reagents.total_volume) //The possible reactions didnt use up all reagents, so we spread it around.
var/datum/effect/effect/system/steam_spread/steam = new /datum/effect/effect/system/steam_spread()
steam.set_up(10, 0, get_turf(src))
steam.attach(src)
steam.start()
- var/list/viewable = view(affected_area, loc)
- var/list/accessible = can_flood_from(loc, affected_area)
- var/list/reactable = accessible
- var/mycontents = GetAllContents()
- for(var/turf/T in accessible)
- for(var/atom/A in T.GetAllContents())
- if(A in mycontents) continue
- if(!(A in viewable)) continue
- reactable |= A
- if(!reactable.len) //Nothing to react with. Probably means we're in nullspace.
- qdel(src)
- return
- var/fraction = 1/reactable.len
- for(var/atom/A in reactable)
- reagents.reaction(A, TOUCH, fraction)
+ var/list/viewable = view(affected_area, loc)
+ var/list/accessible = can_flood_from(loc, affected_area)
+ var/list/reactable = accessible
+ var/mycontents = GetAllContents()
+ for(var/turf/T in accessible)
+ for(var/atom/A in T.GetAllContents())
+ if(A in mycontents) continue
+ if(!(A in viewable)) continue
+ reactable |= A
+ if(!reactable.len) //Nothing to react with. Probably means we're in nullspace.
+ qdel(src)
+ return
+ var/fraction = 1/reactable.len
+ for(var/atom/A in reactable)
+ reagents.reaction(A, TOUCH, fraction)
- invisibility = INVISIBILITY_MAXIMUM //Why am i doing this?
- spawn(50) //To make sure all reagents can work
- qdel(src) //correctly before deleting the grenade.
+ qdel(src)
/obj/item/weapon/grenade/chem_grenade/proc/mix_reagents()
var/total_temp
@@ -354,13 +352,14 @@
/obj/item/weapon/grenade/chem_grenade/teargas/New()
..()
- var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
- B1.reagents.add_reagent("condensedcapsaicin", 25)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
+ B1.reagents.add_reagent("condensedcapsaicin", 70)
+ B1.reagents.add_reagent("potassium", 30)
+ B2.reagents.add_reagent("phosphorus", 30)
+ B2.reagents.add_reagent("sugar", 30)
+ B1.reagents.add_reagent("condensedcapsaicin", 40)
beakers += B1
beakers += B2
@@ -373,17 +372,19 @@
/obj/item/weapon/grenade/chem_grenade/facid/New()
..()
- var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
- var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
+ var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
- B1.reagents.add_reagent("facid", 25)
- B1.reagents.add_reagent("potassium", 25)
- B2.reagents.add_reagent("phosphorus", 25)
- B2.reagents.add_reagent("sugar", 25)
+ B1.reagents.add_reagent("facid", 290)
+ B1.reagents.add_reagent("potassium", 10)
+ B2.reagents.add_reagent("phosphorus", 10)
+ B2.reagents.add_reagent("sugar", 10)
+ B2.reagents.add_reagent("facid", 280)
beakers += B1
beakers += B2
+
/obj/item/weapon/grenade/chem_grenade/colorful
name = "colorful grenade"
desc = "Used for wide scale painting projects."
@@ -402,6 +403,7 @@
beakers += B1
beakers += B2
+
/obj/item/weapon/grenade/chem_grenade/clf3
name = "clf3 grenade"
desc = "BURN!-brand foaming clf3. In a special applicator for rapid purging of wide areas."
@@ -412,10 +414,10 @@
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B1 = new(src)
var/obj/item/weapon/reagent_containers/glass/beaker/bluespace/B2 = new(src)
- B1.reagents.add_reagent("fluorosurfactant", 290)
- B1.reagents.add_reagent("clf3", 10)
- B2.reagents.add_reagent("water", 290)
- B2.reagents.add_reagent("clf3", 10)
+ B1.reagents.add_reagent("fluorosurfactant", 250)
+ B1.reagents.add_reagent("clf3", 50)
+ B2.reagents.add_reagent("water", 250)
+ B2.reagents.add_reagent("clf3", 50)
beakers += B1
beakers += B2
diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm
index 85375327940..51272bbd0a7 100644
--- a/code/game/objects/items/weapons/grenades/grenade.dm
+++ b/code/game/objects/items/weapons/grenades/grenade.dm
@@ -9,10 +9,15 @@
throw_range = 7
flags = CONDUCT
slot_flags = SLOT_BELT
+ burn_state = 0 //Burnable
+ burntime = 5
var/active = 0
var/det_time = 50
var/display_timer = 1
+/obj/item/weapon/grenade/burn()
+ prime()
+
/obj/item/weapon/grenade/proc/clown_check(var/mob/living/carbon/human/user)
if(user.disabilities & CLUMSY && prob(50))
user << "Huh? How does this thing work?"
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 5ba0e73fa7d..059fb02ae5c 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -5,11 +5,11 @@
det_time = 20
item_state = "flashbang"
slot_flags = SLOT_BELT
- var/datum/effect/effect/system/bad_smoke_spread/smoke
+ var/datum/effect/effect/system/smoke_spread/bad/smoke
/obj/item/weapon/grenade/smokebomb/New()
..()
- src.smoke = new /datum/effect/effect/system/bad_smoke_spread
+ src.smoke = new /datum/effect/effect/system/smoke_spread/bad
src.smoke.attach(src)
/obj/item/weapon/grenade/smokebomb/Destroy()
@@ -24,10 +24,6 @@
src.smoke.start()
sleep(10)
src.smoke.start()
- sleep(10)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
for(var/obj/effect/blob/B in view(8,src))
var/damage = round(30/(get_dist(B,src)+1))
diff --git a/code/game/objects/items/weapons/implants/implant.dm b/code/game/objects/items/weapons/implants/implant.dm
index be83f60bf9d..7031edd688f 100644
--- a/code/game/objects/items/weapons/implants/implant.dm
+++ b/code/game/objects/items/weapons/implants/implant.dm
@@ -82,6 +82,10 @@
name = "microbomb implant"
desc = "And boom goes the weasel."
icon_state = "explosive"
+ var/weak = 1.6
+ var/medium = 0.8
+ var/heavy = 0.4
+ var/delay = 7
/obj/item/weapon/implant/explosive/get_data()
var/dat = {"Implant Specifications:
@@ -103,33 +107,69 @@
if(!cause || !imp_in) return 0
if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your microbomb implant? This will cause you to explode!", "Microbomb Implant Confirmation", "Yes", "No") != "Yes")
return 0
- var/light = 1
- var/medium = 0.5
- var/heavy = 0.25
for(var/obj/item/weapon/implant/explosive/E in imp_in)
- heavy += 0.25
- medium += 0.5
- light += 1
+ heavy += 0.4
+ medium += 0.8
+ weak += 1.6
+ delay += 7
if(E != src)
qdel(E)
heavy = round(heavy)
medium = round(medium)
- light = round(light)
+ weak = round(weak)
+ imp_in << "You activate your microbomb implant."
+//If the delay is short, just blow up already jeez
+ if(delay <= 7)
+ imp_in.gib()
+ explosion(src,heavy,medium,weak,weak, flame_range = weak)
+ qdel(src)
+ imp_in.visible_message("[imp_in] starts beeping ominously!")
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ if(imp_in.stat)
+ imp_in.visible_message("[imp_in] doubles over in pain!")
+ imp_in.Weaken(7)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
imp_in.gib()
- explosion(src,heavy,medium,light,light, flame_range = light)
+ explosion(src,heavy,medium,weak,weak, flame_range = weak)
qdel(src)
/obj/item/weapon/implant/explosive/macro
name = "macrobomb implant"
desc = "And boom goes the weasel. And everything else nearby."
icon_state = "explosive"
+ weak = 16
+ medium = 8
+ heavy = 4
+ delay = 70
/obj/item/weapon/implant/explosive/macro/activate(var/cause)
if(!cause || !imp_in) return 0
if(cause == "action_button" && alert(imp_in, "Are you sure you want to activate your macrobomb implant? This will cause you to explode and gib!", "Macrobomb Implant Confirmation", "Yes", "No") != "Yes")
return 0
+ for(var/obj/item/weapon/implant/explosive/macro/E in imp_in)
+ if(E != src)
+ qdel(E)
+ imp_in << "You activate your macrobomb implant."
+ imp_in.visible_message("[imp_in] starts beeping ominously!")
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ if(imp_in.stat)
+ imp_in.visible_message("[imp_in] doubles over in pain!")
+ imp_in.Weaken(7)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
+ playsound(loc, 'sound/items/timer.ogg', 30, 0)
+ sleep(delay/4)
imp_in.gib()
- explosion(src,5,10,20,20, flame_range = 20)
+ explosion(src,heavy,medium,weak,weak, flame_range = weak)
qdel(src)
/obj/item/weapon/implant/chem
diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm
index ff0a719e4bb..60b08e58e64 100644
--- a/code/game/objects/items/weapons/mop.dm
+++ b/code/game/objects/items/weapons/mop.dm
@@ -11,6 +11,7 @@
throw_range = 7
w_class = 3.0
attack_verb = list("mopped", "bashed", "bludgeoned", "whacked")
+ burn_state = 0 //Burnable
var/mopping = 0
var/mopcount = 0
var/mopcap = 5
diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm
index 48809459247..14ddda46e57 100644
--- a/code/game/objects/items/weapons/paint.dm
+++ b/code/game/objects/items/weapons/paint.dm
@@ -10,6 +10,8 @@
item_color = "FFFFFF"
item_state = "paintcan"
w_class = 3.0
+ burn_state = 0 //Burnable
+ burntime = 5
var/paintleft = 10
/obj/item/weapon/paint/red
diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm
index 521f5ab64e7..535aca43cd0 100644
--- a/code/game/objects/items/weapons/scrolls.dm
+++ b/code/game/objects/items/weapons/scrolls.dm
@@ -9,6 +9,7 @@
throw_speed = 3
throw_range = 7
origin_tech = "bluespace=4"
+ burn_state = 0 //Burnable
/obj/item/weapon/teleportation_scroll/apprentice
name = "lesser scroll of teleportation"
@@ -57,7 +58,7 @@
if(!((user == loc || (in_range(src, user) && istype(src.loc, /turf)))))
return
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(5, 0, user.loc)
smoke.attach(user)
smoke.start()
diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm
index 15451d602a8..67467ce35c1 100644
--- a/code/game/objects/items/weapons/signs.dm
+++ b/code/game/objects/items/weapons/signs.dm
@@ -5,6 +5,7 @@
force = 5
w_class = 4.0
attack_verb = list("bashed","smacked")
+ burn_state = 0 //Burnable
var/label = ""
var/last_wave = 0
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index d8aed9fdd9d..3cf9da86528 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -18,6 +18,8 @@
slot_flags = SLOT_BACK //ERROOOOO
max_w_class = 3
max_combined_w_class = 21
+ burn_state = 0 //Burnable
+ burntime = 20
/obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
playsound(src.loc, "rustle", 50, 1, -5)
@@ -34,6 +36,9 @@
icon_state = "holdingpack"
max_w_class = 5
max_combined_w_class = 35
+ burn_state = -1 // NotBurnable
+ var/pshoom = 'sound/items/PSHOOM.ogg'
+ var/alt_sound = 'sound/items/PSHOOM_2.ogg'
/obj/item/weapon/storage/backpack/holding/suicide_act(mob/user)
user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.")
@@ -50,6 +55,20 @@
return
return ..()
+/obj/item/weapon/storage/backpack/holding/content_can_dump(atom/dest_object, mob/user)
+ if(Adjacent(user))
+ if(get_dist(user, dest_object) < 8)
+ if(dest_object.storage_contents_dump_act(src, user))
+ if(alt_sound && prob(1))
+ playsound(src, alt_sound, 40, 1)
+ else
+ playsound(src, pshoom, 40, 1)
+ user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5)
+ return 1
+ user << "The [src.name] buzzes."
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ return 0
+
/obj/item/weapon/storage/backpack/holding/handle_item_insertion(obj/item/W, prevent_warning = 0, mob/user)
if(istype(W, /obj/item/weapon/storage/backpack/holding) && !W.crit_fail)
var/safety = alert(user, "You feel this may not be the best idea.", "Put in [name]?", "Proceed", "Abort")
@@ -129,12 +148,14 @@
desc = "It's a special backpack made exclusively for Nanotrasen officers."
icon_state = "captainpack"
item_state = "captainpack"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/industrial
name = "industrial backpack"
desc = "It's a tough backpack for the daily grind of station life."
icon_state = "engiepack"
item_state = "engiepack"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/botany
name = "botany backpack"
@@ -159,6 +180,7 @@
desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma."
icon_state = "toxpack"
item_state = "toxpack"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/virology
name = "virology backpack"
@@ -175,6 +197,7 @@
name = "leather satchel"
desc = "It's a very fancy satchel made with fine leather."
icon_state = "satchel"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/satchel/withwallet/New()
..()
@@ -190,6 +213,7 @@
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
item_state = "engiepack"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/satchel_med
name = "medical satchel"
@@ -220,6 +244,7 @@
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
item_state = "satchel-tox"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/satchel_hyd
name = "botanist satchel"
@@ -238,6 +263,7 @@
desc = "An exclusive satchel for Nanotrasen officers."
icon_state = "satchel-cap"
item_state = "captainpack"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/satchel_flat
name = "smuggler's satchel"
@@ -310,6 +336,7 @@
desc = "A large dufflebag for holding extra captainly goods."
icon_state = "duffle-captain"
item_state = "duffle-captain"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/dufflebag/med
name = "medical dufflebag"
@@ -324,10 +351,11 @@
item_state = "duffle-sec"
/obj/item/weapon/storage/backpack/dufflebag/engineering
- name = "engineering dufflebag"
+ name = "industrial dufflebag"
desc = "A large dufflebag for holding extra tools and supplies."
icon_state = "duffle-eng"
item_state = "duffle-eng"
+ burn_state = -1 //Not Burnable
/obj/item/weapon/storage/backpack/dufflebag/clown
name = "clown's dufflebag"
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 7519804b005..9790b77e206 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -103,6 +103,7 @@
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)
+ burn_state = 0 //Burnable
////////
@@ -280,6 +281,7 @@
max_w_class = 3
w_class = 4 //Bigger than a book because physics
can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook)
+ burn_state = 0 //Burnable
/*
* Trays - Agouri
@@ -349,3 +351,4 @@
w_class = 1
preposition = "in"
can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle)
+ burn_state = 0 //Burnable
diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm
index 1efe547141c..dcb45f1fe5d 100644
--- a/code/game/objects/items/weapons/storage/book.dm
+++ b/code/game/objects/items/weapons/storage/book.dm
@@ -6,6 +6,7 @@
throw_speed = 2
throw_range = 5
w_class = 3.0
+ burn_state = 0 //Burnable
var/title = "book"
/obj/item/weapon/storage/book/attack_self(mob/user)
user << "The pages of [title] have been cut out!"
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 936f6e72425..d8ea59ab5f4 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -24,6 +24,7 @@
desc = "It's just an ordinary box."
icon_state = "box"
item_state = "syringe_kit"
+ burn_state = 0 //Burnable
var/foldable = /obj/item/stack/sheet/cardboard
diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm
index 93a6fdc2679..b37091113a6 100644
--- a/code/game/objects/items/weapons/storage/briefcase.dm
+++ b/code/game/objects/items/weapons/storage/briefcase.dm
@@ -11,6 +11,8 @@
max_w_class = 3
max_combined_w_class = 21
attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked")
+ burn_state = 0 //Burnable
+ burntime = 20
/obj/item/weapon/storage/briefcase/New()
..()
diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm
index c7f35dc05a0..5fd3462135d 100644
--- a/code/game/objects/items/weapons/storage/fancy.dm
+++ b/code/game/objects/items/weapons/storage/fancy.dm
@@ -17,6 +17,7 @@
icon = 'icons/obj/food/containers.dmi'
icon_state = "donutbox6"
name = "donut box"
+ burn_state = 0 //Burnable
var/icon_type = "donut"
var/spawn_type = null
diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm
index 5f2e841eff0..a1b73157d55 100644
--- a/code/game/objects/items/weapons/storage/wallets.dm
+++ b/code/game/objects/items/weapons/storage/wallets.dm
@@ -4,6 +4,7 @@
storage_slots = 4
icon_state = "wallet"
w_class = 2
+ burn_state = 0 //Burnable
can_hold = list(
/obj/item/stack/spacecash,
/obj/item/weapon/card,
diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm
index d634d9a832c..08808afdc04 100644
--- a/code/game/objects/items/weapons/tanks/watertank.dm
+++ b/code/game/objects/items/weapons/tanks/watertank.dm
@@ -309,7 +309,9 @@
pass_flags = PASSTABLE
/obj/effect/nanofrost_container/proc/Smoke()
- PoolOrNew(/obj/effect/effect/freezing_smoke, list(loc, 6, 1))
+ var/datum/effect/effect/system/smoke_spread/freezing/S = new
+ S.set_up(6, 0, loc, null, 1)
+ S.start()
var/obj/effect/decal/cleanable/flour/F = new /obj/effect/decal/cleanable/flour(src.loc)
F.color = "#B2FFFF"
F.name = "nanofrost residue"
@@ -317,33 +319,16 @@
playsound(src,'sound/effects/bamf.ogg',100,1)
qdel(src)
-/obj/effect/effect/freezing_smoke
+/obj/effect/effect/smoke/freezing
name = "nanofrost smoke"
- icon_state = "smoke"
opacity = 0
- anchored = 0.0
- mouse_opacity = 0
- icon = 'icons/effects/96x96.dmi'
- pixel_x = -32
- pixel_y = -32
color = "#B2FFFF"
- var/amount = 0
-/obj/effect/effect/freezing_smoke/New(loc, var/amt, var/blast)
- ..()
- spawn(100+rand(10,30))
- qdel(src)
- amount = amt
- if(amount)
- var/datum/effect/effect/system/freezing_smoke_spread/F = new /datum/effect/effect/system/freezing_smoke_spread
- F.set_up(amount, 0, src.loc)
- F.start()
- if(blast)
- for(var/turf/T in trange(2, src.loc))
- Chilled(T)
- return
+/datum/effect/effect/system/smoke_spread/freezing
+ smoke_type = /obj/effect/effect/smoke/freezing
+ var/blast = 0
-/obj/effect/effect/freezing_smoke/proc/Chilled(atom/A)
+/datum/effect/effect/system/smoke_spread/freezing/proc/Chilled(atom/A)
if(istype(A, /turf/simulated))
var/turf/simulated/T = A
if(T.air)
@@ -362,31 +347,20 @@
V.visible_message("[V] was frozen shut!")
for(var/mob/living/L in T)
L.ExtinguishMob()
+ for(var/obj/item/Item in T)
+ Item.extinguish()
return
-/datum/effect/effect/system/freezing_smoke_spread
+/datum/effect/effect/system/smoke_spread/freezing/set_up(n = 5, c = 0, loca, direct, blasting = 0)
+ ..()
+ blast = blasting
-/datum/effect/effect/system/freezing_smoke_spread/set_up(n = 6, c = 0, loca)
- number = n
- if(istype(loca, /turf/))
- location = loca
- else
- location = get_turf(loca)
+/datum/effect/effect/system/smoke_spread/freezing/start()
+ if(blast)
+ for(var/turf/T in trange(2, location))
+ Chilled(T)
+ ..()
-/datum/effect/effect/system/freezing_smoke_spread/start()
- var/i = 0
- for(i=0, iThe [src] warps in!")
diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm
index a5494427e55..23be1ce7c31 100644
--- a/code/game/objects/structures/mineral_doors.dm
+++ b/code/game/objects/structures/mineral_doors.dm
@@ -242,6 +242,8 @@
hardness = 1
openSound = 'sound/effects/doorcreaky.ogg'
closeSound = 'sound/effects/doorcreaky.ogg'
+ burn_state = 0 //Burnable
+ burntime = 30
/obj/structure/mineral_door/wood/Dismantle(devastated = 0)
if(!devastated)
diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
index af9c059a8f7..1682c22403b 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm
@@ -13,6 +13,8 @@
icon_state = "bed"
can_buckle = 1
buckle_lying = 1
+ burn_state = 0 //Burnable
+ burntime = 30
/obj/structure/stool/bed/alien
name = "resting contraption"
@@ -59,6 +61,7 @@
icon = 'icons/obj/rollerbed.dmi'
icon_state = "down"
anchored = 0
+ burn_state = -1 //Not Burnable
/obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M)
if(M == buckled_mob)
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 915f56b9ac0..1dea5a15dde 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -3,6 +3,7 @@
desc = "You sit in this. Either by will or force."
icon_state = "chair"
buckle_lying = 0 //you sit in a chair, not lay
+ burn_state = -1 //Not Burnable
/obj/structure/stool/bed/chair/New()
..()
@@ -73,6 +74,10 @@
// Chair types
+/obj/structure/stool/bed/chair/wood
+ burn_state = 0 //Burnable
+ burntime = 20
+
/obj/structure/stool/bed/chair/wood/normal
icon_state = "wooden_chair"
name = "wooden chair"
@@ -96,6 +101,8 @@
desc = "It looks comfy."
icon_state = "comfychair"
color = rgb(255,255,255)
+ burn_state = 0 //Burnable
+ burntime = 30
var/image/armrest = null
/obj/structure/stool/bed/chair/comfy/New()
diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm
index 5196a37fa9d..18288c5f670 100644
--- a/code/game/objects/structures/table_frames.dm
+++ b/code/game/objects/structures/table_frames.dm
@@ -75,6 +75,7 @@
icon_state = "wood_frame"
framestack = /obj/item/stack/sheet/mineral/wood
framestackamount = 2
+ burn_state = 0 //Burnable
/obj/structure/table_frame/wood/attackby(var/obj/item/I, mob/user, params)
if(istype(I, /obj/item/weapon/wrench))
diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm
index cf8b9476c2f..7258982885d 100644
--- a/code/game/objects/structures/tables_racks.dm
+++ b/code/game/objects/structures/tables_racks.dm
@@ -432,6 +432,8 @@
frame = /obj/structure/table_frame/wood
framestack = /obj/item/stack/sheet/mineral/wood
buildstack = /obj/item/stack/sheet/mineral/wood
+ burn_state = 0 //Burnable
+ burntime = 20
/obj/structure/table/wood/poker //No specialties, Just a mapping object.
name = "gambling table"
diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm
index d62a69d769f..de1e9952612 100644
--- a/code/game/objects/structures/watercloset.dm
+++ b/code/game/objects/structures/watercloset.dm
@@ -229,6 +229,7 @@
//Yes, showers are super powerful as far as washing goes.
/obj/machinery/shower/proc/wash(atom/movable/O)
if(!on) return
+
if(ismob(O))
mobpresent += 1
check_heat(O)
@@ -284,9 +285,13 @@
if(H.shoes && washshoes)
if(H.shoes.clean_blood())
H.update_inv_shoes(0)
- if(H.wear_mask && washmask)
- if(H.wear_mask.clean_blood())
- H.update_inv_wear_mask(0)
+ if(H.wear_mask)
+ if(washmask)
+ if(H.wear_mask.clean_blood())
+ H.update_inv_wear_mask(0)
+ else
+ H.lip_style = null
+ H.update_body()
if(H.glasses && washglasses)
if(H.glasses.clean_blood())
H.update_inv_glasses(0)
@@ -303,6 +308,13 @@
else
O.clean_blood()
+ else
+ O.clean_blood()
+
+ if(istype(O,/obj/item))
+ var/obj/item/Item = O
+ Item.extinguish()
+
if(isturf(loc))
var/turf/tile = loc
loc.clean_blood()
@@ -310,7 +322,6 @@
if(is_cleanable(E))
qdel(E)
-
/obj/machinery/shower/process()
if(!on || !mobpresent) return
for(var/mob/living/carbon/C in loc)
diff --git a/code/modules/admin/verbs/adminhelp.dm b/code/modules/admin/verbs/adminhelp.dm
index d6ca52c46a3..14a287c31cf 100644
--- a/code/modules/admin/verbs/adminhelp.dm
+++ b/code/modules/admin/verbs/adminhelp.dm
@@ -1,38 +1,7 @@
-/client/var/adminhelptimerid = 0
+/proc/keywords_lookup(var/msg)
-/client/proc/giveadminhelpverb()
- src.verbs |= /client/verb/adminhelp
- adminhelptimerid = 0
-
-//This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE!
-var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as")
-
-
-
-/client/verb/adminhelp(msg as text)
- set category = "Admin"
- set name = "Adminhelp"
-
- if(say_disabled) //This is here to try to identify lag problems
- usr << "Speech is currently admin-disabled."
- return
-
- //handle muting and automuting
- if(prefs.muted & MUTE_ADMINHELP)
- src << "Error: Admin-PM: You cannot send adminhelps (Muted)."
- return
- if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
- return
-
- //clean the input msg
- if(!msg) return
- msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
- if(!msg) return
- var/original_msg = msg
-
- //remove out adminhelp verb temporarily to prevent spamming of admins.
- src.verbs -= /client/verb/adminhelp
- adminhelptimerid = addtimer(src,"giveadminhelpverb",1200) //2 minute cooldown of admin helps
+ //This is a list of words which are ignored by the parser when comparing message contents for names. MUST BE IN LOWER CASE!
+ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","alien","as", "i")
//explode the input msg into a list
var/list/msglist = text2list(msg, " ")
@@ -83,15 +52,50 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
mobs_found += found
if(!ai_found && isAI(found))
ai_found = 1
- msg += "[original_word] (?) (FLW) "
+ msg += "[original_word](?|F) "
continue
msg += "[original_word] "
+ return msg
+
+
+/client/var/adminhelptimerid = 0
+
+/client/proc/giveadminhelpverb()
+ src.verbs |= /client/verb/adminhelp
+ adminhelptimerid = 0
+
+/client/verb/adminhelp(msg as text)
+ set category = "Admin"
+ set name = "Adminhelp"
+
+ if(say_disabled) //This is here to try to identify lag problems
+ usr << "Speech is currently admin-disabled."
+ return
+
+ //handle muting and automuting
+ if(prefs.muted & MUTE_ADMINHELP)
+ src << "Error: Admin-PM: You cannot send adminhelps (Muted)."
+ return
+ if(src.handle_spam_prevention(msg,MUTE_ADMINHELP))
+ return
+
+ //clean the input msg
+ if(!msg) return
+ msg = sanitize(copytext(msg,1,MAX_MESSAGE_LEN))
+ if(!msg) return
+ var/original_msg = msg
+
+ //remove our adminhelp verb temporarily to prevent spamming of admins.
+ src.verbs -= /client/verb/adminhelp
+ adminhelptimerid = addtimer(src,"giveadminhelpverb",1200) //2 minute cooldown of admin helps
+
+ msg = keywords_lookup(msg)
if(!mob) return //this doesn't happen
var/ref_mob = "\ref[mob]"
var/ref_client = "\ref[src]"
- msg = "HELP: [key_name_admin(src)] (?) (PP) (VV) (SM) (FLW) (TP)[ai_found ? " (CL)" : ""] (REJT): [msg]"
+ msg = "HELP: [key_name(src)] (?) (PP) (VV) (SM) (FLW) (TP) (REJT): [msg]"
//send this msg to all admins
diff --git a/code/modules/admin/verbs/adminpm.dm b/code/modules/admin/verbs/adminpm.dm
index 944677f2350..e79649e7dc4 100644
--- a/code/modules/admin/verbs/adminpm.dm
+++ b/code/modules/admin/verbs/adminpm.dm
@@ -32,6 +32,26 @@
cmd_admin_pm(targets[target],null)
feedback_add_details("admin_verb","APM") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
+/client/proc/cmd_ahelp_reply(whom)
+ if(prefs.muted & MUTE_ADMINHELP)
+ src << "Error: Admin-PM: You are unable to use admin PM-s (muted)."
+ return
+ var/client/C
+ if(istext(whom))
+ if(cmptext(copytext(whom,1,2),"@"))
+ whom = findStealthKey(whom)
+ C = directory[whom]
+ else if(istype(whom,/client))
+ C = whom
+ if(!C)
+ if(holder) src << "Error: Admin-PM: Client not found."
+ return
+ message_admins("[key_name_admin(src)] has started replying to [key_name(C, 0, 0)]'s admin help.")
+ var/msg = input(src,"Message:", "Private message to [key_name(C, 0, 0)]") as text|null
+ if (!msg)
+ message_admins("[key_name_admin(src)] has cancelled their reply to [key_name(C, 0, 0)]'s admin help.")
+ return
+ cmd_admin_pm(whom, msg)
//takes input from cmd_admin_pm_context, cmd_admin_pm_panel or /client/Topic and sends them a PM.
//Fetching a message if needed. src is the sender and C is the target client
@@ -71,14 +91,15 @@
if(!msg) return
msg = emoji_parse(msg)
+ var/keywordparsedmsg = keywords_lookup(msg)
if(C.holder)
if(holder) //both are admins
- C << "Admin PM from-[key_name(src, C, 1)]: [msg]"
- src << "Admin PM to-[key_name(C, src, 1)]: [msg]"
+ C << "Admin PM from-[key_name(src, C, 1)]: [keywordparsedmsg]"
+ src << "Admin PM to-[key_name(C, src, 1)]: [keywordparsedmsg]"
else //recipient is an admin but sender is not
- C << "Reply PM from-[key_name(src, C, 1)]: [msg]"
+ C << "Reply PM from-[key_name(src, C, 1)]: [keywordparsedmsg]"
src << "PM to-Admins: [msg]"
//play the recieving admin the adminhelp sound (if they have them enabled)
@@ -117,4 +138,4 @@
//we don't use message_admins here because the sender/receiver might get it too
for(var/client/X in admins)
if(X.key!=key && X.key!=C.key) //check client/X is an admin and isn't the sender or recipient
- X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [msg]" //inform X
+ X << "PM: [key_name(src, X, 0)]->[key_name(C, X, 0)]: \blue [keywordparsedmsg]" //inform X
diff --git a/code/modules/admin/verbs/adminsay.dm b/code/modules/admin/verbs/adminsay.dm
index 1e077bd66e9..ff1e0cf97a3 100644
--- a/code/modules/admin/verbs/adminsay.dm
+++ b/code/modules/admin/verbs/adminsay.dm
@@ -8,7 +8,7 @@
if(!msg) return
log_admin("[key_name(src)] : [msg]")
-
+ msg = keywords_lookup(msg)
if(check_rights(R_ADMIN,0))
msg = "ADMIN: [key_name(usr, 1)] (FLW): [msg]"
admins << msg
diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm
index a7cc46fec17..f1024432765 100644
--- a/code/modules/client/client procs.dm
+++ b/code/modules/client/client procs.dm
@@ -31,6 +31,9 @@
//Admin PM
if(href_list["priv_msg"])
+ if (href_list["ahelp_reply"])
+ cmd_ahelp_reply(href_list["priv_msg"])
+ return
cmd_admin_pm(href_list["priv_msg"],null)
return
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index c655ee34d45..e410f6dde59 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -1,5 +1,6 @@
/obj/item/clothing
name = "clothing"
+ burn_state = 0 //Burnable
var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS
var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect
var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets
@@ -23,6 +24,7 @@
w_class = 1.0
throwforce = 0
slot_flags = SLOT_EARS
+ burn_state = -1 //Not Burnable
/obj/item/clothing/ears/earmuffs
name = "earmuffs"
@@ -32,7 +34,7 @@
flags = EARBANGPROTECT
strip_delay = 15
put_on_delay = 25
-
+ burn_state = 0 //Burnable
//Glasses
/obj/item/clothing/glasses
@@ -48,7 +50,7 @@
var/list/icon/current = list() //the current hud icons
strip_delay = 20
put_on_delay = 25
-
+ burn_state = -1 //Not Burnable
/*
SEE_SELF // can see self, no matter what
SEE_MOBS // can see all mobs, no matter what
@@ -180,6 +182,7 @@ BLIND // can't see anything
strip_delay = 50
put_on_delay = 50
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
+ burn_state = -1 //Not Burnable
/obj/item/clothing/suit/space
name = "space suit"
@@ -201,6 +204,7 @@ BLIND // can't see anything
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
strip_delay = 80
put_on_delay = 80
+ burn_state = -1 //Not Burnable
//Under clothing
/obj/item/clothing/under
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index 9d7bf51d33c..18f5c7937f4 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -6,6 +6,7 @@
siemens_coefficient = 0
permeability_coefficient = 0.05
item_color="yellow"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/gloves/color/yellow/fake
desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..."
@@ -19,6 +20,7 @@
siemens_coefficient = 1 //Set to a default of 1, gets overridden in New()
permeability_coefficient = 0.05
item_color="yellow"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/gloves/color/fyellow/New()
siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5)
@@ -33,7 +35,7 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
-
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/gloves/color/black/hos
item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way.
@@ -148,6 +150,7 @@
permeability_coefficient = 0.01
item_color="white"
transfer_prints = TRUE
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/gloves/color/latex/nitrile
name = "nitrile gloves"
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 317ae88ac81..257394e13ce 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -21,6 +21,7 @@
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ burn_state = -1 //Not Burnable
/obj/item/clothing/gloves/combat
name = "combat gloves"
@@ -33,4 +34,5 @@
cold_protection = HANDS
min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT
heat_protection = HANDS
- max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
\ No newline at end of file
+ max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT
+ burn_state = -1 //Won't burn in fires
\ No newline at end of file
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index 4ada082a0fa..7dad46544c3 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -58,6 +58,7 @@
desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!"
icon_state = "welding"
item_state = "welding"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
@@ -110,9 +111,11 @@
desc = "Go Red! I mean Green! I mean Red! No Green!"
icon_state = "thunderdome"
item_state = "thunderdome"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/head/collectable/swat
name = "collectable SWAT helmet"
desc = "That's not real blood. That's red paint." //Reference to the actual description
icon_state = "swat"
- item_state = "swat"
\ No newline at end of file
+ item_state = "swat"
+ burn_state = -1 //Won't burn in fires
\ No newline at end of file
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index cf491f337dd..16d33da43c8 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -9,6 +9,7 @@
armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20)
flags_inv = 0
action_button_name = "Toggle Helmet Light"
+ burn_state = -1 //Won't burn in fires
attack_self(mob/user)
if(!isturf(user.loc))
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 8f5cc495877..945860157ea 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -11,6 +11,7 @@
heat_protection = HEAD
max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT
strip_delay = 60
+ burn_state = -1 //Won't burn in fires
var/obj/machinery/camera/portable/helmetCam = null
var/spawnWithHelmetCam = 0
var/canAttachCam = 0
diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm
index e7fc2072172..28f5f5c3b0e 100644
--- a/code/modules/clothing/head/misc.dm
+++ b/code/modules/clothing/head/misc.dm
@@ -57,13 +57,6 @@
flags = BLOCKHAIR
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
-/obj/item/clothing/head/that
- name = "sturdy top-hat"
- desc = "It's an amish looking armored top hat."
- icon_state = "tophat"
- item_state = "that"
- flags_inv = 0
-
/obj/item/clothing/head/cardborg
name = "cardborg helmet"
desc = "A helmet made out of a box."
@@ -215,6 +208,7 @@
throw_range = 5
w_class = 2.0
attack_verb = list("warned", "cautioned", "smashed")
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/head/santa
name = "santa hat"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index fa58e31116a..080c4a50100 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -27,6 +27,7 @@
action_button_name = "Toggle Welding Helmet"
visor_flags = HEADCOVERSEYES | HEADCOVERSMOUTH
visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/head/welding/attack_self()
toggle()
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index a3b54c55779..ae6dd7f7d6f 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -12,6 +12,7 @@
action_button_name = "Adjust Breath Mask"
ignore_maskadjust = 0
flags_cover = MASKCOVERSMOUTH
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/mask/breath/attack_self(var/mob/user)
adjustmask(user)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index f1d415357bf..59566b96179 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -9,6 +9,7 @@
gas_transfer_coefficient = 0.01
permeability_coefficient = 0.01
flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH
+ burn_state = -1 //Won't burn in fires
// **** Welding gas mask ****
@@ -224,10 +225,11 @@
/obj/item/clothing/mask/gas/clown_hat
name = "clown wig and mask"
desc = "A true prankster's facial attire. A clown is incomplete without his wig and mask."
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ flags = MASKINTERNALS
icon_state = "clown"
item_state = "clown_hat"
flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user)
@@ -248,34 +250,38 @@
/obj/item/clothing/mask/gas/sexyclown
name = "sexy-clown wig and mask"
desc = "A feminine clown mask for the dabbling crossdressers or female entertainers."
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ flags = MASKINTERNALS
icon_state = "sexyclown"
item_state = "sexyclown"
flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/mime
name = "mime mask"
desc = "The traditional mime's mask. It has an eerie facial posture."
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ flags = MASKINTERNALS
icon_state = "mime"
item_state = "mime"
flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/monkeymask
name = "monkey mask"
desc = "A mask used when acting as a monkey."
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ flags = MASKINTERNALS
icon_state = "monkeymask"
item_state = "monkeymask"
flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/sexymime
name = "sexy mime mask"
desc = "A traditional female mime's mask."
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
+ flags = MASKINTERNALS
icon_state = "sexymime"
item_state = "sexymime"
flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/death_commando
name = "Death Commando Mask"
@@ -286,10 +292,12 @@
name = "cyborg visor"
desc = "Beep boop."
icon_state = "death"
+ burn_state = 0 //Burnable
/obj/item/clothing/mask/gas/owl_mask
name = "owl mask"
desc = "Twoooo!"
- flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS
icon_state = "owl"
- flags_cover = MASKCOVERSEYES
\ No newline at end of file
+ flags = MASKINTERNALS
+ flags_cover = MASKCOVERSEYES
+ burn_state = 0 //Burnable
diff --git a/code/modules/clothing/shoes/bananashoes.dm b/code/modules/clothing/shoes/bananashoes.dm
index f1da928afff..f574c6a88cc 100644
--- a/code/modules/clothing/shoes/bananashoes.dm
+++ b/code/modules/clothing/shoes/bananashoes.dm
@@ -5,57 +5,63 @@
desc = "Lost prototype of advanced clown tech. Powered by bananium, these shoes leave a trail of chaos in their wake."
icon_state = "clown_prototype_off"
var/on = 0
- var/bananium = 0
+ var/datum/mineral_container/bananium
action_button_name = "Toggle Shoes"
+/obj/item/clothing/shoes/clown_shoes/banana_shoes/New()
+ ..()
+ bananium = new/datum/mineral_container(src,/obj/item/stack/sheet/mineral/bananium,200000)
+
/obj/item/clothing/shoes/clown_shoes/banana_shoes/step_action()
if(on)
- if(footstep > 1)//honks when activated
+ if(footstep > 1)//honks when its on
playsound(src, "sound/items/bikehorn.ogg", 75, 1)
footstep = 0
else
footstep++
new/obj/item/weapon/grown/bananapeel/specialpeel(get_step(src,turn(usr.dir, 180)), 5) //honk
- bananium -= 100
- if(bananium < 100)
+ bananium.use_amount(100)
+ if(bananium.amount < 100)
on = !on
update_icon()
- usr << "You ran out of bananium!"
+ loc << "You ran out of bananium!"
else
..()
/obj/item/clothing/shoes/clown_shoes/banana_shoes/attack_self(mob/user)
- if(bananium > 0)
- var/sheet_amount = round(bananium / 2000)
- if(sheet_amount > 0)
- var/obj/item/stack/sheet/mineral/bananium/M = new/obj/item/stack/sheet/mineral/bananium(get_turf(loc))
- M.amount = sheet_amount
- bananium -= sheet_amount * 2000
- user << "You retrieve [sheet_amount] sheets of bananium."
+ var/sheet_amount = bananium.retrieve_all()
+ if(sheet_amount)
+ user << "You retrieve [sheet_amount] sheets of bananium from the prototype shoes."
+ else
+ user << "You cannot retrieve any bananium from the prototype shoes."
/obj/item/clothing/shoes/clown_shoes/banana_shoes/attackby(obj/item/O, mob/user, params)
- if(istype(O,/obj/item/stack/sheet/mineral/bananium))
- var/obj/item/stack/sheet/mineral/bananium/M = O
- bananium += 2000 * M.amount
- user << "You insert [M.amount] bananium sheets into the prototype shoes."
- M.use(M.amount)
+ var/sheet_amount = bananium.insert_sheet(O)
+ if(sheet_amount > 0)
+ user << "You insert [sheet_amount] bananium sheets into the prototype shoes."
+ var/obj/item/stack/sheet/S = O
+ S.use(sheet_amount)
+ else if(sheet_amount < 0)
+ user << "You can only fit bananium sheets into these shoes!"
+ else
+ user << "You cannot insert more bananium into the prototype shoes."
/obj/item/clothing/shoes/clown_shoes/banana_shoes/examine(mob/user)
..()
- user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium] bananium left."
+ user << "The shoes are [on ? "enabled" : "disabled"]. There is [bananium.amount] bananium left."
/obj/item/clothing/shoes/clown_shoes/banana_shoes/ui_action_click()
- if(bananium > 0)
+ if(bananium.amount)
on = !on
update_icon()
- usr << "You [on ? "activate" : "deactivate"] the prototype shoes."
+ loc << "You [on ? "activate" : "deactivate"] the prototype shoes."
else
- usr << "You need bananium to turn the prototype shoes on!"
+ loc << "You need bananium to turn the prototype shoes on!"
/obj/item/clothing/shoes/clown_shoes/banana_shoes/update_icon()
if(on)
icon_state = "clown_prototype_on"
else
icon_state = "clown_prototype_off"
- usr.update_inv_shoes()
\ No newline at end of file
+ usr.update_inv_shoes()
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index 8d742f983db..843f69e25c5 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -8,7 +8,7 @@
action_button_name = "Toggle Magboots"
strip_delay = 70
put_on_delay = 70
-
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/shoes/magboots/verb/toggle()
set name = "Toggle Magboots"
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index 1a0a0a4f98c..0bebe7a3ee0 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -15,6 +15,7 @@
permeability_coefficient = 0.05
flags = NOSLIP
origin_tech = "syndicate=3"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/shoes/sneakers/mime
name = "mime shoes"
@@ -35,6 +36,7 @@
permeability_coefficient = 0.01
flags = NOSLIP
armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30)
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/shoes/sandal
desc = "A pair of rather plain, wooden sandals."
@@ -58,6 +60,7 @@
slowdown = SHOES_SLOWDOWN+1
strip_delay = 50
put_on_delay = 50
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/shoes/clown_shoes
desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!"
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index 817244af5c5..d3b65c48e3a 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -7,6 +7,7 @@
max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
strip_delay = 60
put_on_delay = 40
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/suit/armor/vest
name = "armor"
@@ -45,6 +46,7 @@
cold_protection = CHEST|GROIN|ARMS|HANDS
heat_protection = CHEST|GROIN|ARMS|HANDS
strip_delay = 70
+ burn_state = 0 //Burnable
/obj/item/clothing/suit/armor/vest/warden/alt
name = "warden's armored jacket"
@@ -112,7 +114,7 @@
desc = "An armored vest with a detective's badge on it."
icon_state = "detective-armor"
allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder)
-
+ burn_state = 0 //Burnable
//Reactive armor
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 1cf684ab76d..093b14d0a1f 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -8,6 +8,7 @@
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES
unacidable = 1
+ burn_state = -1 //Not Burnable
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
/obj/item/clothing/suit/bio_suit
@@ -27,6 +28,7 @@
strip_delay = 70
put_on_delay = 70
unacidable = 1
+ burn_state = -1 //Not Burnable
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm
index 7bad9b13400..1ae33b0de80 100644
--- a/code/modules/clothing/suits/jobs.dm
+++ b/code/modules/clothing/suits/jobs.dm
@@ -100,6 +100,7 @@
item_state = "hazard"
blood_overlay_type = "armor"
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,)
+ burn_state = -1 //Won't burn in fires
//Lawyer
/obj/item/clothing/suit/toggle/lawyer
diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm
index 08d0b4047d8..015e70defc7 100644
--- a/code/modules/clothing/suits/miscellaneous.dm
+++ b/code/modules/clothing/suits/miscellaneous.dm
@@ -16,6 +16,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/bluetag)
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/suit/redtag
name = "red laser tag armor"
@@ -25,6 +26,7 @@
blood_overlay_type = "armor"
body_parts_covered = CHEST
allowed = list (/obj/item/weapon/gun/energy/laser/redtag)
+ burn_state = -1 //Won't burn in fires
/*
* Costume
@@ -88,7 +90,7 @@
w_class = 3
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy)
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
-
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/suit/hastur
name = "\improper Hastur's robe"
@@ -236,7 +238,8 @@
desc = "Pompadour not included."
icon_state = "leatherjacket"
item_state = "hostrench"
-
+ burn_state = -1 //Not Burnable
+ max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT
/obj/item/clothing/suit/jacket/leather/overcoat
name = "leather overcoat"
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index a4d69048234..2236cf7f230 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -28,6 +28,7 @@
min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT
strip_delay = 60
put_on_delay = 60
+ burn_state = -1 //Not Burnable
/obj/item/clothing/suit/fire/firefighter
icon_state = "firesuit"
@@ -65,7 +66,7 @@
strip_delay = 70
put_on_delay = 70
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
-
+ burn_state = -1 //Not Burnable
/obj/item/clothing/suit/bomb_suit
name = "bomb suit"
@@ -86,7 +87,7 @@
min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT
strip_delay = 70
put_on_delay = 70
-
+ burn_state = -1 //Not Burnable
/obj/item/clothing/head/bomb_hood/security
@@ -111,7 +112,7 @@
strip_delay = 60
put_on_delay = 60
flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH
-
+ burn_state = -1 //Not Burnable
/obj/item/clothing/suit/radiation
name = "radiation suit"
@@ -129,3 +130,4 @@
strip_delay = 60
put_on_delay = 60
flags_inv = HIDEJUMPSUIT
+ burn_state = -1 //Not Burnable
\ No newline at end of file
diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm
index dd22a1e9f5c..299daf63152 100644
--- a/code/modules/clothing/suits/wiz_robe.dm
+++ b/code/modules/clothing/suits/wiz_robe.dm
@@ -8,6 +8,7 @@
strip_delay = 50
put_on_delay = 50
unacidable = 1
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/head/wizard/red
name = "red wizard hat"
@@ -63,7 +64,7 @@
strip_delay = 50
put_on_delay = 50
unacidable = 1
-
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/suit/wizrobe/red
name = "red wizard robe"
@@ -117,6 +118,7 @@
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
+ burn_state = 0 //Burnable
/obj/item/clothing/head/wizard/marisa/fake
name = "witch hat"
@@ -126,6 +128,7 @@
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
+ burn_state = 0 //Burnable
/obj/item/clothing/suit/wizrobe/marisa/fake
name = "witch robe"
@@ -136,3 +139,4 @@
permeability_coefficient = 1
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0)
unacidable = 0
+ burn_state = 0 //Burnable
\ No newline at end of file
diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm
index 20acefb09d6..f550d51edd5 100644
--- a/code/modules/clothing/under/chameleon.dm
+++ b/code/modules/clothing/under/chameleon.dm
@@ -9,6 +9,7 @@
origin_tech = "syndicate=3"
var/list/clothing_choices = list()
var/malfunctioning = 0
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/chameleon/New()
..()
diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm
index 84355443233..c5bc98a2cc1 100644
--- a/code/modules/clothing/under/color.dm
+++ b/code/modules/clothing/under/color.dm
@@ -16,6 +16,7 @@
icon_state = "black"
item_state = "bl_suit"
item_color = "black"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/color/grey
name = "grey jumpsuit"
diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm
index bdd52e6ba23..57709b5bdfe 100644
--- a/code/modules/clothing/under/jobs/engineering.dm
+++ b/code/modules/clothing/under/jobs/engineering.dm
@@ -6,6 +6,7 @@
item_state = "gy_suit"
item_color = "chief"
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10)
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/rank/atmospheric_technician
desc = "It's a jumpsuit worn by atmospheric technicians."
@@ -13,6 +14,7 @@
icon_state = "atmos"
item_state = "atmos_suit"
item_color = "atmos"
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/rank/engineer
desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding."
diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm
index 42dae95f077..6d19ef1244f 100644
--- a/code/modules/clothing/under/miscellaneous.dm
+++ b/code/modules/clothing/under/miscellaneous.dm
@@ -37,6 +37,7 @@
item_state = "armor"
can_adjust = 0
strip_delay = 100
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/waiter
name = "waiter's outfit"
@@ -115,6 +116,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = 0
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/acj
name = "administrative cybernetic jumpsuit"
@@ -131,6 +133,7 @@
heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT
can_adjust = 0
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/owl
name = "owl uniform"
@@ -338,6 +341,7 @@
body_parts_covered = CHEST|GROIN|ARMS
fitted = NO_FEMALE_UNIFORM
can_adjust = 0
+ burn_state = -1 //Won't burn in fires
/obj/item/clothing/under/sundress
name = "sundress"
diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm
index 1dda5f2ebd2..e828b3fe049 100644
--- a/code/modules/clothing/under/ties.dm
+++ b/code/modules/clothing/under/ties.dm
@@ -84,6 +84,7 @@
desc = "A bronze medal."
icon_state = "bronze"
item_color = "bronze"
+ burn_state = -1 //Won't burn in fires
//Pinning medals on people
/obj/item/clothing/tie/medal/attack(mob/living/carbon/human/M, mob/living/user)
diff --git a/code/modules/events/vent_clog.dm b/code/modules/events/vent_clog.dm
index 7703be7fc73..6a9fcf140e5 100644
--- a/code/modules/events/vent_clog.dm
+++ b/code/modules/events/vent_clog.dm
@@ -33,7 +33,7 @@
R.my_atom = vent
R.add_reagent(pick(gunk), 50)
- var/datum/effect/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/chem/smoke = new
smoke.set_up(R, rand(1, 2), 0, vent, 0, silent = 1)
playsound(vent.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm
index c057de5b96e..e38777f8ee7 100644
--- a/code/modules/events/wizard/curseditems.dm
+++ b/code/modules/events/wizard/curseditems.dm
@@ -43,6 +43,6 @@
I.name = "cursed " + I.name
for(var/mob/living/carbon/human/H in living_mob_list)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(max(1,1), 0, H.loc)
smoke.start()
\ No newline at end of file
diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm
index 5d3567a9d47..cda6dc2d41f 100644
--- a/code/modules/events/wizard/imposter.dm
+++ b/code/modules/events/wizard/imposter.dm
@@ -14,7 +14,7 @@
if(!candidates) return //Sad Trombone
var/client/C = pick(candidates)
- PoolOrNew(/obj/effect/effect/harmless_smoke, W.loc)
+ PoolOrNew(/obj/effect/effect/smoke, W.loc)
var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc)
I.real_name = W.real_name
diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm
index 4315f3a4261..df271b96ef1 100644
--- a/code/modules/events/wizard/shuffle.dm
+++ b/code/modules/events/wizard/shuffle.dm
@@ -28,7 +28,7 @@
moblocs.len -= 1
for(var/mob/living/carbon/human/H in living_mob_list)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(max(1,1), 0, H.loc)
smoke.start()
@@ -60,7 +60,7 @@
mobnames.len -= 1
for(var/mob/living/carbon/human/H in living_mob_list)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(max(1,1), 0, H.loc)
smoke.start()
@@ -92,6 +92,6 @@
mobs -= mobs[mobs.len]
for(var/mob/living/carbon/human/H in living_mob_list)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(max(1,1), 0, H.loc)
smoke.start()
diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm
index 1f07766a523..e510ce8ac5e 100644
--- a/code/modules/food&drinks/drinks/drinks.dm
+++ b/code/modules/food&drinks/drinks/drinks.dm
@@ -10,6 +10,7 @@
var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it.
possible_transfer_amounts = list(5,10,25)
volume = 50
+ burn_state = -1
/obj/item/weapon/reagent_containers/food/drinks/New()
..()
@@ -34,24 +35,19 @@
if(M == user)
M << "You swallow a gulp of [src]."
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(5)
- reagents.trans_to(M, gulp_size)
+ else
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
- return 1
-
- user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].")
- if(!do_mob(user, M)) return
- if(!reagents.total_volume) return // The drink might be empty after the delay, such as by spam-feeding
- user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].")
- add_logs(user, M, "fed", object="[reagentlist(src)]")
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(5)
- reagents.trans_to(M, gulp_size)
+ user.visible_message("[user] attempts to feed [src] to [M].", "You attempt to feed [src] to [M].")
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return // The drink might be empty after the delay, such as by spam-feeding
+ user.visible_message("[user] feeds [src] to [M].", "You feed [src] to [M].")
+ add_logs(user, M, "fed", object="[reagentlist(src)]")
+ var/fraction = min(gulp_size/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ reagents.trans_to(M, gulp_size)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
index 911362474c1..d145ef39fb3 100644
--- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
+++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm
@@ -6,6 +6,20 @@
icon_state = "glass_empty"
amount_per_transfer_from_this = 10
volume = 50
+ burn_state = 0 //Burnable
+ burntime = 5
+
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fire_act()
+ if(!reagents.total_volume)
+ return
+ ..()
+
+/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/burn()
+ reagents.total_volume = 0 //Burns away all the alcohol :(
+ reagents.reagent_list.Cut()
+ on_reagent_change()
+ extinguish()
+ return
/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change()
overlays.Cut()
diff --git a/code/modules/food&drinks/food.dm b/code/modules/food&drinks/food.dm
index 20f54c684eb..5a7dbde5102 100644
--- a/code/modules/food&drinks/food.dm
+++ b/code/modules/food&drinks/food.dm
@@ -4,6 +4,7 @@
/obj/item/weapon/reagent_containers/food
possible_transfer_amounts = null
volume = 50 //Sets the default container amount for all food items.
+ burn_state = 0 //Burnable
/obj/item/weapon/reagent_containers/food/New()
..()
diff --git a/code/modules/food&drinks/food/condiment.dm b/code/modules/food&drinks/food/condiment.dm
index bff39b0e262..a20b7e078cd 100644
--- a/code/modules/food&drinks/food/condiment.dm
+++ b/code/modules/food&drinks/food/condiment.dm
@@ -30,9 +30,8 @@
return
/obj/item/weapon/reagent_containers/food/condiment/attack(mob/M as mob, mob/user as mob, def_zone)
- var/datum/reagents/R = src.reagents
- if(!R || !R.total_volume)
+ if(!reagents || !reagents.total_volume)
user << "None of [src] left, oh no!"
return 0
@@ -41,28 +40,20 @@
if(M == user)
M << "You swallow some of contents of \the [src]."
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(5)
- reagents.trans_to(M, 10)
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
- return 1
-
else
user.visible_message("[user] attempts to feed [M] from [src].")
- if(!do_mob(user, M)) return
+ if(!do_mob(user, M))
+ return
+ if(!reagents || !reagents.total_volume)
+ return // The condiment might be empty after the delay.
user.visible_message("[user] feeds [M] from [src].")
-
add_logs(user, M, "fed", object="[reagentlist(src)]")
- if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(5)
- reagents.trans_to(M, 10)
-
- playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
- return 1
- return 0
+ var/fraction = min(10/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ reagents.trans_to(M, 10)
+ playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
+ return 1
/obj/item/weapon/reagent_containers/food/condiment/afterattack(obj/target, mob/user , proximity)
if(!proximity) return
diff --git a/code/modules/food&drinks/food/snacks.dm b/code/modules/food&drinks/food/snacks.dm
index 919e6e0a62b..7f8d06dd703 100644
--- a/code/modules/food&drinks/food/snacks.dm
+++ b/code/modules/food&drinks/food/snacks.dm
@@ -105,14 +105,11 @@
M.satiety -= junkiness
playsound(M.loc,'sound/items/eatfood.ogg', rand(10,50), 1)
if(reagents.total_volume)
- reagents.reaction(M, INGEST)
- spawn(5)
- if(reagents.total_volume > bitesize) //pretty sure this is unnecessary
- reagents.trans_to(M, bitesize)
- else
- reagents.trans_to(M, reagents.total_volume)
- bitecount++
- On_Consume()
+ var/fraction = min(bitesize/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
+ reagents.trans_to(M, bitesize)
+ bitecount++
+ On_Consume()
return 1
return 0
diff --git a/code/modules/hydroponics/biogenerator.dm b/code/modules/hydroponics/biogenerator.dm
index ba32bb2c6ff..bec34b1c197 100644
--- a/code/modules/hydroponics/biogenerator.dm
+++ b/code/modules/hydroponics/biogenerator.dm
@@ -169,6 +169,7 @@
dat += "Shoulder holster: Make ([400/efficiency])
"
dat += "Leather Satchel: Make ([400/efficiency])
"
dat += "Leather Jacket: Make ([500/efficiency])
"
+ dat += "Leather Overcoat: Make ([1000/efficiency])
"
dat += ""
else
dat += "No container inside, please insert container.
"
@@ -301,6 +302,9 @@
if("jacket")
if (check_cost(500/efficiency)) return 0
else new/obj/item/clothing/suit/jacket/leather(src.loc)
+ if("overcoat")
+ if (check_cost(1000/efficiency)) return 0
+ else new/obj/item/clothing/suit/jacket/leather/overcoat(src.loc)
//if("monkey")
// if (check_cost(500)) return 0
// else new/mob/living/carbon/monkey(src.loc)
diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm
index 38c9be4e471..8fe33dc7e58 100644
--- a/code/modules/hydroponics/grown.dm
+++ b/code/modules/hydroponics/grown.dm
@@ -20,6 +20,7 @@
icon = 'icons/obj/hydroponics/harvest.dmi'
potency = -1
dried_type = -1 //bit different. saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition.
+ burn_state = 0 //Burnable
/obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, new_potency = 50)
..()
diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm
index 07ee7c17a2e..f0ca0943691 100644
--- a/code/modules/hydroponics/growninedible.dm
+++ b/code/modules/hydroponics/growninedible.dm
@@ -5,6 +5,7 @@
/obj/item/weapon/grown // Grown weapons
name = "grown_weapon"
icon = 'icons/obj/hydroponics/harvest.dmi'
+ burn_state = 0 //Burnable
var/seed = null
var/plantname = ""
var/product //a type path
diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm
index 0e491e575bf..662f76cb686 100644
--- a/code/modules/hydroponics/seeds.dm
+++ b/code/modules/hydroponics/seeds.dm
@@ -7,6 +7,7 @@
icon = 'icons/obj/hydroponics/seeds.dmi'
icon_state = "seed" //Unknown plant seed - these shouldn't exist in-game.
w_class = 1 //Pocketable.
+ burn_state = 0 //Burnable
var/plantname = "Plants" //Name of plant when planted.
var/product //A type path. The thing that is created when the plant is harvested.
var/species = "" //Used to update icons. Should match the name in the sprites.
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index c3e1af939be..96dc3f1b9a1 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -17,6 +17,8 @@
anchored = 0
density = 1
opacity = 0
+ burn_state = 0 //Burnable
+ burntime = 30
var/state = 0
var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/book) //Things allowed in the bookcase
@@ -165,6 +167,7 @@
throw_range = 5
w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever)
attack_verb = list("bashed", "whacked", "educated")
+ burn_state = 0 //Burnable
var/dat //Actual page content
var/due_date = 0 //Game time in 1/10th seconds
var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index 3ba4b0cdea6..80fb5aa07b9 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -9,6 +9,26 @@
/**********************Miner Lockers**************************/
+/obj/structure/closet/wardrobe/miner
+ name = "mining wardrobe"
+ icon_door = "mixed"
+
+/obj/structure/closet/wardrobe/miner/New()
+ ..()
+ contents = list()
+ new /obj/item/weapon/storage/backpack/dufflebag/engineering(src)
+ new /obj/item/weapon/storage/backpack/industrial(src)
+ new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/under/rank/miner(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/shoes/sneakers/black(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+ new /obj/item/clothing/gloves/fingerless(src)
+
/obj/structure/closet/secure_closet/miner
name = "miner's equipment"
icon_state = "mining"
@@ -16,14 +36,7 @@
/obj/structure/closet/secure_closet/miner/New()
..()
- if(prob(50))
- new /obj/item/weapon/storage/backpack/industrial(src)
- else
- new /obj/item/weapon/storage/backpack/satchel_eng(src)
new /obj/item/device/radio/headset/headset_cargo(src)
- new /obj/item/clothing/under/rank/miner(src)
- new /obj/item/clothing/gloves/fingerless(src)
- new /obj/item/clothing/shoes/sneakers/black(src)
new /obj/item/device/mining_scanner(src)
new /obj/item/weapon/storage/bag/ore(src)
new /obj/item/weapon/shovel(src)
diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm
index e9befa30d43..a8eefeb5bfc 100644
--- a/code/modules/mining/money_bag.dm
+++ b/code/modules/mining/money_bag.dm
@@ -8,6 +8,8 @@
force = 10.0
throwforce = 0
w_class = 4.0
+ burn_state = 0 //Burnable
+ burntime = 20
/obj/item/weapon/moneybag/attack_hand(user as mob)
var/amt_gold = 0
diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
index 02b856d2356..558604dad94 100644
--- a/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
+++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid.dm
@@ -146,3 +146,6 @@
/mob/living/carbon/alien/humanoid/check_ear_prot()
return 1
+
+/mob/living/carbon/alien/carbon/alien/humanoid/get_permeability_protection()
+ return 0.8
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index ca9468d1986..b99a78d7e9e 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -116,17 +116,17 @@
gib()
return
else
+ shred_clothing(1,150)
var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src)))
throw_at(target, 200, 4)
- //return
-// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src)))
- //user.throw_at(target, 200, 4)
if (2.0)
b_loss += 60
f_loss += 60
+ shred_clothing(1,50)
+
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/1.5
f_loss = f_loss/1.5
@@ -140,6 +140,8 @@
b_loss += 30
if (prob(getarmor(null, "bomb")))
b_loss = b_loss/2
+ else
+ shred_clothing(1,10)
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(15,60)
if (prob(50))
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index b6cb6f5181b..df2c627615c 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -10,9 +10,10 @@
total_brute += O.brute_dam
total_burn += O.burn_dam
health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute
- //TODO: fix husking
if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD )
ChangeToHusk()
+ if(bodytemperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST)
+ shred_clothing()
med_hud_set_health()
med_hud_set_status()
return
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index b46faf97501..c51953a96ec 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -239,6 +239,9 @@ emp_act
/mob/living/carbon/human/acid_act(var/acidpwr, var/toxpwr, var/acid_volume)
var/list/damaged = list()
var/list/inventory_items_to_kill = list()
+ var/acidity = min(acidpwr*acid_volume/200, toxpwr)
+ var/acid_volume_left = acid_volume
+ var/acid_decay = 100/acidpwr // how much volume we lose per item we try to melt. 5 for fluoro, 10 for sulphuric
//HEAD//
var/obj/item/clothing/head_clothes = null
@@ -250,7 +253,8 @@ emp_act
head_clothes = head
if(head_clothes)
if(!head_clothes.unacidable)
- head_clothes.acid_act(acidpwr)
+ head_clothes.acid_act(acidpwr, acid_volume_left)
+ acid_volume_left = max(acid_volume_left - acid_decay, 0) //We remove some of the acid volume.
update_inv_glasses()
update_inv_wear_mask()
update_inv_head()
@@ -271,7 +275,8 @@ emp_act
chest_clothes = wear_suit
if(chest_clothes)
if(!chest_clothes.unacidable)
- chest_clothes.acid_act(acidpwr)
+ chest_clothes.acid_act(acidpwr, acid_volume_left)
+ acid_volume_left = max(acid_volume_left - acid_decay, 0)
update_inv_w_uniform()
update_inv_wear_suit()
else
@@ -300,7 +305,8 @@ emp_act
arm_clothes = wear_suit
if(arm_clothes)
if(!arm_clothes.unacidable)
- arm_clothes.acid_act(acidpwr)
+ arm_clothes.acid_act(acidpwr, acid_volume_left)
+ acid_volume_left = max(acid_volume_left - acid_decay, 0)
update_inv_gloves()
update_inv_w_uniform()
update_inv_wear_suit()
@@ -325,7 +331,8 @@ emp_act
leg_clothes = wear_suit
if(leg_clothes)
if(!leg_clothes.unacidable)
- leg_clothes.acid_act(acidpwr)
+ leg_clothes.acid_act(acidpwr, acid_volume_left)
+ acid_volume_left = max(acid_volume_left - acid_decay, 0)
update_inv_shoes()
update_inv_w_uniform()
update_inv_wear_suit()
@@ -342,11 +349,11 @@ emp_act
//DAMAGE//
for(var/obj/item/organ/limb/affecting in damaged)
- affecting.take_damage(2*toxpwr, toxpwr)
+ affecting.take_damage(acidity, 2*acidity)
if(affecting.name == "head")
- affecting.take_damage(2*toxpwr, toxpwr)
- if(prob(2*acidpwr)) //Applies disfigurement
+ if(prob(min(acidpwr*acid_volume/10, 90))) //Applies disfigurement
+ affecting.take_damage(acidity, 2*acidity)
emote("scream")
facial_hair_style = "Shaved"
hair_style = "Bald"
@@ -367,7 +374,8 @@ emp_act
inventory_items_to_kill += l_hand
for(var/obj/item/I in inventory_items_to_kill)
- I.acid_act(acidpwr)
+ I.acid_act(acidpwr, acid_volume_left)
+ acid_volume_left = max(acid_volume_left - acid_decay, 0)
/mob/living/carbon/human/grabbedby(mob/living/user)
if(w_uniform)
diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm
index 8d08b29ecb2..e163fb158e0 100644
--- a/code/modules/mob/living/carbon/human/human_helpers.dm
+++ b/code/modules/mob/living/carbon/human/human_helpers.dm
@@ -139,10 +139,30 @@
/mob/living/carbon/human/can_track(mob/living/user)
if(wear_id && istype(wear_id.GetID(), /obj/item/weapon/card/id/syndicate))
- return 0
+ return 0
if(istype(head, /obj/item/clothing/head))
var/obj/item/clothing/head/hat = head
if(hat.blockTracking)
return 0
-
+
return ..()
+
+/mob/living/carbon/human/get_permeability_protection()
+ var/list/prot = list("hands"=0, "chest"=0, "groin"=0, "legs"=0, "feet"=0, "arms"=0, "head"=0)
+ for(var/obj/item/I in get_equipped_items())
+ if(I.body_parts_covered & HANDS)
+ prot["hands"] = max(1 - I.permeability_coefficient, prot["hands"])
+ if(I.body_parts_covered & CHEST)
+ prot["chest"] = max(1 - I.permeability_coefficient, prot["chest"])
+ if(I.body_parts_covered & GROIN)
+ prot["groin"] = max(1 - I.permeability_coefficient, prot["groin"])
+ if(I.body_parts_covered & LEGS)
+ prot["legs"] = max(1 - I.permeability_coefficient, prot["legs"])
+ if(I.body_parts_covered & FEET)
+ prot["feet"] = max(1 - I.permeability_coefficient, prot["feet"])
+ if(I.body_parts_covered & ARMS)
+ prot["arms"] = max(1 - I.permeability_coefficient, prot["arms"])
+ if(I.body_parts_covered & HEAD)
+ prot["head"] = max(1 - I.permeability_coefficient, prot["head"])
+ var/protection = (prot["head"] + prot["arms"] + prot["feet"] + prot["legs"] + prot["groin"] + prot["chest"] + prot["hands"])/7
+ return protection
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index 1a4cd41351c..a4c1a29a2aa 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -390,3 +390,83 @@
src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!"
return
+//Cycles through all clothing slots and tests them for destruction
+/mob/living/carbon/human/proc/shred_clothing(var/bomb,var/shock)
+ var/covered_parts //The body parts that are protected by exterior clothing/armor
+ var/head_absorbed = 0 //How much of the shock the headgear absorbs when it is shredded. -1=it survives
+ var/suit_absorbed = 0 //How much of the shock the exosuit absorbs when it is shredded. -1=it survives
+
+ //Backpacks can never be protected but are annoying as fuck to lose, so they get a lower chance to be shredded
+ if(back)
+ back.shred(bomb,shock-30,src)
+
+ if(head)
+ covered_parts |= head.flags_inv
+ head_absorbed = head.shred(bomb,shock,src)
+ if(wear_mask)
+ var/absorbed = ((covered_parts & HIDEMASK) ? head_absorbed : 0) //Check if clothing covering this part absorbed any of the shock
+ if(!(absorbed < 0))
+ //Masks can be used to shield other parts, but are simplified to simply add their absorbsion to the head armor if it covers the face
+ var/mask_absorbed = wear_mask.shred(bomb,shock-absorbed,src)
+ if(wear_mask.flags_inv & HIDEFACE)
+ covered_parts |= wear_mask.flags_inv
+ if(mask_absorbed < 0) //If the mask didn't get shredded, everything else on the head is protected
+ head_absorbed = -1
+ else
+ head_absorbed += mask_absorbed
+ if(ears)
+ var/absorbed = ((covered_parts & HIDEEARS) ? head_absorbed : 0)
+ if(!(absorbed < 0))
+ ears.shred(bomb,shock-absorbed,src)
+ if(glasses)
+ var/absorbed = ((covered_parts & HIDEEYES) ? head_absorbed : 0)
+ if(!(absorbed < 0))
+ glasses.shred(bomb,shock-absorbed,src)
+
+ if(wear_suit)
+ covered_parts |= wear_suit.flags_inv
+ suit_absorbed = wear_suit.shred(bomb,shock,src)
+ if(gloves)
+ var/absorbed = ((covered_parts & HIDEGLOVES) ? suit_absorbed : 0)
+ if(!(absorbed < 0))
+ gloves.shred(bomb,shock-absorbed,src)
+ if(shoes)
+ var/absorbed = ((covered_parts & HIDESHOES) ? suit_absorbed : 0)
+ if(!(absorbed < 0))
+ shoes.shred(bomb,shock-absorbed,src)
+ if(w_uniform)
+ var/absorbed = ((covered_parts & HIDEJUMPSUIT) ? suit_absorbed : 0)
+ if(!(absorbed < 0))
+ w_uniform.shred(bomb,shock-absorbed,src)
+
+/obj/item/proc/shred(var/bomb,var/shock,var/mob/living/carbon/human/Human)
+ var/shredded
+
+ if(!bomb)
+ if(burn_state != -1)
+ shredded = 1 //No heat protection, it burns
+ else
+ shredded = -1 //Heat protection = Fireproof
+
+ else if(shock > 0)
+ if(prob(min(90,max(10,shock))))
+ shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount
+ else
+ shredded = -1 //It survives explosion
+
+ if(shredded > 0)
+ if(Human) //Unequip if equipped
+ Human.unEquip(src)
+
+ if(bomb)
+ for(var/obj/item/Item in contents) //Empty out the contents
+ Item.loc = src.loc
+ spawn(1) //so the shreds aren't instantly deleted by the explosion
+ var/obj/effect/decal/cleanable/shreds/Shreds = new(loc)
+ Shreds.name = "shredded [src.name]"
+ Shreds.desc = "The sad remains of what used to be a glorious [src.name]."
+ qdel(src)
+ else
+ burn()
+
+ return shredded
\ No newline at end of file
diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm
index 67caa33abac..df7579f5190 100644
--- a/code/modules/mob/living/carbon/human/species.dm
+++ b/code/modules/mob/living/carbon/human/species.dm
@@ -738,7 +738,7 @@
if(P.allow_thrust(0.01, H))
hasjetpack = 1
- mspeed = 1 - hasjetpack
+ mspeed = -1 - hasjetpack
if(grav || !hasjetpack)
var/health_deficiency = (100 - H.health + H.staminaloss)
@@ -763,11 +763,12 @@
mspeed += speedmod
- if(H.status_flags & GOTTAGOFAST)
- mspeed -= 1
+ if(grav)
+ if(H.status_flags & GOTTAGOFAST)
+ mspeed -= 1
- if(H.status_flags & GOTTAGOREALLYFAST)
- mspeed -= 2
+ if(H.status_flags & GOTTAGOREALLYFAST)
+ mspeed -= 2
return mspeed
@@ -1101,13 +1102,13 @@
// Handle chem smoke effect -- Doohl
if(!H.has_smoke_protection())
- for(var/obj/effect/effect/chem_smoke/smoke in view(1, H))
- if(smoke.reagents.total_volume)
- smoke.reagents.reaction(H, INGEST)
- spawn(5)
- if(smoke)
- smoke.reagents.copy_to(H, 10) // I dunno, maybe the reagents enter the blood stream through the lungs?
- break // If they breathe in the nasty stuff once, no need to continue checking
+ for(var/obj/effect/effect/smoke/chem/S in range(1, H))
+ if(S.reagents.total_volume && S.lifetime)
+ var/fraction = 1/S.max_lifetime
+ S.reagents.reaction(H,INGEST, fraction)
+ var/amount = round(S.reagents.total_volume*fraction,0.1)
+ S.reagents.copy_to(H, amount)
+ S.lifetime--
else //Still give containing object the chance to interact
if(istype(H.loc, /obj/))
diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm
index 9ac7837148a..b019a52ab44 100644
--- a/code/modules/mob/living/carbon/life.dm
+++ b/code/modules/mob/living/carbon/life.dm
@@ -71,13 +71,13 @@
//Harmful gasses
if(!has_smoke_protection())
- for(var/obj/effect/effect/chem_smoke/smoke in view(1,src))
- if(smoke.reagents.total_volume)
- smoke.reagents.reaction(src,INGEST)
- spawn(5)
- if(smoke)
- smoke.reagents.copy_to(src, 10)
- break
+ for(var/obj/effect/effect/smoke/chem/S in range(1, src))
+ if(S.reagents.total_volume && S.lifetime)
+ var/fraction = 1/S.max_lifetime
+ S.reagents.reaction(src,INGEST, fraction)
+ var/amount = round(S.reagents.total_volume*fraction,0.1)
+ S.reagents.copy_to(src, amount)
+ S.lifetime--
else //Breathe from loc as obj again
if(istype(loc, /obj/))
diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm
index a7c821c9493..394a92d9437 100644
--- a/code/modules/mob/living/carbon/monkey/monkey.dm
+++ b/code/modules/mob/living/carbon/monkey/monkey.dm
@@ -255,7 +255,7 @@
src << "Your mask protects you from the acid."
return
- take_organ_damage(min(6*toxpwr, acid_volume * toxpwr))
+ take_organ_damage(min(6*toxpwr, acid_volume * acidpwr/10))
/mob/living/carbon/monkey/help_shake_act(mob/living/carbon/M)
if(health < 0 && ishuman(M))
@@ -263,3 +263,12 @@
H.do_cpr(src)
else
..()
+
+/mob/living/carbon/monkey/get_permeability_protection()
+ var/protection = 0
+ if(head)
+ protection = 1 - head.permeability_coefficient
+ if(wear_mask)
+ protection = max(1 - wear_mask.permeability_coefficient, protection)
+ protection = protection/7 //the rest of the body isn't covered.
+ return protection
\ No newline at end of file
diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm
index bc689b62098..3ab80a622bb 100644
--- a/code/modules/mob/living/living.dm
+++ b/code/modules/mob/living/living.dm
@@ -861,3 +861,7 @@ Sorry Giacom. Please don't be mad :(
return 0
return 1
+
+//used in datum/reagents/reaction() proc
+/mob/living/proc/get_permeability_protection()
+ return 0
diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm
index 6509db4ac67..b48f2f21e14 100644
--- a/code/modules/mob/living/living_defines.dm
+++ b/code/modules/mob/living/living_defines.dm
@@ -43,4 +43,6 @@
var/list/datum/action/actions = list()
var/list/pipes_shown = list()
- var/last_played_vent
\ No newline at end of file
+ var/last_played_vent
+
+ var/smoke_delay = 0 //used to prevent spam with smoke reagent reaction on mob.
\ No newline at end of file
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index 8cace44236d..59e6475286e 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -101,8 +101,6 @@
emag.reagents.add_reagent("facid", 250)
emag.name = "Fluacid spray"
- var/obj/item/weapon/reagent_containers/spray/S = emag
- S.banned_reagents = list()
var/datum/robot_energy_storage/gauze/gauzestore = new /datum/robot_energy_storage/gauze(src)
diff --git a/code/modules/mob/living/simple_animal/slime/powers.dm b/code/modules/mob/living/simple_animal/slime/powers.dm
index e2b541d9c53..a2da3fb63d6 100644
--- a/code/modules/mob/living/simple_animal/slime/powers.dm
+++ b/code/modules/mob/living/simple_animal/slime/powers.dm
@@ -182,7 +182,9 @@
var/new_powerlevel = round(powerlevel / 4)
for(var/i=1,i<=4,i++)
var/mob/living/simple_animal/slime/M = new /mob/living/simple_animal/slime/(loc)
- if(prob(mutation_chance))
+ if(mutation_chance >= 100)
+ M.colour = "rainbow"
+ else if(prob(mutation_chance))
M.colour = slime_mutation[rand(1,4)]
else
M.colour = colour
diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm
index c9883f02afe..265a428ba71 100644
--- a/code/modules/mob/mob_defines.dm
+++ b/code/modules/mob/mob_defines.dm
@@ -100,8 +100,6 @@
var/in_throw_mode = 0
- var/coughedtime = null
-
var/music_lastplayed = "null"
var/job = null//Living
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
index d6dc568105f..94740bd0e1e 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_adrenaline.dm
@@ -18,7 +18,7 @@
spawn(30)//Slight delay so the enemy does not immedietly know the ability was used. Due to lag, this often came before waking up.
H.say(pick("A CORNERED FOX IS MORE DANGEROUS THAN A JACKAL!","HURT ME MOOORRREEE!","IMPRESSIVE!"))
spawn(70)
- reagents.reaction(H, 2)
+ reagents.reaction(H, INGEST)
reagents.trans_id_to(H, "radium", a_transfer)
H << "You are beginning to feel the after-effect of the injection."
a_boost--
diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
index aef3d012dd8..c89a3b11f92 100644
--- a/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
+++ b/code/modules/ninja/suit/n_suit_verbs/ninja_smoke.dm
@@ -9,7 +9,7 @@
if(!ninjacost(0,N_SMOKE_BOMB))
var/mob/living/carbon/human/H = affecting
- var/datum/effect/effect/system/bad_smoke_spread/smoke = new /datum/effect/effect/system/bad_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/bad/smoke = new
smoke.set_up(10, 0, H.loc)
smoke.start()
playsound(H.loc, 'sound/effects/bamf.ogg', 50, 2)
diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm
index 8ae11c8f83c..46ddcd420fd 100644
--- a/code/modules/paperwork/clipboard.dm
+++ b/code/modules/paperwork/clipboard.dm
@@ -10,7 +10,7 @@
var/obj/item/weapon/pen/haspen //The stored pen.
var/obj/item/weapon/paper/toppaper //The topmost piece of paper.
slot_flags = SLOT_BELT
-
+ burn_state = 0 //Burnable
/obj/item/weapon/clipboard/New()
update_icon()
diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm
index 6f725e04187..1e632fa976a 100644
--- a/code/modules/paperwork/folders.dm
+++ b/code/modules/paperwork/folders.dm
@@ -5,6 +5,7 @@
icon_state = "folder"
w_class = 2
pressure_resistance = 2
+ burn_state = 0 //Burnable
/obj/item/weapon/folder/blue
desc = "A blue folder."
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index df5d9101500..411f5de8522 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -18,6 +18,8 @@
pressure_resistance = 0
slot_flags = SLOT_HEAD
body_parts_covered = HEAD
+ burn_state = 0 //Burnable
+ burntime = 5
var/info //What's actually written on the paper.
var/info_links //A different version of the paper which includes html links at fields and EOF
@@ -26,7 +28,6 @@
var/list/stamped
var/rigged = 0
var/spam_flag = 0
- var/burning = 0 //Whether or not the paper is on fire
/obj/item/weapon/paper/New()
@@ -39,6 +40,9 @@
/obj/item/weapon/paper/update_icon()
+ if(burn_state == 1)
+ icon_state = "paper_onfire"
+ return
if(info)
icon_state = "paper_words"
return
@@ -89,15 +93,6 @@
spam_flag = 0
-/obj/item/weapon/paper/attack_hand()
- var/mob/living/carbon/M = usr
- if(burning)
- M << "Picking up a burning paper seems awfully stupid."
- return //Doesn't make any sense to pick up a burning paper
- else //Probably isn't necessary but it's safer
- ..()
-
-
/obj/item/weapon/paper/attack_ai(mob/living/silicon/ai/user)
var/dist
if(istype(user) && user.current) //is AI
@@ -278,7 +273,7 @@
/obj/item/weapon/paper/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params)
..()
- if(burning)
+ if(burn_state == 1)
return
if(is_blind(user))
@@ -325,27 +320,21 @@
user.unEquip(src)
user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!")
- burn(0, 100)
+ fire_act()
add_fingerprint(user)
/obj/item/weapon/paper/fire_act()
- burn(1, 50)
-
-/obj/item/weapon/paper/proc/burn(var/showmsg, var/burntime)
- if (burning)
- return
- if(showmsg)
- src.visible_message("[src] catches on fire.")
- burning = 1
+ ..(0)
icon_state = "paper_onfire"
info = "[stars(info)]"
- spawn(burntime) //7 seconds
- src.visible_message("[src] burns away, leaving behind a pile of ashes.")
- new /obj/effect/decal/cleanable/ash(src.loc)
- qdel(src)
+
+
+/obj/item/weapon/paper/extinguish()
+ ..()
+ update_icon()
/*
* Premade paper
diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm
index dd672a6d11c..568680b5d45 100644
--- a/code/modules/paperwork/paperbin.dm
+++ b/code/modules/paperwork/paperbin.dm
@@ -8,9 +8,20 @@
throw_speed = 3
throw_range = 7
pressure_resistance = 8
+ burn_state = 0 //Burnable
var/amount = 30 //How much paper is in the bin.
var/list/papers = new/list() //List of papers put in the bin for reference.
+/obj/item/weapon/paper_bin/fire_act()
+ if(!amount)
+ return
+ ..()
+
+/obj/item/weapon/paper_bin/burn()
+ amount = 0
+ extinguish()
+ update_icon()
+ return
/obj/item/weapon/paper_bin/MouseDrop(atom/over_object)
var/mob/M = usr
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index 0832ab226f3..d8312036260 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -17,7 +17,7 @@
icon_state = "film"
item_state = "electropack"
w_class = 1.0
-
+ burn_state = 0 //Burnable
/*
* Photo
@@ -28,6 +28,8 @@
icon_state = "photo"
item_state = "paper"
w_class = 1.0
+ burn_state = 0 //Burnable
+ burntime = 5
var/icon/img //Big photo image
var/scribble //Scribble on the back.
var/blueprints = 0 //Does it include the blueprints?
@@ -92,7 +94,7 @@
icon_state = "album"
item_state = "briefcase"
can_hold = list(/obj/item/weapon/photo)
-
+ burn_state = 0 //Burnable
/*
* Camera
diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm
index 51f6b311a84..a23baaa84f0 100644
--- a/code/modules/power/apc.dm
+++ b/code/modules/power/apc.dm
@@ -937,11 +937,11 @@
cell.corrupt()
src.malfhack = 1
update_icon()
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(3, 0, src.loc)
smoke.attach(src)
smoke.start()
- var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
+ var/datum/effect/effect/system/spark_spread/s = new
s.set_up(3, 1, src)
s.start()
visible_message("The [src.name] suddenly lets out a blast of smoke and some sparks!", \
diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm
index 96a08d99e4d..607be1ba324 100644
--- a/code/modules/power/singularity/narsie.dm
+++ b/code/modules/power/singularity/narsie.dm
@@ -42,7 +42,7 @@
user << "Your soul is too far away."
return
makeNewConstruct(/mob/living/simple_animal/construct/harvester, user, null, 1)
- PoolOrNew(/obj/effect/effect/sleep_smoke, user.loc)
+ PoolOrNew(/obj/effect/effect/smoke/sleeping, user.loc)
/obj/singularity/narsie/process()
diff --git a/code/modules/projectiles/guns/magic/wand.dm b/code/modules/projectiles/guns/magic/wand.dm
index 461af979728..55f9ff2849f 100644
--- a/code/modules/projectiles/guns/magic/wand.dm
+++ b/code/modules/projectiles/guns/magic/wand.dm
@@ -123,7 +123,7 @@
/obj/item/weapon/gun/magic/wand/teleport/zap_self(mob/living/user as mob)
do_teleport(user, user, 10)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(10, 0, user.loc)
smoke.start()
charges--
diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm
index efc20cedfd7..ec2bbcdae6c 100644
--- a/code/modules/projectiles/projectile/magic.dm
+++ b/code/modules/projectiles/projectile/magic.dm
@@ -83,7 +83,7 @@
if(!stuff.anchored && stuff.loc)
teleammount++
do_teleport(stuff, stuff, 10)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread()
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(max(round(10 - teleammount),1), 0, stuff.loc) //Smoke drops off if a lot of stuff is moved for the sake of sanity
smoke.start()
diff --git a/code/modules/reagents/Chemistry-Holder.dm b/code/modules/reagents/Chemistry-Holder.dm
index 94e40614ab8..0978a34f58f 100644
--- a/code/modules/reagents/Chemistry-Holder.dm
+++ b/code/modules/reagents/Chemistry-Holder.dm
@@ -124,7 +124,7 @@ var/const/INGEST = 2
var/current_reagent_transfer = current_reagent.volume * part
if(preserve_data)
trans_data = copy_data(current_reagent)
- R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp)
+ R.add_reagent(current_reagent.id, (current_reagent_transfer * multiplier), trans_data, src.chem_temp, no_react = 1) //we only handle reaction after every reagent has been transfered.
src.remove_reagent(current_reagent.id, current_reagent_transfer)
src.update_total()
@@ -426,17 +426,21 @@ var/const/INGEST = 2
return 0
/datum/reagents/proc/reaction(var/atom/A, var/method=TOUCH, var/volume_modifier=1,var/show_message=1)
- for(var/datum/reagent/R in reagent_list)
- if(ismob(A))
- R.reaction_mob(A, method, R.volume*volume_modifier, show_message)
- if(isturf(A))
+ if(isliving(A))
+ var/mob/living/L = A
+ var/touch_protection = 0
+ if(method == TOUCH)
+ touch_protection = L.get_permeability_protection()
+ for(var/datum/reagent/R in reagent_list)
+ R.reaction_mob(L, method, R.volume*volume_modifier, show_message, touch_protection)
+ else if(isturf(A))
+ for(var/datum/reagent/R in reagent_list)
R.reaction_turf(A, R.volume*volume_modifier, show_message)
- if(isobj(A))
+ else if(isobj(A))
+ for(var/datum/reagent/R in reagent_list)
R.reaction_obj(A, R.volume*volume_modifier, show_message)
- return
-
-/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300)
+/datum/reagents/proc/add_reagent(var/reagent, var/amount, var/list/data=null, var/reagtemp = 300, var/no_react = 0)
if(!isnum(amount) || !amount)
return 1
update_total()
@@ -451,7 +455,8 @@ var/const/INGEST = 2
update_total()
my_atom.on_reagent_change()
R.on_merge(data)
- handle_reactions()
+ if(!no_react)
+ handle_reactions()
return 0
var/datum/reagent/D = chemical_reagents_list[reagent]
@@ -465,19 +470,16 @@ var/const/INGEST = 2
R.data = data
R.on_new(data)
- //debug
- //world << "Adding data"
- //for(var/D in R.data)
- // world << "Container data: [D] = [R.data[D]]"
- //debug
update_total()
my_atom.on_reagent_change()
- handle_reactions()
+ if(!no_react)
+ handle_reactions()
return 0
else
WARNING("[my_atom] attempted to add a reagent called ' [reagent] ' which doesn't exist. ([usr])")
- handle_reactions()
+ if(!no_react)
+ handle_reactions()
return 1
diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm
index 2934c57a3c0..5fe6dc7e8fa 100644
--- a/code/modules/reagents/Chemistry-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents.dm
@@ -34,43 +34,22 @@
..()
holder = null
-/datum/reagent/proc/reaction_mob(var/mob/M, var/method=TOUCH, var/volume, var/show_message = 1) //By default we have a chance to transfer some
- if(!istype(M, /mob/living))
+/datum/reagent/proc/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume, var/show_message = 1, var/touch_protection = 0)
+ if(!istype(M))
return 0
var/datum/reagent/self = src
- src = null //of the reagent to the mob on TOUCHING it.
+ src = null
- if(!istype(self.holder.my_atom, /obj/effect/effect/chem_smoke))
- // If the chemicals are in a smoke cloud, do not try to let the chemicals "penetrate" into the mob's system (balance station 13) -- Doohl
-
- if(method == TOUCH)
-
- var/chance = 1
- var/block = 0
-
- for(var/obj/item/clothing/C in M.get_equipped_items())
- if(C.permeability_coefficient < chance) chance = C.permeability_coefficient
- if(istype(C, /obj/item/clothing/suit/bio_suit))
- // bio suits are just about completely fool-proof - Doohl
- // kind of a hacky way of making bio suits more resistant to chemicals but w/e
- if(prob(75))
- block = 1
-
- if(istype(C, /obj/item/clothing/head/bio_hood))
- if(prob(75))
- block = 1
-
- chance = chance * 100
-
- if(prob(chance) && !block)
- if(M.reagents)
- M.reagents.add_reagent(self.id,self.volume/2)
+ if(method == TOUCH)
+ if(M.reagents)
+ var/modifier = Clamp((1 - touch_protection) + rand(-5,5)/100, 0, 1)
+ var/amount = round(volume*modifier, 0.1)
+ if(amount >= 1)
+ M.reagents.add_reagent(self.id, amount)
return 1
-/datum/reagent/proc/reaction_obj(var/obj/O, var/volume) //By default we transfer a small part of the reagent to the object
- src = null //if it can hold reagents. nope!
- //if(O.reagents)
- // O.reagents.add_reagent(id,volume/3)
+/datum/reagent/proc/reaction_obj(var/obj/O, var/volume)
+ src = null
return
/datum/reagent/proc/reaction_turf(var/turf/T, var/volume)
diff --git a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
index f3706a7e76b..163c1e5176e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Blob-Reagents.dm
@@ -11,13 +11,12 @@
color = "#B68D00"
message = "The blob splashes you with burning oil"
-/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/boiling_oil/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(15, BURN)
- M.adjust_fire_stacks(2)
+ var/ratio = volume/25
+ M.apply_damage(15*ratio, BURN)
+ M.adjust_fire_stacks(2*ratio)
M.IgniteMob()
- if(show_message)
- send_message(M)
if(isliving(M))
M.emote("scream")
@@ -28,11 +27,10 @@
color = "#008000"
message_living = ", and you feel sick and nauseated"
-/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/toxic_goop/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(20, TOX)
- if(show_message)
- send_message(M)
+ var/ratio = volume/25
+ M.apply_damage(20*ratio, TOX)
/datum/reagent/blob/skin_ripper
name = "Skin Ripper"
@@ -41,12 +39,11 @@
color = "#FF4C4C"
message_living = ", and you feel your skin ripping and tearing off"
-/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/skin_ripper/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(20, BRUTE)
- if(show_message)
- send_message(M)
- if(isliving(M))
+ var/ratio = volume/25
+ M.apply_damage(20*ratio, BRUTE)
+ if(iscarbon(M))
M.emote("scream")
// Combo Reagents
@@ -58,15 +55,14 @@
color = "#7F0000"
message_living = ", and you feel your skin char and melt"
-/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/skin_melter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(10, BRUTE)
- M.apply_damage(10, BURN)
- M.adjust_fire_stacks(2)
+ var/ratio = volume/25
+ M.apply_damage(10*ratio, BRUTE)
+ M.apply_damage(10*ratio, BURN)
+ M.adjust_fire_stacks(2*ratio)
M.IgniteMob()
- if(show_message)
- send_message(M)
- if(isliving(M))
+ if(iscarbon(M))
M.emote("scream")
/datum/reagent/blob/lung_destroying_toxin
@@ -76,13 +72,13 @@
color = "#00FFC5"
message_living = ", and your lungs feel heavy and weak"
-/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume,var/show_message = 1)
+/datum/reagent/blob/lung_destroying_toxin/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(20, OXY)
- M.losebreath += 15
- M.apply_damage(20, TOX)
- if(show_message)
- send_message(M)
+ var/ratio = volume/25
+ M.apply_damage(20* ratio, OXY)
+ M.losebreath += 15*ratio
+ M.apply_damage(20*ratio, TOX)
+
// Special Reagents
/datum/reagent/blob/radioactive_liquid
@@ -92,19 +88,18 @@
color = "#00EE00"
message_living = ", and your skin feels papery and everything hurts"
-/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume,var/show_message = 1)
+/datum/reagent/blob/radioactive_liquid/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
+ var/ratio = volume/25
+ M.apply_damage(10*ratio, BRUTE)
if(istype(M, /mob/living/carbon/human))
- M.apply_damage(10, BRUTE)
- M.irradiate(40)
- if(prob(33))
+ M.irradiate(40*ratio)
+ if(prob(33*ratio))
randmuti(M)
if(prob(98))
randmutb(M)
domutcheck(M, null)
updateappearance(M)
- if(show_message)
- send_message(M)
/datum/reagent/blob/dark_matter
name = "Dark Matter"
@@ -113,12 +108,12 @@
color = "#61407E"
message = "You feel a thrum as the blob strikes you, and everything flies at you"
-/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/dark_matter/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(15, BRUTE)
+ var/ratio = volume/25
+ M.apply_damage(15*ratio, BRUTE)
reagent_vortex(M, 0)
- if(show_message)
- send_message(M)
+
/datum/reagent/blob/b_sorium
name = "Sorium"
@@ -127,11 +122,10 @@
color = "#808000"
message = "The blob slams into you, and sends you flying"
-/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/b_sorium/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- M.apply_damage(15, BRUTE)
- if(show_message)
- send_message(M)
+ var/ratio = volume/25
+ M.apply_damage(15*ratio, BRUTE)
reagent_vortex(M, 1)
@@ -142,11 +136,10 @@
color = "#FFA500"
message = "The blob strikes you, and its tendrils explode"
-/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/explosive/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- if(prob(75))
- if(show_message)
- send_message(M)
+ var/ratio = volume/25
+ if(prob(75*ratio))
explosion(M.loc, 0, 0, 1, 0, 0)
/datum/reagent/blob/omnizine
@@ -157,11 +150,10 @@
message = "The blob squirts something at you"
message_living = ", and you feel great"
-/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/omnizine/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- if(show_message)
- send_message(M)
- M.reagents.add_reagent("omnizine", 11)
+ var/ratio = volume/25
+ M.reagents.add_reagent("omnizine", 11*ratio)
/datum/reagent/blob/spacedrugs
name = "Space drugs"
@@ -171,12 +163,11 @@
message = "The blob squirts something at you"
message_living = ", and you feel funny"
-/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume, var/show_message = 1)
+/datum/reagent/blob/spacedrugs/reaction_mob(var/mob/living/M as mob, var/method=TOUCH, var/volume)
if(method == TOUCH)
- if(show_message)
- send_message(M)
- M.reagents.add_reagent("space_drugs", 15)
- M.apply_damage(10, TOX)
+ var/ratio = volume/25
+ M.reagents.add_reagent("space_drugs", 15*ratio)
+ M.apply_damage(10*ratio, TOX)
/datum/reagent/blob/proc/reagent_vortex(var/mob/living/M as mob, var/setting_type)
@@ -197,4 +188,4 @@
if(message_living && !issilicon(M))
totalmessage += message_living
totalmessage += "!"
- M << "[totalmessage]"
+ M << "[totalmessage]"
\ No newline at end of file
diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
index 270ddfdabb6..0db45f86c9e 100644
--- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm
@@ -144,6 +144,11 @@
/datum/reagent/water/reaction_obj(var/obj/O, var/volume)
src = null
+
+ if(istype(O,/obj/item))
+ var/obj/item/Item = O
+ Item.extinguish()
+
// Monkey cube
if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube))
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
@@ -151,7 +156,7 @@
cube.Expand()
// Dehydrated carp
- if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
+ else if(istype(O,/obj/item/toy/carpplushie/dehy_carp))
var/obj/item/toy/carpplushie/dehy_carp/dehy = O
dehy.Swell() // Makes a carp
@@ -628,7 +633,7 @@
/datum/reagent/nanites/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
- if( (prob(10) && method==TOUCH) || method==INGEST)
+ if( (prob(min(10, volume)) && method==TOUCH) || method==INGEST)
M.ForceContractDisease(new /datum/disease/transformation/robot(0))
/datum/reagent/xenomicrobes
@@ -639,7 +644,7 @@
/datum/reagent/xenomicrobes/reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
src = null
- if( (prob(10) && method==TOUCH) || method==INGEST)
+ if( (prob(min(10, volume)) && method==TOUCH) || method==INGEST)
M.ContractDisease(new /datum/disease/transformation/xeno(0))
/datum/reagent/fluorosurfactant//foam precursor
diff --git a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
index 67c110b34bd..e8d4ebf6909 100644
--- a/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Pyrotechnic-Reagents.dm
@@ -67,7 +67,7 @@
/datum/reagent/clf3/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(method == TOUCH && isliving(M))
- M.adjust_fire_stacks(5)
+ M.adjust_fire_stacks(min(volume/5, 10))
M.IgniteMob()
PoolOrNew(/obj/effect/hotspot, M.loc)
@@ -148,7 +148,7 @@
/datum/reagent/napalm/reaction_mob(var/mob/living/M, var/method=TOUCH, var/volume)
if(method == TOUCH && isliving(M))
- M.adjust_fire_stacks(7)
+ M.adjust_fire_stacks(min(volume/4, 20))
/datum/reagent/cryostylane
name = "Cryostylane"
diff --git a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
index bbb31522bbb..e9b09cac1df 100644
--- a/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
+++ b/code/modules/reagents/Chemistry-Reagents/Toxin-Reagents.dm
@@ -34,7 +34,7 @@
if(!istype(M) || !M.dna)
return //No robots, AIs, aliens, Ians or other mobs should be affected by this.
src = null
- if((method==TOUCH && prob(33)) || method==INGEST)
+ if((method==TOUCH && prob(min(33, volume))) || method==INGEST)
randmuti(M)
if(prob(98))
randmutb(M)
@@ -194,8 +194,8 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason
-
+ var/damage = min(round(0.4*volume, 0.1),10)
+ C.adjustToxLoss(damage)
/datum/reagent/toxin/plantbgone/weedkiller
name = "Weed Killer"
id = "weedkiller"
@@ -215,7 +215,8 @@
if(iscarbon(M))
var/mob/living/carbon/C = M
if(!C.wear_mask) // If not wearing a mask
- C.adjustToxLoss(2) // 4 toxic damage per application, doubled for some reason
+ var/damage = min(round(0.4*volume, 0.1),10)
+ C.adjustToxLoss(damage)
/datum/reagent/toxin/spore
name = "Spore Toxin"
@@ -620,6 +621,7 @@
/datum/reagent/toxin/acid/reaction_mob(var/mob/living/carbon/C, var/method=TOUCH, var/volume)
if(!istype(C))
return
+ volume = round(volume,0.1)
if(method != TOUCH)
C.take_organ_damage(min(6*toxpwr, volume * toxpwr))
return
@@ -629,6 +631,7 @@
/datum/reagent/toxin/acid/reaction_obj(var/obj/O, var/volume)
if(istype(O.loc, /mob)) //handled in human acid_act()
return
+ volume = round(volume,0.1)
O.acid_act(acidpwr, toxpwr, volume)
/datum/reagent/toxin/acid/fluacid
diff --git a/code/modules/reagents/Chemistry-Recipes/Others.dm b/code/modules/reagents/Chemistry-Recipes/Others.dm
index 99866fd47eb..f03bec05038 100644
--- a/code/modules/reagents/Chemistry-Recipes/Others.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Others.dm
@@ -143,10 +143,8 @@
/datum/chemical_reaction/foam/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
-
for(var/mob/M in viewers(5, location))
M << "The solution spews out foam!"
-
var/datum/effect/effect/system/foam_spread/s = new()
s.set_up(created_volume, location, holder)
s.start()
diff --git a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
index 4b265fae1b9..ba20b7c7817 100644
--- a/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Pyrotechnics.dm
@@ -216,19 +216,16 @@
if(holder.has_reagent("stabilizing_agent"))
return
holder.remove_reagent("smoke_powder", created_volume)
+ var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1)
var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
+ var/datum/effect/effect/system/smoke_spread/chem/S = new
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- if(S)
- S.set_up(holder, 10, 0, location)
- S.start()
- sleep(10)
- S.start()
- if(holder && holder.my_atom)
- holder.clear_reagents()
- return
+ if(S)
+ S.set_up(holder, smoke_amount, 0, location)
+ S.start()
+ if(holder && holder.my_atom)
+ holder.clear_reagents()
/datum/chemical_reaction/smoke_powder_smoke
name = "smoke_powder_smoke"
@@ -242,18 +239,16 @@
/datum/chemical_reaction/smoke_powder_smoke/on_reaction(var/datum/reagents/holder, var/created_volume)
var/location = get_turf(holder.my_atom)
- var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread
+ var/smoke_amount = round(Clamp(created_volume/5, 1, 20),1)
+ var/datum/effect/effect/system/smoke_spread/chem/S = new
S.attach(location)
playsound(location, 'sound/effects/smoke.ogg', 50, 1, -3)
- spawn(0)
- if(S)
- S.set_up(holder, 10, 0, location)
- S.start()
- sleep(10)
- S.start()
- if(holder && holder.my_atom)
- holder.clear_reagents()
- return
+ if(S)
+ S.set_up(holder, smoke_amount, 0, location)
+ S.start()
+ if(holder && holder.my_atom)
+ holder.clear_reagents()
+
/datum/chemical_reaction/sonic_powder
@@ -318,6 +313,7 @@
var/turf/simulated/T = get_turf(holder.my_atom)
if(istype(T))
T.atmos_spawn_air(SPAWN_HEAT | SPAWN_TOXINS, created_volume)
+ holder.clear_reagents()
return
diff --git a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
index 996604a0822..98f34ef9f73 100644
--- a/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
+++ b/code/modules/reagents/Chemistry-Recipes/Slime_extracts.dm
@@ -11,10 +11,9 @@
/datum/chemical_reaction/slimespawn/on_reaction(var/datum/reagents/holder)
feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
- for(var/mob/O in viewers(get_turf(holder.my_atom), null))
- O.show_message(text("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!"), 1)
var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime
S.loc = get_turf(holder.my_atom)
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
/datum/chemical_reaction/slimeinaprov
name = "Slime epinephrine"
@@ -618,3 +617,20 @@
var/obj/P = new chosen
if(P)
P.loc = get_turf(holder.my_atom)
+
+//Rainbow :o)
+/datum/chemical_reaction/slimeRNG
+ name = "Random Core"
+ id = "slimerng"
+ result = null
+ required_reagents = list("plasma" = 1)
+ result_amount = 1
+ required_other = 1
+ required_container = /obj/item/slime_extract/rainbow
+
+/datum/chemical_reaction/slimeRNG/on_reaction(var/datum/reagents/holder)
+ feedback_add_details("slime_cores_used","[replacetext(name," ","_")]")
+ var/mob/living/simple_animal/slime/S = new /mob/living/simple_animal/slime
+ S.colour = pick("grey","orange", "metal", "blue", "purple", "dark purple", "dark blue", "green", "silver", "yellow", "gold", "yellow", "red", "silver", "pink", "cerulean", "sepia", "bluespace", "pyrite", "light pink", "oil", "adamantine", "black")
+ S.loc = get_turf(holder.my_atom)
+ S.visible_message("Infused with plasma, the core begins to quiver and grow, and soon a new baby slime emerges from it!")
diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm
index a938b092061..c3108ddeb0c 100644
--- a/code/modules/reagents/reagent_containers.dm
+++ b/code/modules/reagents/reagent_containers.dm
@@ -7,7 +7,6 @@
var/amount_per_transfer_from_this = 5
var/possible_transfer_amounts = list(5,10,15,25,30)
var/volume = 30
- var/list/banned_reagents = list() //List of reagent IDs we reject.
var/list/list_reagents = null
var/spawned_disease = null
var/disease_amount = 20
diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm
index d3c923f6e2c..eed51ff2a81 100644
--- a/code/modules/reagents/reagent_containers/borghydro.dm
+++ b/code/modules/reagents/reagent_containers/borghydro.dm
@@ -92,7 +92,8 @@ Borg Hypospray
if (R.total_volume && M.can_inject(user, 1))
M << "You feel a tiny prick!"
user << "You inject [M] with the injector."
- R.reaction(M, INGEST)
+ var/fraction = min(amount_per_transfer_from_this/R.total_volume, 1)
+ R.reaction(M, INGEST, fraction)
if(M.reagents)
var/trans = R.trans_to(M, amount_per_transfer_from_this)
user << "[trans] unit\s injected. [R.total_volume] unit\s remaining."
diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm
index f67392fab7d..7e5a3d234fd 100644
--- a/code/modules/reagents/reagent_containers/dropper.dm
+++ b/code/modules/reagents/reagent_containers/dropper.dm
@@ -2,7 +2,7 @@
name = "dropper"
desc = "A dropper. Holds up to 5 units."
icon = 'icons/obj/chemical.dmi'
- icon_state = "dropper"
+ icon_state = "dropper0"
amount_per_transfer_from_this = 5
possible_transfer_amounts = list(1, 2, 3, 4, 5)
volume = 5
@@ -21,6 +21,7 @@
return
var/trans = 0
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
if(ismob(target))
if(istype(target , /mob/living/carbon/human))
@@ -40,12 +41,12 @@
if(safe_thing)
if(!safe_thing.reagents)
safe_thing.create_reagents(100)
+
+ reagents.reaction(safe_thing, TOUCH, fraction)
trans = reagents.trans_to(safe_thing, amount_per_transfer_from_this)
target.visible_message("[user] tries to squirt something into [target]'s eyes, but fails!", \
"[user] tries to squirt something into [target]'s eyes, but fails!")
- spawn(5)
- reagents.reaction(safe_thing, TOUCH)
user << "You transfer [trans] unit\s of the solution."
update_icon()
@@ -53,7 +54,8 @@
target.visible_message("[user] squirts something into [target]'s eyes!", \
"[user] squirts something into [target]'s eyes!")
- reagents.reaction(target, TOUCH)
+
+ reagents.reaction(target, TOUCH, fraction)
var/mob/M = target
var/R
if(reagents)
@@ -87,4 +89,4 @@
if(reagents.total_volume)
var/image/filling = image('icons/obj/reagentfillings.dmi', src, "dropper")
filling.color = mix_color_from_reagents(reagents.reagent_list)
- overlays += filling
\ No newline at end of file
+ overlays += filling
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 2a21fe917d8..b8f188c3ba5 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -72,12 +72,6 @@
user << "[target] is full."
return
- if(istype(target, /obj/item/weapon/reagent_containers))
- var/obj/item/weapon/reagent_containers/RC = target
- for(var/bad_reg in RC.banned_reagents)
- if(reagents.has_reagent(bad_reg, 1)) //Message is a bit "Game-y" but I can't think up a better one.
- user << "A chemical in [src] is far too dangerous to transfer to [RC]!"
- return
var/trans = reagents.trans_to(target, amount_per_transfer_from_this)
user << "You transfer [trans] unit\s of the solution to [target]."
diff --git a/code/modules/reagents/reagent_containers/hypospray.dm b/code/modules/reagents/reagent_containers/hypospray.dm
index 708b8659a7a..1a86c6f9ed7 100644
--- a/code/modules/reagents/reagent_containers/hypospray.dm
+++ b/code/modules/reagents/reagent_containers/hypospray.dm
@@ -25,7 +25,8 @@
M << "You feel a tiny prick!"
user << "You inject [M] with [src]."
- reagents.reaction(M, INGEST)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(M, INGEST, fraction)
if(M.reagents)
var/list/injected = list()
for(var/datum/reagent/R in reagents.reagent_list)
diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm
index 4520bb48afb..b675f86913b 100644
--- a/code/modules/reagents/reagent_containers/pill.dm
+++ b/code/modules/reagents/reagent_containers/pill.dm
@@ -45,10 +45,9 @@
if(reagents.total_volume)
reagents.reaction(M, apply_type)
- spawn(5)
- reagents.trans_to(M, reagents.total_volume)
- qdel(src)
- return 1
+ reagents.trans_to(M, reagents.total_volume)
+ qdel(src)
+ return 1
else
qdel(src)
return 1
diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm
index edfce7a4595..054b8113f2f 100644
--- a/code/modules/reagents/reagent_containers/spray.dm
+++ b/code/modules/reagents/reagent_containers/spray.dm
@@ -15,7 +15,6 @@
amount_per_transfer_from_this = 5
volume = 250
possible_transfer_amounts = null
- banned_reagents = list("facid","sacid")
/obj/item/weapon/reagent_containers/spray/afterattack(atom/A as mob|obj, mob/user as mob)
@@ -159,7 +158,6 @@
amount_per_transfer_from_this = 10
volume = 600
origin_tech = "combat=3;materials=3;engineering=3"
- banned_reagents = list()//the safeties are off, spray and pay!
/obj/item/weapon/reagent_containers/spray/chemsprayer/spray(var/atom/A)
diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm
index ad9c064c873..e41a0a2639c 100644
--- a/code/modules/reagents/reagent_containers/syringes.dm
+++ b/code/modules/reagents/reagent_containers/syringes.dm
@@ -151,7 +151,8 @@
var/contained = english_list(rinject)
var/mob/M = target
add_logs(user, M, "injected", object="[src.name]", addition="which had [contained]")
- reagents.reaction(target, INGEST)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(target, INGEST, fraction)
if(ismob(target) && target == user)
//Attack log entries are produced here due to failure to produce elsewhere. Remove them here if you have doubles from normal syringes.
var/list/rinject = list()
@@ -161,8 +162,8 @@
var/mob/M = target
log_attack("[user.name] ([user.ckey]) injected [M.name] ([M.ckey]) with [src.name], which had [contained] (INTENT: [uppertext(user.a_intent)])")
M.attack_log += text("\[[time_stamp()]\] Injected themselves ([contained]) with [src.name].")
-
- reagents.reaction(target, INGEST)
+ var/fraction = min(amount_per_transfer_from_this/reagents.total_volume, 1)
+ reagents.reaction(target, INGEST, fraction)
spawn(5)
var/datum/reagent/blood/B
for(var/datum/reagent/blood/d in src.reagents.reagent_list)
@@ -180,7 +181,7 @@
/obj/item/weapon/reagent_containers/syringe/update_icon()
- var/rounded_vol = min(round(reagents.total_volume,5), 15)
+ var/rounded_vol = min(max(round(reagents.total_volume,5),5),15)
overlays.Cut()
if(ismob(loc))
var/injoverlay
diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm
index eda94a40f33..5225e5a4d48 100644
--- a/code/modules/recycling/sortingmachinery.dm
+++ b/code/modules/recycling/sortingmachinery.dm
@@ -117,6 +117,7 @@
flags = NOBLUDGEON
amount = 25
max_amount = 25
+ burn_state = 0 //burnable
/obj/item/stack/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity)
diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm
index 1eeb4731c18..86e8b96252d 100644
--- a/code/modules/research/experimentor.dm
+++ b/code/modules/research/experimentor.dm
@@ -231,7 +231,7 @@
loaded_item = null
/obj/machinery/r_n_d/experimentor/proc/throwSmoke(var/turf/where)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(1,0, where, 0)
smoke.start()
@@ -323,7 +323,7 @@
R.my_atom = src
R.add_reagent(chosenchem , 50)
investigate_log("Experimentor has released [chosenchem] smoke.", "experimentor")
- var/datum/effect/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -335,7 +335,7 @@
var/datum/reagents/R = new/datum/reagents(50)
R.my_atom = src
R.add_reagent(chosenchem , 50)
- var/datum/effect/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -422,7 +422,7 @@
R.my_atom = src
R.add_reagent("frostoil" , 50)
investigate_log("Experimentor has released frostoil gas.", "experimentor")
- var/datum/effect/effect/system/chem_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/chem/smoke = new
smoke.set_up(R, 1, 0, src, 0, silent = 1)
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
smoke.start()
@@ -444,7 +444,7 @@
ejectItem(TRUE)
if(prob(EFFECT_PROB_MEDIUM-badThingCoeff))
visible_message("[src] malfunctions, releasing a flurry of chilly air as [exp_on] pops out!")
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(1,0, src.loc, 0)
smoke.start()
ejectItem()
@@ -652,7 +652,7 @@
//////////////// RELIC PROCS /////////////////////////////
/obj/item/weapon/relic/proc/throwSmoke(var/turf/where)
- var/datum/effect/effect/system/harmless_smoke_spread/smoke = new
+ var/datum/effect/effect/system/smoke_spread/smoke = new
smoke.set_up(1,0, where, 0)
smoke.start()
diff --git a/code/modules/research/stock_parts.dm b/code/modules/research/stock_parts.dm
index 4f67a8aa16d..4ee8ea23b77 100644
--- a/code/modules/research/stock_parts.dm
+++ b/code/modules/research/stock_parts.dm
@@ -42,6 +42,16 @@
pshoom_or_beepboopblorpzingshadashwoosh = 'sound/items/PSHOOM.ogg'
alt_sound = 'sound/items/PSHOOM_2.ogg'
+/obj/item/weapon/storage/part_replacer/bluespace/content_can_dump(atom/dest_object, mob/user)
+ if(Adjacent(user))
+ if(get_dist(user, dest_object) < 8)
+ if(dest_object.storage_contents_dump_act(src, user))
+ play_rped_sound()
+ user.Beam(dest_object,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5)
+ return 1
+ user << "The [src.name] buzzes."
+ playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 0)
+ return 0
/obj/item/weapon/storage/part_replacer/proc/play_rped_sound()
//Plays the sound for RPED exhanging or installing parts.
diff --git a/code/modules/telesci/telesci_computer.dm b/code/modules/telesci/telesci_computer.dm
index 0450b8109c1..3e0a44925ea 100644
--- a/code/modules/telesci/telesci_computer.dm
+++ b/code/modules/telesci/telesci_computer.dm
@@ -1,7 +1,8 @@
/obj/machinery/computer/telescience
name = "\improper Telepad Control Console"
desc = "Used to teleport objects to and from the telescience telepad."
- icon_state = "teleport"
+ icon_screen = "teleport"
+ icon_keyboard = "teleport_key"
circuit = /obj/item/weapon/circuitboard/telesci_console
var/sending = 1
var/obj/machinery/telepad/telepad = null
diff --git a/config/admins.txt b/config/admins.txt
index 8a308e187ce..a029f2639e4 100644
--- a/config/admins.txt
+++ b/config/admins.txt
@@ -7,7 +7,8 @@
# NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn #
# NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. #
###############################################################################################
-MrStonedOne = Host
+Optimumtact = Host
+MrStonedOne = Game Master
microscopics = Game Master
Gun Hog = Game Master
KorPhaeron = Game Master
@@ -84,4 +85,4 @@ vekter = Game Master
Ahammer18 = Game Master
ACCount12 = Game Master
fayrik = Game Master
-shadowlight213 = Game Master
\ No newline at end of file
+shadowlight213 = Game Master
diff --git a/html/changelog.html b/html/changelog.html
index 929ed44f31f..e5f040be56e 100644
--- a/html/changelog.html
+++ b/html/changelog.html
@@ -55,6 +55,67 @@
-->
+
29 June 2015
+
Ikarrus updated:
+
+ - Clothing has been separated out of equipment lockers into wardrobes to reduce clutter.
+
+
Incoming5643 updated:
+
+ - The secrets of the rainbow slimes have finally been revealed. To attain this rare blob you must breed a slime with a 100% mutation chance!
+ - Rainbow slime cores will generate a randomly colored slime when injected with plasma. It's a good plan B if the slimes aren't cooperating in terms of colors. You can get any color slime this way, pray to the RNG!
+
+
Xhuis updated:
+
+ - The Sleeping Carp clan has made its presence known on Space Station 13. Some gangs will name themselves after this group and practice martial arts rather than using traditional gang weaponry. These shadowboxers are not to be taken lightly.
+
+
oranges updated:
+
+ - Thanks to a breakthrough in directed vector thrusting, all nanotrasen brand jetpacks have been greatly improved in speed and handling
+
+
+
28 June 2015
+
Ikarrus updated:
+
+ - Gang Lieutenants can buy gang tools now, but at a higher cost than the original boss
+ - Gang leaders can register additional gangtools to themselves for use as spares.
+ - Number of maximum lieutenants lowered to 2
+ - Pistol cost increased to 25 influence
+ - Uzi cost increased to 50 influence
+ - Uzi Ammo decreased to 20 influence
+ - Overcoats added to items the biogenerator can produce.
+ - Micro and Macro bomb implants are now restricted to the Nuclear game mode.
+
+
phil235 updated:
+
+ - Smoke (and foam) no longer distribute more reagents than they have. The amount of clouds in a smoke now depends on the amount of smoke created. Acid no longer melts items on a mob at low volume, and the chances to melt them increases with the amount applied on the mob. Sprays can now contain acid again.
+
+
+
27 June 2015
+
Ikarrus updated:
+
+ - Some objects can be burned now.
+ - Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way.
+
+
Laharl Montogmmery updated:
+
+ - Storage Content Transfer : Bluespace Boogaloo! You can now transfer the content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7 tiles.
+
+
MrStonedOne updated:
+
+ - Admins will now receive a notification when one of them starts to reply to an adminhelp to cut down on multiple responses to adminhelps and let admins know when an adminhelp isn't getting replied to.
+ - The keyword finder in admin helps (adds a (?) link next to player names in the text of adminhelps) has been added for all player to admin pms, as well as admin say.
+
+
NullQuery updated:
+
+ - Introduces html_interface, a module to streamline the management of browser windows.
+ - Adds playing cards that utilize a new HTML window management system.
+
+
Vekter updated:
+
+ - Added a new military jacket to the Autodrobe and ClothesMate.
+
+
26 June 2015
Ikarrus updated:
@@ -121,7 +182,7 @@
- Admins can now flag ckeys to be alerted when they connect to the server.
- N3X15 updated:
+ MrStonedOne updated:
- Admins can now reject poor adminhelps. This will tell the player how to construct a useful adminhelp and give them back their adminhelp verb
diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml
index c9ad089f910..1763d0c5a1d 100644
--- a/html/changelogs/.all_changelog.yml
+++ b/html/changelogs/.all_changelog.yml
@@ -2918,7 +2918,7 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
- rscdel: Removed bulletproof vests from gangtool menu.
Jordie0608:
- rscadd: Admins can now flag ckeys to be alerted when they connect to the server.
- N3X15:
+ MrStonedOne:
- rscadd: Admins can now reject poor adminhelps. This will tell the player how to
construct a useful adminhelp and give them back their adminhelp verb
RemieRichards:
@@ -2981,3 +2981,61 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
pudl:
- rscadd: You can now play games of mastermind to unlock abandoned crates found
throughout space.
+2015-06-27:
+ Ikarrus:
+ - rscadd: Some objects can be burned now.
+ - rscadd: Bombs will shred your clothes, with respect to their layering and armor
+ values. Exterior clothing will shield clothing underneath. Storage items will
+ drop their contents when bombed this way.
+ Laharl Montogmmery:
+ - rscadd: 'Storage Content Transfer : Bluespace Boogaloo! You can now transfer the
+ content of the BoH/BRPED into tiles/bins/bags out of your reach. Range is 7
+ tiles.'
+ MrStonedOne:
+ - tweak: Admins will now receive a notification when one of them starts to reply
+ to an adminhelp to cut down on multiple responses to adminhelps and let admins
+ know when an adminhelp isn't getting replied to.
+ - rscadd: The keyword finder in admin helps (adds a (?) link next to player names
+ in the text of adminhelps) has been added for all player to admin pms, as well
+ as admin say.
+ NullQuery:
+ - wip: Introduces html_interface, a module to streamline the management of browser
+ windows.
+ - rscadd: Adds playing cards that utilize a new HTML window management system.
+ Vekter:
+ - rscadd: Added a new military jacket to the Autodrobe and ClothesMate.
+2015-06-28:
+ Ikarrus:
+ - rscadd: Gang Lieutenants can buy gang tools now, but at a higher cost than the
+ original boss
+ - rscadd: Gang leaders can register additional gangtools to themselves for use as
+ spares.
+ - tweak: Number of maximum lieutenants lowered to 2
+ - tweak: Pistol cost increased to 25 influence
+ - tweak: Uzi cost increased to 50 influence
+ - tweak: Uzi Ammo decreased to 20 influence
+ - rscadd: Overcoats added to items the biogenerator can produce.
+ - rscdel: Micro and Macro bomb implants are now restricted to the Nuclear game mode.
+ phil235:
+ - tweak: Smoke (and foam) no longer distribute more reagents than they have. The
+ amount of clouds in a smoke now depends on the amount of smoke created. Acid
+ no longer melts items on a mob at low volume, and the chances to melt them increases
+ with the amount applied on the mob. Sprays can now contain acid again.
+2015-06-29:
+ Ikarrus:
+ - rscadd: Clothing has been separated out of equipment lockers into wardrobes to
+ reduce clutter.
+ Incoming5643:
+ - rscadd: The secrets of the rainbow slimes have finally been revealed. To attain
+ this rare blob you must breed a slime with a 100% mutation chance!
+ - rscadd: Rainbow slime cores will generate a randomly colored slime when injected
+ with plasma. It's a good plan B if the slimes aren't cooperating in terms of
+ colors. You can get any color slime this way, pray to the RNG!
+ Xhuis:
+ - rscadd: The Sleeping Carp clan has made its presence known on Space Station 13.
+ Some gangs will name themselves after this group and practice martial arts rather
+ than using traditional gang weaponry. These shadowboxers are not to be taken
+ lightly.
+ oranges:
+ - tweak: Thanks to a breakthrough in directed vector thrusting, all nanotrasen
+ brand jetpacks have been greatly improved in speed and handling
diff --git a/html/changelogs/NullQuery-Nullstation.yml b/html/changelogs/NullQuery-Nullstation.yml
deleted file mode 100644
index 981bb1c1d36..00000000000
--- a/html/changelogs/NullQuery-Nullstation.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-author: NullQuery
-delete-after: True
-
-changes:
- - wip: "Introduces html_interface, a module to streamline the management of browser windows."
- - rscadd: "Adds playing cards that utilize a new HTML window management system."
diff --git a/html/changelogs/vekter-10159.yml b/html/changelogs/vekter-10159.yml
deleted file mode 100644
index f99d832a38c..00000000000
--- a/html/changelogs/vekter-10159.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-################################
-# Example Changelog File
-#
-# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb.
-#
-# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.)
-# When it is, any changes listed below will disappear.
-#
-# Valid Prefixes:
-# bugfix
-# wip (For works in progress)
-# tweak
-# soundadd
-# sounddel
-# rscadd (general adding of nice things)
-# rscdel (general deleting of nice things)
-# imageadd
-# imagedel
-# spellcheck (typo fixes)
-# experiment
-# tgs (TG-ported fixes?)
-#################################
-
-# Your name.
-author: Vekter
-
-# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again.
-delete-after: True
-
-# Any changes you've made. See valid prefix list above.
-# INDENT WITH TWO SPACES. NOT TABS. SPACES.
-# SCREW THIS UP AND IT WON'T WORK.
-# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit.
-# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog.
-changes:
- - rscadd: "Added a new military jacket to the Autodrobe and ClothesMate."
diff --git a/icons/effects/crayondecal.dmi b/icons/effects/crayondecal.dmi
index 0225a6349b6..668743204d6 100644
Binary files a/icons/effects/crayondecal.dmi and b/icons/effects/crayondecal.dmi differ
diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi
index 62170e230e6..5102b40d59e 100644
Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ
diff --git a/icons/mob/inhands/items_lefthand.dmi b/icons/mob/inhands/items_lefthand.dmi
index 6db0ab5709a..79dba919f26 100644
Binary files a/icons/mob/inhands/items_lefthand.dmi and b/icons/mob/inhands/items_lefthand.dmi differ
diff --git a/icons/mob/inhands/items_righthand.dmi b/icons/mob/inhands/items_righthand.dmi
index 83986fd1ae8..d0e6e69563b 100644
Binary files a/icons/mob/inhands/items_righthand.dmi and b/icons/mob/inhands/items_righthand.dmi differ
diff --git a/icons/obj/weapons.dmi b/icons/obj/weapons.dmi
index bd9e5cc7e60..47a2d13262c 100644
Binary files a/icons/obj/weapons.dmi and b/icons/obj/weapons.dmi differ
diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi
index 3624a9b4bff..c2f7bfcc202 100644
Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ
diff --git a/tgstation.dme b/tgstation.dme
index e12b699a33c..f12e17995b7 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -155,6 +155,7 @@
#include "code\datums\hud.dm"
#include "code\datums\martial.dm"
#include "code\datums\mind.dm"
+#include "code\datums\mineral_container.dm"
#include "code\datums\modules.dm"
#include "code\datums\mutations.dm"
#include "code\datums\recipe.dm"
diff --git a/tools/mapmerge/MapPatcher.jar b/tools/mapmerge/MapMerge.jar
similarity index 72%
rename from tools/mapmerge/MapPatcher.jar
rename to tools/mapmerge/MapMerge.jar
index 5cbaad488c1..aa4a779ca5d 100644
Binary files a/tools/mapmerge/MapPatcher.jar and b/tools/mapmerge/MapMerge.jar differ
diff --git a/tools/mapmerge/prepare_map.bat b/tools/mapmerge/Prepare Maps.bat
similarity index 73%
rename from tools/mapmerge/prepare_map.bat
rename to tools/mapmerge/Prepare Maps.bat
index bfe1e6560e9..89e5a233ed2 100644
--- a/tools/mapmerge/prepare_map.bat
+++ b/tools/mapmerge/Prepare Maps.bat
@@ -7,6 +7,6 @@ cls
echo All dmm files in map_files directories have been backed up
echo Now you can make your changes...
echo ---
-echo Remember to run clean_map.bat just before you commit your changes!
+echo Remember to run Run_Map_Merge.bat just before you commit your changes!
echo ---
pause
diff --git a/tools/mapmerge/Run Map Merge.bat b/tools/mapmerge/Run Map Merge.bat
new file mode 100644
index 00000000000..2793b28a6b5
--- /dev/null
+++ b/tools/mapmerge/Run Map Merge.bat
@@ -0,0 +1,5 @@
+@echo off
+
+java -jar ../../tools/mapmerge/MapMerge.jar
+
+pause
\ No newline at end of file
diff --git a/tools/mapmerge/Source/.classpath b/tools/mapmerge/Source/.classpath
new file mode 100644
index 00000000000..a0cb530fa9d
--- /dev/null
+++ b/tools/mapmerge/Source/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/tools/mapmerge/Source/.project b/tools/mapmerge/Source/.project
new file mode 100644
index 00000000000..df472fbdf11
--- /dev/null
+++ b/tools/mapmerge/Source/.project
@@ -0,0 +1,17 @@
+
+
+ MapMerger
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs b/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 00000000000..3a21537071b
--- /dev/null
+++ b/tools/mapmerge/Source/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,11 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/tools/mapmerge/Source/META-INF/MANIFEST.MF b/tools/mapmerge/Source/META-INF/MANIFEST.MF
deleted file mode 100644
index 5aa53c2fa28..00000000000
--- a/tools/mapmerge/Source/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Created-By: 1.6.0_31 (Sun Microsystems Inc.)
-Main-Class: MapPatcher
-
diff --git a/tools/mapmerge/Source/bin/FileFinder.class b/tools/mapmerge/Source/bin/FileFinder.class
new file mode 100644
index 00000000000..ab01a656c45
Binary files /dev/null and b/tools/mapmerge/Source/bin/FileFinder.class differ
diff --git a/tools/mapmerge/Source/bin/MapMergerMain.class b/tools/mapmerge/Source/bin/MapMergerMain.class
new file mode 100644
index 00000000000..c563253301f
Binary files /dev/null and b/tools/mapmerge/Source/bin/MapMergerMain.class differ
diff --git a/tools/mapmerge/Source/src/FileFinder.java b/tools/mapmerge/Source/src/FileFinder.java
new file mode 100644
index 00000000000..0677b777843
--- /dev/null
+++ b/tools/mapmerge/Source/src/FileFinder.java
@@ -0,0 +1,25 @@
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Path;
+import java.nio.file.PathMatcher;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.ArrayList;
+
+public class FileFinder extends SimpleFileVisitor {
+ private PathMatcher matcher;
+ public ArrayList foundPaths = new ArrayList<>();
+ public FileFinder(String pattern) {
+ matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern);
+ }
+
+ @Override
+ public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+ Path name = file.getFileName();
+ if (matcher.matches(name)) {
+ foundPaths.add(file);
+ }
+ return FileVisitResult.CONTINUE;
+ }
+}
\ No newline at end of file
diff --git a/tools/mapmerge/Source/src/MapMergerMain.java b/tools/mapmerge/Source/src/MapMergerMain.java
new file mode 100644
index 00000000000..0f38cc91ea5
--- /dev/null
+++ b/tools/mapmerge/Source/src/MapMergerMain.java
@@ -0,0 +1,57 @@
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Scanner;
+
+public class MapMergerMain {
+
+ private static Scanner input = new Scanner(System.in);
+
+ public static void main(String[] args) throws IOException{
+
+ System.out.print("Path to _maps folder: ");
+ String pathTo_maps = input.nextLine();
+ Path fileDir = Paths.get(pathTo_maps);
+ FileFinder finder = new FileFinder("*.dmm");
+ Files.walkFileTree(fileDir, finder);
+ ArrayList foundFiles = finder.foundPaths;
+ if (foundFiles.size() > 0) {
+ for(int num = 0;num < foundFiles.size();num++){
+ System.out.println(num + ": " + foundFiles.get(num));
+ }
+ }else{
+ System.out.println("No files were found!");
+ }
+ System.out.print("File to use: ");
+ int selection;
+ inputCheck:while(true){
+ while(!input.hasNextInt()){
+ String temp = input.next();
+ System.out.println(temp + " is not a valid int.");
+ }
+ selection = input.nextInt();
+ if(selection < 0 || selection >= foundFiles.size()){
+ if(selection < 0){
+ System.out.println("Use a number greater than 0!");
+ }else{
+ System.out.println("Use a number less than " + foundFiles.size() +"!");
+ }
+ continue inputCheck;
+ }else{
+ break inputCheck;
+ }
+ }
+
+ String newMap = foundFiles.get(selection) + "";
+ String oldMap = foundFiles.get(selection) + ".backup";
+ String[] passInto = new String[4];
+ passInto[0] = "-clean";
+ passInto[1] = oldMap;
+ passInto[2] = newMap;
+ passInto[3] = newMap;
+ MapPatcher.main(passInto);
+ }
+
+}
\ No newline at end of file
diff --git a/tools/mapmerge/Source/Location.java b/tools/mapmerge/Source/src/MapPatcher/Location.java
similarity index 100%
rename from tools/mapmerge/Source/Location.java
rename to tools/mapmerge/Source/src/MapPatcher/Location.java
diff --git a/tools/mapmerge/Source/Map.java b/tools/mapmerge/Source/src/MapPatcher/Map.java
similarity index 100%
rename from tools/mapmerge/Source/Map.java
rename to tools/mapmerge/Source/src/MapPatcher/Map.java
diff --git a/tools/mapmerge/Source/MapPatcher.java b/tools/mapmerge/Source/src/MapPatcher/MapPatcher.java
similarity index 100%
rename from tools/mapmerge/Source/MapPatcher.java
rename to tools/mapmerge/Source/src/MapPatcher/MapPatcher.java
diff --git a/tools/mapmerge/Source/SavingThread.java b/tools/mapmerge/Source/src/MapPatcher/SavingThread.java
similarity index 100%
rename from tools/mapmerge/Source/SavingThread.java
rename to tools/mapmerge/Source/src/MapPatcher/SavingThread.java
diff --git a/tools/mapmerge/clean_map.bat b/tools/mapmerge/clean_map.bat
deleted file mode 100644
index 8e1c9273d53..00000000000
--- a/tools/mapmerge/clean_map.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-cd ../../_maps/map_files/
-set /P MAPFILE=Please enter mapfile (relative to map_files folder):
-
-java -jar ../../tools/mapmerge/MapPatcher.jar -clean "%MAPFILE%.backup" "%MAPFILE%" "%MAPFILE%"
-
-pause
\ No newline at end of file
diff --git a/tools/mapmerge/install.txt b/tools/mapmerge/install.txt
deleted file mode 100644
index c225e68d706..00000000000
--- a/tools/mapmerge/install.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-1. Install java(http://www.java.com/en/download/index.jsp)
-2. Make sure java is in your PATH. To test this, open git bash, and type "java". If it says unknown command, you need to add JAVA/bin to your PATH variable (A guide for this can be found at https://www.java.com/en/download/help/path.xml ).
-
-Committing
-1. Before starting to edit the map, double-click "prepare_map.bat" in the tools/mapmerge/ directory.
-2. After finishing your edit, and before your commit, double-click "clean_map.bat" in the tools/mapmerge/ directory.
-
-This will make sure in the new version of your map, no paths are needlessly changed, thus instead of 8000 lines changed you'll get 50 lines changed. This not only reduces size of your commit, it also makes it possible to get an overview of your map changes on the "files changed" page in your pull request.
-
-Merging
-The easiest way to do merging is to install the merge driver. For this, you can just double-click "install_driver.bat" in the tools/mapmerge/ directory.
-
-Alternatively, open -tg-station/.git/config in a text editor, and paste the following lines to the end of it:
-
-[merge "merge-dmm"]
- name = mapmerge driver
- driver = ./tools/mapmerge/mapmerge.sh %O %A %B
-
-After this, merging maps should happen automagically unless there are conflicts(a tile that both you and someone else changed). If there are conflicts, you will unfortunately still be stuck with opening both versions in a map editor, and manually resolving the issues.
diff --git a/tools/mapmerge/install_driver.bat b/tools/mapmerge/install_driver.bat
deleted file mode 100644
index fa04dddff55..00000000000
--- a/tools/mapmerge/install_driver.bat
+++ /dev/null
@@ -1,7 +0,0 @@
-@echo off
-echo. >> ../../.git/config
-echo [merge "merge-dmm"] >> ../../.git/config
-echo name = mapmerge driver >> ../../.git/config
-echo driver = ./tools/mapmerge/mapmerge.sh %O %A %B >> ../../.git/config
-echo. >> ../../.git/config
-
diff --git a/tools/mapmerge/mapmerge.sh b/tools/mapmerge/mapmerge.sh
deleted file mode 100644
index 145537f7ca7..00000000000
--- a/tools/mapmerge/mapmerge.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-java -jar tools/mapmerge/MapPatcher.jar -merge $1 $2 $3 $2
-if [ "$?" -gt 0 ]
-then
- echo "Unable to automatically resolve map conflicts, please merge manually."
- exit 1
-fi
-java -jar tools/mapmerge/MapPatcher.jar -clean $1 $2 $2
-
-exit 0