Merge remote-tracking branch 'ParadiseSS13/master' into YETMOREBLOOD

This commit is contained in:
Aurorablade
2015-09-27 22:40:52 -04:00
70 changed files with 552 additions and 1107 deletions
@@ -856,7 +856,7 @@
"qx" = (/obj/machinery/light/small{dir = 8},/obj/machinery/alarm/monitor{dir = 4; frequency = 1439; locked = 0; pixel_x = -23; pixel_y = 0; req_access = null},/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qy" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "freezerfloor"},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qz" = (/obj/structure/disposalpipe/segment,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating{heat_capacity = 1e+006},/area/awaycontent/a2{has_gravity = 1; name = "UO45 Crew Quarters"})
"qA" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"qA" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 4},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
"qB" = (/obj/machinery/atmospherics/pipe/manifold/hidden/purple{dir = 1},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"qC" = (/obj/machinery/atmospherics/pipe/simple/hidden/purple{dir = 9},/turf/simulated/floor/plating/airless/asteroid{carbon_dioxide = 173.4; heat_capacity = 1e+006; name = "Cave Floor"; nitrogen = 135.1; oxygen = 0; temperature = 363.9; toxins = 229.8},/area/awaycontent/a7{always_unpowered = 1; has_gravity = 1; name = "UO45 Caves"; power_environ = 0; power_equip = 0; power_light = 0; poweralm = 0})
"qD" = (/obj/machinery/vending/cola,/turf/simulated/floor{heat_capacity = 1e+006; icon_state = "dark"},/area/awaycontent/a3{has_gravity = 1; name = "UO45 Engineering"})
+28 -25
View File
@@ -225,7 +225,7 @@
"aeq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/security/interrogationobs)
"aer" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/camera{c_tag = "Brig Prison Hallway"; dir = 4; network = list("Prison","SS13")},/turf/simulated/floor{icon_state = "red"; dir = 8},/area/security/permabrig)
"aes" = (/obj/structure/rack,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/item/weapon/gun/energy/advtaser{pixel_x = -3; pixel_y = 3},/obj/item/weapon/gun/energy/advtaser{pixel_x = 0; pixel_y = 0},/obj/item/weapon/gun/energy/advtaser{pixel_x = 3; pixel_y = -3},/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aet" = (/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aet" = (/obj/structure/rack,/obj/item/key/security,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeu" = (/obj/structure/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/obj/item/weapon/shield/riot,/turf/simulated/floor{dir = 8; icon_state = "vault"; tag = "icon-vault (WEST)"},/area/security/securearmoury)
"aev" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Head of Security's Office"},/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
"aew" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/carpet,/area/security/hos)
@@ -242,7 +242,7 @@
"aeH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light/small,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "Interrogation Observation APC"; pixel_x = 26; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/security/interrogationobs)
"aeI" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/apc{cell_type = 5000; dir = 8; name = "Armory APC"; pixel_x = -24; pixel_y = 0},/obj/machinery/camera/motion{c_tag = "Secure Armory"; dir = 4; network = list("SS13")},/obj/machinery/light_switch{pixel_x = -25; pixel_y = -10},/obj/effect/decal/warning_stripes/southwest,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/effect/decal/warning_stripes/southwestcorner,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeK" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeK" = (/obj/structure/stool/bed/chair/janicart/secway,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/effect/decal/warning_stripes/southeastcorner,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeM" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/effect/decal/warning_stripes/southeast,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"aeN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/machinery/light_switch{pixel_x = -25},/turf/simulated/floor{icon_state = "dark"},/area/security/hos)
@@ -4839,7 +4839,7 @@
"bPc" = (/turf/simulated/wall,/area/hallway/primary/central/sw)
"bPd" = (/obj/machinery/door/airlock/command{name = "Head of Personnel"; req_access = null; req_access_txt = "57"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/crew_quarters/heads)
"bPe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/server)
"bPf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/server)
"bPf" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor{icon_state = "dark"},/area/security/securearmoury)
"bPg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall,/area/engine/gravitygenerator)
"bPh" = (/obj/machinery/door/firedoor{dir = 8; name = "Firelock West"},/obj/machinery/door/airlock/engineering{name = "Gravity Generator"; req_access_txt = "0"; req_one_access_txt = "10;30"},/turf/simulated/floor{tag = "icon-vault"; icon_state = "vault"},/area/engine/gravitygenerator)
"bPi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/hallway/primary/central/sw)
@@ -5046,7 +5046,7 @@
"bTb" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bTc" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bTd" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/photocopier,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/hor)
"bTe" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/space)
"bTe" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/toxins/mixing)
"bTf" = (/turf/simulated/shuttle/wall{icon_state = "swall_s6"; dir = 2},/area/shuttle/mining/station)
"bTg" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/mining/station)
"bTh" = (/obj/structure/window/full/shuttle,/obj/structure/grille,/turf/simulated/shuttle/plating,/area/shuttle/mining/station)
@@ -5105,7 +5105,7 @@
"bUi" = (/obj/machinery/r_n_d/server/core,/obj/machinery/atmospherics/pipe/simple/heat_exchanging{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"bUj" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/bluegrid{name = "Server Base"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"bUk" = (/obj/machinery/atmospherics/pipe/simple/heat_exchanging{dir = 9},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Server Walkway"; nitrogen = 250; oxygen = 0; temperature = 0},/area/toxins/server_coldroom)
"bUl" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/server)
"bUl" = (/obj/effect/spawner/window/reinforced,/obj/structure/sign/securearea{desc = "A warning sign which reads 'SERVER ROOM'."; name = "SERVER ROOM"; pixel_y = -32},/turf/simulated/floor/plating,/area/toxins/server)
"bUm" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bUn" = (/obj/machinery/computer/rdservercontrol,/obj/machinery/light_switch{pixel_y = -23},/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
"bUo" = (/obj/machinery/computer/message_monitor,/turf/simulated/floor{icon_state = "dark"},/area/toxins/server)
@@ -5237,8 +5237,8 @@
"bWK" = (/obj/machinery/door/airlock/glass{name = "Central Access"},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bWL" = (/obj/structure/closet/jcloset,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/turf/simulated/floor,/area/janitor)
"bWM" = (/obj/structure/closet/l3closet/janitor,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/obj/machinery/alarm{frequency = 1439; pixel_y = 23},/turf/simulated/floor,/area/janitor)
"bWN" = (/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/obj/machinery/camera{c_tag = "Custodial Closet"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor,/area/janitor)
"bWO" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/turf/simulated/floor,/area/janitor)
"bWN" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/obj/machinery/newscaster{pixel_y = 30},/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor,/area/janitor)
"bWO" = (/obj/machinery/camera{c_tag = "Custodial Closet"; network = list("SS13")},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/structure/stool/bed/chair/janicart,/turf/simulated/floor,/area/janitor)
"bWP" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/janitor)
"bWQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/reagent_dispensers/spacecleanertank{pixel_y = 30},/turf/simulated/floor,/area/janitor)
"bWR" = (/obj/machinery/door/window/westleft{name = "Janitoral Delivery"; req_access_txt = "26"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "delivery"},/area/janitor)
@@ -5395,7 +5395,7 @@
"bZM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft)
"bZN" = (/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor,/area/hallway/primary/aft)
"bZO" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft)
"bZP" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor)
"bZP" = (/obj/structure/table,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/requests_console{department = "Janitorial"; name = "Janitor Requests Console"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/key/janitor,/turf/simulated/floor,/area/janitor)
"bZQ" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor,/area/janitor)
"bZR" = (/obj/machinery/light,/obj/structure/janitorialcart,/turf/simulated/floor,/area/janitor)
"bZS" = (/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/restraints/legcuffs/beartrap,/obj/item/weapon/storage/box/mousetraps,/obj/item/weapon/storage/box/mousetraps,/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor,/area/janitor)
@@ -6696,10 +6696,10 @@
"cyN" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cyP" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology)
"cyQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyQ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/plating,/area/medical/virology)
"cyR" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyS" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/medical/virology)
"cyT" = (/obj/effect/spawner/window/reinforced,/turf/simulated/floor/plating,/area/medical/virology)
"cyU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/wall/r_wall,/area/medical/surgery)
"cyV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cyW" = (/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -6767,7 +6767,7 @@
"cAg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/turf/simulated/floor/engine,/area/toxins/test_chamber)
"cAh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint)
"cAi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 1; icon_state = "whitegreen"},/area/toxins/xenobiology)
"cAj" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/space)
"cAj" = (/obj/machinery/atmospherics/unary/outlet_injector/on,/turf/simulated/floor/plating/airless,/area/maintenance/incinerator)
"cAk" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port)
"cAl" = (/obj/item/weapon/pen,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
"cAm" = (/obj/machinery/atmospherics/unary/vent_pump{on = 0},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line)
@@ -6965,12 +6965,12 @@
"cDW" = (/obj/machinery/disease2/incubator{name = "Pathogenic incubator"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cDX" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cDY" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cDZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cDZ" = (/obj/effect/spawner/window/reinforced,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor/plating,/area/medical/virology)
"cEa" = (/obj/structure/table,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEb" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEc" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEd" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2)
"cEe" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEe" = (/obj/structure/table/glass,/obj/structure/reagent_dispensers/virusfood{pixel_x = -30},/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/weapon/reagent_containers/dropper,/obj/item/weapon/reagent_containers/dropper/precision,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/item/weapon/storage/fancy/vials,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEf" = (/obj/structure/table,/obj/item/weapon/storage/lockbox/vials,/obj/item/weapon/hand_labeler{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEg" = (/obj/structure/closet/secure_closet/personal/patient,/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cEh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint)
@@ -7210,7 +7210,7 @@
"cIH" = (/obj/machinery/alarm{pixel_y = 25; target_temperature = 283.15},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cII" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
"cIJ" = (/obj/structure/flora/kirbyplants,/obj/item/device/radio/intercom{dir = 8; name = "station intercom (General)"; pixel_x = -28},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
"cIK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/space)
"cIK" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/toxins/test_chamber)
"cIL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/binary/valve/digital{color = ""; dir = 4; name = "Gas Mix Outlet Valve"},/turf/simulated/floor,/area/atmos/distribution)
"cIM" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor{dir = 5; icon_state = "green"},/area/atmos/distribution)
"cIN" = (/obj/machinery/iv_drip,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology)
@@ -8004,7 +8004,7 @@
"cXV" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/turf/simulated/floor,/area/aisat/maintenance)
"cXW" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = 27},/turf/simulated/floor,/area/aisat/maintenance)
"cXX" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall,/area/aisat/maintenance)
"cXY" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating,/area/space)
"cXY" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating/airless,/area/toxins/xenobiology)
"cXZ" = (/obj/structure/lattice,/obj/structure/window/reinforced{dir = 1},/turf/space,/area/space)
"cYa" = (/obj/machinery/atmospherics/unary/portables_connector{dir = 1},/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor{dir = 10; icon_state = "yellow"},/area/aisat/maintenance)
"cYb" = (/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50; pixel_x = 3; pixel_y = 3},/turf/simulated/floor{dir = 2; icon_state = "yellow"},/area/aisat/maintenance)
@@ -8217,6 +8217,7 @@
"dca" = (/obj/structure/table/glass,/obj/machinery/computer/med_data/laptop,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1},/obj/machinery/door_control{id = "medprivacyc"; name = "Privacy Shutters"; pixel_y = -30},/turf/simulated/floor{dir = 6; icon_state = "whitered"},/area/medical/patient_c)
"dcb" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 8; icon_state = "bluecorner"},/area/medical/patients_rooms)
"dcc" = (/obj/machinery/light,/obj/structure/flora/kirbyplants,/turf/simulated/floor{dir = 10; icon_state = "blue"},/area/medical/patients_rooms)
"dcd" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/turbine)
"dce" = (/obj/machinery/light_switch{pixel_x = -24; pixel_y = 4},/turf/simulated/floor{icon_state = "blue"; dir = 8},/area/medical/patients_rooms)
"dcf" = (/obj/machinery/power/apc{dir = 4; cell_type = 15000; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 4; icon_state = "blue"},/area/medical/patients_rooms)
"dcg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/medical/patients_rooms)
@@ -8232,6 +8233,8 @@
"dcq" = (/obj/effect/decal/warning_stripes/south,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/medical/patients_rooms)
"dcr" = (/obj/structure/closet/l3closet,/obj/machinery/light{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology)
"dcs" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/turf/simulated/floor{dir = 6; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/medical/virology)
"dct" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 1},/turf/simulated/floor/plating/airless,/area/maintenance/asmaint)
"dcu" = (/obj/structure/window/reinforced{dir = 1},/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1443; icon_state = "on"; id = "air_in"; on = 1},/turf/simulated/floor/plating,/area/aisat/maintenance)
(1,1,1) = {"
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8298,9 +8301,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgacNacOacPacQacRacSacCaalacEacEacTacUacVacEacEacEaaaaaaaaaaaaabKacGactacWacXacYacXacXacZactadaadaadaadaadaadaabLadbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacgacgacgacgacgacgadcaddacEacEadeadfadgadhadiacEacEaaaaaaaaaaaaaaaabKactadjadkadladmadnadoactadpadqadradsadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadwadxadyadzadAadwadBadCacEadDadEadFadGadHadIadJacEaaaaaaaaaaaaaaaaaaactadKadLadMadNacXadOactadPadtadtadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaajaajaajaajaajaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQadQadQadQadQadRadSadTadUadwachacdacEadVadWadXadGadYadZaeaacEaaaaaaaaaaaaaaaaebactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAaaaaaaabAabAabAabAabAabAabAaaaaaaabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQaekaelaemadQaenaeoaepaepaeqaeracCacEaesadWadXaetadYadZaeuacEaaaaaaaaaaaaaaaaaaactaevadLaewadNacXaexactaeyadtadtadtadtaezadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeAaeAaeAaeAaeAaeAaeAaeAaaaadQaeBaeCaeDaeEaeFaeGaeFaeHaeqacSacCacEacEaeIaeJaeKaeLaeMacEacEaaaaaaaaaaaaaaaaaaactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQadQadQadQadQadRadSadTadUadwachacdacEadVadWadXaetadYadZaeaacEaaaaaaaaaaaaaaaaebactaecaedaeeaefaegaehactaeiadtaejadtadtaduadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAaaaaaaabAabAabAabAabAabAabAaaaaaaabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadQaekaelaemadQaenaeoaepaepaeqaeracCacEaesadWadXaeKadYadZaeuacEaaaaaaaaaaaaaaaaaaactaevadLaewadNacXaexactaeyadtadtadtadtaezadvaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaJaaJaaJaaJaaJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeAaeAaeAaeAaeAaeAaeAaeAaaaadQaeBaeCaeDaeEaeFaeGaeFaeHaeqacSacCacEacEaeIaeJbPfaeLaeMacEacEaaaaaaaaaaaaaaaaaaactaeNaeOaePacXaeQaeRactaeSaeTaeUaeUaeVadaabLabWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAaeWaeXaeYaeAaeZaeXafaaeAaaaadQafbafcafdadQadwafeadwadwadwaffafgaalacEafhafiafjafkaflacEafmafmafmafmafmafmafmactafnafoafpafqafractactafsaftafuafuafwadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaafxafxafxacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAafyafzafAaeAafyafzafAaeAaaaadQafBafCafDafEafFafGafHafIafJafKafLafMacEacEafNafOafPacEacEafmafQafRafSafTafUafVafWafXafYafZagaagaagbagcagdageagfaggaghadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaafxaaaaabaaaagiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaeAagjafAagkaeAaglafAagmaeAaaaadQadQadQadQadQagnagoagpagqagragsagtaguagvagwagxagyagzagAagBagCagDagEagFagFagFagGagHagIagJagFagFagFagFagKafuagLagMagNagOagPaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagQaabagRaabagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabAabAabAabAabAabAabAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8375,12 +8378,12 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbKnbAebFqbAebAebAebAebAebyvbAfbICbKobngbKpbpIbKqbKrbpIbKsbpHbpIbpIbKtbtLbDXbvvbIIbHlbHmbCpbKubKvbKwbKxbKybKzbKAbKBbKCbKDbwXbKEbKFbwXbwYbwYbKGbHybKHbKIbKJbKKbKLbKLbKMbKNbKObvvbKPbucbEybKQbEubKRbKSbEybJkbKTbKUbKVbKWbKXbKYbKUbJkbKZbLabLbbLbbLbbLcbLbbLdbLdbLebLfbLgbLhbLhbLibLgbLgbLhbLhbLjbLkbLjbLjbxGbxGbxGbxGbxGbLlbLmbBobxGbLnbLobLpbLqbLqbLrbLsbLtbLubLvbLwbLxbLybLzbLAbLAbLBbJVbLCbEXbLDbLDbLDbLEbEXbLFaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabmObmObmObmObmObmObmObmObmOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbIzbIAbIzbFobLGbLHbAebAebAebLGbAebyvbAfbICbLIbngbLJbpIbAibFvbpIbnmbLKbpIbpIbLLbtLbDXbvvbLMbHlbLNbCpbLObLPbLQbLRbLSbKzbLTbLUbLVbLWbLXbLYbLZbMaaaaaaaaaabHybMbbMcbMdbMdbMebMfbMgbHybMhbMibFXbMjbMkbMlbMmbMnbMobMpbMqbJlbMrbMsbMtbMubMvbMrbJkbKZbMwbMxbMybMzbMAbMBbLdbMCbMDbMEbLgbMFbMGbMHbMIbMJbMKbMLbKabMMbLqbLqbMNbMObLqbMPbMQbMRbMSbMTbLqbMUbMVbMWbMXbMYbMZbNabNbbNabNabNabIwbEXbEXbIxbIxbEXbNcbNdbNebNfbNgbNhbNibLDaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbNjbNkbNjbNlbNmbNnbNnbNnbNnbNnbNobNpbNqbICbNrbngbNsbNtbNubNvbNwbNxbNybNybNybNzbNzbNAbvvbNBbNCbHmbCpbNDbNEbNFbKvbNGbKzbNHbNIbNJbNKbNLbFNbNMbMaaaaaaaaaabHybNNbNObNPbNQbMebMfbMgbHybNRbNSbNTbNUbNVbNWbNXbNYbNZbOabObbOcbKUbKUbOdbOebKUbKUbJkbKZbOfbOgbOhbOibOjbOkbLdbOlbOmbOnbOobOpbOqbOrbOrbOsbOtbOubOvbOwbJVbJVbOxbJVbOybJVbOzbJVbOAbOBbOBbOCbODbOEbOFbOGbOHbOIbOJbOKbOLbNabOMbONaaaaaaaaabEXbOObOPbOQbORbOSbOTbOUbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebPfbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybPibvvbPjbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONaaaaaaaaabEXbQebQfbEXbKjbEXbEXbKjbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQbFnbBRbBRbngbngbBRbBRbBRbBRbBRbngbngbBRbBRbBRbngbOVbOVbOVbOWbOVbNzbOXbOYbOZbPabNzbDXbvvbPbbPcbPcbCpbCpbCpbCpbCpbPdbKzbISbIRbPebNKbPgbPhbMabMabvjbvjbvjbHybHzbHybHybHybHybHybHybHybPibvvbPjbPkbPlbPmbPnbPlbPlbPobPpbPqbPrbPsbPtbPubPvbPwbMqbPxbPybPzbPAbPBbPCbPDbPEbPFbPGbPHbPIbPJbPKbPLbMHbPMbLhbLhbPNbPObPNbPPbPQbPPbPPbPPbPRbPSbPTbPTbPUbPVbPWbPXbOFbPYbPZbQabQbbQcbQdbNabOMbONaaaaaaaaabEXbQebQfbEXbKjbEXbEXbKjbEXaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabQgaabaaaaaaaaaaaabOVbQhbQibQjbQkbNzbQlbQmbQnbQobNzbDXbvvbQpbQqbQrbQsbQtbQubQvbQwbQxbQybQzbQAbQBbQCbQDbQEbQFbQGbQHbQIbQJbQKbQLbQMbQNbubbQObvvbQPbQQbQRbvvbQSbPlbQTbQUbQVbQWbQXbJkbQYbQZbRabRbbRcbRdbRebRfbRgbRhbRibLbbRjbOibRkbRlbRmbRnbRobRpbLgbRqbMHbMHbMHbRrbLhbPNbRsbRtbRubRvbRwbRxbRybPPbRzbRAbRBbPTbPTbRCbPWbRDbREbRFbRGbRHbRIbRJbRKbNabRLbwoaaaaaaaaabEXbEXbEXbEXaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabOVbRMbRNbRObRPbNybRQbRRbRSbRTbNzbDXbRUbRVbvvbvvbFXbRWbubbQNbQMbRXbRYbRXbRZbSabSabSbbScbSdbSabSabSebSabSfbSabQMbQNbubbSgbShbSibSjbSkbSlbvvbPlbSmbQUbSnbSobSpbJkbSqbSrbSsbStbSubSvbSwbSxbJkbSybSzbLbbSAbSBbSBbSCbSDbSEbSFbSGbLgbSHbSIbMHbSJbSKbLhbPNbSLbSMbSNbSObSPbSQbSRbPPbSSbRAbSTbSTbPTbSUbSVbSWbSXbSYbSZbTabTbbTcbTdbNabOMbwobTeaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabBQbBQbBQbBQbBQaaaaaaaaaaaaaaaaaaaaaaaabTfbTgbThbTgbTiaaaaaaaaabOVbOVbTjbTkbRObTlbNybTmbQnbTnbTobNzbDXbTpbTqbTrbTsbTtbTubTvbTwbTxbTybTzbTAbTBbTCbTCbTDbTEbTEbTEbTEbTEbTEbTFbTGbTHbTIbTJbTKbTsbTLbTMbTNbTObTPbPlbTQbQUbQVbTRbSpbJkbSqbSrbTSbTTbTUbTVbTWbTXbJsbTYbTZbLbbLbbUabUabLbbSDbLdbUbbUcbLgbUdbUebUfbUgbUhbLhbPNbUibUjbUkbUlbUmbUnbUobPPbUpbRAbSTbSTbPTbUqbUrbUsbUtbUubUvbUwbUxbUybUzbNabOMbUAbUBbUAbUCbUDbUCbUCbUCaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUEbUFbUGbUHbUEbUIbUIbUIbOVbUJbUKbULbUMbUNbUObUPbUQbUQbURbNzbUSbUTbUUbUVbUVbUWbUXbUYbUVbUZbUZbVabVbbVcbUZbUZbVdbQMbQMbVebVfbVfbVfbVgbVhbVfbVfbVibVjbVkbVkbVlbVkbVmbVnbVkbVobVpbVqbPlbVrbVsbSqbVtbVubVvbVwbVxbVybVubJkbSybVzbVAbVBbVCbVDbVEbVFbVGbVHbVIbVJbVKbVLbVMbVNbVObLhbPNbPNbVPbVQbVRbVSbVRbVTbPPbVUbVVbVWbVWbPTbVXbVYbVZbNabNabNabNabNabNabNabNabOMbUAbWabWbbWcbWdbWdbWebUCaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbWfbWfbWfbWfbWgbWgbWhbWhbWhbWhbWiaabaabaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWjbWkbWjbThbUIbWlbWmbWnbWobWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZbWDbWEbWFbWGbWHbUZbWIbWJbWKbVfbWLbWMbWNbWObWPbWQbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXVbXWbUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWjbWkbWjbThbUIbWlbWmbWnbWobWpbWqbWrbWsbNzbWtbWubWvbWwbNzbUTbUTbWxbUVbWybWzbWAbWBbWCbUZbWDbWEbWFbWGbWHbUZbWIbWJbWKbVfbWLbWMbWObWNbWPbWQbWRbWSbWTbWUbWVbWWbWXbWYbWZbXabXbbXcbXdbXebXfbXgbXhbSrbXibXjbXkbXlbXmbXnbJsbXobXpbXqbXrbVDbXsbXsbXtbXubLgbXvbXwbXxbXybXzbXAbXBbLhbXCbXDbXEbXFbXEbXEbXGbXHbXIbXJbXKbXLbXMbPTbXNbXObPXbEXbxXbXPbXQbXRbXRbXQbXRbXSbUAbXTbXUbWcbWdbXVbXWbUCaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWfbXXbXYbXXbWgbWhbWhbXZbYabXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabUEbYbbWjbWjbYcbYdbTkbYebYfbYgbTkbWqbYhbYibNzbNzbNzbNzbNzbNzbYjbUTbYkbYlbYmbYnbYnbYnbYobUZbYpbYqbYqbYqbYrbYsbYtbYubYvbYwbYxbYybYzbYAbYBbYCbVfbVibYDbVkbYEbYFbYGbYHbYIbVkbSmbQVbSnbSobYJbYKbYLbYMbYNbYObYPbYQbYRbVubYSbYTbYUbYVbYWbYXbYYbYZbZabZbbLgbLgbLgbLgbLgbZcbZdbZebLhbZfbXEbXEbZgbZhbXEbZibZjbZkbZlbRAbZmbZmbPTbPVbZnbPXbEXbUAbZobUAbUAbUAbUAbUAbUAbUAbZpbZqbUCbZrbZsbZtbUCaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacaacbZubXXbXXbZvbWhbWhbXZbXZbZwbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabThbWkbWkbWkbThbUIbZxbZybZzbZAbTkbZBbZCbZDbZEbZFbZFbZFbZGbUTbUTbUTbWxbUVbZHbYnbZIbYnbZJbUZbYpbYqbZKbYqbZLbUZbZMbZNbZObVfbZPbZQbZRbZSbZTbZUbZVbZWbZXbZYbZZcaacabcaccadbVkbTQbQVbQVcaebYJbYKcafcagcahbXjcaicajcakcalcamcancaocapcaqcarcascasbXscatbVAcaucavcawcaxcaycazcaAbZjbZfcaBbXEbXEbXEcaCcaDbZjbZkcaEbRAbZmbZmbPTcaFcaGbPXbEXcaHcaIcaJbUAcaKcaLcaMcaNcaOcaPcaQbUCcaRcaScaTbUCbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaacaUbWhbZubWhbWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbFlaaaaaaaaaaaaaaaaaaaaaaaaaaabFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmbFmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaabUEcaVcaWcaXbUEbUIbUIbUIbOVcaYcaZcaZcaZbOVbOVbUTcbacbacbbcbcbUTcbdcbebUVbZHbYnbYnbYncbfbUZbYpbYqbYqcbgcbhcbicbjcbkcblbVfbVfbVfbVfbVfcbmbVfbVfcbncbobVkbVkcbpbVkbVnbVkbVkbPlcbqcbqbPlbPlcbrcbscbtcbucbvcbwcbxcbycbzcbAcbBcaocapcbCcbDcbEcbFcbGcbHbVAcbIcbJcbKcbLcbMcbNcbOcbPcbQcbPcbRcbRcbRcbPcbScbPcbPcbTcbUbZmbZmbPTcbVbZnbPXcbWcbXcbYcbZccaccbccccccccdcceccfccgcchcciccjcckcclccmccnccoccpccqccrccscctaabaabaabaabaabaabaabaabaaaaaaaaaaaaaaabWgbWhccuccvccvbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8389,7 +8392,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabFlbFlbFlbFlbFlbFlbFlbFlbF
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcfPcfQcfRbUTcfSbUVcfTcfUcfVbZHcfWcfXcfYbYpcfZcgacgbcfXcgccgdcgecgfcgfcggcghcgicgjcgkcglcgmbGycgnbVicgobGybGycgpcgqcgrcgscgtceQcgucgvcgwcgxcgycgzcgAcgBcgCcgzcgzcgDcgEcgEcgEcgEcgEcgGcgFcgHcgJcgJcgKcgLcgMcgNcgOcgPcbPcgQcgRcgScgTcgScgUcgVcfrcgWcgXcgYbBxcgZbBxcfybZnbBxbEXchachbchcbUAbUAbUAbUAbUAchdcdUchechfcfIcdUchgcdUbZpcdUchhbUAchichjchkbUAaabaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhchlchlchlchlchlchlchmbXZchnchlcfObXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejchochpchqbUTcfSchrchrchrchrchrchrbUZbUZbUZbUZbUZbUZbUZchschtchuchvchwchxchychychzchAcglbGybGychBchCchDbGybGybGychEchFchGceOchHchIchJcgEchKchLchMbSqchLchNcfdcfdcfdcfdcfdcfdcfdcfdcfdcgIbSqchOchPchQchRchSchTchUchVcbPchWchXcfrchYcfrchZciacibciccidciecifbBxcigcfybZncihbEXbFeciicijcikbwobxXbxXbUAcilcimcinciocipciqcirciscitciucivbUAciwcixciycizaacaacaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaciAbXXbXXbXXbXXbXXbXXbXXciBciCbXZbXZbXZbXZciDbYabWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacejcejcejcejbUTcfScejaaaaaaaaaaaaciEciFciGciHciIciJciKciLciMciNciOciPciQciRciSciSciTciUciVciWciWciWciWciXciWbGybGybPlciYciZcjacjbcjccjdchScjecjfcjgcjhcjicjjcjkcfdcfdcjlcjpcjpcjpcjpckNclSckUcjqcjqcjrcjscjtcbAcjucjvcbPcjwcjxcjycjzcjAcfrcjBcbPcbPbEXcjCbEXbEXbEXcjDcjEcjFbEXbxXciicjGcjHbwobwobwobUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAbUAaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaabWhccvccvccvccvccvccvcjIbXZccuccvcjJbXZbXZbXZbXZbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabTeaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAjaaaaabaabcjKcjKcjKcjKcjKcjKcjLcjKbUTcelcjMaaacjNcjOcjPcjQcjRcjScjTcjUcjVcjWcjXcjYcjZckackbckcckdckeckfckgckhciVckickjckjckjckkciWbGybGycklcklcklcklckmcklckncknckocklcklckpcklckqckrckscktcksclZaPKcmacmmcmlcmocmnckzckAckBckCckDckEckFcdccbPcbPckGcbPckHcbPckIckJckKcgnckLckMckvckOckPckQckRckSckPbxXciickTbxXbxXckVckWckXchabxXbxXbxXbxXbxXbxXbxXckYckZbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbXZbXZbXZbXZbXZbXZcfNbXZcjJbXZbXZbXZbXZbXZbWhbWhaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaclaclbclbclbclccldcleclfclgclhclicjLcljcelcjMaaaclkcllclmclnclocjSclpclqclrclsciLcltcgdcbkciPcluchyclvchyclwclxclyclzclAclAclAclBciWbGybGycklclCclDclEclFclGclHclHclIclJclKclLclMclNclOclPcfhcfhcmpcmrcmqctbcsZcuoctcckDclVclWclXckzclYcmtcmscmbcmbcmccmdcmecmfcmgcmhcmfcmfcmfcmicmfcmfcmjcmucnpcnlcqRcoXcrGcqScrHcrHcrIcrHcrHcrHcrHcrJcrKcrHcrHcrHcrMcmvbxXbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabWhbWhceibXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacmwcmxcmxcmxcmxcmycmzcmAcmBcmCcmCcmDcjKcmEcfScjMaaaclkcmFcmGcmHcmIcmJcmKcmLcmIcmIcmMcmNcmOcmPcmQcmQcmRcmSchycmTcmUclyclAclAclAclAcmVciWbGybGycklcmWcmXcmYcmZcnacnbcnbcnccndcnecnfcngcnhcklcnicfdcnjcjpcwscvxcwEcwCcxNcxIckDcnmcnncnockDbJGcumctecnqcnqcnqcnqcnqcnrcnscntcnucnvcnvcnwcnwcnvcnxcnycnzcnAcnBcnCcnDcnEcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcnCcuncnFcnGbONaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaUbWhbWhchlchlbXZbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacnHcnIcnJcnKcnJcnLcnMcnNcnOcnPcnQcjKcnRcelcjMaaaclkcnScnTcnUcnVcjScnWcnXcnYcnZciLcltcgdcoacobcgfcoccodciPciPciPcoecofclAclAcogcohciWbGycoicklcojcokcolcomcomcomconcoocomcomcopcolcoqcorcoscfdcotcjpcxVcxUcxVcxVcxNcEickDcowcoxcoyckDcozcuscoicoAcoAcoAcoAcoAcoBcoCcoDcoAcoAaaaaaaaaaaaackPcoEcoFcoGcnCcoHcoIcoJcoKcoLcoMcoNcoOcoPcoQcoRcoScoTcoUcnCcuncoWcvtcoYcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcoZcpacpbbWhbZubWhbXZbXZbXZbXZbXZbXZbXZbWhbWhaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8406,7 +8409,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaacGaaaczocAkczqaaaczocAkczqaaaczocAkczqaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabczscwWcwXcztcAlcxjcAmcAncAocAocyjcxjcztcApcxjcxjcxjcxjcAqcArcAscAtbZNcAucAvcAwcAxcAycxsczBcAzcAAcxscABctWcsOcACcsLcADcAEcAFcAGcAHcAIcAJcAGcAKcAGcAGcAGcoAcoAcoAcoAcoAcoAcoAcoAcEhcoAaaaaaaaaaaaadcidcodcqdcpdbycgmcFdbVicFmcFlcFlcFnbGycoAaaaaaackPcwtcwucwvcAQcARczbcAScATcAUcFrcIScAXcGscIScGtckPaaaaaacwGcwGcBbcCrcBdcwGcwGbwobxXcGycyJcyJcyJbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaahaaaaaaaaaafxaabczocAkczqaaaczocAkczqaabczocAkczqaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaaczscwWcvKcBecxjcBfcBgcBhcBicBjcBicBkcBicBlcBmcxfcBncztcztczxcBocBpcBqcBrcBscBtcBucBvcBwcBxcBycBzcBAcBBcBCcBDcBDcBEcBFcBGcBHcBIcBJcBKcBLcBMcHscBOcHucHtcDPcDPcDPcDPcDPcDPcHvcoAcEhclUclUclUclUclUclUcjmbEJcjmcFfclUclUcoAcoAcoAcoAcusbGycoAaaaaaackPcxOcBZcxOcCacxRcqUcCbcCccCdcCecqUcqUcCgcqUcChckPaaaaabaabcwGcwGcCscwGcwGaaabwobxXcvzcyJcHycHxbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaaaaaaaaaaaabaaaczocAkczqaabczocAkczqaaaczocAkczqaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacybcCicvKcCjcCkcCkcClcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcvKcCmcCncCmcCocCmcrmcCpcCqcFbcCtcCtcCtcCucCvcBCcCwcCxcCycCzcCAcCBcBIcCCcCDcCEcCFcHzcCHcHAcCJaabcCKcCKcCKcCKcCKcHBcoAcHDcHCcIGcHHcIHctackycjocjnckuckycCScGucupcHwcCScoAcusbGycoAaaaaaackPcxOcxOcxOcAQcCTczbcCUcCVcCWcCXcCZcCZcDacqUcDbckPaabaabaaaaaaaaacIKaaaaaaaaabwobxXcvzcyJbxXbxXbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGacGafxaabaaaczocAkczqaabczocAkczqaaaczocAkczqaabaaaaaaaaaaaaaaaaaaaaaaaaaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtcDucDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcuqczVcuqczVcuqcoAcusbGycoAcoAaaackPcwAcwAcwAcwAcEkcqUcCbcElcEmcCecqUcEncEocEocEpcEqcAjaabaaaaaaaaaaaaaaaaaaaaabwobxXcGybxXbxXcIPbwoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGacGafxaabaaaczocAkczqaabczocAkczqaaaczocAkczqaabaaaaaaaaaaaaaaaaaaaaaaaaaabcDccDdcDdcDdcDdcybcDecwWcDfcDgcDhcDhcDicDjcDkcDlcDlcDlcDlcDmcDncDocDncDncDpcDpcDncDqcDrcDscDtcDtcDucDvcDwcDxcDycDzcDzcDAcDBcDCcDDcDEcDFcCAcDGcBIcDHcDIcDJcDKcILcDMcIMcDOcDPcDQcDRcDScDTcCKcHBcoDcEhclUcvscvqcIOcINcxLckxckwdcrclUcuqczVcuqczVcuqcoAcusbGycoAcoAaaackPcwAcwAcwAcwAcEkcqUcCbcElcEmcCecqUcEncEocEocEpcEqcXYaabaaaaaaaaaaaaaaaaaaaaabwobxXcGybxXbxXcIPbwoaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGaaaaabaaaaabaabcEraabaabaabcEraabaaaaabcEraabaaaaaaaaaaaaaaaaaaaaaaaacDccDccDccEscEtcEucEvcEwcExcEycDfcDfcEzcEAcvKcvKcEBcECcECcECcECcEDcEEcEFcEEcEEcEEcDtcDtcEGcEHcEIcEJcEKcDzcELcDwcDzcDzcDzcDzcEMcBCcENcEOcCycDFcCAcDFcBIcDHcDIcEPcEQcERcEScETcEUaabcEVcEWcDTcEXcCKcHBcoDcHDcHCcxKcxJczVcxMclUcIIclQdcsclUcIQcIRczVcuqcyWclUcusbGycITcoAaaackPcwtcwucwvcFjcARczbcFkcJJcJIcJKcJKcFocFpcFqcJLckPaabaabaabaaaaaaaaaaaaaaaaaabwocJMcvzbwobwobwobwobwoaabaabaabcJNcJNcJNcJNcJNcJNaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaafxaabcFscFtcFtcFucFvcFwcFwcFwcFvcFwcFwcFwcFvcFwcFwcFxcFtcFtcFtcFtcFtcFycFzcFAcFBcFCcFDcFEcFFcFGcfRcwWcFHcDfcvKcvKcvKcFIcEBcECcFJcFKcFLcFMcFNcFOcFPcFQcFRcFScFTcFUcFVcFWcFXcFScFYcFZcDwcGacDzcDzcDzcGbcBCcGccGccDFcGdcGecGfcGgcGhcGicGjcGkcGlcGmcGncDOcGocDQcGpcDTcDTcCKcHBcoDcEhclUcyMcyLcyNcFfclUcnkclTcFfclUcyQcyScyRcyTcyTclUcusbGycJOcoAaaackPcxOcxPcxOcGAcxRcqUcGBcJPcGCcqUcqUcGDcwAcwAcwAckPaaaaaaaabaabaaaaaaaaaaaaaaabwocyKcvzbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyacyacyacyacyacyacyacyacyaaaaaaaaaaacGaaaaabaaaaabaabcGFaabaaaaabcGFaabaaaaabcGFaabaaaaaaaaaaaaaaaaaaaaaaaacDccDccDccGGcGHcGIcDdcGJcfRcGKcExcExcExcExcGLcExcFGcECcGMcGNcGOcGPcGQcGRcGScGTcGUcGVcGWcGXcGYcGZcHacHbcFYcELcDwcHccHdcDzcDzcHecBCcHfcHgcDFcHhcCAcHicHjcHkcHlcHmcHncHocHpcHocHqaabcCKcCKcCKcCKcCKcHBcoAcEhclUcIJcyVcyYcyXczNcJQczPczOcJhczQcyLczVczVczSclUcusbGycJRcoAaaackPcxOcxOcxOcFjcHEcHFcHGcJScHIcCZcCZcCZcHJcHKcHLcHMaaaaaaaaaaabaabaaaaaaaaaaaabwobwocvzbwoaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8434,7 +8437,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcECcTncTocSEaaaaaaaabaaaaaaaabaabaabaabaabaaaaaaaabaaaaaacSEcTlcTmcECcTpcECcECcECcECcECaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaidaHdaicYhcoAdaIcFicFidaJdaLdaKcoAcoAcoAaaaaaaaaaaaaaaaaabaaacxHdaodaMcyJcNRbxXbxXdaNcyJdaObxXbxXbxXbxXbxXbxXbxXbwoaabaaaaaaaaaaabaaacuzcvEcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaacQScQScQScQSaaaaaacQScQScQScQScQScQScQSaaaaaacQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaabcECcTdcSEcTPaaaaaacTQaaaaaaaaaaabaaaaaaaaaaaaaaaaabaaaaaacSEcSEcTdcECcMHcTRcTScTTcTUcTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaGcYhdaPdaRdaQdaSaabcoAcoAcoDdaTcoDcoAcoAaaaaabaaaaaaaaaaaaaaaaabaabcxHcxHcxHbwobwobwobxXcyJbwodaUbwobwocNRbFeczfbzNczMbwoaabaaaaaaaaaaabaaacuzcwMcuzaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcECcTXcTYcSEaabaabaabcSQaaaaaacSQaaaaaaaaaaaacSQaabcTZaabcSEcUacUbcECcMHcUccUdcGOcUecTVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaadaGcYhcYhdaVcYhcYhaaaaabaaaaaadaWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaabwodaFdaXbwocGxaabbwobwocxHcxHczMbwoaaaaabaaaaaaaaaaabaaaaaacxZaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECcMHcECcUkcUlcUmcReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacIKazycYhdaYcYhdaZaabaabaaaaaacIKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacECcUfcUgcUhaaaaaaaabaabaabaabaabaabaabaabaabaabaabaaaaaacUicUgcUjcECcMHcECcUkcUlcUmcReaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcdazycYhdaYcYhdaZaabaabaaaaaadctaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaahaaaaaabwodbbdbabwodbcaabaaaaabaaaaaaaabaaaaaaaabaaaaaaaaaaabaaaaaacznaaaaaaaabaaaaabaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacNycECcKDcSkcUhaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaabaaaaaacUicSjcKDcECcECcMHcECcECcECcUncECaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabaabazydbddbedbdazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabaaaaaaaaacxHdbfcxHcxHaabczraaaaabaaaaaaaabaaaagQagQacGaqZaabaabaabaabcGEaabaabaabaabczragiagQagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaacECcECcSkcRScRScRScRScRScRScRScRScRScRScRScRScRScSjcECcECcECcECcTpcECaaaaabcUocUpaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaaaaaaaabaaaaabazyaaaaaaaaaazyaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaacxHdbgcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaaaaaaabaaaaabaaaaaacHNaaaaaaaabaaaaabaaaaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTOcTOcTOcTOcTOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacQScQScQScQScQScQScQSaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaacECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECcECaaacECcECcUqcECaabaabcUrcUscUtcUucUvcUucUtcUucUvcUucUtcUucUvcUucUtcUucUvcUwcUxaaaaabazyazyazyazyazyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaacxHdbhcxHaaaaaaaaaaaaaabaaaaaaaabaaaagQaaacIYcIYcIYcIYcIYaabcIZaabcIYcIYcIYcIYcIYaaaagQaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
@@ -8470,7 +8473,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucWdcVFaaaaabaaacXvcXwcXxcXycXzcXAcXvaaaaaaaaacVucWlcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucWdcXBcVIcXCcXCcXvcXDcXEcXFcXGcXHcXvcVIcVIcVIcXdcWlcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGcVucXIcVRcVRcVRcVRcXJcXKcXLcXMcXNcXOcXPcXQcWacWacWacXRcVFacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaaacWfcWfcWfcWfcWfcXvcXScXTcXUcXVcXWcXXcXYcWfcWfcXZcXZaaaacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGaaacWfcWfcWfcWfcWfcXvcXScXTcXUcXVcXWcXXdcucWfcWfcXZcXZaaaacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacGacGacGacGacGacGacGcXvcYacYbcYccYdcYecXvacGacGacGacGacGacGacGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaacVGcVGcVGcVGcVGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcXvcXvcYfcYfcYfcXvcXvaaaaaaaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacSKcSKcSKcSKcSKcSKcSKcSKcSKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWcTWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+1 -1
View File
@@ -246,7 +246,7 @@
"eL" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/wall/r_wall,/area/research_outpost/power)
"eM" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/floor/plating/airless/asteroid,/area/mine/explored)
"eN" = (/obj/machinery/atmospherics/pipe/simple/visible/purple{dir = 4},/turf/simulated/mineral,/area/mine/explored)
"eO" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating,/area/mine/explored)
"eO" = (/obj/machinery/atmospherics/unary/outlet_injector/on{dir = 8},/turf/simulated/floor/plating,/area/research_outpost/atmos)
"eP" = (/obj/item/stack/rods,/obj/structure/window/reinforced{dir = 4},/obj/item/weapon/shard,/turf/simulated/floor/plating,/area/mine/abandoned)
"eQ" = (/obj/item/stack/rods,/obj/structure/alien/weeds{icon_state = "weeds2"},/turf/simulated/floor/airless{icon_state = "floorscorched1"},/area/mine/abandoned)
"eR" = (/turf/simulated/floor/airless{icon_state = "damaged2"},/area/mine/abandoned)
+6 -3
View File
@@ -41,11 +41,14 @@ Pipelines + Other Objects -> Pipe network
if(!pipe_color_check(pipe_color))
pipe_color = null
..()
/obj/machinery/atmospherics/initialize()
..()
if(can_unwrench)
stored = new(src, make_from = src)
..()
/obj/machinery/atmospherics/Destroy()
for(var/mob/living/M in src) //ventcrawling is serious business
M.remove_ventcrawl()
@@ -210,7 +213,7 @@ Pipelines + Other Objects -> Pipe network
dir = D
initialize_directions = P
var/turf/T = loc
level = T.intact ? 2 : 1
level = T.intact ? 2 : 1
initialize()
var/list/nodes = pipeline_expansion()
for(var/obj/machinery/atmospherics/A in nodes)
@@ -42,6 +42,7 @@
return ..()
/obj/machinery/atmospherics/binary/initialize()
..()
var/node2_connect = dir
var/node1_connect = turn(dir, 180)
@@ -57,6 +57,7 @@
return ..()
/obj/machinery/atmospherics/omni/initialize()
..()
for(var/datum/omni_port/P in ports)
if(P.node || P.mode == 0)
continue
@@ -67,7 +67,7 @@
return ..()
/obj/machinery/atmospherics/trinary/initialize()
..()
//Mixer:
//1 and 2 is input
//Node 3 is output
@@ -78,10 +78,6 @@
//Node 2 is filtered output
//Node 3 is rest output
//If we flip the filter, 1 and 3 shall exchange positions
if(can_unwrench) // Overridden here to avoid having to snowflake the flipped/icon_state on the construction
qdel(stored)
stored = new(src, make_from = src)
var/node1_connect = turn(dir, -180)
var/node2_connect = turn(dir, -90)
@@ -16,6 +16,13 @@
if(!istype(T))
return
add_underlay(T, node, dir)
/obj/machinery/atmospherics/unary/tank/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/analyzer))
atmosanalyzer_scan(air_contents, user)
return
return ..()
/obj/machinery/atmospherics/unary/tank/air
name = "Pressure Tank (Air)"
@@ -23,6 +23,7 @@
return ..()
/obj/machinery/atmospherics/unary/initialize()
..()
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
+1
View File
@@ -62,6 +62,7 @@
overlays += icon_manager.get_atmos_icon("pipe", , pipe_color, "cap" + icon_connect_type)
/obj/machinery/atmospherics/pipe/cap/initialize()
..()
for(var/obj/machinery/atmospherics/target in get_step(src, dir))
if(target.initialize_directions & get_dir(target,src))
var/c = check_connect_types(target,src)
+1
View File
@@ -33,6 +33,7 @@
icon = null
/obj/machinery/atmospherics/pipe/manifold/initialize()
..()
for(var/D in cardinal)
if(D == dir)
continue
+1
View File
@@ -152,6 +152,7 @@
update_icon()
/obj/machinery/atmospherics/pipe/manifold4w/initialize()
..()
for(var/D in cardinal)
for(var/obj/machinery/atmospherics/target in get_step(src, D))
if(target.initialize_directions & get_dir(target,src))
+10
View File
@@ -36,6 +36,16 @@
if(parent && isnull(parent.gcDestroyed))
qdel(parent)
parent = null
/obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user, params)
if(istype(W, /obj/item/device/analyzer))
atmosanalyzer_scan(parent.air, user)
return
if(istype(W,/obj/item/device/pipe_painter))
return
return ..()
/obj/machinery/atmospherics/proc/pipeline_expansion()
return null
@@ -44,6 +44,7 @@
initialize_directions = SOUTH|WEST
/obj/machinery/atmospherics/pipe/simple/initialize()
..()
normalize_dir()
var/N = 2
for(var/D in cardinal)
+1 -1
View File
@@ -334,7 +334,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
/obj/proc/atmosanalyzer_scan(var/datum/gas_mixture/air_contents, mob/user, var/obj/target = src)
var/obj/icon = target
user.visible_message("[user] has used the analyzer on \icon[icon] [target].", "<span class='notice'>You use the analyzer on \icon[icon] [target].</span>")
user.visible_message("[user] has used the analyzer on [target].", "<span class='notice'>You use the analyzer on [target].</span>")
var/pressure = air_contents.return_pressure()
var/total_moles = air_contents.total_moles()
+1
View File
@@ -11,6 +11,7 @@ var/global/list/joblist = list() //list of all jobstypes, minus borg and AI
var/global/list/flag_list = list() //list of flags during Nations gamemode
var/global/list/airlocks = list() //list of all airlocks
var/global/list/singularities = list() //list of all singularities
var/global/list/janitorial_equipment = list() //list of janitorial equipment
var/global/list/aibots = list() // AI controlled bots
var/global/list/table_recipes = list() //list of all table craft recipes
@@ -85,10 +85,20 @@
else if(istype(I, /obj/item/clothing/head/helmet/space/rig))
var/obj/item/clothing/head/helmet/space/rig/R = I
if(R.on)
R.on = 0
R.icon_state = "rig[R.on]-[R._color]"
R.toggle_light()
R.visible_message("<span class='danger'>[R]'s light fades and turns off.</span>")
R.set_light(0)
else if(istype(I, /obj/item/clothing/head/helmet/space/eva/plasmaman))
var/obj/item/clothing/head/helmet/space/eva/plasmaman/P = I
if(P.on)
P.toggle_light()
P.visible_message("<span class='danger'>[P]'s light fades and turns off.</span>")
else if(istype(I, /obj/item/weapon/gun))
var/obj/item/weapon/gun/G = I
if(G.F)
var/obj/item/device/flashlight/F = G.F
if(F.on)
G.toggle_gunlight()
G.visible_message("<span class='danger'>[G]'s light fades and turns off.</span>")
return I.light_range
/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(var/mob/living/H)
@@ -13,6 +13,9 @@ var/list/possibleShadowlingNames = list("U'ruan", "Y`shej", "Nex", "Hel-uae", "N
/obj/effect/proc_holder/spell/targeted/shadowling_hatch/cast(list/targets)
if(usr.stat || !ishuman(usr) || !usr)
return
if(!isturf(usr.loc))
usr << "<span class='warning'>You can't hatch here!</span>"
return
for(var/mob/living/carbon/human/H in targets)
var/hatch_or_no = alert(H,"Are you sure you want to hatch? You cannot undo this!",,"Yes","No")
switch(hatch_or_no)
+1 -1
View File
@@ -294,7 +294,7 @@
title = "Janitor"
flag = JANITOR
department_flag = SUPPORT
total_positions = 1
total_positions = 2
spawn_positions = 1
supervisors = "the head of personnel"
selection_color = "#dddddd"
+1 -2
View File
@@ -493,7 +493,7 @@ var/global/datum/controller/occupations/job_master
if(istype(G) && !G.prescription)
G.prescription = 1
G.name = "prescription [G.name]"
// H.update_icons()
H.regenerate_icons()
H.hud_updateflag |= (1 << ID_HUD)
H.hud_updateflag |= (1 << IMPLOYAL_HUD)
@@ -541,7 +541,6 @@ var/global/datum/controller/occupations/job_master
pda.ownjob = C.assignment
pda.ownrank = C.rank
pda.name = "PDA-[H.real_name] ([pda.ownjob])"
pda.JFLOG("Created")
return 1
+3 -2
View File
@@ -205,8 +205,9 @@
user << "<span class='notice'>You [anchored ? "wrench" : "unwrench"] \the [src].</span>"
return
..()
else if ((istype(W, /obj/item/device/analyzer)) && get_dist(user, src) <= 1)
atmosanalyzer_scan(air_contents, user)
/obj/machinery/portable_atmospherics/scrubber/huge/stationary
name = "Stationary Air Scrubber"
stationary = 1
+21 -36
View File
@@ -35,8 +35,7 @@
#define PIPE_INJECTOR 34
#define PIPE_DVALVE 35
#define PIPE_DP_VENT 36
#define PIPE_PASV_VENT 37
#define PIPE_DTVALVE 38
#define PIPE_DTVALVE 37
/obj/item/pipe
name = "pipe"
@@ -164,7 +163,7 @@
src.color = PIPE_COLOR_RED
else if (pipe_type == PIPE_UNIVERSAL)
connect_types = list(1,2,3)
//src.pipe_dir = get_pipe_dir()
update(make_from)
src.pixel_x = rand(-5, 5)
src.pixel_y = rand(-5, 5)
@@ -275,14 +274,8 @@
src.dir = turn(src.dir, -90)
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_UNIVERSAL, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
dir = 4
else if (pipe_type in list (PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W))
dir = 2
//src.pipe_dir = get_pipe_dir()
fixdir()
return
/obj/item/pipe/verb/flip()
@@ -351,7 +344,7 @@
return dir|flip
if(PIPE_SIMPLE_BENT, PIPE_INSULATED_BENT, PIPE_HE_BENT, PIPE_SUPPLY_BENT, PIPE_SCRUBBERS_BENT)
return dir //dir|acw
if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_PASV_VENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR)
if(PIPE_CONNECTOR, PIPE_UVENT, PIPE_SCRUBBER, PIPE_HEAT_EXCHANGE, PIPE_INJECTOR)
return dir
if(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER)
return dir|flip|cw|acw
@@ -406,22 +399,6 @@
//Helper to clean up dir
/obj/item/pipe/proc/fixdir()
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
else if(dir==8)
dir = 4
/obj/item/pipe/attack_self(mob/user as mob)
return rotate()
/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
//*
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!isturf(src.loc))
return 1
if (pipe_type in list (PIPE_SIMPLE_STRAIGHT, PIPE_SUPPLY_STRAIGHT, PIPE_SCRUBBERS_STRAIGHT, PIPE_HE_STRAIGHT, PIPE_INSULATED_STRAIGHT, PIPE_MVALVE, PIPE_DVALVE))
if(dir==2)
dir = 1
@@ -429,13 +406,27 @@
dir = 4
else if (pipe_type in list(PIPE_MANIFOLD4W, PIPE_SUPPLY_MANIFOLD4W, PIPE_SCRUBBERS_MANIFOLD4W, PIPE_OMNI_MIXER, PIPE_OMNI_FILTER))
dir = 2
/obj/item/pipe/attack_self(mob/user as mob)
return rotate()
/obj/item/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob, params)
..()
if (!istype(W, /obj/item/weapon/wrench))
return ..()
if (!isturf(src.loc))
return 1
fixdir()
var/pipe_dir = get_pipe_dir()
for(var/obj/machinery/atmospherics/M in src.loc)
if((M.initialize_directions & pipe_dir) && M.check_connect_types_construction(M,src)) // matches at least one direction on either type of pipe
user << "\red There is already a pipe of the same type at this location."
user << "<span class='warning'>There is already a pipe of the same type at this location.</span>"
return 1
// no conflicts found
var/obj/machinery/atmospherics/machineReference = null //If somebody wants to overhaul that switch statement below, be my guest. Easier to set a reference here and then transfer logs after the switch statement.
@@ -603,11 +594,6 @@
qdel(src) // remove the pipe item
return
//TODO: DEFERRED
// ensure that setterm() is called for a newly connected pipeline
/obj/item/pipe_meter
name = "meter"
@@ -684,5 +670,4 @@
#undef PIPE_INJECTOR
#undef PIPE_DVALVE
#undef PIPE_DP_VENT
#undef PIPE_PASV_VENT
#undef PIPE_DTVALVE
+1 -2
View File
@@ -20,7 +20,7 @@
<A href='?src=\ref[src];make=20;dir=1'>Pipe Cap</A><BR>
<A href='?src=\ref[src];make=19;dir=1'>4-Way Manifold</A><BR>
<A href='?src=\ref[src];make=18;dir=1'>Manual T-Valve</A><BR>
<A href='?src=\ref[src];make=38;dir=1'>Digital T-Valve</A><BR>
<A href='?src=\ref[src];make=37;dir=1'>Digital T-Valve</A><BR>
<b>Supply pipes:</b><BR>
<A href='?src=\ref[src];make=24;dir=1'>Pipe</A><BR>
<A href='?src=\ref[src];make=25;dir=5'>Bent Pipe</A><BR>
@@ -47,7 +47,6 @@
<A href='?src=\ref[src];make=14;dir=1'>Gas Mixer</A><BR>
<A href='?src=\ref[src];make=34;dir=1'>Air Injector</A><BR>
<A href='?src=\ref[src];make=36;dir=1'>Dual-Port Vent Pump</A><BR>
<A href='?src=\ref[src];make=37;dir=1'>Passive Vent</A><BR>
<b>Heat exchange:</b><BR>
<A href='?src=\ref[src];make=2;dir=1'>Pipe</A><BR>
<A href='?src=\ref[src];make=3;dir=5'>Bent Pipe</A><BR>
+11 -69
View File
@@ -284,7 +284,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(usr.stat == 2)
usr << "You can't do that because you are dead!"
return
JFLOG("AI Showed Message Log")
var/HTML = "<html><head><title>AI PDA Message Log</title></head><body>"
for(var/index in tnote)
if(index["sent"])
@@ -301,7 +300,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if(usr.stat == 2)
usr << "You can't do that because you are dead!"
return
JFLOG("AI Toggled Receiver")
toff = !toff
usr << "<span class='notice'>PDA sender/receiver toggled [(toff ? "Off" : "On")]!</span>"
@@ -314,7 +312,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
usr << "You can't do that because you are dead!"
return
silent=!silent
JFLOG("AI toggled the silent option")
usr << "<span class='notice'>PDA ringer toggled [(silent ? "Off" : "On")]!</span>"
/obj/item/device/pda/ai/can_use()
@@ -325,7 +322,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if ((honkamt > 0) && (prob(60)))//For clown virus.
honkamt--
playsound(loc, 'sound/items/bikehorn.ogg', 30, 1)
JFLOG("[user] PDA honked")
return
@@ -528,15 +524,11 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/attack_self(mob/user as mob)
user.set_machine(src)
if(active_uplink_check(user))
JFLOG("[user] activated a syndicate uplink in their PDA")
return
JFLOG("[user] activated PDA")
ui_interact(user) //NanoUI requires this proc
return
/obj/item/device/pda/Topic(href, href_list)
if (href_list["choice"]!="Return") // We really don't need to see ten thousand return actions.
JFLOG("UI Action >>> HREF|[href] >>> HREF_LIST|[list2json(href_list)]")
if(href_list["cartmenu"] && !isnull(cartridge))
cartridge.Topic(href, href_list)
return 1
@@ -964,7 +956,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if ( can_use(usr) )
if(id)
JFLOG("[usr] removed ID:[id]")
remove_id()
else
usr << "<span class='notice'>This PDA does not have an ID in it.</span>"
@@ -981,7 +972,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
return
if ( can_use(usr) )
JFLOG("[usr] removed pen")
var/obj/item/weapon/pen/O = locate() in src
if(O)
if (istype(loc, /mob))
@@ -1021,7 +1011,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/attackby(obj/item/C as obj, mob/user as mob, params)
..()
if(istype(C, /obj/item/weapon/cartridge) && !cartridge)
JFLOG("[user] inserted Cartridge[cartridge]")
cartridge = C
user.drop_item()
cartridge.loc = src
@@ -1033,7 +1022,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
else if(istype(C, /obj/item/weapon/card/id))
var/obj/item/weapon/card/id/idcard = C
if(!idcard.registered_name)
JFLOG("[user] tried to insert ID:[idcard] but it was rejected.")
user << "<span class='notice'>\The [src] rejects the ID.</span>"
return
if(!owner)
@@ -1042,14 +1030,12 @@ var/global/list/obj/item/device/pda/PDAs = list()
ownrank = idcard.rank
name = "PDA-[owner] ([ownjob])"
user << "<span class='notice'>Card scanned.</span>"
JFLOG("[user] tried to insert ID:[idcard] and it was used to initialize this PDA.")
else
//Basic safety check. If either both objects are held by user or PDA is on ground and card is in hand.
if(((src in user.contents) && (C in user.contents)) || (istype(loc, /turf) && in_range(src, user) && (C in user.contents)) )
if( can_use(user) )//If they can still act.
id_check(user, 2)
user << "<span class='notice'>You put the ID into \the [src]'s slot.</span>"
JFLOG("[user] inserted ID:[idcard].")
updateSelfDialog()//Update self dialog on success.
return //Return in case of failed check or when successful.
updateSelfDialog()//For the non-input related code.
@@ -1058,7 +1044,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
C.loc = src
pai = C
user << "<span class='notice'>You slot \the [C] into [src].</span>"
JFLOG("[user] inserted PAI:[pai]")
nanomanager.update_uis(src) // update all UIs attached to src
else if(istype(C, /obj/item/weapon/pen))
var/obj/item/weapon/pen/O = locate() in src
@@ -1067,7 +1052,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
else
user.drop_item()
C.loc = src
JFLOG("[user] inserted PEN:[C]")
user << "<span class='notice'>You slide \the [C] into \the [src].</span>"
return
@@ -1075,7 +1059,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
if (istype(C, /mob/living/carbon))
switch(scanmode)
if(1)
JFLOG("[user] used the medical scanner on [C]")
for (var/mob/O in viewers(C, null))
O.show_message("\red [user] has analyzed [C]'s vitals!", 1)
@@ -1097,7 +1080,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
user.show_message("\blue \t Limbs are OK.",1)
if(2)
JFLOG("[user] used the fingerprint scanner on [C]")
if (!istype(C:dna, /datum/dna))
user << "\blue No fingerprints found on [C]"
else
@@ -1113,7 +1095,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
user << "\blue Blood type: [C:blood_DNA[blood]]\nDNA: [blood]"
if(4)
JFLOG("[user] used the radiation scanner on [C]")
for (var/mob/O in viewers(C, null))
O.show_message("\red [user] has analyzed [C]'s radiation levels!", 1)
@@ -1128,22 +1109,18 @@ var/global/list/obj/item/device/pda/PDAs = list()
switch(scanmode)
if(3)
JFLOG("[user] used the reagent scanner on [A]")
if(!isobj(A))
return
if(!isnull(A.reagents))
if(A.reagents.reagent_list.len > 0)
var/reagents_length = A.reagents.reagent_list.len
user << "\blue [reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found."
user << "<span class='notice'>[reagents_length] chemical agent[reagents_length > 1 ? "s" : ""] found.</span>"
for (var/re in A.reagents.reagent_list)
user << "\blue \t [re]"
user << "<span class='notice'>\t [re]</span>"
else
user << "\blue No active chemical agents found in [A]."
user << "<span class='notice'>No active chemical agents found in [A].</span>"
else
user << "\blue No significant chemical agents found in [A]."
user << "<span class='notice'>No significant chemical agents found in [A].</span>"
if(5)
JFLOG("[user] used the air analysis scanner on [A]")
if (istype(A, /obj/item/weapon/tank))
var/obj/item/weapon/tank/T = A
atmosanalyzer_scan(T.air_contents, user, T)
@@ -1159,59 +1136,51 @@ var/global/list/obj/item/device/pda/PDAs = list()
else if (istype(A, /obj/item/weapon/flamethrower))
var/obj/item/weapon/flamethrower/T = A
if(T.ptank) atmosanalyzer_scan(T.ptank.air_contents, user, T)
else if (istype(A, /obj/machinery/portable_atmospherics/scrubber/huge))
var/obj/machinery/portable_atmospherics/scrubber/huge/T = A
atmosanalyzer_scan(T.air_contents, user, T)
else if (istype(A, /obj/machinery/atmospherics/unary/tank))
var/obj/machinery/atmospherics/unary/tank/T = A
atmosanalyzer_scan(T.air_contents, user, T)
if (!scanmode && istype(A, /obj/item/weapon/paper) && owner)
JFLOG("[user] used the document scanner on [A]")
// JMO 20140705: Makes scanned document show up properly in the notes. Not pretty for formatted documents,
// as this will clobber the HTML, but at least it lets you scan a document. You can restore the original
// notes by editing the note again. (Was going to allow you to edit, but scanned documents are too long.)
var/raw_scan = (A:info)
var/formatted_scan = ""
// Scrub out the tags (replacing a few formatting ones along the way)
// Find the beginning and end of the first tag.
var/tag_start = findtext(raw_scan,"<")
var/tag_stop = findtext(raw_scan,">")
// Until we run out of complete tags...
while(tag_start&&tag_stop)
var/pre = copytext(raw_scan,1,tag_start) // Get the stuff that comes before the tag
var/tag = lowertext(copytext(raw_scan,tag_start+1,tag_stop)) // Get the tag so we can do intellegent replacement
var/tagend = findtext(tag," ") // Find the first space in the tag if there is one.
// Anything that's before the tag can just be added as is.
formatted_scan = formatted_scan+pre
// If we have a space after the tag (and presumably attributes) just crop that off.
if (tagend)
tag=copytext(tag,1,tagend)
if (tag=="p"||tag=="/p"||tag=="br") // Check if it's I vertical space tag.
formatted_scan=formatted_scan+"<br>" // If so, add some padding in.
raw_scan = copytext(raw_scan,tag_stop+1) // continue on with the stuff after the tag
// Look for the next tag in what's left
tag_start = findtext(raw_scan,"<")
tag_stop = findtext(raw_scan,">")
// Anything that is left in the page. just tack it on to the end as is
formatted_scan=formatted_scan+raw_scan
// If there is something in there already, pad it out.
if (length(note)>0)
note = note + "<br><br>"
// Store the scanned document to the notes
note = "Scanned Document. Edit to restore previous notes/delete scan.<br>----------<br>" + formatted_scan + "<br>"
// notehtml ISN'T set to allow user to get their old notes back. A better implementation would add a "scanned documents"
// feature to the PDA, which would better convey the availability of the feature, but this will work for now.
// Inform the user
user << "\blue Paper scanned and OCRed to notekeeper." //concept of scanning paper copyright brainoblivion 2009
/obj/item/device/pda/proc/explode() //This needs tuning.
if(!src.detonate) return
var/turf/T = get_turf(src.loc)
@@ -1224,12 +1193,10 @@ var/global/list/obj/item/device/pda/PDAs = list()
T.hotspot_expose(700,125)
explosion(T, -1, -1, 2, 3)
JFLOG("Exploded")
qdel(src)
return
/obj/item/device/pda/Destroy()
JFLOG("Destroyed")
PDAs -= src
if (src.id)
src.id.loc = get_turf(src.loc)
@@ -1249,7 +1216,6 @@ var/global/list/obj/item/device/pda/PDAs = list()
M.stop_pulling()
M << "\blue You slipped on the PDA!"
JFLOG("Clown PDA Slipped [M]")
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
M.Stun(8)
M.Weaken(5)
@@ -1310,28 +1276,4 @@ var/global/list/obj/item/device/pda/PDAs = list()
/obj/item/device/pda/emp_act(severity)
for(var/atom/A in src)
A.emp_act(severity)
/**
*
* JFLOG
*
* These functions as well as all the log statements are being used to gather user data for how
* people are using the PDA files with the intent of revising them based on this data.
*
* They are being added on 28/03/2015 and the intent is to remove them in two weeks. If you're
* reading this and it's substantially past that point, you should remove anything marked with
* 'JFLOG'.
*
* All changes should be contained to PDA.dm except the creation function which is contained in
* job_controller.dm.
*
* - Jack Fractal
**/
/obj/item/device/pda/proc/JFLOG_DescribeSelf()
return "([src]|[cartridge ? cartridge.name : "None"])"
/obj/item/device/pda/proc/JFLOG(message as text)
if (config)
log_pda("[JFLOG_DescribeSelf()] >>> [message]")
+7 -7
View File
@@ -174,7 +174,7 @@
/obj/item/weapon/cartridge/rd/initialize()
radio = new /obj/item/radio/integrated/signal(src)
..()
..()
/obj/item/weapon/cartridge/captain
name = "Value-PAK Cartridge"
@@ -191,7 +191,7 @@
/obj/item/weapon/cartridge/captain/initialize()
radio = new /obj/item/radio/integrated/beepsky(src)
..()
..()
/obj/item/weapon/cartridge/supervisor
name = "Easy-Record DELUXE"
@@ -282,7 +282,7 @@
/* Power Monitor (Mode: 43 / 433) */
if(mode==43 || mode==433)
if(mode==43 || mode==433)
values["powermonitors"] = powermonitor_repository.powermonitor_data()
if (powmonitor && !isnull(powmonitor.powernet))
@@ -463,7 +463,7 @@
else
JaniData["user_loc"] = list("x" = 0, "y" = 0)
var/MopData[0]
for(var/obj/item/weapon/mop/M in world)
for(var/obj/item/weapon/mop/M in janitorial_equipment)
var/turf/ml = get_turf(M)
if(ml)
if(ml.z != cl.z)
@@ -476,7 +476,7 @@
var/BucketData[0]
for(var/obj/structure/mopbucket/B in world)
for(var/obj/structure/mopbucket/B in janitorial_equipment)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -488,7 +488,7 @@
BucketData[++BucketData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CbotData[0]
for(var/obj/machinery/bot/cleanbot/B in world)
for(var/obj/machinery/bot/cleanbot/B in aibots)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -500,7 +500,7 @@
if(!CbotData.len)
CbotData[++CbotData.len] = list("x" = 0, "y" = 0, dir=null, status = null)
var/CartData[0]
for(var/obj/structure/stool/bed/chair/cart/janicart/B in world)
for(var/obj/structure/janitorialcart/B in janitorial_equipment)
var/turf/bl = get_turf(B)
if(bl)
if(bl.z != cl.z)
@@ -66,9 +66,9 @@
/obj/item/device/laser_pointer/afterattack(var/atom/target, var/mob/living/user, flag, params)
if(flag) //we're placing the object on a table or in backpack
return
laser_act(target, user)
laser_act(target, user, params)
/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user)
/obj/item/device/laser_pointer/proc/laser_act(var/atom/target, var/mob/living/user, var/params)
if( !(user in (viewers(7,target))) )
return
if (!diode)
@@ -173,12 +173,19 @@
//laser pointer image
icon_state = "pointer_[pointer_icon_state]"
var/list/showto = list()
for(var/mob/M in range(7,targloc))
for(var/mob/M in viewers(7,targloc))
if(M.client)
showto.Add(M.client)
var/image/I = image('icons/obj/projectiles.dmi',targloc,pointer_icon_state,10)
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
var/list/click_params = params2list(params)
if(click_params)
if(click_params["icon-x"])
I.pixel_x = (text2num(click_params["icon-x"]) - 16)
if(click_params["icon-y"])
I.pixel_y = (text2num(click_params["icon-y"]) - 16)
else
I.pixel_x = target.pixel_x + rand(-5,5)
I.pixel_y = target.pixel_y + rand(-5,5)
if(outmsg)
user << outmsg
+13 -7
View File
@@ -1,3 +1,5 @@
#define is_cleanable(A) (istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/rune))
/obj/item/weapon/mop
desc = "The world of janitalia wouldn't be complete without a mop."
name = "mop"
@@ -12,18 +14,22 @@
var/mopping = 0
var/mopcount = 0
var/mopcap = 5
var/mopspeed = 40
var/mopspeed = 30
/obj/item/weapon/mop/New()
create_reagents(mopcap)
janitorial_equipment += src
/obj/item/weapon/mop/Destroy()
janitorial_equipment -= src
return..()
/obj/item/weapon/mop/proc/clean(turf/simulated/A)
if(reagents.has_reagent("water", 1) || reagents.has_reagent("cleaner", 1) || reagents.has_reagent("holywater", 1))
A.clean_blood()
for(var/obj/effect/O in A)
if(istype(O,/obj/effect/decal/cleanable) || istype(O,/obj/effect/overlay) || istype(O,/obj/effect/rune))
if(is_cleanable(O))
qdel(O)
reagents.reaction(A, TOUCH, 10) //10 is the multiplier for the reaction effect. probably needed to wet the floor properly.
reagents.remove_any(1) //reaction() doesn't use up the reagents
@@ -33,20 +39,20 @@
if(!proximity) return
if(reagents.total_volume < 1)
user << "<span class='notice'>Your mop is dry!</span>"
user << "<span class='warning'>Your mop is dry!</span>"
return
var/turf/simulated/turf = A
if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay))
if(is_cleanable(A))
turf = A.loc
A = null
if(istype(turf))
user.visible_message("<span class='warning'>[user] begins to clean \the [turf] with [src].</span>")
user.visible_message("[user] begins to clean \the [turf] with [src].", "<span class='notice'>You begin to clean \the [turf] with [src]...</span>")
if(do_after(user, mopspeed, target = src))
if(do_after(user, src.mopspeed, target = turf))
user << "<span class='notice'>You finish mopping.</span>"
clean(turf)
user << "<span class='notice'>You have finished mopping!</span>"
/obj/effect/attackby(obj/item/I, mob/user, params)
+2 -4
View File
@@ -16,11 +16,9 @@
icon_state = "soapnt"
/obj/item/weapon/soap/deluxe
icon_state = "soapdeluxe"
/obj/item/weapon/soap/deluxe/New()
desc = "A deluxe Waffle Co. brand bar of soap. Smells of comdoms."
cleanspeed = 40 //same speed as mop because deluxe -- captain gets one of these
icon_state = "soapdeluxe"
cleanspeed = 40 //slightly better because deluxe -- captain gets one of these
/obj/item/weapon/soap/syndie
desc = "An untrustworthy bar of soap made of strong chemical agents that dissolve blood faster."
@@ -29,8 +29,8 @@
/obj/item/weapon/storage/bag/trash
name = "trash bag"
desc = "It's the heavy-duty black polymer kind. Time to take out the trash!"
icon = 'icons/obj/trash.dmi'
icon_state = "trashbag0"
icon = 'icons/obj/janitor.dmi'
icon_state = "trashbag"
item_state = "trashbag"
w_class = 4
@@ -46,12 +46,12 @@
/obj/item/weapon/storage/bag/trash/update_icon()
if(contents.len == 0)
icon_state = "trashbag0"
icon_state = "[initial(icon_state)]"
else if(contents.len < 12)
icon_state = "trashbag1"
icon_state = "[initial(icon_state)]1"
else if(contents.len < 21)
icon_state = "trashbag2"
else icon_state = "trashbag3"
icon_state = "[initial(icon_state)]2"
else icon_state = "[initial(icon_state)]3"
/obj/item/weapon/storage/bag/trash/cyborg
@@ -63,6 +63,13 @@
/obj/item/weapon/storage/bag/trash/cyborg/janicart_insert(mob/user, obj/structure/janitorialcart/J)
return
/obj/item/weapon/storage/bag/trash/bluespace
name = "trash bag of holding"
desc = "The latest and greatest in custodial convenience, a trashbag that is capable of holding vast quantities of garbage."
icon_state = "bluetrashbag"
max_combined_w_class = 60
storage_slots = 60
// -----------------------------
// Plastic Bag
@@ -258,8 +258,8 @@
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implantcase/death_alarm(src)
new /obj/item/weapon/implanter(src)
new /obj/item/weapon/implantpad(src)
/obj/item/weapon/storage/box/rxglasses
+161 -221
View File
@@ -1,54 +1,98 @@
/obj/structure/stool/bed/chair/cart/
//old style PIMP-CART
/obj/structure/stool/bed/chair/janicart
name = "janicart"
desc = "A brave janitor cyborg gave its life to produce such an amazing combination of speed and utility."
icon = 'icons/obj/vehicles.dmi'
anchored = 1
icon_state = "pussywagon"
anchored = 0
density = 1
var/empstun = 0
var/health = 100
var/destroyed = 0
var/move_delay = 1
var/keytype = /obj/item/key
var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread
var/obj/item/weapon/storage/bag/trash/mybag = null
var/callme = "pimpin' ride" //how do people refer to it?
var/move_delay = 0
var/floorbuffer = 0
var/keytype = /obj/item/key/janitor
/obj/structure/stool/bed/chair/cart/process()
if(empstun > 0)
empstun--
if(empstun < 0)
empstun = 0
/obj/structure/stool/bed/chair/cart/New()
processing_objects |= src
/obj/structure/stool/bed/chair/janicart/New()
handle_rotation()
/obj/structure/stool/bed/chair/cart/examine(mob/user)
if(..(user, 1))
switch(health)
if(75 to 99)
usr << "\blue It appears slightly dented."
if(40 to 74)
usr << "\red It appears heavily dented."
if(1 to 39)
usr << "\red It appears severely dented."
if((INFINITY * -1) to 0)
usr << "It appears completely unsalvageable"
/obj/structure/stool/bed/chair/janicart/Move(a, b, flag)
..()
if(floorbuffer)
var/turf/tile = loc
if(isturf(tile))
tile.clean_blood()
if (istype(tile, /turf/simulated/floor))
var/turf/simulated/floor/F = tile
F.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(is_cleanable(A))
qdel(A)
/obj/structure/stool/bed/chair/cart/attackby(obj/item/W, mob/user, params)
if (istype(W, /obj/item/weapon/weldingtool))
var/obj/item/weapon/weldingtool/WT = W
if (WT.remove_fuel(0))
if(destroyed)
user << "\red The [src.name] is destroyed beyond repair."
add_fingerprint(user)
user.visible_message("\blue [user] has fixed some of the dents on [src].", "\blue You fix some of the dents on \the [src]")
health += 20
HealthCheck()
else
user << "Need more welding fuel!"
/obj/structure/stool/bed/chair/janicart/examine(mob/user)
..()
if(floorbuffer)
user << "It has been upgraded with a floor buffer."
/obj/structure/stool/bed/chair/janicart/attackby(obj/item/I, mob/user, params)
if(istype(I, keytype))
user << "Hold [I] in one of your hands while you drive this [callme]."
else if(istype(I, /obj/item/weapon/storage/bag/trash))
if(keytype == /obj/item/key/janitor)
if(!user.drop_item())
return
user << "<span class='notice'>You hook the trashbag onto the [callme].</span>"
I.loc = src
mybag = I
else if(istype(I, /obj/item/janiupgrade))
if(keytype == /obj/item/key/janitor)
floorbuffer = 1
qdel(I)
user << "<span class='notice'>You upgrade the [callme] with the floor buffer.</span>"
update_icon()
/obj/structure/stool/bed/chair/janicart/update_icon()
overlays.Cut()
if(mybag)
overlays += "cart_garbage"
if(floorbuffer)
overlays += "cart_buffer"
/obj/structure/stool/bed/chair/janicart/attack_hand(mob/user)
if(mybag)
mybag.loc = get_turf(user)
user.put_in_hands(mybag)
mybag = null
update_icon()
else
..()
/obj/structure/stool/bed/chair/janicart/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle_mob()
if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc))
return
if(istype(W, /obj/item/key))
user << "Hold [W] in one of your hands while you drive this [name]."
step(src, direction)
update_mob()
handle_rotation()
if(istype(src.loc, /turf/simulated))
var/turf/simulated/T = src.loc
if(T.wet == 2) //Lube! Fall off!
playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
buckled_mob.Stun(7)
buckled_mob.Weaken(7)
unbuckle_mob()
step(src, dir)
move_delay = 1
spawn(2)
move_delay = 0
else
user << "<span class='notice'>You'll need the keys in one of your hands to drive this [callme].</span>"
/obj/structure/stool/bed/chair/cart/user_buckle_mob(mob/living/M, mob/user)
/obj/structure/stool/bed/chair/janicart/user_buckle_mob(mob/living/M, mob/user)
if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated
return
for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf.
@@ -59,19 +103,14 @@
..()
update_mob()
/obj/structure/stool/bed/chair/cart/post_buckle_mob(mob/living/M)
update_mob()
return ..()
/obj/structure/stool/bed/chair/janicart/unbuckle_mob()
if(buckled_mob)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 0
..()
/obj/structure/stool/bed/chair/cart/unbuckle_mob()
var/mob/living/M = ..()
if(M)
M.pixel_x = 0
M.pixel_y = 0
return M
/obj/structure/stool/bed/chair/cart/handle_rotation()
if(dir == SOUTH)
/obj/structure/stool/bed/chair/janicart/handle_rotation()
if((dir == SOUTH) || (dir == WEST) || (dir == EAST))
layer = FLY_LAYER
else
layer = OBJ_LAYER
@@ -83,7 +122,8 @@
update_mob()
/obj/structure/stool/bed/chair/cart/proc/update_mob()
/obj/structure/stool/bed/chair/janicart/proc/update_mob()
if(buckled_mob)
buckled_mob.dir = dir
switch(dir)
@@ -91,190 +131,85 @@
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 7
if(WEST)
buckled_mob.pixel_x = 13
buckled_mob.pixel_x = 12
buckled_mob.pixel_y = 7
if(NORTH)
buckled_mob.pixel_x = 0
buckled_mob.pixel_y = 4
if(EAST)
buckled_mob.pixel_x = -13
buckled_mob.pixel_x = -12
buckled_mob.pixel_y = 7
/obj/structure/stool/bed/chair/cart/emp_act(severity)
switch(severity)
if(1)
src.empstun = (rand(5,10))
if(2)
src.empstun = (rand(1,5))
src.visible_message("\red The [src.name]'s motor short circuits!")
spark_system.attach(src)
spark_system.set_up(5, 0, src)
spark_system.start()
/obj/structure/stool/bed/chair/cart/bullet_act(var/obj/item/projectile/Proj)
var/hitrider = 0
if(istype(Proj, /obj/item/projectile/ion))
Proj.on_hit(src, 2)
return
/obj/structure/stool/bed/chair/janicart/bullet_act(obj/item/projectile/Proj)
if(buckled_mob)
if(prob(75))
hitrider = 1
var/act = buckled_mob.bullet_act(Proj)
if(act >= 0)
visible_message("<span class='warning'>[buckled_mob.name] is hit by [Proj]!")
if(istype(Proj, /obj/item/projectile/energy))
unbuckle_mob()
return
if(istype(Proj, /obj/item/projectile/energy/electrode))
if(prob(25))
unbuckle_mob()
visible_message("<span class='warning'>The [src.name] absorbs the [Proj]")
if(!istype(buckled_mob, /mob/living/carbon/human))
return buckled_mob.bullet_act(Proj)
else
var/mob/living/carbon/human/H = buckled_mob
return H.electrocute_act(0, src, 1, 0)
if(!hitrider)
visible_message("<span class='warning'>[Proj] hits the [name]!</span>")
if(!Proj.nodamage && Proj.damage_type == BRUTE || Proj.damage_type == BURN)
health -= Proj.damage
HealthCheck()
/obj/structure/stool/bed/chair/cart/proc/HealthCheck()
if(health > 100) health = 100
if(health <= 0 && !destroyed)
destroyed = 1
density = 0
if(buckled_mob)
unbuckle_mob()
visible_message("<span class='warning'>The [name] explodes!</span>")
explosion(src.loc,-1,0,2,7,10)
icon_state = "pussywagon_destroyed"
/obj/structure/stool/bed/chair/cart/ex_act(severity)
switch (severity)
if(1.0)
health -= 100
if(2.0)
health -= 75
if(3.0)
health -= 45
HealthCheck()
/////////////////////////////////////////////////////////////////////////
/obj/structure/stool/bed/chair/cart/janicart
name = "janicart"
icon_state = "pussywagon"
flags = OPENCONTAINER
//copypaste sorry
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/weapon/storage/bag/trash/mybag = null
/obj/structure/stool/bed/chair/cart/janicart/New()
..()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
/obj/structure/stool/bed/chair/cart/janicart/examine(mob/user)
if(!..(user, 1))
return
user << "\icon[src] This [name] contains [reagents.total_volume] unit\s of [reagents]!"
if(mybag)
user << "\A [mybag] is hanging on the [name]."
/obj/structure/stool/bed/chair/cart/janicart/attackby(obj/item/W, mob/user, params)
..()
if(istype(W, /obj/item/weapon/mop))
if(reagents.total_volume >= 2)
reagents.trans_to(W, 2)
user << "<span class='notice'>You wet the mop in the pimpin' ride.</span>"
playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
if(reagents.total_volume < 1)
user << "<span class='notice'>This pimpin' ride is out of water!</span>"
else if(istype(W, /obj/item/weapon/storage/bag/trash))
user << "<span class='notice'>You hook the trashbag onto the pimpin' ride.</span>"
user.drop_item()
W.loc = src
mybag = W
/obj/structure/stool/bed/chair/cart/janicart/attack_hand(mob/user)
if(mybag)
mybag.loc = get_turf(user)
user.put_in_hands(mybag)
mybag = null
else
..()
/obj/structure/stool/bed/chair/cart/janicart/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed)
unbuckle_mob()
return
if(empstun > 0)
if(user)
user << "\red \the [src] is unresponsive."
return
if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc))
return
step(src, direction)
update_mob()
handle_rotation()
move_delay = 1
spawn(2)
move_delay = 0
else
user << "<span class='notice'>You'll need the keys in one of your hands to drive this pimpin' ride.</span>"
////////////////////////////////////////////////////////////////////////////////////////////////
/obj/structure/stool/bed/chair/cart/ambulance
name = "ambulance"
icon = 'icons/obj/vehicles.dmi'
icon_state = "docwagon"
anchored = 0
density = 1
/var/brightness = 4
/var/strobe = 0
/obj/structure/stool/bed/chair/cart/ambulance/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis || destroyed)
unbuckle_mob()
return
if(empstun > 0)
if(user)
user << "\red \the [src] is unresponsive."
return
if(istype(user.l_hand, keytype) || istype(user.r_hand, keytype))
if(!Process_Spacemove(direction) || !has_gravity(src.loc) || move_delay || !isturf(loc))
return
step(src, direction)
update_mob()
handle_rotation()
move_delay = 1
spawn(2)
move_delay = 0
else
user << "<span class='notice'>You'll need the keys in one of your hands to drive this ambulance.</span>"
buckled_mob.bullet_act(Proj)
/obj/item/key
name = "key"
desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
desc = "A small grey key."
icon = 'icons/obj/vehicles.dmi'
icon_state = "keys"
icon_state = "key"
w_class = 1
/obj/item/key/janitor
desc = "A keyring with a small steel key, and a pink fob reading \"Pussy Wagon\"."
icon_state = "keyjanitor"
/obj/item/key/security
desc = "A keyring with a small steel key, and a rubber stun baton accessory."
icon_state = "keysec"
/obj/item/key/ambulance
name = "ambulance key"
desc = "A keyring with a small steel key, and tag with a red cross on it."
icon_state = "keydoc"
/obj/item/key/snowmobile
name = "snowmobile key"
desc = "A keyring with a small steel key, and tag with a red cross on it; clearly it's not implying you're going to the hospital for this..."
icon_state = "keydoc" //get a better icon, sometime.
/obj/item/janiupgrade
name = "floor buffer upgrade"
desc = "An upgrade for mobile janicarts."
icon = 'icons/obj/vehicles.dmi'
icon_state = "upgrade"
/obj/structure/stool/bed/chair/janicart/secway
name = "secway"
desc = "A brave security cyborg gave its life to help you look like a complete tool."
icon = 'icons/obj/vehicles.dmi'
icon_state = "secway"
callme = "secway"
keytype = /obj/item/key/security
/obj/structure/stool/bed/chair/janicart/secway/update_mob()
if(buckled_mob)
buckled_mob.dir = dir
buckled_mob.pixel_y = 4
/obj/structure/stool/bed/chair/janicart/ambulance
name = "ambulance"
desc = "For getting to patients in a hurry--or running them over."
icon = 'icons/obj/vehicles.dmi'
icon_state = "docwagon"
callme = "ambulance"
keytype = /obj/item/key/ambulance
/obj/structure/stool/bed/chair/janicart/secway/snowmobile
name = "red snowmobile"
desc = "Wheeeeeeeeeeee."
icon = 'icons/obj/vehicles.dmi'
icon_state = "snowmobile"
callme = "snowmobile"
/obj/structure/stool/bed/chair/janicart/secway/snowmobile/blue
name = "blue snowmobile"
icon_state = "bluesnowmobile"
////////////////////////////////////////////////////////////////////////////////////////////////
//TG style Janicart
/obj/structure/janitorialcart
@@ -297,8 +232,13 @@
/obj/structure/janitorialcart/New()
create_reagents(100)
janitorial_equipment += src
/obj/structure/janitorialcart/Destroy()
janitorial_equipment -= src
return ..()
/obj/structure/janitorialcart/proc/wet_mop(obj/item/weapon/mop, mob/user)
if(reagents.total_volume < 1)
user << "[src] is out of water!</span>"
@@ -11,11 +11,16 @@
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
janitorial_equipment += src
/obj/structure/mopbucket/full/New()
..()
reagents.add_reagent("water", 100)
/obj/structure/mopbucket/Destroy()
janitorial_equipment -= src
return ..()
/obj/structure/mopbucket/examine(mob/user)
if(..(user, 1))
usr << text("\icon[] [] contains [] units of water left!", src, src.name, src.reagents.total_volume)
-163
View File
@@ -1,163 +0,0 @@
/obj/structure/stool/bed/chair/segway
name = "security segway"
desc = "Gives the illusion of authority."
icon = 'icons/obj/vehicles.dmi'
icon_state = "sec_seg_idle"
anchored = 1
density = 1
var/health = 100
var/delay = 3 //Move delay to simulate a speed
var/allowMove = 1
var/datum/global_iterator/space_move //Handling space movement (i.e. drift forever)
/obj/structure/stool/bed/chair/segway/New()
handle_rotation()
space_move = new /datum/global_iterator/space_movement(null,0)
return
/obj/structure/stool/bed/chair/segway/user_buckle_mob(mob/living/M, mob/user)
if(user.incapacitated()) //user can't move the mob on the janicart's turf if incapacitated
return
for(var/atom/movable/A in get_turf(src)) //we check for obstacles on the turf.
if(A.density)
if(A != src && A != M)
return
M.loc = loc //we move the mob on the janicart's turf before checking if we can buckle.
..()
/obj/structure/stool/bed/chair/segway/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle_mob()
icon_state = "sec_seg_idle"
if(istype(user.l_hand, /obj/item/sec_seg_key) || istype(user.r_hand, /obj/item/sec_seg_key))
if(!allowMove)
return
if(src.space_move.active())
return
allowMove = 0
icon_state = "sec_seg_move"
step(src, direction)
update_mob()
handle_rotation()
if(istype(src.loc, /turf/space))
src.space_move.start(list(src,direction))
if(istype(src.loc, /turf/simulated))
var/turf/simulated/T = src.loc
if(T.wet == 2) //Lube! Fall off!
playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
buckled_mob.Stun(8)
buckled_mob.Weaken(5)
unbuckle_mob()
step(src, dir)
sleep(delay)
allowMove = 1
else
user << "<span class='notice'>Requires key in hand to drive.</span>"
/obj/structure/stool/bed/chair/segway/Move()
. = ..()
/obj/structure/stool/bed/chair/segway/Bump(var/atom/obstacle)
if(istype(obstacle, /mob))
step(obstacle, src.dir)
else
obstacle.Bumped(src)
return
/obj/structure/stool/bed/chair/segway/post_buckle_mob(mob/living/M)
update_mob()
add_fingerprint(M)
M.pixel_x = 0
M.pixel_y = 5
return ..()
/obj/structure/stool/bed/chair/segway/unbuckle_mob()
var/mob/living/M = ..()
if(M)
M.pixel_x = 0
M.pixel_y = 0
return M
/obj/structure/stool/bed/chair/segway/handle_rotation()
if(dir == NORTH)
layer = OBJ_LAYER
else
layer = FLY_LAYER
update_mob()
/obj/structure/stool/bed/chair/segway/proc/update_mob()
if(buckled_mob)
buckled_mob.dir = dir
/obj/structure/stool/bed/chair/segway/bullet_act(var/obj/item/projectile/Proj)
if(buckled_mob)
return buckled_mob.bullet_act(Proj)
else if(istype(Proj, /obj/item/projectile/beam))
damage(Proj.damage)
/obj/structure/stool/bed/chair/segway/proc/damage(amount)
health -= amount
if(health <= 0)
if(buckled_mob)
buckled_mob << "The [src.name] was destroyed!"
qdel(src)
/obj/item/sec_seg_key
name = "security segway key"
desc = "A key for a security segway. You feel the choice of keyring could be more professional."
icon = 'icons/obj/vehicles.dmi'
icon_state = "keys" //Needs a proper sprite
w_class = 1
/datum/global_iterator/space_movement //moon_theme.mp3
delay = 5
process(var/obj/structure/stool/bed/chair/segway/seg as obj,direction)
if(!step(seg, direction))
src.stop()
/obj/structure/stool/bed/chair/segway/snowmobile
name = "red snowmobile"
desc = "Wheeeeeeeeeeee."
icon = 'icons/obj/vehicles.dmi'
icon_state = "snowmobile"
anchored = 1
density = 1
/obj/structure/stool/bed/chair/segway/snowmobile/blue
name = "blue snowmobile"
desc = "Wheeeeeeeeeeee."
icon = 'icons/obj/vehicles.dmi'
icon_state = "bluesnowmobile"
anchored = 1
density = 1
/obj/structure/stool/bed/chair/segway/snowmobile/relaymove(mob/user, direction)
if(user.stat || user.stunned || user.weakened || user.paralysis)
unbuckle_mob()
if(!allowMove)
return
if(src.space_move.active())
return
allowMove = 0
step(src, direction)
update_mob()
handle_rotation()
if(istype(src.loc, /turf/space))
src.space_move.start(list(src,direction))
if(istype(src.loc, /turf/simulated))
damage(5)
usr << "Your snowmobile takes damage from not being on snow!"
var/turf/simulated/T = src.loc
if(T && T.wet == 2) //Lube! Fall off!
playsound(src, 'sound/misc/slip.ogg', 50, 1, -3)
buckled_mob.Stun(8)
buckled_mob.Weaken(5)
unbuckle_mob()
step(src, dir)
sleep(delay)
allowMove = 1
@@ -15,6 +15,7 @@
var/const/OPEN_DURATION = 6
var/const/CLOSE_DURATION = 6
var/list/disallowed_mobs = list(/mob/living/silicon/ai)
/obj/structure/transit_tube/station/New()
..()
@@ -32,13 +33,13 @@
return 1
/obj/structure/transit_tube/station/Bumped(mob/AM as mob|obj)
if(!pod_moving && icon_state == "open" && istype(AM, /mob))
if(!pod_moving && icon_state == "open" && istype(AM, /mob/living) && !is_type_in_list(AM, disallowed_mobs))
for(var/obj/structure/transit_tube_pod/pod in loc)
if(pod.contents.len)
AM << "<span class=The pod is already occupied.</span>"
return
else if(!pod.moving && pod.dir in directions())
AM.loc = pod
AM.forceMove(pod)
return
+1 -1
View File
@@ -299,7 +299,7 @@
var/turf/tile = loc
loc.clean_blood()
for(var/obj/effect/E in tile)
if(istype(E,/obj/effect/rune) || istype(E,/obj/effect/decal/cleanable) || istype(E,/obj/effect/overlay))
if(is_cleanable(E))
qdel(E)
/obj/machinery/shower/process()
+1 -1
View File
@@ -118,7 +118,7 @@ client/proc/display_admin_reports()
usr << browse(output, "window=news;size=600x400")
client/proc/Report(mob/M as mob in world)
client/proc/Report(mob/M as mob in view())
set category = "Admin"
if(!src.holder)
return
+2 -2
View File
@@ -570,7 +570,7 @@ var/list/admin_verbs_proccall = list (
log_admin("[key_name(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].")
message_admins("[key_name_admin(usr)] gave [key_name(T)] a [greater] disease2 with infection chance [D.infectionchance].")
/client/proc/make_sound(var/obj/O in world) // -- TLE
/client/proc/make_sound(var/obj/O in view()) // -- TLE
set category = "Event"
set name = "Make Sound"
set desc = "Display a message to everyone who can hear the target"
@@ -639,7 +639,7 @@ var/list/admin_verbs_proccall = list (
set name = "De-admin self"
set category = "Admin"
if(!check_rights(R_ADMIN|R_MOD))
if(!check_rights(R_ADMIN|R_MOD|R_MENTOR))
return
log_admin("[key_name(usr)] deadmined themself.")
+8 -12
View File
@@ -92,7 +92,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
//send this msg to all admins
var/admin_number_afk = 0
var/list/modholders = list()
var/list/banholders = list()
var/list/adminholders = list()
for(var/client/X in admins)
if(check_rights(R_MOD|R_MENTOR, 0, X.mob))
@@ -103,8 +102,6 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(X.is_afk())
admin_number_afk++
adminholders += X
if(check_rights(R_BAN, 0, X.mob))
banholders += X
switch(selected_type)
if("Question")
@@ -113,15 +110,14 @@ var/list/adminhelp_ignored_words = list("unknown","the","a","an","of","monkey","
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
else
if(adminholders.len)
for(var/client/X in adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
else if("Player Complaint")
if(banholders.len)
for(var/client/X in banholders)
if(adminholders.len)
for(var/client/X in adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
if("Player Complaint")
if(adminholders.len)
for(var/client/X in adminholders)
if(X.prefs.sound & SOUND_ADMINHELP)
X << 'sound/effects/adminhelp.ogg'
X << msg
+5 -2
View File
@@ -83,11 +83,13 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!target)
usr << "<font color='red'>Error: callproc(): owner of proc no longer exists.</font>"
return
message_admins("[key_name_admin(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
log_admin("[key_name(src)] called [target]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
returnval = call(target,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
else
//this currently has no hascall protection. wasn't able to get it working.
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name_admin(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
log_admin("[key_name(src)] called [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
returnval = call(procname)(arglist(lst)) // Pass the lst as an argument list to the proc
usr << "<font color='blue'>[procname] returned: [returnval ? returnval : "null"]</font>"
@@ -115,7 +117,8 @@ But you can call procs that are of type /mob/living/carbon/human/proc/ for that
if(!A || !IsValidSrc(A))
usr << "<span class='warning'>Error: callproc_datum(): owner of proc no longer exists.</span>"
return
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"].")
message_admins("[key_name_admin(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
log_admin("[key_name(src)] called [A]'s [procname]() with [lst.len ? "the arguments [list2params(lst)]":"no arguments"]")
spawn()
var/returnval = call(A,procname)(arglist(lst)) // Pass the lst as an argument list to the proc
+40 -2
View File
@@ -1,6 +1,9 @@
/client/proc/air_status(turf/target as turf)
set category = "Debug"
set name = "Display Air Status"
if(!check_rights(R_DEBUG))
return
if(!isturf(target))
return
@@ -15,11 +18,22 @@
usr << "\blue @[target.x],[target.y]: O:[GM.oxygen] T:[GM.toxins] N:[GM.nitrogen] C:[GM.carbon_dioxide] w [GM.temperature] Kelvin, [GM.return_pressure()] kPa [(burning)?("\red BURNING"):(null)]"
for(var/datum/gas/trace_gas in GM.trace_gases)
usr << "[trace_gas.type]: [trace_gas.moles]"
message_admins("[key_name_admin(usr)] has checked the air status of [T]")
log_admin("[key_name(usr)] has checked the air status of [T]")
feedback_add_details("admin_verb","DAST") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/fix_next_move()
set category = "Debug"
set name = "Unfreeze Everyone"
if(!check_rights(R_DEBUG))
return
message_admins("[key_name_admin(usr)] has unfrozen everyone")
log_admin("[key_name(usr)] has unfrozen everyone")
var/largest_move_time = 0
var/largest_click_time = 0
var/mob/largest_move_mob = null
@@ -42,15 +56,20 @@
log_admin("DEBUG: [key_name(M)] next_move = [M.next_move] next_click = [M.next_click] world.time = [world.time]")
M.next_move = 1
M.next_click = 0
message_admins("[key_name_admin(largest_move_mob)] had the largest move delay with [largest_move_time] frames / [largest_move_time/10] seconds!", 1)
message_admins("[key_name_admin(largest_click_mob)] had the largest click delay with [largest_click_time] frames / [largest_click_time/10] seconds!", 1)
message_admins("world.time = [world.time]", 1)
feedback_add_details("admin_verb","UFE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
return
/client/proc/radio_report()
set category = "Debug"
set name = "Radio report"
if(!check_rights(R_DEBUG))
return
var/filters = list(
"1" = "RADIO_TO_AIRALARM",
@@ -83,15 +102,22 @@
output += "&nbsp;&nbsp;&nbsp;&nbsp;[device]<br>"
usr << browse(output,"window=radioreport")
message_admins("[key_name_admin(usr)] has generated a radio report")
log_admin("[key_name(usr)] has generated a radio report")
feedback_add_details("admin_verb","RR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/reload_admins()
set name = "Reload Admins"
set category = "Debug"
if(!check_rights(R_SERVER)) return
if(!check_rights(R_SERVER))
return
message_admins("[usr] manually reloaded admins")
message_admins("[key_name_admin(usr)] has manually reloaded admins")
log_admin("[key_name(usr)] has manually reloaded admins")
load_admins()
feedback_add_details("admin_verb","RLDA") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
@@ -100,15 +126,24 @@
set name = "Print Jobban Log"
set desc = "This spams all the active jobban entries for the current round to standard output."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
usr << "<b>Jobbans active in this round.</b>"
for(var/t in jobban_keylist)
usr << "[t]"
message_admins("[key_name_admin(usr)] has printed the jobban log")
log_admin("[key_name(usr)] has printed the jobban log")
/client/proc/print_jobban_old_filter()
set name = "Search Jobban Log"
set desc = "This searches all the active jobban entries for the current round and outputs the results to standard output."
set category = "Debug"
if(!check_rights(R_DEBUG))
return
var/filter = input("Contains what?","Filter") as text|null
if(!filter)
@@ -118,3 +153,6 @@
for(var/t in jobban_keylist)
if(findtext(t, filter))
usr << "[t]"
message_admins("[key_name_admin(usr)] has searched the jobban log for [filter]")
log_admin("[key_name(usr)] has searched the jobban log for [filter]")
+3 -3
View File
@@ -567,7 +567,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
message_admins("[key_name_admin(src)] has created a command report", 1)
feedback_add_details("admin_verb","CCR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in world)
/client/proc/cmd_admin_delete(atom/O as obj|mob|turf in view())
set category = "Admin"
set name = "Delete"
@@ -596,7 +596,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
src << "[job.title]: [job.total_positions]"
feedback_add_details("admin_verb","LFS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc!
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in world)
/client/proc/cmd_admin_explosion(atom/O as obj|mob|turf in view())
set category = "Event"
set name = "Explosion"
@@ -627,7 +627,7 @@ Traitors and the like can also be revived with the previous role mostly intact.
else
return
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in world)
/client/proc/cmd_admin_emp(atom/O as obj|mob|turf in view())
set category = "Special Verbs"
set name = "EM Pulse"
+5 -5
View File
@@ -264,10 +264,10 @@
job_karma_high='[job_karma_high]',
job_karma_med='[job_karma_med]',
job_karma_low='[job_karma_low]',
flavor_text='[sql_sanitize_text(flavor_text)]',
med_record='[sql_sanitize_text(med_record)]',
sec_record='[sql_sanitize_text(sec_record)]',
gen_record='[sql_sanitize_text(gen_record)]',
flavor_text='[sql_sanitize_text(html_decode(flavor_text))]',
med_record='[sql_sanitize_text(html_decode(med_record))]',
sec_record='[sql_sanitize_text(html_decode(sec_record))]',
gen_record='[sql_sanitize_text(html_decode(gen_record))]',
player_alt_titles='[playertitlelist]',
be_special='[be_special]',
disabilities='[disabilities]',
@@ -321,7 +321,7 @@
'[job_medsci_high]', '[job_medsci_med]', '[job_medsci_low]',
'[job_engsec_high]', '[job_engsec_med]', '[job_engsec_low]',
'[job_karma_high]', '[job_karma_med]', '[job_karma_low]',
'[sql_sanitize_text(flavor_text)]', '[sql_sanitize_text(med_record)]', '[sql_sanitize_text(sec_record)]', '[sql_sanitize_text(gen_record)]',
'[sql_sanitize_text(html_encode(flavor_text))]', '[sql_sanitize_text(html_encode(med_record))]', '[sql_sanitize_text(html_encode(sec_record))]', '[sql_sanitize_text(html_encode(gen_record))]',
'[playertitlelist]', '[be_special]',
'[disabilities]', '[organlist]', '[rlimblist]', '[nanotrasen_relation]', '[speciesprefs]',
'[socks]', '[body_accessory]')
+16 -40
View File
@@ -5,7 +5,7 @@
desc = "A special containment suit designed to protect a plasmaman's volatile body from outside exposure and quickly extinguish it in emergencies."
allowed = list(/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/tank)
slowdown = 0
armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20)
armor = list(melee = 0, bullet = 0, laser = 0 ,energy = 0, bomb = 0, bio = 100, rad = 20)
heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS
flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT
@@ -16,9 +16,9 @@
icon_state = "plasmaman_suit"
item_state = "plasmaman_suit"
var/next_extinguish=0
var/extinguish_cooldown=10 SECONDS
var/extinguishes_left=10 // Yeah yeah, reagents, blah blah blah. This should be simple.
var/next_extinguish = 0
var/extinguish_cooldown = 10 SECONDS
var/extinguishes_left = 10 // Yeah yeah, reagents, blah blah blah. This should be simple.
/obj/item/clothing/suit/space/eva/plasmaman/examine(mob/user)
..(user)
@@ -46,35 +46,26 @@
var/base_state = "plasmaman_helmet"
var/brightness_on = 4 //luminosity when on
var/on = 0
var/no_light=0 // Disable the light on the atmos suit
action_button_name = "Toggle Helmet Light"
/obj/item/clothing/head/helmet/space/eva/plasmaman/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
if(no_light)
user << "<span class='warning'>You cannot turn the light on while in this [user.loc].</span>" //To prevent some lighting anomalities.
return
toggle_light(user)
/obj/item/clothing/head/helmet/space/eva/plasmaman/proc/toggle_light(mob/user)
on = !on
icon_state = "[base_state][on]"
if(on) user.set_light(user.luminosity + brightness_on)
else user.set_light(user.luminosity - brightness_on)
user.update_inv_head()
/obj/item/clothing/head/helmet/space/eva/plasmaman/pickup(mob/user)
if(on)
user.set_light(user.luminosity + brightness_on)
// user.UpdateLuminosity()
if(on)
set_light(brightness_on)
else
set_light(0)
/obj/item/clothing/head/helmet/space/eva/plasmaman/dropped(mob/user)
if(on)
user.set_light(user.luminosity - brightness_on)
// user.UpdateLuminosity()
set_light(brightness_on)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
// ENGINEERING
/obj/item/clothing/suit/space/eva/plasmaman/assistant
@@ -305,7 +296,7 @@
/obj/item/clothing/suit/space/eva/plasmaman/nuclear
name = "blood red plasmaman suit"
icon_state = "plasmaman_Nukeops"
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60)
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/weapon/gun,/obj/item/ammo_casing,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/restraints/handcuffs)
siemens_coefficient = 0.6
@@ -313,20 +304,5 @@
name = "blood red plasmaman helmet"
icon_state = "plasmaman_Nukeops_helmet0"
base_state = "plasmaman_Nukeops_helmet"
armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 35, bio = 100, rad = 60)
armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 50)
siemens_coefficient = 0.6
var/obj/machinery/camera/camera
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/attack_self(mob/user)
if(camera)
..(user)
else
camera = new /obj/machinery/camera(src)
camera.network = list("NUKE")
cameranet.removeCamera(camera)
camera.c_tag = user.name
user << "<span class='notice'>User scanned as [camera.c_tag]. Camera activated.</span>"
/obj/item/clothing/head/helmet/space/eva/plasmaman/nuclear/examine(mob/user)
if(..(user, 1))
user << "<span class='info'>This helmet has a built-in camera. It's [camera ? "" : "in"]active.</span>"
+31 -71
View File
@@ -27,20 +27,24 @@
"Vox" = 'icons/obj/clothing/species/vox/hats.dmi',
)
attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot turn the light on while in this [user.loc]" //To prevent some lighting anomalities.
return
on = !on
icon_state = "rig[on]-[_color]"
// item_state = "rig[on]-[color]"
/obj/item/clothing/head/helmet/space/rig/attack_self(mob/user)
if(!isturf(user.loc))
user << "<span class='warning'>You cannot turn the light on while in this [user.loc].</span>" //To prevent some lighting anomalities.
return
toggle_light(user)
if(on) set_light(brightness_on)
else set_light(0)
/obj/item/clothing/head/helmet/space/rig/proc/toggle_light(mob/user)
on = !on
icon_state = "rig[on]-[_color]"
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
if(on)
set_light(brightness_on)
else
set_light(0)
if(istype(user,/mob/living/carbon/human))
var/mob/living/carbon/human/H = user
H.update_inv_head()
/obj/item/clothing/suit/space/rig
name = "hardsuit"
@@ -98,7 +102,7 @@
else
M << "Your suit's helmet deploys with a hiss."
//TODO: Species check, skull damage for forcing an unfitting helmet on?
helmet.loc = H
helmet.forceMove(H)
H.equip_to_slot(helmet, slot_head)
helmet.flags |= NODROP
@@ -107,7 +111,7 @@
M << "You are unable to deploy your suit's magboots as \the [H.shoes] are in the way."
else
M << "Your suit's boots deploy with a hiss."
boots.loc = H
boots.forceMove(H)
H.equip_to_slot(boots, slot_shoes)
boots.flags |= NODROP
@@ -122,7 +126,7 @@
if(helmet && H.head == helmet)
helmet.flags &= ~NODROP
H.unEquip(helmet)
helmet.loc = src
helmet.forceMove(src)
if(boots)
H = boots.loc
@@ -130,58 +134,15 @@
if(boots && H.shoes == boots)
boots.flags &= ~NODROP
H.unEquip(boots)
boots.loc = src
/*
/obj/item/clothing/suit/space/rig/verb/get_mounted_device()
set name = "Deploy Mounted Device"
set category = "Object"
set src in usr
if(!can_mount)
verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device
verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device
return
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(active_device)
usr << "You already have \the [active_device] deployed."
return
if(!mounted_devices.len)
usr << "You do not have any devices mounted on \the [src]."
return
/obj/item/clothing/suit/space/rig/verb/stow_mounted_device()
set name = "Stow Mounted Device"
set category = "Object"
set src in usr
if(!can_mount)
verbs -= /obj/item/clothing/suit/space/rig/verb/get_mounted_device
verbs -= /obj/item/clothing/suit/space/rig/verb/stow_mounted_device
return
if(!istype(usr, /mob/living)) return
if(usr.stat) return
if(!active_device)
usr << "You have no device currently deployed."
return
*/
boots.forceMove(src)
/obj/item/clothing/suit/space/rig/verb/toggle_helmet()
set name = "Toggle Helmet"
set category = "Object"
set src in usr
if(!istype(src.loc,/mob/living)) return
if(!isliving(usr))
return
if(!helmet)
usr << "There is no helmet installed."
@@ -197,23 +158,22 @@
helmet.flags &= ~NODROP
H.unEquip(helmet)
helmet.loc = src
H << "\blue You retract your hardsuit helmet."
H << "<span class='notice'>You retract your hardsuit helmet.</span>"
else
if(H.head)
H << "\red You cannot deploy your helmet while wearing another helmet."
H << "<span class='warning'>You cannot deploy your helmet while wearing another helmet.</span>"
return
//TODO: Species check, skull damage for forcing an unfitting helmet on?
helmet.loc = H
helmet.pickup(H)
H.equip_to_slot(helmet, slot_head)
helmet.flags |= NODROP
H << "\blue You deploy your hardsuit helmet, sealing you off from the world."
H << "<span class='notice'>You deploy your hardsuit helmet, sealing you off from the world.</span>"
H.update_inv_head()
/obj/item/clothing/suit/space/rig/attackby(obj/item/W as obj, mob/user as mob, params)
if(!istype(user,/mob/living)) return
if(!isliving(user))
return
if(istype(src.loc,/mob/living))
user << "How do you propose to modify a hardsuit while it is being worn?"
@@ -230,7 +190,7 @@
if(!boots)
user << "\The [src] does not have any boots installed."
else
user << "You detatch \the [boots] from \the [src]'s boot mounts."
user << "You detach \the [boots] from \the [src]'s boot mounts."
boots.loc = get_turf(src)
boots = null
return
@@ -338,8 +298,9 @@
/obj/item/clothing/head/helmet/space/rig/syndi/attack_self(mob/user)
if(!isturf(user.loc))
user << "You cannot toggle your helmet while in this [user.loc]" //To prevent some lighting anomalities.
user << "You cannot toggle your helmet while in this [user.loc]." //To prevent some lighting anomalities.
return
on = !on
if(on)
user << "<span class='notice'>You switch your helmet to travel mode. It will allow you to stand in zero pressure environments, at the cost of speed and armor.</span>"
@@ -484,7 +445,6 @@
heat_protection = HEAD //Uncomment to enable firesuit protection
max_heat_protection_temperature = FIRE_IMMUNITY_HELM_MAX_TEMP_PROTECT
/obj/item/clothing/suit/space/rig/atmos
desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding."
icon_state = "rig-atmos"
@@ -62,6 +62,7 @@
Item.loc = get_turf(M.loc)
HackProperties(Item,propadjust)
M.regenerate_icons()
// This is hacky, but since it's difficult as fuck to make a proper parser in BYOND without killing the server, here it is. - N3X
/proc/HackProperties(var/mob/living/carbon/human/M,var/obj/item/I,var/script)
+4 -4
View File
@@ -656,7 +656,7 @@
return
..()
/mob/living/simple_animal/hostile/mining_drone/death()
/mob/living/simple_animal/hostile/mining_drone/Die()
..()
visible_message("<span class='danger'>[src] is destroyed!</span>")
new /obj/effect/decal/cleanable/blood/gibs/robot(src.loc)
@@ -707,11 +707,11 @@
/mob/living/simple_animal/hostile/mining_drone/proc/CollectOre()
var/obj/item/weapon/ore/O
for(O in src.loc)
O.loc = src
O.forceMove(src)
for(var/dir in alldirs)
var/turf/T = get_step(src,dir)
for(O in T)
O.loc = src
O.forceMove(src)
return
/mob/living/simple_animal/hostile/mining_drone/proc/DropOre()
@@ -719,7 +719,7 @@
return
for(var/obj/item/weapon/ore/O in contents)
contents -= O
O.loc = src.loc
O.forceMove(loc)
return
/mob/living/simple_animal/hostile/mining_drone/adjustBruteLoss()
@@ -1,4 +1,7 @@
/mob/living/carbon/alien/humanoid/emote(var/act,var/m_type=1,var/message = null)
if(stat)
return
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -1,5 +1,7 @@
/mob/living/carbon/alien/larva/emote(var/act,var/m_type=1,var/message = null)
if(stat)
return
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -1,4 +1,7 @@
/mob/living/carbon/brain/emote(var/act,var/m_type=1,var/message = null)
if(stat)
return
if(!(container && istype(container, /obj/item/device/mmi)))//No MMI, no emotes
return
@@ -1,4 +1,7 @@
/mob/living/carbon/human/emote(var/act,var/m_type=1,var/message = null)
if(stat)
return
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -334,8 +337,12 @@
m_type = 2
if ("deathgasp")
message = "<B>[src]</B> seizes up and falls limp, \his eyes dead and lifeless..."
m_type = 1
if (species.name == "Machine")
message = "<B>[src]</B> gives one shrill beep before falling limp, screen quickly flashing blue before shutting off entirely."
m_type = 1
else
message = "<B>[src]</B> seizes up and falls limp, \his eyes dead and lifeless..."
m_type = 1
if ("giggle")
if(miming)
@@ -5,5 +5,6 @@
src << "<span class='notice'>You can ventcrawl! Use alt+click on vents to quickly travel about the station.</span>"
update_pipe_vision()
update_hud()
ticker.mode.update_all_synd_icons() //This proc only sounds CPU-expensive on paper. It is O(n^2), but the outer for-loop only iterates through syndicates, which are only prsenet in nuke rounds and even when they exist, there's usually 6 of them.
if(ticker && ticker.mode)
ticker.mode.update_all_synd_icons() //This proc only sounds CPU-expensive on paper. It is O(n^2), but the outer for-loop only iterates through syndicates, which are only prsenet in nuke rounds and even when they exist, there's usually 6 of them.
return
@@ -1,5 +1,6 @@
/mob/living/carbon/slime/emote(var/act, var/m_type=1, var/message = null)
if(stat)
return
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
+3
View File
@@ -1,4 +1,7 @@
/mob/living/silicon/emote(var/act, var/m_type=1, var/message = null)
if(stat)
return
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
+13 -8
View File
@@ -12,7 +12,8 @@
/mob/living/silicon/proc/set_zeroth_law(var/law, var/law_borg)
laws_sanity_check()
laws.set_zeroth_law(law, law_borg)
log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]")
if(!isnull(usr) && law)
log_and_message_admins("has given [src] the zeroth laws: [law]/[law_borg ? law_borg : "N/A"]")
/mob/living/silicon/robot/set_zeroth_law(var/law, var/law_borg)
..()
@@ -22,39 +23,43 @@
/mob/living/silicon/proc/add_ion_law(var/law)
laws_sanity_check()
laws.add_ion_law(law)
log_and_message_admins("has given [src] the ion law: [law]")
if(!isnull(usr) && law)
log_and_message_admins("has given [src] the ion law: [law]")
/mob/living/silicon/proc/add_inherent_law(var/law)
laws_sanity_check()
laws.add_inherent_law(law)
log_and_message_admins("has given [src] the inherent law: [law]")
if(!isnull(usr) && law)
log_and_message_admins("has given [src] the inherent law: [law]")
/mob/living/silicon/proc/add_supplied_law(var/number, var/law)
laws_sanity_check()
laws.add_supplied_law(number, law)
log_and_message_admins("has given [src] the supplied law: [law]")
if(!isnull(usr) && law)
log_and_message_admins("has given [src] the supplied law: [law]")
/mob/living/silicon/proc/delete_law(var/datum/ai_law/law)
laws_sanity_check()
laws.delete_law(law)
log_and_message_admins("has deleted a law belonging to [src]: [law.law]")
if(!isnull(usr) && law)
log_and_message_admins("has deleted a law belonging to [src]: [law.law]")
/mob/living/silicon/proc/clear_inherent_laws(var/silent = 0)
laws_sanity_check()
laws.clear_inherent_laws()
if(!silent)
if(!silent && !isnull(usr))
log_and_message_admins("cleared the inherent laws of [src]")
/mob/living/silicon/proc/clear_ion_laws(var/silent = 0)
laws_sanity_check()
laws.clear_ion_laws()
if(!silent)
if(!silent && !isnull(usr))
log_and_message_admins("cleared the ion laws of [src]")
/mob/living/silicon/proc/clear_supplied_laws(var/silent = 0)
laws_sanity_check()
laws.clear_supplied_laws()
if(!silent)
if(!silent && !isnull(usr))
log_and_message_admins("cleared the supplied laws of [src]")
/mob/living/silicon/proc/statelaws(var/datum/ai_laws/laws)
@@ -1,4 +1,7 @@
/mob/living/silicon/pai/emote(var/act, var/m_type=1, var/message = null)
if(stat)
return
switch(act)
if ("help")
src << "ping, beep, buzz."
@@ -1,14 +1,15 @@
// TODO: remove the robot.mmi and robot.cell variables and completely rely on the robot component system
/datum/robot_component/var/name
/datum/robot_component/var/installed = 0
/datum/robot_component/var/powered = 0
/datum/robot_component/var/toggled = 1
/datum/robot_component/var/brute_damage = 0
/datum/robot_component/var/electronics_damage = 0
/datum/robot_component/var/energy_consumption = 0
/datum/robot_component/var/max_damage = 30
/datum/robot_component/var/mob/living/silicon/robot/owner
/datum/robot_component
var/name = "Component"
var/installed = 0
var/powered = 1
var/toggled = 1
var/brute_damage = 0
var/electronics_damage = 0
var/energy_consumption = 0
var/max_damage = 30
var/mob/living/silicon/robot/owner
// The actual device object that has to be installed for this.
/datum/robot_component/var/external_type = null
@@ -1,4 +1,7 @@
/mob/living/silicon/robot/emote(var/act, var/m_type=1, var/message = null)
if(stat)
return
var/param = null
if (findtext(act, "-", 1, null))
var/t1 = findtext(act, "-", 1, null)
@@ -1135,7 +1135,7 @@ var/list/robot_verbs_default = list(
S.dirt = 0
for(var/A in tile)
if(istype(A, /obj/effect))
if(istype(A, /obj/effect/rune) || istype(A, /obj/effect/decal/cleanable) || istype(A, /obj/effect/overlay))
if(is_cleanable(A))
qdel(A)
else if(istype(A, /obj/item))
var/obj/item/cleaned_item = A
-5
View File
@@ -639,11 +639,6 @@ var/list/slot_equipment_priority = list( \
flavor_text = msg
/mob/proc/warn_flavor_changed()
if(flavor_text && flavor_text != "") // don't spam people that don't use it!
src << "<h2 class='alert'>OOC Warning:</h2>"
src << "<span class='alert'>Your flavor text is likely out of date! <a href='byond://?src=\ref[src];flavor_change=1'>Change</a></span>"
/mob/proc/print_flavor_text(var/shrink = 1)
if (flavor_text && flavor_text != "")
var/msg = replacetext(flavor_text, "\n", " ")
+1 -1
View File
@@ -509,7 +509,7 @@
proc/has_admin_rights()
return client.holder.rights & R_ADMIN
return check_rights(R_ADMIN, 0, src)
proc/is_species_whitelisted(datum/species/S)
if(!S) return 1
@@ -591,6 +591,8 @@
if(!condi)
var/count = 1
if (href_list["createpatch_multiple"]) count = isgoodnumber(input("Select the number of patches to make.", 10, patchamount) as num)
if(!count || count <= 0)
return
if (count > 20) count = 20 //Pevent people from creating huge stacks of patches easily. Maybe move the number to defines?
var/amount_per_patch = reagents.total_volume/count
if (amount_per_patch > 40) amount_per_patch = 40
+1 -1
View File
@@ -63,7 +63,7 @@
/obj/item/weapon/reagent_containers/proc/reagentlist(var/obj/item/weapon/reagent_containers/snack) //Attack logs for regents in pills
var/data
if(snack.reagents.reagent_list && snack.reagents.reagent_list.len) //find a reagent list if there is and check if it has entries
if(snack && snack.reagents && snack.reagents.reagent_list && snack.reagents.reagent_list.len) //find a reagent list if there is and check if it has entries
for (var/datum/reagent/R in snack.reagents.reagent_list) //no reagents will be left behind
data += "[R.id]([R.volume] units); " //Using IDs because SOME chemicals(I'm looking at you, chlorhydrate-beer) have the same names as other chemicals.
return data
@@ -11,6 +11,26 @@
build_path = /obj/item/weapon/mop/advanced
category = list("Janitorial")
/datum/design/blutrash
name = "Trashbag of Holding"
desc = "An advanced trashabg with bluespace properties; capable of holding a plethora of garbage."
id = "blutrash"
req_tech = list("materials" = 5, "bluespace" = 3)
build_type = PROTOLATHE
materials = list(MAT_GOLD = 1500, MAT_URANIUM = 250, MAT_PLASMA = 1500)
build_path = /obj/item/weapon/storage/bag/trash/bluespace
category = list("Janitorial")
/datum/design/buffer
name = "Floor Buffer Upgrade"
desc = "A floor buffer that can be attached to vehicular janicarts."
id = "buffer"
req_tech = list("materials" = 5, "engineering" = 3)
build_type = PROTOLATHE
materials = list(MAT_METAL = 3000, MAT_GLASS = 200)
build_path = /obj/item/janiupgrade
category = list("Janitorial")
/datum/design/holosign
name = "Holographic Sign Projector"
desc = "A holograpic projector used to project various warning signs."
+13 -13
View File
@@ -184,7 +184,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
if(..())
return 1
if(!allowed(usr))
if(!allowed(usr) && !isobserver(usr))
return 1
add_fingerprint(usr)
@@ -324,7 +324,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
use_power(250)
updateUsrDialog()
else if(href_list["lock"]) //Lock the console from use by anyone without tox access.
else if(href_list["lock"]) //Lock the console from use by anyone without access.
if(src.allowed(usr))
screen = text2num(href_list["lock"])
else
@@ -606,7 +606,7 @@ won't update every console in existence) but it's more of a hassle to do. Also,
/obj/machinery/computer/rdconsole/attack_hand(mob/user as mob)
if(..())
return 1
if(!allowed(user))
if(!allowed(user) && !isobserver(user))
user << "<span class='warning'>Access denied.</span>"
return 1
interact(user)
@@ -1115,26 +1115,26 @@ won't update every console in existence) but it's more of a hassle to do. Also,
dat += "</tr></table></div>"
return dat
/obj/machinery/computer/rdconsole/core
name = "Core R&D Console"
desc = "A console used to interface with R&D tools."
id = 1
/obj/machinery/computer/rdconsole/robotics
name = "Robotics R&D Console"
desc = "A console used to interface with R&D tools."
id = 2
req_access = list(access_robotics)
/obj/machinery/computer/rdconsole/experiment
name = "E.X.P.E.R.I-MENTOR R&D Console"
desc = "A console used to interface with R&D tools."
id = 3
/obj/machinery/computer/rdconsole/mechanics
name = "Mechanics R&D Console"
desc = "A console used to interface with R&D tools."
id = 4
req_access = list(access_mechanic)
/obj/machinery/computer/rdconsole/core
name = "Core R&D Console"
desc = "A console used to interface with R&D tools."
id = 1
/obj/machinery/computer/rdconsole/experiment
name = "E.X.P.E.R.I-MENTOR R&D Console"
desc = "A console used to interface with R&D tools."
id = 3
+9 -10
View File
@@ -335,16 +335,15 @@
emagged = 1
user << "\blue You you disable the security protocols"
src.updateUsrDialog()
/obj/machinery/r_n_d/server/robotics
name = "Robotics R&D Server"
id_with_upload_string = "1;2"
id_with_download_string = "1;2"
server_id = 2
/obj/machinery/r_n_d/server/core
name = "Core R&D Server"
id_with_upload_string = "1"
id_with_download_string = "1"
id_with_upload_string = "1;3"
id_with_download_string = "1;3"
server_id = 1
/obj/machinery/r_n_d/server/robotics
name = "Robotics and Mechanic R&D Server"
id_with_upload_string = "2;4"
id_with_download_string = "2;4"
server_id = 2
@@ -1,342 +0,0 @@
/obj/vehicle/train/janitor/engine
name = "janitor train tug"
desc = "A ridable electric car designed for pulling janitor trolleys."
icon = 'icons/obj/vehicles.dmi'
icon_state = "pussywagon" //mulebot icons until I get some proper icons
on = 0
powered = 1
locked = 0
layer = MOB_LAYER + 0.1
load_item_visible = 1
load_offset_x = 0
load_offset_y = 7
var/car_limit = 3 //how many cars an engine can pull before performance degrades
active_engines = 1
var/obj/item/weapon/key/janitor_train/key
flags = OPENCONTAINER
var/amount_per_transfer_from_this = 5 //shit I dunno, adding this so syringes stop runtime erroring. --NeoFite
var/obj/item/weapon/storage/bag/trash/mybag = null
/obj/item/weapon/key/janitor_train
name = "key"
desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"."
icon = 'icons/obj/vehicles.dmi'
icon_state = "keys"
w_class = 1
/obj/vehicle/train/janitor/trolley
name = "janitor train trolley"
icon = 'icons/obj/janitor.dmi'
icon_state = "trashcart"
anchored = 0
passenger_allowed = 0
locked = 0
load_item_visible = 1
load_offset_x = 1
load_offset_y = 7
var/openTop = 0
var/organs = 0
//-------------------------------------------
// Standard procs
//-------------------------------------------
/obj/vehicle/train/janitor/engine/New()
..()
cell = new /obj/item/weapon/stock_parts/cell/high
verbs -= /atom/movable/verb/pull
key = new()
var/datum/reagents/R = new/datum/reagents(100)
reagents = R
R.my_atom = src
/obj/vehicle/train/janitor/engine/Move()
. = ..()
handle_rotation()
update_mob()
/obj/vehicle/train/janitor/trolley/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(openTop)
W.loc = src
user.visible_message("<span class='notice'>[user] puts [W] in [src].</span>","<span class='notice'>You put [W] in [src].</span>")
if(istype(W,/obj/item/weapon/organ))
organs = 1
update_icon()
else
user << "The top is closed!"
/obj/vehicle/train/janitor/trolley/attack_hand(mob/user)
openTop = !openTop
user.visible_message("<span class='notice'>[user] [openTop ? "opens" : "closes"] the top of [src].</span>","<span class='notice'>You [openTop ? "open" : "close"] the the top of [src].</span>")
update_icon()
..()
/obj/vehicle/train/janitor/trolley/update_icon()
if(openTop)
if(organs)
icon_state = "trashcartopengib"
else
icon_state = "trashcartopen"
else
if(organs)
icon_state = "trashcartgib"
else
icon_state = "trashcart"
/obj/vehicle/train/janitor/engine/attackby(obj/item/weapon/W as obj, mob/user as mob, params)
if(istype(W, /obj/item/weapon/key/janitor_train))
if(!key)
user.drop_item()
key = W
W.loc = src
verbs += /obj/vehicle/train/janitor/engine/verb/remove_key
return
else if(istype(W, /obj/item/weapon/mop))
if(reagents.total_volume >= 2)
reagents.trans_to(W, 2)
user << "<span class='notice'>You wet the mop in the pimpin' ride.</span>"
playsound(src.loc, 'sound/effects/slosh.ogg', 25, 1)
if(reagents.total_volume < 1)
user << "<span class='notice'>This pimpin' ride is out of water!</span>"
return
else if(istype(W, /obj/item/weapon/storage/bag/trash))
user << "<span class='notice'>You hook the trashbag onto the pimpin' ride.</span>"
user.drop_item()
W.loc = src
mybag = W
return
..()
/obj/vehicle/train/janitor/engine/attack_hand(mob/user)
if(mybag)
mybag.loc = get_turf(user)
user.put_in_hands(mybag)
mybag = null
else
..()
/obj/vehicle/train/janitor/update_icon()
if(open)
//icon_state = "mulebot-hatch"
icon_state = initial(icon_state)
else
icon_state = initial(icon_state)
/obj/vehicle/train/janitor/engine/Emag(mob/user as mob)
..()
flick("mulebot-emagged", src)
/obj/vehicle/train/janitor/trolley/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
return
/obj/vehicle/train/janitor/engine/insert_cell(var/obj/item/weapon/stock_parts/cell/C, var/mob/living/carbon/human/H)
..()
update_stats()
/obj/vehicle/train/janitor/engine/remove_cell(var/mob/living/carbon/human/H)
..()
update_stats()
/obj/vehicle/train/janitor/engine/Bump(atom/Obstacle)
var/obj/machinery/door/D = Obstacle
var/mob/living/carbon/human/H = load
if(istype(D) && istype(H))
D.Bumped(H) //a little hacky, but hey, it works, and repects access rights
..()
/obj/vehicle/train/janitor/trolley/Bump(atom/Obstacle)
if(!lead)
return //so people can't knock others over by pushing a trolley around
..()
/obj/vehicle/train/janitor/engine/handle_rotation()
if(dir == SOUTH)
layer = FLY_LAYER
else
layer = OBJ_LAYER
/obj/vehicle/train/janitor/engine/proc/update_mob()
if(load)
load.dir = dir
switch(dir)
if(SOUTH)
load.pixel_x = 0
load.pixel_y = 7
if(WEST)
load.pixel_x = 13
load.pixel_y = 7
if(NORTH)
load.pixel_x = 0
load.pixel_y = 4
if(EAST)
load.pixel_x = -13
load.pixel_y = 7
//-------------------------------------------
// Train procs
//-------------------------------------------
/obj/vehicle/train/janitor/engine/turn_on()
if(!key)
return
else
..()
update_stats()
/obj/vehicle/train/janitor/RunOver(var/mob/living/carbon/human/H)
var/list/parts = list("head", "chest", "l_leg", "r_leg", "l_arm", "r_arm")
H.apply_effects(5, 5)
for(var/i = 0, i < rand(1,3), i++)
H.apply_damage(rand(1,5), BRUTE, pick(parts))
/obj/vehicle/train/janitor/trolley/RunOver(var/mob/living/carbon/human/H)
..()
attack_log += text("\[[time_stamp()]\] <font color='red'>ran over [H.name] ([H.ckey])</font>")
/obj/vehicle/train/janitor/engine/RunOver(var/mob/living/carbon/human/H)
..()
if(is_train_head() && istype(load, /mob/living/carbon/human))
var/mob/living/carbon/human/D = load
D << "\red \b You ran over [H]!"
visible_message("<B>\red \The [src] ran over [H]!</B>")
attack_log += text("\[[time_stamp()]\] <font color='red'>ran over [key_name(H)], driven by [key_name(D)]</font>")
msg_admin_attack("[key_name_admin(D)] ran over [key_name_admin(H)]")
else
attack_log += text("\[[time_stamp()]\] <font color='red'>ran over [key_name(H)]</font>")
//-------------------------------------------
// Interaction procs
//-------------------------------------------
/obj/vehicle/train/janitor/engine/relaymove(mob/user, direction)
if(user != load)
return 0
if(is_train_head())
if(direction == reverse_direction(dir))
return 0
if(Move(get_step(src, direction)))
return 1
return 0
else
return ..()
/obj/vehicle/train/janitor/engine/examine(mob/user)
if(!..(user, 1))
return
user << "\icon[src] This [name] contains [reagents.total_volume] unit\s of [reagents]!"
if(mybag)
user << "\A [mybag] is hanging on the [name]."
user << "The power light is [on ? "on" : "off"].\nThere are[key ? "" : " no"] keys in the ignition."
/obj/vehicle/train/janitor/engine/verb/check_power()
set name = "Check power level"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human))
return
if(!cell)
usr << "There is no power cell installed in [src]."
return
usr << "The power meter reads [round(cell.percent(), 0.01)]%"
/obj/vehicle/train/janitor/engine/verb/start_engine()
set name = "Start engine"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human))
return
if(on)
usr << "The engine is already running."
return
turn_on()
if (on)
usr << "You start [src]'s engine."
else
if(cell.charge < charge_use)
usr << "[src] is out of power."
else
usr << "[src]'s engine won't start."
/obj/vehicle/train/janitor/engine/verb/stop_engine()
set name = "Stop engine"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human))
return
if(!on)
usr << "The engine is already stopped."
return
turn_off()
if (!on)
usr << "You stop [src]'s engine."
/obj/vehicle/train/janitor/engine/verb/remove_key()
set name = "Remove key"
set category = "Object"
set src in view(1)
if(!istype(usr, /mob/living/carbon/human))
return
if(!key || (load && load != usr))
return
if(on)
turn_off()
key.loc = usr.loc
if(!usr.get_active_hand())
usr.put_in_hands(key)
key = null
verbs -= /obj/vehicle/train/janitor/engine/verb/remove_key
//-------------------------------------------
// Loading/unloading procs
//-------------------------------------------
/obj/vehicle/train/janitor/trolley/load(var/atom/movable/C)
return 0
/obj/vehicle/train/janitor/engine/load(var/atom/movable/C)
if(!ismob(C))
return 0
return ..()
//-------------------------------------------------------
// Stat update procs
//
// Update the trains stats for speed calculations.
// The longer the train, the slower it will go. car_limit
// sets the max number of cars one engine can pull at
// full speed. Adding more cars beyond this will slow the
// train proportionate to the length of the train. Adding
// more engines increases this limit by car_limit per
// engine.
//-------------------------------------------------------
/obj/vehicle/train/janitor/engine/proc/update_move_delay()
if(!is_train_head() || !on)
move_delay = initial(move_delay) //so that engines that have been turned off don't lag behind
else
move_delay = max(0, (-car_limit * active_engines) + train_length - active_engines) //limits base overweight so you cant overspeed trains
move_delay *= (1 / max(1, active_engines)) * 2 //overweight penalty (scaled by the number of engines)
move_delay += config.run_speed //base reference speed
move_delay *= 1.05
Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.8 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.9 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 49 KiB

-2
View File
@@ -813,7 +813,6 @@
#include "code\game\objects\structures\musician.dm"
#include "code\game\objects\structures\noticeboard.dm"
#include "code\game\objects\structures\safe.dm"
#include "code\game\objects\structures\segway.dm"
#include "code\game\objects\structures\signs.dm"
#include "code\game\objects\structures\spirit_board.dm"
#include "code\game\objects\structures\tables_racks.dm"
@@ -1848,7 +1847,6 @@
#include "code\modules\vehicle\vehicle.dm"
#include "code\modules\vehicle\train\train.dm"
#include "code\modules\vehicle\train\trains\ambulance.dm"
#include "code\modules\vehicle\train\trains\janicart.dm"
#include "code\modules\vehicle\train\trains\cargo\cargo_train.dm"
#include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\fourwheeler.dm"
#include "code\modules\vehicle\train\trains\cargo\cargo_subtypes\motorcycle.dm"