diff --git a/_maps/map_files/tgstation.2.1.3.dmm b/_maps/map_files/tgstation.2.1.3.dmm index f7d5e53da47..ea4f5800724 100644 --- a/_maps/map_files/tgstation.2.1.3.dmm +++ b/_maps/map_files/tgstation.2.1.3.dmm @@ -4387,7 +4387,7 @@ "bGs" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/mining,/obj/item/weapon/circuitboard/autolathe{pixel_x = 3; pixel_y = -3},/obj/item/weapon/circuitboard/arcade/battle,/turf/simulated/floor/plating,/area/storage/tech) "bGt" = (/obj/structure/rack,/obj/item/weapon/circuitboard/telecomms/processor,/obj/item/weapon/circuitboard/telecomms/receiver,/obj/item/weapon/circuitboard/telecomms/server,/obj/item/weapon/circuitboard/telecomms/bus,/obj/item/weapon/circuitboard/telecomms/broadcaster,/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/turf/simulated/floor/plating,/area/storage/tech) "bGu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) -"bGv" = (/turf/simulated/wall/r_wall,/area/engine/secure_construction) +"bGv" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) "bGw" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bGx" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/janitor) "bGy" = (/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"; departmentType = 1; pixel_y = -29},/obj/item/weapon/reagent_containers/spray/cleaner,/turf/simulated/floor,/area/janitor) @@ -4466,7 +4466,7 @@ "bHT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/storage/tech) "bHU" = (/obj/machinery/door/airlock/engineering{name = "Tech Storage"; req_access_txt = "23"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating,/area/storage/tech) "bHV" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) -"bHW" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction) +"bHW" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) "bHX" = (/turf/simulated/floor{dir = 2; icon_state = "yellowcorner"},/area/hallway/primary/aft) "bHY" = (/obj/machinery/door/airlock/maintenance{name = "Custodial Maintenance"; req_access_txt = "26"},/turf/simulated/floor/plating,/area/janitor) "bHZ" = (/obj/machinery/power/apc{dir = 8; name = "Medbay Maintenance APC"; pixel_x = -24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4636,8 +4636,8 @@ "bLh" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bLi" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/medbay) "bLj" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/medical/medbay) -"bLk" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) -"bLl" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bLk" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bLl" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bLm" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/power/apc{dir = 1; name = "CM Office APC"; pixel_y = 24},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/medical/cmo) "bLn" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bLo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -4738,7 +4738,7 @@ "bNf" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/mixing) "bNg" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bNh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bNi" = (/obj/structure/disposalpipe/segment,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bNi" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bNj" = (/obj/structure/stool/bed/chair{dir = 4},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "bNk" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) "bNl" = (/turf/simulated/shuttle/wall{icon_state = "swall_s5"; dir = 2},/area/shuttle/mining/station) @@ -4791,9 +4791,9 @@ "bOg" = (/turf/simulated/floor{dir = 8; icon_state = "warnwhite"},/area/toxins/mixing) "bOh" = (/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/toxins/mixing) "bOi" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/camera{c_tag = "Toxins Lab East"; dir = 8; network = list("SS13","RD"); pixel_y = -22},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/mixing) -"bOj" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bOj" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bOk" = (/obj/structure/closet/wardrobe/grey,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"bOl" = (/obj/structure/table,/obj/effect/decal/cleanable/cobweb,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bOl" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) "bOm" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 10; icon_state = "warnplate"},/area/toxins/test_area) "bOn" = (/obj/item/device/flashlight/lamp,/turf/simulated/floor/plating/airless{dir = 2; icon_state = "warnplate"},/area/toxins/test_area) "bOo" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating/airless{dir = 6; icon_state = "warnplate"},/area/toxins/test_area) @@ -4914,7 +4914,7 @@ "bQz" = (/obj/effect/decal/cleanable/oil,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bQA" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft) "bQB" = (/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft) -"bQC" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bQC" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bQD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/aft) "bQE" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft) "bQF" = (/obj/item/weapon/table_parts,/turf/simulated/floor/plating,/area/construction) @@ -4974,8 +4974,8 @@ "bRH" = (/turf/simulated/wall/r_wall,/area/toxins/misc_lab) "bRI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bRJ" = (/turf/simulated/wall,/area/space) -"bRK" = (/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) -"bRL" = (/obj/structure/rack,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bRK" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bRL" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bRM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "bRN" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/aft) "bRO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/door/airlock/maintenance{name = "Construction Area Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/construction) @@ -5007,7 +5007,7 @@ "bSo" = (/obj/structure/lattice,/obj/machinery/atmospherics/pipe/simple{pipe_color = "green"; dir = 4; icon_state = "intact-g"; level = 2},/turf/space,/area/space) "bSp" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{name = "vacuum floor"; nitrogen = 0.01; oxygen = 0.01},/area/atmos) "bSq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bSr" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/machinery/light/small,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction) +"bSr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "bSs" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bSt" = (/obj/machinery/door/firedoor/border_only{dir = 2; name = "hazard door south"},/obj/machinery/door/airlock/glass_virology{name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) "bSu" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/medical/virology) @@ -5036,12 +5036,12 @@ "bSR" = (/obj/machinery/atmospherics/unary/cold_sink/freezer{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor/engine,/area/toxins/misc_lab) "bSS" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/toxins/misc_lab) "bST" = (/obj/machinery/magnetic_module,/obj/effect/landmark{name = "blobstart"},/obj/structure/target_stake,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) -"bSU" = (/obj/structure/closet,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"bSU" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bSV" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bSW" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) -"bSX" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bSX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "bSY" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/aft) -"bSZ" = (/obj/structure/disposalpipe/segment,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bSZ" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bTa" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "bTb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/aft) "bTc" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/plating,/area/construction) @@ -5214,7 +5214,7 @@ "bWn" = (/turf/simulated/wall/r_wall,/area/tcommsat/server) "bWo" = (/turf/simulated/wall/r_wall,/area/tcommsat/computer) "bWp" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/tcommsat/computer) -"bWq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/sign/securearea{pixel_y = 32},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"bWq" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "bWr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/disposalpipe/segment,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) "bWs" = (/obj/machinery/atmospherics/pipe/simple{pipe_color = "cyan"; dir = 9; icon_state = "intact-c"; level = 2},/turf/simulated/wall/r_wall,/area/atmos) "bWt" = (/obj/machinery/camera{c_tag = "Atmospherics Access"; dir = 4; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 8; icon_state = "caution"},/area/atmos) @@ -5285,7 +5285,7 @@ "bXG" = (/obj/machinery/light{dir = 4},/turf/simulated/floor,/area/atmos) "bXH" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXI" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"bXJ" = (/obj/machinery/light/small,/obj/structure/table,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"bXJ" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXK" = (/turf/simulated/floor/plating,/area/maintenance/asmaint) "bXL" = (/obj/structure/table,/obj/item/device/radio/intercom{pixel_x = -25},/obj/machinery/light{dir = 8},/obj/item/weapon/storage/box/beakers{pixel_x = 2; pixel_y = 2},/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{dir = 8; icon_state = "whitegreen"},/area/medical/virology) "bXM" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/effect/landmark/start{name = "Virologist"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology) @@ -5306,7 +5306,7 @@ "bYb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab) "bYc" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "bYd" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab) -"bYe" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "warningcorner"; dir = 4},/area/engine/engineering) +"bYe" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering) "bYf" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/misc_lab) "bYg" = (/obj/structure/table/reinforced,/obj/machinery/door/window/brigdoor{base_state = "rightsecure"; dir = 8; icon_state = "rightsecure"; name = "Armory Desk"; req_access_txt = "3"},/obj/machinery/door/window/eastleft{name = "Reception Desk"; req_access_txt = "1"},/turf/simulated/floor{icon_state = "showroomfloor"},/area/ai_monitored/security/armory) "bYh" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab) @@ -5418,7 +5418,7 @@ "caj" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/misc_lab) "cak" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/toxins/misc_lab) "cal" = (/obj/machinery/firealarm{dir = 1; pixel_y = -24},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/toxins/misc_lab) -"cam" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) +"cam" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) "can" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cao" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/incinerator) "cap" = (/obj/machinery/power/apc{dir = 4; name = "Labor Camp Security APC"; pixel_x = 24; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple,/obj/machinery/camera{c_tag = "Labor Camp Monitoring"; network = list("Labor")},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/mine/laborcamp/security) @@ -5452,13 +5452,13 @@ "caR" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "tox_in"; on = 1; pixel_y = 1},/turf/simulated/floor/engine{carbon_dioxide = 0; name = "plasma floor"; nitrogen = 0; oxygen = 0; toxins = 70000},/area/atmos) "caS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "caT" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"caU" = (/obj/structure/table,/obj/effect/spawner/lootdrop/maintenance{lootcount = 2; name = "2maintenance loot spawner"},/turf/simulated/floor/plating,/area/maintenance/asmaint) +"caU" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "caV" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall/r_wall,/area/medical/virology) -"caW" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/plating,/area/engine/secure_construction) -"caX" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor/plating,/area/engine/secure_construction) -"caY" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/engine/secure_construction) +"caW" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"caX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"caY" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) "caZ" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cba" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cba" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cbc" = (/obj/structure/window/reinforced,/obj/structure/table/reinforced,/obj/machinery/door_control{id = "xenobio6"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/toxins/xenobiology) "cbd" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/door/poddoor/preopen{id = "xenobio6"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -5472,7 +5472,7 @@ "cbl" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cbm" = (/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "cbn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cbo" = (/obj/structure/rack{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cbo" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/aft) "cbq" = (/obj/structure/lattice,/obj/item/weapon/shard{icon_state = "medium"},/turf/space,/area/space) "cbr" = (/obj/item/stack/rods,/obj/structure/lattice,/turf/space,/area/space) @@ -5497,13 +5497,13 @@ "cbK" = (/obj/machinery/atmospherics/pipe/manifold{dir = 8; icon_state = "manifold"; level = 2},/obj/structure/stool,/turf/simulated/floor,/area/atmos) "cbL" = (/obj/machinery/atmospherics/unary/heat_reservoir/heater{dir = 8; icon_state = "freezer_0"},/turf/simulated/floor,/area/atmos) "cbM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cbN" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cbO" = (/obj/structure/closet/crate,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cbN" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"cbO" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbP" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbQ" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbR" = (/obj/structure/stool/bed/chair{dir = 4},/obj/machinery/status_display{density = 0; layer = 3; pixel_x = 0; pixel_y = 32},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) -"cbS" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/item/apc_frame,/turf/simulated/floor/plating,/area/engine/secure_construction) -"cbT" = (/obj/structure/table,/obj/item/weapon/pen/blue,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/turf/simulated/floor,/area/engine/secure_construction) +"cbS" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering) +"cbT" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) "cbU" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbV" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cbW" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -5517,12 +5517,12 @@ "cce" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/toxins/misc_lab) "ccf" = (/obj/machinery/power/apc{dir = 4; name = "Testing Lab APC"; pixel_x = 26; pixel_y = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "ccg" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/toxins/misc_lab) -"cch" = (/obj/structure/rack{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/aft) +"cch" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cci" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) "ccj" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -2; pixel_y = 5},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cck" = (/obj/structure/table,/obj/item/weapon/folder/white,/obj/item/weapon/folder/white,/obj/item/weapon/pen,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ccl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"ccm" = (/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"ccm" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccn" = (/obj/item/weapon/shard,/obj/structure/lattice,/turf/space,/area/space) "cco" = (/obj/structure/lattice,/obj/structure/disposalpipe/segment{dir = 4},/turf/space,/area/space) "ccp" = (/obj/machinery/camera{c_tag = "Telecoms Server Room"; dir = 4; network = list("SS13")},/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5550,7 +5550,7 @@ "ccL" = (/turf/simulated/floor/engine{carbon_dioxide = 50000; name = "co2 floor"; nitrogen = 0; oxygen = 0},/area/atmos) "ccM" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccN" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/maintenance/asmaint) -"ccO" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/engine/secure_construction) +"ccO" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering) "ccP" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccQ" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "ccR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/cable,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/door/poddoor/preopen{id = "xenobio1"; name = "containment blast door"},/turf/simulated/floor/engine,/area/toxins/xenobiology) @@ -5563,15 +5563,15 @@ "ccY" = (/obj/structure/closet/crate,/obj/item/target,/obj/item/target,/obj/item/target,/turf/simulated/floor,/area/toxins/misc_lab) "ccZ" = (/obj/structure/closet/crate,/obj/item/target/alien,/obj/item/target/alien,/obj/item/target/alien,/turf/simulated/floor,/area/toxins/misc_lab) "cda" = (/obj/structure/closet/crate,/obj/item/target/syndicate,/obj/item/target/syndicate,/obj/item/target/syndicate,/turf/simulated/floor,/area/toxins/misc_lab) -"cdb" = (/obj/structure/rack,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cdb" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cdc" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cdd" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating/airless,/area/solar/port) "cde" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/solar{id = "portsolar"; name = "Port Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/port) "cdf" = (/obj/structure/table,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor/plating,/area/maintenance/aft) "cdg" = (/obj/structure/stool,/turf/simulated/floor/plating,/area/maintenance/aft) "cdh" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/aft) -"cdi" = (/obj/structure/rack{dir = 1},/obj/machinery/light/small{dir = 1},/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"cdj" = (/obj/effect/decal/cleanable/cobweb2,/obj/effect/spawner/lootdrop/maintenance,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cdi" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "151"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) +"cdj" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "151"},/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "cdk" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/aft) "cdl" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor{dir = 8; icon_state = "redcorner"},/area/security/prison) "cdm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5616,6 +5616,8 @@ "cdZ" = (/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) "cea" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) "ceb" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "floorgrime"},/area/toxins/misc_lab) +"cec" = (/turf/simulated/wall/mineral/clown,/area/space) +"ced" = (/obj/machinery/door/airlock/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "cee" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/solar/port) "cef" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/aft) "ceg" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5661,12 +5663,14 @@ "ceU" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ceV" = (/obj/structure/disposalpipe/segment,/obj/structure/lattice,/turf/space,/area/space) "ceW" = (/obj/structure/closet/emcloset,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ceX" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "ceY" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ceZ" = (/obj/machinery/atmospherics/pipe/tank/air,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfa" = (/obj/machinery/portable_atmospherics/scrubber,/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/toxins/misc_lab) "cfb" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/toxins/misc_lab) "cfc" = (/obj/machinery/door/window/eastright{base_state = "left"; dir = 8; icon_state = "left"; name = "Research Division Delivery"; req_access_txt = "47"},/turf/simulated/floor{icon_state = "delivery"},/area/toxins/misc_lab) "cfd" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/toxins/misc_lab) +"cfe" = (/turf/simulated/floor/mineral/bananium/airless,/area/space) "cff" = (/obj/structure/table,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfg" = (/obj/machinery/telecomms/server/presets/service,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) "cfh" = (/obj/machinery/telecomms/processor/preset_two,/turf/simulated/floor/bluegrid{icon_state = "dark"; name = "Mainframe Floor"; nitrogen = 100; oxygen = 0; temperature = 80},/area/tcommsat/server) @@ -5699,6 +5703,7 @@ "cfI" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfJ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfK" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/maintenance/asmaint) +"cfL" = (/obj/structure/shuttle/engine/heater{color = "#FFFF00"; dir = 4; icon_state = "heater"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space) "cfM" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfN" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/structure/closet/l3closet/general,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cfO" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5709,6 +5714,7 @@ "cfT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/toxins/misc_lab) "cfU" = (/obj/item/stack/sheet/cardboard,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfV" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"cfW" = (/obj/structure/shuttle/engine/propulsion{color = "#FFFF00"; dir = 8; icon_state = "propulsion_l"},/turf/space,/area/space) "cfX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfY" = (/obj/machinery/light/small,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cfZ" = (/obj/machinery/door/airlock/external{req_access_txt = "13"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5747,6 +5753,7 @@ "cgG" = (/obj/machinery/door/airlock/maintenance{name = "Air Supply Maintenance"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgH" = (/obj/machinery/door/airlock/maintenance{name = "Testing Lab Maintenance"; req_access_txt = "47"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/toxins/misc_lab) "cgI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/toxins/misc_lab) +"cgJ" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "cgK" = (/obj/structure/closet,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgL" = (/obj/machinery/door/airlock/maintenance{name = "Firefighting equipment"; req_access_txt = "12"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cgM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/maintenance/portsolar) @@ -5795,6 +5802,7 @@ "chD" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chE" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall,/area/maintenance/asmaint2) "chF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"chG" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "chH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chI" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/rack{dir = 1},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "chJ" = (/obj/machinery/door/airlock/maintenance{name = "Research Delivery access"; req_access_txt = "12"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5852,8 +5860,11 @@ "ciJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciK" = (/obj/structure/reagent_dispensers/watertank,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciL" = (/obj/structure/grille,/obj/structure/window/reinforced/tinted{dir = 1},/obj/structure/window/reinforced/tinted,/obj/structure/window/reinforced/tinted{dir = 4; icon_state = "twindow"},/obj/structure/window/reinforced/tinted{dir = 8; icon_state = "twindow"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ciM" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "ciN" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "ciO" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ciP" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/mineral/bananium/airless,/area/space) +"ciQ" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/mineral/bananium/airless,/area/space) "ciR" = (/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless,/area/solar/port) "ciS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/plating/airless,/area/solar/port) "ciT" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/port) @@ -5868,6 +5879,7 @@ "cjc" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = 1; pixel_y = 9},/obj/item/weapon/pen,/obj/structure/reagent_dispensers/peppertank{pixel_x = 30; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "red"; dir = 6},/area/security/checkpoint/engineering) "cjd" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft) "cje" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cjf" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/mineral/bananium/airless,/area/space) "cjg" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "cjh" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/aft) "cji" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/maintenance/aft) @@ -5878,11 +5890,11 @@ "cjn" = (/obj/machinery/shieldgen,/turf/simulated/floor/plating,/area/engine/engineering) "cjo" = (/obj/machinery/the_singularitygen{anchored = 0},/turf/simulated/floor/plating,/area/engine/engineering) "cjp" = (/obj/machinery/power/apc{cell_type = 15000; dir = 1; name = "Engineering APC"; pixel_x = 0; pixel_y = 25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) -"cjq" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) -"cjr" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engine_smes) -"cjs" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engine_smes) -"cjt" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes) -"cju" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 32},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) +"cjq" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) +"cjr" = (/turf/simulated/floor,/area/engine/engine_smes) +"cjs" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes) +"cjt" = (/turf/simulated/wall/r_wall,/area/engine/engine_smes) +"cju" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engine/engineering) "cjv" = (/obj/machinery/alarm{pixel_y = 23},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) "cjw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/engine/engineering) "cjx" = (/obj/machinery/computer/station_alert,/obj/item/device/radio/intercom{broadcasting = 0; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor,/area/engine/engineering) @@ -5903,7 +5915,9 @@ "cjM" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjN" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cjO" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint) +"cjP" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/mineral/bananium/airless,/area/space) "cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) +"cjR" = (/obj/structure/grille{color = "#FFFF00"},/obj/structure/window/reinforced{color = "#FFFF00"},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 4},/obj/structure/window/reinforced{color = "#FFFF00"; dir = 8},/turf/simulated/floor/plating/airless{color = "#FFFF00"},/area/space) "cjS" = (/obj/structure/rack,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjT" = (/obj/structure/grille,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cjU" = (/obj/machinery/power/apc{dir = 8; name = "Science Maintenance APC"; pixel_x = -25},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera{c_tag = "Aft Starboard Solar Access"; dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -5914,6 +5928,7 @@ "cjZ" = (/turf/simulated/floor/plating,/area/maintenance/portsolar) "cka" = (/obj/machinery/power/apc{dir = 4; name = "Aft Port Solar APC"; pixel_x = 23; pixel_y = 2},/obj/machinery/camera{c_tag = "Aft Port Solar Control"; dir = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/portsolar) "ckb" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/atmos) +"ckc" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/mineral/bananium/airless,/area/space) "ckd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/maintenance/aft) "cke" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "ckf" = (/obj/structure/closet/crate,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor/plating,/area/engine/engineering) @@ -5921,12 +5936,12 @@ "ckh" = (/turf/simulated/floor/plating,/area/engine/engineering) "cki" = (/obj/machinery/door/poddoor{id = "Secure Storage"; name = "secure storage"},/turf/simulated/floor/plating,/area/engine/engineering) "ckj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering) -"ckk" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 8},/area/engine/engineering) -"ckl" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) -"ckm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) -"ckn" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) +"ckk" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering) +"ckl" = (/obj/structure/table,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -35},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes) +"ckm" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/firealarm{dir = 1; pixel_y = -24},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes) +"ckn" = (/obj/structure/cable,/obj/machinery/power/apc{dir = 2; name = "SMES room APC"; pixel_y = -24},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/engine/engine_smes) "cko" = (/obj/machinery/suit_storage_unit/engine,/turf/simulated/floor,/area/engine/engineering) -"ckp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) +"ckp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engine/engineering) "ckq" = (/obj/structure/closet/crate{name = "solar pack crate"},/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/solar_assembly,/obj/item/weapon/circuitboard/solar_control,/obj/item/weapon/tracker_electronics,/obj/item/weapon/paper/solar,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) "ckr" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/stool/bed/chair/office/dark{dir = 1},/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engineering) "cks" = (/obj/structure/dispenser,/turf/simulated/floor,/area/engine/engineering) @@ -5935,12 +5950,14 @@ "ckv" = (/obj/structure/table/reinforced,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/storage/fancy/cigarettes,/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) "ckw" = (/obj/structure/table/reinforced,/obj/item/stack/medical/bruise_pack{pixel_x = -3; pixel_y = 2},/obj/item/weapon/reagent_containers/pill/kelotane{pixel_x = -3; pixel_y = -8},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) "ckx" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/closet/radiation,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) +"cky" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engine/engineering) "ckz" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/atmos) "ckA" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_in_meter"; name = "Mixed Air Tank In"},/turf/simulated/wall/r_wall,/area/atmos) "ckB" = (/obj/machinery/atmospherics/pipe/simple,/obj/structure/grille,/obj/machinery/meter{frequency = 1443; id = "mair_out_meter"; name = "Mixed Air Tank Out"},/turf/simulated/wall/r_wall,/area/atmos) "ckC" = (/obj/machinery/atmospherics/binary/pump{dir = 2; icon_state = "intact_on"; name = "Waste Out"; on = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) "ckD" = (/obj/structure/transit_tube{icon_state = "N-S"},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) "ckE" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) +"ckF" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/mineral/bananium/airless,/area/space) "ckG" = (/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) "ckH" = (/obj/machinery/door/airlock/engineering{name = "Aft Starboard Solar Access"; req_access_txt = "10"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "ckI" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = 0},/turf/simulated/wall/r_wall,/area/maintenance/starboardsolar) @@ -5953,8 +5970,8 @@ "ckP" = (/obj/machinery/portable_atmospherics/canister/toxins,/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/engine/engineering) "ckQ" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "ckR" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"ckS" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"ckT" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) +"ckS" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering) +"ckT" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) "ckU" = (/turf/simulated/floor,/area/engine/engineering) "ckV" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering) "ckW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) @@ -5975,23 +5992,24 @@ "cll" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 1; external_pressure_bound = 0; frequency = 1443; icon_state = "in"; id_tag = "air_out"; internal_pressure_bound = 2000; on = 1; pressure_checks = 2; pump_direction = 0},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "clm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cln" = (/obj/structure/transit_tube{tag = "icon-N-SE"; icon_state = "N-SE"},/turf/space,/area/space) +"clo" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/mineral/bananium/airless,/area/space) "clp" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "clq" = (/obj/machinery/power/apc{dir = 8; name = "Aft Starboard Solar APC"; pixel_x = -26; pixel_y = 3},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "clr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cls" = (/obj/machinery/power/smes{charge = 0},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "clt" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) -"clu" = (/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/secure_construction) +"clu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "clv" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor,/area/engine/engineering) "clw" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 5},/turf/simulated/floor,/area/engine/engineering) "clx" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/door/airlock/command{name = "MiniSat Access"; req_access_txt = "65"},/turf/simulated/floor,/area/engine/engineering) "cly" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) -"clz" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 10},/turf/simulated/floor/plating,/area/maintenance/aft) +"clz" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "clA" = (/obj/machinery/field/generator,/turf/simulated/floor/plating,/area/engine/engineering) "clB" = (/obj/machinery/power/emitter,/turf/simulated/floor/plating,/area/engine/engineering) "clC" = (/obj/structure/table,/obj/machinery/cell_charger,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) "clD" = (/obj/structure/table,/obj/item/weapon/airlock_electronics,/obj/item/weapon/airlock_electronics,/obj/item/weapon/module/power_control,/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/obj/item/weapon/stock_parts/cell/high{charge = 100; maxcharge = 15000},/turf/simulated/floor,/area/engine/engineering) -"clE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/table,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/engine/engineering) -"clF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor,/area/engine/engineering) +"clE" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"clF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "clG" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) "clH" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{dir = 4; icon_state = "yellowcorner"},/area/engine/engineering) "clI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) @@ -6018,26 +6036,27 @@ "cmd" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cme" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmf" = (/obj/structure/transit_tube{icon_state = "D-SW"},/obj/structure/lattice,/turf/space,/area/space) +"cmg" = (/obj/machinery/computer/syndicate_station/recall,/turf/unsimulated/floor{icon_state = "bar"; dir = 2},/area/syndicate_mothership) "cmh" = (/obj/structure/table,/obj/machinery/cell_charger,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmi" = (/obj/structure/stool,/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera{c_tag = "Aft Starboard Solar Control"; dir = 4; network = list("SS13")},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmk" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cmm" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"cmn" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/secure_construction) -"cmo" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) -"cmp" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/secure_construction) +"cmm" = (/obj/structure/table,/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/item/clothing/gloves/yellow,/turf/simulated/floor,/area/engine/engineering) +"cmn" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) +"cmo" = (/obj/machinery/power/smes,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/engine_smes) +"cmp" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "cmq" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/gravity_generator) -"cmr" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) -"cms" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft) -"cmt" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 4; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/maintenance/aft) +"cmr" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/engine_smes) +"cms" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cmt" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "cmu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall,/area/engine/engineering) "cmv" = (/turf/simulated/wall,/area/engine/engineering) -"cmw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/engineering) +"cmw" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/glass_engineering{name = "Power Storage"; req_access_txt = "11"; req_one_access_txt = "0"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) "cmx" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) -"cmy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) +"cmy" = (/obj/machinery/vending/engivend,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) "cmz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "cmA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/engine/engineering) -"cmB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) +"cmB" = (/obj/machinery/vending/tool,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering) "cmC" = (/obj/structure/table,/obj/item/weapon/crowbar,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering) "cmD" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/belt/utility,/obj/item/weapon/wrench,/obj/item/weapon/weldingtool,/obj/item/clothing/head/welding{pixel_x = -3; pixel_y = 5},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) "cmE" = (/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering) @@ -6051,23 +6070,25 @@ "cmM" = (/obj/machinery/light/small,/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cmN" = (/obj/machinery/atmospherics/pipe/vent{dir = 1},/turf/simulated/floor/plating/airless,/area/space) "cmO" = (/obj/machinery/light/small{dir = 4},/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/asmaint2) -"cmP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/secure_construction) +"cmP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "cmQ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cmR" = (/obj/machinery/power/solar_control{id = "starboardsolar"; name = "Aft Starboard Solar Control"; track = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable,/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmS" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cmT" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) -"cmU" = (/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"cmV" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) +"cmU" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/wall/r_wall,/area/engine/engine_smes) +"cmV" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes) "cmW" = (/obj/machinery/gravity_generator/main/station,/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/gravity_generator) -"cmX" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 4},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"cmY" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) +"cmX" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes) +"cmY" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engine_smes) +"cmZ" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 7; on = 1},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cna" = (/obj/machinery/light,/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "warning"},/area/engine/engine_smes) "cnb" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/turf/simulated/floor{icon_state = "bot"},/area/engine/engineering) "cnc" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/structure/sign/securearea{pixel_x = 32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/maintenance/aft) "cnd" = (/obj/structure/closet/secure_closet/engineering_welding,/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 9; icon_state = "yellow"},/area/engine/engineering) "cne" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) -"cnf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/engivend,/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) -"cng" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/vending/tool,/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering) -"cnh" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) +"cnf" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/engine_smes) +"cng" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/camera{c_tag = "SMES Room"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cnh" = (/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor{icon_state = "warningcorner"; dir = 2},/area/engine/engine_smes) "cni" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering) "cnj" = (/obj/machinery/suit_storage_unit/ce,/turf/simulated/floor{dir = 4; icon_state = "warnwhite"},/area/engine/chiefs_office) "cnk" = (/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor{dir = 1; icon_state = "yellow"},/area/engine/engineering) @@ -6076,6 +6097,7 @@ "cnn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering) "cno" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/engine/engineering) "cnp" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor,/area/engine/engineering) +"cnq" = (/obj/machinery/power/smes,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/engine_smes) "cnr" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cns" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "cnt" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) @@ -6086,19 +6108,19 @@ "cny" = (/obj/structure/closet,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cnz" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) "cnA" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/gravity_generator) -"cnB" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/secure_construction) +"cnB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/window/reinforced,/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "cnC" = (/obj/structure/closet/emcloset,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cnD" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "n2_sensor"},/turf/simulated/floor/engine{name = "n2 floor"; nitrogen = 100000; oxygen = 0},/area/atmos) "cnE" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Engineering Delivery"; req_access_txt = "10"},/turf/simulated/floor{icon_state = "delivery"},/area/engine/engineering) "cnF" = (/obj/structure/disposalpipe/segment,/obj/machinery/door/airlock/maintenance{name = "Engineering Maintenance"; req_access_txt = "10"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/engineering) "cnG" = (/obj/machinery/camera{c_tag = "Engineering West"; dir = 4; network = list("SS13")},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/engine/engineering) "cnH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering) -"cnI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"cnJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"cnK" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"cnL" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) +"cnI" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cnJ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) +"cnK" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) +"cnL" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering) "cnM" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 2; icon_state = "neutralfull"},/area/engine/chiefs_office) -"cnN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) +"cnN" = (/obj/structure/stool,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cnO" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) "cnP" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) "cnQ" = (/obj/effect/landmark/start{name = "Station Engineer"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) @@ -6111,24 +6133,24 @@ "cnX" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "o2_sensor"},/turf/simulated/floor/engine{name = "o2 floor"; nitrogen = 0; oxygen = 100000},/area/atmos) "cnY" = (/obj/machinery/air_sensor{frequency = 1443; id_tag = "air_sensor"; output = 7},/turf/simulated/floor/engine{name = "air floor"; nitrogen = 10580; oxygen = 2644},/area/atmos) "cnZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/maintenance/asmaint) -"coa" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"cob" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 10},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) +"coa" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engine_smes) +"cob" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 1; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/machinery/camera{c_tag = "SMES Access"; dir = 8; network = list("SS13"); pixel_x = 0; pixel_y = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes) "coc" = (/obj/structure/closet/radiation,/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/gravity_generator) -"cod" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 1},/area/engine/secure_construction) -"coe" = (/turf/simulated/floor{icon_state = "loadingarea"},/area/engine/engineering) -"cof" = (/obj/machinery/light/small{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering) -"cog" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering) -"coh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor,/area/engine/engineering) +"cod" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes) +"coe" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor{icon_state = "loadingarea"},/area/engine/engineering) +"cof" = (/obj/machinery/light/small{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) +"cog" = (/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden,/turf/simulated/floor,/area/engine/engineering) +"coh" = (/obj/machinery/firealarm{pixel_y = 24},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; icon_state = "off"; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor,/area/engine/engineering) "coi" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/sign/nosmoking_2{pixel_y = 32},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering) "coj" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) "cok" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) "col" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{pixel_y = 23},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"com" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) +"com" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) "con" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 9},/turf/simulated/floor,/area/engine/engineering) "coo" = (/obj/structure/table,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/turf/simulated/floor,/area/engine/engineering) "cop" = (/obj/effect/landmark/start{name = "Station Engineer"},/turf/simulated/floor,/area/engine/engineering) "coq" = (/obj/structure/closet/radiation,/turf/simulated/floor,/area/engine/engineering) -"cor" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) +"cor" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cos" = (/obj/structure/table,/obj/item/device/flashlight{pixel_y = 5},/obj/item/clothing/ears/earmuffs{pixel_x = -5; pixel_y = 6},/obj/item/weapon/airlock_painter,/turf/simulated/floor,/area/engine/engineering) "cot" = (/obj/machinery/firealarm{dir = 4; pixel_x = 24},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "yellow"},/area/engine/engineering) "cou" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/asmaint2) @@ -6136,63 +6158,63 @@ "cox" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "coy" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/starboardsolar) "coz" = (/obj/structure/lattice,/obj/structure/grille,/obj/structure/lattice,/turf/space,/area/space) -"coA" = (/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/secure_construction) -"coB" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor{icon_state = "vault"; dir = 4},/area/engine/secure_construction) +"coA" = (/obj/item/clothing/glasses/meson,/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) +"coB" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/engine/engineering) "coC" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/gravity_generator) -"coD" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"coE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction) -"coF" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall/r_wall,/area/engine/secure_construction) -"coH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"coI" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) -"coJ" = (/obj/structure/stool/bed/chair/office/light{dir = 4},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/engine/secure_construction) -"coK" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = "90Curve"},/turf/simulated/floor/plating,/area/engine/secure_construction) -"coL" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"coM" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor,/area/engine/engineering) +"coD" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engine_smes) +"coE" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engine_smes) +"coF" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 1; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engine_smes) +"coH" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "SMES Room"; req_access_txt = "32"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/engine_smes) +"coI" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engine_smes) +"coJ" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engine/engineering) +"coK" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) +"coL" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering) +"coM" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/obj/structure/cable/yellow,/turf/simulated/floor/plating,/area/engine/engineering) "coN" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engine/engineering) -"coO" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating,/area/engine/engineering) -"coP" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engine/engineering) +"coO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 6},/turf/simulated/floor,/area/engine/engineering) +"coP" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) "coQ" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_hacking{pixel_x = 3; pixel_y = 3},/obj/item/weapon/book/manual/wiki/engineering_construction,/turf/simulated/floor,/area/engine/engineering) "coR" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/engineering) "coS" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/black,/obj/item/weapon/extinguisher{pixel_x = 8},/turf/simulated/floor,/area/engine/engineering) "coT" = (/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engineering) -"coU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) +"coU" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "coV" = (/obj/machinery/camera{c_tag = "Engineering Center"; dir = 2; pixel_x = 23},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) "coW" = (/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/engine/engineering) "coX" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/engine/engineering) "coY" = (/obj/structure/table,/obj/item/weapon/book/manual/wiki/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/turf/simulated/floor,/area/engine/engineering) -"coZ" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "dark"},/area/engine/secure_construction) +"coZ" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) "cpa" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f6"; dir = 2},/area/shuttle/escape_pod4/station) "cpb" = (/turf/simulated/shuttle/wall{icon_state = "swall12"; dir = 2},/area/shuttle/escape_pod4/station) "cpc" = (/turf/simulated/shuttle/wall{icon_state = "swall_s10"; dir = 2},/area/shuttle/escape_pod4/station) "cpd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/turf/simulated/floor/plating/airless,/area/solar/starboard) -"cpe" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_x = -32; pixel_y = 0},/turf/simulated/floor/plating,/area/engine/secure_construction) +"cpe" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering) "cpf" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{dir = 4},/turf/simulated/wall/r_wall,/area/engine/engineering) "cpg" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/gravity_generator) "cph" = (/obj/effect/landmark{name = "xeno_spawn"; pixel_x = -1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating{tag = "icon-platingdmg3"; icon_state = "platingdmg3"},/area/maintenance/asmaint2) -"cpi" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/secure_construction) -"cpj" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor/plating,/area/engine/secure_construction) -"cpk" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/engine/secure_construction) +"cpi" = (/obj/machinery/computer/security/telescreen{desc = "Used for watching the singularity chamber."; dir = 1; layer = 4; name = "Singularity Engine Telescreen"; network = list("Singularity"); pixel_x = 0; pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"cpj" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering) +"cpk" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{icon_state = "vault"; dir = 8},/area/engine/engine_smes) "cpl" = (/obj/structure/table,/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/turf/simulated/floor,/area/engine/engineering) -"cpm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) +"cpm" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) "cpn" = (/obj/structure/table,/obj/item/clothing/gloves/yellow,/obj/item/weapon/storage/toolbox/electrical{pixel_y = 5},/turf/simulated/floor,/area/engine/engineering) -"cpo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engine/engineering) -"cpp" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) -"cpq" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) -"cpr" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engine/engineering) +"cpo" = (/obj/machinery/door/window{name = "SMES Chamber"; req_access_txt = "32"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cpp" = (/obj/structure/window/reinforced,/obj/structure/cable/yellow{d2 = 4; icon_state = "0-4"},/turf/simulated/floor{icon_state = "dark"},/area/engine/engine_smes) +"cpq" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) +"cpr" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/machinery/power/port_gen/pacman,/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/engine_smes) "cps" = (/obj/structure/particle_accelerator/end_cap,/turf/simulated/floor/plating,/area/engine/engineering) -"cpt" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engine/engineering) -"cpu" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering) -"cpv" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only{dir = 8; name = "Firelock West"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor{dir = 2; icon_state = "bot"},/area/engine/engineering) -"cpw" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering) -"cpx" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor,/area/engine/engineering) +"cpt" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engine_smes) +"cpu" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"cpv" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 4; icon_state = "manifold-b-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"cpw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) +"cpx" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/engineering) "cpy" = (/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering) "cpz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 0; icon_state = "blue"},/area/bridge) "cpA" = (/obj/machinery/door/airlock/shuttle{name = "Escape Pod Airlock"},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) "cpB" = (/obj/structure/stool/bed/chair{dir = 4},/obj/item/device/radio/intercom{pixel_y = 25},/turf/simulated/shuttle/floor,/area/shuttle/escape_pod4/station) -"cpC" = (/obj/machinery/atmospherics/pipe/manifold{pipe_color = "blue"; dir = 8; icon_state = "manifold-b-f"; level = 1; name = "pipe manifold"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction) +"cpC" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/reagent_containers/pill/antitox,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) "cpD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/escape_pod4/station) -"cpE" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction) -"cpF" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/secure_construction) +"cpE" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/portable_atmospherics/pump,/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) +"cpF" = (/obj/machinery/light{dir = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) "cpG" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cpH" = (/obj/structure/table,/obj/machinery/camera{c_tag = "Engineering Storage"; dir = 4; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering) "cpI" = (/obj/structure/table,/obj/item/stack/rods{amount = 50},/turf/simulated/floor,/area/engine/engineering) @@ -6200,28 +6222,21 @@ "cpK" = (/obj/structure/table,/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/obj/item/device/flashlight{pixel_x = 1; pixel_y = 5},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cpL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = -32},/obj/machinery/light,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cpM" = (/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) -"cpN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/item/clothing/glasses/meson,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) -"cpO" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/stool,/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) -"cpP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) +"cpN" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) +"cpO" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/table,/obj/item/weapon/tank/emergency_oxygen/engi,/obj/item/clothing/mask/breath{step_x = 0; step_y = 0},/turf/simulated/floor{icon_state = "yellow"},/area/engine/engineering) "cpQ" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) -"cpR" = (/obj/machinery/particle_accelerator/control_box,/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering) "cpS" = (/obj/structure/particle_accelerator/fuel_chamber,/turf/simulated/floor/plating,/area/engine/engineering) "cpT" = (/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = 25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/engineering) -"cpU" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door_control{id = "Singularity"; name = "Shutters Control"; pixel_x = -25; pixel_y = 0; req_access_txt = "11"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) -"cpV" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cpW" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/gas{pixel_x = 3; pixel_y = 3},/obj/item/clothing/mask/gas,/obj/item/clothing/mask/gas{pixel_x = -3; pixel_y = -3},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/engine/engineering) "cpX" = (/obj/machinery/light,/turf/simulated/floor,/area/engine/engineering) -"cpY" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor{dir = 9; icon_state = "warning"},/area/engine/secure_construction) "cpZ" = (/turf/simulated/floor/plating,/obj/structure/shuttle/engine/propulsion/burst{dir = 4},/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/shuttle/escape_pod4/station) "cqa" = (/turf/simulated/shuttle/wall{icon_state = "swall_s9"; dir = 2},/area/shuttle/escape_pod4/station) "cqb" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) "cqc" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) "cqd" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/plating,/area/maintenance/aft) "cqe" = (/obj/structure/table,/obj/item/stack/sheet/plasteel{amount = 10},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor,/area/engine/engineering) -"cqf" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor,/area/engine/engineering) "cqg" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/external{name = "Engineering External Access"; req_access = null; req_access_txt = "10;13"},/turf/simulated/floor/plating,/area/engine/engineering) "cqh" = (/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering) -"cqi" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/poddoor/shutters/preopen{id = "Singularity"; name = "radiation shutters"},/turf/simulated/floor/plating,/area/engine/engineering) "cqj" = (/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = -7},/obj/item/weapon/crowbar,/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "cqk" = (/obj/structure/stool,/turf/simulated/floor,/area/engine/engineering) "cql" = (/obj/structure/particle_accelerator/power_box,/turf/simulated/floor/plating,/area/engine/engineering) @@ -6238,9 +6253,6 @@ "cqx" = (/obj/machinery/light/small{dir = 8},/obj/structure/closet/emcloset,/turf/simulated/floor/plating,/area/engine/engineering) "cqy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 32},/turf/simulated/floor/plating,/area/engine/engineering) "cqz" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/engine/engineering) -"cqA" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/turf/simulated/floor/plating,/area/engine/engineering) -"cqB" = (/obj/structure/cable,/obj/machinery/power/rad_collector{anchored = 1},/obj/item/weapon/tank/plasma,/turf/simulated/floor/plating,/area/engine/engineering) -"cqC" = (/obj/machinery/power/rad_collector{anchored = 1},/obj/structure/cable,/turf/simulated/floor/plating,/area/engine/engineering) "cqD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) "cqE" = (/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) "cqF" = (/obj/structure/particle_accelerator/particle_emitter/left,/turf/simulated/floor/plating,/area/engine/engineering) @@ -6271,7 +6283,6 @@ "crf" = (/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/engine/engineering) "crg" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/engine/engineering) "crh" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/engine/engineering) -"cri" = (/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction) "crj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/plating/airless,/area/solar/starboard) "crk" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/plating/airless,/area/solar/starboard) "crl" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless,/area/solar/starboard) @@ -6435,7 +6446,6 @@ "cun" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/disposalpipe/segment,/turf/simulated/floor/plating,/area/maintenance/asmaint2) "cuo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/security/brig) "cup" = (/obj/machinery/door/window/brigdoor{id = "Cell 4"; name = "Cell 4"; req_access_txt = "2"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "red"},/area/security/brig) -"cuq" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction) "cur" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; name = "thrower_leftnostop"},/turf/space/transit/east/shuttlespace_ew2,/area/space) "cus" = (/turf/space/transit/east/shuttlespace_ew14,/area/shuttle/escape_pod4/transit) "cut" = (/turf/space/transit/east/shuttlespace_ew15,/area/shuttle/escape_pod4/transit) @@ -7030,10 +7040,8 @@ "cFK" = (/obj/structure/stool/bed/chair,/obj/effect/landmark{name = "tdomeobserve"},/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) "cFL" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'FOURTH WALL'."; name = "\improper FOURTH WALL"; pixel_x = -32},/turf/unsimulated/floor{icon = 'icons/turf/snow.dmi'; icon_state = "snow"},/area/syndicate_mothership) "cFM" = (/obj/structure/table,/obj/item/device/aicard,/turf/simulated/shuttle/floor{icon_state = "floor4"},/area/syndicate_station/start) -"cFN" = (/obj/machinery/door_control{id = "nukeop_ready"; name = "mission launch control"; pixel_x = -26; pixel_y = 0; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "cFO" = (/obj/effect/landmark{name = "Syndicate-Spawn"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "cFP" = (/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) -"cFQ" = (/obj/machinery/door/window{base_state = "right"; dir = 4; icon_state = "right"; name = "Uplink Management Control"; req_access_txt = "150"},/turf/unsimulated/floor{dir = 8; icon_state = "wood"},/area/syndicate_mothership) "cFR" = (/obj/structure/mopbucket,/turf/unsimulated/floor{icon_state = "freezerfloor"; dir = 2},/area/syndicate_mothership) "cFS" = (/turf/unsimulated/wall/fakedoor{name = "Thunderdome"},/area/tdome/tdomeobserve) "cFT" = (/obj/machinery/computer/security/telescreen,/turf/unsimulated/floor{icon_state = "redbluefull"; dir = 2},/area/tdome/tdomeobserve) @@ -8086,29 +8094,8 @@ "daa" = (/obj/machinery/power/apc{dir = 0; name = "Worn-out APC"; pixel_y = -24},/turf/simulated/floor/airless,/area/derelict/teleporter) "dab" = (/turf/simulated/mineral/random,/area/space) "dac" = (/turf/simulated/floor/plating/asteroid/airless,/area/space) -"dad" = (/obj/machinery/door/airlock/shuttle,/turf/simulated/floor/plating/airless,/area/space) -"dae" = (/turf/simulated/floor/plating/asteroid/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f9"; dir = 2},/area/space) -"daf" = (/obj/effect/landmark/corpse/clown,/turf/simulated/floor/airless,/area/space) -"dag" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space) -"dah" = (/obj/structure/closet/crate{icon_state = "crateopen"; opened = 1},/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space) -"dai" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating/airless,/area/space) -"daj" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "burst_r"; dir = 8},/turf/space,/area/space) "dak" = (/obj/item/weapon/shard{icon_state = "small"},/turf/simulated/floor/plating/asteroid/airless,/area/space) -"dal" = (/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space) -"dam" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space) "dan" = (/obj/item/weapon/shard{icon_state = "medium"},/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/plating/asteroid/airless,/area/space) -"dao" = (/obj/effect/landmark/corpse/clown{name = "Clown Pilot"},/turf/simulated/floor/airless,/area/space) -"dap" = (/obj/item/weapon/paper{info = "The call has gone out! Our ancestral home has been rediscovered! Not a small patch of land, but a true clown nation, a true Clown Planet! We're on our way home at last!"},/turf/simulated/floor/airless,/area/space) -"daq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"dar" = (/obj/item/weapon/shard,/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor/airless,/area/space) -"das" = (/obj/item/weapon/shard{icon_state = "medium"},/turf/simulated/floor/airless,/area/space) -"dat" = (/turf/space,/turf/simulated/shuttle/wall{icon_state = "swall_f5"; dir = 2},/area/space) -"dau" = (/turf/simulated/floor/airless,/turf/simulated/shuttle/wall{icon_state = "swall_f10"; dir = 2},/area/space) -"dav" = (/obj/item/weapon/pickaxe,/turf/simulated/floor/airless,/area/space) -"daw" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/turf/simulated/floor/airless,/area/space) -"dax" = (/obj/structure/closet/crate,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/weapon/ore/clown,/obj/item/clothing/shoes/clown_shoes{desc = "These shoes appear var-edited!."; name = "uhangi's shoes"; slowdown = -1},/turf/simulated/floor/airless,/area/space) -"day" = (/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/obj/structure/shuttle/engine/propulsion{icon_state = "propulsion_l"; dir = 8},/turf/space,/area/space) -"daz" = (/obj/structure/door_assembly/door_assembly_shuttle,/turf/simulated/floor/plating/airless,/area/space) "daA" = (/turf/simulated/mineral,/area/mine/unexplored) "daB" = (/turf/space,/area/syndicate_station/mining) "daC" = (/turf/simulated/mineral/random,/area/mine/unexplored) @@ -8347,7 +8334,6 @@ "dfb" = (/obj/machinery/door_control{id = "Labor"; name = "Labor Camp Lockdown"; pixel_x = 28; pixel_y = 7; req_access_txt = "2"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/laborcamp/security) "dfc" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/obj/machinery/atmospherics/pipe/simple{dir = 6},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/mine/laborcamp/security) "dfd" = (/obj/structure/girder,/turf/simulated/floor/plating{icon_plating = "asteroidplating"; icon_state = "asteroidplating"; temperature = 273.15},/area/mine/explored) -"dfe" = (/obj/structure/door_assembly/door_assembly_eng,/obj/item/weapon/airlock_electronics,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/secure_construction) "dff" = (/obj/machinery/atmospherics/pipe/simple,/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "dfg" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "dfh" = (/turf/simulated/floor{icon_state = "asteroidfloor"; temperature = 273.15},/area/mine/explored) @@ -8425,7 +8411,6 @@ "dgB" = (/obj/machinery/conveyor_switch/oneway{id = "miningmint"; name = "mining conveyor"},/turf/simulated/floor,/area/mine/production) "dgC" = (/obj/machinery/camera{c_tag = "Mint"; dir = 4; network = list("MINE")},/turf/simulated/floor,/area/mine/production) "dgD" = (/obj/machinery/vending/coffee,/turf/simulated/floor,/area/mine/laborcamp/security) -"dgE" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/door/airlock/engineering{name = "Construction Area"; req_access_txt = "32"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{icon_state = "delivery"; name = "floor"},/area/engine/secure_construction) "dgF" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/mine/laborcamp/security) "dgG" = (/obj/machinery/door/window{dir = 1; name = "Mint"; req_access_txt = "48"},/obj/machinery/atmospherics/unary/vent_pump{dir = 1; on = 1},/turf/simulated/floor,/area/mine/production) "dgH" = (/obj/machinery/door/window{base_state = "right"; dir = 1; icon_state = "right"; name = "Mint"; req_access_txt = "48"},/turf/simulated/floor,/area/mine/production) @@ -8458,7 +8443,6 @@ "dhi" = (/obj/machinery/power/port_gen/pacman{anchored = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dhj" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dhk" = (/obj/machinery/atmospherics/pipe/simple{dir = 5; icon_state = "intact-f"},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/mine/laborcamp/security) -"dhl" = (/obj/machinery/door/firedoor/border_only{dir = 4; name = "Firelock East"},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/engine/secure_construction) "dhm" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dhn" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/structure/cable,/turf/simulated/floor/plating,/area/mine/laborcamp/security) "dho" = (/turf/simulated/floor/airless{icon_state = "asteroidwarning"; dir = 9},/area/mine/explored) @@ -8860,7 +8844,6 @@ "doU" = (/obj/machinery/atmospherics/pipe/simple,/obj/machinery/flasher{id = "Labor"; pixel_x = 0; pixel_y = -26},/turf/simulated/floor{icon_state = "floorgrime"},/area/mine/laborcamp) "doV" = (/obj/machinery/light/small{dir = 8},/obj/item/weapon/wrench,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison) "doW" = (/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor{icon_state = "vault"; dir = 5},/area/security/prison) -"doX" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) "doY" = (/obj/structure/window/reinforced,/obj/structure/stool/bed/chair,/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{icon_state = "showroomfloor"},/area/security/prison) "doZ" = (/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 0; scrub_Toxins = 0},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/ai_monitored/security/armory) "dpa" = (/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen{desc = "Used for watching Prison Wing holding areas."; name = "Prison Monitor"; network = list("Prison"); pixel_x = 0; pixel_y = 30},/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/machinery/camera{c_tag = "Prison Hallway West"; network = list("SS13","Prison")},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/prison) @@ -8882,9 +8865,6 @@ "dpq" = (/obj/effect/decal/cleanable/dirt,/obj/machinery/atmospherics/unary/outlet_injector{dir = 8; frequency = 1441; icon_state = "on"; id = "waste_in"; on = 1; pixel_y = 1},/turf/simulated/floor{icon_state = "dark"},/area/security/prison) "dpr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/atmospherics/pipe/manifold{pipe_color = "red"; dir = 8; icon_state = "manifold-r-f"; initialize_directions = 11; level = 1; name = "pipe manifold"},/turf/simulated/floor/plating,/area/medical/virology) "dps" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden,/turf/simulated/wall/r_wall,/area/engine/engineering) -"dpt" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/engine/secure_construction) -"dpu" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor{dir = 8; icon_state = "warning"},/area/engine/engineering) -"dpv" = (/obj/machinery/atmospherics/pipe/simple/supply/hidden{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor,/area/engine/engineering) "dpx" = (/turf/unsimulated/wall/fakeglass{icon_state = "fakewindows2"; dir = 6},/area/syndicate_mothership) "dpy" = (/obj/effect/decal/cleanable/dirt,/obj/item/device/radio/beacon,/turf/simulated/floor/plating/airless,/area/AIsattele) "dpz" = (/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,/turf/simulated/wall,/area/medical/virology) @@ -9282,32 +9262,32 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbCvazvbELbELbSYaBgbCvahlahjahlahlbJlbGkbCvbCvbCvbCvbTbbOqbTcbRQbOsbOsbTdbTebTfbTgbOqbQLbMgbQMbNqbQObThbTibOGbOGbTjbNsbTkbTlbTmbTnbOGbOGbTobTpbTqbTrbTsbTtbTubTtbTvahjbOPbOPbOPbOPbOPahjbzgbNIbNJbTwbTxbTxbTybTzbTAbTBbTCbTDbTEbTFbTxbTGbTHbNJbTIbSCbEhbEhbEhbTJbTKbMNbTLbMNbTMbTNbEhbEhbEhbJWbTObRybTPbRxbTQbTRbTSbTTbTRbTUbQubTVbRybTWbRHbLEbgZbNhbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbTXahlahjahjbTYbTYbTYbTYbTYbTYbTYbTYbCvbCvbTZbCvbCvbCvbPtbPubPvbCvbCvbLXbCvckdbELbCvbTbbOqbOqbUabOqbOqbOqbOqbOqbOqbOqbUbbUcbQMbUdbMjbNrbNrbUebUfbUgbUhbOGbOGbOGbTnbUibONbONbUjbUkbUlbPLbUmbUnbUobUpbPQbPRbUqbUrbUrbOPahjbzgbNIbNJbNJbNJbNJbNKbUsbUtbUubUvbUwbUxbUybUybUzbRobNJbTIbSCbEhbEhbEhbUAbUBbSIbUCbMNbUDbUEbSEbSEbUFbJWbUGbUHbUIbRxbUJbRBbSQbUKbTRbULbQubUMbUMbUMbRHbUNbQubNhbgZahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbUObUPbUQbURbUSbURbUTbUUbUVbUWbUXbUYbUZbTYbVabVbbVbbVbbVbbVbbVbbVbbVbbVbbVcbVdbVebVebVebVebVfbVgbVgbVhbVibVjbVkbVlbVlbVlbVmbVnbMgbQMbVobVpbVqbONbONbONbVrbVsbONbONbVtbVubVvbOGbVwbVxbVybVzbOGbVAbVBbVCbRdahjbRebVDbVEbVFbOPahjbVGbVHbVIbVIbVIbVJbNJbVKbOXbVLbVMbVNbVObSybVPbSzbVQbNJbTIbSCbJWbJWbJWbJWbVRbVSbTLbVTbVRbJWbJWbJWbJWbJWbVUbVVbVWbVXbVYbVZbVZbVZbWabWbbSSbUMbUMbWcbRHbWdbQubNhbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWocchbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDcbObXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlbWebWebWebWebWebWfbWgbWhbWibWibWhbTYbELbWjbWkbWkbWkbWkbWkbWkbWlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWpbWobWocbNbELbCvbWrbMgbQMbVobWsbWtbWubWvbSfbWwbWxbSfbSfbWybWzbWAbWBbWCbWDbWEbWFbOGbVAbWGbWHbWIbSobPRbWJbUrbUrbOPahjbWKbWLbCDbCDbCDbWMbNJbWNbWObUzbWPbWQbUtbWRbWSbWTbUtbNJbTIbSCbSDbSEbSEbWUbSGbMNbSHbSIbWVbWWbEhbEhbEhbJWbWXbWYbWZbRxbRybRxbRybRybXabXbbQubUMbUMbUMbRHbWdbQubNhblAblAbgZahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbXcbXdbXebXfbXebXgbXhbXibXjbXjbXkbTYbXlbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbXobXpbXqbXrbXsbXnbXtbXubXvbXwbWobWobELbCvbXxbMgbQMbXybXzbXAbXBbXCbMjbMobMjbMjbMjbXDbXEbNrbNrbNrbXFbOGbVybOGbVAbVBbXGbRdahjbOPbOPbOPbOPbOPahjbXHbXIbCDcbobXKbWMbNJbXLbRqbXMbXNbWQbOXbXObWSbXPbXQbNJbTIbSCbEhbXRbEhbXSbTKbMNbTLbMNbTMbXTbEhbXRbEhbJWbXUbXVbXWbXXbXYbXZbYabYbbYcbYdbSSbCxbYfchUbRHbYhbQubYibgZblAbgZbgZbgZdsidsiahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjbXcbYjbYkbYlbYmbWhbYnbWhbYobWhbWhbYpbELbXmahlahlahjahlahlahjahlbCvbWmbWnbXnbYqbYrbYsbYtbYubXnbYvbYwbYxbYybYzbWobELbCvbWrbMgbQMbYAbYBbMobYCbYDbMjbYEcuLbYGbMjbYHbTnbZUbNrbYJbWFbOGbWDbYKbYLbUnbYMbUpbPQbPRbYNbYObYPbOPahjbCDbXIbCDbYQbXKbWMbNJbYRbYSbYTbYUbYVbOQbYWdprchWchXbNJbTIbSCbEhbEhbEhbYZbZabSIbUCbMNbUDbZbbSEbSEbUFbDcbRHbZcbZdbZebRHbRHbZfbZgbZhbZibZjbVYbVZbZkbUMbYhbQubNhbgZbrqbgZbZlbgZahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjbXcbZmbZnbZobZnbZpbZqbZrbZsbZtbZubTYbZvbZwahlahlahlahlahlahlahlbCvbWmbWnbZxbZybZzbYsbZAbZxbZxbYvbZBbZCbZDbZEbZFbZGbZHbZIbZJbZKbZLbZMbZNbZObZPbZQbZRbZSbZTbMjbOGbTndjybZVbYJbZWbOGbWDbYKbVAbVBbZXbRdahjbReclkbZZcaabOPahjbCDbXIbCDcabcacbWMbNJbNJcadcaebNJbNNbNJbNJbSubNJbNJbNJbTIbSCbJWbJWbJWbJWbVRcafbTLcagbVRbJWbJWbJWbJWbDcbTRcahbTRbTRbTRbRHbZfbZgcaicajcakcalbRxbCzbRHbYhbQubNhbgZblAblAblAcanahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcdjbNJbNJcaVbNJdpEdpDdpCdpzcaZcdibXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcdbccmbVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHbSXblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbSUbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHbRLblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbRKaClcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZbOlbQCblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfaceacfbcfccfdblAblAblAbSXbgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKbSZcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVbSXbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahjahjahjahjahjahjahjahjahjahjbWebWebWebWebWebTYbTYcaobTYbTYbTYbTYahjahlahlaPYahlahlahlahlahlcaqbWmbWnbZxbZxcarcasbXnbZxcatcaucavcawcaxcaybWobELbCvcazcaAcaBcaCcaDcaEcaFcaGcaHcaIcaJcaKbMjcaLcaMbZUbNrbYJcaNbOGcaObYKbVAcaPcaQbWIbSobPRcaRbYObYObOPahjcaSbXIbCDcaTbXKbWMcdbbNJbNJcaVbNJdpEdpDdpCdpzcaZccmbXKbTIbSCbSDbSEbSEcbbbSGbMNbSHbSIcbccbdbEhbEhbEhbDccbebTRbTRbTRbTRbRHcbfcbgcbhcbibQubQubRxbQubRHcbjbQubNhbgZcbkcblcbmcbnahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHaaHdpXdpXaaHdpXdpXdpXaaRdpXdpXdpXaaHdpXahjahjbCvbELbELbELbELbELbELbELbELbJjcbpahjahlahlahjdsiaFFahlahlahlbRMbWmbWncbscbtcascbubXnbXncbvcbwcbvcbxbYycbybWobELbTZbQLbMgcbzcbAdpFcaEcbCcbDcbEcbFciWcjcckbbPHcbIbNrbNrbNrcbJbOGcbKcbLbVAbVBbOGbRdahjbOPbOPbOPbOPbOPahjcbMbXIbCDcchcbObVHbVIbVIcbPcbQbNKdpAcuYdpBdpzcbUcbVcbVcbWbSCbEhbEhbEhcbXbTKbMNbTLbMNbTMcbYbEhbEhbEhbDccbZbTRccabTRbTRccbcccccdcceccfbQubRxbRxccgbRHbRLblAccibgZccjcckblAcclahjahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahlahjahjahlahjahjahlahlahjahjahjahldpXahlahlbCvbRKbELbCvbCvbTZbCvbCvbCvbCvbCvahlahlahldsiaDIauKdsidsiahjbRMbWmbWnccpbZxbXnbXnbXnbZxcatccqccrbYyccscctbZFbZHbZHccuccvccwcbAcbAccxcaFccycczccAccBccCbMjbOGbOJccDccEccFbQWccGccHccIbYLbUnccJbUpbPQbPRccKccLccLbOPahjbXHbXIbCDbCDbCDbXKbCDbCDccMccNbCDbCDcuBbCDbzgccNbFoccPccQbSCbEhbEhbEhccRccSbSIccTbMNbUDccUbSEbSEbUFbDcbTRbTRccVbTRbTRbRHcbfcbgccWccXbQuccYccZcdabRHbQCblAbNhbgZbgZbgZblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdccddcdeahlcdccddcdeahlcdccddcdeahjdpXahlahlbCvcdfcdgbCvcdhbELbELbOlaClcdkbCvahlahlahlatIdsidsiahjahlahlcdmbWmbWnbZxcdncdobXncdpbZxbZxbYvcdqbYybYycdrbWocdscdtcducdvcdwcdxcdycdzcaFcdzcaEcaFcdAcdBbMjcdCcdDcdEbSfbSfbShbUicdFbUmbSibVBcdGbRdahjbReclhcdIcdJbOPahjbCDbXIbXKcdKbXKbXKcdLbCDcdMcdNcdOcdPcdQcdRcdScdTcdUbgZcdVbSCbDcbDcbDcbDcbDccdWcdXcdYbDcbDcbDcbDcbDcbDcbRHbRHbRHbRHbRHbRHcdZcdZceacebbRHbRHbRHbRHbRHbLEbgZbNhbgZbNibOjblAbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlcdcceecdeahlcdcceecdeahlcdcceecdeahjahjahlahlbCvbPtbPvbCvbCvcefcegaClbELbSYbCvahlahlahlahlahjahlahlahlahlbCvbWmbWnbXncehceibXncejcekbXnbYvcelcemcencenceocepceqcercescetceucevcewcexceycezcaFcdAceAbMjceBbOGbOJbUibONceCceDceEceFbNFceGceHbWIbSobPRceIccLccLbOPahjbCDceJbLnbLnbLnbLnceKceLceMceNceOcePceQcePceRceSceTbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZceWayRceYceZceZbRHcfacfaceacfbcfccfdblAblAblAbRLbgZbYibgZcffblAblAbgZbgZbgZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcceecdeahlcdcceecdeahjcdcceecdeahjahjahlahlahlahlahjahjbCvbCvbCvbCvbTZbCvbCvahlahlahlahlahjahlahlahjahlbCvbWmbWnbXncfgcfhcficfjcfkbXncflcfmcfncfocfpbWocfqcfrcfscftcfucfvcfwcfxcfycfzcfAcfBcfCcfDbMjcfEbQZcfFcfGbOGbOGbOGbOMbVvcfGbVBbXGbRdahjbOPbOPbOPbOPbOPahjbCDcabcfHcfIcfJcacbCDbCDbCDcfKbSUcdUbXKcfMcfNbzgbCDbgZceUbLEahlahlahlahjahlahlceVahlahjahlahlahlahlbgZcfOcfPbrscfQcfRbRHcfScfScfTcfbbRHbQubgZcfUcfVbRLbgZcfXbECbECbECcfYcfZcgacfZcgbdsiahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahlahjahlahlahlahlahlahlbCvckLbCvbELbELbCvahjahlahjahlahlahjahlahlahjahlbCvbWmbWnbWnbWnbWnbWnbWnbWnbWnbWobWobWobWobWobWobCvcgfbCvcggcghcghcghcgicgjcgkcghcglcgmcgncgocgpcgqbSkcgrcgscgtcgscgrcgucgrcgvbUicgwahjahjahjahjahjahjahjahlahjcbMbXKcbMahjahlbCDcgxbCDcgycgzcgAcgzcgBbzgbYQbCDceUbLEcgCcgDcgEbgZcgCcgDcuncgEbgZcgCcgDcgDcgEbgZcgFbgZcgGbgZbgZbRHbRHbRHcgHcgIbRHaDGbgZcbmblAcgKbgZccibgZbgZcgLbgZbgZbgZbgZahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFbWqchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbCvbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLcbociIciIciIciIciNciObgZbQCblAcbNbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbELcjjcjkcjlcjmciccjncjncjociccjpcjqcjrcjscjtcjucjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGckxcicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjOcbabFobXJcaUbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjbCvckdbELbCvbEMckecicckfckgckhckickjckkcklckmcknbYebYIbYXckrbhAcghbvCckuckvcjCckwcghaJbbSnbPPcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAbEzckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjbGvbGvbGvbGvbGvbGvbGvbCvbCvbCvbCvaClckOcicckPckhckhckickQckRckSckScamcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZayRblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlbGvcmUcmpcmocmncmmcmPclzbSYbELbELbELckOcicclAclAclBcicclCclDclEclFckpcmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZaCqblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlbGvcmUcmVcmUcmYcmXcnBcmrcmsbVlbVlbVlcmtcicclAclAclBciccmucmvcmwcmxckTckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjbGvcoacoBcoAcodcobbGvbLlbLkciccnbciccnccicclAclBclBciccndcnecnfcngckpclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlbGvcoDcoHcmUcoZcoIbGvcoEcoFciccnEciccnFciccicciccicciccnGcnHcnIcnJcmBcnKcmycnKcnLcnhcnNcnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbNiblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlbGvcpecpkcmUcpjcpibGvcpFcpEbGvcoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccorciccorcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbOjcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjbGvcpYcuqcridptcoKdfecpCdhldgEdpudpvdoXcoLcoMcoNcoOcoPcmFckUcoQcoRckUcoSciccoTcoUcoVcoUcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlbGvcbSccOcaYcaXcaWbGvbSrbHWbGvckUckUcmFckUcmIcplcpmcpncmFcopckUckjcpocpocppcpqcprcpscptcpucpvcpwcpwcpxckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlbGvclucoJcbTbGvbGvbGvbGvbGvciccpHckUcmFckUcjFcpIcpJcpKcmFcpLcpMcpNcpOcpPciccpQcpRcpScopcpTciccpUcpVcpVcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjbGvbGvbGvbGvbGvahjahlahlahjciccqeckUcmFckUckUcqfcmvcmvcqgciccqhcqicqicqiciccqjcqkcqlcqmcpyciccqicqicqicqhciccqgcmvcmvbpackUdpsciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWbDicqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcqAcqBcqCcqDcqEcqFcqGcqHcpycqIcqAcqAcqAcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahlcdcceecdeahjcdcceecdeahlcdcceecdeahjahjahjahjcgMcgNcgNcgNcgNbCvbCvcgObELbCvcgPbWkbWkbWkbWkbWkbWkbWkbWlbCvbCvbWmbCvcgQcgRcgScgScgScgScgScgScgScgScgScgTcgTcgScgUcefcggcnjcgWcgXcgYcgZchacghchbchcchdbMjchechfchgchhchichjchkchlbOGchmchnchobOIahjahjahlahlahlahlahjahlahjchpcfIchpahjahlbCDchqchrchschtbKPcePchuceJbLnceLchvchwchxchxchxchxchxchxchychzchzchzchzchAchAchBchCchAchAchAchDchEchFbSXchHchIchEchEchEchEchJchKbgZbNhbgZchLblAblAbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjchMahjahjahjchMahjahlahjchMahjahlahjchNchOchPchQchRchSchTcgebELchYchZciachZchZchZchZchZchZchZchZchZchZchZcibbELbELbLXcicciccicciccicciccicciccicciccicciccidciccggcghciecifcigcihcnMcijcikcilcimciccinciocipciqcipciocipciqcipcircipcircisahjahjahlahlahlahlahjahlahjahlahlahlahjahlbCDchqcitcdMciucivciwcixdpQdpRdpSdpTdpNdpNdpNdpNdpNdpNdpOdpPdpNdpNdpNdpNdpNdpNdpVdpUciGciFciCciHciIciIciIciJciKciLcaUciIciIciIciIciNciObgZbOjblAcbabgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjciRciSciSciTciUciUciUciUciUciUciUciUciUciUciUciVciXciYciXciZcjacjbcbHchZcjdcjeaClbCvcjgcjhcjhcjhcjhcjhcjhcjhcjibCvbCvcjjcjkcjlcjmciccjncjncjociccjpcpFcpEcpCcpOcpNcjvcjwcjxcjycghcjzcjAcjBcjCcjDcjEcjFcjGckxcicahjcjIahjcjJahjcjIahjcjJahjcjKahjcjKahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbXKcjLcjMcjNcjObXJbFobSZbWqbCDbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcgCcgDcgDcgEbgZcpGblAbgZcjScbmbgZbgZcgCcgEbgZbgZcjTblAcjTbgZcjUcjVbpWbgZbgZbgZbgZbgZahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHahlahjahlahjahjcjWahjahlahjcjWahjahlahjcjWahjahlahlchNchOcjXcjYcjZckacgNbELbELbELbELbCvahlahlahjahlahlahjahlahlahjahlbCvckdbCvbEMckecicckfckgckhckickjbhAckUckUckUcoObYIbYXckrbhAcghbvCckuckvcjCckwcghaJbbSnbPPcicbOPckzbReckzbOPckzbReckzbOPckAbReckBbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbCDbCDbCDbXKckCcjMccPcnCbCDbCDbCDahlahlahjahlahjahjahlahlahlahlahlahlahlahlahlbgZcnyckEbgZcjTblAbgZahlahlahlahlbgZblAblAbEzckGckGckHckIckGahlahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXahjahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahjahjahjckKcgNcgNcgNcgNbJibJjbELbELbCvahjahjcjtcjtcjtcjtcjtcjtcjtahjbCvbCvbCvaClckOcicckPckhckhckickQckRckRckRckTcgVcnHcnPciickUcghckWckXckYckZclacghclbchccnRcicbOPcldcnDclfbOPclgcnXclibOPcljcnYcllbOPahlahlahlahlahlahlahlahlahlahlahlahlahjahlbRJahlbCDcfKclmcnZcacbCDbCDahlbRJahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlbgZcnUbgZbgZayRblAbgZbgZcgCcgEbgZbgZblAclpckEckGclqclrclsckGahlahlahjahjahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcdcckJcdeahjcdcckJcdeahlcdcckJcdeahlahlahlahlahlahlahlahlbCvbCvbCvbXlbELbCvahlahlcjtclFclzclEclzclucjtahlbCvbSYbELbELckOcicclAclAclBcicclCclDcmmckUbpacmFckqcksckockocghclKclLclMclNclOclPclQclRcnScicbOPclTclUclTbOPclVclWclVbOPclXclYclZbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlbRJahlahlahjcmaahlahlahjahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahlcmccmdcmebgZbJkaDGbgZaCqblAblAbgZblAblAblAblAcbmblAcmhckGcmicmjcmkckGahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaGcahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahlcdcckJcdeahjahlahlahlahlahlahlahlcgccgdcgcbELbELbCvahlahlcjtcmscmocmncmrcmpcjtahlbCvcegbELbELckOcicclAclAclBciccmucmvcmtcmxcmwckVcktcmvcmzcmAcmvcmCcmDcmEcmFcmGcmHcmEcmIcotcicbOPclTcmKclTbOPclVcmLclVbOPclZcmMclZbOPahlahlahlahlahlahlaaeahlahlahlahlahlahlahlbRJahlahlahjcmNahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahlahjcbnblAcmObgZcphblAbgZcmQblAblAbrqblAbgZbgZbgZcgCcgEbgZckGcmRcmScmTckGahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahjcdcckJcdeahlcdcckJcdeahjcdcckJcdeahjahjahjahjahjahjahjahjbCvbCvbCvbCvbELbCvahjahjcjtcmPcoZcoUcoPcmPcjtahjbCvciccnbciccnccicclAclBclBciccndcnecmycmBbpaclHclIclJclGclGcnkcnlcnmcnncnocnncnncnncnpcqMcicbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPbOPahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlbRJahlahlahlahlahjahjahlahlahlahlahjdsicbncnrblAbrqcpGblAbgZbgZbgZbgZbgZblAbgZahlahjahlahjahlcnscntcnucnvcnwahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaRahjcdccnxcdeahlcdccnxcdeahlcdccnxcdeahjdpXahjahlahlahlahlahlahlahlahlbLWbELcaqahlahlcjtcmZcnfcpkcnqcngcjtcjtcjtciccnEciccnFciccicciccicciccnGcnHcnPcnPcqNcnPcnOcnPcpjcpicpecnOcnOcnPcnPcnQcnPcnPdufduecicahjahlahlahlahjahjahlahlahjahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlaaeahlahlahlahlahlahlahlbRJahlahlahlahlahlahjahlahlahlahlahldsicbnblAaBRbgZbLkblAblAblAblAblAblAblAbgZahlahjahlahjahlahjcnVcnWcnVahjahlahlahjahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldpXahlahjahlahlahlahjahjahjahlahlahjahjahldpXahjahjahlahlahlahlahlahlahlbRMbELbRMahlahlcjtcnBcppcpocpmcnIcoacodcobcoacoecofcogcohcoicojcokcolcomconcoocopcnicoqclcciccpqciccpqcicclccoqckUckUcosckUduhdugcpfduiciccicciccmvcmvcmvcmvcicahlahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlcoucmdcmebgZcnUbgZbgZbLlcowckEcoxbgZbgZahlahjahlahlahlahjcoycnucoyahjahlahlahlahlahlahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaHaaHdpXaaHaaHaaRdpXdpXdpXdpXaaHdpXdpXaaHcozahlahjahjahlahlahlahlahlahjbRMbELbRMahjahjcjtcprcoDcptcoDcoEcoHcoFcoIcoHcoKcnPcoJcpjcpvcamcpucamcpwccOcoQcoRckUcoSciccoTcpxcoVcpxcoWciccoXckUcoRcoYckUdujcnPcnPcqNcnPdsHcicdsWdsXcpacpbcpbcpcahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcmbahlbgZbgZcgCcgEbgZbgZahjahjahlahlahlahlahjahlcpdahlahlahlahlahlahlahlahjahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlahlahlcdmbELcdmahlahlcjtcjscjrcnhcnacmYcmUcmXcmVcmUcaWcamcaXcaYcmIcplcqDcpncmFbYecambGvbGvbGvbHWbSrcjqcpsckSckkcbTcbScbSccOckUcopcmFckUckUbpackUbvHboSckhckhcpAcpBcbRcpDahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlbqzahlahlahjahlahjahlahlahjahjahjahlahlahlahjahlcpdahlahjahlahlahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlaaeahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlahlbCvbCvbTZbCvbCvahlcjtcknckmcklcjtcjtcjtcjtcjtciccpHckUcjuckUcjFcpIcpJcpKcmFcpLcpMcoAcnNcorciccpQcnLcpScopcpTciccnKcnJcnJcpMcpLcmFcpWciycdHclSbxfcicbxeckhcpZcpbcpbcqaahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbcqbcqbcqcahjahjahjahjcpdahjahjahjahjahjaaRcqbcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlahlbCvckdbELcqdbCvahjcjtcjtcjtcjtcjtahjahlahlahjciccqeckUckpcoNcoNckycmvcmvcqgciccqhcoBcoBcoBciccqjcqkcqlcqmcpyciccoBcoBcoBcqhciccqgcmvcmvbpackUdpsciccmvcmvcmvcmvcicahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlahjahlahjahlahlahlcqoahlahjahjahlahlahlahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjahlbLWbDicqqcqrbCvahjahlahlahjahlahlahjahlahlahjciccqscqtcmFcqucqvcqwcmvcqxcqyciccqzcoLcoMcoLcqDcqEcqFcqGcqHcpycqIcoLcoLcoLcqJciccqKcqLcicbpacjHciEciBckUbZYcqIahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahjahlahlcqbahlcqOcqOcqOcqOcqOahjcqPahjcqOcqOcqOcqOcqOahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahjbRMcqQcqRbfFbCvbCvcqTcqUcqUcqUcqUcqUcqUcqVcmvciccqWcqXcqYcqZcqWciccicciccqgcicciccmzcracrbcrccrdcpMcrecpMcrfcrgcrbcracrhcicciccqgciccicclwcmJclxclvckUciAcizahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrjcrkcrkcrkcrkcrlcqPcrmcrncrncrncrncroahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjcrpcrqcrqcrrbCvahjahlahlahjahlahlahjahlahlahjdsidsidsiahjahlahjdsiciccrscrtcruahlahlahlcrvcrwcracracracracracrwcrxahlahlahlcrycrzcrAciccleciccicdrlcpXciDcjQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahjcrBcrBcrBcrBcrBahlcqPahlcrBcrBcrBcrBcrBahjcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldsidsidsidsidsidsiahlahjahlahjahjahlahlahlahjciccrCcrDahlahlahlahjahjahjahjahjahjahjahjahjahjahjahlahlahlcrEcrCcicdrndrTciccmvcmvckDcmvahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahjahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahjahlahlcqbahlahjahlahjahjahjahlcqPahlahjahlahjahlahjahlcqbahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -9544,14 +9524,14 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDAcDBcDCcDDcDDcDDcDEcDBcDFcCPcCPcCPcCPcDicCPcDwcCQcDwcCQcCPcCRcCPcCRcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDHcDIcDJcDKcDLcDGcDGcAlcCocCocCocCpcBFcBGcBHcAQcDxcDxcDxcDxcAQcDMcBxcBxcDNcAQahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcDOcDPcDQcDRcDScDTcDTcDBcDUcCPcCPcDwcCEcCEcDVcDWcCEcCEcDwcDXcDYcDwcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDZcEacEbcEccEdcEecEbcEacDZcAlcCocEfcEgcEhcAlahlahlcAQcEicEicEjcEjcAQcBycBxcBxcDzcBAahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEkcDPcDPcElcDPcDPcDPcDBcDUcCPcEmcCEcCEcEncEocEocEncCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEacEpcEqcEccEdcEecEqcErcEacAlcCocEscEtcEucAlahlahlcEvcBlcEwcEwcEwcEwcEwcEwcEwcBlcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEycDPcDPcDPcEzcDPcEAcDBcDUcDicEmcCEcEBcEBcEBcEBcEBcEBcEBcEBdpxdtdcEDcEEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEFcEacEFcEccEdcEecEFcEacEFcAlcCocCocCocCocAlahlahlahlcEvcEGcEGcEGcEGcEGcEGcEGcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcDBcEycDPcDPcDPcEzcDPcEAcDBcDUcDicEmcCEcmgcEBcEBcEBcEBcEBcEBcEBdpxdtdcEDcEEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEFcEacEFcEccEdcEecEFcEacEFcAlcCocCocCocCocAlahlahlahlcEvcEGcEGcEGcEGcEGcEGcEGcExahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcEHcDBcDBcDBcEIcDBcDBcDBcEJcCPcCPcEKcCEcELcEMcEMcEBcEBcEBcEBcEBcENcEOcEOcEOcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcEPcEacEacEccEdcEecEacEacEQcAlcERcEScEScETcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcEUcDPcEVcDBcEWcDwcDwcDwcEXcCEcEBcEYcEZcEMcEBcEBcFacFbdpxcFccFdcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcFecFfcFfcEccEdcEecFgcFgcFhcAlcAlcFicAlcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcDPcDPcDPcDBcFjcFkcFkcDWcCEcCEcEBcFlcFmcEMcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDGcDGcEdcDGcDGcDGcDGcAlcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDAcDBcDBcDBcDBcDBcDPcDPcDPcDBcFocFpcFpcFpcFqcFrcEBcEBcEBcEBcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcEdcDGcFscFscFscApcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcFtcDBcDPcDPcDPcDBcFucFqcDVcDWcCEcCEcEBcEMcEMcEMcEBcEBcFacFvcCEcFwcFxcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcDGcDGcDGcDGcDGcDGcDGcDJcDGcDGcDGcDGcDGcDGcDGcDGcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcCPcCPcCPcCPcCPcDBcDPcDPcDPcDBcFjcFkcFkcFkcDWcCEcEBcFlcFmcEMcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDpcDGcDGcDGcDGcEdcDGcDGcDGcDGcAlcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDAcDBcDBcDBcDBcDBcDPcDPcDPcDBcFocFpcFpcFpcFpcFrcEBcEBcEBcEBcEBcEBcFacFncCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcEdcDGcFscFscFscApcApcApcApcApcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcFtcDBcDPcDPcDPcDBcFucFqcDVcFkcDWcCEcdjcEMcEMcEMcEBcEBcFacFvcCEcFwcFxcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcDGcDGcDGcDGcDGcDGcDGcDJcDGcDGcDGcDGcDGcDGcDGcDGcAlcAlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcFycFzcDBcDPcDPcDPcDBcDBcFAcFBcDFcFCcCEcFDcFEcFFcFEcFEcEBcEBcEBcFGcFHcFHcFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcFJcFKcFKcFKcFKcFKcFJcFJcFJcFKcFKcFKcFKcFKcFJcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcFLcCPcDBcEAcDPcFycFMcDBcDPcDPcDPcDBcDPcDPcDPcDBcEKcCEcFNcFOcFPcFOcFQcEBcEBcEBcCEcFRdtccFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcFScFJcFJcFJcFTcFJcFJcFJcFJcFJcFJcFJcFTcFJcFJcFJcFSahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcFLcCPcDBcEAcDPcFycFMcDBcDPcDPcDPcDBcDPcDPcDPcDBcEKcCEcFPcFOcFPcFPcdicEBcEBcEBcCEcFRdtccFIcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcFScFJcFJcFJcFTcFJcFJcFJcFJcFJcFJcFJcFTcFJcFJcFJcFSahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcDPcFUcDPcDPcDPcFVcDPcDPcDPcDBcEmcCEcCEcFbcFWcFXcFYcCEcCEcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcDGcFJcFKcFKcFKcFKcFKcFJcFJcFJcFKcFKcFKcFKcFKcFJcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcCPcDBcEAcDPcDPcDPcFZcDPcDPcDPcGacDPcDPcGbcDBcGccFCcCEcCEcCEcCEcCEcCEahlahlahlahlahlahlahlahlahlcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdcGdahlahlahlahlahlahlahlahlahlahlcDGcDKcGecGecGecGecGecGecGecGecGecGecGecGecGecDIcDGahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlcCEcCPcDAcDBcDBcDBcDBcDBcDBcGfcDPcDPcDBcDBcDBcDBcDBcDBcDFcFCcCEahlahlahlahlahlahlahlahlahlahlahlahlahlcGdcGgcGhcGicGjcGkcGlcGdcGmcGncGocGdahlahlcGpcGpcGpcGpcGpcGpcGpcGpcGpcGqcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGrcGqcGpcGpcGpcGpcGpcGpcGpcGpcGpahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl @@ -10107,13 +10087,13 @@ ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlah ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabahlahldabdabdabdabdabdacdacdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdacdacdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdacdacahlahlcJWcJYcJYdaddadcJYcJYcJYcJYcJZahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdaccJWcJYdaedacdafcPCcPCdagdagdahcPCdaidajahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdakcPCcPCcPCcPCcPCdalcPCdaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdandaocPCdapdalcPCdalcPCdaldaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdaqcPCdarcPCdascPCdafcPCcPCcPCdaldaidamahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdatcJYdaucPCdavcPCcPCdawdaxdagcPCdaidayahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl -ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabcKtcJYcJYdaddazcJYcJYcJYcJYcKvahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdacdacahlahlceccecceccedcedcecceccecceccecahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdaccecceccecdaccgJcfecfechGchGceXcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdakcfecfecfecfecfeciMcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdanciQcfeciPciMcfeciMcfeciMcfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabcjRcfecjPcfecjfcfecgJcfecfecfeciMcfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabceccecceccfeckccfecfeckFclochGcfecfLcfWahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl +ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabceccecceccedcedcecceccecceccecahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabahldabdabdabdabdabdacdacdabdabdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl ahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahldabdabdabdabdacdacdacdabdabdabdabdabdabdabdabdabahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahlahl diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 5d47b855257..e6dc792d33a 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -21,13 +21,11 @@ Pipelines + Other Objects -> Pipe network /obj/machinery/atmospherics/var/initialize_directions = 0 -/obj/machinery/atmospherics/var/pipe_color - +/obj/machinery/atmospherics/var/pipe_color/ +/* /obj/machinery/atmospherics/process() - if(gc_destroyed) //comments on /vg/ imply that GC'd pipes still process - return PROCESS_KILL - build_network() - + //build_network() +*/ /obj/machinery/atmospherics/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) // Check to see if should be added to network. Add self if so and adjust variables appropriately. // Note don't forget to have neighbors look as well! @@ -89,3 +87,6 @@ Pipelines + Other Objects -> Pipe network qdel(src) else return ..() + +/obj/machinery/atmospherics/proc/nullifyPipenetwork() + return \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 923bb5ea0c2..27c9085e6ac 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -128,3 +128,7 @@ node2 = null return null + +/obj/machinery/atmospherics/binary/nullifyPipenetwork() + network1 = null + network2 = null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index deb86fb9f8e..4976ebb5feb 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -160,3 +160,8 @@ node3 = null return null + +/obj/machinery/atmospherics/trinary/nullifyPipenetwork() + network1 = null + network2 = null + network3 = null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/unary_base.dm b/code/ATMOSPHERICS/components/unary/unary_base.dm index 07465402083..3efd0b1d2a6 100644 --- a/code/ATMOSPHERICS/components/unary/unary_base.dm +++ b/code/ATMOSPHERICS/components/unary/unary_base.dm @@ -49,7 +49,7 @@ if(!infiniteloop) target.initialize(1) break - build_network() + //build_network() update_icon() @@ -97,3 +97,6 @@ del(network) return null + +/obj/machinery/atmospherics/unary/nullifyPipenetwork() + network = null \ No newline at end of file diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm index 837e70ef4eb..5be3be0e53d 100644 --- a/code/ATMOSPHERICS/components/unary/vent_pump.dm +++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm @@ -281,6 +281,7 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0,user)) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) user << "Now welding the vent." if(do_after(user, 20)) if(!src || !WT.isOn()) return @@ -293,10 +294,6 @@ user.visible_message("[user] unwelds the vent.", "You unweld the vent.", "You hear welding.") welded = 0 update_icon() - else - user << "The welding tool needs to be on to start this task." - else - user << "You need more welding fuel to complete this task." return 1 else return ..() @@ -361,7 +358,7 @@ L << " There are no available vents to travel to, they could be welded. " return - var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortAssoc(vents) + var/obj/selection = input(L,"Select a destination.", "Duct System") as null|anything in sortList(vents) if(!selection) return if(!Adjacent(L)) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 47b9b940489..b553d9578d6 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -11,7 +11,7 @@ can_unwrench = 1 var/open = 0 - var/openDuringInit = 0 + var/openDuringInit //useless, must remove var/obj/machinery/atmospherics/node1 var/obj/machinery/atmospherics/node2 @@ -178,12 +178,7 @@ obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) node2 = target break - build_network() - - if(openDuringInit) - close() - open() - openDuringInit = 0 + //build_network() /* var/connect_directions @@ -309,3 +304,7 @@ obj/machinery/atmospherics/valve/attack_hand(mob/user as mob) close() else open() + +/obj/machinery/atmospherics/valve/nullifyPipenetwork() + network_node1 = null + network_node2 = null \ No newline at end of file diff --git a/code/ATMOSPHERICS/datum_pipe_network.dm b/code/ATMOSPHERICS/datum_pipe_network.dm index 7956edb5a34..4a4b9b5191d 100644 --- a/code/ATMOSPHERICS/datum_pipe_network.dm +++ b/code/ATMOSPHERICS/datum_pipe_network.dm @@ -12,7 +12,14 @@ var/global/list/datum/pipe_network/pipe_networks = list() /datum/pipe_network/New() air_transient = new() + ..() +/datum/pipe_network/Destroy() + pipe_networks -= src + for(var/datum/pipeline/P in line_members) + P.network = null + for(var/obj/machinery/atmospherics/A in normal_members) + A.nullifyPipenetwork() ..() /datum/pipe_network/proc/process() @@ -30,7 +37,7 @@ var/global/list/datum/pipe_network/pipe_networks = list() //Notes: Assuming that members will add themselves to appropriate roster in network_expand() if(!start_normal) - del(src) + qdel(src) start_normal.network_expand(src, reference) @@ -39,7 +46,7 @@ var/global/list/datum/pipe_network/pipe_networks = list() if((normal_members.len>0)||(line_members.len>0)) pipe_networks += src else - del(src) + qdel(src) /datum/pipe_network/proc/merge(datum/pipe_network/giver) if(giver==src) return 0 @@ -56,8 +63,6 @@ var/global/list/datum/pipe_network/pipe_networks = list() for(var/datum/pipeline/line_member in giver.line_members) line_member.network = src - del(giver) - update_network_gases() return 1 diff --git a/code/ATMOSPHERICS/datum_pipeline.dm b/code/ATMOSPHERICS/datum_pipeline.dm index 1d9e9e2d21a..bff793b1c0d 100644 --- a/code/ATMOSPHERICS/datum_pipeline.dm +++ b/code/ATMOSPHERICS/datum_pipeline.dm @@ -8,16 +8,6 @@ var/alert_pressure = 0 -/datum/pipeline/Del() - if(network) - del(network) - - if(air && air.volume) - temporarily_store_air() - del(air) - - ..() - /datum/pipeline/proc/process()//This use to be called called from the pipe networks //Check to see if pressure is within acceptable limits @@ -51,9 +41,10 @@ corresponding.moles = trace_gas.moles*member.volume/air.volume +var/pipenetwarnings = 10 + /datum/pipeline/proc/build_pipeline(obj/machinery/atmospherics/pipe/base) air = new - var/list/possible_expansions = list(base) members = list(base) edges = list() @@ -67,7 +58,6 @@ base.air_temporary = null else air = new - while(possible_expansions.len>0) for(var/obj/machinery/atmospherics/pipe/borderline in possible_expansions) @@ -77,6 +67,13 @@ if(result.len>0) for(var/obj/machinery/atmospherics/pipe/item in result) if(!members.Find(item)) + + if(item.parent) + if(pipenetwarnings > 0) + error("[item.type] added to a pipenet while still having one. ([item.x], [item.y], [item.z])") + pipenetwarnings -= 1 + if(pipenetwarnings == 0) + error("further messages about pipenets will be supressed") members += item possible_expansions += item @@ -97,6 +94,57 @@ air.volume = volume +/datum/pipeline/proc/addMember(obj/machinery/atmospherics/pipe/P) + P.parent = src + var/list/adjacent = P.pipeline_expansion() + var/list/oldedges = list() + for(var/obj/machinery/atmospherics/pipe/I in adjacent) + oldedges += I + if(I.parent == src) + continue + var/datum/pipeline/E = I.parent + if(E.members.len > members.len) + members.Add(E.members) + for(var/obj/machinery/atmospherics/pipe/S in E.members) + S.parent = src + edges.Add(E.edges) + air.merge(E.air) + adjacent -= I + if(adjacent.len) + edges |= P + members |= P + if(oldedges.len) + for(var/obj/machinery/atmospherics/pipe/O in oldedges) + var/list/Oedges = O.pipeline_expansion() + for(var/obj/machinery/atmospherics/pipe/Oedgepipes in Oedges) + Oedges -= Oedgepipes + if(Oedges.len) + edges |= O + else + edges -= O + +/datum/pipeline/proc/removeLastMember(obj/machinery/atmospherics/pipe/P) + if(members.len == 1 && members.Find(P)) + qdel() + if(P.air_temporary) + var/turf/T = P.loc + T.assume_air(P.air_temporary) + +/obj/machinery/atmospherics/proc/addMember(obj/machinery/atmospherics/pipe/P) + return + +/obj/machinery/atmospherics/pipe/addMember(obj/machinery/atmospherics/pipe/P) + parent.addMember(P) + +/datum/pipeline/Destroy() + if(network) + qdel(network) + if(air && air.volume) + temporarily_store_air() + for(var/obj/machinery/atmospherics/pipe/P in members) + P.parent = null + ..() + /datum/pipeline/proc/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) if(new_network.line_members.Find(src)) diff --git a/code/ATMOSPHERICS/he_pipes.dm b/code/ATMOSPHERICS/he_pipes.dm index c1cd3304c8e..03a892e7a37 100644 --- a/code/ATMOSPHERICS/he_pipes.dm +++ b/code/ATMOSPHERICS/he_pipes.dm @@ -4,58 +4,42 @@ icon_state = "intact" level = 2 var/initialize_directions_he - minimum_temperature_difference = 20 thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT -// BubbleWrap /obj/machinery/atmospherics/pipe/simple/heat_exchanging/New() ..() initialize_directions_he = initialize_directions // The auto-detection from /pipe is good enough for a simple HE pipe -// BubbleWrap END /obj/machinery/atmospherics/pipe/simple/heat_exchanging/initialize() normalize_dir() - var/node1_dir - var/node2_dir - - for(var/direction in cardinal) - if(direction&initialize_directions_he) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction - - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node1_dir)) - if(target.initialize_directions_he & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src,node2_dir)) - if(target.initialize_directions_he & get_dir(target,src)) - node2 = target - break + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions_he) + N-- + for(var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/target in get_step(src, D)) + if(target.initialize_directions_he & get_dir(target,src)) + if(!node1 && N == 1) + node1 = target + break + if(!node2 && N == 0) + node2 = target + break update_icon() - return - /obj/machinery/atmospherics/pipe/simple/heat_exchanging/process() - if(!parent) - ..() - else - var/environment_temperature = 0 - if(istype(loc, /turf/simulated/)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature - else + var/environment_temperature = 0 + if(istype(loc, /turf/simulated)) + if(loc:blocks_air) environment_temperature = loc:temperature - var/datum/gas_mixture/pipe_air = return_air() - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - - + else + var/datum/gas_mixture/environment = loc.return_air() + environment_temperature = environment.temperature + else + environment_temperature = loc:temperature + var/datum/gas_mixture/pipe_air = return_air() + if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) + parent.temperature_interact(loc, volume, thermal_conductivity) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction icon = 'icons/obj/pipes/junction.dmi' @@ -64,23 +48,21 @@ minimum_temperature_difference = 300 thermal_conductivity = WALL_HEAT_TRANSFER_COEFFICIENT -// BubbleWrap /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/New() - .. () - switch ( dir ) - if ( SOUTH ) + ..() + switch(dir) + if(SOUTH) initialize_directions = NORTH initialize_directions_he = SOUTH - if ( NORTH ) + if(NORTH) initialize_directions = SOUTH initialize_directions_he = NORTH - if ( EAST ) + if(EAST) initialize_directions = WEST initialize_directions_he = EAST - if ( WEST ) + if(WEST) initialize_directions = EAST initialize_directions_he = WEST -// BubbleWrap END /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/update_icon() if(node1&&node2) @@ -89,8 +71,6 @@ var/have_node1 = node1?1:0 var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2]" - if(!node1&&!node2) - qdel(src) /obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/initialize() for(var/obj/machinery/atmospherics/target in get_step(src,initialize_directions)) @@ -101,6 +81,5 @@ if(target.initialize_directions_he & get_dir(target,src)) node2 = target break - update_icon() return diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index 53858c331f2..571f7bda15a 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -1,16 +1,11 @@ /obj/machinery/atmospherics/pipe - var/datum/gas_mixture/air_temporary //used when reconstructing a pipeline that broke var/datum/pipeline/parent - var/volume = 0 force = 20 - layer = 2.4 //under wires with their 2.44 use_power = 0 - can_unwrench = 1 - var/alert_pressure = 80*ONE_ATMOSPHERE //minimum pressure before check_pressure(...) should be called @@ -20,68 +15,57 @@ /obj/machinery/atmospherics/pipe/proc/check_pressure(pressure) //Return 1 if parent should continue checking other pipes //Return null if parent should stop checking other pipes. Recall: del(src) will by default return null - return 1 /obj/machinery/atmospherics/pipe/return_air() if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - return parent.air /obj/machinery/atmospherics/pipe/build_network() if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - return parent.return_network() /obj/machinery/atmospherics/pipe/network_expand(datum/pipe_network/new_network, obj/machinery/atmospherics/pipe/reference) if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - return parent.network_expand(new_network, reference) /obj/machinery/atmospherics/pipe/return_network(obj/machinery/atmospherics/reference) if(!parent) parent = new /datum/pipeline() parent.build_pipeline(src) - return parent.return_network(reference) /obj/machinery/atmospherics/pipe/Destroy() del(parent) - if(air_temporary) - loc.assume_air(air_temporary) - del(air_temporary) - ..() +/obj/machinery/atmospherics/pipe/attackby(obj/item/weapon/W, mob/user) + if(istype(W, /obj/item/device/analyzer)) + atmosanalyzer_scan(parent.air, user) + else + return ..() + /obj/machinery/atmospherics/pipe/simple icon = 'icons/obj/pipes.dmi' icon_state = "intact-f" - name = "pipe" desc = "A one meter section of regular pipe" - volume = 70 - dir = SOUTH initialize_directions = SOUTH|NORTH - var/obj/machinery/atmospherics/node1 var/obj/machinery/atmospherics/node2 - var/minimum_temperature_difference = 300 var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No - var/maximum_pressure = 70*ONE_ATMOSPHERE var/fatigue_pressure = 55*ONE_ATMOSPHERE alert_pressure = 55*ONE_ATMOSPHERE - - level = 1 /obj/machinery/atmospherics/pipe/simple/New() @@ -100,65 +84,57 @@ if(SOUTHWEST) initialize_directions = SOUTH|WEST - -/obj/machinery/atmospherics/pipe/simple/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 +/obj/machinery/atmospherics/pipe/simple/initialize() + normalize_dir() + var/N = 2 + for(var/D in cardinal) + if(D & initialize_directions) + N-- + for(var/obj/machinery/atmospherics/target in get_step(src, D)) + if(target.initialize_directions & get_dir(target,src)) + if(!node1 && N == 1) + node1 = target + break + if(!node2 && N == 0) + node2 = target + break + var/turf/T = loc // hide if turf is not intact + hide(T.intact) update_icon() -/obj/machinery/atmospherics/pipe/simple/process() - if(!parent) //This should cut back on the overhead calling build_network thousands of times per cycle - ..() - else - . = PROCESS_KILL +/obj/machinery/atmospherics/pipe/simple/Destroy() + if(node1) + var/obj/machinery/atmospherics/A = node1 + node1.disconnect(src) + A.build_network() + if(node2) + var/obj/machinery/atmospherics/A = node2 + node2.disconnect(src) + A.build_network() + if(parent) + parent.removeLastMember(src) + ..() - /*if(!node1) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - - else if(!node2) - parent.mingle_with_turf(loc, volume) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 - - - else if(parent) - var/environment_temperature = 0 - - if(istype(loc, /turf/simulated/)) - if(loc:blocks_air) - environment_temperature = loc:temperature - else - var/datum/gas_mixture/environment = loc.return_air() - environment_temperature = environment.temperature - - else - environment_temperature = loc:temperature - - var/datum/gas_mixture/pipe_air = return_air() - - if(abs(environment_temperature-pipe_air.temperature) > minimum_temperature_difference) - parent.temperature_interact(loc, volume, thermal_conductivity) - */ //Screw you heat lag +/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + qdel(parent) + node1 = null + if(reference == node2) + if(istype(node2, /obj/machinery/atmospherics/pipe)) + qdel(parent) + node2 = null + update_icon() /obj/machinery/atmospherics/pipe/simple/check_pressure(pressure) var/datum/gas_mixture/environment = loc.return_air() - var/pressure_difference = pressure - environment.return_pressure() - if(pressure_difference > maximum_pressure) burst() - else if(pressure_difference > fatigue_pressure) //TODO: leak to turf, doing pfshhhhh if(prob(5)) burst() - else return 1 /obj/machinery/atmospherics/pipe/simple/proc/burst() @@ -175,17 +151,6 @@ else if(dir==12) dir = 4 -/obj/machinery/atmospherics/pipe/simple/Destroy() - if(node1) - node1.disconnect(src) - if(node2) - node2.disconnect(src) - - ..() - -/obj/machinery/atmospherics/pipe/simple/pipeline_expansion() - return list(node1, node2) - /obj/machinery/atmospherics/pipe/simple/update_icon() if(node1&&node2) var/C = "" @@ -197,62 +162,140 @@ if ("yellow") C = "-y" if ("purple") C = "-p" icon_state = "intact[C][invisibility ? "-f" : "" ]" - - //var/node1_direction = get_dir(src, node1) - //var/node2_direction = get_dir(src, node2) - - //dir = node1_direction|node2_direction - else - if(!node1&&!node2) - qdel(src) //TODO: silent deleting looks weird var/have_node1 = node1?1:0 var/have_node2 = node2?1:0 icon_state = "exposed[have_node1][have_node2][invisibility ? "-f" : "" ]" +/obj/machinery/atmospherics/pipe/simple/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 + update_icon() -/obj/machinery/atmospherics/pipe/simple/initialize() - normalize_dir() - var/node1_dir - var/node2_dir +/obj/machinery/atmospherics/pipe/simple/pipeline_expansion() + return list(node1, node2) - for(var/direction in cardinal) - if(direction&initialize_directions) - if (!node1_dir) - node1_dir = direction - else if (!node2_dir) - node2_dir = direction +/obj/machinery/atmospherics/pipe/simple/insulated + icon = 'icons/obj/atmospherics/red_pipe.dmi' + icon_state = "intact" + minimum_temperature_difference = 10000 + thermal_conductivity = 0 + maximum_pressure = 1000*ONE_ATMOSPHERE + fatigue_pressure = 900*ONE_ATMOSPHERE + alert_pressure = 900*ONE_ATMOSPHERE + level = 2 - for(var/obj/machinery/atmospherics/target in get_step(src,node1_dir)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - for(var/obj/machinery/atmospherics/target in get_step(src,node2_dir)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - break +/obj/machinery/atmospherics/pipe/manifold + icon = 'icons/obj/atmospherics/pipe_manifold.dmi' + icon_state = "manifold-f" + name = "pipe manifold" + desc = "A manifold composed of regular pipes" + volume = 105 + dir = SOUTH + initialize_directions = EAST|NORTH|WEST + var/obj/machinery/atmospherics/node1 + var/obj/machinery/atmospherics/node2 + var/obj/machinery/atmospherics/node3 + level = 1 + layer = 2.4 //under wires with their 2.44 +/obj/machinery/atmospherics/pipe/manifold/New() + switch(dir) + if(NORTH) + initialize_directions = EAST|SOUTH|WEST + if(SOUTH) + initialize_directions = WEST|NORTH|EAST + if(EAST) + initialize_directions = SOUTH|WEST|NORTH + if(WEST) + initialize_directions = NORTH|EAST|SOUTH + ..() +/obj/machinery/atmospherics/pipe/manifold/initialize() + for(var/D in cardinal) + if(D == dir) + continue + for(var/obj/machinery/atmospherics/target in get_step(src, D)) + if(target.initialize_directions & get_dir(target,src)) + if(turn(dir, 90) == D) + node1 = target + if(turn(dir, 270) == D) + node2 = target + if(turn(dir, 180) == D) + node3 = target + break var/turf/T = src.loc // hide if turf is not intact hide(T.intact) update_icon() - //update_icon() -/obj/machinery/atmospherics/pipe/simple/disconnect(obj/machinery/atmospherics/reference) +/obj/machinery/atmospherics/pipe/manifold/Destroy() + if(node1) + var/obj/machinery/atmospherics/A = node1 + node1.disconnect(src) + A.build_network() + if(node2) + var/obj/machinery/atmospherics/A = node2 + node2.disconnect(src) + A.build_network() + if(node3) + var/obj/machinery/atmospherics/A = node3 + node3.disconnect(src) + A.build_network() + if(parent) + parent.removeLastMember(src) + ..() + +/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) if(reference == node1) if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node1 = null - if(reference == node2) if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) + qdel(parent) node2 = null + if(reference == node3) + if(istype(node3, /obj/machinery/atmospherics/pipe)) + qdel(parent) + node3 = null + update_icon() + ..() +/obj/machinery/atmospherics/pipe/manifold/update_icon() + if(node1&&node2&&node3) + var/C = "" + switch(pipe_color) + if ("red") C = "-r" + if ("blue") C = "-b" + if ("cyan") C = "-c" + if ("green") C = "-g" + if ("yellow") C = "-y" + if ("purple") C = "-p" + icon_state = "manifold[C][invisibility ? "-f" : ""]" + else + var/connected = 0 + var/unconnected = 0 + var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) + if(node1) + connected |= get_dir(src, node1) + if(node2) + connected |= get_dir(src, node2) + if(node3) + connected |= get_dir(src, node3) + unconnected = (~connected)&(connect_directions) + icon_state = "manifold_[connected]_[unconnected]" + +/obj/machinery/atmospherics/pipe/manifold/hide(var/i) + if(level == 1 && istype(loc, /turf/simulated)) + invisibility = i ? 101 : 0 update_icon() - return null +/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() + return list(node1, node2, node3) + + +//coloured pipes /obj/machinery/atmospherics/pipe/simple/scrubbers name="Scrubbers pipe" pipe_color="red" @@ -319,434 +362,7 @@ icon_state = "intact-y-f" - -/obj/machinery/atmospherics/pipe/simple/insulated - icon = 'icons/obj/atmospherics/red_pipe.dmi' - icon_state = "intact" - - minimum_temperature_difference = 10000 - thermal_conductivity = 0 - maximum_pressure = 1000*ONE_ATMOSPHERE - fatigue_pressure = 900*ONE_ATMOSPHERE - alert_pressure = 900*ONE_ATMOSPHERE - - level = 2 - - -/obj/machinery/atmospherics/pipe/tank - icon = 'icons/obj/atmospherics/pipe_tank.dmi' - icon_state = "intact" - - name = "pressure tank" - desc = "A large vessel containing pressurized gas." - - volume = 10000 //in liters, 1 meters by 1 meters by 2 meters - - dir = SOUTH - initialize_directions = SOUTH - density = 1 - - can_unwrench = 0 - - var/obj/machinery/atmospherics/node1 - -/obj/machinery/atmospherics/pipe/tank/New() - initialize_directions = dir - ..() - -/obj/machinery/atmospherics/pipe/tank/process() - if(!parent) - ..() - else - . = PROCESS_KILL -/* if(!node1) - parent.mingle_with_turf(loc, 200) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -/obj/machinery/atmospherics/pipe/tank/carbon_dioxide - name = "pressure tank (Carbon Dioxide)" - -/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -/obj/machinery/atmospherics/pipe/tank/toxins - icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi' - name = "pressure tank (Plasma)" - -/obj/machinery/atmospherics/pipe/tank/toxins/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b - icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi' - name = "pressure tank (Oxygen + Plasma)" - -/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T0C - - var/datum/gas/oxygen_agent_b/trace_gas = new - trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - air_temporary.trace_gases += trace_gas - - ..() - -/obj/machinery/atmospherics/pipe/tank/oxygen - icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi' - name = "pressure tank (Oxygen)" - -/obj/machinery/atmospherics/pipe/tank/oxygen/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -/obj/machinery/atmospherics/pipe/tank/nitrogen - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "pressure tank (Nitrogen)" - -/obj/machinery/atmospherics/pipe/tank/nitrogen/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -/obj/machinery/atmospherics/pipe/tank/air - icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' - name = "pressure tank (Air)" - -/obj/machinery/atmospherics/pipe/tank/air/New() - air_temporary = new - air_temporary.volume = volume - air_temporary.temperature = T20C - - air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) - - ..() - -/obj/machinery/atmospherics/pipe/tank/Destroy() - if(node1) - node1.disconnect(src) - - ..() - -/obj/machinery/atmospherics/pipe/tank/pipeline_expansion() - return list(node1) - -/obj/machinery/atmospherics/pipe/tank/update_icon() - if(node1) - icon_state = "intact" - - dir = get_dir(src, node1) - - else - icon_state = "exposed" - -/obj/machinery/atmospherics/pipe/tank/initialize() - - var/connect_direction = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - update_icon() - -/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - update_icon() - - return null - -/obj/machinery/atmospherics/pipe/tank/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) - atmosanalyzer_scan(parent.air, user) - -/obj/machinery/atmospherics/pipe/vent - icon = 'icons/obj/atmospherics/pipe_vent.dmi' - icon_state = "intact" - - name = "vent" - desc = "A large air vent" - - level = 1 - - volume = 250 - - dir = SOUTH - initialize_directions = SOUTH - - can_unwrench = 0 - - var/build_killswitch = 1 - - var/obj/machinery/atmospherics/node1 - -/obj/machinery/atmospherics/pipe/vent/New() - initialize_directions = dir - ..() - -/obj/machinery/atmospherics/pipe/vent/process() - if(!parent) - if(build_killswitch <= 0) - . = PROCESS_KILL - else - build_killswitch-- - ..() - return - else - parent.mingle_with_turf(loc, 250) -/* - if(!node1) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -/obj/machinery/atmospherics/pipe/vent/Destroy() - if(node1) - node1.disconnect(src) - - ..() - -/obj/machinery/atmospherics/pipe/vent/pipeline_expansion() - return list(node1) - -/obj/machinery/atmospherics/pipe/vent/update_icon() - if(node1) - icon_state = "intact" - - dir = get_dir(src, node1) - - else - icon_state = "exposed" - -/obj/machinery/atmospherics/pipe/vent/initialize() - var/connect_direction = dir - - for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - break - - update_icon() - -/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - update_icon() - - return null - -/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. - if(node1) - icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" - dir = get_dir(src, node1) - else - icon_state = "exposed" - -/obj/machinery/atmospherics/pipe/manifold - icon = 'icons/obj/atmospherics/pipe_manifold.dmi' - icon_state = "manifold-f" - - name = "pipe manifold" - desc = "A manifold composed of regular pipes" - - volume = 105 - - dir = SOUTH - initialize_directions = EAST|NORTH|WEST - - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/obj/machinery/atmospherics/node3 - - level = 1 - layer = 2.4 //under wires with their 2.44 - -/obj/machinery/atmospherics/pipe/manifold/New() - switch(dir) - if(NORTH) - initialize_directions = EAST|SOUTH|WEST - if(SOUTH) - initialize_directions = WEST|NORTH|EAST - if(EAST) - initialize_directions = SOUTH|WEST|NORTH - if(WEST) - initialize_directions = NORTH|EAST|SOUTH - - ..() - - - -/obj/machinery/atmospherics/pipe/manifold/hide(var/i) - if(level == 1 && istype(loc, /turf/simulated)) - invisibility = i ? 101 : 0 - update_icon() - -/obj/machinery/atmospherics/pipe/manifold/pipeline_expansion() - return list(node1, node2, node3) - -/obj/machinery/atmospherics/pipe/manifold/process() - if(!parent) - ..() - else - . = PROCESS_KILL -/* - if(!node1) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node2) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if(!node3) - parent.mingle_with_turf(loc, 70) - if(!nodealert) - //world << "Missing node from [src] at [src.x],[src.y],[src.z]" - nodealert = 1 - else if (nodealert) - nodealert = 0 -*/ -/obj/machinery/atmospherics/pipe/manifold/Destroy() - if(node1) - node1.disconnect(src) - if(node2) - node2.disconnect(src) - if(node3) - node3.disconnect(src) - - ..() - -/obj/machinery/atmospherics/pipe/manifold/disconnect(obj/machinery/atmospherics/reference) - if(reference == node1) - if(istype(node1, /obj/machinery/atmospherics/pipe)) - del(parent) - node1 = null - - if(reference == node2) - if(istype(node2, /obj/machinery/atmospherics/pipe)) - del(parent) - node2 = null - - if(reference == node3) - if(istype(node3, /obj/machinery/atmospherics/pipe)) - del(parent) - node3 = null - - update_icon() - - ..() - -/obj/machinery/atmospherics/pipe/manifold/update_icon() - if(node1&&node2&&node3) - var/C = "" - switch(pipe_color) - if ("red") C = "-r" - if ("blue") C = "-b" - if ("cyan") C = "-c" - if ("green") C = "-g" - if ("yellow") C = "-y" - if ("purple") C = "-p" - icon_state = "manifold[C][invisibility ? "-f" : ""]" - - else - var/connected = 0 - var/unconnected = 0 - var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) - - if(node1) - connected |= get_dir(src, node1) - if(node2) - connected |= get_dir(src, node2) - if(node3) - connected |= get_dir(src, node3) - - unconnected = (~connected)&(connect_directions) - - icon_state = "manifold_[connected]_[unconnected]" - - if(!connected) - qdel(src) - - return - -/obj/machinery/atmospherics/pipe/manifold/initialize() - var/connect_directions = (NORTH|SOUTH|EAST|WEST)&(~dir) - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node1 = target - connect_directions &= ~direction - break - if (node1) - break - - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node2 = target - connect_directions &= ~direction - break - if (node2) - break - - - for(var/direction in cardinal) - if(direction&connect_directions) - for(var/obj/machinery/atmospherics/target in get_step(src,direction)) - if(target.initialize_directions & get_dir(target,src)) - node3 = target - connect_directions &= ~direction - break - if (node3) - break - - var/turf/T = src.loc // hide if turf is not intact - hide(T.intact) - //update_icon() - update_icon() - +//coloured manifolds /obj/machinery/atmospherics/pipe/manifold/scrubbers name="Scrubbers pipe" pipe_color="red" @@ -812,8 +428,202 @@ level = 1 icon_state = "manifold-y-f" -obj/machinery/atmospherics/pipe/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) - if (istype(W, /obj/item/device/analyzer) && get_dist(user, src) <= 1) - atmosanalyzer_scan(parent.air, user) +/obj/machinery/atmospherics/pipe/vent + icon = 'icons/obj/atmospherics/pipe_vent.dmi' + icon_state = "intact" + + name = "vent" + desc = "A large air vent" + + level = 1 + + volume = 250 + + dir = SOUTH + initialize_directions = SOUTH + + can_unwrench = 0 + + var/build_killswitch = 1 + + var/obj/machinery/atmospherics/node1 + +/obj/machinery/atmospherics/pipe/vent/New() + initialize_directions = dir + ..() + +/obj/machinery/atmospherics/pipe/vent/process() + if(!parent) + if(build_killswitch <= 0) + . = PROCESS_KILL + else + build_killswitch-- + ..() + return else - return ..() + parent.mingle_with_turf(loc, 250) +/* + if(!node1) + if(!nodealert) + //world << "Missing node from [src] at [src.x],[src.y],[src.z]" + nodealert = 1 + else if (nodealert) + nodealert = 0 +*/ +/obj/machinery/atmospherics/pipe/vent/Destroy() + if(node1) + node1.disconnect(src) + ..() + +/obj/machinery/atmospherics/pipe/vent/pipeline_expansion() + return list(node1) + +/obj/machinery/atmospherics/pipe/vent/update_icon() + if(node1) + icon_state = "intact" + + dir = get_dir(src, node1) + + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/vent/initialize() + var/connect_direction = dir + + for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + + update_icon() + +/obj/machinery/atmospherics/pipe/vent/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + + update_icon() + + return null + +/obj/machinery/atmospherics/pipe/vent/hide(var/i) //to make the little pipe section invisible, the icon changes. + if(node1) + icon_state = "[i == 1 && istype(loc, /turf/simulated) ? "h" : "" ]intact" + dir = get_dir(src, node1) + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/tank + icon = 'icons/obj/atmospherics/pipe_tank.dmi' + icon_state = "intact" + name = "pressure tank" + desc = "A large vessel containing pressurized gas." + volume = 10000 //in liters, 1 meters by 1 meters by 2 meters + dir = SOUTH + initialize_directions = SOUTH + density = 1 + can_unwrench = 0 + var/obj/machinery/atmospherics/node1 + +/obj/machinery/atmospherics/pipe/tank/New() + initialize_directions = dir + ..() + +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide + name = "pressure tank (Carbon Dioxide)" + +/obj/machinery/atmospherics/pipe/tank/carbon_dioxide/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + air_temporary.carbon_dioxide = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + ..() + +/obj/machinery/atmospherics/pipe/tank/toxins + icon = 'icons/obj/atmospherics/orange_pipe_tank.dmi' + name = "pressure tank (Plasma)" + +/obj/machinery/atmospherics/pipe/tank/toxins/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + air_temporary.toxins = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + ..() + +/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b + icon = 'icons/obj/atmospherics/red_orange_pipe_tank.dmi' + name = "pressure tank (Oxygen + Plasma)" + +/obj/machinery/atmospherics/pipe/tank/oxygen_agent_b/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T0C + var/datum/gas/oxygen_agent_b/trace_gas = new + trace_gas.moles = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + air_temporary.trace_gases += trace_gas + ..() + +/obj/machinery/atmospherics/pipe/tank/oxygen + icon = 'icons/obj/atmospherics/blue_pipe_tank.dmi' + name = "pressure tank (Oxygen)" + +/obj/machinery/atmospherics/pipe/tank/oxygen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + air_temporary.oxygen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + ..() + +/obj/machinery/atmospherics/pipe/tank/nitrogen + icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' + name = "pressure tank (Nitrogen)" + +/obj/machinery/atmospherics/pipe/tank/nitrogen/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + air_temporary.nitrogen = (25*ONE_ATMOSPHERE)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + ..() + +/obj/machinery/atmospherics/pipe/tank/air + icon = 'icons/obj/atmospherics/red_pipe_tank.dmi' + name = "pressure tank (Air)" + +/obj/machinery/atmospherics/pipe/tank/air/New() + air_temporary = new + air_temporary.volume = volume + air_temporary.temperature = T20C + air_temporary.oxygen = (25*ONE_ATMOSPHERE*O2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + air_temporary.nitrogen = (25*ONE_ATMOSPHERE*N2STANDARD)*(air_temporary.volume)/(R_IDEAL_GAS_EQUATION*air_temporary.temperature) + ..() + +/obj/machinery/atmospherics/pipe/tank/Destroy() + if(node1) + node1.disconnect(src) + ..() + +/obj/machinery/atmospherics/pipe/tank/pipeline_expansion() + return list(node1) + +/obj/machinery/atmospherics/pipe/tank/update_icon() + if(node1) + icon_state = "intact" + dir = get_dir(src, node1) + else + icon_state = "exposed" + +/obj/machinery/atmospherics/pipe/tank/initialize() + var/connect_direction = dir + for(var/obj/machinery/atmospherics/target in get_step(src,connect_direction)) + if(target.initialize_directions & get_dir(target,src)) + node1 = target + break + update_icon() + +/obj/machinery/atmospherics/pipe/tank/disconnect(obj/machinery/atmospherics/reference) + if(reference == node1) + if(istype(node1, /obj/machinery/atmospherics/pipe)) + del(parent) + node1 = null + update_icon() \ No newline at end of file diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index 1b8387805d9..a0620d4d2fb 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -63,10 +63,6 @@ if (config.log_adminchat) diary << "\[[time_stamp()]]ADMINSAY: [text]" -/proc/log_adminwarn(text) - if (config.log_adminwarn) - diary << "\[[time_stamp()]]ADMINWARN: [text]" - /proc/log_pda(text) if (config.log_pda) diary << "\[[time_stamp()]]PDA: [text]" \ No newline at end of file diff --git a/code/__HELPERS/cmp.dm b/code/__HELPERS/cmp.dm new file mode 100644 index 00000000000..0c86ae75c4e --- /dev/null +++ b/code/__HELPERS/cmp.dm @@ -0,0 +1,30 @@ +/proc/cmp_numeric_dsc(a,b) + return b - a + +/proc/cmp_numeric_asc(a,b) + return a - b + +/proc/cmp_text_asc(a,b) + return sorttext(b,a) + +/proc/cmp_text_dsc(a,b) + return sorttext(a,b) + +/proc/cmp_name_asc(atom/a, atom/b) + return sorttext(b.name, a.name) + +/proc/cmp_name_dsc(atom/a, atom/b) + return sorttext(a.name, b.name) + +var/cmp_field = "name" +/proc/cmp_records_asc(datum/data/record/a, datum/data/record/b) + return sorttext(b.fields[cmp_field], a.fields[cmp_field]) + +/proc/cmp_records_dsc(datum/data/record/a, datum/data/record/b) + return sorttext(a.fields[cmp_field], b.fields[cmp_field]) + +/proc/cmp_ckey_asc(client/a, client/b) + return sorttext(b.ckey, a.ckey) + +/proc/cmp_ckey_dsc(client/a, client/b) + return sorttext(a.ckey, b.ckey) \ No newline at end of file diff --git a/code/__HELPERS/lists.dm b/code/__HELPERS/lists.dm index eb44cf81c71..cd56614098c 100644 --- a/code/__HELPERS/lists.dm +++ b/code/__HELPERS/lists.dm @@ -167,25 +167,25 @@ /* * Sorting */ - +/* //Reverses the order of items in the list /proc/reverselist(var/list/input) var/list/output = list() for(var/i = input.len; i >= 1; i--) output += input[i] return output +*/ //Randomize: Return the list in a random order -/proc/shuffle(var/list/shufflelist) - if(!shufflelist) +/proc/shuffle(var/list/L) + if(!L) return - var/list/new_list = list() - var/list/old_list = shufflelist.Copy() - while(old_list.len) - var/item = pick(old_list) - new_list += item - old_list -= item - return new_list + L = L.Copy() + + for(var/i=1, i<=L.len, ++i) + L.Swap(i,rand(1,L.len)) + + return L //Return a list with no duplicate entries /proc/uniquelist(var/list/L) @@ -195,141 +195,22 @@ K += item return K -//Mergesort: divides up the list into halves to begin the sort -/proc/sortKey(var/list/client/L, var/order = 1) - if(isnull(L) || L.len < 2) - return L - var/middle = L.len / 2 + 1 - return mergeKey(sortKey(L.Copy(0,middle)), sortKey(L.Copy(middle)), order) +//for sorting clients or mobs by ckey +/proc/sortKey(list/L, order=1) + return sortTim(L, order >= 0 ? /proc/cmp_ckey_asc : /proc/cmp_ckey_dsc) -//Mergsort: does the actual sorting and returns the results back to sortAtom -/proc/mergeKey(var/list/client/L, var/list/client/R, var/order = 1) - var/Li=1 - var/Ri=1 - var/list/result = new() - while(Li <= L.len && Ri <= R.len) - var/client/rL = L[Li] - var/client/rR = R[Ri] - if(sorttext(rL.ckey, rR.ckey) == order) - result += L[Li++] - else - result += R[Ri++] +//Specifically for record datums in a list. +/proc/sortRecord(list/L, field = "name", order = 1) + cmp_field = field + return sortTim(L, order >= 0 ? /proc/cmp_records_asc : /proc/cmp_records_dsc) - if(Li <= L.len) - return (result + L.Copy(Li, 0)) - return (result + R.Copy(Ri, 0)) +//any value in a list +/proc/sortList(var/list/L, cmp=/proc/cmp_text_asc) + return sortTim(L.Copy(), cmp) -//Mergesort: divides up the list into halves to begin the sort -/proc/sortAtom(var/list/atom/L, var/order = 1) - if(isnull(L) || L.len < 2) - return L - var/middle = L.len / 2 + 1 - return mergeAtoms(sortAtom(L.Copy(0,middle)), sortAtom(L.Copy(middle)), order) - -//Mergsort: does the actual sorting and returns the results back to sortAtom -/proc/mergeAtoms(var/list/atom/L, var/list/atom/R, var/order = 1) - var/Li=1 - var/Ri=1 - var/list/result = new() - while(Li <= L.len && Ri <= R.len) - var/atom/rL = L[Li] - var/atom/rR = R[Ri] - if(sorttext(rL.name, rR.name) == order) - result += L[Li++] - else - result += R[Ri++] - - if(Li <= L.len) - return (result + L.Copy(Li, 0)) - return (result + R.Copy(Ri, 0)) - - - - -//Mergesort: Specifically for record datums in a list. -/proc/sortRecord(var/list/datum/data/record/L, var/field = "name", var/order = 1) - if(isnull(L)) - return list() - if(L.len < 2) - return L - var/middle = L.len / 2 + 1 - return mergeRecordLists(sortRecord(L.Copy(0, middle), field, order), sortRecord(L.Copy(middle), field, order), field, order) - -//Mergsort: does the actual sorting and returns the results back to sortRecord -/proc/mergeRecordLists(var/list/datum/data/record/L, var/list/datum/data/record/R, var/field = "name", var/order = 1) - var/Li=1 - var/Ri=1 - var/list/result = new() - if(!isnull(L) && !isnull(R)) - while(Li <= L.len && Ri <= R.len) - var/datum/data/record/rL = L[Li] - if(isnull(rL)) - L -= rL - continue - var/datum/data/record/rR = R[Ri] - if(isnull(rR)) - R -= rR - continue - if(sorttext(rL.fields[field], rR.fields[field]) == order) - result += L[Li++] - else - result += R[Ri++] - - if(Li <= L.len) - return (result + L.Copy(Li, 0)) - return (result + R.Copy(Ri, 0)) - - - - -//Mergesort: any value in a list -/proc/sortList(var/list/L) - if(L.len < 2) - return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 - return mergeLists(sortList(L.Copy(0,middle)), sortList(L.Copy(middle))) //second parameter null = to end of list - -//Mergsorge: uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead -/proc/sortNames(var/list/L) - var/list/Q = new() - for(var/atom/x in L) - Q[x.name] = x - return sortList(Q) - -/proc/mergeLists(var/list/L, var/list/R) - var/Li=1 - var/Ri=1 - var/list/result = new() - while(Li <= L.len && Ri <= R.len) - if(sorttext(L[Li], R[Ri]) < 1) - result += R[Ri++] - else - result += L[Li++] - - if(Li <= L.len) - return (result + L.Copy(Li, 0)) - return (result + R.Copy(Ri, 0)) - -//Mergesort: any value in a list, preserves key=value structure -/proc/sortAssoc(var/list/L) - if(L.len < 2) - return L - var/middle = L.len / 2 + 1 // Copy is first,second-1 - return mergeAssoc(sortAssoc(L.Copy(0,middle)), sortAssoc(L.Copy(middle))) //second parameter null = to end of list - -/proc/mergeAssoc(var/list/L, var/list/R) - var/Li=1 - var/Ri=1 - var/list/result = new() - while(Li <= L.len && Ri <= R.len) - if(sorttext(L[Li], R[Ri]) < 1) - result += R&R[Ri++] - else - result += L&L[Li++] - - if(Li <= L.len) - return (result + L.Copy(Li, 0)) - return (result + R.Copy(Ri, 0)) +//uses sortList() but uses the var's name specifically. This should probably be using mergeAtom() instead +/proc/sortNames(var/list/L, order=1) + return sortTim(L, order >= 0 ? /proc/cmp_name_asc : /proc/cmp_name_dsc) //Converts a bitfield to a list of numbers (or words if a wordlist is provided) @@ -368,4 +249,84 @@ /proc/find_record(field, value, list/L) for(var/datum/data/record/R in L) if(R.fields[field] == value) - return R \ No newline at end of file + return R + + +//Move a single element from position fromIndex within a list, to position toIndex +//This will preserve associations ~Carnie +/proc/moveElement(list/L, fromIndex, toIndex) + if(fromIndex > toIndex) + ++fromIndex + else + ++toIndex + + L.Insert(toIndex, null) + L.Swap(fromIndex, toIndex) + L.Cut(fromIndex, fromIndex+1) + + +//Move elements [fromIndex,fromIndex+len) to [toIndex,toIndex+len) +//This will preserve associations and is much faster than copying to a new list +//or checking for associative lists and manually copying elements ~Carnie +/proc/moveRange(list/L, fromIndex, toIndex, len=1) + var/distance = abs(toIndex - fromIndex) + if(len > distance) //there are more elements to be moved than the distance to be moved. Therefore the same result can be achieved (with fewer operations) by moving elements between where we are and where we are going + if(fromIndex < toIndex) + toIndex += len + else + fromIndex += len + + for(var/i=0, i toIndex) + fromIndex += len + else + toIndex += len //? + + for(var/i=0, i distance) //there is an overlap, therefore swapping each element will require more swaps than inserting new elements + if(fromIndex < toIndex) + toIndex += len + else + fromIndex += len + + for(var/i=0, i fromIndex) + var/a = toIndex + toIndex = fromIndex + fromIndex = a + + for(var/i=0, i= 2) + fromIndex = fromIndex % L.len + toIndex = toIndex % (L.len+1) + if(fromIndex <= 0) + fromIndex += L.len + if(toIndex <= 0) + toIndex += L.len + 1 + + sortInstance.L = L + sortInstance.cmp = cmp + sortInstance.associative = associative + + sortInstance.binarySort(fromIndex, toIndex, fromIndex) + return L \ No newline at end of file diff --git a/code/__HELPERS/sorts/MergeSort.dm b/code/__HELPERS/sorts/MergeSort.dm new file mode 100644 index 00000000000..228a08efb93 --- /dev/null +++ b/code/__HELPERS/sorts/MergeSort.dm @@ -0,0 +1,16 @@ +//merge-sort - gernerally faster than insert sort, for runs of 7 or larger +/proc/sortMerge(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex) + if(L && L.len >= 2) + fromIndex = fromIndex % L.len + toIndex = toIndex % (L.len+1) + if(fromIndex <= 0) + fromIndex += L.len + if(toIndex <= 0) + toIndex += L.len + 1 + + sortInstance.L = L + sortInstance.cmp = cmp + sortInstance.associative = associative + sortInstance.mergeSort(fromIndex, toIndex) + + return L \ No newline at end of file diff --git a/code/__HELPERS/sorts/TimSort.dm b/code/__HELPERS/sorts/TimSort.dm new file mode 100644 index 00000000000..4aa51263656 --- /dev/null +++ b/code/__HELPERS/sorts/TimSort.dm @@ -0,0 +1,17 @@ +//TimSort interface +/proc/sortTim(list/L, cmp=/proc/cmp_numeric_asc, associative, fromIndex=1, toIndex=0) + if(L && L.len >= 2) + fromIndex = fromIndex % L.len + toIndex = toIndex % (L.len+1) + if(fromIndex <= 0) + fromIndex += L.len + if(toIndex <= 0) + toIndex += L.len + 1 + + sortInstance.L = L + sortInstance.cmp = cmp + sortInstance.associative = associative + + sortInstance.timSort(fromIndex, toIndex) + + return L \ No newline at end of file diff --git a/code/__HELPERS/sorts/__main.dm b/code/__HELPERS/sorts/__main.dm new file mode 100644 index 00000000000..01dc9e96d9c --- /dev/null +++ b/code/__HELPERS/sorts/__main.dm @@ -0,0 +1,668 @@ + //These are macros used to reduce on proc calls +#define moveElement(L, fromIndex, toIndex) if((fromIndex) > (toIndex)){L.Insert((toIndex), null);L.Swap((fromIndex)+1, (toIndex));L.Cut((fromIndex)+1, (fromIndex)+2);}else{L.Insert((toIndex)+1, null);L.Swap((fromIndex), (toIndex)+1);L.Cut((fromIndex), (fromIndex)+1);} +#define fetchElement(L, i) (associative) ? L[L[i]] : L[i] + + //Minimum sized sequence that will be merged. Anything smaller than this will use binary-insertion sort. + //Should be a power of 2 +#define MIN_MERGE 32 + + //When we get into galloping mode, we stay there until both runs win less often than MIN_GALLOP consecutive times. +#define MIN_GALLOP 7 + + //This is a global instance to allow much of this code to be reused. The interfaces are kept seperately +var/datum/sortInstance/sortInstance = new() +/datum/sortInstance + //The array being sorted. + var/list/L + + //The comparator proc-reference + var/cmp = /proc/cmp_numeric_asc + + //whether we are sorting list keys (0: L[i]) or associated values (1: L[L[i]]) + var/associative = 0 + + //This controls when we get *into* galloping mode. It is initialized to MIN_GALLOP. + //The mergeLo and mergeHi methods nudge it higher for random data, and lower for highly structured data. + var/minGallop = MIN_GALLOP + + //Stores information regarding runs yet to be merged. + //Run i starts at runBase[i] and extends for runLen[i] elements. + //runBase[i] + runLen[i] == runBase[i+1] + //var/stackSize + var/list/runBases = list() + var/list/runLens = list() + + + proc/timSort(start, end) + runBases.Cut() + runLens.Cut() + + var/remaining = end - start + + //If array is small, do a 'mini-TimSort' with no merges + if(remaining < MIN_MERGE) + var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start+initRunLen) + return + + //March over the array finding natural runs + //Extend any short natural runs to runs of length minRun + var/minRun = minRunLength(remaining) + + do + //identify next run + var/runLen = countRunAndMakeAscending(start, end) + + //if run is short, extend to min(minRun, remaining) + if(runLen < minRun) + var/force = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+force, start+runLen) + runLen = force + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //maybe merge + mergeCollapse() + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + + //Merge all remaining runs to complete sort + //ASSERT(start == end) + mergeForceCollapse(); + //ASSERT(runBases.len == 1) + + //reset minGallop, for successive calls + minGallop = MIN_GALLOP + + return L + + /* + Sorts the specified portion of the specified array using a binary + insertion sort. This is the best method for sorting small numbers + of elements. It requires O(n log n) compares, but O(n^2) data + movement (worst case). + + If the initial part of the specified range is already sorted, + this method can take advantage of it: the method assumes that the + elements in range [lo,start) are already sorted + + lo the index of the first element in the range to be sorted + hi the index after the last element in the range to be sorted + start the index of the first element in the range that is not already known to be sorted + */ + proc/binarySort(lo, hi, start) + //ASSERT(lo <= start && start <= hi) + if(start <= lo) + start = lo + 1 + + for(,start < hi, ++start) + var/pivot = fetchElement(L,start) + + //set left and right to the index where pivot belongs + var/left = lo + var/right = start + //ASSERT(left <= right) + + //[lo, left) elements <= pivot < [right, start) elements + //in other words, find where the pivot element should go using bisection search + while(left < right) + var/mid = (left + right) >> 1 //round((left+right)/2) + if(call(cmp)(pivot, fetchElement(L,mid)) < 0) + right = mid + else + left = mid+1 + + //ASSERT(left == right) + moveElement(L, start, left) //move pivot element to correct location in the sorted range + + /* + Returns the length of the run beginning at the specified position and reverses the run if it is back-to-front + + A run is the longest ascending sequence with: + a[lo] <= a[lo + 1] <= a[lo + 2] <= ... + or the longest descending sequence with: + a[lo] > a[lo + 1] > a[lo + 2] > ... + + For its intended use in a stable mergesort, the strictness of the + definition of "descending" is needed so that the call can safely + reverse a descending sequence without violating stability. + */ + proc/countRunAndMakeAscending(lo, hi) + //ASSERT(lo < hi) + + var/runHi = lo + 1 + if(runHi >= hi) + return 1 + + var/last = fetchElement(L,lo) + var/current = fetchElement(L,runHi++) + + if(call(cmp)(current, last) < 0) + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) >= 0) + break + ++runHi + reverseRange(L, lo, runHi) + else + while(runHi < hi) + last = current + current = fetchElement(L,runHi) + if(call(cmp)(current, last) < 0) + break + ++runHi + + return runHi - lo + + //Returns the minimum acceptable run length for an array of the specified length. + //Natural runs shorter than this will be extended with binarySort + proc/minRunLength(n) + //ASSERT(n >= 0) + var/r = 0 //becomes 1 if any bits are shifted off + while(n >= MIN_MERGE) + r |= (n & 1) + n >>= 1 + return n + r + + //Examines the stack of runs waiting to be merged and merges adjacent runs until the stack invariants are reestablished: + // runLen[i-3] > runLen[i-2] + runLen[i-1] + // runLen[i-2] > runLen[i-1] + //This method is called each time a new run is pushed onto the stack. + //So the invariants are guaranteed to hold for i= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt(n) + else + break //Invariant is established + + + //Merges all runs on the stack until only one remains. + //Called only once, to finalise the sort + proc/mergeForceCollapse() + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt(n) + + + //Merges the two consecutive runs at stack indices i and i+1 + //Run i must be the penultimate or antepenultimate run on the stack + //In other words, i must be equal to stackSize-2 or stackSize-3 + proc/mergeAt(i) + //ASSERT(runBases.len >= 2) + //ASSERT(i >= 1) + //ASSERT(i == runBases.len - 1 || i == runBases.len - 2) + + var/base1 = runBases[i] + var/base2 = runBases[i+1] + var/len1 = runLens[i] + var/len2 = runLens[i+1] + + //ASSERT(len1 > 0 && len2 > 0) + //ASSERT(base1 + len1 == base2) + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + + + //Find where the first element of run2 goes in run1. + //Prior elements in run1 can be ignored (because they're already in place) + var/k = gallopRight(fetchElement(L,base2), base1, len1, 0) + //ASSERT(k >= 0) + base1 += k + len1 -= k + if(len1 == 0) + return + + //Find where the last element of run1 goes in run2. + //Subsequent elements in run2 can be ignored (because they're already in place) + len2 = gallopLeft(fetchElement(L,base1 + len1 - 1), base2, len2, len2-1) + //ASSERT(len2 >= 0) + if(len2 == 0) + return + + //Merge remaining runs, using tmp array with min(len1, len2) elements + if(len1 <= len2) + mergeLo(base1, len1, base2, len2) + else + mergeHi(base1, len1, base2, len2) + + + /* + Locates the position to insert key within the specified sorted range + If the range contains elements equal to key, this will return the index of the LEFTMOST of those elements + + key the element to be inserted into the sorted range + base the index of the first element of the sorted range + len the length of the sorted range, must be greater than 0 + hint the offset from base at which to begin the search, such that 0 <= hint < len; i.e. base <= hint < base+hint + + Returns the index at which to insert element 'key' + */ + proc/gallopLeft(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/lastOffset = 0 + var/offset = 1 + if(call(cmp)(key, fetchElement(L,base+hint)) > 0) + var/maxOffset = len - hint + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) > 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + else + var/maxOffset = hint + 1 + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) <= 0) + lastOffset = offset + offset = (offset << 1) + 1 + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + //Now L[base+lastOffset] < key <= L[base+offset], so key belongs somewhere to the right of lastOffset but no farther than + //offset. Do a binary search with invariant L[base+lastOffset-1] < key <= L[base+offset] + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) > 0) + lastOffset = m + 1 + else + offset = m + + //ASSERT(lastOffset == offset) + return offset + + /** + * Like gallopLeft, except that if the range contains an element equal to + * key, gallopRight returns the index after the rightmost equal element. + * + * @param key the key whose insertion point to search for + * @param a the array in which to search + * @param base the index of the first element in the range + * @param len the length of the range; must be > 0 + * @param hint the index at which to begin the search, 0 <= hint < n. + * The closer hint is to the result, the faster this method will run. + * @param c the comparator used to order the range, and to search + * @return the int k, 0 <= k <= n such that a[b + k - 1] <= key < a[b + k] + */ + proc/gallopRight(key, base, len, hint) + //ASSERT(len > 0 && hint >= 0 && hint < len) + + var/offset = 1 + var/lastOffset = 0 + if(call(cmp)(key, fetchElement(L,base+hint)) < 0) //key <= L[base+hint] + var/maxOffset = hint + 1 //therefore we want to insert somewhere in the range [base,base+hint] = [base+,base+(hint+1)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint-offset)) < 0) //we are iterating backwards + lastOffset = offset + offset = (offset << 1) + 1 //1 3 7 15 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + var/temp = lastOffset + lastOffset = hint - offset + offset = hint - temp + + else //key > L[base+hint] + var/maxOffset = len - hint //therefore we want to insert somewhere in the range (base+hint,base+len) = [base+hint+1, base+hint+(len-hint)) + while(offset < maxOffset && call(cmp)(key, fetchElement(L,base+hint+offset)) >= 0) + lastOffset = offset + offset = (offset << 1) + 1 + //if(offset <= 0) //int overflow, not an issue here since we are using floats + // offset = maxOffset + + if(offset > maxOffset) + offset = maxOffset + + lastOffset += hint + offset += hint + + //ASSERT(-1 <= lastOffset && lastOffset < offset && offset <= len) + + ++lastOffset + while(lastOffset < offset) + var/m = lastOffset + ((offset - lastOffset) >> 1) + + if(call(cmp)(key, fetchElement(L,base+m)) < 0) //key <= L[base+m] + offset = m + else //key > L[base+m] + lastOffset = m + 1 + + //ASSERT(lastOffset == offset) + + return offset + + + //Merges two adjacent runs in-place in a stable fashion. + //For performance this method should only be called when len1 <= len2! + proc/mergeLo(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + //degenerate cases + if(len2 == 1) + moveElement(L, base2, base1) + return + + if(len1 == 1) + moveElement(L, base1, base2+len2-1) + return + + + //Move first element of second run + moveElement(L, base2, base1) //L[dest++] = L[cursor2++] + --len2 + + var/cursor1 = base1+1 + var/cursor2 = base2+1 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thin until one run starts winning consistently + + do + //ASSERT(len1 > 1 && len2 > 0) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor2, cursor1) + ++cursor2 + ++cursor1 + --len2 + + ++count2 + count1 = 0 + + if(len2 == 0) + break outer + else + ++cursor1 + + ++count1 + count2 = 0 + + if(--len1 == 1) + break outer + + while((count1 | count2) < minGallop) + + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 1 && len2 > 0) + + count1 = gallopRight(fetchElement(L,cursor2), cursor1, len1, 0) + if(count1) + cursor1 += count1 + len1 -= count1 + + if(len1 <= 1) + break outer + + moveElement(L, cursor2, cursor1) + ++cursor2 + ++cursor1 + if(--len2 == 0) + break outer + + count2 = gallopLeft(fetchElement(L,cursor1), cursor2, len2, 0) + if(count2) + moveRange(L, cursor2, cursor1, count2) + + cursor2 += count2 + cursor1 += count2 + len2 -= count2 + + if(len2 == 0) + break outer + + ++cursor1 + if(--len1 == 1) + break outer + + --minGallop + + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2; // Penalize for leaving gallop mode + + + if(len1 == 1) + //ASSERT(len2 > 0) + + moveRange(L, cursor2, cursor1, len2) + + //else + //ASSERT(len2 == 0) + //ASSERT(len1 > 1) + + + proc/mergeHi(base1, len1, base2, len2) + //ASSERT(len1 > 0 && len2 > 0 && base1 + len1 == base2) + + //degenerate cases + if(len2 == 1) + moveElement(L, base2, base1) + return + + if(len1 == 1) + moveElement(L, base1, base2+len2-1) + return + + var/cursor1 = base1 + len1 - 1 + var/cursor2 = base2 + len2 - 1 + + moveElement(L, cursor1, cursor2) + --len1 + --cursor1 + --cursor2 + + outer: + while(1) + var/count1 = 0 //# of times in a row that first run won + var/count2 = 0 // " " " " " " second run won + + //do the straightfoward thing until one run starts winning consistently + do + //ASSERT(len1 > 0 && len2 > 1) + if(call(cmp)(fetchElement(L,cursor2), fetchElement(L,cursor1)) < 0) + moveElement(L, cursor1, cursor2) + + --cursor1 + --cursor2 + --len1 + + ++count1 + count2 = 0 + + if(len1 == 0) + break outer + else + --cursor2 + --len2 + + ++count2 + count1 = 0 + + if(len2 == 1) + break outer + while((count1 | count2) < minGallop) + + //one run is winning consistently so galloping may provide huge benifits + //so try galloping, until such time as the run is no longer consistently winning + do + //ASSERT(len1 > 0 && len2 > 1) + + count1 = len1 - gallopRight(fetchElement(L,cursor2), base1, len1, len1-1) //should cursor1 be base1? + if(count1) + cursor1 -= count1 + cursor2 -= count1 + len1 -= count1 + + moveRange(L, cursor1+1, cursor2+1, count1) + + if(len1 == 0) + break outer + + --cursor2 + + if(--len2 == 1) + break outer + + count2 = len2 - gallopLeft(fetchElement(L,cursor1), base1+len1, len2, len2-1) + if(count2) + cursor2 -= count2 + len2 -= count2 + + if(len2 <= 1) + break outer + + moveElement(L, cursor1, cursor2) + --cursor1 + --cursor2 + --len1 + + if(len1 == 0) + break outer + + --minGallop + while((count1|count2) > MIN_GALLOP) + + if(minGallop < 0) + minGallop = 0 + minGallop += 2 // Penalize for leaving gallop mode + + if(len2 == 1) + //ASSERT(len1 > 0) + + cursor1 -= len1 + cursor2 -= len1 + moveRange(L, cursor1+1, cursor2+1, len1) + + //else + //ASSERT(len1 == 0) + //ASSERT(len2 > 0) + + + proc/mergeSort(start, end) + var/remaining = end - start + + //If array is small, do an insertion sort + if(remaining < MIN_MERGE) + //var/initRunLen = countRunAndMakeAscending(start, end) + binarySort(start, end, start/*+initRunLen*/) + return + + var/minRun = minRunLength(remaining) + + do + var/runLen = (remaining <= minRun) ? remaining : minRun + + binarySort(start, start+runLen, start) + + //add data about run to queue + runBases.Add(start) + runLens.Add(runLen) + + //Advance to find next run + start += runLen + remaining -= runLen + + while(remaining > 0) + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] <= runLens[n] + runLens[n+1]) + if(runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + else if(runLens[n] <= runLens[n+1]) + mergeAt2(n) + else + break //Invariant is established + + while(runBases.len >= 2) + var/n = runBases.len - 1 + if(n > 1 && runLens[n-1] < runLens[n+1]) + --n + mergeAt2(n) + + return L + + proc/mergeAt2(i) + var/cursor1 = runBases[i] + var/cursor2 = runBases[i+1] + + var/end1 = cursor1+runLens[i] + var/end2 = cursor2+runLens[i+1] + + var/val1 = fetchElement(L,cursor1) + var/val2 = fetchElement(L,cursor2) + + while(1) + if(call(cmp)(val1,val2) < 0) + if(++cursor1 >= end1) + break + val1 = fetchElement(L,cursor1) + else + moveElement(L,cursor2,cursor1) + + ++cursor2 + if(++cursor2 >= end2) + break + ++end1 + ++cursor1 + //if(++cursor1 >= end1) + // break + + val2 = fetchElement(L,cursor2) + + + //Record the legth of the combined runs. If i is the 3rd last run now, also slide over the last run + //(which isn't involved in this merge). The current run (i+1) goes away in any case. + runLens[i] += runLens[i+1] + runLens.Cut(i+1, i+2) + runBases.Cut(i+1, i+2) + +#undef MIN_GALLOP +#undef MIN_MERGE + +#undef moveElement +#undef fetchElement \ No newline at end of file diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 24cb285cb27..7450d98fcb8 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -485,7 +485,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Orders mobs by type then by name /proc/sortmobs() var/list/moblist = list() - var/list/sortmob = sortAtom(mob_list) + var/list/sortmob = sortNames(mob_list) for(var/mob/living/silicon/ai/M in sortmob) moblist.Add(M) for(var/mob/camera/M in sortmob) @@ -818,7 +818,7 @@ Turf and target are seperate in case you want to teleport some distance from a t //Returns: all the areas in the world, sorted. /proc/return_sorted_areas() - return sortAtom(return_areas()) + return sortNames(return_areas()) //Takes: Area type as text string or as typepath OR an instance of the area. //Returns: A list of all areas of that type in the world. diff --git a/code/_globalvars/lists/objects.dm b/code/_globalvars/lists/objects.dm index 5dbd2be86fa..a799dd0ee1c 100644 --- a/code/_globalvars/lists/objects.dm +++ b/code/_globalvars/lists/objects.dm @@ -12,4 +12,6 @@ var/global/list/active_diseases = list() var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff var/global/list/surgeries_list = list() //list of all surgeries by name, associated with their path. -var/global/list/table_recipes = list() //list of all table craft recipes \ No newline at end of file +var/global/list/table_recipes = list() //list of all table craft recipes +var/global/list/med_hud_users = list() //list of all entities using a medical HUD. +var/global/list/sec_hud_users = list() //list of all entities using a security HUD. \ No newline at end of file diff --git a/code/_onclick/hud/_defines.dm b/code/_onclick/hud/_defines.dm index 932d14deeeb..faad4720b36 100644 --- a/code/_onclick/hud/_defines.dm +++ b/code/_onclick/hud/_defines.dm @@ -44,6 +44,7 @@ #define ui_storage1 "CENTER+1:18,SOUTH:5" #define ui_storage2 "CENTER+2:20,SOUTH:5" +#define ui_borg_sensor "CENTER-3:16, SOUTH:5" //borgs #define ui_inv1 "CENTER-2:16,SOUTH:5" //borgs #define ui_inv2 "CENTER-1 :16,SOUTH:5" //borgs #define ui_inv3 "CENTER :16,SOUTH:5" //borgs @@ -80,6 +81,7 @@ #define ui_alien_toxin "EAST-1:28,CENTER+5:25" #define ui_alien_fire "EAST-1:28,CENTER+4:25" #define ui_alien_oxygen "EAST-1:28,CENTER+3:25" +#define ui_alien_nightvision "EAST-1:28,CENTER+2:25" //Middle right (status indicators) #define ui_nutrition "EAST-1:28,CENTER-3:11" @@ -94,20 +96,21 @@ // AI -#define ui_ai_core "SOUTH:6,WEST:16" -#define ui_ai_camera_list "SOUTH:6,WEST+1:16" -#define ui_ai_track_with_camera "SOUTH:6,WEST+2:16" -#define ui_ai_camera_light "SOUTH:6,WEST+3:16" -#define ui_ai_crew_monitor "SOUTH:6,WEST+4:16" -#define ui_ai_crew_manifest "SOUTH:6,WEST+5:16" -#define ui_ai_alerts "SOUTH:6,WEST+6:16" -#define ui_ai_announcement "SOUTH:6,WEST+7:16" -#define ui_ai_shuttle "SOUTH:6,WEST+8:16" -#define ui_ai_state_laws "SOUTH:6,WEST+9:16" -#define ui_ai_pda_send "SOUTH:6,WEST+10:16" -#define ui_ai_pda_log "SOUTH:6,WEST+11:16" -#define ui_ai_take_picture "SOUTH:6,WEST+12:16" -#define ui_ai_view_images "SOUTH:6,WEST+13:16" +#define ui_ai_core "SOUTH:6,WEST" +#define ui_ai_camera_list "SOUTH:6,WEST+1" +#define ui_ai_track_with_camera "SOUTH:6,WEST+2" +#define ui_ai_camera_light "SOUTH:6,WEST+3" +#define ui_ai_crew_monitor "SOUTH:6,WEST+4" +#define ui_ai_crew_manifest "SOUTH:6,WEST+5" +#define ui_ai_alerts "SOUTH:6,WEST+6" +#define ui_ai_announcement "SOUTH:6,WEST+7" +#define ui_ai_shuttle "SOUTH:6,WEST+8" +#define ui_ai_state_laws "SOUTH:6,WEST+9" +#define ui_ai_pda_send "SOUTH:6,WEST+10" +#define ui_ai_pda_log "SOUTH:6,WEST+11" +#define ui_ai_take_picture "SOUTH:6,WEST+12" +#define ui_ai_view_images "SOUTH:6,WEST+13" +#define ui_ai_sensor "SOUTH:6,WEST+14" //Pop-up inventory #define ui_shoes "WEST+1:8,SOUTH:5" diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 9f254878373..b2d288b25e1 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -130,6 +130,15 @@ using.layer = 20 adding += using - mymob.client.screen += adding + other +//Medical/Security sensors + using = new /obj/screen() + using.name = "Sensor Augmentation" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "ai_sensor" + using.screen_loc = ui_ai_sensor + using.layer = 20 + adding += using + + mymob.client.screen += adding + other return \ No newline at end of file diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 270d848eab9..797561e37cf 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -142,6 +142,12 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health + nightvisionicon = new /obj/screen() + nightvisionicon.icon ='icons/mob/screen_alien.dmi' + nightvisionicon.icon_state = "nightvision1" + nightvisionicon.name = "nightvision" + nightvisionicon.screen_loc = ui_alien_nightvision + alien_plasma_display = new /obj/screen() alien_plasma_display.icon = 'icons/mob/screen_gen.dmi' alien_plasma_display.icon_state = "power_display2" @@ -168,6 +174,6 @@ mymob.client.screen = null - mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.throw_icon, mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, alien_plasma_display, mymob.pullin, mymob.blind, mymob.flash) //, mymob.hands, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += adding + other diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index d1888d6d369..2775f546c6f 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -48,6 +48,12 @@ mymob.healths.name = "health" mymob.healths.screen_loc = ui_alien_health + nightvisionicon = new /obj/screen() + nightvisionicon.icon ='icons/mob/screen_alien.dmi' + nightvisionicon.icon_state = "nightvision1" + nightvisionicon.name = "nightvision" + nightvisionicon.screen_loc = ui_alien_nightvision + mymob.pullin = new /obj/screen() mymob.pullin.icon = 'icons/mob/screen_alien.dmi' mymob.pullin.icon_state = "pull0" @@ -74,5 +80,5 @@ mymob.client.screen = null - mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) + mymob.client.screen += list( mymob.zone_sel, mymob.oxygen, mymob.toxin, mymob.fire, mymob.healths, nightvisionicon, mymob.pullin, mymob.blind, mymob.flash) //, mymob.rest, mymob.sleep, mymob.mach ) mymob.client.screen += adding + other \ No newline at end of file diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 103d639189d..ed7abd1d7ca 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -100,6 +100,7 @@ var/datum/global_hud/global_hud = new() var/obj/screen/blobpwrdisplay var/obj/screen/blobhealthdisplay var/obj/screen/alien_plasma_display + var/obj/screen/nightvisionicon var/obj/screen/r_hand_hud_object var/obj/screen/l_hand_hud_object var/obj/screen/action_intent diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index cdc83c0ba9f..f81d908e36a 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -63,6 +63,15 @@ using.layer = 20 adding += using +//Sec/Med HUDs + using = new /obj/screen() + using.name = "Sensor Augmentation" + using.icon = 'icons/mob/screen_ai.dmi' + using.icon_state = "ai_sensor" + using.screen_loc = ui_borg_sensor + using.layer = 20 + adding += using + //Intent using = new /obj/screen() using.name = "act_intent" diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index ab0073a6e5a..d6ac5bb99c2 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -386,7 +386,14 @@ else if(isrobot(usr)) var/mob/living/silicon/robot/R = usr R.aicamera.viewpictures() - + if("nightvision") + if(isalien(usr)) + var/mob/living/carbon/alien/humanoid/A = usr + A.nightvisiontoggle() + if("Sensor Augmentation") + if(issilicon(usr)) + var/mob/living/silicon/S = usr + S.sensor_mode() else return 0 return 1 diff --git a/code/controllers/configuration.dm b/code/controllers/configuration.dm index b74828c83f0..63ce7c0d32a 100644 --- a/code/controllers/configuration.dm +++ b/code/controllers/configuration.dm @@ -23,7 +23,6 @@ var/log_emote = 0 // log emotes var/log_attack = 0 // log attack messages var/log_adminchat = 0 // log admin chat messages - var/log_adminwarn = 0 // log warnings admins get about bomb construction and such var/log_pda = 0 // log pda messages var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits var/sql_enabled = 0 // for sql switching @@ -83,8 +82,9 @@ var/traitor_objectives_amount = 2 var/protect_roles_from_antagonist = 0// If security and such can be traitor/cult/other - var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling - var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. + var/enforce_human_authority = 0 //If non-human species are barred from joining as a head of staff + var/allow_latejoin_antagonists = 0 // If late-joining players can be traitor/changeling + var/continuous_round_rev = 0 // Gamemodes which end instantly will instead keep on going until the round ends by escape shuttle or nuke. var/continuous_round_wiz = 0 var/continuous_round_malf = 0 var/shuttle_refuel_delay = 12000 @@ -211,8 +211,6 @@ config.log_emote = 1 if("log_adminchat") config.log_adminchat = 1 - if("log_adminwarn") - config.log_adminwarn = 1 if("log_pda") config.log_pda = 1 if("log_hrefs") @@ -377,6 +375,8 @@ if("protect_roles_from_antagonist") config.protect_roles_from_antagonist = 1 + if("enforce_human_authority") + config.enforce_human_authority = 1 if("allow_latejoin_antagonists") config.allow_latejoin_antagonists = 1 if("allow_random_events") diff --git a/code/controllers/garbage.dm b/code/controllers/garbage.dm index 322bc086d89..501ea8a2d92 100644 --- a/code/controllers/garbage.dm +++ b/code/controllers/garbage.dm @@ -70,7 +70,8 @@ var/datum/controller/garbage_collector/garbage = new() // This should be overridden to remove all references pointing to the object being destroyed. // Return true if the the GC controller should allow the object to continue existing. (Useful if pooling objects.) /datum/proc/Destroy() - del(src) + //del(src) + return /datum/var/gc_destroyed //Time when this object was destroyed. diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 5f8d3c7d38c..3b54156cee6 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -236,83 +236,53 @@ var/global/pipe_processing_killed = 0 */ /datum/controller/game_controller/proc/process_mobs() - var/i = 1 - while(i<=mob_list.len) - var/mob/M = mob_list[i] - if(M && !M.gc_destroyed) + for(var/mob/M in mob_list) + if(!M.gc_destroyed) last_thing_processed = M.type M.Life() - i++ continue - mob_list.Cut(i,i+1) + mob_list -= M /datum/controller/game_controller/proc/process_diseases() - var/i = 1 - while(i<=active_diseases.len) - var/datum/disease/Disease = active_diseases[i] - if(Disease) - last_thing_processed = Disease.type - Disease.process() - i++ - continue - active_diseases.Cut(i,i+1) + for(var/datum/disease/Disease in active_diseases) + last_thing_processed = Disease.type + Disease.process() /datum/controller/game_controller/proc/process_machines() - var/i = 1 - while(i<=machines.len) - var/obj/machinery/Machine = machines[i] - if(Machine && !Machine.gc_destroyed) + for(var/obj/machinery/Machine in machines) + if(!Machine.gc_destroyed) last_thing_processed = Machine.type if(Machine.process() != PROCESS_KILL) if(Machine) if(Machine.use_power) Machine.auto_use_power() - i++ continue - machines.Cut(i,i+1) + machines -= Machine /datum/controller/game_controller/proc/process_objects() - var/i = 1 - while(i<=processing_objects.len) - var/obj/Object = processing_objects[i] - if(Object && !Object.gc_destroyed) + for(var/obj/Object in processing_objects) + if(!Object.gc_destroyed) last_thing_processed = Object.type Object.process() - i++ continue - processing_objects.Cut(i,i+1) + processing_objects -= Object /datum/controller/game_controller/proc/process_pipenets() last_thing_processed = /datum/pipe_network - var/i = 1 - while(i<=pipe_networks.len) - var/datum/pipe_network/Network = pipe_networks[i] - if(Network) - Network.process() - i++ - continue - pipe_networks.Cut(i,i+1) + for(var/datum/pipe_network/Network in pipe_networks) + Network.process() /datum/controller/game_controller/proc/process_powernets() last_thing_processed = /datum/powernet - var/i = 1 - while(i<=powernets.len) - var/datum/powernet/Powernet = powernets[i] - if(Powernet) - Powernet.reset() - i++ - continue - powernets.Cut(i,i+1) + for(var/datum/powernet/Powernet in powernets) + Powernet.reset() /datum/controller/game_controller/proc/process_nano() - var/i = 1 - while(i<=nanomanager.processing_uis.len) - var/datum/nanoui/ui = nanomanager.processing_uis[i] - if(ui && ui.src_object && ui.user) + for(var/datum/nanoui/ui in nanomanager.processing_uis) + if(ui.src_object && ui.user) ui.process() - i++ continue - nanomanager.processing_uis.Cut(i,i+1) + nanomanager.processing_uis -= ui /datum/controller/game_controller/proc/Recover() //Mostly a placeholder for now. var/msg = "## DEBUG: [time2text(world.timeofday)] MC restarted. Reports:\n" diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 83fbd2c883a..c8ca0d4730d 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -37,16 +37,19 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle // call the shuttle // if not called before, set the endtime to T+600 seconds // otherwise if outgoing, switch to incoming -/datum/shuttle_controller/proc/incall(coeff = 1, var/signal_origin) +/datum/shuttle_controller/proc/incall(coeff = 1, var/signal_origin, var/emergency_reason, var/red_alert) if(endtime) if(direction == -1) setdirection(1) else - if(signal_origin && prob(60)) //40% chance the signal tracing will fail + if(recall_count > 2 && signal_origin && prob(70)) //30% chance the signal tracing will fail last_call_loc = signal_origin else last_call_loc = null + + priority_announce("The emergency shuttle has been called. [red_alert ? "Red Alert state confirmed: Dispatching priority shuttle. " : "" ]It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason][emergency_shuttle.last_call_loc ? "\n\nCall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlecalled.ogg', "Priority") + settimeleft(SHUTTLEARRIVETIME*coeff) online = 1 if(always_fake_recall) @@ -67,15 +70,15 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle recall_count ++ - if(recall_count > 2 && signal_origin && prob(60)) //40% chance the signal tracing will fail + if(recall_count > 2 && signal_origin && prob(70)) //30% chance the signal tracing will fail last_call_loc = signal_origin else last_call_loc = null if(recall_count == 2) - priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results can be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') + priority_announce("The emergency shuttle has been recalled.\n\nExcessive number of emergency shuttle calls detected. We will attempt to trace all future calls and recalls to their source. Tracing results may be viewed on any communications console.", null, 'sound/AI/shuttlerecalled.ogg') else - priority_announce("The emergency shuttle has been recalled.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") + priority_announce("The emergency shuttle has been recalled.[last_call_loc ? " Recall signal traced. Results can be viewed on any communcations console." : "" ]", null, 'sound/AI/shuttlerecalled.ogg', "Priority") setdirection(-1) online = 1 @@ -134,7 +137,6 @@ var/global/datum/shuttle_controller/emergency_shuttle/emergency_shuttle incall(SHUTTLEAUTOCALLTIMER) //X minutes! If they want to recall, they have X-(X-5) minutes to do so log_game("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.") message_admins("All the communications consoles were destroyed and all AIs are inactive. Shuttle called.", 1) - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") /datum/shuttle_controller/proc/move_shuttles() var/datum/shuttle_manager/s diff --git a/code/datums/datumvars.dm b/code/datums/datumvars.dm index 2fb8c9bd852..c072fc6ae39 100644 --- a/code/datums/datumvars.dm +++ b/code/datums/datumvars.dm @@ -639,7 +639,7 @@ body reagent_options[R.name] = r_id if(reagent_options.len) - reagent_options = sortAssoc(reagent_options) + sortList(reagent_options) reagent_options.Insert(1, "CANCEL") var/chosen = input(usr, "Choose a reagent to add.", "Choose a reagent.") in reagent_options diff --git a/code/datums/helper_datums/getrev.dm b/code/datums/helper_datums/getrev.dm index 2c43d367ce0..a4897448f17 100644 --- a/code/datums/helper_datums/getrev.dm +++ b/code/datums/helper_datums/getrev.dm @@ -33,5 +33,8 @@ client/verb/showrevinfo() src << "[revdata.revision]" else src << "Revision unknown" - src << "Current Infomational Settings:
Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist]
Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]" + src << "Current Infomational Settings:" + src << "Protect Authority Roles From Traitor: [config.protect_roles_from_antagonist]" + src << "Enforce Human Authority: [config.enforce_human_authority]" + src << "Allow Latejoin Antagonists: [config.allow_latejoin_antagonists]" return \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 089c9cb2cf1..ca1608ef30a 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -760,7 +760,7 @@ ticker.mode.changelings += src current.make_changeling() special_role = "Changeling" - current << "Your powers are awoken. A flash of memory returns to us...we are a changeling!" + current << "Your powers are awoken. A flash of memory returns to us...we are [changeling.changelingID], a changeling!" message_admins("[key_name_admin(usr)] has changeling'ed [current].") log_admin("[key_name(usr)] has changeling'ed [current].") if("autoobjectives") @@ -994,21 +994,16 @@ ticker.mode.finalize_traitor(src) ticker.mode.greet_traitor(src) -/datum/mind/proc/make_Nuke() +/datum/mind/proc/make_Nuke(var/turf/spawnloc,var/nuke_code,var/leader=0) if(!(src in ticker.mode.syndicates)) ticker.mode.syndicates += src ticker.mode.update_synd_icons_added(src) - if (ticker.mode.syndicates.len==1) - ticker.mode.prepare_syndicate_leader(src) - else - current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" special_role = "Syndicate" assigned_role = "MODE" - current << "You are a [syndicate_name()] agent!" ticker.mode.forge_syndicate_objectives(src) ticker.mode.greet_syndicate(src) - current.loc = get_turf(locate("landmark*Syndicate-Spawn")) + current.loc = spawnloc var/mob/living/carbon/human/H = current qdel(H.belt) @@ -1023,6 +1018,11 @@ ticker.mode.equip_syndicate(current) + if (leader) + ticker.mode.prepare_syndicate_leader(src,nuke_code) + else + current.real_name = "[syndicate_name()] Operative #[ticker.mode.syndicates.len-1]" + /datum/mind/proc/make_Changling() if(!(src in ticker.mode.changelings)) ticker.mode.changelings += src diff --git a/code/datums/spells/mind_transfer.dm b/code/datums/spells/mind_transfer.dm index 586fd7a2700..0c8032c9b7e 100644 --- a/code/datums/spells/mind_transfer.dm +++ b/code/datums/spells/mind_transfer.dm @@ -18,7 +18,7 @@ Urist: I don't feel like figuring out how you store object spells so I'm leaving Make sure spells that are removed from spell_list are actually removed and deleted when mind transfering. Also, you never added distance checking after target is selected. I've went ahead and did that. */ -/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr) +/obj/effect/proc_holder/spell/targeted/mind_transfer/cast(list/targets,mob/user = usr, distanceoverride) if(!targets.len) user << "No mind found." return @@ -29,7 +29,7 @@ Also, you never added distance checking after target is selected. I've went ahea var/mob/living/target = targets[1] - if(!(target in oview(range)))//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. + if(!(target in oview(range)) && !distanceoverride)//If they are not in overview after selection. Do note that !() is necessary for in to work because ! takes precedence over it. user << "They are too far away!" return diff --git a/code/datums/supplypacks.dm b/code/datums/supplypacks.dm index 48d99e1d71c..d989b75eb68 100644 --- a/code/datums/supplypacks.dm +++ b/code/datums/supplypacks.dm @@ -156,6 +156,13 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine containername = "special ops crate" hidden = 1 +/datum/supply_packs/emergency/syndicate + name = "#ERROR_NULL_ENTRY" + contains = list(/obj/item/weapon/storage/box/syndicate) + cost = 140 + containertype = /obj/structure/closet/crate + containername = "crate" + hidden = 1 ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Security //////////////////////////////////////// @@ -494,6 +501,15 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine cost = 25 containername = "particle accelerator crate" +/datum/supply_packs/engineering/engine/spacesuit + name = "Space Suit crate" + contains = list(/obj/item/clothing/suit/space, + /obj/item/clothing/head/helmet/space, + /obj/item/clothing/mask/breath,) + cost = 80 + containertype = /obj/structure/closet/crate/secure + containername = "space suit crate" + access = access_eva ////////////////////////////////////////////////////////////////////////////// //////////////////////////// Medical ///////////////////////////////////////// diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm index 4e1ab7ef49c..fa6d850888e 100644 --- a/code/datums/uplink_item.dm +++ b/code/datums/uplink_item.dm @@ -241,7 +241,7 @@ var/list/uplink_items = list() desc = "A syringe disguised as a functional pen, filled with a potent mix of drugs, including a strong anaesthetic and a chemical that is capable of blocking the movement of the vocal chords. \ The pen holds one dose of the mixture, and cannot be refilled." item = /obj/item/weapon/pen/sleepy - cost = 3 + cost = 2 excludefrom = list(/datum/game_mode/nuclear) /datum/uplink_item/stealthy_weapons/soap diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 372578e6038..48691c47bff 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -36,7 +36,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 . += ..() . += text("
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]
\n[]", (A.locked ? "The door bolts have fallen!" : "The door bolts look up."), (A.lights ? "The door bolt lights are on." : "The door bolt lights are off!"), - ((A.arePowerSystemsOn() && !(A.stat & NOPOWER)) ? "The test light is on." : "The test light is off!"), + ((A.hasPower()) ? "The test light is on." : "The test light is off!"), ((A.aiControlDisabled==0 && !A.emagged) ? "The 'AI control allowed' light is on." : "The 'AI control allowed' light is off."), (A.safe==0 ? "The 'Check Wiring' light is on." : "The 'Check Wiring' light is off."), (A.normalspeed==0 ? "The 'Check Timing Mechanism' light is on." : "The 'Check Timing Mechanism' light is off."), @@ -124,7 +124,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 switch(index) if(AIRLOCK_WIRE_IDSCAN) //Sending a pulse through this disables emergency access and flashes the red light on the door (if the door has power). - if((A.arePowerSystemsOn()) && (!(A.stat & NOPOWER)) && A.density) + if(A.hasPower() && A.density) A.do_animate("deny") if(A.emergency) A.emergency = 0 @@ -140,7 +140,7 @@ var/const/AIRLOCK_WIRE_LIGHT = 2048 for(var/mob/M in range(1, A)) M << "You hear a click from the bottom of the door." else - if(A.arePowerSystemsOn()) //only can raise bolts if power's on + if(A.hasPower()) //only can raise bolts if power's on A.locked = 0 for(var/mob/M in range(1, A)) M << "You hear a click from the bottom of the door." diff --git a/code/defines/procs/priority_announce.dm b/code/defines/procs/priority_announce.dm index c191abe3265..621a4c913a2 100644 --- a/code/defines/procs/priority_announce.dm +++ b/code/defines/procs/priority_announce.dm @@ -43,5 +43,5 @@ for(var/mob/M in player_list) if(!istype(M,/mob/new_player) && !M.ear_deaf) - M << "[title] [message]" + M << "[title]
[message]

" M << sound('sound/misc/notice2.ogg') \ No newline at end of file diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 8ac516f431d..2291605ef6d 100644 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -833,11 +833,10 @@ proc/process_ghost_teleport_locs() /area/engine/engine_smes name = "\improper Engineering SMES" icon_state = "engine_smes" - requires_power = 0//This area only covers the batteries and they deal with their own power /area/engine/engineering name = "Engineering" - icon_state = "engine_smes" + icon_state = "engine" /area/engine/break_room name = "\improper Engineering Foyer" @@ -855,7 +854,6 @@ proc/process_ghost_teleport_locs() name = "Gravity Generator Room" icon_state = "blue" - //Solars /area/solar diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm new file mode 100644 index 00000000000..54b628e4200 --- /dev/null +++ b/code/game/data_huds.dm @@ -0,0 +1,181 @@ +/* Using the HUD procs is simple. Call these procs in the life.dm of the intended mob. +Use the regular_hud_updates() proc before process_med_hud(mob) or process_sec_hud(mob) so +the HUD updates properly! */ + +//Deletes the current HUD images so they can be refreshed with new ones. +mob/proc/regular_hud_updates() //Used in the life.dm of mobs that can use HUDs. + if(client) + for(var/image/hud in client.images) + if(copytext(hud.icon_state,1,4) == "hud") + client.images -= hud + med_hud_users -= src + sec_hud_users -= src + + +//Medical HUD procs + +proc/RoundHealth(health) + + switch(health) + if(100 to INFINITY) + return "health100" + if(70 to 100) + return "health80" + if(50 to 70) + return "health60" + if(30 to 50) + return "health40" + if(18 to 30) + return "health25" + if(5 to 18) + return "health10" + if(1 to 5) + return "health1" + if(-99 to 0) + return "health0" + else + return "health-100" + return "0" + +/*Called by the Life() proc of the mob using it, usually. Items can call it as well. +Called with this syntax: (The user mob, the type of hud in use, the advanced or basic version of the hud,eye object in the case of an AI) */ + +proc/process_data_hud(var/mob/M, var/hud_type, var/hud_mode, var/mob/eye) + #define DATA_HUD_MEDICAL 1 + #define DATA_HUD_SECURITY 2 + + #define DATA_HUD_BASIC 1 + #define DATA_HUD_ADVANCED 2 + + if(!M) + return + if(!M.client) + return + + var/turf/T + if(eye) + T = get_turf(eye) + else + T = get_turf(M) + + + for(var/mob/living/carbon/human/H in mob_list) + if(get_dist(H, T) > M.client.view) //Ignores any humans outside of the user's view distance. + continue + + switch(hud_type) + if(DATA_HUD_MEDICAL) + med_hud_users |= M + process_med_hud(M,hud_mode,T,H) + + if(DATA_HUD_SECURITY) + sec_hud_users |= M //Used for Security HUD alerts. + process_sec_hud(M,hud_mode,T,H) + +/*********************************************** +Medical HUD outputs! Advanced mode ignores suit sensors. +************************************************/ +proc/process_med_hud(var/mob/M, var/mode, var/turf/T, var/mob/living/carbon/human/patient) + + var/client/C = M.client + + if(mode == DATA_HUD_BASIC && !med_hud_suit_sensors(patient)) //Used for the AI's MedHUD, only works if the patient has activated suit sensors. + return + + + var/foundVirus = med_hud_find_virus(patient) //Detects non-hidden diseases in a patient, returns as a binary value. + + C.images += med_hud_get_health(patient) //Generates a patient's health bar. + C.images += med_hud_get_status(patient, foundVirus) //Determines the type of status icon to show. + + +proc/med_hud_suit_sensors(var/mob/living/carbon/human/patient) + if(istype(patient.w_uniform, /obj/item/clothing/under)) + var/obj/item/clothing/under/U = patient.w_uniform + if(U.sensor_mode > 2) + return 1 + else + return 0 + +proc/med_hud_find_virus(var/mob/living/carbon/human/patient) + for(var/datum/disease/D in patient.viruses) + if(!D.hidden[SCANNER]) + return 1 + +proc/med_hud_get_health(var/mob/living/carbon/human/patient) + var/image/holder = patient.hud_list[HEALTH_HUD] + if(patient.stat == 2) + holder.icon_state = "hudhealth-100" + else + holder.icon_state = "hud[RoundHealth(patient.health)]" + return holder + +proc/med_hud_get_status(var/mob/living/carbon/human/patient, var/foundVirus) + var/image/holder = patient.hud_list[STATUS_HUD] + if(patient.stat == 2) + holder.icon_state = "huddead" + else if(patient.status_flags & XENO_HOST) + holder.icon_state = "hudxeno" + else if(foundVirus) + holder.icon_state = "hudill" + else + holder.icon_state = "hudhealthy" + return holder + + +/*********************************************** + Security HUDs. + Pass a value for the second argument to enable implant viewing or other special features. +************************************************/ +proc/process_sec_hud(var/mob/M, var/mode, var/turf/T, var/mob/living/carbon/human/perp) + + var/client/C = M.client + + sec_hud_get_ID(C, perp) //Provides the perp's job icon. + + if(mode == DATA_HUD_ADVANCED) //If not set to "DATA_HUD_ADVANCED, the Sec HUD will only display the job. + sec_hud_get_implants(C, perp) //Returns the perp's implants, if any. + sec_hud_get_security_status(C, perp) //Gives the perp's arrest record, if there is one. + + +proc/sec_hud_get_ID(var/client/C, var/mob/living/carbon/human/perp) + var/image/holder + holder = perp.hud_list[ID_HUD] + holder.icon_state = "hudno_id" + if(perp.wear_id) + holder.icon_state = "hud[ckey(perp.wear_id.GetJobName())]" + C.images += holder + +proc/sec_hud_get_implants(var/client/C, var/mob/living/carbon/human/perp) + var/image/holder + for(var/obj/item/weapon/implant/I in perp) + if(I.implanted) + if(istype(I,/obj/item/weapon/implant/tracking)) + holder = perp.hud_list[IMPTRACK_HUD] + holder.icon_state = "hud_imp_tracking" + else if(istype(I,/obj/item/weapon/implant/loyalty)) + holder = perp.hud_list[IMPLOYAL_HUD] + holder.icon_state = "hud_imp_loyal" + else if(istype(I,/obj/item/weapon/implant/chem)) + holder = perp.hud_list[IMPCHEM_HUD] + holder.icon_state = "hud_imp_chem" + else + continue + C.images += holder + break + +proc/sec_hud_get_security_status(var/client/C, var/mob/living/carbon/human/perp) + var/image/holder + var/perpname = perp.get_face_name(perp.get_id_name("")) + if(perpname) + var/datum/data/record/R = find_record("name", perpname, data_core.security) + if(R) + holder = perp.hud_list[WANTED_HUD] + switch(R.fields["criminal"]) + if("*Arrest*") holder.icon_state = "hudwanted" + if("Incarcerated") holder.icon_state = "hudincarcerated" + if("Parolled") holder.icon_state = "hudparolled" + if("Discharged") holder.icon_state = "huddischarged" + else + return + C.images += holder \ No newline at end of file diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 188161d7232..1bece2f8ccd 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -19,11 +19,12 @@ intercepttext += "
Note in the event of a quarantine breach or uncontrolled spread of the biohazard, the directive 7-10 may be upgraded to a directive 7-12.
" intercepttext += "Message ends." if(2) - var/nukecode = "ERROR" + var/nukecode = rand(10000, 99999) for(var/obj/machinery/nuclearbomb/bomb in world) if(bomb && bomb.r_code) if(bomb.z == 1) - nukecode = bomb.r_code + bomb.r_code = nukecode + intercepttext += "NanoTrasen Update: Biohazard Alert.
" intercepttext += "Directive 7-12 has been issued for [station_name()].
" intercepttext += "The biohazard has grown out of control and will soon reach critical mass.
" diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 6844ffe118f..fcfa5d99dd8 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -14,8 +14,6 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" required_enemies = 1 recommended_enemies = 4 - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 var/const/prob_int_murder_target = 50 // intercept names the assassination target half the time var/const/prob_right_murder_target_l = 25 // lower bound on probability of naming right assassination target @@ -48,7 +46,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/num_changelings = 1 if(config.changeling_scaling_coeff) - num_changelings = max(1, round((num_players())/(config.changeling_scaling_coeff))) + num_changelings = max(1, min( round(num_players()/(config.changeling_scaling_coeff*2))+2, round(num_players()/config.changeling_scaling_coeff) )) else num_changelings = max(1, min(num_players(), changeling_amount)) @@ -79,10 +77,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" return /datum/game_mode/changeling/make_antag_chance(var/mob/living/carbon/human/character) //Assigns changeling to latejoiners - var/changelingcap = round(joined_player_list.len / config.changeling_scaling_coeff) + var/changelingcap = min( round(num_players()/(config.changeling_scaling_coeff*2))+2, round(num_players()/config.changeling_scaling_coeff) ) if(changelings.len >= changelingcap) //Caps number of latejoin antagonists return - if(changelings.len <= (changelingcap - 2) || prob(100 / config.changeling_scaling_coeff)) + if(changelings.len <= (changelingcap - 2) || prob(100 - (config.changeling_scaling_coeff*2))) if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) if(!(character.job in ticker.mode.restricted_jobs)) @@ -101,7 +99,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" changeling.objectives += absorb_objective var/list/active_ais = active_ais() - if(active_ais.len && prob(2)) + if(active_ais.len && prob(100/joined_player_list.len)) var/datum/objective/destroy/destroy_objective = new destroy_objective.owner = changeling destroy_objective.find_target() @@ -138,8 +136,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" /datum/game_mode/proc/greet_changeling(var/datum/mind/changeling, var/you_are=1) if (you_are) - changeling.current << "You are a changeling! You have absorbed and taken the form of a human." - changeling.current << "Use say \":g message\" to communicate with your fellow changelings." + changeling.current << "You are [changeling.changeling.changelingID], a changeling! You have absorbed and taken the form of a human." changeling.current << "You must complete the following tasks:" if (changeling.current.mind) @@ -180,19 +177,10 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/text = "
The changelings were:" for(var/datum/mind/changeling in changelings) var/changelingwin = 1 - - text += "
[changeling.key] was [changeling.name] (" - if(changeling.current) - if(changeling.current.stat == DEAD) - text += "died" - else - text += "survived" - if(changeling.current.real_name != changeling.name) - text += " as [changeling.current.real_name]" - else - text += "body destroyed" + if(!changeling.current) changelingwin = 0 - text += ")" + + text += printplayer(changeling) //Removed sanity if(changeling) because we -want- a runtime to inform us that the changelings list is incorrect and needs to be fixed. text += "
Changeling ID: [changeling.changeling.changelingID]." @@ -239,6 +227,7 @@ var/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","Epsilon" var/purchasedpowers = list() var/mimicing = "" var/canrespec = 0 + var/changeling_speak = 0 var/datum/dna/chosen_dna var/obj/effect/proc_holder/changeling/sting/chosen_sting diff --git a/code/game/gamemodes/changeling/evolution_menu.dm b/code/game/gamemodes/changeling/evolution_menu.dm index 3365038e721..91d7f2ee9a1 100644 --- a/code/game/gamemodes/changeling/evolution_menu.dm +++ b/code/game/gamemodes/changeling/evolution_menu.dm @@ -316,6 +316,10 @@ var/list/sting_paths user << "We have already evolved this ability!" return + if(thepower.dna_cost < 0) + user << "We cannot evolve this ability." + return + if(geneticpoints < thepower.dna_cost) user << "We have reached our capacity for abilities." return diff --git a/code/game/gamemodes/changeling/powers/hivemind.dm b/code/game/gamemodes/changeling/powers/hivemind.dm index 3f9aa14b702..8823560ab66 100644 --- a/code/game/gamemodes/changeling/powers/hivemind.dm +++ b/code/game/gamemodes/changeling/powers/hivemind.dm @@ -1,11 +1,32 @@ +//HIVEMIND COMMUNICATION (:g) +/obj/effect/proc_holder/changeling/hivemind_comms + name = "Hivemind Communication" + desc = "We tune our senses to the airwaves to allow us to discreetly communicate and exchange DNA with other changelings." + helptext = "We will be able to talk with other changelings with :g. Exchanged DNA do not count towards absorb objectives." + dna_cost = 1 + chemical_cost = -1 + +/obj/effect/proc_holder/changeling/hivemind_comms/on_purchase(var/mob/user) + ..() + var/datum/changeling/changeling=user.mind.changeling + changeling.changeling_speak = 1 + user << "Use say \":g message\" to communicate with the other changelings." + var/obj/effect/proc_holder/changeling/hivemind_upload/S1 = new + if(!changeling.has_sting(S1)) + changeling.purchasedpowers+=S1 + var/obj/effect/proc_holder/changeling/hivemind_download/S2 = new + if(!changeling.has_sting(S2)) + changeling.purchasedpowers+=S2 + return + // HIVE MIND UPLOAD/DOWNLOAD DNA var/list/datum/dna/hivemind_bank = list() /obj/effect/proc_holder/changeling/hivemind_upload - name = "Hive Channel" + name = "Hive Channel DNA" desc = "Allows us to channel DNA in the airwaves to allow other changelings to absorb it." chemical_cost = 10 - dna_cost = 0 + dna_cost = -1 /obj/effect/proc_holder/changeling/hivemind_upload/sting_action(var/mob/user) var/datum/changeling/changeling = user.mind.changeling @@ -32,10 +53,10 @@ var/list/datum/dna/hivemind_bank = list() return 1 /obj/effect/proc_holder/changeling/hivemind_download - name = "Hive Absorb" + name = "Hive Absorb DNA" desc = "Allows us to absorb DNA that has been channeled to the airwaves. Does not count towards absorb objectives." chemical_cost = 20 - dna_cost = 0 + dna_cost = -1 /obj/effect/proc_holder/changeling/hivemind_download/can_sting(var/mob/living/carbon/user) if(!..()) diff --git a/code/game/gamemodes/changeling/powers/mutations.dm b/code/game/gamemodes/changeling/powers/mutations.dm index 7bb219b5e00..e6246f686e2 100644 --- a/code/game/gamemodes/changeling/powers/mutations.dm +++ b/code/game/gamemodes/changeling/powers/mutations.dm @@ -156,7 +156,7 @@ if(!A.requiresID() || A.allowed(user)) //This is to prevent stupid shit like hitting a door with an arm blade, the door opening because you have acces and still getting a "the airlocks motors resist our efforts to force it" message. return - if(A.arePowerSystemsOn() && !(A.stat & NOPOWER)) + if(A.hasPower()) user << "The airlock's motors resist our efforts to force it." return diff --git a/code/game/gamemodes/changeling/traitor_chan.dm b/code/game/gamemodes/changeling/traitor_chan.dm index 2b0b30948b5..615cf29383c 100644 --- a/code/game/gamemodes/changeling/traitor_chan.dm +++ b/code/game/gamemodes/changeling/traitor_chan.dm @@ -31,9 +31,9 @@ var/num_changelings = 1 if(config.changeling_scaling_coeff) - num_changelings = max(1, round((num_players())/(config.changeling_scaling_coeff*2))) + num_changelings = max(1, min( round(num_players()/(config.changeling_scaling_coeff*4))+2, round(num_players()/(config.changeling_scaling_coeff*2)) )) else - num_changelings = max(1, min(num_players(), changeling_amount)) + num_changelings = max(1, min(num_players(), changeling_amount/2)) for(var/datum/mind/player in possible_changelings) for(var/job in restricted_jobs)//Removing robots from the list @@ -61,11 +61,11 @@ return /datum/game_mode/traitor/changeling/make_antag_chance(var/mob/living/carbon/human/character) //Assigns changeling to latejoiners - var/changelingcap = round(joined_player_list.len / (config.changeling_scaling_coeff * 2)) + var/changelingcap = min( round(num_players()/(config.changeling_scaling_coeff*4))+2, round(num_players()/(config.changeling_scaling_coeff*2)) ) if(changelings.len >= changelingcap) //Caps number of latejoin antagonists ..() return - if(changelings.len <= (changelingcap - 2) || prob(100 / (config.changeling_scaling_coeff * 2))) + if(changelings.len <= (changelingcap - 2) || prob(100 / (config.changeling_scaling_coeff * 4))) if(character.client.prefs.be_special & BE_CHANGELING) if(!jobban_isbanned(character.client, "changeling") && !jobban_isbanned(character.client, "Syndicate")) if(!(character.job in ticker.mode.restricted_jobs)) diff --git a/code/game/gamemodes/cult/cult.dm b/code/game/gamemodes/cult/cult.dm index e0615b75826..8ab4e6dde35 100644 --- a/code/game/gamemodes/cult/cult.dm +++ b/code/game/gamemodes/cult/cult.dm @@ -30,8 +30,6 @@ required_enemies = 6 recommended_enemies = 6 - uplink_welcome = "Nar-Sie Uplink Console:" - uplink_uses = 10 var/finished = 0 @@ -375,18 +373,8 @@ if( cult.len || (ticker && istype(ticker.mode,/datum/game_mode/cult)) ) var/text = "
The cultists were:" for(var/datum/mind/cultist in cult) + text += printplayer(cultist) - text += "
[cultist.key] was [cultist.name] (" - if(cultist.current) - if(cultist.current.stat == DEAD) - text += "died" - else - text += "survived" - if(cultist.current.real_name != cultist.name) - text += " as [cultist.current.real_name]" - else - text += "body destroyed" - text += ")" text += "
" world << text diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 36317ec9ca7..262c90379c3 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -187,7 +187,7 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", user << "You are unable to speak the words of the rune." return if(!word1 || !word2 || !word3 || prob(user.getBrainLoss())) - return fizzle() + return fizzle(user) if(word1 == wordtravel && word2 == wordself) return teleport(src.word3) if(word1 == wordsee && word2 == wordblood && word3 == wordhell) @@ -241,16 +241,18 @@ var/engwords = list("travel", "blood", "join", "hell", "destroy", "technology", else user.take_overall_damage(30, 0) user << "You feel the life draining from you, as if Lord Nar-Sie is displeased with you." - return fizzle() + return fizzle(user) -/obj/effect/rune/proc/fizzle() - if(istype(src,/obj/effect/rune)) - usr.say(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP")) - else - usr.whisper(pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP")) - for (var/mob/V in viewers(src)) - V.show_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) +/obj/effect/rune/proc/fizzle(var/mob/living/cultist = null) + var/gibberish = pick("B'ADMINES SP'WNIN SH'T","IC'IN O'OC","RO'SHA'M I'SA GRI'FF'N ME'AI","TOX'IN'S O'NM FI'RAH","IA BL'AME TOX'IN'S","FIR'A NON'AN RE'SONA","A'OI I'RS ROUA'GE","LE'OAN JU'STA SP'A'C Z'EE SH'EF","IA PT'WOBEA'RD, IA A'DMI'NEH'LP") + + if(cultist) + if(istype(src,/obj/effect/rune)) + cultist.say(gibberish) + else + cultist.whisper(gibberish) + visible_message("The markings pulse with a small burst of light, then fall dark.", 3, "You hear a faint fizzle.", 2) return /obj/effect/rune/proc/check_icon() diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 9209b4f3df2..e899e1a7be2 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -31,7 +31,7 @@ var/list/sacrificed = list() user.loc = allrunesloc[rand(1,index)] return if(istype(src,/obj/effect/rune)) - return fizzle() //Use friggin manuals, Dorf, your list was of zero length. + return fizzle(user) //Use friggin manuals, Dorf, your list was of zero length. else call(/obj/effect/rune/proc/fizzle)() return @@ -53,7 +53,7 @@ var/list/sacrificed = list() IP = R runecount++ if(runecount >= 2) - user << "You feel pain, as rune disappears in reality shift caused by too much wear of space-time fabric" + user << "You feel pain, as the rune disappears in reality shift caused by too much wear of space-time fabric" if (istype(user, /mob/living)) user.take_overall_damage(5, 0) qdel(src) @@ -61,7 +61,7 @@ var/list/sacrificed = list() if(iscultist(C) && !C.stat) culcount++ if(user.loc==src.loc) - return fizzle() + return fizzle(user) if(culcount>=1) user.say("Sas[pick("'","`")]so c'arta forbici tarem!") user.visible_message("You feel air moving from the rune - like as it was swapped with somewhere else.", \ @@ -74,7 +74,7 @@ var/list/sacrificed = list() M.loc = IP.loc return - return fizzle() + return fizzle(user) /////////////////////////////////////////SECOND RUNE @@ -152,9 +152,10 @@ var/list/sacrificed = list() /obj/effect/rune/proc/tearreality() var/list/mob/living/carbon/human/cultist_count = list() + var/mob/living/user = usr + user.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") for(var/mob/M in range(1,src)) if(iscultist(M) && !M.stat) - M.say("Tok-lyr rqa'nap g[pick("'","`")]lt-ulotf!") cultist_count += M if(cultist_count.len >= 9) if(ticker.mode.name == "cult") @@ -374,7 +375,7 @@ var/list/sacrificed = list() return if(istype(src,/obj/effect/rune)) - return fizzle() + return fizzle() else call(/obj/effect/rune/proc/fizzle)() return @@ -769,7 +770,7 @@ var/list/sacrificed = list() return return if(istype(W,/obj/effect/rune)) - return fizzle() + return fizzle() if(istype(W,/obj/item/weapon/paper/talisman)) call(/obj/effect/rune/proc/fizzle)() return @@ -802,7 +803,7 @@ var/list/sacrificed = list() if(users.len>=1) var/mob/living/carbon/cultist = input("Choose the one who you want to free", "Followers of Geometer") as null|anything in (cultists - users) if(!cultist) - return fizzle() + return fizzle(user) if (cultist == user) //just to be sure. return if(!(cultist.buckled || \ @@ -835,7 +836,7 @@ var/list/sacrificed = list() user.take_overall_damage(15, 0) C.say("Khari[pick("'","`")]d! Gual'te nikka!") qdel(src) - return fizzle() + return fizzle(user) /////////////////////////////////////////NINETEENTH RUNE @@ -852,12 +853,12 @@ var/list/sacrificed = list() if(users.len>=3) var/mob/living/carbon/cultist = input("Choose the one who you want to summon", "Followers of Geometer") as null|anything in (cultists - user) if(!cultist) - return fizzle() + return fizzle(user) if(cultist == user) //just to be sure. return if(cultist.buckled || cultist.handcuffed || (!isturf(cultist.loc) && !istype(cultist.loc, /obj/structure/closet))) user << "You cannot summon the [cultist], for his shackles of blood are strong" - return fizzle() + return fizzle(user) cultist.loc = src.loc cultist.Weaken(5) cultist.regenerate_icons() @@ -869,7 +870,7 @@ var/list/sacrificed = list() "You are blinded by the flash of red light! After you're able to see again, you see that now instead of the rune there's a body.", \ "You hear a pop and smell ozone.") qdel(src) - return fizzle() + return fizzle(user) /////////////////////////////////////////TWENTIETH RUNES diff --git a/code/game/gamemodes/extended/extended.dm b/code/game/gamemodes/extended/extended.dm index 04dc0d29685..77e754ee36f 100644 --- a/code/game/gamemodes/extended/extended.dm +++ b/code/game/gamemodes/extended/extended.dm @@ -3,9 +3,6 @@ config_tag = "extended" required_players = 0 - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - /datum/game_mode/announce() world << "The current game mode is - Extended Role-Playing!" world << "Just have fun and role-play!" diff --git a/code/game/gamemodes/game_mode.dm b/code/game/gamemodes/game_mode.dm index cb1fbdd641a..517ccae3a06 100644 --- a/code/game/gamemodes/game_mode.dm +++ b/code/game/gamemodes/game_mode.dm @@ -27,8 +27,6 @@ var/required_enemies = 0 var/recommended_enemies = 0 var/pre_setup_before_jobs = 0 - var/uplink_welcome = "Syndicate Uplink Console:" - var/uplink_uses = 10 var/antag_flag = null //preferences flag such as BE_WIZARD that need to be turned on for players to be antag var/datum/mind/sacrifice_target = null @@ -386,4 +384,20 @@ proc/display_roundstart_logout_report() for(var/mob/M in mob_list) if(M.client && M.client.holder) - M << msg \ No newline at end of file + M << msg + +/datum/game_mode/proc/printplayer(var/datum/mind/ply) + var/role = "\improper[ply.assigned_role]" + var/text = "
[ply.name]([ply.key]) as \a [role] (" + if(ply.current) + if(ply.current.stat == DEAD) + text += "died" + else + text += "survived" + if(ply.current.real_name != ply.name) + text += " as [ply.current.real_name]" + else + text += "body destroyed" + text += ")" + + return text diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 62573d6032a..fc67d9f723a 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -198,6 +198,11 @@ var/round_start_time = 0 world << sound('sound/effects/explosionfar.ogg') flick("station_intact_fade_red",cinematic) cinematic.icon_state = "summary_nukefail" + if("fake") //The round isn't over, we're just freaking people out for fun + flick("intro_nuke",cinematic) + sleep(35) + world << sound('sound/items/bikehorn.ogg') + flick("summary_selfdes",cinematic) else flick("intro_nuke",cinematic) sleep(35) @@ -335,7 +340,7 @@ var/round_start_time = 0 //Player status report for(var/mob/Player in mob_list) - if(Player.mind) + if(Player.mind && !isnewplayer(Player)) if(Player.stat != DEAD && !isbrain(Player)) num_survivors++ if(station_evacuated) //If the shuttle has already left the station @@ -355,13 +360,14 @@ var/round_start_time = 0 end_state.count() var/station_integrity = round( 100.0 * start_state.score(end_state), 0.1) - world << "
[TAB]Shift Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]" + world << "
[TAB]Shift Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]" world << "
[TAB]Station Integrity: [mode.station_was_nuked ? "Destroyed" : "[station_integrity]%"]" - world << "
[TAB]Total Population: [joined_player_list.len]" - if(station_evacuated) - world << "
[TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)" - else - world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)" + if(joined_player_list.len) + world << "
[TAB]Total Population: [joined_player_list.len]" + if(station_evacuated) + world << "
[TAB]Evacuation Rate: [num_escapees] ([round((num_escapees/joined_player_list.len)*100, 0.1)]%)" + else + world << "
[TAB]Survival Rate: [num_survivors] ([round((num_survivors/joined_player_list.len)*100, 0.1)]%)" world << "
" //Silicon laws report diff --git a/code/game/gamemodes/malfunction/malfunction.dm b/code/game/gamemodes/malfunction/malfunction.dm index c5428a993a0..12d9fa68d5b 100644 --- a/code/game/gamemodes/malfunction/malfunction.dm +++ b/code/game/gamemodes/malfunction/malfunction.dm @@ -10,10 +10,6 @@ recommended_enemies = 1 pre_setup_before_jobs = 1 - uplink_welcome = "Crazy AI Uplink Console:" - uplink_uses = 10 - - var/AI_win_timeleft = 1800 //started at 1800, in case I change this for testing round end. var/malf_mode_declared = 0 diff --git a/code/game/gamemodes/meteor/meteor.dm b/code/game/gamemodes/meteor/meteor.dm index 76f3b1215f4..234f205e0d2 100644 --- a/code/game/gamemodes/meteor/meteor.dm +++ b/code/game/gamemodes/meteor/meteor.dm @@ -5,9 +5,6 @@ var/nometeors = 1 required_players = 0 - uplink_welcome = "EVIL METEOR Uplink Console:" - uplink_uses = 10 - /datum/game_mode/meteor/announce() world << "The current game mode is - Meteor!" diff --git a/code/game/gamemodes/nuclear/nuclear.dm b/code/game/gamemodes/nuclear/nuclear.dm index aefcfc70c47..666fe48651a 100644 --- a/code/game/gamemodes/nuclear/nuclear.dm +++ b/code/game/gamemodes/nuclear/nuclear.dm @@ -11,9 +11,6 @@ pre_setup_before_jobs = 1 antag_flag = BE_OPERATIVE - uplink_welcome = "Corporate Backed Uplink Console:" - uplink_uses = 10 - var/const/agents_possible = 5 //If we ever need more syndicate agents. var/nukes_left = 1 // Call 3714-PRAY right now and order more nukes! Limited offer! @@ -100,7 +97,6 @@ for(var/obj/effect/landmark/A in landmarks_list) if(A.name == "Syndicate-Spawn") synd_spawn += get_turf(A) - qdel(A) continue var/obj/effect/landmark/uplinklocker = locate("landmark*Syndicate-Uplink") //i will be rewriting this shortly @@ -113,7 +109,7 @@ for(var/datum/mind/synd_mind in syndicates) if(spawnpos > synd_spawn.len) - spawnpos = 1 + spawnpos = 2 synd_mind.current.loc = synd_spawn[spawnpos] forge_syndicate_objectives(synd_mind) @@ -145,19 +141,28 @@ spawn(1) NukeNameAssign(nukelastname(synd_mind.current),syndicates) //allows time for the rest of the syndies to be chosen synd_mind.current.real_name = "[syndicate_name()] [leader_title]" + synd_mind.current << "You are the Syndicate [leader_title] for this mission. You are responsible for the distribution of telecrystals and your ID is the only one who can open the launch bay doors." + synd_mind.current << "If you feel you are not up to this task, give your ID to another operative." + if (nuke_code) synd_mind.store_memory("Syndicate Nuclear Bomb Code: [nuke_code]", 0, 0) synd_mind.current << "The nuclear authorization code is: [nuke_code]" + + var/list/foundIDs = synd_mind.current.search_contents_for(/obj/item/weapon/card/id) + + if(foundIDs.len) + for(var/obj/item/weapon/card/id/ID in foundIDs) + ID.access += access_syndicate_leader + else + message_admins("Warning: Nuke Ops spawned without access to leave their spawn area!") + var/obj/item/weapon/paper/P = new P.info = "The nuclear authorization code is: [nuke_code]" P.name = "nuclear bomb code" - if (ticker.mode.config_tag=="nuclear") - P.loc = synd_mind.current.loc - else - var/mob/living/carbon/human/H = synd_mind.current - P.loc = H.loc - H.equip_to_slot_or_del(P, slot_r_store, 0) - H.update_icons() + var/mob/living/carbon/human/H = synd_mind.current + P.loc = H.loc + H.equip_to_slot_or_del(P, slot_r_store, 0) + H.update_icons() else nuke_code = "code will be provided later" diff --git a/code/game/gamemodes/nuclear/nuclearbomb.dm b/code/game/gamemodes/nuclear/nuclearbomb.dm index 9b4368d960f..8a78f9b33ae 100644 --- a/code/game/gamemodes/nuclear/nuclearbomb.dm +++ b/code/game/gamemodes/nuclear/nuclearbomb.dm @@ -17,10 +17,6 @@ var/bomb_set use_power = 0 var/previous_level = "" -/obj/machinery/nuclearbomb/New() - ..() - r_code = "[rand(10000, 99999.0)]"//Creates a random code upon object spawn. - /obj/machinery/nuclearbomb/process() if (src.timing) bomb_set = 1 //So long as there is one nuke timing, it means one nuke is armed. @@ -236,8 +232,8 @@ var/bomb_set if(blobstart.len > 0) var/obj/item/weapon/disk/nuclear/NEWDISK = new(pick(blobstart)) transfer_fingerprints_to(NEWDISK) - message_admins("[src] has been destroyed. Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") - log_game("[src] has been destroyed. Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") + message_admins("[src] has been destroyed in ([x], [y] ,[z] - JMP). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z] - JMP).") + log_game("[src] has been destroyed in ([x], [y] ,[z]). Moving it to ([NEWDISK.x], [NEWDISK.y], [NEWDISK.z]).") del(src) //Needed to clear all references to it else ERROR("[src] was supposed to be destroyed, but we were unable to locate a blobstart landmark to spawn a new one.") diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index c5f11b0ece4..35dff74d813 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -20,10 +20,6 @@ required_enemies = 3 recommended_enemies = 3 - - uplink_welcome = "Revolutionary Uplink Console:" - uplink_uses = 10 - var/finished = 0 var/checkwin_counter = 0 var/const/max_headrevs = 3 diff --git a/code/game/gamemodes/sandbox/h_sandbox.dm b/code/game/gamemodes/sandbox/h_sandbox.dm index d2f36a2ee7e..9b3045d62a1 100644 --- a/code/game/gamemodes/sandbox/h_sandbox.dm +++ b/code/game/gamemodes/sandbox/h_sandbox.dm @@ -233,7 +233,7 @@ datum/hSB/Topic(href, href_list) var/list/all_items = typesof(/obj/item/clothing) - /obj/item/clothing for(var/typekey in spawn_forbidden) all_items -= typesof(typekey) - for(var/O in reverselist(all_items)) + for(var/O in reverseRange(all_items)) clothinfo += "[O]
" usr << browse(clothinfo,"window=sandbox") @@ -247,7 +247,7 @@ datum/hSB/Topic(href, href_list) var/list/all_items = typesof(/obj/item/weapon/reagent_containers) - /obj/item/weapon/reagent_containers for(var/typekey in spawn_forbidden) all_items -= typesof(typekey) - for(var/O in reverselist(all_items)) + for(var/O in reverseRange(all_items)) reaginfo += "[O]
" usr << browse(reaginfo,"window=sandbox") @@ -262,7 +262,7 @@ datum/hSB/Topic(href, href_list) for(var/typekey in spawn_forbidden) all_items -= typesof(typekey) - for(var/O in reverselist(all_items)) + for(var/O in reverseRange(all_items)) objinfo += "[O]
" usr << browse(objinfo,"window=sandbox") diff --git a/code/game/gamemodes/sandbox/sandbox.dm b/code/game/gamemodes/sandbox/sandbox.dm index 475c3d22aa5..8ebb488267a 100644 --- a/code/game/gamemodes/sandbox/sandbox.dm +++ b/code/game/gamemodes/sandbox/sandbox.dm @@ -3,9 +3,6 @@ config_tag = "sandbox" required_players = 0 - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - /datum/game_mode/sandbox/announce() world << "The current game mode is - Sandbox!" world << "Build your own station with the sandbox-panel command!" diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 802b3c57bee..f26ebec359c 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -16,10 +16,6 @@ required_enemies = 1 recommended_enemies = 4 - - uplink_welcome = "Syndicate Uplink Console:" - uplink_uses = 10 - var/traitors_possible = 4 //hard limit on traitors if scaling is turned off var/scale_modifier = 1 // Used for gamemodes, that are a child of traitor, that need more than the usual. @@ -37,7 +33,7 @@ var/num_traitors = 1 if(config.traitor_scaling_coeff) - num_traitors = max(1, round((num_players())/((config.traitor_scaling_coeff * scale_modifier)))) + num_traitors = max(1, min( round(num_players()/(config.traitor_scaling_coeff*scale_modifier*2))+2, round(num_players()/(config.traitor_scaling_coeff*scale_modifier)) )) else num_traitors = max(1, min(num_players(), traitors_possible)) @@ -74,10 +70,10 @@ return 1 /datum/game_mode/traitor/make_antag_chance(var/mob/living/carbon/human/character) //Assigns traitor to latejoiners - var/traitorcap = round(joined_player_list.len / (config.traitor_scaling_coeff * scale_modifier)) + var/traitorcap = round(joined_player_list.len / (config.traitor_scaling_coeff * scale_modifier * 2)) if(traitors.len >= traitorcap) //Upper cap for number of latejoin antagonists return - if(traitors.len <= (traitorcap - 2) || prob(100 / (config.traitor_scaling_coeff * scale_modifier))) + if(traitors.len <= (traitorcap - 2) || prob(100 / (config.traitor_scaling_coeff * scale_modifier * 2))) if(character.client.prefs.be_special & BE_TRAITOR) if(!jobban_isbanned(character.client, "traitor") && !jobban_isbanned(character.client, "Syndicate")) if(!(character.job in ticker.mode.restricted_jobs)) @@ -121,27 +117,27 @@ objective_count += 1 //Exchange counts towards number of objectives var/list/active_ais = active_ais() for(var/i = objective_count, i < config.traitor_objectives_amount, i++) - if(active_ais.len && prob(1)) - var/datum/objective/destroy/destroy_objective = new - destroy_objective.owner = traitor - destroy_objective.find_target() - traitor.objectives += destroy_objective - else switch(rand(1,100)) - if(1 to 15) + if(prob(50)) + if(active_ais.len && prob(100/joined_player_list.len)) + var/datum/objective/destroy/destroy_objective = new + destroy_objective.owner = traitor + destroy_objective.find_target() + traitor.objectives += destroy_objective + else if(prob(30)) var/datum/objective/maroon/maroon_objective = new maroon_objective.owner = traitor maroon_objective.find_target() traitor.objectives += maroon_objective - if(16 to 50) + else var/datum/objective/assassinate/kill_objective = new kill_objective.owner = traitor kill_objective.find_target() traitor.objectives += kill_objective - else - var/datum/objective/steal/steal_objective = new - steal_objective.owner = traitor - steal_objective.find_target() - traitor.objectives += steal_objective + else + var/datum/objective/steal/steal_objective = new + steal_objective.owner = traitor + steal_objective.find_target() + traitor.objectives += steal_objective if(is_hijacker && objective_count <= config.traitor_objectives_amount) //Don't assign hijack if it would exceed the number of objectives set in config.traitor_objectives_amount if (!(locate(/datum/objective/hijack) in traitor.objectives)) @@ -204,18 +200,7 @@ for(var/datum/mind/traitor in traitors) var/traitorwin = 1 - text += "
[traitor.key] was [traitor.name] (" - if(traitor.current) - if(traitor.current.stat == DEAD) - text += "died" - else - text += "survived" - if(traitor.current.real_name != traitor.name) - text += " as [traitor.current.real_name]" - else - text += "body destroyed" - text += ")" - + text += printplayer(traitor) var/TC_uses = 0 var/uplink_true = 0 diff --git a/code/game/gamemodes/wizard/rightandwrong.dm b/code/game/gamemodes/wizard/rightandwrong.dm index 1cc217b188f..7ac2e709cdb 100644 --- a/code/game/gamemodes/wizard/rightandwrong.dm +++ b/code/game/gamemodes/wizard/rightandwrong.dm @@ -1,4 +1,4 @@ - +//In this file: Summon Magic/Summon Guns/Summon Events /mob/proc/rightandwrong(var/summon_type) //0 = Summon Guns, 1 = Summon Magic var/list/gunslist = list("taser","egun","laser","revolver","detective","smg","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","mateba","smg","uzi","crossbow","saw") @@ -100,6 +100,8 @@ new /obj/item/weapon/gun/magic/wand/teleport(get_turf(H)) if("wanddoor") new /obj/item/weapon/gun/magic/wand/door(get_turf(H)) + if("wandfireball") + new /obj/item/weapon/gun/magic/wand/fireball(get_turf(H)) if("staffhealing") new /obj/item/weapon/gun/magic/staff/healing(get_turf(H)) if("staffdoor") @@ -129,4 +131,26 @@ new /obj/item/weapon/antag_spawner/contract(get_turf(H)) if("staffchaos") new /obj/item/weapon/gun/magic/staff/chaos(get_turf(H)) - H << "You suddenly feel lucky." \ No newline at end of file + H << "You suddenly feel lucky." + +/mob/proc/summonevents() + if(events) //if there isn't something is very wrong + if(!events.wizardmode) //lets get this party started + events.control = list() //out with the old + for(var/type in typesof(/datum/round_event_control/wizard) - /datum/round_event_control/wizard) //in with the new + var/datum/round_event_control/wizard/W = new type() + if(!W.typepath) + continue //don't want this one! leave it for the garbage collector + events.control += W //add it to the list of all events (controls) + events.frequency_lower = 600 //1 minute lower bound + events.frequency_upper = 3000 //5 minutes upper bound + events.wizardmode = 1 + events.reschedule() + + else //Speed it up + events.frequency_lower = round(events.frequency_lower * 0.8) //1 minute | 48 seconds | 34.8 seconds | 30.7 seconds | 24.6 seconds + events.frequency_upper = round(events.frequency_upper * 0.6) //5 minutes | 3 minutes | 1 minute 48 seconds | 1 minute 4.8 seconds | 38.9 seconds + if(events.frequency_upper < events.frequency_lower) + events.frequency_upper = events.frequency_lower //this can't happen unless somehow multiple spellbooks are used, but just in case + + events.reschedule() diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index 7b513e46cdc..7dd699d5789 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -112,6 +112,9 @@ dat += "Summon Magic (One time use, global spell)
" dat += "Share the wonders of magic with the crew and show them why they aren't to be trusted with it at the same time.
" + dat += "Summon Events (One time use, persistent global spell)
" + dat += "Give Murphy's law a little push and replace all events with special wizard ones that will confound and confuse everyone. Multiple castings increase the rate of these events.
" + dat += "
" dat += "Return
" @@ -196,7 +199,7 @@ uses-- /* */ - var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment") + var/list/available_spells = list(magicmissile = "Magic Missile", fireball = "Fireball", disintegrate = "Disintegrate", disabletech = "Disable Tech", smoke = "Smoke", blind = "Blind", mindswap = "Mind Transfer", forcewall = "Forcewall", blink = "Blink", teleport = "Teleport", mutate = "Mutate", etherealjaunt = "Ethereal Jaunt", knock = "Knock", horseman = "Curse of the Horseman", fleshtostone = "Flesh to Stone", summonguns = "Summon Guns", summonmagic = "Summon Magic", summonevents = "Summon Events", staffchange = "Staff of Change", soulstone = "Six Soul Stone Shards and the spell Artificer", armor = "Mastercrafted Armor Set", staffanimate = "Staff of Animation", staffchaos = "Staff of Chaos", staffdoor = "Staff of Door Creation", wands = "Wand Assortment") var/already_knows = 0 for(var/obj/effect/proc_holder/spell/aspell in H.mind.spell_list) if(available_spells[href_list["spell_choice"]] == initial(aspell.name)) @@ -300,6 +303,11 @@ H.rightandwrong(1) max_uses-- temp = "You have cast summon magic." + if("summonevents") + feedback_add_details("wizard_spell_learned","SE") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells + H.summonevents() + max_uses-- + temp = "You have cast summon events." if("staffchange") feedback_add_details("wizard_spell_learned","ST") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/gun/magic/staff/change(get_turf(H)) diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 516c63e56b5..245a827c3bf 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -10,9 +10,6 @@ recommended_enemies = 1 pre_setup_before_jobs = 1 - uplink_welcome = "Wizardly Uplink Console:" - uplink_uses = 10 - var/finished = 0 /datum/game_mode/wizard/announce() diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index a9ee8f00c16..77b0f22bb85 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -79,6 +79,7 @@ //The Syndicate /var/const/access_syndicate = 150//General Syndicate Access +/var/const/access_syndicate_leader = 151//Nuke Op Leader Access /obj/var/list/req_access = null /obj/var/req_access_txt = "0" @@ -206,7 +207,7 @@ return list(access_cent_general, access_cent_thunder, access_cent_specops, access_cent_medical, access_cent_living, access_cent_storage, access_cent_teleporter, access_cent_captain) /proc/get_all_syndicate_access() - return list(access_syndicate) + return list(access_syndicate, access_syndicate) /proc/get_region_accesses(var/code) switch(code) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index e4a9c21bb88..25b63f923bd 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -72,6 +72,9 @@ var/global/datum/controller/occupations/job_master if(flag && (!player.client.prefs.be_special & flag)) Debug("FOC flag failed, Player: [player], Flag: [flag], ") continue + if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + Debug("FOC non-human failed, Player: [player]") + continue if(player.client.prefs.GetJobDepartment(job, level) & job.flag) Debug("FOC pass, Player: [player], Level:[level]") candidates += player @@ -97,6 +100,10 @@ var/global/datum/controller/occupations/job_master Debug("GRJ player not old enough, Player: [player]") continue + if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + Debug("GRJ non-human failed, Player: [player]") + continue + if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1) Debug("GRJ Random job given, Player: [player], Job: [job]") AssignRole(player, job.title) @@ -248,6 +255,10 @@ var/global/datum/controller/occupations/job_master Debug("DO player not old enough, Player: [player], Job:[job.title]") continue + if(config.enforce_human_authority && (job.title in command_positions) && player.client.prefs.pref_species.id != "human") + Debug("DO non-human failed, Player: [player], Job:[job.title]") + continue + // If the player wants that job on this level, then try give it to him. if(player.client.prefs.GetJobDepartment(job, level) & job.flag) diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 52c8c84e1aa..afa65e0f8ad 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -17,8 +17,8 @@ var/min_health = 25 var/list/injection_chems = list() //list of injectable chems except inaprovaline, coz inaprovaline is always avalible var/list/possible_chems = list(list("stoxin", "dexalin", "bicaridine", "kelotane"), - list("stoxin", "dexalinp", "imidazoline", "dermaline", "bicaridine"), - list("tricordrazine", "anti_toxin", "ryetalyn", "dermaline", "bicaridine", "imidazoline", "alkysine", "arithrazine")) + list("stoxin", "dexalinp", "bicaridine", "dermaline", "imidazoline"), + list("stoxin", "dexalinp", "bicaridine", "dermaline", "imidazoline", "anti_toxin", "ryetalyn", "alkysine", "arithrazine")) /obj/machinery/sleeper/New() ..() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 876b57e9b63..3cb05fe99f1 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -1032,7 +1032,6 @@ FIRE ALARM qdel(src) return - src.alarm() return /obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed diff --git a/code/game/machinery/bots/ed209bot.dm b/code/game/machinery/bots/ed209bot.dm index f177f2ed1c2..c8bc47d15a1 100644 --- a/code/game/machinery/bots/ed209bot.dm +++ b/code/game/machinery/bots/ed209bot.dm @@ -134,7 +134,7 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]
"}, if(!src.locked || issilicon(user)) if(!lasercolor) dat += text({"
-Arrest for No ID: []
+Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
Arrest for Warrant: []

@@ -223,7 +223,7 @@ Auto Patrol: []"}, if(hasvar(W,"force") && W.force)//If force is defined and non-zero threatlevel = user.assess_threat(src) threatlevel += 6 - if(threatlevel > 0) + if(threatlevel >= 4) src.target = user if(lasercolor)//To make up for the fact that lasertag bots don't hunt src.shootAt(user) diff --git a/code/game/machinery/bots/secbot.dm b/code/game/machinery/bots/secbot.dm index e151bfc759b..ae8f5927db7 100644 --- a/code/game/machinery/bots/secbot.dm +++ b/code/game/machinery/bots/secbot.dm @@ -127,7 +127,7 @@ Maintenance panel panel is [src.open ? "opened" : "closed"]
"}, if(!src.locked || issilicon(user)) dat += text({"
-Arrest for No ID: []
+Arrest Unidentifiable Persons: []
Arrest for Unauthorized Weapons: []
Arrest for Warrant: []

@@ -142,7 +142,7 @@ Auto Patrol: []"}, "[src.declare_arrests ? "Yes" : "No"]", "[auto_patrol ? "On" : "Off"]" ) - var/datum/browser/popup = new(user, "autosec", "Securitron v1.5 controls") + var/datum/browser/popup = new(user, "autosec", "Securitron v1.5.1 controls") popup.set_content(dat) popup.open() return @@ -210,7 +210,7 @@ Auto Patrol: []"}, if(!istype(W, /obj/item/weapon/screwdriver) && (W.force) && (!src.target) ) // Added check for welding tool to fix #2432. Welding tool behavior is handled in superclass. threatlevel = user.assess_threat(src) threatlevel += 6 - if(threatlevel > 0) + if(threatlevel >= 4) src.target = user src.mode = SECBOT_HUNT diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 927645b7402..37922f4529a 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -161,13 +161,14 @@ src.icon_state = "pod_1" //Get the clone body ready - H.adjustCloneLoss(CLONE_INITIAL_DAMAGE ) //Yeah, clones start with very low health, not with random, because why would they start with random health - H.adjustBrainLoss(CLONE_INITIAL_DAMAGE ) + H.adjustCloneLoss(CLONE_INITIAL_DAMAGE) //Yeah, clones start with very low health, not with random, because why would they start with random health + H.adjustBrainLoss(CLONE_INITIAL_DAMAGE) H.Paralyse(4) //Here let's calculate their health so the pod doesn't immediately eject them!!! H.updatehealth() + H.silent = 5 //Prevents an extreme edge case where clones could speak if they said something at exactly the right moment. clonemind.transfer_to(H) H.ckey = ckey H << "Consciousness slowly creeps over you as your body regenerates.
So this is what cloning feels like?
" diff --git a/code/game/machinery/computer/aifixer.dm b/code/game/machinery/computer/aifixer.dm index 993f8e03777..efb6bc939dd 100644 --- a/code/game/machinery/computer/aifixer.dm +++ b/code/game/machinery/computer/aifixer.dm @@ -51,6 +51,12 @@ if (src.occupier.laws.zeroth) laws += "0: [src.occupier.laws.zeroth]
" + for (var/index = 1, index <= src.occupier.laws.ion.len, index++) + var/law = src.occupier.laws.ion[index] + if (length(law) > 0) + var/num = ionnum() + laws += "[num]: [law]
" + var/number = 1 for (var/index = 1, index <= src.occupier.laws.inherent.len, index++) var/law = src.occupier.laws.inherent[index] diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index f390afd4299..6b5ad607a94 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -342,6 +342,8 @@ gameover = 0 /obj/machinery/computer/arcade/orion_trail/attack_hand(mob/user as mob) + if(..()) + return if(fuel <= 0 || food <=0 || settlers.len == 0) gameover = 1 event = null diff --git a/code/game/machinery/computer/buildandrepair.dm b/code/game/machinery/computer/buildandrepair.dm index fc4c18c537f..5140790e6f8 100644 --- a/code/game/machinery/computer/buildandrepair.dm +++ b/code/game/machinery/computer/buildandrepair.dm @@ -289,7 +289,8 @@ if(istype(P, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = P if(!WT.remove_fuel(0, user)) - user << "The welding tool must be on to complete this task." + if(!WT.isOn()) + user << "The welding tool must be on to complete this task." return playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) user << "You start deconstructing the frame." diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 16ec25f1710..c0f658cb15c 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -332,7 +332,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/dat = "" if (emergency_shuttle.online && emergency_shuttle.location==0) var/timeleft = emergency_shuttle.timeleft() - dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]
" + dat += "Emergency shuttle\n
\nETA: [timeleft / 60 % 60]:[add_zero(num2text(timeleft % 60), 2)]" var/datum/browser/popup = new(user, "communications", "Communications Console", 400, 500) @@ -354,10 +354,11 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 if (src.authenticated) if(emergency_shuttle.recall_count > 1) if(emergency_shuttle.last_call_loc) - dat += "
Last emergency shuttle call/recall traced to: [format_text(emergency_shuttle.last_call_loc.name)].
" + dat += "
Most recent shuttle call/recall traced to: [format_text(emergency_shuttle.last_call_loc.name)]" else - dat += "
Last emergency shuttle call/recall trace failed.
" - dat += "Logged in as: [auth_id]" + dat += "
Unable to trace most recent shuttle call/recall signal." + dat += "
Logged in as: [auth_id]" + dat += "
" dat += "
\[ Log Out \]
" dat += "
General Functions" dat += "
\[ Message List \]" @@ -593,11 +594,9 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12 var/area/signal_origin = get_area(user) var/emergency_reason = "\nNature of emergency:\n\n[call_reason]" if (seclevel2num(get_security_level()) == SEC_LEVEL_RED) // There is a serious threat we gotta move no time to give them five minutes. - emergency_shuttle.incall(0.6, signal_origin) - priority_announce("The emergency shuttle has been called. Red Alert state confirmed: Dispatching priority shuttle. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority") + emergency_shuttle.incall(0.6, signal_origin, emergency_reason, 1) else - emergency_shuttle.incall(1, signal_origin) - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.[emergency_reason]", null, 'sound/AI/shuttlecalled.ogg', "Priority") + emergency_shuttle.incall(1, signal_origin, emergency_reason, 0) log_game("[key_name(user)] has called the shuttle.") message_admins("[key_name_admin(user)] has called the shuttle.", 1) diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index 8be739d4b89..b9d29711de0 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -397,7 +397,7 @@ //Get out list of viable PDAs var/list/obj/item/device/pda/sendPDAs = get_viewable_pdas() if(PDAs && PDAs.len > 0) - customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortAtom(sendPDAs) + customrecepient = input(usr, "Select a PDA from the list.") as null|anything in sortNames(sendPDAs) else customrecepient = null diff --git a/code/game/machinery/computer/prisoner.dm b/code/game/machinery/computer/prisoner.dm index 4fc05d7ef41..c0ce0bcfc8b 100644 --- a/code/game/machinery/computer/prisoner.dm +++ b/code/game/machinery/computer/prisoner.dm @@ -26,6 +26,7 @@ dat += text("[inserted_id]
") dat += text("Collected Points: [inserted_id.points]. Reset.
") dat += text("Card goal: [inserted_id.goal]. Set
") + dat += text("Space Law recommends quotas of 100 points per minute they would normally serve in the brig.
") else dat += text("Insert Prisoner ID.
") dat += "

Prisoner Implant Management

" @@ -105,6 +106,7 @@ if("setgoal") var/num = round(input(usr, "Choose prisoner's goal:", "Input an Integer", null) as num|null) if(num >= 0) + num = min(num,1000) //Cap the quota to the equivilent of 10 minutes. inserted_id.goal = num else if(href_list["inject1"]) var/obj/item/weapon/implant/I = locate(href_list["inject1"]) diff --git a/code/game/machinery/computer/syndicate_shuttle.dm b/code/game/machinery/computer/syndicate_shuttle.dm index 6757442453e..2c2b34faf52 100644 --- a/code/game/machinery/computer/syndicate_shuttle.dm +++ b/code/game/machinery/computer/syndicate_shuttle.dm @@ -1,40 +1,45 @@ #define SYNDICATE_SHUTTLE_MOVE_TIME 240 #define SYNDICATE_SHUTTLE_COOLDOWN 200 +/var/area/synd_shuttle_curr_location +/var/synd_shuttle_moving = 0 +/var/synd_shuttle_lastMove = 0 + /obj/machinery/computer/syndicate_station name = "syndicate shuttle terminal" icon = 'icons/obj/computer.dmi' icon_state = "syndishuttle" req_access = list(access_syndicate) - var/area/curr_location - var/moving = 0 - var/lastMove = 0 + var/recall_only = 0 +/obj/machinery/computer/syndicate_station/recall + name = "syndicate shuttle recall terminal" + recall_only = 1 /obj/machinery/computer/syndicate_station/New() - curr_location= locate(/area/syndicate_station/start) + synd_shuttle_curr_location= locate(/area/syndicate_station/start) /obj/machinery/computer/syndicate_station/proc/syndicate_move_to(area/destination as area) - if(moving) return - if(lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return + if(synd_shuttle_moving) return + if(synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN > world.time) return var/area/dest_location = locate(destination) - if(curr_location == dest_location) return + if(synd_shuttle_curr_location == dest_location) return - moving = 1 - lastMove = world.time + synd_shuttle_moving = 1 + synd_shuttle_lastMove = world.time - if(curr_location.z != dest_location.z) + if(synd_shuttle_curr_location.z != dest_location.z) var/area/transit_location = locate(/area/syndicate_station/transit) - curr_location.move_contents_to(transit_location) - curr_location = transit_location - curr_location.has_gravity = 0 + synd_shuttle_curr_location.move_contents_to(transit_location) + synd_shuttle_curr_location = transit_location + synd_shuttle_curr_location.has_gravity = 0 transit_location.has_gravity = 1 sleep(SYNDICATE_SHUTTLE_MOVE_TIME) - curr_location.move_contents_to(dest_location) - curr_location = dest_location - moving = 0 + synd_shuttle_curr_location.move_contents_to(dest_location) + synd_shuttle_curr_location = dest_location + synd_shuttle_moving = 0 return 1 /obj/machinery/computer/syndicate_station/attack_hand(mob/user as mob) @@ -44,17 +49,18 @@ user.set_machine(src) - var/dat = {"Location: [curr_location]
- Ready to move[max(lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
- Syndicate Space
- North West of SS13 | - North of SS13 | - North East of SS13
- South West of SS13 | - South of SS13 | - South East of SS13
- North East of the Mining Asteroid
- Close"} + var/dat = {"Location: [synd_shuttle_curr_location]
+ Ready to move[max(synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time, 0) ? " in [max(round((synd_shuttle_lastMove + SYNDICATE_SHUTTLE_COOLDOWN - world.time) * 0.1), 0)] seconds" : ": now"]
+ Syndicate Space
"} + if(!recall_only) + dat += {"North West of SS13 | + North of SS13 | + North East of SS13
+ South West of SS13 | + South of SS13 | + South East of SS13
+ North East of the Mining Asteroid
+ Close"} user << browse(dat, "window=computer;size=575x450") onclose(user, "computer") @@ -71,22 +77,21 @@ if(href_list["syndicate"]) syndicate_move_to(/area/syndicate_station/start) - else if(href_list["station_nw"]) - syndicate_move_to(/area/syndicate_station/northwest) - else if(href_list["station_n"]) - syndicate_move_to(/area/syndicate_station/north) - else if(href_list["station_ne"]) - syndicate_move_to(/area/syndicate_station/northeast) - else if(href_list["station_sw"]) - syndicate_move_to(/area/syndicate_station/southwest) - else if(href_list["station_s"]) - syndicate_move_to(/area/syndicate_station/south) - else if(href_list["station_se"]) - syndicate_move_to(/area/syndicate_station/southeast) -// else if(href_list["commssat"]) -// syndicate_move_to(/area/syndicate_station/commssat) - else if(href_list["mining"]) - syndicate_move_to(/area/syndicate_station/mining) + else if(!recall_only) + if(href_list["station_nw"]) + syndicate_move_to(/area/syndicate_station/northwest) + else if(href_list["station_n"]) + syndicate_move_to(/area/syndicate_station/north) + else if(href_list["station_ne"]) + syndicate_move_to(/area/syndicate_station/northeast) + else if(href_list["station_sw"]) + syndicate_move_to(/area/syndicate_station/southwest) + else if(href_list["station_s"]) + syndicate_move_to(/area/syndicate_station/south) + else if(href_list["station_se"]) + syndicate_move_to(/area/syndicate_station/southeast) + else if(href_list["mining"]) + syndicate_move_to(/area/syndicate_station/mining) updateUsrDialog() return \ No newline at end of file diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index 9ecedc5142e..a620d80585c 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -87,7 +87,7 @@ if(specialfunctions & IDSCAN) D.aiDisabledIdScanner = !D.aiDisabledIdScanner if(specialfunctions & BOLTS) - if(!D.isWireCut(4) && D.arePowerSystemsOn()) + if(!D.isWireCut(4) && D.hasPower()) D.locked = !D.locked D.update_icon() if(specialfunctions & SHOCK) diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index efa7140e7fb..ed5e9f3f878 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -5,7 +5,7 @@ mend - mends a wire and makes any necessary state changes canAIControl - 1 if the AI can control the airlock, 0 if not (then check canAIHack to see if it can hack in) canAIHack - 1 if the AI can hack into the airlock to recover control, 0 if not. Also returns 0 if the AI does not *need* to hack it. - arePowerSystemsOn - 1 if the main or backup power are functioning, 0 if not. Does not check whether the power grid is charged or an APC has equipment on or anything like that. (Check (stat & NOPOWER) for that) + hasPower - 1 if the main or backup power are functioning, 0 if not. requiresIDs - 1 if the airlock is requiring IDs, 0 if not isAllPowerCut - 1 if the main and backup power both have cut wires. regainMainPower - handles the effect of main power coming back on. @@ -344,8 +344,8 @@ About the new airlock wires panel: /obj/machinery/door/airlock/proc/canAIHack() return ((src.aiControlDisabled==1) && (!hackProof) && (!src.isAllPowerCut())); -/obj/machinery/door/airlock/proc/arePowerSystemsOn() - return (src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) +/obj/machinery/door/airlock/hasPower() + return ((src.secondsMainPowerLost==0 || src.secondsBackupPowerLost==0) && !(stat & NOPOWER)) /obj/machinery/door/airlock/requiresID() return !(src.isWireCut(AIRLOCK_WIRE_IDSCAN) || aiDisabledIdScanner) @@ -399,7 +399,7 @@ About the new airlock wires panel: // returns 1 if shocked, 0 otherwise // The preceding comment was borrowed from the grille's shock script /obj/machinery/door/airlock/proc/shock(mob/user, prb) - if((stat & (NOPOWER)) || !src.arePowerSystemsOn()) // unpowered, no shock + if(!hasPower()) // unpowered, no shock return 0 if(hasShocked) return 0 //Already shocked someone recently? @@ -523,7 +523,7 @@ About the new airlock wires panel: t1 += text("Door bolts are up. Drop them?
\n", src) else t1 += text("Door bolts are down.") - if(src.arePowerSystemsOn()) + if(src.hasPower()) t1 += text(" Raise?
\n", src) else t1 += text(" Cannot raise door bolts due to power failure.
\n") @@ -785,7 +785,7 @@ About the new airlock wires panel: else if(!src.locked) usr << text("The door bolts are already up.
\n") else - if(src.arePowerSystemsOn()) + if(src.hasPower()) src.locked = 0 update_icon() else @@ -889,17 +889,15 @@ About the new airlock wires panel: if((istype(C, /obj/item/weapon/weldingtool) && !( src.operating ) && src.density)) var/obj/item/weapon/weldingtool/W = C user << "You begin [welded ? "unwelding":"welding"] the airlock..." - playsound(loc, 'sound/items/Welder2.ogg', 40, 1) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) if(do_after(user,40,5,1)) if(density && !operating)//Door must be closed to weld. if(W.remove_fuel(0,user)) - playsound(loc, 'sound/items/welder.ogg', 50, 1) + playsound(loc, 'sound/items/Welder2.ogg', 50, 1) welded = !welded user << "You [welded ? "welded the airlock shut":"unwelded the airlock"]" update_icon() user.visible_message("[src] has been [welded? "welded shut":"unwelded"] by [user.name].") - else - user << "You need more welding fuel to complete this task." return else if(istype(C, /obj/item/weapon/screwdriver)) src.p_open = !( src.p_open ) @@ -920,7 +918,7 @@ About the new airlock wires panel: beingcrowbarred = 1 //derp, Agouri else beingcrowbarred = 0 - if( beingcrowbarred && (density && welded && !operating && src.p_open && (!src.arePowerSystemsOn() || stat & NOPOWER) && !src.locked) ) + if( beingcrowbarred && (density && welded && !operating && src.p_open && (!hasPower()) && !src.locked) ) playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1) user.visible_message("[user] removes the electronics from the airlock assembly.", "You start to remove electronics from the airlock assembly.") if(do_after(user,40)) @@ -984,7 +982,7 @@ About the new airlock wires panel: qdel(src) return - else if(arePowerSystemsOn() && !(stat & NOPOWER)) + else if(hasPower()) user << " The airlock's motors resist your efforts to force it." else if(locked) user << " The airlock's bolts prevent it from being forced." @@ -1025,7 +1023,7 @@ About the new airlock wires panel: if( operating || welded || locked ) return 0 if(!forced) - if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) + if( !hasPower() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) ) return 0 if(forced < 2) if(emagged) @@ -1056,7 +1054,7 @@ About the new airlock wires panel: if(operating || welded || locked) return if(!forced) - if( !arePowerSystemsOn() || (stat & NOPOWER) || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) ) + if( !hasPower() || isWireCut(AIRLOCK_WIRE_DOOR_BOLTS) ) return if(safe) if(locate(/mob/living) in get_turf(src)) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ac6e9ab2720..8b03d1696c5 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -88,14 +88,17 @@ return !density || check_access(ID) /obj/machinery/door/proc/bumpopen(mob/user as mob) - if(operating) return + if(operating) + return src.add_fingerprint(user) if(!src.requiresID()) user = null if(density && !emagged) - if(allowed(user) || src.emergency == 1) open() - else flick("door_deny", src) + if(allowed(user) || src.emergency == 1) + open() + else + flick("door_deny", src) return @@ -126,7 +129,7 @@ user = null if(!src.requiresID()) user = null - if(src.density && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) + if(src.density && hasPower() && (istype(I, /obj/item/weapon/card/emag)||istype(I, /obj/item/weapon/melee/energy/blade))) flick("door_spark", src) sleep(6) open() @@ -269,6 +272,9 @@ /obj/machinery/door/proc/requiresID() return 1 +/obj/machinery/door/proc/hasPower() + return !(stat & NOPOWER) + /obj/machinery/door/BlockSuperconductivity() if(opacity || heat_proof) return 1 diff --git a/code/game/machinery/pipe/construction.dm b/code/game/machinery/pipe/construction.dm index 8d41384915c..ab94b08d5e7 100644 --- a/code/game/machinery/pipe/construction.dm +++ b/code/game/machinery/pipe/construction.dm @@ -254,8 +254,6 @@ Buildable meters return 1 // no conflicts found - var/pipefailtext = "There's nothing to connect this pipe section to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - switch(pipe_type) if(PIPE_SIMPLE_STRAIGHT, PIPE_SIMPLE_BENT) var/obj/machinery/atmospherics/pipe/simple/P = new( src.loc ) @@ -264,16 +262,13 @@ Buildable meters var/turf/T = P.loc P.level = T.intact ? 2 : 1 P.initialize() - if (!P) - usr << pipefailtext - return 1 - P.build_network() if (P.node1) P.node1.initialize() - P.node1.build_network() + P.node1.addMember(P) if (P.node2) P.node2.initialize() - P.node2.build_network() + P.node2.addMember(P) + P.build_network() if(PIPE_HE_STRAIGHT, PIPE_HE_BENT) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/P = new ( src.loc ) @@ -283,16 +278,13 @@ Buildable meters //var/turf/T = P.loc //P.level = T.intact ? 2 : 1 P.initialize() - if (!P) - usr << pipefailtext - return 1 - P.build_network() if (P.node1) P.node1.initialize() - P.node1.build_network() + P.node1.addMember(P) if (P.node2) P.node2.initialize() - P.node2.build_network() + P.node2.addMember(P) + P.build_network() if(PIPE_CONNECTOR) // connector var/obj/machinery/atmospherics/portables_connector/C = new( src.loc ) @@ -310,26 +302,22 @@ Buildable meters if(PIPE_MANIFOLD) //manifold - var/obj/machinery/atmospherics/pipe/manifold/M = new( src.loc ) + var/obj/machinery/atmospherics/pipe/manifold/M = new(loc) M.dir = dir M.initialize_directions = pipe_dir - //M.New() var/turf/T = M.loc M.level = T.intact ? 2 : 1 M.initialize() - if (!M) - usr << "There's nothing to connect this manifold to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - return 1 - M.build_network() if (M.node1) M.node1.initialize() - M.node1.build_network() + M.node1.addMember(M) if (M.node2) M.node2.initialize() - M.node2.build_network() + M.node2.addMember(M) if (M.node3) M.node3.initialize() - M.node3.build_network() + M.node3.addMember(M) + M.build_network() if(PIPE_JUNCTION) var/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction/P = new ( src.loc ) @@ -339,16 +327,13 @@ Buildable meters //var/turf/T = P.loc //P.level = T.intact ? 2 : 1 P.initialize() - if (!P) - usr << "There's nothing to connect this junction to! (with how the pipe code works, at least one end needs to be connected to something, otherwise the game deletes the segment)" - return 1 - P.build_network() if (P.node1) P.node1.initialize() - P.node1.build_network() + P.node1.addMember(P) if (P.node2) P.node2.initialize() - P.node2.build_network() + P.node2.addMember(P) + P.build_network() if(PIPE_UVENT) //unary vent var/obj/machinery/atmospherics/unary/vent_pump/V = new( src.loc ) @@ -479,16 +464,13 @@ Buildable meters var/turf/T = P.loc P.level = T.intact ? 2 : 1 P.initialize() - if (!P) - usr << pipefailtext - return 1 - P.build_network() if (P.node1) P.node1.initialize() - P.node1.build_network() + P.node1.addMember(P) if (P.node2) P.node2.initialize() - P.node2.build_network() + P.node2.addMember(P) + P.build_network() if(PIPE_PASSIVE_GATE) //passive gate var/obj/machinery/atmospherics/binary/passive_gate/P = new(src.loc) diff --git a/code/game/machinery/pipe/pipe_dispenser.dm b/code/game/machinery/pipe/pipe_dispenser.dm index 905990105ca..a1aeefc9618 100644 --- a/code/game/machinery/pipe/pipe_dispenser.dm +++ b/code/game/machinery/pipe/pipe_dispenser.dm @@ -11,7 +11,7 @@ /obj/machinery/pipedispenser/attack_hand(user as mob) if(..()) - return + return 1 var/dat = {" Regular pipes:
Pipe
@@ -46,10 +46,10 @@ /obj/machinery/pipedispenser/Topic(href, href_list) if(..()) - return + return 1 if(!anchored|| !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) usr << browse(null, "window=pipedispenser") - return + return 1 usr.set_machine(src) src.add_fingerprint(usr) if(href_list["make"]) @@ -149,6 +149,7 @@ Nah Bin
Outlet
Chute
+Sort Junction
"} user << browse("[src][dat]", "window=pipedispenser") @@ -163,9 +164,6 @@ Nah usr.set_machine(src) src.add_fingerprint(usr) if(href_list["dmake"]) - if(!anchored || !usr.canmove || usr.stat || usr.restrained() || !in_range(loc, usr)) - usr << browse(null, "window=pipedispenser") - return if(!wait) var/p_type = text2num(href_list["dmake"]) var/obj/structure/disposalconstruct/C = new (src.loc) @@ -189,6 +187,8 @@ Nah if(7) C.ptype = 8 C.density = 1 + if(8) + C.ptype = 9 C.add_fingerprint(usr) C.update() wait = 1 diff --git a/code/game/machinery/shieldgen.dm b/code/game/machinery/shieldgen.dm index d6a97d6723d..cf3453400d8 100644 --- a/code/game/machinery/shieldgen.dm +++ b/code/game/machinery/shieldgen.dm @@ -374,10 +374,9 @@ src.add_fingerprint(user) /obj/machinery/shieldwallgen/process() - spawn(100) - power() - if(power) - storedpower -= 50 //this way it can survive longer and survive at all + power() + if(power) + storedpower -= 50 //this way it can survive longer and survive at all if(storedpower >= maxstoredpower) storedpower = maxstoredpower if(storedpower <= 0) @@ -389,14 +388,10 @@ if(!anchored) src.active = 0 return - spawn(1) - setup_field(1) - spawn(2) - setup_field(2) - spawn(3) - setup_field(4) - spawn(4) - setup_field(8) + setup_field(1) + setup_field(2) + setup_field(4) + setup_field(8) src.active = 2 if(src.active >= 1) if(src.power == 0) @@ -404,14 +399,10 @@ "You hear heavy droning fade out") icon_state = "Shield_Gen" src.active = 0 - spawn(1) - src.cleanup(1) - spawn(1) - src.cleanup(2) - spawn(1) - src.cleanup(4) - spawn(1) - src.cleanup(8) + src.cleanup(1) + src.cleanup(2) + src.cleanup(4) + src.cleanup(8) /obj/machinery/shieldwallgen/proc/setup_field(var/NSEW = 0) var/turf/T = src.loc diff --git a/code/game/machinery/turrets.dm b/code/game/machinery/turrets.dm index a34d7cec517..a075cf88976 100644 --- a/code/game/machinery/turrets.dm +++ b/code/game/machinery/turrets.dm @@ -308,106 +308,6 @@ spawn(13) qdel(src) -/obj/machinery/turretid - name = "turret deactivation control" - icon = 'icons/obj/device.dmi' - icon_state = "motion3" - anchored = 1 - density = 0 - var/enabled = 1 - var/lethal = 0 - var/locked = 1 - var/control_area //can be area name, path or nothing. - var/ailock = 0 // AI cannot use this - req_access = list(access_ai_upload) - -/obj/machinery/turretid/New() - ..() - if(!control_area) - var/area/CA = get_area(src) - if(CA.master && CA.master != CA) - control_area = CA.master - else - control_area = CA - else if(istext(control_area)) - for(var/area/A in world) - if(A.name && A.name==control_area) - control_area = A - break - //don't have to check if control_area is path, since get_area_all_atoms can take path. - return - -/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) - if(stat & BROKEN) return - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) - - if (istype(W, /obj/item/weapon/card/emag) && !emagged) - user << "You short out the turret controls' access analysis module." - emagged = 1 - locked = 0 - if(user.machine==src) - src.attack_hand(user) - - return - - else if( get_dist(src, user) == 0 ) // trying to unlock the interface - if (src.allowed(usr)) - if(emagged) - user << "The turret control is unresponsive." - return - - locked = !locked - user << "You [ locked ? "lock" : "unlock"] the panel." - if (locked) - if (user.machine==src) - user.unset_machine() - user << browse(null, "window=turretid") - else - if (user.machine==src) - src.attack_hand(user) - else - user << "Access denied." - -/obj/machinery/turretid/attack_ai(mob/user as mob) - if(!ailock) - return attack_hand(user) - else - user << "There seems to be a firewall preventing you from accessing this device." - -/obj/machinery/turretid/attack_hand(mob/user as mob) - if ( get_dist(src, user) > 0 ) - if ( !issilicon(user) ) - user << "You are too far away." - user.unset_machine() - user << browse(null, "window=turretid") - return - - user.set_machine(src) - var/loc = src.loc - if (istype(loc, /turf)) - loc = loc:loc - if (!istype(loc, /area)) - user << text("Turret badly positioned - loc.loc is [].", loc) - return - var/area/area = loc - var/t = "" - - if(src.locked && (!istype(user, /mob/living/silicon))) - t += "
Swipe ID card to unlock interface
" - else - if (!istype(user, /mob/living/silicon)) - t += "
Swipe ID card to lock interface
" - t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable") - t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal") - - //user << browse(t, "window=turretid") - //onclose(user, "turretid") - var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])") - popup.set_content(t) - popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) - popup.open() - /obj/machinery/turret/attack_animal(mob/living/simple_animal/M as mob) M.changeNext_move(CLICK_CD_MELEE) @@ -439,45 +339,9 @@ return - -/obj/machinery/turretid/Topic(href, href_list) - if(..()) - return - if (src.locked) - if (!istype(usr, /mob/living/silicon)) - usr << "Control panel is locked!" - return - if (href_list["toggleOn"]) - src.enabled = !src.enabled - src.updateTurrets() - else if (href_list["toggleLethal"]) - src.lethal = !src.lethal - src.updateTurrets() - src.attack_hand(usr) - -/obj/machinery/turretid/proc/updateTurrets() - if(control_area) - for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area)) - aTurret.setState(enabled, lethal) - src.update_icons() - -/obj/machinery/turretid/proc/update_icons() - if (src.enabled) - if (src.lethal) - icon_state = "motion1" - else - icon_state = "motion3" - else - icon_state = "motion0" - //CODE FIXED BUT REMOVED -// if(control_area) //USE: updates other controls in the area -// for (var/obj/machinery/turretid/Turret_Control in world) //I'm not sure if this is what it was -// if( Turret_Control.control_area != src.control_area ) continue //supposed to do. Or whether the person -// Turret_Control.icon_state = icon_state //who coded it originally was just tired -// Turret_Control.enabled = enabled //or something. I don't see any situation -// Turret_Control.lethal = lethal //in which this would be used on the current map. - //If he wants it back he can uncomment it - +////////////// +//Gun Turret// +////////////// /obj/machinery/gun_turret //related to turrets but work way differentely because of being mounted on a moving ship. name = "machine gun turret" @@ -621,3 +485,147 @@ spawn(0) A.process() return + + +//////////////////////// +//Turret Control Panel// +//////////////////////// + +/obj/machinery/turretid + name = "turret control panel" + desc = "Used to control a room's automated defenses." + icon = 'icons/obj/machines/turret_control.dmi' + icon_state = "control_standby" + anchored = 1 + density = 0 + var/enabled = 1 + var/lethal = 0 + var/locked = 1 + var/control_area //can be area name, path or nothing. + var/ailock = 0 // AI cannot use this + req_access = list(access_ai_upload) + +/obj/machinery/turretid/New() + ..() + if(!control_area) + var/area/CA = get_area(src) + if(CA.master && CA.master != CA) + control_area = CA.master + else + control_area = CA + else if(istext(control_area)) + for(var/area/A in world) + if(A.name && A.name==control_area) + control_area = A + break + power_change() //Checks power and initial settings + //don't have to check if control_area is path, since get_area_all_atoms can take path. + return + +/obj/machinery/turretid/attackby(obj/item/weapon/W, mob/user) + if(stat & BROKEN) return + if (istype(user, /mob/living/silicon)) + return src.attack_hand(user) + + if (istype(W, /obj/item/weapon/card/emag) && !emagged) + user << "You short out the turret controls' access analysis module." + emagged = 1 + locked = 0 + if(user.machine==src) + src.attack_hand(user) + + return + + else if( get_dist(src, user) == 0 ) // trying to unlock the interface + if (src.allowed(usr)) + if(emagged) + user << "The turret control is unresponsive." + return + + locked = !locked + user << "You [ locked ? "lock" : "unlock"] the panel." + if (locked) + if (user.machine==src) + user.unset_machine() + user << browse(null, "window=turretid") + else + if (user.machine==src) + src.attack_hand(user) + else + user << "Access denied." + +/obj/machinery/turretid/attack_ai(mob/user as mob) + if(!ailock) + return attack_hand(user) + else + user << "There seems to be a firewall preventing you from accessing this device." + +/obj/machinery/turretid/attack_hand(mob/user as mob) + if ( get_dist(src, user) > 0 ) + if ( !issilicon(user) ) + user << "You are too far away." + user.unset_machine() + user << browse(null, "window=turretid") + return + + user.set_machine(src) + var/loc = src.loc + if (istype(loc, /turf)) + loc = loc:loc + if (!istype(loc, /area)) + user << text("Turret badly positioned - loc.loc is [].", loc) + return + var/area/area = loc + var/t = "" + + if(src.locked && (!istype(user, /mob/living/silicon))) + t += "
Swipe ID card to unlock interface
" + else + if (!istype(user, /mob/living/silicon)) + t += "
Swipe ID card to lock interface
" + t += text("Turrets [] - []?
\n", src.enabled?"activated":"deactivated", src, src.enabled?"Disable":"Enable") + t += text("Currently set for [] - Change to []?
\n", src.lethal?"lethal":"stun repeatedly", src, src.lethal?"Stun repeatedly":"Lethal") + + //user << browse(t, "window=turretid") + //onclose(user, "turretid") + var/datum/browser/popup = new(user, "turretid", "Turret Control Panel ([area.name])") + popup.set_content(t) + popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state)) + popup.open() + +/obj/machinery/turretid/Topic(href, href_list) + if(..()) + return + if (src.locked) + if (!istype(usr, /mob/living/silicon)) + usr << "Control panel is locked!" + return + if (href_list["toggleOn"]) + src.enabled = !src.enabled + src.updateTurrets() + else if (href_list["toggleLethal"]) + src.lethal = !src.lethal + src.updateTurrets() + src.attack_hand(usr) + +/obj/machinery/turretid/proc/updateTurrets() + if(control_area) + for (var/obj/machinery/turret/aTurret in get_area_all_atoms(control_area)) + aTurret.setState(enabled, lethal) + src.update_icon() + +/obj/machinery/turretid/power_change() + ..() + update_icon() + +/obj/machinery/turretid/update_icon() + ..() + if(stat & NOPOWER) + icon_state = "control_off" + else if (enabled) + if (lethal) + icon_state = "control_kill" + else + icon_state = "control_stun" + else + icon_state = "control_standby" \ No newline at end of file diff --git a/code/game/mecha/equipment/tools/tools.dm b/code/game/mecha/equipment/tools/tools.dm index 54b79470b12..70051b606d6 100644 --- a/code/game/mecha/equipment/tools/tools.dm +++ b/code/game/mecha/equipment/tools/tools.dm @@ -132,8 +132,8 @@ return 0 /obj/item/mecha_parts/mecha_equipment/tool/drill/proc/drill_mob(mob/living/target, mob/user, var/drill_damage=80) - target.visible_message("[chassis] drills [target] with the [src].\ - [chassis] drills [target] with the [src].") + target.visible_message("[chassis] drills [target] with [src].", \ + "[chassis] drills [target] with [src].") add_logs(user, target, "attacked", object="[name]", addition="(INTENT: [uppertext(user.a_intent)]) (DAMTYPE: [uppertext(damtype)])") if(ishuman(target)) var/mob/living/carbon/human/H = target diff --git a/code/game/mecha/mecha_wreckage.dm b/code/game/mecha/mecha_wreckage.dm index 2f27fbfa34e..6d929530ee6 100644 --- a/code/game/mecha/mecha_wreckage.dm +++ b/code/game/mecha/mecha_wreckage.dm @@ -32,7 +32,6 @@ else user << "You failed to salvage anything valuable from [src]." else - user << "You need more welding fuel to complete this task." return if(istype(I, /obj/item/weapon/wirecutters)) diff --git a/code/game/objects/effects/aliens.dm b/code/game/objects/effects/aliens.dm index 3a12acdd6ca..ab27ad7dd58 100644 --- a/code/game/objects/effects/aliens.dm +++ b/code/game/objects/effects/aliens.dm @@ -16,23 +16,24 @@ */ /obj/structure/alien/resin name = "resin" - desc = "Looks like some kind of slimy growth." + desc = "Looks like some kind of thick resin." icon_state = "resin" density = 1 opacity = 1 anchored = 1 var/health = 200 - + var/resintype = null /obj/structure/alien/resin/New(location) + relativewall_neighbours() ..() air_update_turf(1) return /obj/structure/alien/resin/Destroy() - density = 0 - air_update_turf(1) + var/turf/T = loc + loc = null + T.relativewall_neighbours() ..() - return /obj/structure/alien/resin/Move() var/turf/T = loc @@ -44,19 +45,28 @@ /obj/structure/alien/resin/wall name = "resin wall" - desc = "Purple slime solidified into a wall." + desc = "Thick resin solidified into a wall." icon_state = "resinwall" //same as resin, but consistency ho! + resintype = "wall" + +/obj/structure/alien/resin/wall/New() + relativewall_neighbours() + ..() /obj/structure/alien/resin/wall/BlockSuperconductivity() return 1 /obj/structure/alien/resin/membrane name = "resin membrane" - desc = "Purple slime just thin enough to let light pass through." + desc = "Resin just thin enough to let light pass through." icon_state = "resinmembrane" opacity = 0 health = 120 + resintype = "membrane" +/obj/structure/alien/resin/membrane/New() + relativewall_neighbours() + ..() /obj/structure/alien/resin/proc/healthcheck() if(health <=0) @@ -145,11 +155,12 @@ /obj/structure/alien/weeds gender = PLURAL - name = "weeds" - desc = "Weird purple weeds." + name = "resin floor" + desc = "A thick resin surface covers the floor." icon_state = "weeds" anchored = 1 density = 0 + layer = 2 var/health = 15 var/obj/structure/alien/weeds/node/linked_node = null @@ -162,11 +173,17 @@ return if(icon_state == "weeds") icon_state = pick("weeds", "weeds1", "weeds2") - + fullUpdateWeedOverlays() spawn(rand(150, 200)) if(src) Life() +/obj/structure/alien/weeds/Destroy() + var/turf/T = loc + loc = null + for (var/obj/structure/alien/weeds/W in range(1,T)) + W.updateWeedOverlays() + ..() /obj/structure/alien/weeds/proc/Life() set background = BACKGROUND_ENABLED @@ -226,12 +243,37 @@ healthcheck() +/obj/structure/alien/weeds/proc/updateWeedOverlays() + + overlays.Cut() + var/turf/N = get_step(src, NORTH) + var/turf/S = get_step(src, SOUTH) + var/turf/E = get_step(src, EAST) + var/turf/W = get_step(src, WEST) + if(!locate(/obj/structure/alien) in N.contents) + if(istype(N, /turf/simulated/floor)) + src.overlays += image('icons/mob/alien.dmi', "weeds_side_s", layer=2.6, pixel_y = 32) + if(!locate(/obj/structure/alien) in S.contents) + if(istype(S, /turf/simulated/floor)) + src.overlays += image('icons/mob/alien.dmi', "weeds_side_n", layer=2.6, pixel_y = -32) + if(!locate(/obj/structure/alien) in E.contents) + if(istype(E, /turf/simulated/floor)) + src.overlays += image('icons/mob/alien.dmi', "weeds_side_w", layer=2.6, pixel_x = 32) + if(!locate(/obj/structure/alien) in W.contents) + if(istype(W, /turf/simulated/floor)) + src.overlays += image('icons/mob/alien.dmi', "weeds_side_e", layer=2.6, pixel_x = -32) + + +/obj/structure/alien/weeds/proc/fullUpdateWeedOverlays() + for (var/obj/structure/alien/weeds/W in range(1,src)) + W.updateWeedOverlays() + //Weed nodes /obj/structure/alien/weeds/node - name = "purple sac" - desc = "Weird purple octopus-like thing." + name = "glowing resin" + desc = "Blue bioluminescence shines from beneath the surface." icon_state = "weednode" - luminosity = NODERANGE + luminosity = 1 var/node_range = NODERANGE @@ -291,6 +333,7 @@ /obj/structure/alien/egg/attack_hand(mob/user) user << "It feels slimy." + user.changeNext_move(CLICK_CD_MELEE) /obj/structure/alien/egg/proc/GetFacehugger() @@ -342,6 +385,7 @@ playsound(loc, 'sound/items/Welder.ogg', 100, 1) health -= damage + user.changeNext_move(CLICK_CD_MELEE) healthcheck() diff --git a/code/game/objects/effects/spawners/lootdrop.dm b/code/game/objects/effects/spawners/lootdrop.dm index 7aaffa5dea4..a3b1520af36 100644 --- a/code/game/objects/effects/spawners/lootdrop.dm +++ b/code/game/objects/effects/spawners/lootdrop.dm @@ -96,7 +96,7 @@ /obj/item/weapon/crowbar = 1, /obj/item/weapon/crowbar/red = 1, /obj/item/weapon/extinguisher = 11, - /obj/item/weapon/gun/projectile/revolver/russian = 1, + //obj/item/weapon/gun/projectile/revolver/russian = 1, //disabled until lootdrop is a proper world proc. /obj/item/weapon/hand_labeler = 1, /obj/item/weapon/paper/crumpled = 1, /obj/item/weapon/pen = 1, diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 752d894dfb4..3f239f3d591 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -37,6 +37,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/cart = "" //A place to stick cartridge menu information var/detonate = 1 // Can the PDA be blown up? var/hidden = 0 // Is the PDA hidden from the PDA list? + var/emped = 0 var/obj/item/weapon/card/id/id = null //Making it possible to slot an ID card into the PDA so it can function as both. var/ownjob = null //related to above @@ -370,7 +371,7 @@ var/global/list/obj/item/device/pda/PDAs = list() var/count = 0 if (!toff) - for (var/obj/item/device/pda/P in sortAtom(get_viewable_pdas())) + for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas())) if (P == src) continue dat += "
  • [P]" if (istype(cartridge, /obj/item/weapon/cartridge/syndicate) && P.detonate) @@ -730,6 +731,9 @@ var/global/list/obj/item/device/pda/PDAs = list() var/datum/signal/signal = src.telecomms_process() + if(emped) + t = Gibberish(t, 100) + var/useTC = 0 if(signal) if(signal.data["done"]) @@ -1071,6 +1075,9 @@ 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) + emped += 1 + spawn(200 * severity) + emped -= 1 /proc/get_viewable_pdas() . = list() diff --git a/code/game/objects/items/devices/camera_bug.dm b/code/game/objects/items/devices/camera_bug.dm index 24edb356243..da1bcf84de8 100644 --- a/code/game/objects/items/devices/camera_bug.dm +++ b/code/game/objects/items/devices/camera_bug.dm @@ -103,7 +103,7 @@ if(NETWORK_BUG,ADMIN_BUG) if(length(list("SS13","MINE")&camera.network)) bugged_cameras[camera.c_tag] = camera - bugged_cameras = sortAssoc(bugged_cameras) + sortList(bugged_cameras) return bugged_cameras diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 9ab97b5cb93..8c31edae6cb 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -245,7 +245,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use //#### Tagging the signal with all appropriate identity values ####// // ||-- The mob's name identity --|| - var/displayname = M.name // grab the display name (name you get when you hover over someone's icon) var/real_name = M.name // mob's real name var/mobkey = "none" // player key associated with mob var/voicemask = 0 // the speaker is wearing a voice mask @@ -265,7 +264,6 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use var/datum/data/record/findjob = find_record("name", voice, data_core.general) if(voice != real_name) - displayname = voice voicemask = 1 if(findjob) jobname = findjob.fields["rank"] @@ -310,7 +308,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use "mob" = M, // store a reference to the mob "mobtype" = M.type, // the mob's type "realname" = real_name, // the mob's real name - "name" = voice, // the mob's display name + "name" = voice, // the mob's voice name "job" = jobname, // the mob's job "key" = mobkey, // the mob's key "vmask" = voicemask, // 1 if the mob is using a voice gas mask @@ -356,17 +354,17 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use /* --- Try to send a normal subspace broadcast first */ signal.data = list( - "mob" = M, // store a reference to the mob + "mob" = M, // store a reference to the mob "mobtype" = M.type, // the mob's type "realname" = real_name, // the mob's real name - "name" = displayname, // the mob's display name + "name" = voice, // the mob's voice name "job" = jobname, // the mob's job "key" = mobkey, // the mob's key "vmask" = voicemask, // 1 if the mob is using a voice gas mas - "compression" = 0, // uncompressed radio signal - "message" = message, // the actual sent message - "radio" = src, // stores the radio used for transmission + "compression" = 0, // uncompressed radio signal + "message" = message, // the actual sent message + "radio" = src, // stores the radio used for transmission "slow" = 0, "traffic" = 0, "type" = 0, @@ -388,7 +386,7 @@ var/GLOBAL_RADIO_TYPE = 1 // radio type to use // Oh my god; the comms are down or something because the signal hasn't been broadcasted yet in our level. // Send a mundane broadcast with limited targets: Broadcast_Message(M, voicemask, - src, message, displayname, jobname, real_name, + src, message, voice, jobname, real_name, filter_type, signal.data["compression"], list(position.z), freq) /obj/item/device/radio/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) diff --git a/code/game/objects/items/devices/uplinks.dm b/code/game/objects/items/devices/uplinks.dm index 770a1159de5..44913a00a4f 100644 --- a/code/game/objects/items/devices/uplinks.dm +++ b/code/game/objects/items/devices/uplinks.dm @@ -9,8 +9,8 @@ A list of items and costs is stored under the datum of every game mode, alongsid var/list/world_uplinks = list() /obj/item/device/uplink - var/welcome // Welcoming menu message - var/uses // Numbers of crystals + var/welcome = "Syndicate Uplink Console:" // Welcoming menu message + var/uses = 10 // Numbers of crystals // List of items not to shove in their hands. var/purchase_log = "" var/show_description = null @@ -22,8 +22,6 @@ var/list/world_uplinks = list() /obj/item/device/uplink/New() ..() world_uplinks+=src - welcome = ticker.mode.uplink_welcome - uses = ticker.mode.uplink_uses /obj/item/device/uplink/Destroy() world_uplinks-=src diff --git a/code/game/objects/items/robot/robot_parts.dm b/code/game/objects/items/robot/robot_parts.dm index 98040a52653..26ad543c980 100644 --- a/code/game/objects/items/robot/robot_parts.dm +++ b/code/game/objects/items/robot/robot_parts.dm @@ -253,6 +253,8 @@ else user << "The MMI must go in after everything else!" + if(istype(W,/obj/item/weapon/pen)) + user << "You need to use a multitool to name [src]." return /obj/item/robot_parts/robot_suit/proc/Interact(mob/user) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index fabece80e32..57d716488b1 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -323,7 +323,7 @@ if(G.amount >= G.max_amount) continue G.attackby(NG, user) - user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s." + user << "You add the newly-formed glass to the stack. It now contains [NG.amount] sheet\s." qdel(src) ..() diff --git a/code/game/objects/items/weapons/cigs_lighters.dm b/code/game/objects/items/weapons/cigs_lighters.dm index 23243aef5cd..a848cb4dc3f 100644 --- a/code/game/objects/items/weapons/cigs_lighters.dm +++ b/code/game/objects/items/weapons/cigs_lighters.dm @@ -269,6 +269,12 @@ CIGARETTE PACKETS ARE IN FANCY.DM src.pixel_x = rand(-5.0, 5) src.pixel_y = rand(-5.0, 5) +/obj/item/clothing/mask/cigarette/rollie/trippy/New() + ..() + reagents.add_reagent("mushroomhallucinogen", 50) + light() + //for(var/mob/M in player_list) M << 'sound/misc/Smoke_Weed_Everyday.ogg' + /obj/item/weapon/cigbutt/roach name = "roach" diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 3becca92514..b5b488c90e0 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -127,7 +127,7 @@ user << " You purify [A]." var/unholy2clean = A.reagents.get_reagent_amount("unholywater") A.reagents.del_reagent("unholywater") - A.reagents.add_reagent("cleaner",unholy2clean) //it cleans their soul, get it? I'll get my coat... + A.reagents.add_reagent("holywater",unholy2clean) /obj/item/weapon/storage/book/bible/attackby(obj/item/weapon/W as obj, mob/user as mob) playsound(src.loc, "rustle", 50, 1, -5) diff --git a/code/game/objects/items/weapons/tools.dm b/code/game/objects/items/weapons/tools.dm index f497312f5d7..0ff49f7cb63 100644 --- a/code/game/objects/items/weapons/tools.dm +++ b/code/game/objects/items/weapons/tools.dm @@ -176,7 +176,6 @@ item_heal_robotic(H, user, 30, 0) return else - user << "Need more welding fuel!" return else return ..() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 1ce6e22f988..9c772d349b2 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -180,11 +180,11 @@ if(istype(W, /obj/item/weapon/weldingtool)) var/obj/item/weapon/weldingtool/WT = W user << "You begin cutting the [src] apart..." - playsound(loc, 'sound/items/Welder2.ogg', 40, 1) + playsound(loc, 'sound/items/Welder.ogg', 40, 1) if(do_after(user,40,5,1)) if(src.opened) if(WT.remove_fuel(0,user)) - playsound(loc, 'sound/items/welder.ogg', 50, 1) + playsound(loc, 'sound/items/Welder2.ogg', 50, 1) new /obj/item/stack/sheet/metal(src.loc) for(var/mob/M in viewers(src)) M.show_message("\The [src] has been cut apart by [user] with \the [WT].", 3, "You hear welding.", 2) diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index 898e96e7968..ab62e1ee84a 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -457,7 +457,6 @@ obj/structure/door_assembly/New() new M(get_turf(src)) qdel(src) else - user << " You need more welding fuel to dissassemble the airlock assembly." return else if(istype(W, /obj/item/weapon/wrench) && !anchored ) diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index 46730d0332f..bb0dc4486f6 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -118,7 +118,7 @@ user << "You can't reach, close it first!" if(istype(W, /obj/item/weapon/pickaxe/plasmacutter) || istype(W, /obj/item/weapon/pickaxe/diamonddrill) || istype(W, /obj/item/weapon/melee/energy/blade)) - dismantle() + dismantle(user) /obj/structure/falsewall/proc/dismantle(mob/user) user.visible_message("[user] dismantles the false wall.", "You dismantle the false wall.") diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ea89e95dfa6..73c9e58a568 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -59,9 +59,8 @@ var/obj/item/weapon/weldingtool/WT = C if(WT.remove_fuel(0, user)) user << "Slicing lattice joints ..." - new /obj/item/stack/rods(src.loc) - qdel(src) - + new /obj/item/stack/rods(src.loc) + qdel(src) return /obj/structure/lattice/proc/updateOverlays() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 657acb8b02c..e163f334470 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -249,25 +249,3 @@ for(var/i = 1, i <= oreAmount, i++) new/obj/item/stack/sheet/mineral/wood(get_turf(src)) qdel(src) - -/obj/structure/mineral_door/resin - mineralType = "resin" - hardness = 1 - close_delay = 100 - openSound = 'sound/effects/attackblob.ogg' - closeSound = 'sound/effects/attackblob.ogg' - -/obj/structure/mineral_door/resin/TryToSwitchState(atom/user) - if(isalien(user)) - return ..() - -/obj/structure/mineral_door/resin/Dismantle(devastated = 0) - qdel(src) - -/obj/structure/mineral_door/resin/CheckHardness() - playsound(loc, 'sound/effects/attackblob.ogg', 100, 1) - ..() - -/obj/structure/mineral_door/resin/BlockSuperconductivity() - if(opacity) - return 1 \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm index 4512e2b45cc..5428ec16cd3 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/alien_nests.dm @@ -13,6 +13,7 @@ "[user.name] pulls you free from the gelatinous resin.",\ "You hear squelching...") buckled_mob.pixel_y = 0 + buckled_mob.pixel_x = 0 unbuckle() /obj/structure/stool/bed/nest/unbuckle_myself(mob/user as mob) @@ -23,6 +24,7 @@ spawn(600) if(user && buckled_mob && user.buckled == src) buckled_mob.pixel_y = 0 + buckled_mob.pixel_x = 0 unbuckle() /obj/structure/stool/bed/nest/buckle_mob(mob/M as mob, mob/user as mob) @@ -47,11 +49,17 @@ M.loc = src.loc M.dir = src.dir M.update_canmove() - M.pixel_y = 6 + M.pixel_y = 1 + M.pixel_x = 2 src.buckled_mob = M src.add_fingerprint(user) + src.overlays += image('icons/mob/alien.dmi', "nestoverlay", layer=6) return +/obj/structure/stool/bed/nest/unbuckle() + overlays.Cut() + ..() + /obj/structure/stool/bed/nest/attackby(obj/item/weapon/W as obj, mob/user as mob) var/aforce = W.force health = max(0, health - aforce) diff --git a/code/game/objects/structures/windoor_assembly.dm b/code/game/objects/structures/windoor_assembly.dm index 281594704e1..e6c0a4e2179 100644 --- a/code/game/objects/structures/windoor_assembly.dm +++ b/code/game/objects/structures/windoor_assembly.dm @@ -89,7 +89,6 @@ obj/structure/windoor_assembly/Destroy() R.add_fingerprint(user) qdel(src) else - user << "You need more welding fuel to dissassemble the windoor assembly." return //Wrenching an unsecure assembly anchors it in place. Step 4 complete diff --git a/code/game/smoothwall.dm b/code/game/smoothwall.dm index 29800a163e8..e98c839150a 100644 --- a/code/game/smoothwall.dm +++ b/code/game/smoothwall.dm @@ -81,6 +81,9 @@ for(var/obj/structure/falsewall/W in range(src,1)) W.relativewall() W.update_icon()//Refreshes the wall to make sure the icons don't desync + for(var/obj/structure/alien/resin/W in range(src,1)) + W.relativewall() + W.update_icon() return /turf/simulated/wall/New() @@ -129,4 +132,17 @@ junction |= get_dir(src,W) var/turf/simulated/wall/wall = src wall.icon_state = "[wall.walltype][junction]" + return + + +/obj/structure/alien/resin/relativewall() + + var/junction = 0 //will be used to determine from which side the wall is connected to other walls + + for(var/obj/structure/alien/resin/W in orange(src,1)) + if(abs(src.x-W.x)-abs(src.y-W.y)) //doesn't count diagonal walls + junction |= get_dir(src,W) + var/obj/structure/alien/resin/resin = src + resin.icon_state = "[resin.resintype][junction]" + return \ No newline at end of file diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index 1ccb3cb9675..4e8ae18a48c 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -588,5 +588,3 @@ turf/simulated/floor/proc/update_icon() icon_state = icon_plating burnt = 0 broken = 0 - else - user << "You need more welding fuel to complete this task." diff --git a/code/game/turfs/simulated/floor_mineral.dm b/code/game/turfs/simulated/floor_mineral.dm index 5870aa2396e..f281fd6c471 100644 --- a/code/game/turfs/simulated/floor_mineral.dm +++ b/code/game/turfs/simulated/floor_mineral.dm @@ -33,6 +33,11 @@ floortype = "clown" floor_tile = new/obj/item/stack/tile/mineral/bananium +/turf/simulated/floor/mineral/bananium/airless + oxygen = 0.01 + nitrogen = 0.01 + temperature = TCMB + /turf/simulated/floor/mineral/diamond name = "diamond floor" icon_state = "diamond" diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index 540c9d2d88f..ef645aa7963 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -228,7 +228,6 @@ user << "You remove the outer plating." dismantle_wall() else - user << "You need more welding fuel to complete this task." return else if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) ) diff --git a/code/game/turfs/simulated/walls_reinforced.dm b/code/game/turfs/simulated/walls_reinforced.dm index 8126029fc18..ed18c29dc8c 100644 --- a/code/game/turfs/simulated/walls_reinforced.dm +++ b/code/game/turfs/simulated/walls_reinforced.dm @@ -102,8 +102,6 @@ src.d_state = 3 src.icon_state = "r_wall-3" user << "You press firmly on the cover, dislodging it." - else - user << "You need more welding fuel to complete this task." return if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) ) @@ -166,8 +164,6 @@ src.icon_state = "r_wall-6" new /obj/item/stack/rods( src ) user << "The support rods drop out as you cut them loose from the frame." - else - user << "You need more welding fuel to complete this task." return if( istype(W, /obj/item/weapon/pickaxe/plasmacutter) ) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 76ef6c096da..3f811920e73 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -6,7 +6,6 @@ var/global/floorIsLava = 0 //////////////////////////////// /proc/message_admins(var/msg) msg = "ADMIN LOG: [msg]" - log_adminwarn(msg) admins << msg diff --git a/code/modules/admin/admin_memo.dm b/code/modules/admin/admin_memo.dm index b3f9e451ee3..18b9b030ed1 100644 --- a/code/modules/admin/admin_memo.dm +++ b/code/modules/admin/admin_memo.dm @@ -21,13 +21,15 @@ if(null) return if("") + message_admins("[src.ckey] removed their own Memo") + log_admin("[src.ckey] removed their own Memo") F.dir.Remove(ckey) - src << "Memo removed" return if( findtext(memo,"[memo]" message_admins("[key] set an admin memo:
    [memo]") + log_admin("[key] set an admin memo:[memo]") //show all memos /client/proc/admin_memo_show() @@ -35,7 +37,7 @@ var/savefile/F = new(MEMOFILE) if(F) for(var/ckey in F.dir) - src << "
    Admin Memo by [F[ckey]]
    " + src << "
    Admin Memo by [F[ckey]]
    " //delete your own or somebody else's memo /client/proc/admin_memo_delete() @@ -47,8 +49,10 @@ else ckey = src.ckey if(ckey) - F.dir.Remove(ckey) - src << "Removed Memo created by [ckey]." + for(var/memo in F.dir) + message_admins("[src.ckey] removed [ckey]'s Memo.") + log_admin("[src.ckey] removed Memo created by [F[memo]].") + F.dir.Remove(ckey) #undef MEMOFILE -#undef ENABLE_MEMOS \ No newline at end of file +#undef ENABLE_MEMOS diff --git a/code/modules/admin/player_panel.dm b/code/modules/admin/player_panel.dm index d9b91ef9f84..e5237aba5f5 100644 --- a/code/modules/admin/player_panel.dm +++ b/code/modules/admin/player_panel.dm @@ -368,7 +368,7 @@ if (ticker && ticker.current_state >= GAME_STATE_PLAYING) var/dat = "Round Status

    Round Status

    " dat += "Current Game Mode: [ticker.mode.name]
    " - dat += "Round Duration: [round(world.time / 36000)]:[add_zero(world.time / 600 % 60, 2)]:[world.time / 100 % 6][world.time / 100 % 10]
    " + dat += "Round Duration: [round(world.time / 36000)]:[add_zero("[world.time / 600 % 60]", 2)]:[world.time / 100 % 6][world.time / 100 % 10]
    " dat += "Emergency shuttle
    " if (!emergency_shuttle.online) dat += "Call Shuttle
    " diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c75382d3878..7d567ec07cf 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -180,7 +180,6 @@ if ((!( ticker ) || emergency_shuttle.location)) return emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null,'sound/AI/shuttlecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) @@ -190,7 +189,6 @@ switch(emergency_shuttle.direction) if(-1) emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlerecalled.ogg', "Priority") log_admin("[key_name(usr)] called the Emergency Shuttle") message_admins("[key_name_admin(usr)] called the Emergency Shuttle to the station", 1) if(1) diff --git a/code/modules/admin/verbs/getlogs.dm b/code/modules/admin/verbs/getlogs.dm index e71244b9c25..4dafcd58c9d 100644 --- a/code/modules/admin/verbs/getlogs.dm +++ b/code/modules/admin/verbs/getlogs.dm @@ -106,6 +106,5 @@ else src << "Error: view_atk_log(): File not found/Invalid path([path])." return - usr << run( file(path) ) feedback_add_details("admin_verb","SSAL") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! return diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index b12a431043d..21875856b58 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -256,53 +256,40 @@ client/proc/one_click_antag() //Making sure we have atleast 3 Nuke agents, because less than that is kinda bad if(agentcount < 3) return 0 - else - for(var/mob/c in chosen) - var/mob/living/carbon/human/new_character=makeBody(c) - new_character.mind.make_Nuke() - - var/obj/effect/landmark/nuke_spawn = locate("landmark*Syndicate-Uplink") - var/obj/effect/landmark/closet_spawn = locate("landmark*Nuclear-Closet") + var/obj/effect/landmark/nuke_spawn = locate("landmark*Nuclear-Bomb") + var/obj/effect/landmark/closet_spawn = locate("landmark*Syndicate-Uplink") var/nuke_code = "[rand(10000, 99999)]" if(nuke_spawn) - var/obj/item/weapon/paper/P = new - P.info = "Sadly, the Syndicate could not get you a nuclear bomb. We have, however, acquired the arming code for the station's onboard nuke. The nuclear authorization code is: [nuke_code]" - P.name = "nuclear bomb code and instructions" - P.loc = nuke_spawn.loc + var/obj/machinery/nuclearbomb/the_bomb = new /obj/machinery/nuclearbomb(nuke_spawn.loc) + the_bomb.r_code = nuke_code if(closet_spawn) new /obj/structure/closet/syndicate/nuclear(closet_spawn.loc) - for (var/obj/effect/landmark/A in /area/syndicate_station/start)//Because that's the only place it can BE -Sieve - if (A.name == "Syndicate-Gear-Closet") - new /obj/structure/closet/syndicate/personal(A.loc) - qdel(A) + //Let's find the spawn locations + var/list/turf/synd_spawn = list() + for(var/obj/effect/landmark/A in landmarks_list) + if(A.name == "Syndicate-Spawn") + synd_spawn += get_turf(A) continue - if (A.name == "Syndicate-Bomb") - new /obj/effect/spawner/newbomb/timer/syndicate(A.loc) - qdel(A) - continue + var/leader_chosen + var/spawnpos = 1 //Decides where they'll spawn. 1=leader. - for(var/datum/mind/synd_mind in ticker.mode.syndicates) - if(synd_mind.current) - if(synd_mind.current.client) - for(var/image/I in synd_mind.current.client.images) - if(I.icon_state == "synd") - del(I) + for(var/mob/c in chosen) + if(spawnpos > synd_spawn.len) + spawnpos = 2 //Ran out of spawns. Let's loop back to the first non-leader position + var/mob/living/carbon/human/new_character=makeBody(c) + if(!leader_chosen) + leader_chosen = 1 + new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code,1) + else + new_character.mind.make_Nuke(synd_spawn[spawnpos],nuke_code) + spawnpos++ - for(var/datum/mind/synd_mind in ticker.mode.syndicates) - if(synd_mind.current) - if(synd_mind.current.client) - for(var/datum/mind/synd_mind_1 in ticker.mode.syndicates) - if(synd_mind_1.current) - var/I = image('icons/mob/mob.dmi', loc = synd_mind_1.current, icon_state = "synd") - synd_mind.current.client.images += I - - for (var/obj/machinery/nuclearbomb/bomb in world) - bomb.r_code = nuke_code // All the nukes are set to this code. + ticker.mode.update_all_synd_icons() return 1 diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index d855eac0b5d..5690818169b 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -690,7 +690,6 @@ Traitors and the like can also be revived with the previous role mostly intact. return emergency_shuttle.incall() - priority_announce("The emergency shuttle has been called. It will arrive in [round(emergency_shuttle.timeleft()/60)] minutes.", null, 'sound/AI/shuttlecalled.ogg', "Priority") feedback_add_details("admin_verb","CSHUT") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! log_admin("[key_name(usr)] admin-called the emergency shuttle.") message_admins("[key_name_admin(usr)] admin-called the emergency shuttle.", 1) diff --git a/code/modules/assembly/voice.dm b/code/modules/assembly/voice.dm index ad873803a34..d255db9b9bd 100644 --- a/code/modules/assembly/voice.dm +++ b/code/modules/assembly/voice.dm @@ -7,10 +7,13 @@ origin_tech = "magnets=1" flags = HEAR var/listening = 0 - var/recorded //the activation message + var/recorded = "" //the activation message /obj/item/device/assembly/voice/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq) - if(listening) + if(speaker == src) + return + + if(listening && !radio_freq) recorded = raw_message listening = 0 say("Activation message is '[recorded]'.") @@ -32,7 +35,6 @@ activate() return 1 - /obj/item/device/assembly/voice/toggle_secure() . = ..() listening = 0 diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 4e808277dc6..d04fb218547 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -318,6 +318,9 @@ datum/preferences if((job_civilian_low & ASSISTANT) && (rank != "Assistant")) HTML += "[rank]" continue + if(config.enforce_human_authority && (rank in command_positions) && user.client.prefs.pref_species.id != "human") + HTML += "[rank] \[NON-HUMAN\]" + continue if((rank in command_positions) || (rank == "AI"))//Bold head jobs HTML += "[rank]" else diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index 8b22d9da546..7405c3508b8 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -25,63 +25,12 @@ name = "Health Scanner HUD" desc = "A heads-up display that scans the humans in view and provides accurate data about their health status." icon_state = "healthhud" - proc - RoundHealth(health) - RoundHealth(health) - switch(health) - if(100 to INFINITY) - return "health100" - if(70 to 100) - return "health80" - if(50 to 70) - return "health60" - if(30 to 50) - return "health40" - if(18 to 30) - return "health25" - if(5 to 18) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) - return "health0" - else - return "health-100" - return "0" +/obj/item/clothing/glasses/hud/health/process_hud(var/mob/M) + process_data_hud(M,DATA_HUD_MEDICAL,DATA_HUD_ADVANCED) - process_hud(var/mob/M) - if(!M) return - if(!M.client) return - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/patient in view(M)) - var/foundVirus = 0 - for(var/datum/disease/D in patient.viruses) - if(!D.hidden[SCANNER]) - foundVirus++ - if(!C) continue - - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - C.images += holder - - holder = patient.hud_list[STATUS_HUD] - if(patient.stat == 2) - holder.icon_state = "huddead" - else if(patient.status_flags & XENO_HOST) - holder.icon_state = "hudxeno" - else if(foundVirus) - holder.icon_state = "hudill" - else - holder.icon_state = "hudhealthy" - C.images += holder - /obj/item/clothing/glasses/hud/health/night name = "Night Vision Health Scanner HUD" desc = "An advanced medical head-up display that allows doctors to find patients in complete darkness." @@ -123,44 +72,4 @@ invis_view = 2 /obj/item/clothing/glasses/hud/security/process_hud(var/mob/M) - if(!M) return - if(!M.client) return - var/client/C = M.client - var/image/holder - for(var/mob/living/carbon/human/perp in view(M)) - holder = perp.hud_list[ID_HUD] - holder.icon_state = "hudno_id" - if(perp.wear_id) - holder.icon_state = "hud[ckey(perp.wear_id.GetJobName())]" - C.images += holder - - - for(var/obj/item/weapon/implant/I in perp) - if(I.implanted) - if(istype(I,/obj/item/weapon/implant/tracking)) - holder = perp.hud_list[IMPTRACK_HUD] - holder.icon_state = "hud_imp_tracking" - else if(istype(I,/obj/item/weapon/implant/loyalty)) - holder = perp.hud_list[IMPLOYAL_HUD] - holder.icon_state = "hud_imp_loyal" - else if(istype(I,/obj/item/weapon/implant/chem)) - holder = perp.hud_list[IMPCHEM_HUD] - holder.icon_state = "hud_imp_chem" - else - continue - C.images += holder - break - - var/perpname = perp.get_face_name(perp.get_id_name("")) - if(perpname) - var/datum/data/record/R = find_record("name", perpname, data_core.security) - if(R) - holder = perp.hud_list[WANTED_HUD] - switch(R.fields["criminal"]) - if("*Arrest*") holder.icon_state = "hudwanted" - if("Incarcerated") holder.icon_state = "hudincarcerated" - if("Parolled") holder.icon_state = "hudparolled" - if("Discharged") holder.icon_state = "huddischarged" - else - continue - C.images += holder \ No newline at end of file + process_data_hud(M,DATA_HUD_SECURITY,DATA_HUD_ADVANCED) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index cdb458b7a80..3be8a220a74 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -87,7 +87,7 @@ name = "gladiator helmet" desc = "Ave, Imperator, morituri te salutant." icon_state = "gladiator" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR item_state = "gladiator" flags_inv = HIDEMASK|HIDEEARS|HIDEEYES diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index af4e34f1f84..1c473a51679 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -57,7 +57,7 @@ name = "cueball helmet" desc = "A large, featureless white orb mean to be worn on your head. How do you even see out of this thing?" icon_state = "cueball" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR item_state="cueball" flags_inv = 0 @@ -80,7 +80,7 @@ desc = "A helmet made out of a box." icon_state = "cardborg_h" item_state = "cardborg_h" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH + flags = HEADCOVERSEYES flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE /obj/item/clothing/head/justice @@ -88,7 +88,7 @@ desc = "fight for what's righteous!" icon_state = "justicered" item_state = "justicered" - flags = HEADCOVERSEYES|HEADCOVERSMOUTH|BLOCKHAIR + flags = HEADCOVERSEYES|BLOCKHAIR /obj/item/clothing/head/justice/blue icon_state = "justiceblue" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 653e21fd811..d16ac285b99 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -111,7 +111,7 @@ icon_state = "hardhat0_pumpkin" item_state = "hardhat0_pumpkin" item_color = "pumpkin" - flags = HEADCOVERSEYES | HEADCOVERSMOUTH | BLOCKHAIR + flags = HEADCOVERSEYES | BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE action_button_name = "Toggle Pumpkin Light" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 012b4872c18..e74532c2f24 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -53,6 +53,5 @@ /obj/item/clothing/mask/horsehead/speechModification(message) if(voicechange) - if(!(copytext(message, 1, 2) == "*" || (usr.mind && usr.mind.changeling && (copytext(message, 1, 3) == ":g" || copytext(message, 1, 3) == ":G" || copytext(message, 1, 3) == ":ï")))) - message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") + message = pick("NEEIIGGGHHHH!", "NEEEIIIIGHH!", "NEIIIGGHH!", "HAAWWWWW!", "HAAAWWW!") return message diff --git a/code/modules/events/event_manager.dm b/code/modules/events/event_manager.dm index 0174bda76b3..41196389a01 100644 --- a/code/modules/events/event_manager.dm +++ b/code/modules/events/event_manager.dm @@ -9,6 +9,7 @@ var/datum/controller/event/events var/frequency_upper = 9000 //15 minutes upper bound. Basically an event will happen every 15 to 30 minutes. var/holiday //This will be a string of the name of any realworld holiday which occurs today (GMT time) + var/wizardmode = 0 //If the summon events spell is in effect this is true //Initial controller setup. /datum/controller/event/New() @@ -20,7 +21,7 @@ var/datum/controller/event/events for(var/type in typesof(/datum/round_event_control)) var/datum/round_event_control/E = new type() - if(!E.typepath) + if(!E.typepath || E.typepath in typesof(/datum/round_event/wizard/)) continue //don't want this one! leave it for the garbage collector control += E //add it to the list of all events (controls) reschedule() diff --git a/code/modules/events/ninja.dm b/code/modules/events/ninja.dm index 6e25cb211f5..746d1010d0f 100644 --- a/code/modules/events/ninja.dm +++ b/code/modules/events/ninja.dm @@ -374,6 +374,7 @@ ________________________________________________________________________________ equip_to_slot_or_del(new /obj/item/clothing/gloves/space_ninja(src), slot_gloves) equip_to_slot_or_del(new /obj/item/clothing/head/helmet/space/space_ninja(src), slot_head) equip_to_slot_or_del(new /obj/item/clothing/mask/gas/voice/space_ninja(src), slot_wear_mask) + equip_to_slot_or_del(new /obj/item/clothing/glasses/night(src), slot_glasses) equip_to_slot_or_del(new /obj/item/device/flashlight(src), slot_belt) equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_r_store) equip_to_slot_or_del(new /obj/item/weapon/plastique(src), slot_l_store) @@ -2521,7 +2522,6 @@ ________________________________________________________________________________ /obj/item/clothing/mask/gas/voice/space_ninja/New() verbs += /obj/item/clothing/mask/gas/voice/space_ninja/proc/togglev - verbs += /obj/item/clothing/mask/gas/voice/space_ninja/proc/switchm //This proc is linked to human life.dm. It determines what hud icons to display based on mind special role for most mobs. /obj/item/clothing/mask/gas/voice/space_ninja/proc/assess_targets(list/target_list, mob/living/carbon/U) @@ -2586,46 +2586,8 @@ ________________________________________________________________________________ voice = "Unknown" return -/obj/item/clothing/mask/gas/voice/space_ninja/proc/switchm() - set name = "Switch Mode" - set desc = "Switches between Night Vision, Meson, or Thermal vision modes." - set category = "Ninja Equip" - //Have to reset these manually since life.dm is retarded like that. Go figure. - //This will only work for humans because only they have the appropriate code for the mask. - var/mob/U = loc - switch(mode) - if(0) - mode=1 - U << "Switching mode to Night Vision." - if(1) - mode=2 - U.see_in_dark = 2 - U << "Switching mode to Thermal Scanner." - if(2) - mode=3 - U.see_invisible = SEE_INVISIBLE_LIVING - U.sight &= ~SEE_MOBS - U << "Switching mode to Meson Scanner." - if(3) - mode=0 - U.sight &= ~SEE_TURFS - U << "Switching mode to Scouter." - /obj/item/clothing/mask/gas/voice/space_ninja/examine() - set src in view() ..() - - var/mode - switch(mode) - if(0) - mode = "Scouter" - if(1) - mode = "Night Vision" - if(2) - mode = "Thermal Scanner" - if(3) - mode = "Meson Scanner" - usr << "[mode] is active."//Leaving usr here since it may be on the floor or on a person. usr << "Voice mimicking algorithm is set [!vchange?"inactive":"active"]." /* diff --git a/code/modules/events/wizard/aid.dm b/code/modules/events/wizard/aid.dm new file mode 100644 index 00000000000..8c215e0fbe0 --- /dev/null +++ b/code/modules/events/wizard/aid.dm @@ -0,0 +1,47 @@ +//in this file: Various events that directly aid the wizard. This is the "lets entice the wizard to use summon events!" file. + +/datum/round_event_control/wizard/robelesscasting //EI NUDTH! + name = "Robeless Casting" + weight = 2 + typepath = /datum/round_event/wizard/robelesscasting/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/robelesscasting/start() + + for(var/mob/living/L in mob_list) //Hey if a corgi has magic missle he should get the same benifit as anyone + if(L.mind && L.mind.spell_list.len != 0) + var/spell_improved = 0 + for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) + if(S.clothes_req) + S.clothes_req = 0 + spell_improved = 1 + if(spell_improved) + L << "You suddenly feel like you never needed those garish robes in the first place..." + +//--// + +/datum/round_event_control/wizard/improvedcasting //blink x5 disintergrate x5 here I come! + name = "Improved Casting" + weight = 3 + typepath = /datum/round_event/wizard/improvedcasting/ + max_occurrences = 4 //because that'd be max level spells + earliest_start = 0 + +/datum/round_event/wizard/improvedcasting/start() + for(var/mob/living/L in mob_list) + if(L.mind && L.mind.spell_list.len != 0) + for(var/obj/effect/proc_holder/spell/S in L.mind.spell_list) + S.name = initial(S.name) + S.spell_level++ + S.charge_max = round(initial(S.charge_max) - S.spell_level * (initial(S.charge_max) - S.cooldown_min)/ S.level_max) + if(S.charge_max < S.charge_counter) + S.charge_counter = S.charge_max + switch(S.spell_level) + if(1) S.name = "Efficient [S.name]" + if(2) S.name = "Quickened [S.name]" + if(3) S.name = "Free [S.name]" + if(4) S.name = "Instant [S.name]" + if(5) S.name = "Ludicrous [S.name]" + + L << "You suddenly feel more competent with your casting!" diff --git a/code/modules/events/wizard/blobies.dm b/code/modules/events/wizard/blobies.dm new file mode 100644 index 00000000000..aff93fccaa7 --- /dev/null +++ b/code/modules/events/wizard/blobies.dm @@ -0,0 +1,11 @@ +/datum/round_event_control/wizard/blobies //avast! + name = "Zombie Outbreak" + weight = 3 + typepath = /datum/round_event/wizard/blobies/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/blobies/start() + + for(var/mob/living/carbon/human/H in dead_mob_list) + new /mob/living/simple_animal/hostile/blobspore(H.loc) diff --git a/code/modules/events/wizard/curseditems.dm b/code/modules/events/wizard/curseditems.dm new file mode 100644 index 00000000000..0ea04f6650b --- /dev/null +++ b/code/modules/events/wizard/curseditems.dm @@ -0,0 +1,50 @@ +/datum/round_event_control/wizard/cursed_items //fashion disasters + name = "Cursed Items" + weight = 3 + typepath = /datum/round_event/wizard/cursed_items/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/cursed_items/start() + var/item_set = pick("wizardmimic", "swords", "bigfatdoobie", "boxing", "voicemodulators", "headphones") + var/list/wearslots = list(slot_wear_suit, slot_shoes, slot_head, slot_wear_mask, slot_r_hand, slot_gloves, slot_ears) + var/list/loadout = list() + var/list/all_spawned_items = list() + var/ruins_spaceworthiness + loadout.len = 7 + + switch(item_set) + if("wizardmimic") + loadout = list(/obj/item/clothing/suit/wizrobe, /obj/item/clothing/shoes/sandal, /obj/item/clothing/head/wizard) + ruins_spaceworthiness = 1 + if("swords") loadout[5] = /obj/item/weapon/katana + if("bigfatdoobie") + loadout[4] = /obj/item/clothing/mask/cigarette/rollie/trippy/ + ruins_spaceworthiness = 1 + if("boxing") + loadout[4] = /obj/item/clothing/mask/luchador + loadout[6] = /obj/item/clothing/gloves/boxing + ruins_spaceworthiness = 1 + if("voicemodulators") loadout[4] = /obj/item/clothing/mask/gas/voice + if("headphones") loadout[7] = /obj/item/clothing/ears/earmuffs + + for(var/mob/living/carbon/human/H in living_mob_list) + if(ruins_spaceworthiness && H.z != 1) continue //#savetheminers + var/list/slots = list(H.wear_suit, H.shoes, H.head, H.wear_mask, H.r_hand, H.gloves, H.ears) //add new slots as needed to back + for(var/i = 1, i <= loadout.len, i++) + if(loadout[i]) + var/obj/item/J = loadout[i] + var/obj/item/I = new J //dumb but required because of byond throwing a fit anytime new gets too close to a list + H.unEquip(slots[i]) + H.equip_to_slot_or_del(I, wearslots[i]) + all_spawned_items += I + + for(var/obj/item/I in all_spawned_items) + I.flags |= NODROP + I.name = "cursed " + I.name + + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() \ No newline at end of file diff --git a/code/modules/events/wizard/departmentrevolt.dm b/code/modules/events/wizard/departmentrevolt.dm new file mode 100644 index 00000000000..118220799a1 --- /dev/null +++ b/code/modules/events/wizard/departmentrevolt.dm @@ -0,0 +1,53 @@ +/datum/round_event_control/wizard/deprevolt //stationwide! + name = "Departmental Uprising" + weight = 2 + typepath = /datum/round_event/wizard/deprevolt/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/deprevolt/start() + + var/list/tidecolor + var/list/jobs_to_revolt = list() + var/nation + var/list/citizens = list() + + tidecolor = pick("grey", "white", "yellow", "purple", "brown", "whatevercolorrepresentstheservicepeople") + switch(tidecolor) + if("grey") //God help you + jobs_to_revolt = list("Assistant") + nation = pick("Assa", "Mainte") + if("white") + jobs_to_revolt = list("Chief Medical Officer", "Medical Doctor", "Chemist", "Geneticist", "Virologist") + nation = pick("Mede", "Healtha") + if("yellow") + jobs_to_revolt = list("Chief Engineer", "Station Engineer", "Atmospheric Technician") + nation = pick("Atomo", "Engino") + if("purple") + jobs_to_revolt = list("Research Director","Scientist", "Roboticist") + nation = pick("Sci", "Griffa") + if("brown") + jobs_to_revolt = list("Quartermaster", "Cargo Technician", "Shaft Miner") + nation = pick("Cargo", "Guna") + if("whatevercolorrepresentstheservicepeople") //the few, the proud, the technically aligned + jobs_to_revolt = list("Bartender", "Chef", "Botanist", "Clown", "Mime", "Janitor", "Chaplain") + nation = pick("Honka", "Boozo", "Fatu", "Danka") + + nation += pick("stan", "topia", "land") + + for(var/mob/living/carbon/human/H in mob_list) + if(H.mind) + var/datum/mind/M = H.mind + if(M.assigned_role && !(M in ticker.mode.traitors)) + for(var/job in jobs_to_revolt) + if(M.assigned_role == job) + citizens += H + ticker.mode.traitors += M + M.special_role = "separatist" + H.attack_log += "\[[time_stamp()]\] Was made into a separatist, long live [nation]!" + H << "You are a separatist! [nation] forever! Protect the soverignty of your newfound land with your comrades in arms!" + if(citizens.len) + var/message + for(var/job in jobs_to_revolt) + message += "[job]," + message_admins("The nation of [nation] has been formed. Affected jobs are [message]") \ No newline at end of file diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm new file mode 100644 index 00000000000..893b6d2e95b --- /dev/null +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -0,0 +1,12 @@ +/datum/round_event_control/wizard/fake_explosion //Oh no the station is gone! + name = "Fake Explosion" + weight = 2 + typepath = /datum/round_event/wizard/fake_explosion/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/fake_explosion/start() + for(var/mob/M in player_list) + M << 'sound/machines/Alarm.ogg' + sleep(100) + ticker.station_explosion_cinematic(1,"fake") //:o) \ No newline at end of file diff --git a/code/modules/events/wizard/ghost.dm b/code/modules/events/wizard/ghost.dm new file mode 100644 index 00000000000..bb60ee25214 --- /dev/null +++ b/code/modules/events/wizard/ghost.dm @@ -0,0 +1,27 @@ +/datum/round_event_control/wizard/ghost //The spook is real + name = "G-G-G-Ghosts!" + weight = 3 + typepath = /datum/round_event/wizard/ghost/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/ghost/start() + for(var/mob/dead/observer/G in player_list) + G.invisibility = 0 + G << "You suddenly feel extremely obvious..." + + +//--// + +/datum/round_event_control/wizard/possession //Oh shit + name = "Possessing G-G-G-Ghosts!" + weight = 2 + typepath = /datum/round_event/wizard/possession + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/possession/start() + for(var/mob/dead/observer/G in player_list) + G.verbs += /mob/dead/observer/verb/boo + G.verbs += /mob/dead/observer/verb/possess + G << "You suddenly feel a welling of new spooky powers..." diff --git a/code/modules/events/wizard/greentext.dm b/code/modules/events/wizard/greentext.dm new file mode 100644 index 00000000000..6ac5ad460ee --- /dev/null +++ b/code/modules/events/wizard/greentext.dm @@ -0,0 +1,81 @@ +/datum/round_event_control/wizard/greentext //Gotta have it! + name = "Greentext" + weight = 4 + typepath = /datum/round_event/wizard/greentext/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/greentext/start() + + var/list/holder_canadates = player_list + for(var/mob/M in holder_canadates) + if(!ishuman(M)) + holder_canadates -= M + if(!holder_canadates) //Very unlikely, but just in case + return 0 + + var/mob/living/carbon/human/H = pick(holder_canadates) + new /obj/item/weapon/greentext(H.loc) + H << "The mythical greentext appear at your feet! Pick it up if you dare..." + + +/obj/item/weapon/greentext/ + name = "greentext" + desc = "for some the pursuit of greentext is the greatest calling in life..." + w_class = 4.0 + icon = 'icons/obj/wizard.dmi' + icon_state = "greentext" + var/mob/living/last_holder + var/mob/living/new_holder + var/list/color_altered_mobs = list() + +/obj/item/weapon/greentext/equipped(mob/living/user as mob) + user << "So long as you leave this place with greentext in hand you know will be happy..." + if(user.mind && user.mind.objectives.len > 0) + user << "... so long as you still perform your other objectives that is!" + new_holder = user + if(!last_holder) + last_holder = user + if(!(user in color_altered_mobs)) + color_altered_mobs += user + user.color = "#00FF00" + processing_objects.Add(src) + ..() + +/obj/item/weapon/greentext/dropped(mob/living/user as mob) + if(user in color_altered_mobs) + user << "A sudden wave of failure washes over you..." + user.color = "#FF0000" //ya blew it + last_holder = null + new_holder = null + processing_objects.Remove(src) + ..() + +/obj/item/weapon/greentext/process() + if(new_holder && new_holder.z == 2)//you're winner! + new_holder << "At last it feels like victory is assured!" + if(!(new_holder in ticker.mode.traitors)) + ticker.mode.traitors += new_holder.mind + new_holder.mind.special_role = "winner" + var/datum/objective/O = new /datum/objective("Succeed") + O.completed = 1 //YES! + O.owner = new_holder.mind + new_holder.mind.objectives += O + new_holder.attack_log += "\[[time_stamp()]\] Won with greentext!!!" + color_altered_mobs -= new_holder + Destroy() + + if(last_holder && last_holder != new_holder) //Somehow it was swiped without ever getting dropped + last_holder << "A sudden wave of failure washes over you..." + last_holder.color = "#FF0000" + last_holder = new_holder //long live the king + +/obj/item/weapon/greentext/Destroy() + for(var/mob/M in mob_list) + var/message = "A dark temptation has passed from this world" + if(M in color_altered_mobs) + message += " and you're finally able to forgive yourself" + M.color = initial(M.color) + message += "..." + M << message + ..() \ No newline at end of file diff --git a/code/modules/events/wizard/imposter.dm b/code/modules/events/wizard/imposter.dm new file mode 100644 index 00000000000..d12f57e3d7c --- /dev/null +++ b/code/modules/events/wizard/imposter.dm @@ -0,0 +1,51 @@ +/datum/round_event_control/wizard/imposter //Mirror Mania + name = "Imposter Wizard" + weight = 1 + typepath = /datum/round_event/wizard/imposter/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/imposter/start() + + for(var/datum/mind/M in ticker.mode.wizards) + if(!ishuman(M.current)) continue + var/mob/living/carbon/human/W = M.current + var/list/candidates = get_candidates(BE_WIZARD) + if(!candidates) return //Sad Trombone + var/client/C = pick(candidates) + + new /obj/effect/effect/harmless_smoke(W.loc) + + var/mob/living/carbon/human/I = new /mob/living/carbon/human(W.loc) + I.real_name = W.real_name + I.dna.unique_enzymes = W.dna.unique_enzymes + I.name = W.real_name + I.dna.blood_type = W.dna.blood_type + I.dna.uni_identity = W.dna.uni_identity + I.dna.struc_enzymes = W.dna.struc_enzymes + updateappearance(I) + if(W.ears) I.equip_to_slot_or_del(new W.ears.type, slot_ears) + if(W.w_uniform) I.equip_to_slot_or_del(new W.w_uniform.type , slot_w_uniform) + if(W.shoes) I.equip_to_slot_or_del(new W.shoes.type, slot_shoes) + if(W.wear_suit) I.equip_to_slot_or_del(new W.wear_suit.type, slot_wear_suit) + if(W.head) I.equip_to_slot_or_del(new W.head.type, slot_head) + if(W.back) I.equip_to_slot_or_del(new W.back.type, slot_back) + I.key = C.key + + //Operation: Fuck off and scare people + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/area_teleport/teleport(null) + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/turf_teleport/blink(null) + I.mind.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt(null) + + ticker.mode.traitors += I.mind + I.mind.special_role = "imposter" + + var/datum/objective/protect/protect_objective = new /datum/objective/protect + protect_objective.owner = I.mind + protect_objective.target = W.mind + protect_objective.explanation_text = "Protect [W.real_name], the wizard." + I.mind.objectives += protect_objective + + I.attack_log += "\[[time_stamp()]\] Is an imposter!" + I << "You are an imposter! Trick and confuse the crew to misdirect malice from your handsome original!" + I << sound('sound/effects/magic.ogg') diff --git a/code/modules/events/wizard/invincible.dm b/code/modules/events/wizard/invincible.dm new file mode 100644 index 00000000000..34aa2e6ea18 --- /dev/null +++ b/code/modules/events/wizard/invincible.dm @@ -0,0 +1,12 @@ +/datum/round_event_control/wizard/invincible //Boolet Proof + name = "Invincibility" + weight = 3 + typepath = /datum/round_event/wizard/invincible/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/invincible/start() + + for(var/mob/living/carbon/human/H in living_mob_list) + H.reagents.add_reagent("adminordrazine", 40) //100 ticks of absolute invinciblity (barring gibs) + H << "Yes! I am invincible!" \ No newline at end of file diff --git a/code/modules/events/wizard/lava.dm b/code/modules/events/wizard/lava.dm new file mode 100644 index 00000000000..a3abc5fe1f1 --- /dev/null +++ b/code/modules/events/wizard/lava.dm @@ -0,0 +1,42 @@ +/datum/round_event_control/wizard/lava //THE LEGEND NEVER DIES + name = "The Floor Is LAVA!" + weight = 2 + typepath = /datum/round_event/wizard/lava/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/lava/ + + endWhen = 120 //2 minutes + +/datum/round_event/wizard/lava/start() + + for(var/turf/simulated/floor/F in world) + if(F.z == 1) + F.name = "lava" + F.desc = "The floor is LAVA!" + F.overlays += "lava" + F.lava = 1 + +/datum/round_event/wizard/lava/tick() + + for(var/mob/living/carbon/L in living_mob_list) + if(istype(L.loc, /turf/simulated/floor)) // Are they on LAVA?! + var/turf/simulated/floor/F = L.loc + if(F.lava) + var/safe = 0 + for(var/obj/structure/O in F.contents) + if(O.level > F.level && !istype(O, /obj/structure/window)) // Something to stand on and it isn't under the floor! + safe = 1 + if(!safe) + L.adjustFireLoss(3) + +/datum/round_event/wizard/lava/end() + + for(var/turf/simulated/floor/F in world) // Reset everything. + if(F.z == 1) + F.name = initial(F.name) + F.desc = initial(F.desc) + F.overlays.Cut() + F.lava = 0 + F.update_icon() \ No newline at end of file diff --git a/code/modules/events/wizard/magicarp.dm b/code/modules/events/wizard/magicarp.dm new file mode 100644 index 00000000000..2bb0641a9a4 --- /dev/null +++ b/code/modules/events/wizard/magicarp.dm @@ -0,0 +1,40 @@ +/datum/round_event_control/wizard/magicarp //these fish is loaded + name = "Magicarp" + weight = 1 + typepath = /datum/round_event/wizard/magicarp/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/magicarp/ + announceWhen = 3 + startWhen = 50 + +/datum/round_event/wizard/magicarp/setup() + startWhen = rand(40, 60) + +/datum/round_event/wizard/magicarp/announce() + priority_announce("Unknown magical entities have been detected near [station_name()], please stand-by.", "Lifesign Alert") + +/datum/round_event/wizard/magicarp/start() + for(var/obj/effect/landmark/C in landmarks_list) + if(C.name == "carpspawn") + new /mob/living/simple_animal/hostile/carp/ranged(C.loc) + +/mob/living/simple_animal/hostile/carp/ranged + name = "magicarp" + desc = "50% magic, 50% carp, 100% horrible." + icon_state = "magicarp" + icon_living = "magicarp" + icon_dead = "magicarp_dead" + icon_gib = "magicarp_gib" + ranged = 1 + retreat_distance = 2 + minimum_distance = 0 //Between shots they can and will close in to nash + projectiletype = /obj/item/projectile/magic + projectilesound = 'sound/weapons/emitter.ogg' + maxHealth = 50 + health = 50 + +/mob/living/simple_animal/hostile/carp/ranged/New() + projectiletype = pick(typesof(/obj/item/projectile/magic)) + ..() \ No newline at end of file diff --git a/code/modules/events/wizard/petsplosion.dm b/code/modules/events/wizard/petsplosion.dm new file mode 100644 index 00000000000..4e74d32a4d9 --- /dev/null +++ b/code/modules/events/wizard/petsplosion.dm @@ -0,0 +1,17 @@ +/datum/round_event_control/wizard/petsplosion //the horror + name = "Petsplosion" + weight = 2 + typepath = /datum/round_event/wizard/petsplosion/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/petsplosion/ + endWhen = 61 //1 minute (+1 tick for endWhen not to interfere with tick) + var/countdown = 0 + +/datum/round_event/wizard/petsplosion/tick() + if(activeFor >= 30 * countdown) // 0 seconds : 2 animals | 30 seconds : 4 animals | 1 minute : 8 animals + countdown += 1 + for(var/mob/living/simple_animal/F in living_mob_list) //If you cull the heard before the next replication, things will be easier for you + if(!istype(F, /mob/living/simple_animal/hostile)) + new F.type(F.loc) \ No newline at end of file diff --git a/code/modules/events/wizard/race.dm b/code/modules/events/wizard/race.dm new file mode 100644 index 00000000000..a28dab20daf --- /dev/null +++ b/code/modules/events/wizard/race.dm @@ -0,0 +1,22 @@ +/datum/round_event_control/wizard/race //Lizard Wizard? Lizard Wizard. + name = "Race Swap" + weight = 2 + typepath = /datum/round_event/wizard/race/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/race/start() + + var/all_the_same = 0 + var/all_species = typesof(/datum/species) - /datum/species + var/new_species = pick(all_species) + + if(prob(50)) + all_the_same = 1 + + for(var/mob/living/carbon/human/H in mob_list) //yes, even the dead + if(H.dna) + H.dna.species = new new_species + H.regenerate_icons() + if(!all_the_same) + new_species = pick(all_species) diff --git a/code/modules/events/wizard/shuffle.dm b/code/modules/events/wizard/shuffle.dm new file mode 100644 index 00000000000..e49d9be5368 --- /dev/null +++ b/code/modules/events/wizard/shuffle.dm @@ -0,0 +1,96 @@ +/datum/round_event/wizard/shuffle/start() + + +/datum/round_event_control/wizard/shuffleloc //Somewhere an AI is crying + name = "Change Places!" + weight = 2 + typepath = /datum/round_event/wizard/shuffleloc/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/shuffleloc/start() + var/list/moblocs = list() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + if(H.z != 1) continue //lets not try to strand people in space or stuck in the wizards den + moblocs += H.loc + mobs += H + + if(!mobs) return + + shuffle(moblocs) + shuffle(mobs) + + for(var/mob/living/carbon/human/H in mobs) + if(!moblocs) break //locs aren't always unique, so this may come into play + H.loc = moblocs[moblocs.len] + moblocs.len -= 1 + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() + +//---// + +/datum/round_event_control/wizard/shufflenames //Face/off joke + name = "Change Faces!" + weight = 4 + typepath = /datum/round_event/wizard/shufflenames/ + max_occurrences = 5 + earliest_start = 0 + +/datum/round_event/wizard/shufflenames/start() + var/list/mobnames = list() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + mobnames += H.name + mobs += H + + if(!mobs) return + + shuffle(mobnames) + shuffle(mobs) + + for(var/mob/living/carbon/human/H in mobs) + if(!mobnames) break + H.name = mobnames[mobnames.len] + mobnames.len -= 1 + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() + +//---// + +/datum/round_event_control/wizard/shuffleminds //Basically Mass Ranged Mindswap + name = "Change Minds!" + weight = 1 + typepath = /datum/round_event/wizard/shuffleminds/ + max_occurrences = 3 + earliest_start = 0 + +/datum/round_event/wizard/shuffleminds/start() + var/list/mobs = list() + + for(var/mob/living/carbon/human/H in living_mob_list) + if(!H.mind || H.mind in ticker.mode.wizards) continue //the wizard(s) are spared on this one + mobs += H + + if(!mobs) return + + shuffle(mobs) + + var/obj/effect/proc_holder/spell/targeted/mind_transfer/swapper = new /obj/effect/proc_holder/spell/targeted/mind_transfer/ + for(var/mob/living/carbon/human/H in mobs) + swapper.cast(list(H), mobs[mobs.len], 1) + mobs.len -= 1 + if(mobs.len <= 1) break + + for(var/mob/living/carbon/human/H in living_mob_list) + var/datum/effect/effect/system/harmless_smoke_spread/smoke = new /datum/effect/effect/system/harmless_smoke_spread() + smoke.set_up(max(1,1), 0, H.loc) + smoke.start() diff --git a/code/modules/events/wizard/summons.dm b/code/modules/events/wizard/summons.dm new file mode 100644 index 00000000000..67a154d5ac6 --- /dev/null +++ b/code/modules/events/wizard/summons.dm @@ -0,0 +1,25 @@ +/datum/round_event_control/wizard/summonguns //The Classic + name = "Summon Guns" + weight = 1 + typepath = /datum/round_event/wizard/summonguns/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/summonguns/start() + if(!ticker.mode.wizards) return + var/datum/mind/M = pick(ticker.mode.wizards) + if(M.current) + M.current.rightandwrong(0) + +/datum/round_event_control/wizard/summonmagic //The Somewhat Less Classic + name = "Summon Magic" + weight = 1 + typepath = /datum/round_event/wizard/summonmagic/ + max_occurrences = 1 + earliest_start = 0 + +/datum/round_event/wizard/summonmagic/start() + if(!ticker.mode.wizards) return + var/datum/mind/M = pick(ticker.mode.wizards) + if(M.current) + M.current.rightandwrong(1) \ No newline at end of file diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 6320f340a6d..294118333ec 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -91,7 +91,7 @@ name = "glass of vodka" desc = "The glass contain wodka. Xynta." if("goldschlager") - icon_state = "ginvodkaglass" + icon_state = "goldschlagerglass" name = "glass of Goldschlager" desc = "100 proof that teen girls will drink anything with gold in it." if("wine") diff --git a/code/modules/food&drinks/kitchen machinery/microwave.dm b/code/modules/food&drinks/kitchen machinery/microwave.dm index 76fa9c72d56..8eca9a923cc 100644 --- a/code/modules/food&drinks/kitchen machinery/microwave.dm +++ b/code/modules/food&drinks/kitchen machinery/microwave.dm @@ -183,6 +183,8 @@ return 0 /obj/machinery/microwave/attack_hand(mob/user as mob) + if(..()) + return user.set_machine(src) interact(user) diff --git a/code/modules/food&drinks/kitchen machinery/smartfridge.dm b/code/modules/food&drinks/kitchen machinery/smartfridge.dm index 30b4a4fbce2..ea28ba2f3c1 100644 --- a/code/modules/food&drinks/kitchen machinery/smartfridge.dm +++ b/code/modules/food&drinks/kitchen machinery/smartfridge.dm @@ -107,7 +107,7 @@ item_quants[n]++ else item_quants[n] = 1 - item_quants = sortAssoc(item_quants) + sortList(item_quants) /obj/machinery/smartfridge/attack_paw(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/mining/laborcamp/laborstacker.dm b/code/modules/mining/laborcamp/laborstacker.dm index 81c682355d5..645dd8d9772 100644 --- a/code/modules/mining/laborcamp/laborstacker.dm +++ b/code/modules/mining/laborcamp/laborstacker.dm @@ -40,7 +40,7 @@ else if(istype(inserted_id)) //There's an ID in there. dat += text("ID: [inserted_id.registered_name] Eject ID.
    ") dat += text("Points Collected:[inserted_id.points]
    ") - dat += text("Point Quota: [inserted_id.goal ? inserted_id.goal : "Unlimited"] - Reach your quota to earn your release
    ") + dat += text("Point Quota: [inserted_id.goal] - Reach your quota to earn your release
    ") dat += text("Unclaimed Collection Points: [machine.points]. Claim points.
    ") else //No ID in sight. Complain about it. dat += text("No ID inserted. Insert ID.
    ") @@ -157,7 +157,7 @@ var/obj/item/weapon/card/id/prisoner/prisoner_id = I user << "ID: [prisoner_id.registered_name]" user << "Points Collected:[prisoner_id.points]" - user << "Point Quota: [prisoner_id.goal ? prisoner_id.goal : "Unlimited"]" + user << "Point Quota: [prisoner_id.goal]" user << "Collect points by bringing smelted minerals to the Labor Shuttle stacking machine. Reach your quota to earn your release." else user << "Error: Invalid ID" diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 67f3f0095be..76992c3ff15 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -13,7 +13,7 @@ if(W.remove_fuel(15)) new refined_type(get_turf(src.loc)) qdel(src) - else + else if(W.isOn()) user << "Not enough fuel to smelt [src]." ..() diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 9082eeb01f7..c88b3628ec8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -18,6 +18,7 @@ //If you died in the game and are a ghsot - this will remain as null. //Note that this is not a reliable way to determine if admins started as observers, since they change mobs a lot. var/atom/movable/following = null + var/fun_verbs = 0 /mob/dead/observer/New(mob/body) sight |= SEE_TURFS | SEE_MOBS | SEE_OBJS | SEE_SELF @@ -48,6 +49,11 @@ if(!name) //To prevent nameless ghosts name = random_name(gender) real_name = name + + if(!fun_verbs) + verbs -= /mob/dead/observer/verb/boo + verbs -= /mob/dead/observer/verb/possess + ..() /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) @@ -232,7 +238,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp A.loc = T else A << "This mob is not located in the game world." -/* + /mob/dead/observer/verb/boo() set category = "Ghost" set name = "Boo!" @@ -246,7 +252,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return //Maybe in the future we can add more spooky code here! return -*/ + /mob/dead/observer/memory() set hidden = 1 @@ -263,4 +269,30 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if (see_invisible == SEE_INVISIBLE_OBSERVER_NOLIGHTING) see_invisible = SEE_INVISIBLE_OBSERVER else - see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING \ No newline at end of file + see_invisible = SEE_INVISIBLE_OBSERVER_NOLIGHTING + +/mob/dead/observer/verb/possess() + set category = "Ghost" + set name = "Possess!" + set desc= "Take over the body of a mindless creature!" + + var/list/possessible = list() + for(var/mob/living/L in living_mob_list) + if(!(L in player_list) && !L.mind) + possessible += L + + var/mob/living/target = input("Your new life begins today!", "Possess Mob", null, null) as null|anything in possessible + + if(!target) + return 0 + if(can_reenter_corpse || (mind && mind.current)) + if(alert(src, "Your soul is still tied to your former life as [mind.current.name], if you go foward there is no going back to that life. Are you sure you wish to continue?", "Move On", "Yes", "No") == "No") + return 0 + if(target.key) + src << "Someone has taken this body while you were choosing!" + return 0 + + target.key = key + return 1 + + diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index 402f6e9597d..cae772dd6bf 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -12,7 +12,7 @@ faction = list("alien") ventcrawler = 2 languages = ALIEN - + nightvision = 1 var/storedPlasma = 250 var/max_plasma = 500 @@ -193,6 +193,21 @@ playsound(C, 'sound/voice/hiss5.ogg', 40, 1, 1) //Alien roars when breaking free. ..() +/mob/living/carbon/alien/verb/nightvisiontoggle() + set name = "Toggle Night Vision" + set category = "Alien" + + if(!nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + nightvision = 1 + hud_used.nightvisionicon.icon_state = "nightvision1" + else if(nightvision == 1) + see_in_dark = 4 + see_invisible = 45 + nightvision = 0 + hud_used.nightvisionicon.icon_state = "nightvision0" + /*---------------------------------------- Proc: AddInfectionImages() Des: Gives the client of the alien an image on each infected mob. diff --git a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm index 80cb1fdc642..3bb33028ea0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/alien_powers.dm @@ -138,20 +138,18 @@ Doesn't work on other aliens/AI.*/ return /mob/living/carbon/alien/humanoid/proc/resin() - set name = "Secrete Resin (75)" + set name = "Secrete Resin (55)" set desc = "Secrete tough malleable resin." set category = "Alien" - if(powerc(75)) - var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin door","resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist - if(!choice || !powerc(75)) return - adjustToxLoss(-75) + if(powerc(55)) + var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in list("resin wall","resin membrane","resin nest") //would do it through typesof but then the player choice would have the type path and we don't want the internal workings to be exposed ICly - Urist + if(!choice || !powerc(55)) return + adjustToxLoss(-55) src << "You shape a [choice]." for(var/mob/O in viewers(src, null)) O.show_message(text("[src] vomits up a thick purple substance and begins to shape it!"), 1) switch(choice) - if("resin door") - new /obj/structure/mineral_door/resin(loc) if("resin wall") new /obj/structure/alien/resin/wall(loc) if("resin membrane") @@ -172,4 +170,4 @@ Doesn't work on other aliens/AI.*/ A.loc = loc //Paralyse(10) src.visible_message("[src] hurls out the contents of their stomach!") - return \ No newline at end of file + return diff --git a/code/modules/mob/living/carbon/alien/humanoid/life.dm b/code/modules/mob/living/carbon/alien/humanoid/life.dm index 71ad1de7810..0f9b45ee478 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/life.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/life.dm @@ -194,7 +194,7 @@ if(breath.temperature > (T0C+66) && !(COLD_RESISTANCE in mutations)) // Hot air hurts :( if(prob(20)) - src << "You feel a searing heat in your lungs!>/span>" + src << "You feel a searing heat in your lungs!" fire_alert = max(fire_alert, 1) else fire_alert = 0 @@ -389,8 +389,12 @@ sight |= SEE_MOBS sight &= ~SEE_TURFS sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 if(see_override) see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm index d13c7984cee..da27c428b5c 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/update_icons.dm @@ -18,9 +18,14 @@ //If we mostly took damage from fire if(fireloss > 125) icon_state = "alien[caste]_husked" + pixel_y = 0 else icon_state = "alien[caste]_dead" - else if(stat == UNCONSCIOUS || lying || resting) + pixel_y = 0 + else if(stat == UNCONSCIOUS) + icon_state = "alien[caste]_unconscious" + pixel_y = 0 + else if(lying || resting) icon_state = "alien[caste]_sleep" else if(m_intent == "run") icon_state = "alien[caste]_running" diff --git a/code/modules/mob/living/carbon/alien/larva/life.dm b/code/modules/mob/living/carbon/alien/larva/life.dm index b7f6cb35a41..f0a4f1278a0 100644 --- a/code/modules/mob/living/carbon/alien/larva/life.dm +++ b/code/modules/mob/living/carbon/alien/larva/life.dm @@ -301,8 +301,12 @@ sight |= SEE_MOBS sight &= ~SEE_TURFS sight &= ~SEE_OBJS - see_in_dark = 4 - see_invisible = SEE_INVISIBLE_LEVEL_TWO + if(nightvision) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_MINIMUM + else if(!nightvision) + see_in_dark = 4 + see_invisible = 45 if(see_override) see_invisible = see_override diff --git a/code/modules/mob/living/carbon/alien/special/facehugger.dm b/code/modules/mob/living/carbon/alien/special/facehugger.dm index df9a0e26887..c59d83cd26e 100644 --- a/code/modules/mob/living/carbon/alien/special/facehugger.dm +++ b/code/modules/mob/living/carbon/alien/special/facehugger.dm @@ -17,6 +17,7 @@ var/const/MAX_ACTIVE_TIME = 400 w_class = 1 //note: can be picked up by aliens unlike most other items of w_class below 4 flags = MASKCOVERSMOUTH | MASKCOVERSEYES | MASKINTERNALS throw_range = 5 + tint = 3 var/stat = CONSCIOUS //UNCONSCIOUS is the idle state in this case @@ -115,6 +116,7 @@ var/const/MAX_ACTIVE_TIME = 400 if(loc == L) return 0 if(stat != CONSCIOUS) return 0 + if(locate(/obj/item/alien_embryo) in L) return 0 if(!sterile) L.take_organ_damage(strength,0) //done here so that even borgs and humans in helmets take damage L.visible_message("[src] leaps at [L]'s face!") @@ -128,7 +130,6 @@ var/const/MAX_ACTIVE_TIME = 400 if(iscarbon(M)) var/mob/living/carbon/target = L - if(target.wear_mask) if(prob(20)) return 0 var/obj/item/clothing/W = target.wear_mask diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 13c0fcc5e78..6a561028ed2 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -205,7 +205,7 @@ src << "You're completely exhausted." else src << "You feel fatigued." - if(dna && (dna.species == /datum/species/skeleton) && !H.w_uniform && !H.wear_suit) + if(dna && dna.species.id && dna.species.id == "skeleton" && !H.w_uniform && !H.wear_suit) H.play_xylophone() else if(ishuman(src)) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 78e13478803..382c9d007b1 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -564,7 +564,7 @@ //Check for ID var/obj/item/weapon/card/id/idcard = get_idcard() - if(judgebot.idcheck && !idcard) + if(judgebot.idcheck && !idcard && name=="Unknown") threatcount += 4 //Check for weapons @@ -604,7 +604,7 @@ //Agent cards lower threatlevel. if(istype(idcard, /obj/item/weapon/card/id/syndicate)) - threatcount -= 2 + threatcount -= 5 return threatcount diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 1184b881c8d..ae583d7d2a6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -594,9 +594,7 @@ /mob/living/carbon/human/proc/handle_regular_hud_updates() if(!client) return 0 - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe - client.images.Remove(hud) + regular_hud_updates() //For MED/SEC HUD icon deletion client.screen.Remove(global_hud.blurry, global_hud.druggy, global_hud.vimpaired, global_hud.darkMask) @@ -696,8 +694,8 @@ if(lastpuke >= 25) // about 25 second delay I guess Stun(5) - for(var/mob/O in viewers(world.view, src)) - O.show_message("[O] throws up!") + visible_message("[src] throws up!", \ + "[src] throws up!") playsound(loc, 'sound/effects/splat.ogg', 50, 1) var/turf/location = loc diff --git a/code/modules/mob/living/carbon/human/say.dm b/code/modules/mob/living/carbon/human/say.dm index 205decd4442..1d1faa53c25 100644 --- a/code/modules/mob/living/carbon/human/say.dm +++ b/code/modules/mob/living/carbon/human/say.dm @@ -52,7 +52,7 @@ if(V.vchange) return V.voice else - return name + return real_name if(mind && mind.changeling && mind.changeling.mimicing) return mind.changeling.mimicing if(GetSpecialVoice()) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index de73e267986..b6ace019c5c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -443,27 +443,6 @@ else H.hud_used.lingchemdisplay.invisibility = 101 - if(istype(H.wear_mask, /obj/item/clothing/mask/gas/voice/space_ninja)) - var/obj/item/clothing/mask/gas/voice/space_ninja/O = H.wear_mask - switch(O.mode) - if(0) - var/target_list[] = list() - for(var/mob/living/target in oview(H)) - if( target.mind&&(target.mind.special_role||issilicon(target)) )//They need to have a mind. - target_list += target - if(target_list.len)//Everything else is handled by the ninja mask proc. - O.assess_targets(target_list, H) - H.see_invisible = SEE_INVISIBLE_LIVING - if(1) - H.see_in_dark = 5 - H.see_invisible = SEE_INVISIBLE_LIVING - if(2) - H.sight |= SEE_MOBS - H.see_invisible = SEE_INVISIBLE_LEVEL_TWO - if(3) - H.sight |= SEE_TURFS - H.see_invisible = SEE_INVISIBLE_LIVING - if(H.glasses) if(istype(H.glasses, /obj/item/clothing/glasses)) var/obj/item/clothing/glasses/G = H.glasses diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index 7d0f4cf4e4e..9655a2cc602 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -353,6 +353,10 @@ return 10 //Everyone is a criminal! var/threatcount = 0 + //Securitrons can't identify monkeys + if(judgebot.idcheck) + threatcount += 4 + //Lasertag bullshit if(lasercolor) if(lasercolor == "b")//Lasertag turrets target the opposing team, how great is that? -Sieve diff --git a/code/modules/mob/living/carbon/say.dm b/code/modules/mob/living/carbon/say.dm index 61f1fef423e..9f218605c01 100644 --- a/code/modules/mob/living/carbon/say.dm +++ b/code/modules/mob/living/carbon/say.dm @@ -2,10 +2,10 @@ message = ..(message) if(wear_mask) message = wear_mask.speechModification(message) - + return message -/mob/living/carbon/can_speak_vocal(message) - if(!..() || silent) +/mob/living/carbon/can_speak_basic(message) + if(silent) return 0 - return 1 + return ..() diff --git a/code/modules/mob/living/carbon/slime/hud.dm b/code/modules/mob/living/carbon/slime/hud.dm index 24a0a6e112b..ad8ac6a00f6 100644 --- a/code/modules/mob/living/carbon/slime/hud.dm +++ b/code/modules/mob/living/carbon/slime/hud.dm @@ -1,2 +1,2 @@ -/mob/living/carbon/slime/proc/regular_hud_updates() +/mob/living/carbon/slime/regular_hud_updates() return \ No newline at end of file diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index c93828d01f2..508e9505895 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -39,3 +39,4 @@ var/ventcrawler = 0 //0 No vent crawling, 1 vent crawling in the nude, 2 vent crawling always var/floating = 0 + var/nightvision = 0 diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index c325bc9836d..0c7c99f3fdb 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -71,7 +71,7 @@ var/list/department_radio_keys = list( ":ï" = "changeling", "#ï" = "changeling", ".ï" = "changeling" ) -/mob/living/proc/binarycheck() +/mob/proc/binarycheck() return 0 /mob/living/say(message, bubble_type) @@ -129,8 +129,9 @@ var/list/department_radio_keys = list( var/deaf_message var/deaf_type if(speaker != src) - deaf_message = "[speaker] talks but you cannot hear them." - deaf_type = 1 + if(!radio_freq) //These checks have to be seperate, else people talking on the radio will make "You can't hear yourself!" appear when hearing people over the radio while deaf. + deaf_message = "[speaker] talks but you cannot hear them." + deaf_type = 1 else deaf_message = "You can't hear yourself!" deaf_type = 2 // Since you should be able to hear yourself without looking @@ -177,29 +178,29 @@ var/list/department_radio_keys = list( /mob/living/proc/can_speak_basic(message) //Check BEFORE handling of xeno and ling channels if(!message || message == "") - return + return 0 if(client) if(client.prefs.muted & MUTE_IC) src << "You cannot speak in IC (muted)." - return + return 0 if(client.handle_spam_prevention(message,MUTE_IC)) - return - + return 0 + return 1 /mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels if(!message) - return + return 0 if(sdisabilities & MUTE) - return - + return 0 + if(is_muzzled()) - return - + return 0 + if(!IsVocal()) - return + return 0 return 1 @@ -216,21 +217,33 @@ var/list/department_radio_keys = list( /mob/living/proc/handle_inherent_channels(message, message_mode) if(message_mode == MODE_CHANGELING) - if(lingcheck()) - log_say("[mind.changeling.changelingID]/[src.key] : [message]") - for(var/mob/M in mob_list) - if(M.lingcheck() || (M.stat == DEAD && !istype(M, /mob/new_player))) - M << "[mind.changeling.changelingID]: [message]" - return 1 + switch(lingcheck()) + if(2) + var/msg = "[mind.changeling.changelingID]: [message]" + log_say("[mind.changeling.changelingID]/[src.key] : [message]") + for(var/mob/M in mob_list) + if(M.stat == DEAD && !istype(M, /mob/new_player)) + M << msg + else + switch(M.lingcheck()) + if(2) + M << msg + if(1) + if(prob(20)) + M << "We can faintly sense another of our kind trying to communicate through the hivemind..." + return 1 + if(1) + src << "Our senses have not evolved enough to be able to communicate this way..." + return 1 return 0 /mob/living/proc/treat_message(message) if(getBrainLoss() >= 60) message = derpspeech(message, stuttering) - + if(stuttering) message = stutter(message) - + return message /mob/living/proc/radio(message, message_mode, steps) @@ -260,9 +273,12 @@ var/list/department_radio_keys = list( return NOPASS return 0 -/mob/living/lingcheck() +/mob/living/lingcheck() //Returns 1 if they are a changeling. Returns 2 if they are a changeling that can communicate through the hivemind if(mind && mind.changeling) + if(mind.changeling.changeling_speak) + return 2 return 1 + return 0 /mob/living/say_quote() if (stuttering) diff --git a/code/modules/mob/living/silicon/ai/life.dm b/code/modules/mob/living/silicon/ai/life.dm index 615b2433726..ea50f2e80b1 100644 --- a/code/modules/mob/living/silicon/ai/life.dm +++ b/code/modules/mob/living/silicon/ai/life.dm @@ -163,6 +163,11 @@ sleep(50) theAPC = null + regular_hud_updates() + + if(sensor_mode) //Data HUDs, such as Security or Medical HUDS. Passes the AI's eye since it seems from that instead of itself. + process_data_hud(src,sensor_mode,DATA_HUD_BASIC,src.eyeobj) + /mob/living/silicon/ai/updatehealth() if(status_flags & GODMODE) health = maxHealth diff --git a/code/modules/mob/living/silicon/pai/hud.dm b/code/modules/mob/living/silicon/pai/hud.dm deleted file mode 100644 index 395c75c64a0..00000000000 --- a/code/modules/mob/living/silicon/pai/hud.dm +++ /dev/null @@ -1,82 +0,0 @@ -/mob/living/silicon/pai/proc/regular_hud_updates() - if(client) - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") - client.images -= hud - -/mob/living/silicon/pai/proc/securityHUD() - if(client) - var/image/holder - var/turf/T = get_turf(src.loc) - for(var/mob/living/carbon/human/perp in view(T)) - holder = perp.hud_list[ID_HUD] - holder.icon_state = "hudno_id" - if(perp.wear_id) - holder.icon_state = "hud[ckey(perp:wear_id:GetJobName())]" - client.images += holder - - var/perpname = perp.get_face_name(perp.get_id_name("")) - if(perpname) - var/datum/data/record/R = find_record("name", perpname, data_core.security) - if(R) - holder = perp.hud_list[WANTED_HUD] - switch(R.fields["criminal"]) - if("*Arrest*") holder.icon_state = "hudwanted" - if("Incarcerated") holder.icon_state = "hudincarcerated" - if("Parolled") holder.icon_state = "hudparolled" - if("Discharged") holder.icon_state = "huddischarged" - else - continue - client.images += holder - -/mob/living/silicon/pai/proc/medicalHUD() - if(client) - var/image/holder - var/turf/T = get_turf(src.loc) - for(var/mob/living/carbon/human/patient in view(T)) - - var/foundVirus = 0 - for(var/datum/disease/D in patient.viruses) - if(!D.hidden[SCANNER]) - foundVirus = 1 - - holder = patient.hud_list[HEALTH_HUD] - if(patient.stat == 2) - holder.icon_state = "hudhealth-100" - client.images += holder - else - holder.icon_state = "hud[RoundHealth(patient.health)]" - client.images += holder - - holder = patient.hud_list[STATUS_HUD] - if(patient.stat == 2) - holder.icon_state = "huddead" - else if(patient.status_flags & XENO_HOST) - holder.icon_state = "hudxeno" - else if(foundVirus) - holder.icon_state = "hudill" - else - holder.icon_state = "hudhealthy" - client.images += holder - -/mob/living/silicon/pai/proc/RoundHealth(health) - switch(health) - if(100 to INFINITY) - return "health100" - if(70 to 100) - return "health80" - if(50 to 70) - return "health60" - if(30 to 50) - return "health40" - if(20 to 30) - return "health25" - if(5 to 15) - return "health10" - if(1 to 5) - return "health1" - if(-99 to 0) - return "health0" - else - return "health-100" - return "0" diff --git a/code/modules/mob/living/silicon/pai/life.dm b/code/modules/mob/living/silicon/pai/life.dm index 728db940163..f8a7d0c2ef1 100644 --- a/code/modules/mob/living/silicon/pai/life.dm +++ b/code/modules/mob/living/silicon/pai/life.dm @@ -10,10 +10,10 @@ cable = null regular_hud_updates() - if(src.secHUD == 1) - src.securityHUD() - if(src.medHUD == 1) - src.medicalHUD() + if(secHUD == 1) + process_data_hud(src, DATA_HUD_SECURITY,DATA_HUD_ADVANCED) + if(medHUD == 1) + process_data_hud(src, DATA_HUD_MEDICAL,DATA_HUD_ADVANCED) if(silence_time) if(world.timeofday >= silence_time) silence_time = null diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index eb72fb2b9f8..a344f31aaeb 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -625,7 +625,7 @@ [(pda.silent) ? " \[Off\]" : " \[On\]"]

    "} dat += "
      " if(!pda.toff) - for (var/obj/item/device/pda/P in sortAtom(get_viewable_pdas())) + for (var/obj/item/device/pda/P in sortNames(get_viewable_pdas())) if (P == src.pda) continue dat += "
    • [P]" dat += "
    • " diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index e3feb824109..73a565f66eb 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -165,12 +165,10 @@ if(see_override) see_invisible = see_override - for(var/image/hud in client.images) - if(copytext(hud.icon_state,1,4) == "hud") //ugly, but icon comparison is worse, I believe - client.images.Remove(hud) + regular_hud_updates() //Handles MED/SEC HUDs for borgs. - var/obj/item/borg/sight/hud/hud = (locate(/obj/item/borg/sight/hud) in src) - if(hud && hud.hud) hud.hud.process_hud(src) + if(sensor_mode) + process_data_hud(src,sensor_mode,DATA_HUD_ADVANCED) if (src.healths) if (src.stat != 2) @@ -293,7 +291,7 @@ fire_stacks = max(0, fire_stacks) else ExtinguishMob() - + //adjustFireLoss(3) return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 59106208f25..0c6dd370c7b 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -412,7 +412,6 @@ for(var/mob/O in viewers(user, null)) O.show_message(text("[user] has fixed some of the dents on [src]!"), 1) else - user << "Need more welding fuel!" return else if(istype(W, /obj/item/stack/cable_coil) && wiresexposed) diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index e9faf2b07f2..a2df8da25d9 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -76,7 +76,6 @@ /obj/item/weapon/robot_module/medical/New() ..() - modules += new /obj/item/borg/sight/hud/med(src) modules += new /obj/item/device/healthanalyzer(src) modules += new /obj/item/weapon/reagent_containers/borghypo(src) modules += new /obj/item/weapon/reagent_containers/glass/beaker/large(src) @@ -146,7 +145,6 @@ /obj/item/weapon/robot_module/security/New() ..() - modules += new /obj/item/borg/sight/hud/sec(src) modules += new /obj/item/weapon/handcuffs/cyborg(src) modules += new /obj/item/weapon/melee/baton/loaded(src) modules += new /obj/item/weapon/gun/energy/taser/cyborg(src) diff --git a/code/modules/mob/living/silicon/say.dm b/code/modules/mob/living/silicon/say.dm index 574a739793d..662c92dabd1 100644 --- a/code/modules/mob/living/silicon/say.dm +++ b/code/modules/mob/living/silicon/say.dm @@ -9,14 +9,13 @@ desig = trim_left(S.designation + " " + S.job) var/message_a = say_quote(message) var/rendered = "Robotic Talk, [name] [message_a]" - - for (var/mob/living/S in living_mob_list) - if(S.binarycheck() || S.stat == DEAD) - if(istype(S , /mob/living/silicon/ai)) - var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]" - S << renderedAI + for(var/mob/M in player_list) + if(M.binarycheck() || (M.stat == DEAD && (M.client.prefs.toggles & CHAT_GHOSTEARS) && !istype(M, /mob/new_player))) + if(istype(M, /mob/living/silicon/ai)) + var/renderedAI = "Robotic Talk, [name] ([desig]) [message_a]" + M << renderedAI else - S << rendered + M << rendered /mob/living/silicon/binarycheck() return 1 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index d23561abee5..8edd1d700ca 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -15,6 +15,8 @@ var/lawcheck[1] var/ioncheck[1] + var/sensor_mode = 0 //Determines the current HUD. + /mob/living/silicon/proc/cancelAlarm() return @@ -314,3 +316,17 @@ /mob/living/silicon/assess_threat() //Secbots won't hunt silicon units return -10 + +/mob/living/silicon/verb/sensor_mode() + set name = "Set Sensor Augmentation" + var/sensor_type = input("Please select sensor type.", "Sensor Integration", null) in list("Security", "Medical","Disable") + switch(sensor_type) + if ("Security") + sensor_mode = DATA_HUD_SECURITY + src << "Security records overlay enabled." + if ("Medical") + sensor_mode = DATA_HUD_MEDICAL + src << "Life signs monitor overlay enabled." + if ("Disable") + sensor_mode = 0 + src << "Sensor augmentations disabled." diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 9707681a3c4..2748bbdf136 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -16,6 +16,7 @@ species = /mob/living/simple_animal/cat childtype = /mob/living/simple_animal/cat/kitten meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 3 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "kicks" diff --git a/code/modules/mob/living/simple_animal/friendly/crab.dm b/code/modules/mob/living/simple_animal/friendly/crab.dm index efed432d09e..5cc28028e21 100644 --- a/code/modules/mob/living/simple_animal/friendly/crab.dm +++ b/code/modules/mob/living/simple_animal/friendly/crab.dm @@ -11,6 +11,7 @@ speak_chance = 1 turns_per_move = 5 meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 2 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "stomps" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index 4e5960eef1c..fd288285169 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -14,6 +14,7 @@ maxHealth = 5 health = 5 meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + meat_amount = 1 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "splats" diff --git a/code/modules/mob/living/simple_animal/hostile/alien.dm b/code/modules/mob/living/simple_animal/hostile/alien.dm index 8cdc7004c72..2c72803053f 100644 --- a/code/modules/mob/living/simple_animal/hostile/alien.dm +++ b/code/modules/mob/living/simple_animal/hostile/alien.dm @@ -11,6 +11,7 @@ response_harm = "hits" speed = 0 meat_type = /obj/item/weapon/reagent_containers/food/snacks/xenomeat + meat_amount = 3 maxHealth = 100 health = 100 harm_intent_damage = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/bear.dm b/code/modules/mob/living/simple_animal/hostile/bear.dm index 44828a1d5f9..f5e190706ff 100644 --- a/code/modules/mob/living/simple_animal/hostile/bear.dm +++ b/code/modules/mob/living/simple_animal/hostile/bear.dm @@ -14,6 +14,7 @@ turns_per_move = 5 see_in_dark = 6 meat_type = /obj/item/weapon/reagent_containers/food/snacks/bearmeat + meat_amount = 3 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/hostile/carp.dm b/code/modules/mob/living/simple_animal/hostile/carp.dm index 296da2566fd..2d101454d4e 100644 --- a/code/modules/mob/living/simple_animal/hostile/carp.dm +++ b/code/modules/mob/living/simple_animal/hostile/carp.dm @@ -10,6 +10,7 @@ speak_chance = 0 turns_per_move = 5 meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat + meat_amount = 2 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm index 2c161d443e4..6273f455aa7 100644 --- a/code/modules/mob/living/simple_animal/hostile/giant_spider.dm +++ b/code/modules/mob/living/simple_animal/hostile/giant_spider.dm @@ -18,6 +18,7 @@ turns_per_move = 5 see_in_dark = 10 meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidermeat + meat_amount = 2 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "hits" @@ -43,6 +44,7 @@ icon_living = "nurse" icon_dead = "nurse_dead" meat_type = /obj/item/weapon/reagent_containers/food/snacks/spidereggs + meat_amount = 4 maxHealth = 40 health = 40 melee_damage_lower = 5 diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index b59ae854e77..888488ee76e 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -266,6 +266,7 @@ qdel(A) return A.current = target + A.firer = src A.yo = target:y - start:y A.xo = target:x - start:x spawn( 0 ) diff --git a/code/modules/mob/living/simple_animal/hostile/killertomato.dm b/code/modules/mob/living/simple_animal/hostile/killertomato.dm index ccf401d68a1..6a7a2dc9b4c 100644 --- a/code/modules/mob/living/simple_animal/hostile/killertomato.dm +++ b/code/modules/mob/living/simple_animal/hostile/killertomato.dm @@ -10,6 +10,7 @@ health = 30 see_in_dark = 3 meat_type = /obj/item/weapon/reagent_containers/food/snacks/tomatomeat + meat_amount = 1 response_help = "prods" response_disarm = "pushes aside" response_harm = "smacks" diff --git a/code/modules/mob/living/simple_animal/hostile/mimic.dm b/code/modules/mob/living/simple_animal/hostile/mimic.dm index a3854898ea1..d396347e213 100644 --- a/code/modules/mob/living/simple_animal/hostile/mimic.dm +++ b/code/modules/mob/living/simple_animal/hostile/mimic.dm @@ -9,7 +9,6 @@ icon_state = "crate" icon_living = "crate" - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat response_help = "touches" response_disarm = "pushes" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 857c4f2618b..5ac42db3fe5 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -9,6 +9,7 @@ maxHealth = 10 health = 10 meat_type = /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice + meat_amount = 1 response_help = "pets" response_disarm = "gently pushes aside" response_harm = "whacks" diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 2e2f5ab0dc9..7baa4d510c6 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -8,7 +8,6 @@ icon_gib = "pine_1" speak_chance = 0 turns_per_move = 5 - meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat response_help = "brushes" response_disarm = "pushes" response_harm = "hits" diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index f5e164ca75d..89e4ea79938 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -43,6 +43,7 @@ speak_chance = 1 //1% (1 in 100) chance every tick; So about once per 150 seconds, assuming an average tick is 1.5s turns_per_move = 5 meat_type = /obj/item/weapon/reagent_containers/food/snacks/cracker/ + meat_amount = 1 melee_damage_upper = 10 melee_damage_lower = 5 @@ -150,7 +151,7 @@ if (ears) ears.talk_into(src, message, message_mode) return ITALICS | REDUCE_RANGE - + if(message_mode in radiochannels) if(ears) ears.talk_into(src, message, message_mode) diff --git a/code/modules/mob/living/simple_animal/shade.dm b/code/modules/mob/living/simple_animal/shade.dm index 87a42b6c5f1..beb2cbe7144 100644 --- a/code/modules/mob/living/simple_animal/shade.dm +++ b/code/modules/mob/living/simple_animal/shade.dm @@ -32,8 +32,7 @@ ..() if(stat == 2) new /obj/item/weapon/ectoplasm (src.loc) - for(var/mob/M in viewers(src, null)) - M.visible_message("[src] lets out a contented sigh as their form unwinds.") + visible_message("[src] lets out a contented sigh as their form unwinds.") ghostize() qdel(src) return diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index 7721a60bda4..722d7507f12 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -242,10 +242,11 @@ /mob/living/simple_animal/emote(var/act) if(stat) return - if(act) - if(act == "scream") act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P + if(act == "scream") + act = "makes a loud and pained whimper" //ugly hack to stop animals screaming when crushed :P visible_message("[src] [act].") - + return + ..(act) /mob/living/simple_animal/attack_animal(mob/living/simple_animal/M as mob) if(M.melee_damage_upper == 0) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1da52ea6991..468b4178562 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -435,7 +435,7 @@ var/list/slot_equipment_priority = list( \ creatures[name] = O - for(var/mob/M in sortAtom(mob_list)) + for(var/mob/M in sortNames(mob_list)) var/name = M.name if (names.Find(name)) namecounts[name]++ diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index aff402b6bc9..66d7ea2edec 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -40,7 +40,8 @@ affecting.grabbed_by -= src affecting = null if(assailant) - assailant.client.screen -= hud + if(assailant.client) + assailant.client.screen -= hud assailant = null qdel(hud) ..() @@ -171,9 +172,10 @@ assailant.changeNext_move(10) affecting.losebreath += 1 else - assailant.visible_message("[assailant] was unable to tighten \his grip on [affecting]'s neck!") - hud.icon_state = "disarm/kill" - state = GRAB_NECK + if(assailant) + assailant.visible_message("[assailant] was unable to tighten \his grip on [affecting]'s neck!") + hud.icon_state = "disarm/kill" + state = GRAB_NECK //This is used to make sure the victim hasn't managed to yackety sax away before using the grab. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 40eb8d8364f..7a76e48ca33 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -110,6 +110,11 @@ proc/isobserver(A) return 1 return 0 +proc/isnewplayer(A) + if(istype(A, /mob/new_player)) + return 1 + return 0 + proc/isovermind(A) if(istype(A, /mob/camera/blob)) return 1 @@ -456,7 +461,9 @@ proc/is_special_character(mob/M) // returns 1 for special characters and 2 for h /proc/broadcast_hud_message(var/message, var/broadcast_source) var/turf/sourceturf = get_turf(broadcast_source) - for(var/mob/living/carbon/human/human in mob_list) - var/turf/humanturf = get_turf(human) - if((humanturf.z == sourceturf.z) && istype(human.glasses, /obj/item/clothing/glasses/hud/security)) - human.show_message("\icon[human.glasses] [message]", 1) \ No newline at end of file + var/user_list = sec_hud_users //A local var is used for easy addition of other HUD types. + var/hud_icon = /obj/item/weapon/handcuffs //Icon displayed when the HUD triggered. Handcuffs for Sec HUDs. + for(var/mob/hud_user in user_list) + var/turf/userturf = get_turf(hud_user) + if(userturf.z == sourceturf.z) //Must have same z-level. + hud_user.show_message("\icon[hud_icon] [message]", 1) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 0c9d0eced7e..d17985336d4 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -5,7 +5,7 @@ var/spawning = 0//Referenced when you want to delete the new_player later on in the code. var/totalPlayers = 0 //Player counts for the Lobby tab var/totalPlayersReady = 0 - + flags = NONE invisibility = 101 @@ -242,10 +242,16 @@ /mob/new_player/proc/IsJobAvailable(rank) var/datum/job/job = job_master.GetJob(rank) - if(!job) return 0 - if((job.current_positions >= job.total_positions) && job.total_positions != -1) return 0 - if(jobban_isbanned(src,rank)) return 0 - if(!job.player_old_enough(src.client)) return 0 + if(!job) + return 0 + if((job.current_positions >= job.total_positions) && job.total_positions != -1) + return 0 + if(jobban_isbanned(src,rank)) + return 0 + if(!job.player_old_enough(src.client)) + return 0 + if(config.enforce_human_authority && (rank in command_positions) && client.prefs.pref_species.id != "human") + return 0 return 1 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 7b9bacaf5d3..df2f366af0e 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -69,7 +69,8 @@ /obj/item/weapon/pen/sleepy/New() - create_reagents(60) + create_reagents(55) reagents.add_reagent("stoxin", 30) - reagents.add_reagent("mutetoxin", 30) - ..() \ No newline at end of file + reagents.add_reagent("mutetoxin", 15) + reagents.add_reagent("tirizene", 10) + ..() diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index e49459293f1..3df8abca2a1 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -186,6 +186,8 @@ var/const/GRAV_NEEDS_WRENCH = 3 user << "You mend the damaged framework." playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) broken_state++ + else if(WT.isOn()) + user << "You don't have enough fuel to mend the damaged framework." if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/PS = I diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index fbf10c64a0a..59d54c9c525 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -36,6 +36,8 @@ var/global/list/rad_collectors = list() /obj/machinery/power/rad_collector/attack_hand(mob/user as mob) + if(..()) + return if(anchored) if(!src.locked) toggle_power() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e1ff0aa2a43..c48fef8ac0e 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -186,8 +186,6 @@ state = 2 user << "You weld the [src] to the floor." connect_to_network() - else - user << "You need more welding fuel to complete this task." if(2) if (WT.remove_fuel(0,user)) playsound(src.loc, 'sound/items/Welder2.ogg', 50, 1) @@ -199,8 +197,6 @@ state = 1 user << "You cut the [src] free from the floor." disconnect_from_network() - else - user << "You need more welding fuel to complete this task." return if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) diff --git a/code/modules/power/singularity/narsie.dm b/code/modules/power/singularity/narsie.dm index e96252b3d05..d6574fc80ac 100644 --- a/code/modules/power/singularity/narsie.dm +++ b/code/modules/power/singularity/narsie.dm @@ -32,6 +32,7 @@ if(A) notify_ghosts("Nar-Sie has risen in \the [A.name]. Reach out to the Geometer to be given a new shell for your soul.") + sleep(70) if(emergency_shuttle) emergency_shuttle.incall(0.3) // Cannot recall @@ -158,4 +159,4 @@ consume(X) // if(defer_powernet_rebuild != 2) // defer_powernet_rebuild = 0 - return \ No newline at end of file + return diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index cce34d2f244..441995a6614 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -307,12 +307,12 @@ datum/reagent/fuel/unholywater/on_mob_life(var/mob/living/M as mob) M.adjustBruteLoss(2) holder.remove_reagent(src.id, 1) -datum/reagent/plasma/hellwater //if someone has this in their system they've really pissed off an eldrich god +datum/reagent/hellwater //if someone has this in their system they've really pissed off an eldrich god name = "Hell Water" id = "hell_water" description = "YOUR FLESH! IT BURNS!" -datum/reagent/plasma/hellwater/on_mob_life(var/mob/living/M as mob) +datum/reagent/hellwater/on_mob_life(var/mob/living/M as mob) M.fire_stacks = min(5,M.fire_stacks + 3) M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire M.adjustToxLoss(1) @@ -1199,7 +1199,7 @@ datum/reagent/spaceacillin reagent_state = LIQUID color = "#C8A5DC" // rgb: 200, 165, 220 -datum/reagent/on_mob_life(var/mob/living/M as mob)//no more mr. panacea +datum/reagent/spaceacillin/on_mob_life(var/mob/living/M as mob)//no more mr. panacea holder.remove_reagent(src.id, 0.2) ..() return @@ -1719,12 +1719,27 @@ datum/reagent/toxin/teapowder datum/reagent/toxin/mutetoxin //the new zombie powder. name = "Mute Toxin" id = "mutetoxin" + description = "A toxin that temporarily paralyzes the vocal cords." reagent_state = LIQUID color = "#F0F8FF" // rgb: 240, 248, 255 toxpwr = 0 -datum/reagent/toxin/on_mob_life(mob/living/carbon/M) - M.silent += 2 * REM + 1 //If this var is increased by one or less, it will have no effect since silent is decreased right after reagents are handled in Life(). Hence the + 1. +datum/reagent/toxin/mutetoxin/on_mob_life(mob/living/carbon/M) + M.silent += REM + 1 //If this var is increased by one or less, it will have no effect since silent is decreased right after reagents are handled in Life(). Hence the + 1. + ..() + +datum/reagent/toxin/staminatoxin + name = "Tirizene" + id = "tirizene" + description = "A toxin that affects the stamina of a person when injected into the bloodstream." + reagent_state = LIQUID + color = "#6E2828" + data = 13 + toxpwr = 0 + +datum/reagent/toxin/staminatoxin/on_mob_life(mob/living/carbon/M) + M.adjustStaminaLoss(REM * data) + data = max(data - 1, 3) ..() /////////////////////////Coloured Crayon Powder//////////////////////////// diff --git a/code/modules/reagents/Chemistry-Recipes.dm b/code/modules/reagents/Chemistry-Recipes.dm index 5c6225284fe..d301c8e25fd 100644 --- a/code/modules/reagents/Chemistry-Recipes.dm +++ b/code/modules/reagents/Chemistry-Recipes.dm @@ -386,6 +386,7 @@ silicate required_reagents = list("potassium" = 1, "sugar" = 1, "phosphorus" = 1) result_amount = null secondary = 1 + /datum/chemical_reaction/chemsmoke/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) var/datum/effect/effect/system/chem_smoke_spread/S = new /datum/effect/effect/system/chem_smoke_spread @@ -449,6 +450,7 @@ silicate result = null required_reagents = list("iron" = 5, "frostoil" = 5, "plasma" = 20) result_amount = 1 + /datum/chemical_reaction/plasmasolidification/on_reaction(var/datum/reagents/holder, var/created_volume) var/location = get_turf(holder.my_atom) new /obj/item/stack/sheet/mineral/plasma(location) diff --git a/code/modules/recycling/disposal-construction.dm b/code/modules/recycling/disposal-construction.dm index 21cb505e3df..3c284861aaf 100644 --- a/code/modules/recycling/disposal-construction.dm +++ b/code/modules/recycling/disposal-construction.dm @@ -255,9 +255,6 @@ qdel(src) return - else - user << "You need more welding fuel to complete this task." - return else user << "You need to attach it to the plating first!" return diff --git a/code/modules/recycling/disposal.dm b/code/modules/recycling/disposal.dm index 89fd12cf7d0..e63754012bd 100644 --- a/code/modules/recycling/disposal.dm +++ b/code/modules/recycling/disposal.dm @@ -101,7 +101,6 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." return if(istype(I, /obj/item/weapon/melee/energy/blade)) @@ -824,7 +823,6 @@ welded() user << "You've sliced the disposal pipe." else - user << "You need more welding fuel to cut the pipe." return // called when pipe is cut with welder @@ -1141,8 +1139,6 @@ welded() user << "You've sliced the disposal pipe." else - user << "You need more welding fuel to cut the pipe." - return // would transfer to next pipe segment, but we are in a trunk @@ -1276,7 +1272,6 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." return diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 269cf0531e4..351f83d1385 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -318,7 +318,6 @@ qdel(src) return else - user << "You need more welding fuel to complete this task." return /obj/machinery/disposal/deliveryChute/process() diff --git a/config/admins.txt b/config/admins.txt index 01e3c664d27..5e16ac881b5 100644 --- a/config/admins.txt +++ b/config/admins.txt @@ -7,6 +7,7 @@ # NOTE: if the rank-name cannot be found in admin_ranks.txt, they will not be adminned! ~Carn # # NOTE: syntax was changed to allow hyphenation of ranknames, since spaces are stripped. # ############################################################################################### +Gun Hog = Game Master razharas = Game Master Niknakflak = Game Master rolan7 = Game Master @@ -62,4 +63,4 @@ donkieyo = Game Master argoneus = Game Master paprka = Game Master cookingboy3 = Game Master -limeliz = Game Master \ No newline at end of file +limeliz = Game Master diff --git a/config/config.txt b/config/config.txt index a4e9469997f..d3fb04150a5 100644 --- a/config/config.txt +++ b/config/config.txt @@ -59,9 +59,6 @@ LOG_LAW ## log all Topic() calls (for use by coders in tracking down Topic issues) # LOG_HREFS -## log admin warning messages -##LOG_ADMINWARN ## Also duplicates a bunch of other messages. - ## disconnect players who did nothing during 10 minutes # KICK_INACTIVE diff --git a/config/game_options.txt b/config/game_options.txt index 4748ccfd3ea..8d818596c84 100644 --- a/config/game_options.txt +++ b/config/game_options.txt @@ -128,6 +128,9 @@ TRAITOR_OBJECTIVES_AMOUNT 2 ## implants from being most antagonists. #PROTECT_ROLES_FROM_ANTAGONIST +## If non-human species are barred from joining as a head of staff +#ENFORCE_HUMAN_AUTHORITY + ## If late-joining players have a chance to become a traitor/changeling ALLOW_LATEJOIN_ANTAGONISTS @@ -201,5 +204,5 @@ DEFAULT_LAWS 1 #JOIN_WITH_MUTANT_RACE ## Uncomment to allow certain species to have custom colors - -#MUTANT_COLORS + +#MUTANT_COLORS diff --git a/html/changelog.html b/html/changelog.html index 947ab871c91..45fd065d2ee 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -54,6 +54,37 @@ should be listed in the changelog upon commit tho. Thanks. --> + +
      +

      7 September 2014

      +

      Gun Hog updated:

      +
        +
      • Nanotrasen scientists have released a Heads-Up-Display (HUD) upgrade for all AI and Cyborg units! Cyborgs have had Medical sensors and a Security datacore integrated into their core hardware, replacing the need for a specific module.
      • +
      • AI units are now able to have suit sensor or crew manifest data displayed to them as a visual overlay. When viewing a crewmember with suit sensors set to health monitoring, the health status will be available on the AI's medical HUD. In Security mode, the role as printed on the crewmember's ID card will be displayed to the AI.
      • +
      • Any entity with a Security or Medical HUD active will recieve appropriate messages on that HUD.
      • +
      +
      + +
      +

      7 September 2014

      +

      Ikarrus updated:

      +
        +
      • Server Operators: A new config option added to restrict command and security roles to humans only. Simply add/uncomment the line ENFORCE_HUMAN_AUTHORITY in game_options.txt. +
      • Players: To check if this config option is enabled on your server, type show-server-revision into the game's command line. +
      +
      + +
      +

      6 September 2014

      +

      Ikarrus updated:

      +
        +
      • Tampered supply ordering consoles can now order dangerous devices directly from the Syndicate for 140 points. +
      • Securitrons line units will no longer arrest individuals without IDs if their faces can still be read. +
      • Enemy Agent ID cards have been reported to be able to interfere with the new securitron threat assessment protocols. +
      • The Syndicate base has been modified to only allow the leading operative to launch the mission. +
      +
      +

      4 September 2014

      KyrahAbattoir updated:

      @@ -66,7 +97,7 @@ should be listed in the changelog upon commit tho. Thanks. -->

      3 September 2014

      Ikarrus updated:

        -
      • Due to munitions shortages, Syndicate Command have increased the cost of Syndicate Bombs to 6 telecrystals. +
      • Cost of Syndicate bombs increased to 6 telecrystals.

      JStheguy updated:

        diff --git a/icons/mob/alien.dmi b/icons/mob/alien.dmi index f679da87931..4cefc09930b 100644 Binary files a/icons/mob/alien.dmi and b/icons/mob/alien.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index de5a8113a54..6466f049aed 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/screen_alien.dmi b/icons/mob/screen_alien.dmi index 255a03d9919..8d58cdba6c8 100644 Binary files a/icons/mob/screen_alien.dmi and b/icons/mob/screen_alien.dmi differ diff --git a/icons/obj/atmospherics/pipe_manifold.dmi b/icons/obj/atmospherics/pipe_manifold.dmi index a252c8ac8a8..f516eac7da9 100644 Binary files a/icons/obj/atmospherics/pipe_manifold.dmi and b/icons/obj/atmospherics/pipe_manifold.dmi differ diff --git a/icons/obj/atmospherics/red_pipe.dmi b/icons/obj/atmospherics/red_pipe.dmi index ff9d9e8a59a..a5a84439efe 100644 Binary files a/icons/obj/atmospherics/red_pipe.dmi and b/icons/obj/atmospherics/red_pipe.dmi differ diff --git a/icons/obj/machines/turret_control.dmi b/icons/obj/machines/turret_control.dmi new file mode 100644 index 00000000000..b7c81cd923e Binary files /dev/null and b/icons/obj/machines/turret_control.dmi differ diff --git a/icons/obj/pipes.dmi b/icons/obj/pipes.dmi index 59909fb6f54..25d15984b4c 100644 Binary files a/icons/obj/pipes.dmi and b/icons/obj/pipes.dmi differ diff --git a/icons/obj/pipes/heat.dmi b/icons/obj/pipes/heat.dmi index 6d1ed47e7ef..4b6f4b7b741 100644 Binary files a/icons/obj/pipes/heat.dmi and b/icons/obj/pipes/heat.dmi differ diff --git a/icons/obj/pipes/junction.dmi b/icons/obj/pipes/junction.dmi index 70286bde155..88d96929eaa 100644 Binary files a/icons/obj/pipes/junction.dmi and b/icons/obj/pipes/junction.dmi differ diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 4f8a97b2475..19a83504864 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ diff --git a/sound/AI/aimalf.ogg b/sound/AI/aimalf.ogg index 50b7688d5ae..b7996916b47 100644 Binary files a/sound/AI/aimalf.ogg and b/sound/AI/aimalf.ogg differ diff --git a/tgstation.dme b/tgstation.dme index c2b77ebc780..1ac3e68d812 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -30,6 +30,7 @@ #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\stat.dm" #include "code\__HELPERS\_logging.dm" +#include "code\__HELPERS\cmp.dm" #include "code\__HELPERS\files.dm" #include "code\__HELPERS\game.dm" #include "code\__HELPERS\global_lists.dm" @@ -44,6 +45,10 @@ #include "code\__HELPERS\time.dm" #include "code\__HELPERS\type2type.dm" #include "code\__HELPERS\unsorted.dm" +#include "code\__HELPERS\sorts\__main.dm" +#include "code\__HELPERS\sorts\InsertSort.dm" +#include "code\__HELPERS\sorts\MergeSort.dm" +#include "code\__HELPERS\sorts\TimSort.dm" #include "code\_globalvars\configuration.dm" #include "code\_globalvars\database.dm" #include "code\_globalvars\game_modes.dm" @@ -220,6 +225,7 @@ #include "code\game\atoms.dm" #include "code\game\atoms_movable.dm" #include "code\game\communications.dm" +#include "code\game\data_huds.dm" #include "code\game\dna.dm" #include "code\game\say.dm" #include "code\game\shuttle_engines.dm" @@ -846,6 +852,21 @@ #include "code\modules\events\wormholes.dm" #include "code\modules\events\holiday\halloween.dm" #include "code\modules\events\holiday\xmas.dm" +#include "code\modules\events\wizard\aid.dm" +#include "code\modules\events\wizard\blobies.dm" +#include "code\modules\events\wizard\curseditems.dm" +#include "code\modules\events\wizard\departmentrevolt.dm" +#include "code\modules\events\wizard\fakeexplosion.dm" +#include "code\modules\events\wizard\ghost.dm" +#include "code\modules\events\wizard\greentext.dm" +#include "code\modules\events\wizard\imposter.dm" +#include "code\modules\events\wizard\invincible.dm" +#include "code\modules\events\wizard\lava.dm" +#include "code\modules\events\wizard\magicarp.dm" +#include "code\modules\events\wizard\petsplosion.dm" +#include "code\modules\events\wizard\race.dm" +#include "code\modules\events\wizard\shuffle.dm" +#include "code\modules\events\wizard\summons.dm" #include "code\modules\flufftext\Dreaming.dm" #include "code\modules\flufftext\Hallucination.dm" #include "code\modules\flufftext\TextFilters.dm" @@ -941,6 +962,7 @@ #include "code\modules\mob\living\carbon\carbon_defines.dm" #include "code\modules\mob\living\carbon\emote.dm" #include "code\modules\mob\living\carbon\inventory.dm" +#include "code\modules\mob\living\carbon\say.dm" #include "code\modules\mob\living\carbon\update_icons.dm" #include "code\modules\mob\living\carbon\alien\alien.dm" #include "code\modules\mob\living\carbon\alien\alien_defense.dm" @@ -1038,7 +1060,6 @@ #include "code\modules\mob\living\silicon\ai\freelook\update_triggers.dm" #include "code\modules\mob\living\silicon\pai\death.dm" #include "code\modules\mob\living\silicon\pai\examine.dm" -#include "code\modules\mob\living\silicon\pai\hud.dm" #include "code\modules\mob\living\silicon\pai\life.dm" #include "code\modules\mob\living\silicon\pai\pai.dm" #include "code\modules\mob\living\silicon\pai\personality.dm"