diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm index 62d2c9ec126..1c0163e3b43 100644 --- a/_maps/map_files/cyberiad/cyberiad.dmm +++ b/_maps/map_files/cyberiad/cyberiad.dmm @@ -5937,7 +5937,7 @@ "cki" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"},/turf/simulated/wall/r_wall,/area/storage/tech) "ckj" = (/obj/structure/table,/obj/item/device/aicard,/obj/item/weapon/aiModule/reset,/turf/simulated/floor/plating,/area/storage/tech) "ckk" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/rdconsole{pixel_x = -4},/obj/item/weapon/circuitboard/rdserver{pixel_x = 4; pixel_y = -2},/obj/item/weapon/circuitboard/destructive_analyzer,/obj/item/weapon/circuitboard/protolathe{pixel_x = -2; pixel_y = 3},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/item/weapon/circuitboard/circuit_imprinter{pixel_x = -4; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) -"ckl" = (/obj/machinery/clonepod/biomass,/turf/simulated/floor/engine,/area/toxins/xenobiology) +"ckl" = (/turf/simulated/floor/engine,/area/space) "ckm" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/message_monitor{pixel_y = -5},/obj/item/weapon/circuitboard/arcade/battle,/obj/item/weapon/circuitboard/arcade/orion_trail{pixel_x = -4; pixel_y = 2},/turf/simulated/floor/plating,/area/storage/tech) "ckn" = (/obj/item/device/radio/intercom{dir = 0; name = "Station Intercom (General)"; pixel_x = 27},/turf/simulated/floor/plating,/area/storage/tech) "cko" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{dir = 8; icon_state = "cautioncorner"},/area/hallway/primary/aft) @@ -6003,6 +6003,7 @@ "clw" = (/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "clx" = (/obj/machinery/atmospherics/binary/pump,/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) "cly" = (/obj/machinery/power/apc{dir = 4; name = "Incinerator APC"; pixel_x = 24; pixel_y = 0},/obj/structure/cable{icon_state = "0-2"; pixel_y = 1; d2 = 2},/turf/simulated/floor{icon_state = "floorgrime"},/area/maintenance/incinerator) +"clz" = (/obj/structure/disposaloutlet{dir = 8},/obj/structure/disposalpipe/trunk,/turf/simulated/floor/engine,/area/space) "clA" = (/obj/machinery/light/small{dir = 8},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/plating,/area/maintenance/apmaint) "clB" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/storage/tech) "clC" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/storage/tech) @@ -6432,6 +6433,8 @@ "ctK" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/sparker{id = "testigniter"; name = "Test Igniter"; pixel_x = -25},/turf/simulated/floor/engine,/area/toxins/test_chamber) "ctL" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/decal/warning_stripes/red/hollow,/obj/machinery/camera{c_tag = "Atmospherics North-West"; dir = 4; network = list("SS13")},/turf/simulated/floor{icon_state = "dark"},/area/atmos) "ctM" = (/obj/machinery/requests_console{department = "Engineering"; departmentType = 3; name = "Engineering Requests Console"; pixel_y = 30},/obj/structure/table,/obj/item/weapon/book/manual/engineering_guide,/obj/item/weapon/book/manual/engineering_particle_accelerator{pixel_y = 6},/obj/item/weapon/book/manual/engineering_singularity_safety,/obj/machinery/camera{c_tag = "Engineering Northwest"; network = list("SS13")},/turf/simulated/floor,/area/engine/engineering) +"ctN" = (/turf/simulated/wall/r_wall,/area/space) +"ctO" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "ctP" = (/obj/structure/spacepoddoor,/obj/machinery/door/poddoor/three_tile_ver{id_tag = "mechpodbay"; layer = 3.1; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "ctQ" = (/obj/machinery/door_control{desc = "A remote control-switch for the pod doors."; id = "mechpodbay"; name = "Pod Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) "ctR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/engine,/area/engine/mechanic_workshop) @@ -6454,6 +6457,8 @@ "cui" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 6},/turf/simulated/floor,/area/hallway/primary/aft) "cuj" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/hallway/primary/aft) "cuk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/aft) +"cul" = (/obj/structure/disposalpipe/segment,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/engine,/area/space) +"cum" = (/obj/effect/landmark{name = "revenantspawn"},/turf/simulated/floor/engine,/area/space) "cun" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/engine/break_room) "cuo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "caution"},/area/engine/break_room) "cup" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table,/obj/machinery/cell_charger,/obj/machinery/camera{c_tag = "Engineering Foyer"; network = list("SS13")},/obj/structure/noticeboard{pixel_y = 28},/turf/simulated/floor{icon_state = "caution"; dir = 5},/area/engine/break_room) @@ -6461,12 +6466,16 @@ "cur" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/stool/bed/chair{dir = 1},/turf/simulated/floor,/area/engine/break_room) "cus" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor,/area/engine/break_room) "cut" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor,/area/engine/break_room) +"cuu" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/space) "cuv" = (/obj/machinery/computer/atmoscontrol,/turf/simulated/floor,/area/atmos/control) "cuw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/stool/bed/chair/office/dark{dir = 1},/turf/simulated/floor,/area/atmos/control) "cux" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/computer/atmos_alert,/turf/simulated/floor,/area/atmos/control) "cuy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cuz" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall,/area/medical/surgery) "cuA" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) +"cuB" = (/obj/effect/spawner/window/reinforced,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/space) +"cuC" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/plating,/area/space) +"cuD" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio7"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/space) "cuE" = (/obj/structure/closet/secure_closet/medical3,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/medical/surgery) "cuF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/plating,/area/maintenance/asmaint) "cuG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/wall/r_wall,/area/medical/virology) @@ -6486,6 +6495,8 @@ "cuU" = (/obj/machinery/light,/obj/machinery/computer/security/telescreen{desc = "Used for watching the horrors within the test chamber."; name = "Research Monitor"; network = list("TestChamber"); pixel_x = 0; pixel_y = -32},/turf/simulated/floor{icon_state = "white"},/area/toxins/misc_lab) "cuV" = (/obj/machinery/camera{c_tag = "Research Test Chamber"; dir = 2; network = list("TestChamber","SS13","Research"); pixel_x = 0},/turf/simulated/floor/engine,/area/toxins/test_chamber) "cuW" = (/mob/living/carbon/human/monkey,/turf/simulated/floor/engine,/area/toxins/test_chamber) +"cuX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"cuY" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cuZ" = (/obj/structure/rack{dir = 1},/obj/item/weapon/extinguisher,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/toolbox/electrical,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/item/device/radio{pixel_y = 6},/turf/simulated/floor,/area/engine/mechanic_workshop) "cva" = (/turf/simulated/floor,/area/engine/mechanic_workshop) "cvb" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "dark"},/area/engine/mechanic_workshop) @@ -6494,6 +6505,10 @@ "cve" = (/turf/simulated/wall,/area/assembly/assembly_line) "cvf" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{icon_state = "door_locked"; locked = 1; name = "Assembly Line Maintenance"; req_access_txt = "32"},/turf/simulated/floor/plating,/area/assembly/assembly_line) "cvg" = (/obj/machinery/door/window/southleft{base_state = "left"; dir = 2; icon_state = "left"; name = "Assembly Line Delivery"; req_access_txt = "32"},/turf/simulated/floor{icon_state = "delivery"},/area/assembly/assembly_line) +"cvh" = (/obj/structure/table/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door_control{id = "xenobio7"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 10; icon_state = "warning"},/area/space) +"cvi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 6; icon_state = "warning"},/area/space) +"cvj" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor{dir = 2; icon_state = "warning"},/area/space) +"cvk" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cvl" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "yellowcorner"},/area/hallway/primary/aft) "cvm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor,/area/hallway/primary/aft) "cvn" = (/obj/structure/disposalpipe/sortjunction{dir = 2; icon_state = "pipe-j2s"; sortType = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor,/area/hallway/primary/aft) @@ -6505,6 +6520,7 @@ "cvt" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engine/break_room) "cvu" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/landmark/nations{name = "Atmosia"},/turf/simulated/floor,/area/engine/break_room) "cvv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/engine/break_room) +"cvw" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cvx" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/atmos/control) "cvy" = (/turf/simulated/floor,/area/atmos/control) "cvz" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/computer/security/engineering,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmospherics Requests Console"; pixel_x = 30; pixel_y = 0},/turf/simulated/floor,/area/atmos/control) @@ -6526,9 +6542,10 @@ "cvP" = (/obj/structure/disposalpipe/trunk{dir = 4},/obj/structure/disposaloutlet,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cvQ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cvR" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/engine,/area/toxins/xenobiology) +"cvS" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/space) "cvT" = (/obj/machinery/disposal,/obj/structure/window/reinforced,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor{dir = 5; icon_state = "warning"},/area/toxins/xenobiology) "cvU" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/newscaster{pixel_y = 34},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cvV" = (/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"cvV" = (/obj/machinery/light{dir = 1; in_use = 1},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cvW" = (/turf/simulated/wall,/area/toxins/xenobiology) "cvX" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_pump{on = 1},/turf/simulated/floor{dir = 10; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTHEAST)"},/area/toxins/xenobiology) "cvY" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -6540,11 +6557,14 @@ "cwe" = (/turf/simulated/wall/r_wall,/area/toxins/test_chamber) "cwf" = (/obj/machinery/atmospherics/pipe/manifold/visible/purple{dir = 8},/obj/machinery/meter,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cwg" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/maintenance/fpmaint2) +"cwh" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/space) "cwi" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating/airless/catwalk,/area/maintenance/fpmaint) "cwj" = (/obj/item/weapon/wrench,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cwk" = (/obj/machinery/optable,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cwl" = (/turf/simulated/floor{icon_state = "freezerfloor"},/area/crew_quarters/fitness) "cwm" = (/turf/simulated/floor/airless{icon_state = "damaged5"},/area/space) +"cwn" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/space) +"cwo" = (/obj/structure/table/reinforced,/obj/item/weapon/circular_saw{pixel_y = 0},/obj/item/weapon/scalpel,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cwp" = (/obj/structure/grille,/turf/simulated/floor/plating/airless,/area/space) "cwq" = (/obj/structure/table,/obj/item/pod_parts/core,/obj/item/weapon/circuitboard/mecha/pod,/obj/item/clothing/glasses/welding{pixel_y = 12},/turf/simulated/floor,/area/engine/mechanic_workshop) "cwr" = (/obj/machinery/door_control{id = "mechpod"; name = "Mechanic's Inner Door Control"; pixel_x = 0; pixel_y = -24; req_access_txt = "70"},/obj/structure/table,/obj/item/stack/sheet/metal{amount = 50},/obj/item/stack/sheet/glass{amount = 50},/obj/item/stack/rods{amount = 50},/obj/item/stack/sheet/mineral/plasma{amount = 30},/turf/simulated/floor,/area/engine/mechanic_workshop) @@ -6553,7 +6573,9 @@ "cwu" = (/obj/machinery/light_switch{name = "light switch "; dir = 2; pixel_x = 0; pixel_y = -22},/turf/simulated/floor{dir = 5; icon_state = "dark"; tag = "icon-vault (NORTHEAST)"},/area/engine/mechanic_workshop) "cwv" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/computer/rdconsole/mechanics,/turf/simulated/floor{icon_state = "dark"},/area/engine/mechanic_workshop) "cww" = (/turf/simulated/wall,/area/engine/mechanic_workshop) +"cwx" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cwy" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating,/area/maintenance/aft) +"cwz" = (/obj/machinery/optable,/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cwA" = (/obj/item/weapon/table_parts,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "cwB" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor,/area/assembly/assembly_line) "cwC" = (/obj/item/weapon/camera_assembly,/turf/simulated/floor,/area/assembly/assembly_line) @@ -6572,14 +6594,17 @@ "cwP" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/hallway/primary/aft) "cwQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/hallway/primary/aft) "cwR" = (/obj/machinery/vending/cola,/turf/simulated/floor{icon_state = "arrival"; dir = 4},/area/hallway/primary/aft) +"cwS" = (/obj/machinery/processor{name = "Slime Processor"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cwT" = (/obj/structure/rack{dir = 8; layer = 2.9},/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/item/weapon/storage/belt/utility,/turf/simulated/floor,/area/engine/break_room) "cwU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor,/area/engine/break_room) "cwV" = (/turf/simulated/floor,/area/engine/break_room) "cwW" = (/obj/machinery/hologram/holopad,/turf/simulated/floor,/area/engine/break_room) "cwX" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor,/area/engine/break_room) "cwY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/stool/bed/chair/comfy/black{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor,/area/engine/break_room) +"cwZ" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cxa" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/turf/simulated/floor,/area/atmos/control) "cxb" = (/obj/machinery/atmospherics/portables_connector,/turf/simulated/floor,/area/atmos/control) +"cxc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/monkey_recycler,/obj/machinery/light,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cxd" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "Biohazard_medi"; name = "Quarantine Lockdown"; opacity = 0},/obj/machinery/door/airlock/maintenance{name = "Surgery Maintenance"; req_access_txt = "45"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxe" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/wall/r_wall,/area/medical/surgery) "cxf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/wall/r_wall,/area/medical/surgery) @@ -6589,11 +6614,15 @@ "cxj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cxk" = (/obj/machinery/shower{tag = "icon-shower (EAST)"; icon_state = "shower"; dir = 4},/obj/structure/sign/securearea{pixel_x = -32; pixel_y = 0},/turf/simulated/floor{dir = 8; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) "cxl" = (/obj/structure/closet/l3closet,/obj/item/clothing/mask/gas,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor{dir = 4; icon_state = "warnwhite"; tag = "icon-warnwhite (NORTH)"},/area/medical/virology) +"cxm" = (/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 4},/obj/structure/table/glass,/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"cxn" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) +"cxo" = (/obj/machinery/light{dir = 8},/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = -29},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) "cxp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/wall/r_wall,/area/medical/virology) "cxq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/wall/r_wall,/area/medical/virology) "cxr" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/wall/r_wall,/area/medical/virology) "cxs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/wall/r_wall,/area/medical/virology) "cxt" = (/turf/simulated/floor/engine,/area/toxins/xenobiology) +"cxu" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cxv" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio3"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/door/window/northleft{base_state = "right"; dir = 8; icon_state = "right"; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cxw" = (/obj/machinery/door/window/northleft{dir = 4; name = "Containment Pen"; req_access_txt = "55"},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) "cxx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -6604,12 +6633,14 @@ "cxC" = (/turf/simulated/floor/engine,/area/toxins/test_chamber) "cxD" = (/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/fitness) "cxE" = (/obj/structure/stool,/obj/machinery/light/small{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) +"cxF" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_y = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cxG" = (/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cxH" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cxI" = (/obj/effect/landmark{name = "blobstart"},/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "cxJ" = (/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "solar_xeno_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access_txt = "13"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/starboard) "cxK" = (/turf/space,/area/xenos_station/southwest) "cxL" = (/turf/simulated/wall/r_wall,/area/maintenance/aft) +"cxM" = (/obj/effect/spawner/window/reinforced,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/disposalpipe/segment,/obj/structure/cable,/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/plating,/area/toxins/xenobiology) "cxN" = (/obj/item/stack/cable_coil,/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "cxO" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "floorgrime"},/area/assembly/assembly_line) "cxP" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor,/area/assembly/assembly_line) @@ -6634,6 +6665,7 @@ "cyi" = (/obj/machinery/atmospherics/pipe/simple/hidden/universal{dir = 4},/turf/simulated/floor,/area/atmos/control) "cyj" = (/obj/machinery/atmospherics/pipe/manifold/hidden/cyan{level = 2},/turf/simulated/floor,/area/atmos/control) "cyk" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/cyan{dir = 9; level = 2},/turf/simulated/floor,/area/atmos/control) +"cyl" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cym" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/door/airlock/maintenance{req_access_txt = "24"},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyn" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/plating,/area/maintenance/asmaint) "cyo" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{level = 1},/turf/simulated/floor/plating,/area/maintenance/asmaint) @@ -6702,8 +6734,6 @@ "czG" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "czH" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "czI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{level = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"czJ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"czK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "czL" = (/obj/structure/table/glass,/obj/item/weapon/restraints/handcuffs/cable/zipties,/obj/item/weapon/reagent_containers/blood/OMinus,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) "czM" = (/obj/item/device/radio/beacon,/turf/simulated/floor/engine,/area/toxins/test_chamber) "czN" = (/obj/structure/closet/firecloset,/turf/simulated/floor/plating,/area/maintenance/fpmaint2) @@ -6750,8 +6780,6 @@ "cAJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cAK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cAL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cAM" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cAN" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cAO" = (/obj/machinery/seed_extractor,/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAP" = (/obj/structure/sink{pixel_y = 30},/turf/simulated/floor,/area/hallway/secondary/construction{name = "\improper Garden"}) "cAQ" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/fpmaint) @@ -6808,7 +6836,6 @@ "cBT" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/item/weapon/storage/box/beakers{pixel_x = -1; pixel_y = -1; pixel_x = 2; pixel_y = 2},/obj/item/device/slime_scanner,/obj/item/device/slime_scanner,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cBU" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/weapon/storage/box/syringes,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cBV" = (/obj/structure/stool/bed/chair{dir = 8},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cBW" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/obj/structure/disposalpipe/segment,/obj/item/device/radio/intercom{freerange = 0; frequency = 1459; name = "Station Intercom (General)"; pixel_x = 29},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cBX" = (/obj/machinery/computer/card,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 20},/turf/simulated/floor{icon_state = "red"; dir = 1},/area/security/checkpoint2) "cBY" = (/obj/machinery/light_switch{pixel_x = 27},/obj/machinery/light{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber{on = 1},/turf/simulated/floor{icon_state = "red"; dir = 5},/area/security/checkpoint2) "cBZ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0; tag = ""},/mob/living/simple_animal/mouse,/turf/simulated/floor/plating,/area/maintenance/aft) @@ -6848,9 +6875,6 @@ "cCR" = (/obj/structure/stool/bed/chair{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cCS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cCT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cCU" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 8; on = 1},/obj/machinery/smartfridge/secure/extract,/turf/simulated/floor{dir = 2; icon_state = "whitecorner"},/area/toxins/xenobiology) -"cCV" = (/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/machinery/processor{name = "Slime Processor"},/turf/simulated/floor{icon_state = "whitehall"; dir = 2},/area/toxins/xenobiology) -"cCW" = (/obj/item/weapon/extinguisher,/obj/item/weapon/extinguisher{pixel_x = 4; pixel_y = 4},/obj/structure/table/glass,/turf/simulated/floor{dir = 8; icon_state = "whitecorner"},/area/toxins/xenobiology) "cCY" = (/turf/simulated/wall/r_wall,/area/maintenance/portsolar) "cCZ" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall/r_wall,/area/maintenance/aft) "cDa" = (/obj/effect/decal/cleanable/fungus,/turf/simulated/wall,/area/assembly/assembly_line) @@ -6912,9 +6936,7 @@ "cEi" = (/obj/structure/table,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/stack/sheet/mineral/plasma{amount = 5; layer = 2.9},/obj/machinery/media/receiver/boombox,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cEj" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cEk" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cEl" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "whitehall"; dir = 4},/area/toxins/xenobiology) "cEm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cEn" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/structure/extinguisher_cabinet{pixel_x = 27; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{tag = "icon-whitehall (WEST)"; icon_state = "whitehall"; dir = 8},/area/toxins/xenobiology) "cEp" = (/obj/machinery/atmospherics/pipe/vent{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "cEq" = (/turf/simulated/floor/plating/airless,/obj/structure/cable,/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk3"; icon_state = "catwalk3"},/area/solar/port) "cEu" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = -32; pixel_y = 0},/obj/machinery/atmospherics/portables_connector,/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/plating,/area/maintenance/portsolar) @@ -6961,9 +6983,6 @@ "cFp" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cFq" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cFr" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) -"cFs" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/monkey_recycler,/turf/simulated/floor,/area/toxins/xenobiology) -"cFt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/obj/machinery/vending/wallmed1{name = "Emergency NanoMed"; pixel_x = 0; pixel_y = -32; req_access_txt = "0"},/turf/simulated/floor{icon_state = "whitehall"; dir = 1},/area/toxins/xenobiology) -"cFu" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 8; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/obj/structure/flora/kirbyplants,/turf/simulated/floor,/area/toxins/xenobiology) "cFv" = (/turf/simulated/floor/plating/airless,/obj/machinery/power/tracker,/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk4"; icon_state = "catwalk4"},/area/solar/port) "cFw" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; tag = ""},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port) "cFx" = (/turf/simulated/floor/plating/airless,/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating/airless/catwalk{tag = "icon-catwalk12"; icon_state = "catwalk12"},/area/solar/port) @@ -7122,8 +7141,6 @@ "cIZ" = (/obj/machinery/door/firedoor,/obj/machinery/door/airlock/glass_medical{id_tag = null; name = "Monkey Pen"; req_access_txt = "39"},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cJa" = (/obj/structure/disposalpipe/segment,/obj/machinery/light_switch{pixel_x = 0; pixel_y = 26},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cJb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 1; on = 1},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) -"cJd" = (/obj/machinery/light{dir = 8},/turf/simulated/floor{dir = 4; icon_state = "warning"},/area/toxins/xenobiology) -"cJe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cJf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cJg" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) "cJh" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0; tag = ""},/turf/simulated/floor{icon_state = "white"},/area/toxins/xenobiology) @@ -7172,8 +7189,6 @@ "cKg" = (/obj/machinery/atmospherics/unary/vent_scrubber{dir = 4; on = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cKh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cKi" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) -"cKk" = (/obj/structure/stool/bed/chair,/turf/simulated/floor{icon_state = "hydrofloor"},/area/toxins/xenobiology) -"cKl" = (/obj/machinery/door/window/southright{dir = 1; name = "Containment Pen"; req_access_txt = "55"},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/xenobiology) "cKm" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/table/reinforced,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/door_control{id = "xenobio4"; name = "Containment Blast Doors"; pixel_x = 0; pixel_y = 4; req_access_txt = "55"},/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/xenobiology) "cKn" = (/obj/machinery/light,/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/xenobiology) "cKo" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/turf/simulated/floor{dir = 1; icon_state = "warning"},/area/toxins/xenobiology) @@ -7227,8 +7242,6 @@ "cLw" = (/obj/structure/disposalpipe/junction,/obj/machinery/light{dir = 8},/obj/machinery/atmospherics/unary/vent_pump{dir = 8; external_pressure_bound = 100; on = 1; pressure_checks = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cLx" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8; initialize_directions = 11; level = 1},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cLy" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) -"cLA" = (/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/machinery/computer/reconstitutor/animal,/turf/simulated/floor/engine,/area/toxins/xenobiology) -"cLB" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio4"; name = "Containment Blast Doors"; opacity = 0},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cLE" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio5"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cLH" = (/obj/machinery/door/window/southright{name = "Containment Pen"; req_access_txt = "55"},/obj/machinery/door/poddoor{density = 0; icon_state = "pdoor0"; id_tag = "xenobio6"; name = "Containment Blast Doors"; opacity = 0},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cLJ" = (/obj/structure/cable,/obj/machinery/power/solar{id = "starboardsolar"; name = "Starboard Solar Array"},/turf/simulated/floor/airless{icon_state = "solarpanel"},/area/solar/starboard) @@ -7316,7 +7329,6 @@ "cNF" = (/obj/item/weapon/storage/box/monkeycubes,/obj/item/weapon/storage/box/stokcubes,/obj/item/weapon/storage/box/neaeracubes,/obj/structure/table/glass,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/item/weapon/storage/box/wolpincubes,/obj/item/weapon/storage/box/farwacubes,/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = -28},/obj/machinery/light,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) "cNH" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/camera{c_tag = "Virology Lab East"; dir = 1; network = list("SS13")},/turf/simulated/floor{icon_state = "white"},/area/medical/virology/lab) -"cNJ" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/engine,/area/toxins/xenobiology) "cNK" = (/obj/machinery/light/small{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/engine,/area/toxins/xenobiology) "cNL" = (/obj/structure/sign/poster{pixel_x = -32},/turf/simulated/floor/plating,/area/maintenance/engi_shuttle) "cNM" = (/obj/machinery/light/small{dir = 8},/obj/machinery/camera{c_tag = "Engineering Secure Storage North"; dir = 4; network = list("SS13")},/obj/machinery/shield_capacitor,/turf/simulated/floor/plating,/area/storage/secure) @@ -8149,24 +8161,24 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcqtcqtcqucqucqucqucquciCciCciCciCciCciCciCcqvcqwcqxcqxcqxcqxcqxchuchBchBchBchBchBchBchBcqyceTbZUcqzcqAcqBcqCcqDcqEcqFcqGcqHcqIcqJcqKcqLchMbHTbHTcoCcqMcqNcpOcpPcpPcqOcoCcqPcpPcpPcpScpOcqQcoNbEDbEDbEDcqRcqSckNcqTckPczvbHTbHTbHTbHTcqVbHTbHTbHTbHTcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabpPcqXcqYcqZbricqlcqgcqecqicoYcoYcoYcoYcqmcrhcrbcsvcsucqkbsycqUcqpcribsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcgbcgbcgbcgbUMbUMbUNbUNbUNbUNbUOaabaabaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncrocrpcrqcrqcrrcrscrtcrucrvcrwcrxbrMcrzcrzcrzcrAcrBcrCcrDcrDcrEcrFcrGcrHcrIcrHcrHcrHcrGcrHcrHcrJcrKcrLcrMceTbZUcrNcrPcrOcrQceVcrRclMcrScrTcrUcrVcrWcrXcrYbHTbHTcoCcrZcsacsbcsccsdcoHcoCcoIcsdcsgcshcsbcsicoNbHTbHTbHTcsjcoOckNcoOcskbHTbHTcFLbHTbHTbHTbHTbHTcfccGOcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacslcjIcsmcjLcslcrccrecrdcuQcrfcsocsncoYcoYcsqcspcsscsrcstbsycrkcrjcsxbsyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmcrncsAcsBcsCcsBcsDcsEcsFcsGcsHcsIcsHcsJcsKcsKcsecsKceTcsfbZVbZVcsKcsLcsKcsKcsKcsKcsKcsKcsKcsKcsKcsKcsMcsNcsOcsPcsQcsRcsScsTcsUcsVcsWcsXcsYcsZctactbctcctdctecmnctfctgcthctictjcoJcoScoKcoCcoWcpPcoJcptcpOctocoNctpcmscmsctqctrctscttckPbnjbnjbnjbnjcnzcnzcnzbnjbnjbnjcnzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIctyctzctxcjIcmAcmAcmAcmAcmAcmAcuTcsncuUctBcswctCcmAcmAbsycszcsycszcszaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcucctkcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukbszbuccuncuocupcuqcurcuscutbufcuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcpucoCcpvcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIaabaabaaaaaaaabcmAcmActEcmActGctFctHcmAaaaaaacszctlcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvebvYbvZcvecvebvZbvZbvZcvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvbxNcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRbxWcvTcvUcvVcvWcvXcvYcvZcjIaabaaaaaaaaaaabaabcwectJcuVcxCcxBcwacweaaaaaacszctmcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaczakSakSakSalwakSakSaabalwawTaaaaabaabcwpcwpcwpcqtcwqcwrcwscwtcwucwvcwwcogcwybxZcwAcwBcwCcwDcwEcwFcwGcwHcwIcvecwHcwJcwKcwLcwLcwMcvecwNcwOcwPcwQbZUcwRbyfcwTcwUcwVcwWcwVcwXcwYbzncxacxbcnBcrYcrYcuFcvAcoNcoNcxdcoNcoNcxecxfcxgcxgcxgcxhcxgcxicxgcxjcnzaaacuGcxkcvMcxlckPbhsbhsbhsbhsckPckPcxpcxqcxqcxrcxqcxqcxrcxsaaaaaacjIcxtbTHcxtcxvcxwcqacxxcvWcxycxzcxycjIaaaaaaaaaaaaaaaaaacwecwbcuWcxCcxCcwccweaaaaaaaaacxJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaawTaaaaaaaaaaabaabcwpcqtcqtcqtcqtcqtcqtcqtcqtcxLcwybxZcxNcxOcxPcxQcxQcxQcxQcxRcxScxTcwLcxUcwLcwLcxVcwLcxWcxXcxYcxZcwQbZUcyacybcyccwUcydcyecyfcwUcygcyhcyicyjcykcnCcymcyncyocypcypcyqcyrcyscytcyucdzcdzcdzcyvbHTbHTcbRbHTcnzaaacuGcywcvMcyxcyycyzcyAcyBcyCbzLcyEbTJbzLcyEbTLbzLcyHcyIcyJaaaaaacjIcxtcxtcxtbzMcyLcyMcyNcyOcyPcyQcyRcjIaaaaaaaaaaaaaaaaaacwectKcxCczMcxCcuLcweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaczaaacyYcyZczaaaacyYcyZczaaaacyYcyZczaaabczbaabaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaabxYcwybxZczdcwLcxVczecwLcwLcwLczfcwLczdczdcwLcwLcwLcwLczgbzPcxXczicsKczjbZUcybcybczkcwUczlczmczncwUczoctaczpczqczrczscztcHZbHTczucbSczubHTbHTbHTcuFcZScnzbnjbnjbnjbnjbnjcnzcnzaaaczwczxczycjqczzczAcoOcoOczBbAbczDczEbAbczDczEbAbczDczEcyJaaaaabcjIcvWcvWcvWcvWczFcqaczGczHczIczJczKcjIaabaaaaaaaaaaaaaaacwecuPcuMcxCcxCcuOctDcEpaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaaacyYczVczaaaacyYczVczaaaacyYczVczaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbxYcwybxZczdczYcwLczZcAacAbcAbcxUcwLczdcAccwLcwLcwLcwLcAdcAecAfcAgbYxcAhcAicAjcAkcAlcwUczlcAmcAncwUcAoctacrYcApcrVcAqcArcAscAtcAucAvcAwcAtcAtcAtcAxcAtcnzaaaaaaaaaaaaaaaaaaaabaaacuGcAycvMcAzcAAcABcoOcoOczBbAbcADbAbbAbcADbAbbAbcADbAbcyJaabaabcjIcvPcvQcvRbBBcAIcyMcAJcAKcALcAMcANcjIaabaabaabaabaabaaacwecwecuScuRcwdcwecweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaagaaaaaaaaaakSaabcyYczVczaaaacyYczVczaaabcyYczVczaaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaabxYcwycvecAWcwLcAXcAYcAZcBacBbcBacBccBacBdcBecwHcBfczdczdbzPcBgcBhcBicBjcBkcBlcBmcBncBocBpcBqcBrcBscBtcBucBvcBvcBwcBxcBycBzbBGcBBcBCcBDcBEcBFcBGcBHbBHaabaaaaaaaaaaaaaaaaaaaabaabczwcBJcBKcBLcBMcBNcoOcoOcoOcBOcoOcoOcoOcoOcoOcoOcoOcBPbBIaaaaaacjIcxtbTXcxtcBRcxwcqacBScBTcBUcBVcBWcjIcjIcjIcjIcjIaabaaaaaacwecwecwecwecweaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacxLcBZcvecCacCbcCbcCccvecvecvecvecvecvecvecvecvecvecvecvecvecCdcCecCdcCfcCdcqxbBYcChbCibChbChbCkcCmbClcBuctAcCpcCqcCrcCscCtbBGcCvcCwcCxcCycCzcCAcCBbCwaabcCDcCDcCDcCDcCDaaaaaaaabcuGcCEcvMcCFcCGcCHcCIcoOcoOcCJcoOcoOcoOcoOcoOcCKcoOcCLbBIaaaaaacjIcxtcxtcxtbBBcCNcyMcCOcCPcCQcCRcCScCTcCUcCVcCWcjIaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaabaaaaaaaaaaaaaaaaaaaaaaaaaabbCxcCYcCYcCYcCYcxLcCZcwycDacDbcDccDccDdcDecDfcDgcDgcDgcDgcDhcDicDjcDicDicDkcDkcDicDlcDmcDncDocDocDpcDqcDrcDscDtcDucDucDvcDwctLcDycDzcDAcCscDBbBGcDCcDDcDEcDFcDGcDHcDIbCycDKcDLcDMcDNcDOcCDaaaaaacDPcDQcDRcDScDTcDRcDUcDVcDWcDXcDYcDZbzLcDYcEbcEccEdcEebCMcyJaaaaaacjIcvWcvWcvWcvWcEgcqacBScEhcEicBVcEjcEkcElcEmcEnbSIcEpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvctnctvctucEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcFscFtcFucjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacrmctPcsBctQctRctSctTctUctVctWctXctYctZcuacubcucctkcudcuecdqcufcdqcubcugcubcubcubcubcubcubcubcubcubcubcuhcsKcuicujcukbszbuccuncuocupcuqcurcuscutbufcuvcuwcuxcrVcdzcuycuzcuAcpPcpOcpPcpPcpucoCcpvcpPcpPcpScpOcuEcoNcuFcnzaaacuGckPcuHckPckPaaaaaaaaaaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcuIcuJcuKcjIcklcklclzctNaabcmAcmActEcmActGctFctHcmAaaaaaacszctlcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacUabCcqtcqtcqtcqtcqtcqtcuZcvacvacvbcsHcvccqtcqxcvdcvecvecvfcvecvgcvecvebvYbvZcvecvebvZbvZbvZcvecvecvecvecvlcvmcvncvocvpcvqcvrcvscvtcvscvscvucvscvvbxNcvxcvycvzcrYbHTcuFcvAcvBcvCcvDcvEcvFcvGcoCcvHcvFcvIcpScvJcvKcoNcuFcnzaaacuGcvLcvMcvNckPaaaaaaaaaaaacvOaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacjIcvPcvQcvRbxWcvTcvUctOcvWcvXcvYcvZcjIcklcumculctNaabaabcwectJcuVcxCcxBcwacweaaaaaacszctmcszaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczaczakSakSaczakSakSakSalwakSakSaabalwawTaaaaabaabcwpcwpcwpcqtcwqcwrcwscwtcwucwvcwwcogcwybxZcwAcwBcwCcwDcwEcwFcwGcwHcwIcvecwHcwJcwKcwLcwLcwMcvecwNcwOcwPcwQbZUcwRbyfcwTcwUcwVcwWcwVcwXcwYbzncxacxbcnBcrYcrYcuFcvAcoNcoNcxdcoNcoNcxecxfcxgcxgcxgcxhcxgcxicxgcxjcnzaaacuGcxkcvMcxlckPbhsbhsbhsbhsckPckPcxpcxqcxqcxrcxqcxqcxrcxsaaaaaacjIcxtbTHcxtcxvcxwcqacxxcvWcxycxzcxycjIcklcklcuuctNaabaaacwecwbcuWcxCcxCcwccweaaaaaaaaacxJaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaczaaaaaaaabaabaaaaabaabaaaaaaaabaabaabaaaawTaaaaaaaaaaabaabcwpcqtcqtcqtcqtcqtcqtcqtcqtcxLcwybxZcxNcxOcxPcxQcxQcxQcxQcxRcxScxTcwLcxUcwLcwLcxVcwLcxWcxXcxYcxZcwQbZUcyacybcyccwUcydcyecyfcwUcygcyhcyicyjcykcnCcymcyncyocypcypcyqcyrcyscytcyucdzcdzcdzcyvbHTbHTcbRbHTcnzaaacuGcywcvMcyxcyycyzcyAcyBcyCbzLcyEbTJbzLcyEbTLbzLcyHcyIcyJaaaaaacjIcxtcxtcxtbzMcyLcyMcyNcyOcyPcyQcyRcjIcuBcuDcuCctNaaaaaacwectKcxCczMcxCcuLcweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaczaaacyYcyZczaaaacyYcyZczaaaacyYcyZczaaabczbaabaaaaaaaaaaaaaabaabaabaaaaaaaaaaaaaaaaaabxYcwybxZczdcwLcxVczecwLcwLcwLczfcwLczdczdcwLcwLcwLcwLczgbzPcxXczicsKczjbZUcybcybczkcwUczlczmczncwUczoctaczpczqczrczscztcHZbHTczucbSczubHTbHTbHTcuFcZScnzbnjbnjbnjbnjbnjcnzcnzaaaczwczxczycjqczzczAcoOcoOczBbAbczDczEbAbczDczEbAbczDczEcyJaaaaabcjIcvWcvWcvWcvWczFcqaczGczHczIcuYcuXcjIcvhcvjcvictNaaaaaacwecuPcuMcxCcxCcuOctDcEpaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaaacyYczVczaaaacyYczVczaaaacyYczVczaaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabaabbxYcwybxZczdczYcwLczZcAacAbcAbcxUcwLczdcAccwLcwLcwLcwLcAdcAecAfcAgbYxcAhcAicAjcAkcAlcwUczlcAmcAncwUcAoctacrYcApcrVcAqcArcAscAtcAucAvcAwcAtcAtcAtcAxcAtcnzaaaaaaaaaaaaaaaaaaaabaaacuGcAycvMcAzcAAcABcoOcoOczBbAbcADbAbbAbcADbAbbAbcADbAbcyJaabaabcjIcvPcvQcvRbBBcAIcyMcAJcAKcALcvwcvkcvVcvScwncwhctNaaaaaacwecwecuScuRcwdcwecweaaaaaaaaacyXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaagaaaaaaaaaakSaabcyYczVczaaaacyYczVczaaabcyYczVczaaabaaaaaaaabaabaabaabaabaaaaaaaaaaaaaaaaabaaaaaabxYcwycvecAWcwLcAXcAYcAZcBacBbcBacBccBacBdcBecwHcBfczdczdbzPcBgcBhcBicBjcBkcBlcBmcBncBocBpcBqcBrcBscBtcBucBvcBvcBwcBxcBycBzbBGcBBcBCcBDcBEcBFcBGcBHbBHaabaaaaaaaaaaaaaaaaaaaabaabczwcBJcBKcBLcBMcBNcoOcoOcoOcBOcoOcoOcoOcoOcoOcoOcoOcBPbBIaaaaaacjIcxtbTXcxtcBRcxwcqacBScBTcBUcBVcEjcqacwocqacwxcjIaaaaaaaaacwecwecwecwecweaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaaaaaaaaaaaaaaaaaaaabaabaabaaaaabaaaaabaabaaaaaacxLcBZcvecCacCbcCbcCccvecvecvecvecvecvecvecvecvecvecvecvecvecCdcCecCdcCfcCdcqxbBYcChbCibChbChbCkcCmbClcBuctAcCpcCqcCrcCscCtbBGcCvcCwcCxcCycCzcCAcCBbCwaabcCDcCDcCDcCDcCDaaaaaaaabcuGcCEcvMcCFcCGcCHcCIcoOcoOcCJcoOcoOcoOcoOcoOcCKcoOcCLbBIaaaaaacjIcxtcxtcxtbBBcCNcyMcCOcCPcCQcCRcCScCTcwzcqacwScjIaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaaacyYczVczaaabcyYczVczaaaacyYczVczaaabaaaaaaaaaaaaaaaaaaaaaaaaaabbCxcCYcCYcCYcCYcxLcCZcwycDacDbcDccDccDdcDecDfcDgcDgcDgcDgcDhcDicDjcDicDicDkcDkcDicDlcDmcDncDocDocDpcDqcDrcDscDtcDucDucDvcDwctLcDycDzcDAcCscDBbBGcDCcDDcDEcDFcDGcDHcDIbCycDKcDLcDMcDNcDOcCDaaaaaacDPcDQcDRcDScDTcDRcDUcDVcDWcDXcDYcDZbzLcDYcEbcEccEdcEebCMcyJaaaaaacjIcvWcvWcvWcvWcEgcqacBScEhcEicBVcEjcEkcEmcEmcwZbSIcEpaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcEqaabaabaabcEqaabaaaaabcEqaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcEucEvctnctvctucEzcEAcDacDacEBcECcvecvecEDcEEcEEcEEcEEcEFcEGcEHcEGcEGcEGcDocDocEIcEJcEKcELcEMcDucENcDrcDucDucDucDucEOcBucEPcEQcCqcDAcCscDAbBGcDCcDDcEScETcEUcEVcEWbCUaabcEYcEZcDOcFacCDaaaaaaaaacDQcFbcFccFdcDRcFecFfcFgcFhcFiczEczDcFicFjcFkcFlczEczDcyJaaaaaacjIcvPcvQcvRbDrcAIcyMcFncFocFpcEmcFqcFrcxccxncxmcjIaabaabaagaaaaaaaaaaaaaaaaaaaaaaaaaaacyXaabaaaaaaaaaaabaabaaaaaaaaaaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaakSaabcFvcFwcFwcFxcFycFzcFzcFzcFycFzcFzcFzcFycFzcFzcFAcFwcFwcFwcFwcFwcFBcFCcFDcFEcFFcFGctwcFIcFJceHcwycFKcDacvecvecvecZTcEDcEEcFMctMcFOcFPbGIcFRcFScFTcFUbDtcFWcFXcFYcFZcGabDtcGccGdcDrcGecDucDucDucGfcBucGgcGgcDAcGhcGicGjcGkcGlcGmcGncGocGpcGqcGrbCycGscDLcGtcDOcDOcCDaaaaaaaabcDQcGucFccGvcDRcGwcGxcCIcGycFicGzcGAcFicGBcGCcFlcGzcGDcyJaaaaaacjIcxtbTHcxtcGEcxwcqacGFcFocGGcqacqacGHcvWcvWcvWcjIaaaaaaaaaaaaamjamjamjawTaabaabaabaabcGIaabaabaabaabaabalwamjamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaaaaabaaaaabaabcGJaabaaaaabcGJaabaaaaabcGJaabaaaaaaaaaaaaaaaaaaaaaaaabCxbCxbCxcGLcGMcGNcCYcZUceHcGPcEzcEzcEzcEzcGQcEzcFJcEEcGRcGScGTcGUbDGcGWcGXcGYcGZbEocHbcHccHdbFlcktbGPcGccENcDrcZicHjcDucDucHkcBucHlcHmcDAcHncCscHocHpbFvbFtbGBbFQbGEbGCbGEbGGaabcCDcCDcCDcCDcCDaabaabaabcHxcHycFccGvcDRcHzcHAcHBcHCcHDcHEcHFcHFcHGcHFcHHcHIcDRcHJaaaaaacjIcxtcxtcxtbDrcHKcHLcHMcHNcHOcCTcCTcCTcHPcHQcHRbGHaaaaaaaaaaaaamjaaaaabaaaaabaaaaaaaaacHTaaaaabaabaaaaaaaaaaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEbYRcaecGTcajbGIcamcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcJdcqacJecyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcajbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbciIcFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKkcKlcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcJncKAcKAcKBcKCcKDcKDcKEcKFcKFcKHcIdcIecGTcajcGTcKIcGTcGTcGTcDocKJbJVcKLbJWbJXcKOcKPcaCcKRbKhbKhbKhcKVcKWcKXcKYcKZcLacHncCscLbcLccLdcLecLfcDAcJPcLgcLhbKMcLjcDLcLkcIOcIOcCDaabaaaaaacHxcjkcLmcLncjVcLpcLqcLpcLpcLrcLscLtcLucLubLscLwcLxcLybLtaabaabaaaaaaaaaaaacjIcLAcLBbLucvWbLEcLEbLUcvWbLVcLHbLWcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaaacLJcLJcLJcLJcLJaabamjaaaaaaaaaaaacJmaaaaaacJmaaaaaacJmcJmcJmcJmcJmcJmcJmaaaaaacJmaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcaDcEEbYVcLOcLPcaEcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdbUJbNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcklcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMMcMMcMMcMMcMMcbncbpcbocbXcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdbUKbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQckecNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNJbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcbZcNOcNPcNQcMMccacNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdbULbNdccdcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcxtcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaczaczakSaabaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabbCxcCYcCYcCYcCYcHWcHXcHYceHcZVceHceHcEDcIaceHcEEbYRcaecGTcajbGIcamcIhcIicIjbGRcIlcImcIncIocIpbGRcIrcIscItcIucIvcIwcIxcIycIzcIAcGjcIBcICcIDcIEcIFcIGcIHcIIcIJcIKcILcIMbGVcDKcDLcIPcIOcIOcCDaaaaaaaabcDQcIQcFccIRcDRbIxbIxbIxbIxcDRcIVcIWcIXcIYcIZcJacJbcIYbIBaaacDPcjIcjIcjIcjIcjIcxocxFcxucyMcJfcyMcJgcyMcJhcyMcJibGHaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaaaamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmaaaaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaacyYcHUczaaabcyYcHUczaaaacyYcHUczaaaaaaaaaaaabaaaaaaaaaaaaaabaabaabaaaaaaaabaabcJncJncJncJncJncJncJncJocJncJncEEcJpcJqcGTcajbGIbICbGIbJhcJvcDocJwcJxcFZcJycJzcDocJAcDucDrcJBcJCcJDcIxcJEcJFcJGcJHcJIcJJcJKcJHcJLcJMcJNcJOcDAcJPcJQcJRbJCaabcEYcJUcJTcJVcCDaaaaaaaaacDQcDRcJWcJXcDRcJYcJZcKacKbciIcFccKdcKecIYbJEcKgcKhcKibIBaabaaaaaaaaaaaaaaacjIcKocKpcKmcKncKocKpcKqcKrcKocKpcKscjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycKzaabamjaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaaacyYcHUczaaabaaaaaaaaaaaaaaaaaaaaaaabaabaaaaaaaabaabaabcJncKAcKAcKBcKCcKDcKDcKEcKFcKFcKHcIdcIecGTcajcGTcKIcGTcGTcGTcDocKJbJVcKLbJWbJXcKOcKPcaCcKRbKhbKhbKhcKVcKWcKXcKYcKZcLacHncCscLbcLccLdcLecLfcDAcJPcLgcLhbKMcLjcDLcLkcIOcIOcCDaabaaaaaacHxcjkcLmcLncjVcLpcLqcLpcLpcLrcLscLtcLucLubLscLwcLxcLybLtaabaabaaaaaaaaaaaacjIcxMcylbLucvWbLEcLEbLUcvWbLVcLHbLWcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaaacLJcLJcLJcLJcLJaabamjaaaaaaaaaaaacJmaaaaaacJmaaaaaacJmcJmcJmcJmcJmcJmcJmaaaaaacJmaaaaaacJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaabcyYcHUczaaaacyYcHUczaaabcyYcHUczaaabaabaabaaaaabaaaaaaaabaabaaaaaaaaaaabaaaaaacJncKAcKAcKBcLKcLKcLKcLLcLLcaDcEEbYVcLOcLPcaEcLRcLScLTcLUcLUcLVcLWcLXcGTcGTcGTcLYcLZcMacMbcMccMdbUJbNdcMgcEEcMhcMhcMicHncCscMjcMkcMlcMmcMncDAcMocMpcMqbNgcMscCDcCDcCDcCDcCDaaaaaaaaacDQcMtcMucMvcMwcMxcMycMxcMxcMzcMAcMBcMCcLybNlcMEcKhcIYbNqaabaabaaaaaaaaaaaacjIcMHcxtcxtcvWcMHcxtcxtcvWcMHcxtcxtcjIaaaaaaaaaaaaamjaaaaabaaaaabaabaabaaacJlaaaaabaaaaabaaaaabaaaamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaalwaabcyYcMIczaaaacyYcMIczaaaacyYcMIczaaabakSaabaabaabaabaabaabaaaaaaaaaaaaaaaaaaaabcJncMJcMKcLKcLKcLKcMLcMMcMMcMMcMMcMMcMMcMMcbncbpcbocbXcMScMScMScMTcMUcMVcMScMScMScMUcMWcMXcMYcMdbUKbNdcMgcNbcNccNdcNecNfcNgcNhcNicLfcNjcNkcNlcNmcNncNobGVcNpcDLcNqcNrcNrcCDaaaaaaaaacDQckecNtcNucNvcNwcNxcNycIYcNzcNAcNBcNCcNDbJEcNFcNGcNHbNqaaaaaaaaaaaaaaaaaacjIcNKbTXcxtcvWcNKbTXcxtcvWcNKbTXcxtcjIaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcJlaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaakSaaaaabaaaaaaaaaaabaabaabaaaaaaaabaabaaaakSaabaabaabaabaabaaaaaaaaaaaaaaaaaaaaaaabcJncNLcLKcLKcLKcLKcLKcMMcNMcbZcNOcNPcNQcMMccacNScNTcJqcGTcGTcNUcNVbNtbNucNYbNvbNvcObcEEcOccMYcMdbULbNdccdcEEcOfcMhcOgcOhcDAcNhcNicOicDAcNkcNlcJPcJQcOjbJCcOkcEYcOlcOmcOncCDaaaaaaaaacOobNwbNwbNwbNwcOscOscOtcOubJEbJEbNxbSSbJEcOzcOzbTicOAcOzaaaaaaaaaaaaaaaaaacjIcOBcxtcxtcvWcOBcxtcxtcvWcOBcxtcxtcjIaaaaaaaaaaaaamjaabcKtcKucKucKucKucKvcKwcKxcKycKycKycKycOCaabamjaaaaaaaaaaaacJmcJmcJmcJmaaacJmcJmcJmcJmcJmcJmcJmcJmcJmaaacJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaczaczakSaczaczalwakSakSakSakSaczakSakSaczcODaabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacJncOEcLLcOFcOGcOHcOIcMMcOJcedceccOMcONcOOceecfMcfachFcGTcOScOTcOUcOVcOWcOXcOYcOZcPacPbcNTcJqcPccPdcMbcidcEEcPfcMhcPgcPhcDAcNhcNicLfcDAcPicNlcJPcPjcPkbKMcPlcDLcPmcNrcNrcCDaaaaaaaaacPnaaaaaaaaaaaaaaaaaacDQcPocIYcIYcPpcPqcPrcOzaacbTpbTqcPuaaaaaaaaaaaaaaaaaacjIcjIcjIcjIcjIcjIcjIcjIcjIcPvcPvcPvcjIaaaaaaaaaaaaamjaabcLJcLJcLJcLJcLJaaacJlaabcLJcLJcLJcLJcLJaaaamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacxKcxKcxKcxKcxKcxKcxKcxKcxKaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabcJncJncJncPwbNybNybNycMMcPAcPBcPCcPCcPDcPEcMScPFcPGcPHcPIcPJcPJcPKcPLcPMcPNcPOcPPcPKcPQcPRciEciGciFciHcRfcPWcOfcMhcPXcPYcDAcNhcDAcPZcDAcNkcNlcJPcJQcQabJCcOkcCDcCDcCDcCDcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacDQcQbcIYcIYcKbcQccQdcOzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacPnaaaaaaaaaaaaaaaaaaaaaaaaaacaacaacaaaaaaaaaaaaaaaawTaaaaabaaaaabaaaaabaaacQeaaaaabaaaaabaabaabaabamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabaabcQfcQgcQhbNyaabaabcMMcQjcQkcPCcPCcQlcMMcQmcQncQocQpcQqcQrcQscEEcQtcQucQvcGTcQwcEEcQxcQycQzcQpcQpcQAcQBcEEcQCcMhcQDcQEcDAcNhcDAcMjcMkcQFcQGcNmcQHcQIbGVcQJcDLcQKcQLcQLcCDaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOocQMcQNcQOcQPcQQcQRcOzaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaamjaaacJkcJkcJkcJkcJkaabcGIaabcJkcJkcJkcJkcJkaabamjaaaaaaaaaaaacJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmcJmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/_maps/map_files/cyberiad/z3.dmm b/_maps/map_files/cyberiad/z3.dmm index bea6ad97392..8fedc9775c3 100644 --- a/_maps/map_files/cyberiad/z3.dmm +++ b/_maps/map_files/cyberiad/z3.dmm @@ -183,7 +183,7 @@ "dA" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/wall/r_wall,/area/space) "dB" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"; tag = ""},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating/airless,/area/space) "dC" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/plating/airless,/area/space) -"dD" = (/obj/structure/disposaloutlet{dir = 4},/turf/simulated/floor/plating/airless,/area/space) +"dD" = (/obj/structure/disposaloutlet{dir = 4},/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor/plating/airless,/area/space) "dE" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{level = 1},/turf/simulated/floor{tag = "icon-vault (NORTHEAST)"; icon_state = "vault"; dir = 5},/area/turret_protected/tcomsat) "dF" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/turret_protected/tcomsat) "dG" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/turret_protected/tcomsat) diff --git a/code/_onclick/observer.dm b/code/_onclick/observer.dm index 671bf0540b8..9a7cd21ce3f 100644 --- a/code/_onclick/observer.dm +++ b/code/_onclick/observer.dm @@ -13,7 +13,8 @@ // Otherwise jump else - loc = get_turf(A) + following = null + forceMove(get_turf(A)) /mob/dead/observer/ClickOn(var/atom/A, var/params) if(client.buildmode) @@ -33,28 +34,6 @@ // Not all of them require checking, see below A.attack_ghost(src) - -// This is the ghost's follow verb with an argument -/mob/dead/observer/proc/ManualFollow(var/atom/target) - following = target - if(target) - src << "\blue Now following [target]" - spawn(0) - var/turf/pos = get_turf(src) - while(loc == pos && target && following == target) - - var/turf/T = get_turf(target) - if(!T) - break - if(following != target) - break - if(!client) - break - loc = T - pos = loc - sleep(15) - following = null - // We don't need a fucking toggle. /mob/dead/observer/ShiftClickOn(var/atom/A) A.examine() @@ -71,33 +50,20 @@ if(S) var/obj/machinery/computer/teleporter/com = S.teleporter_console if(com && com.target) - user.loc = get_turf(com.target) + user.forceMove(get_turf(com.target)) /obj/effect/portal/attack_ghost(mob/user as mob) if(target) - user.loc = get_turf(target) + user.forceMove(get_turf(target)) /obj/machinery/gateway/centerstation/attack_ghost(mob/user as mob) if(awaygate) - user.loc = awaygate.loc + user.forceMove(awaygate.loc) else user << "[src] has no destination." /obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob) if(stationgate) - user.loc = stationgate.loc + user.forceMove(stationgate.loc) else user << "[src] has no destination." - -// ------------------------------------------- -// This was supposed to be used by adminghosts -// I think it is a *terrible* idea -// but I'm leaving it here anyway -// commented out, of course. - -/atom/proc/attack_admin(mob/user as mob) - if(!user || !user.client || !user.client.holder) - return - attack_hand(user) - - diff --git a/code/datums/cache/apc.dm b/code/datums/cache/apc.dm index e6dc996827b..f50b0a8e121 100644 --- a/code/datums/cache/apc.dm +++ b/code/datums/cache/apc.dm @@ -18,10 +18,10 @@ var/global/datum/repository/apc/apc_repository = new() var/obj/machinery/power/apc/A = term.master L += A - var/list/Status = list(0,0,1,1) // Status: off, auto-off, on, auto-on - var/list/chg = list(0,1,1) // Charging: no, charging, full + var/list/Status = list("Off","AOff","On","AOn") // Status: off, auto-off, on, auto-on + var/list/chg = list("N","C","F") // Charging: no, charging, full for(var/obj/machinery/power/apc/A in L) - apcData[++apcData.len] = list("Name" = html_encode(A.area.name), "Equipment" = Status[A.equipment+1], "Lights" = Status[A.lighting+1], "Environment" = Status[A.environ+1], "CellPct" = A.cell ? round(A.cell.percent(),1) : -1, "CellStatus" = A.cell ? chg[A.charging+1] : 0) + apcData[++apcData.len] = list("Name" = html_encode(A.area.name), "Equipment" = Status[A.equipment+1], "Lights" = Status[A.lighting+1], "Environment" = Status[A.environ+1], "CellPct" = A.cell ? round(A.cell.percent(),1) : "M", "CellStatus" = A.cell ? chg[A.charging+1] : "M", "Load" = round(A.lastused_total,1)) cache_entry.timestamp = world.time + 5 SECONDS cache_entry.data = apcData diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 45931d44b89..0c250f3d1cd 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -208,7 +208,8 @@ var/mob/living/carbon/human/occupant = null var/possible_chems = list(list("epinephrine", "ether", "salbutamol", "styptic_powder"), list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine"), - list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol")) + list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol"), + list("epinephrine", "ether", "salbutamol", "styptic_powder", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid", "omnizine")) var/amounts = list(5, 10) var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index c36c8ad20ca..40859fed3b6 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -14,6 +14,7 @@ var/menustat = "menu" var/efficiency = 0 var/productivity = 0 + var/max_items = 40 /obj/machinery/biogenerator/New() ..() @@ -25,7 +26,7 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/stack/cable_coil(null, 1) RefreshParts() - + /obj/machinery/biogenerator/upgraded/New() ..() component_parts = list() @@ -39,12 +40,15 @@ /obj/machinery/biogenerator/RefreshParts() var/E = 0 var/P = 0 + var/max_storage = 40 for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) P += B.rating + max_storage = 40 * B.rating for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) E += M.rating efficiency = E productivity = P + max_items = max_storage /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. update_icon() @@ -94,15 +98,15 @@ var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ - if(i >= 10) + if(i >= max_items) user << "The biogenerator is already full! Activate it." else for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in O.contents) - if(i >= 10) + if(i >= max_items) break G.loc = src i++ - if(i<10) + if(i < max_items) user << "You empty the plant bag into the biogenerator." else if(O.contents.len == 0) user << "You empty the plant bag into the biogenerator, filling it to its capacity." @@ -115,7 +119,7 @@ var/i = 0 for(var/obj/item/weapon/reagent_containers/food/snacks/grown/G in contents) i++ - if(i >= 10) + if(i >= max_items) user << "The biogenerator is full! Activate it." else user.unEquip(O) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 85f7c838656..c599390bdcd 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -75,7 +75,7 @@ efficiency += S.rating for(var/obj/item/weapon/stock_parts/manipulator/P in component_parts) speed_coeff += P.rating - heal_level = (efficiency * 15) + 10 + heal_level = min((efficiency * 15) + 10, 100) //The return of data disks?? Just for transferring between genetics machine/cloning machine. //TO-DO: Make the genetics machine accept them. diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index 189338e14e9..19412baf4ae 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -86,6 +86,9 @@ var/shuttle_call/shuttle_calls[0] return 1 if(href_list["login"]) + if(!ishuman(usr)) + usr << "Access denied." + return var/mob/living/carbon/human/M = usr var/obj/item/card = M.get_active_hand() var/obj/item/weapon/card/id/I = (card && card.GetID())||M.wear_id||M.wear_pda diff --git a/code/game/machinery/computer/power.dm b/code/game/machinery/computer/power.dm index 50a37483526..55cf68c3234 100644 --- a/code/game/machinery/computer/power.dm +++ b/code/game/machinery/computer/power.dm @@ -14,9 +14,12 @@ /obj/machinery/computer/monitor/New() ..() power_monitor = new(src) - powernet = find_powernet() powermonitor_repository.update_cache() +/obj/machinery/computer/monitor/initialize() + ..() + powernet = find_powernet() + /obj/machinery/computer/monitor/Destroy() if (src in machines) // So the cache can properly update removeAtProcessing() @@ -27,11 +30,6 @@ ..() powermonitor_repository.update_cache() -/obj/machinery/computer/monitor/process() - if(!powernet) - powernet = find_powernet() - ..() - /obj/machinery/computer/monitor/proc/find_powernet() var/obj/structure/cable/attached = null var/turf/T = loc diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index d2ef16a903a..67839fe6fff 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -225,6 +225,14 @@ to destroy them and players will be able to make replacements. /obj/item/weapon/stock_parts/cell = 5, /obj/item/weapon/stock_parts/capacitor = 1) +/obj/item/weapon/circuitboard/emitter + name = "circuit board (Emitter)" + build_path = /obj/machinery/power/emitter + board_type = "machine" + origin_tech = "programming=4;powerstorage=5;engineering=5" + req_components = list( + /obj/item/weapon/stock_parts/micro_laser = 1, + /obj/item/weapon/stock_parts/manipulator = 1) /obj/item/weapon/circuitboard/thermomachine name = "circuit board (Freezer)" @@ -316,6 +324,68 @@ to destroy them and players will be able to make replacements. /obj/item/stack/cable_coil = 5, /obj/item/weapon/stock_parts/console_screen = 1) +/obj/item/weapon/circuitboard/gibber + name = "circuit board (Gibber)" + build_path = /obj/machinery/gibber + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + + +/obj/item/weapon/circuitboard/processor + name = "circuit board (Food processor)" + build_path = /obj/machinery/processor + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/recycler + name = "circuit board (Recycler)" + build_path = /obj/machinery/recycler + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/seed_extractor + name = "circuit board (Seed Extractor)" + build_path = /obj/machinery/seed_extractor + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/smartfridge + name = "circuit board (Smartfridge)" + build_path = /obj/machinery/smartfridge + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1) + +/obj/item/weapon/circuitboard/monkey_recycler + name = "circuit board (Monkey Recycler)" + build_path = /obj/machinery/monkey_recycler + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/matter_bin = 1, + /obj/item/weapon/stock_parts/manipulator = 1) + +/obj/item/weapon/circuitboard/holopad + name = "circuit board (AI Holopad)" + build_path = /obj/machinery/hologram/holopad + board_type = "machine" + origin_tech = "programming=1" + req_components = list( + /obj/item/weapon/stock_parts/capacitor = 1) + /obj/item/weapon/circuitboard/chem_dispenser name = "circuit board (Portable Chem Dispenser)" build_path = /obj/machinery/chem_dispenser/constructable diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 5aca702524e..4c492d20cf2 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -40,6 +40,32 @@ var/const/HOLOPAD_MODE = 0 var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. +/obj/machinery/hologram/holopad/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/holopad(null) + component_parts += new /obj/item/weapon/stock_parts/capacitor(null) + RefreshParts() + +/obj/machinery/hologram/holopad/RefreshParts() + var/holograph_range = 4 + for(var/obj/item/weapon/stock_parts/capacitor/B in component_parts) + holograph_range += 1 * B.rating + holo_range = holograph_range + +/obj/machinery/hologram/holopad/attackby(obj/item/P as obj, mob/user as mob, params) + if(default_deconstruction_screwdriver(user, "holopad_open", "holopad0", P)) + return + + if(exchange_parts(user, P)) + return + + if(default_unfasten_wrench(user, P)) + return + + default_deconstruction_crowbar(P) + + /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. if(!istype(user)) return diff --git a/code/game/machinery/kitchen/gibber.dm b/code/game/machinery/kitchen/gibber.dm index 7c08f2ebd07..00f14939a92 100644 --- a/code/game/machinery/kitchen/gibber.dm +++ b/code/game/machinery/kitchen/gibber.dm @@ -40,6 +40,14 @@ var/turf/T = get_step(src, acceptdir) if(istype(T)) lturf = T + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/gibber(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/gibber/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts. + return /obj/machinery/gibber/autogibber/process() if(!lturf || occupant || locked || dirty || operating) @@ -194,17 +202,26 @@ else src.startgibbing(user) -/obj/machinery/gibber/attackby(obj/item/weapon/grab/G as obj, mob/user as mob, params) - if(!istype(G)) - return ..() - - if(G.state < 2) - user << "You need a better grip to do that!" +/obj/machinery/gibber/attackby(obj/item/P as obj, mob/user as mob, params) + if(istype(P, /obj/item/weapon/grab)) + var/obj/item/weapon/grab/G = P + if(G.state < 2) + user << "You need a better grip to do that!" + return + move_into_gibber(user,G.affecting) + qdel(G) return - move_into_gibber(user,G.affecting) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", P)) + return - qdel(G) + if(exchange_parts(user, P)) + return + + if(default_unfasten_wrench(user, P)) + return + + default_deconstruction_crowbar(P) /obj/machinery/gibber/MouseDrop_T(mob/target, mob/user) if(usr.stat || (!ishuman(user)) || user.restrained() || user.weakened || user.stunned || user.paralysis || user.resting) diff --git a/code/game/machinery/kitchen/monkeyrecycler.dm b/code/game/machinery/kitchen/monkeyrecycler.dm index 73d79fc6f65..01b4968d909 100644 --- a/code/game/machinery/kitchen/monkeyrecycler.dm +++ b/code/game/machinery/kitchen/monkeyrecycler.dm @@ -10,9 +10,40 @@ idle_power_usage = 5 active_power_usage = 50 var/grinded = 0 + var/required_grind = 5 + var/cube_production = 1 +/obj/machinery/monkey_recycler/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/monkey_recycler(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + RefreshParts() + +/obj/machinery/monkey_recycler/RefreshParts() + var/req_grind = 5 + var/cubes_made = 1 + for(var/obj/item/weapon/stock_parts/manipulator/B in component_parts) + req_grind -= B.rating + for(var/obj/item/weapon/stock_parts/matter_bin/M in component_parts) + cubes_made = M.rating + cube_production = cubes_made + required_grind = req_grind /obj/machinery/monkey_recycler/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(default_deconstruction_screwdriver(user, "grinder_open", "grinder", O)) + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + power_change() + return + + default_deconstruction_crowbar(O) + if (src.stat != 0) //NOPOWER etc return if (istype(O, /obj/item/weapon/grab)) @@ -44,12 +75,12 @@ /obj/machinery/monkey_recycler/attack_hand(var/mob/user as mob) if (src.stat != 0) //NOPOWER etc return - if(grinded >=5) + if(grinded >= required_grind) user << "\blue The machine hisses loudly as it condenses the grinded monkey meat. After a moment, it dispenses a brand new monkey cube." playsound(src.loc, 'sound/machines/hiss.ogg', 50, 1) grinded -= 5 new /obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped(src.loc) user << "\blue The machine's display flashes that it has [grinded] monkeys worth of material left." else - user << "\red The machine needs at least 5 monkeys worth of material to produce a monkey cube. It only has [grinded]." + user << "\red The machine needs at least [required_grind] monkey\s worth of material to produce a monkey cube. It only has [grinded]." return diff --git a/code/game/machinery/kitchen/processor.dm b/code/game/machinery/kitchen/processor.dm index a331175c8c7..b90affbcd6c 100644 --- a/code/game/machinery/kitchen/processor.dm +++ b/code/game/machinery/kitchen/processor.dm @@ -12,7 +12,22 @@ use_power = 1 idle_power_usage = 5 active_power_usage = 50 + var/rating_speed = 1 + var/rating_amount = 1 +/obj/machinery/processor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/processor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/processor/RefreshParts() + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + rating_amount = B.rating + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + rating_speed = M.rating //RECIPE DATUMS /datum/food_processor_process @@ -20,9 +35,10 @@ var/output var/time = 40 -/datum/food_processor_process/proc/process(loc, what) - if (src.output && loc) - new src.output(loc) +/datum/food_processor_process/proc/process_food(loc, what, obj/machinery/processor/processor) + if (src.output && loc && processor) + for(var/i = 0, i < processor.rating_amount, i++) + new src.output(loc) if (what) qdel(what) @@ -56,7 +72,7 @@ ///END OBJECT RECIPIES/// ///////////////////////// -/datum/food_processor_process/mob/process(loc, what) +/datum/food_processor_process/mob/process_food(loc, what, processor) ..() ////////////////////// @@ -66,14 +82,14 @@ input = /mob/living/carbon/slime output = null -/datum/food_processor_process/mob/slime/process(loc, what) +/datum/food_processor_process/mob/slime/process_food(loc, what, obj/machinery/processor/processor) var/mob/living/carbon/slime/S = what var/C = S.cores if(S.stat != DEAD) S.loc = loc S.visible_message("[S] crawls free of the processor!") return - for(var/i = 1, i <= C, i++) + for(var/i = 1, i <= C + processor.rating_amount, i++) new S.coretype(loc) feedback_add_details("slime_core_harvested","[replacetext(S.colour," ","_")]") ..() @@ -82,7 +98,7 @@ input = /mob/living/carbon/human/monkey output = null -/datum/food_processor_process/mob/monkey/process(loc, what) +/datum/food_processor_process/mob/monkey/process_food(loc, what, processor) var/mob/living/carbon/human/monkey/O = what if (O.client) //grief-proof O.loc = loc @@ -121,19 +137,23 @@ return 0 /obj/machinery/processor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) - if(!istype(O)) - return - - var/obj/item/what = O if(src.processing) user << "\the [src] is already processing something!" return 1 - if(src.contents.len > 0) //TODO: several items at once? several different items? - user << "Something is already in the processing chamber." - return 1 + if(default_deconstruction_screwdriver(user, "processor1", "processor", O)) + return + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + return + + default_deconstruction_crowbar(O) + + var/obj/item/what = O if (istype(O, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = O @@ -164,28 +184,28 @@ if(src.contents.len == 0) user << "\the [src] is empty." return 1 + src.processing = 1 + user.visible_message("[user] turns on [src].", \ + "You turn on [src].", \ + "You hear a food processor.") + playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) + use_power(500) + var/total_time = 0 + for(var/O in src.contents) + var/datum/food_processor_process/P = select_recipe(O) + if (!P) + log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") + continue + total_time += P.time + sleep(total_time / rating_speed) for(var/O in src.contents) var/datum/food_processor_process/P = select_recipe(O) if (!P) - log_admin("DEBUG: WARNING: The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") //-rastaf0 + log_debug("The [O] in processor([src]) does not have a suitable recipe, but it was somehow put inside of the processor anyways.") continue - - src.processing = 1 - user.visible_message(" \the [user] turns on \the [src].", \ - "You turn on \the [src].", \ - "You hear a food processor.") - - playsound(src.loc, 'sound/machines/blender.ogg', 50, 1) - var/offset = prob(50) ? -2 : 2 - animate(src, pixel_x = pixel_x + offset, time = 0.2, loop = P.time*5) //start shaking - use_power(500) - - sleep(P.time) - - pixel_x = initial(pixel_x) //return to its spot after shaking - P.process(src.loc, O) - src.processing = 0 + P.process_food(src.loc, O, src) + src.processing = 0 src.visible_message("\the [src] has finished processing.", \ "\the [src] has finished processing.", \ diff --git a/code/game/machinery/kitchen/smartfridge.dm b/code/game/machinery/kitchen/smartfridge.dm index df4a9110205..452ec6f5702 100644 --- a/code/game/machinery/kitchen/smartfridge.dm +++ b/code/game/machinery/kitchen/smartfridge.dm @@ -11,7 +11,7 @@ idle_power_usage = 5 active_power_usage = 100 flags = NOREACT - var/global/max_n_of_items = 999 // Sorry but the BYOND infinite loop detector doesn't look things over 1000. + var/max_n_of_items = 1500 var/icon_on = "smartfridge" var/icon_off = "smartfridge-off" var/icon_panel = "smartfridge-panel" @@ -22,7 +22,18 @@ var/scan_id = 1 var/is_secure = 0 var/datum/wires/smartfridge/wires = null - + +/obj/machinery/smartfridge/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/smartfridge(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + RefreshParts() + +/obj/machinery/smartfridge/RefreshParts() + for(var/obj/item/weapon/stock_parts/matter_bin/B in component_parts) + max_n_of_items = 1500 * B.rating + /obj/machinery/smartfridge/secure is_secure = 1 @@ -60,7 +71,7 @@ desc = "A refrigerated storage unit for storing medicine and chemicals." icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" - + /obj/machinery/smartfridge/medbay/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/reagent_containers/glass/)) return 1 @@ -79,7 +90,7 @@ if(istype(O,/obj/item/slime_extract)) return 1 return 0 - + /obj/machinery/smartfridge/secure/medbay name = "\improper Secure Refrigerated Medicine Storage" desc = "A refrigerated storage unit for storing medicine and chemicals." @@ -117,7 +128,7 @@ icon_state = "smartfridge" //To fix the icon in the map editor. icon_on = "smartfridge_chem" req_access_txt = "33" - + /obj/machinery/smartfridge/chemistry/accept_check(var/obj/item/O as obj) if(istype(O,/obj/item/weapon/storage/pill_bottle) || istype(O,/obj/item/weapon/reagent_containers)) return 1 @@ -162,16 +173,18 @@ ********************/ /obj/machinery/smartfridge/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(istype(O, /obj/item/weapon/screwdriver)) - playsound(user, 'sound/items/Screwdriver.ogg', 50, 1) - panel_open = !panel_open - user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel of \the [src].", "You [panel_open ? "open" : "close"] the maintenance panel of \the [src].") - overlays.Cut() - if(panel_open) - overlays += image(icon, icon_panel) - nanomanager.update_uis(src) + if(default_deconstruction_screwdriver(user, "smartfridge_open", "smartfridge", O)) return + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + power_change() + return + + default_deconstruction_crowbar(O) + if(istype(O, /obj/item/device/multitool)||istype(O, /obj/item/weapon/wirecutters)) if(panel_open) attack_hand(user) @@ -262,12 +275,12 @@ if(P.contents.len > 0) user << "Some items are refused." nanomanager.update_uis(src) - -/obj/machinery/smartfridge/secure/emag_act(user as mob) + +/obj/machinery/smartfridge/secure/emag_act(user as mob) emagged = 1 locked = -1 user << "You short out the product lock on [src]." - + /******************* * SmartFridge Menu ********************/ @@ -361,7 +374,7 @@ *************************/ /obj/machinery/smartfridge/secure/Topic(href, href_list) - if(stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) return 0 if(usr.contents.Find(src) || (in_range(src, usr) && istype(loc, /turf))) if(!allowed(usr) && !emagged && locked != -1 && href_list["vend"]) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 14c72f6ee9c..23d726a2980 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -179,8 +179,8 @@ Class Procs: //sets the use_power var and then forces an area power update /obj/machinery/proc/update_use_power(var/new_use_power) - use_power = new_use_power - + use_power = new_use_power + /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 @@ -298,7 +298,7 @@ Class Procs: /obj/machinery/Topic(href, href_list, var/nowindow = 0, var/datum/topic_state/state = default_state) if(..(href, href_list, nowindow, state)) return 1 - + handle_multitool_topic(href,href_list,usr) add_fingerprint(usr) return 0 @@ -308,7 +308,7 @@ Class Procs: /obj/machinery/proc/inoperable(var/additional_flags = 0) return (stat & (NOPOWER|BROKEN|additional_flags)) - + /obj/machinery/CanUseTopic(var/mob/user) if(!interact_offline && (stat & (NOPOWER|BROKEN))) return STATUS_CLOSE @@ -431,9 +431,13 @@ Class Procs: /obj/machinery/proc/exchange_parts(mob/user, obj/item/weapon/storage/part_replacer/W) var/shouldplaysound = 0 if(istype(W) && component_parts) - if(panel_open) + if(panel_open || W.works_from_distance) var/obj/item/weapon/circuitboard/CB = locate(/obj/item/weapon/circuitboard) in component_parts var/P + if(W.works_from_distance) + user << "Following parts detected in the machine:" + for(var/var/obj/item/C in component_parts) + user << " [C.name]" for(var/obj/item/weapon/stock_parts/A in component_parts) for(var/D in CB.req_components) if(ispath(A.type, D)) @@ -498,8 +502,8 @@ Class Procs: threatcount -= 2 if(check_access && !allowed(perp)) - threatcount += 4 - + threatcount += 4 + if(auth_weapons && !src.allowed(perp)) if(istype(perp.l_hand, /obj/item/weapon/gun) || istype(perp.l_hand, /obj/item/weapon/melee)) threatcount += 4 @@ -526,7 +530,7 @@ Class Procs: threatcount += 4 return threatcount - + /obj/machinery/proc/shock(mob/user, prb) if(inoperable()) diff --git a/code/game/machinery/poolcontroller.dm b/code/game/machinery/poolcontroller.dm index a1acb1814ff..6a865e923eb 100644 --- a/code/game/machinery/poolcontroller.dm +++ b/code/game/machinery/poolcontroller.dm @@ -81,12 +81,14 @@ //Establish that there is a mob, the mob is lying down, has no internals, species does breathe, is not a skrell/neara, and does not have NO_BREATHE if(drownee.stat != CONSCIOUS) //Mob is in critical. drownee.adjustOxyLoss(9) //Kill em quickly. - drownee << "You're quickly drowning!" //inform them that they are fucked. + add_logs(drownee, src, "drowned") + drownee.visible_message("\The [drownee] appears to be drowning!","You're quickly drowning!") //inform them that they are fucked. else if(!drownee.internal) //double check they have no internals, just in case. drownee.adjustOxyLoss(5) //5 oxyloss per cycle. + add_logs(drownee, src, "drowned") if(prob(35)) //35% chance to tell them what is going on. They should probably figure it out before then. - drownee << "You're lacking air!" //*gasp* *gasp* *gasp* *gasp* *gasp* + drownee.visible_message("\The [drownee] flails, almost like they are drowning!","You're lacking air!") //*gasp* *gasp* *gasp* *gasp* *gasp* for(var/obj/effect/decal/cleanable/decal in W) animate(decal, alpha = 10, time = 20) diff --git a/code/game/machinery/portable_turret.dm b/code/game/machinery/portable_turret.dm index 0b7907eb88f..992c5f4b37d 100644 --- a/code/game/machinery/portable_turret.dm +++ b/code/game/machinery/portable_turret.dm @@ -54,6 +54,9 @@ var/wrenching = 0 var/last_target //last target fired at, prevents turrets from erratically firing at all valid targets in range + var/screen = 0 // Screen 0: main control, screen 1: access levels + var/one_access = 0 // Determines if access control is set to req_one_access or req_access + /obj/machinery/porta_turret/centcom enabled = 0 ailock = 1 @@ -74,7 +77,8 @@ if(req_access && req_access.len) req_access.Cut() req_one_access = list(access_security, access_heads) - + one_access = 1 + //Sets up a spark system spark_system = new /datum/effect/effect/system/spark_spread spark_system.set_up(5, 0, src) @@ -87,6 +91,7 @@ if(req_one_access && req_one_access.len) req_one_access.Cut() req_access = list(access_cent_specops) + one_access = 0 /obj/machinery/porta_turret/proc/setup() var/obj/item/weapon/gun/energy/E = installation //All energy-based weapons are applicable @@ -106,16 +111,9 @@ iconholder = 1 eprojectile = /obj/item/projectile/beam -// if(/obj/item/weapon/gun/energy/laser/practice/sc_laser) -// iconholder = 1 -// eprojectile = /obj/item/projectile/beam - if(/obj/item/weapon/gun/energy/laser/retro) iconholder = 1 -// if(/obj/item/weapon/gun/energy/retro/sc_retro) -// iconholder = 1 - if(/obj/item/weapon/gun/energy/laser/captain) iconholder = 1 @@ -198,6 +196,7 @@ var/list/turret_icons /obj/machinery/porta_turret/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] data["access"] = !isLocked(user) + data["screen"] = screen data["locked"] = locked data["enabled"] = enabled data["is_lethal"] = 1 @@ -212,10 +211,23 @@ var/list/turret_icons settings[++settings.len] = list("category" = "Check Access Authorization", "setting" = "check_access", "value" = check_access) settings[++settings.len] = list("category" = "Check Misc. Lifeforms", "setting" = "check_anomalies", "value" = check_anomalies) data["settings"] = settings - + + data["one_access"] = one_access + var/accesses[0] + var/list/access_list = get_all_accesses() + for (var/access in access_list) + var/name = get_access_desc(access) + var/active + if(one_access) + active = (access in req_one_access) + else + active = (access in req_access) + accesses[++accesses.len] = list("name" = name, "active" = active, "number" = access) + data["accesses"] = accesses + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) - ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 300) + ui = new(user, src, ui_key, "turret_control.tmpl", "Turret Controls", 500, 320) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -246,6 +258,8 @@ var/list/turret_icons var/value = text2num(href_list["value"]) if(href_list["command"] == "enable") enabled = value + else if(href_list["command"] == "screen") + screen = value else if(href_list["command"] == "lethal") lethal = value else if(href_list["command"] == "check_synth") @@ -261,8 +275,40 @@ var/list/turret_icons else if(href_list["command"] == "check_anomalies") check_anomalies = value - return 1 + if(href_list["one_access"]) + toggle_one_access(href_list["one_access"]) + + if(href_list["access"]) + toggle_access(href_list["access"]) + return 1 + +/obj/machinery/porta_turret/proc/toggle_one_access(var/access) + one_access = text2num(access) + + if(one_access == 1) + req_one_access = req_access.Copy() + req_access.Cut() + else if(one_access == 0) + req_access = req_one_access.Copy() + req_one_access.Cut() + +/obj/machinery/porta_turret/proc/toggle_access(var/access) + var/required = text2num(access) + if(!(required in get_all_accesses())) + return + + if(one_access) + if((required in req_one_access)) + req_one_access -= required + else + req_one_access += required + else + if((required in req_access)) + req_access -= required + else + req_access += required + /obj/machinery/porta_turret/power_change() if(powered()) stat &= ~NOPOWER @@ -325,8 +371,7 @@ var/list/turret_icons update_icon() wrenching = 0 - else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) - //Behavior lock/unlock mangement + else if(istype(I, /obj/item/weapon/card/id) || istype(I, /obj/item/device/pda)) if(allowed(user)) locked = !locked user << "Controls are now [locked ? "locked" : "unlocked"]." diff --git a/code/game/machinery/recycler.dm b/code/game/machinery/recycler.dm index e9c2bd18fc4..eaa87fbea28 100644 --- a/code/game/machinery/recycler.dm +++ b/code/game/machinery/recycler.dm @@ -17,8 +17,16 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/New() // On us ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/recycler(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() update_icon() +/obj/machinery/recycler/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts. + return + /obj/machinery/recycler/examine() set src in view() ..() @@ -32,14 +40,21 @@ var/const/SAFETY_COOLDOWN = 100 /obj/machinery/recycler/attackby(var/obj/item/I, var/mob/user, params) - if(istype(I, /obj/item/weapon/screwdriver) && emagged) - emagged = 0 - update_icon() - user << "You reset the crusher to its default factory settings." - else - ..() + if(default_deconstruction_screwdriver(user, "grinder-oOpen", "grinder-o0", I)) + if(!panel_open) + update_icon() return + + if(exchange_parts(user, I)) + return + + if(default_unfasten_wrench(user, I)) + return + + default_deconstruction_crowbar(I) + ..() add_fingerprint(user) + return /obj/machinery/recycler/emag_act(user as mob) if(!emagged) @@ -69,6 +84,8 @@ var/const/SAFETY_COOLDOWN = 100 return if(safety_mode) return + if(!anchored) + return // If we're not already grinding something. if(!grinding) grinding = 1 @@ -152,7 +169,37 @@ var/const/SAFETY_COOLDOWN = 100 else if(emagged == 1) L.adjustBruteLoss(1000) +/obj/machinery/recycler/verb/rotate() + set name = "Rotate Clockwise" + set category = "Object" + set src in oview(1) + var/mob/living/user = usr + + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) + usr << "[src] is fastened to the floor!" + return 0 + eat_dir = turn(eat_dir, 270) + user << "[src] will now accept items from [dir2text(eat_dir)]." + return 1 + +/obj/machinery/recycler/verb/rotateccw() + set name = "Rotate Counter Clockwise" + set category = "Object" + set src in oview(1) + + var/mob/living/user = usr + + if(usr.stat || !usr.canmove || usr.restrained()) + return + if (src.anchored) + usr << "[src] is fastened to the floor!" + return 0 + eat_dir = turn(eat_dir, 90) + user << "[src] will now accept items from [dir2text(eat_dir)]." + return 1 /obj/item/weapon/paper/recycler name = "paper - 'garbage duty instructions'" diff --git a/code/game/machinery/seed_extractor.dm b/code/game/machinery/seed_extractor.dm index 913464b8295..ccdb43d5522 100644 --- a/code/game/machinery/seed_extractor.dm +++ b/code/game/machinery/seed_extractor.dm @@ -1,13 +1,35 @@ /obj/machinery/seed_extractor name = "seed extractor" desc = "Extracts and bags seeds from produce." - icon = 'icons/obj/hydroponics.dmi' + icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "sextractor" density = 1 anchored = 1 +/obj/machinery/seed_extractor/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/seed_extractor(null) + component_parts += new /obj/item/weapon/stock_parts/matter_bin(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/seed_extractor/RefreshParts() //If you want to make the machine upgradable, this is where you would change any vars basd on its stock parts. + return + obj/machinery/seed_extractor/attackby(var/obj/item/O as obj, var/mob/user as mob, params) + if(default_deconstruction_screwdriver(user, "sextractor_open", "sextractor", O)) + return + + if(exchange_parts(user, O)) + return + + if(default_unfasten_wrench(user, O)) + return + + default_deconstruction_crowbar(O) + // Fruits and vegetables. if(istype(O, /obj/item/weapon/reagent_containers/food/snacks/grown) || istype(O, /obj/item/weapon/grown)) diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 5dad4ba1170..4cfdc0a6c29 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -1246,11 +1246,15 @@ icon_state = "crittercare" products = list(/obj/item/clothing/accessory/petcollar = 5, /obj/item/weapon/fish_net = 5, /obj/item/weapon/fishfood = 5, /obj/item/weapon/tank_brush = 5, /obj/item/weapon/egg_scoop = 5, /obj/item/fish_eggs/goldfish = 5, - /obj/item/fish_eggs/clownfish = 5, /obj/item/fish_eggs/shark = 5, /obj/item/toy/pet_rock = 5, + /obj/item/fish_eggs/clownfish = 5, /obj/item/fish_eggs/shark = 5, /obj/item/fish_eggs/feederfish = 10, + /obj/item/fish_eggs/salmon = 5, /obj/item/fish_eggs/catfish = 5, /obj/item/fish_eggs/glofish = 5, + /obj/item/fish_eggs/electric_eel = 5, /obj/item/fish_eggs/shrimp = 10, /obj/item/toy/pet_rock = 5, ) prices = list(/obj/item/clothing/accessory/petcollar = 50, /obj/item/weapon/fish_net = 15, /obj/item/weapon/fishfood = 15, /obj/item/weapon/tank_brush = 15, /obj/item/weapon/egg_scoop = 15, /obj/item/fish_eggs/goldfish = 10, - /obj/item/fish_eggs/clownfish = 10, /obj/item/fish_eggs/shark = 10, /obj/item/toy/pet_rock = 100, + /obj/item/fish_eggs/clownfish = 10, /obj/item/fish_eggs/shark = 10, /obj/item/fish_eggs/feederfish = 5, + /obj/item/fish_eggs/salmon = 10, /obj/item/fish_eggs/catfish = 10, /obj/item/fish_eggs/glofish = 10, + /obj/item/fish_eggs/electric_eel = 10, /obj/item/fish_eggs/shrimp = 5, /obj/item/toy/pet_rock = 100, ) contraband = list(/obj/item/fish_eggs/babycarp = 5) premium = list(/obj/item/toy/pet_rock/fred = 1, /obj/item/toy/pet_rock/roxie = 1) diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index 4b69fd2dd6d..e44fb712774 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -289,6 +289,7 @@ values["powerconnected"] = 1 values["poweravail"] = powmonitor.powernet.avail values["powerload"] = num2text(powmonitor.powernet.viewload,10) + values["powerdemand"] = powmonitor.powernet.load values["apcs"] = apc_repository.apc_data(powmonitor) else values["powerconnected"] = 0 diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 1f1b362078d..f5e559eed91 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -1,7 +1,7 @@ /obj/item/device/pizza_bomb name = "pizza box" desc = "A box suited for pizzas." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "pizzabox1" var/timer = 10 //Adjustable timer var/timer_set = 0 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 1756935eacb..1bde9648905 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -85,6 +85,19 @@ ..() charge = 0 +/obj/item/weapon/stock_parts/cell/bluespace + name = "bluespace power cell" + origin_tech = "powerstorage=7" + icon_state = "bscell" + maxcharge = 40000 + g_amt = 80 + rating = 6 + construction_cost = list("metal"=800,"gold"=300,"silver"=300,"glass"=160,"diamond"=160) + +/obj/item/weapon/stock_parts/cell/bluespace/empty/New() + ..() + charge = 0 + /obj/item/weapon/stock_parts/cell/infinite name = "infinite-capacity power cell!" icon_state = "icell" diff --git a/code/game/objects/items/weapons/stock_parts.dm b/code/game/objects/items/weapons/stock_parts.dm index 758486872a4..94c3fcc75f7 100644 --- a/code/game/objects/items/weapons/stock_parts.dm +++ b/code/game/objects/items/weapons/stock_parts.dm @@ -16,10 +16,40 @@ display_contents_with_number = 1 max_w_class = 3 max_combined_w_class = 100 + var/works_from_distance = 0 + var/primary_sound = 'sound/items/rped.ogg' + var/alt_sound = null + +/obj/item/weapon/storage/part_replacer/afterattack(obj/machinery/T as obj, mob/living/carbon/human/user as mob, flag, params) + if(flag) + return + else + if(works_from_distance) + if(istype(T)) + if(T.component_parts) + T.exchange_parts(user, src) + user.Beam(T,icon_state="rped_upgrade",icon='icons/effects/effects.dmi',time=5) + return + +/obj/item/weapon/storage/part_replacer/bluespace + name = "bluespace rapid part exchange device" + desc = "A version of the RPED that allows for replacement of parts and scanning from a distance, along with higher capacity for parts." + icon_state = "BS_RPED" + item_state = "BS_RPED" + w_class = 3 + storage_slots = 400 + max_w_class = 3 + max_combined_w_class = 800 + works_from_distance = 1 + primary_sound = 'sound/items/PSHOOM.ogg' + alt_sound = 'sound/items/PSHOOM_2.ogg' /obj/item/weapon/storage/part_replacer/proc/play_rped_sound() //Plays the sound for RPED exchanging or installing parts. - playsound(src, 'sound/items/rped.ogg', 40, 1) + if(alt_sound && prob(3)) + playsound(src, alt_sound, 40, 1) + else + playsound(src, primary_sound, 40, 1) //Sorts stock parts inside an RPED by their rating. //Only use /obj/item/weapon/stock_parts/ with this sort proc! @@ -174,6 +204,51 @@ rating = 3 m_amt = 80 +//Rating 4 + +/obj/item/weapon/stock_parts/capacitor/quadratic + name = "quadratic capacitor" + desc = "An capacity capacitor used in the construction of a variety of devices." + icon_state = "quadratic_capacitor" + origin_tech = "powerstorage=6;materials=5" + rating = 4 + m_amt = 50 + g_amt = 50 + +/obj/item/weapon/stock_parts/scanning_module/triphasic + name = "triphasic scanning module" + desc = "A compact, ultra resolution triphasic scanning module used in the construction of certain devices." + icon_state = "triphasic_scan_module" + origin_tech = "magnets=6" + rating = 4 + m_amt = 50 + g_amt = 20 + +/obj/item/weapon/stock_parts/manipulator/femto + name = "femto-manipulator" + desc = "A tiny little manipulator used in the construction of certain devices." + icon_state = "femto_mani" + origin_tech = "materials=6;programming=3" + rating = 4 + m_amt = 30 + +/obj/item/weapon/stock_parts/micro_laser/quadultra + name = "quad-ultra micro-laser" + icon_state = "quadultra_micro_laser" + desc = "A tiny laser used in certain devices." + origin_tech = "magnets=6" + rating = 4 + m_amt = 10 + g_amt = 20 + +/obj/item/weapon/stock_parts/matter_bin/bluespace + name = "bluespace matter bin" + desc = "A container for hold compressed matter awaiting re-construction." + icon_state = "bluespace_matter_bin" + origin_tech = "materials=6" + rating = 4 + m_amt = 80 + // Subspace stock parts /obj/item/weapon/stock_parts/subspace/ansible diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 9f31926c54c..bc69a54bc3d 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -356,7 +356,7 @@ */ /obj/item/weapon/storage/bag/tray name = "tray" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "tray" desc = "A metal tray to lay food on." force = 5 diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 65ebe415ada..aae00e3c793 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -367,7 +367,7 @@ /obj/item/weapon/storage/box/monkeycubes name = "monkey cube box" desc = "Drymate brand monkey cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube") @@ -378,7 +378,7 @@ /obj/item/weapon/storage/box/farwacubes name = "farwa cube box" desc = "Drymate brand farwa cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/farwacube") @@ -390,7 +390,7 @@ /obj/item/weapon/storage/box/stokcubes name = "stok cube box" desc = "Drymate brand stok cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list("/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/stokcube") @@ -402,7 +402,7 @@ /obj/item/weapon/storage/box/neaeracubes name = "neaera cube box" desc = "Drymate brand neaera cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/neaeracube") @@ -415,7 +415,7 @@ /obj/item/weapon/storage/box/wolpincubes name = "wolpin cube box" desc = "Drymate brand wolpin cubes. Just add water!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "monkeycubebox" storage_slots = 7 can_hold = list("/obj/item/weapon/reagent_containers/food/snacks/monkeycube/wrapped/wolpincube") diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 200115be01d..bdb1e497caa 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -14,7 +14,7 @@ */ /obj/item/weapon/storage/fancy/ - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "donutbox6" name = "donut box" var/icon_type = "donut" @@ -43,7 +43,7 @@ */ /obj/item/weapon/storage/fancy/donut_box - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "donutbox6" icon_type = "donut" name = "donut box" @@ -62,7 +62,7 @@ */ /obj/item/weapon/storage/fancy/egg_box - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "eggbox" icon_type = "egg" name = "egg box" diff --git a/code/game/objects/items/weapons/vending_items.dm b/code/game/objects/items/weapons/vending_items.dm index 306d0ba890a..8387e556fda 100644 --- a/code/game/objects/items/weapons/vending_items.dm +++ b/code/game/objects/items/weapons/vending_items.dm @@ -81,4 +81,4 @@ /obj/item/weapon/vending_refill/crittercare machine_name = "CritterCare" icon_state = "refill_pet" - charges = 17// of 54 + charges = 31// of 94 diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm index 847c4179d8f..d14767891fe 100644 --- a/code/game/supplyshuttle.dm +++ b/code/game/supplyshuttle.dm @@ -461,7 +461,7 @@ var/list/mechtoys = list( return /obj/machinery/computer/supplycomp/attack_hand(var/mob/user as mob) - if(!allowed(user)) + if(!allowed(user) && !isobserver(user)) user << "\red Access Denied." return diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 341bdd8f308..488eb2c50c5 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -150,7 +150,8 @@ var/list/admin_verbs_debug = list( /client/proc/debugNatureMapGenerator, /client/proc/check_bomb_impacts, /client/proc/test_movable_UI, - /client/proc/test_snap_UI + /client/proc/test_snap_UI, + /proc/machine_upgrade ) var/list/admin_verbs_possess = list( /proc/possess, @@ -203,7 +204,7 @@ var/list/admin_verbs_mentor = list( if(holder.rights & R_SPAWN) verbs += admin_verbs_spawn if(holder.rights & R_MOD) verbs += admin_verbs_mod if(holder.rights & R_MENTOR) verbs += admin_verbs_mentor - + /client/proc/remove_admin_verbs() verbs.Remove( admin_verbs_default, @@ -244,7 +245,7 @@ var/list/admin_verbs_mentor = list( add_admin_verbs() src << "All of your adminverbs are now visible." - feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + feedback_add_details("admin_verb","TAVVS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! /client/proc/admin_ghost() set category = "Admin" @@ -576,7 +577,7 @@ var/list/admin_verbs_mentor = list( deadmins += ckey src << "You are now a normal player." feedback_add_details("admin_verb","DAS") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! - + /client/proc/readmin() set name = "Re-admin self" set category = "Admin" diff --git a/code/modules/admin/machine_upgrade.dm b/code/modules/admin/machine_upgrade.dm new file mode 100644 index 00000000000..9f2039fdd0f --- /dev/null +++ b/code/modules/admin/machine_upgrade.dm @@ -0,0 +1,10 @@ +/proc/machine_upgrade(obj/machinery/M in world) + set name = "Tweak Component Ratings" + set category = "Debug" + var/new_rating = input("Enter new rating:","Num") as num + if(new_rating && M.component_parts) + for(var/obj/item/weapon/stock_parts/P in M.component_parts) + P.rating = new_rating + M.RefreshParts() + + feedback_add_details("admin_verb","MU") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index ca47ab1afc7..e7c77f639f3 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -125,13 +125,13 @@ obj/machinery/gateway/centerstation/process() if(!awaygate) return if(awaygate.calibrated) - M.loc = get_step(awaygate.loc, SOUTH) + M.forceMove(get_step(awaygate.loc, SOUTH)) M.dir = SOUTH return else var/obj/effect/landmark/dest = pick(awaydestinations) if(dest) - M.loc = dest.loc + M.forceMove(dest.loc) M.dir = SOUTH use_power(5000) return @@ -230,7 +230,7 @@ obj/machinery/gateway/centerstation/process() if(E.imp_in == M)//Checking that it's actually implanted vs just in their pocket M << "\black The station gate has detected your exile implant and is blocking your entry." return - M.loc = get_step(stationgate.loc, SOUTH) + M.forceMove(get_step(stationgate.loc, SOUTH)) M.dir = SOUTH @@ -242,4 +242,5 @@ obj/machinery/gateway/centerstation/process() else user << "Recalibration successful!: \black This gate's systems have been fine tuned. Travel to this gate will now be on target." calibrated = 1 - return \ No newline at end of file + return + \ No newline at end of file diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 0a1d3c49aba..92ce44bdac3 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -1,6 +1,7 @@ /obj/item/clothing/under/pants gender = PLURAL body_parts_covered = LOWER_TORSO|LEGS + displays_id = 0 /obj/item/clothing/under/pants/classicjeans name = "classic jeans" diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index f5280399838..76ff9f42d7a 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -3,6 +3,7 @@ desc = "95% Polyester, 5% Spandex!" gender = PLURAL body_parts_covered = LOWER_TORSO + displays_id = 0 /obj/item/clothing/under/shorts/red icon_state = "redshorts" diff --git a/code/modules/fish/fish_eggs.dm b/code/modules/fish/fish_eggs.dm index 902616755dd..e4283718a53 100644 --- a/code/modules/fish/fish_eggs.dm +++ b/code/modules/fish/fish_eggs.dm @@ -14,7 +14,13 @@ var/global/list/fish_eggs_list = list("dud" = /obj/item/fish_eggs, "goldfish" = /obj/item/fish_eggs/goldfish, "clownfish" = /obj/item/fish_eggs/clownfish, "shark" = /obj/item/fish_eggs/shark, - "babycarp" = /obj/item/fish_eggs/babycarp, + "baby space carp" = /obj/item/fish_eggs/babycarp, + "catfish" = /obj/item/fish_eggs/catfish, + "feederfish" = /obj/item/fish_eggs/feederfish, + "salmon" = /obj/item/fish_eggs/salmon, + "shrimp" = /obj/item/fish_eggs/shrimp, + "electric eel" = /obj/item/fish_eggs/electric_eel, + "glofish" = /obj/item/fish_eggs/glofish, ) /obj/item/fish_eggs/goldfish @@ -39,4 +45,41 @@ var/global/list/fish_eggs_list = list("dud" = /obj/item/fish_eggs, name = "baby space carp eggs" desc = "Eggs from the substantially smaller form of the intergalactic terror." icon_state = "babycarp_eggs" - fish_type = "babycarp" + fish_type = "baby space carp" + +/obj/item/fish_eggs/catfish + name = "catfish eggs" + desc = "A bottom-feeding species noted for their similarity to cats and Tajaran." + icon_state = "catfish_eggs" + fish_type = "catfish" + +/obj/item/fish_eggs/feederfish + name = "feeder fish eggs" + desc = "These generic fish are commonly found being eaten by larger fish." + icon_state = "feederfish_eggs" + fish_type = "feederfish" + +/obj/item/fish_eggs/salmon + name = "salmon eggs" + desc = "A collection of salmon eggs." + icon_state = "salmon_eggs" + fish_type = "salmon" + +/obj/item/fish_eggs/shrimp + name = "shrimp eggs" + desc = "Eggs for shrimp. You figured they'd be smaller though..." + icon_state = "shrimp_eggs" + fish_type = "shrimp" + +/obj/item/fish_eggs/electric_eel + name = "electric eel eggs" + desc = "A pile of eggs for a slimy, shocking, sea-serpent." + icon_state = "electric_eel_eggs" + fish_type = "electric eel" + +/obj/item/fish_eggs/glofish + name = "glofish eggs" + desc = "A cluster of bright neon eggs belonging to a bio-luminescent species of fish." + icon_state = "glofish_eggs" + fish_type = "glofish" + diff --git a/code/modules/fish/fish_items.dm b/code/modules/fish/fish_items.dm index 08254a072be..5442e5c7cb0 100644 --- a/code/modules/fish/fish_items.dm +++ b/code/modules/fish/fish_items.dm @@ -1,4 +1,21 @@ +var/global/list/fish_items_list = list("goldfish" = /obj/item/weapon/fish/goldfish, + "clownfish" = /obj/item/weapon/bananapeel/clownfish, + "shark" = /obj/item/weapon/fish/shark, + "baby space carp" = /obj/item/weapon/fish/babycarp, + "catfish" = /obj/item/weapon/fish/catfish, + "feederfish" = /obj/item/weapon/reagent_containers/food/snacks/feederfish, + "salmon" = /obj/item/weapon/fish/salmon, + "shrimp" = /obj/item/weapon/reagent_containers/food/snacks/shrimp, + "electric eel" = /obj/item/weapon/fish/electric_eel, + "glofish" = /obj/item/weapon/fish/glofish +, + ) + +////////////////////////////////////////////// +// Aquarium Supplies // +////////////////////////////////////////////// + /obj/item/weapon/egg_scoop name = "fish egg scoop" desc = "A small scoop to collect fish eggs with." @@ -50,3 +67,138 @@ suicide_act(mob/user) viewers(user) << "[user] is vigorously scrubbing \himself raw with the [src.name]! It looks like \he's trying to commit suicide." return(BRUTELOSS|FIRELOSS) + +////////////////////////////////////////////// +// Fish Items // +////////////////////////////////////////////// + +/obj/item/weapon/reagent_containers/food/snacks/shrimp + name = "shrimp" + desc = "A single raw shrimp." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "shrimp_raw" + filling_color = "#FF1C1C" + + New() + ..() + desc = pick("Anyway, like I was sayin', shrimp is the fruit of the sea.", "You can barbecue it, boil it, broil it, bake it, saute it.") + reagents.add_reagent("protein", 1) + src.bitesize = 1 + +/obj/item/weapon/reagent_containers/food/snacks/feederfish + name = "shrimp" + desc = "A tiny feeder fish. Sure doesn't look very filling..." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "feederfish" + filling_color = "#FF1C1C" + + New() + ..() + reagents.add_reagent("protein", 1) + src.bitesize = 1 + +/obj/item/weapon/fish + name = "fish" + desc = "A generic fish" + icon = 'icons/obj/fish_items.dmi' + icon_state = "fish" + throwforce = 1 + w_class = 2.0 + throw_speed = 3 + throw_range = 7 + force = 1 + attack_verb = list("slapped", "humiliated", "hit", "rubbed") + hitsound = 'sound/effects/snap.ogg' + +/obj/item/weapon/fish/glofish + name = "glofish" + desc = "A small bio-luminescent fish. Not very bright, but at least it's pretty!" + icon_state = "glofish" + +/obj/item/weapon/fish/glofish/New() + ..() + set_light(2,1,"#99FF66") + +/obj/item/weapon/fish/electric_eel + name = "electric eel" + desc = "An eel capable of producing a mild electric shock. Luckily it's rather weak out of water." + icon_state = "electric_eel" + +/obj/item/weapon/fish/shark + name = "shark" + desc = "Warning: Keep away from tornadoes." + icon_state = "shark" + hitsound = 'sound/weapons/bite.ogg' + force = 3 + +/obj/item/weapon/fish/shark/attackby(var/obj/item/O, var/mob/user as mob) + if(istype(O, /obj/item/weapon/wirecutters)) + user << "You rip out the teeth of \the [src.name]!" + new /obj/item/weapon/fish/toothless_shark(get_turf(src)) + new /obj/item/weapon/shard/shark_teeth(get_turf(src)) + qdel(src) + return + ..() + +/obj/item/weapon/fish/toothless_shark + name = "toothless shark" + desc = "Looks like someone ripped it's teeth out!" + hitsound = 'sound/effects/snap.ogg' + +/obj/item/weapon/shard/shark_teeth + name = "shark teeth" + desc = "A number of teeth, supposedly from a shark." + icon = 'icons/obj/fish_items.dmi' + icon_state = "teeth" + force = 2.0 + throwforce = 5.0 + g_amt = 0 + +/obj/item/weapon/fish/catfish + name = "catfish" + desc = "Apparently, catfish don't purr like you might have expected them to. Such a confusing name!" + icon_state = "catfish" + +/obj/item/weapon/fish/catfish/attackby(var/obj/item/O, var/mob/user as mob) + if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch) || istype(O, /obj/item/weapon/scalpel) || istype(O, /obj/item/weapon/kitchen/utensil/knife)) + user << "You carefully clean and gut \the [src.name]." + new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) + new /obj/item/weapon/reagent_containers/food/snacks/catfishmeat(get_turf(src)) + qdel(src) + return + ..() + +/obj/item/weapon/fish/goldfish + name = "goldfish" + desc = "A goldfish, just like the one you never won at the county fair." + icon_state = "goldfish" + +/obj/item/weapon/fish/salmon + name = "salmon" + desc = "The second-favorite food of Space Bears, right behind crew members." + icon_state = "salmon" + +/obj/item/weapon/fish/salmon/attackby(var/obj/item/O, var/mob/user as mob) + if(istype(O, /obj/item/weapon/kitchenknife) || istype(O, /obj/item/weapon/butch) || istype(O, /obj/item/weapon/scalpel) || istype(O, /obj/item/weapon/kitchen/utensil/knife)) + user << "You carefully clean and gut \the [src.name]." + new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) + new /obj/item/weapon/reagent_containers/food/snacks/salmonmeat(get_turf(src)) + qdel(src) + return + ..() + +/obj/item/weapon/fish/babycarp + name = "baby space carp" + desc = "Substantially smaller than the space carp lurking outside the hull, but still unsettling." + icon_state = "babycarp" + hitsound = 'sound/weapons/bite.ogg' + force = 3 + +/obj/item/weapon/bananapeel/clownfish + name = "clown fish" + desc = "Even underwater, you cannot escape HONKing." + icon = 'icons/obj/fish_items.dmi' + icon_state = "clownfish" + throwforce = 1 + force = 1 + attack_verb = list("slapped", "humiliated", "hit", "rubbed") diff --git a/code/modules/fish/fishtank.dm b/code/modules/fish/fishtank.dm index 108242809f6..977af3a2fed 100644 --- a/code/modules/fish/fishtank.dm +++ b/code/modules/fish/fishtank.dm @@ -212,8 +212,11 @@ check_food_level() if(water_level > 0) //Don't dirty the tank if it has no water - if(filth_level < 10 && prob(25)) //Chance for the tank to get dirtier if the filth_level isn't 10 - if(ate_food && prob(30)) //If they ate this cycle, there is an additional chance they make a bigger mess + if(fish_count == 0) //If the tank has no fish, algae growth can occur + if(filth_level < 7.5 && prob(15)) //Algae growth is a low chance and cannot exceed filth_level of 7.5 + filth_level += 0.05 //Algae growth is slower than fish filth build-up + else if(filth_level < 10 && prob(10)) //Chance for the tank to get dirtier if the filth_level isn't 10 + if(ate_food && prob(25)) //If they ate this cycle, there is an additional chance they make a bigger mess filth_level += fish_count * 0.1 else //If they didn't make the big mess, make a little one filth_level += 0.1 @@ -235,17 +238,22 @@ ////////////////////////////// /obj/machinery/fishtank/proc/handle_special_interactions() + var/glo_light = 0 for(var/fish in fish_list) switch(fish) if("catfish") //Catfish have a small chance of cleaning some filth since they are a bottom-feeder - if((filth_level > 0) && prob(25)) + if((filth_level > 0) && prob(30)) filth_level -= 0.1 if("feederfish") //Feeder fish have a small chance of sacrificing themselves to produce some food if(fish_count < 2) //Don't sacrifice the last fish, there's nothing to eat it continue - if(food_level <= 7.5 && prob(25)) + if(food_level <= 5 && prob(25)) kill_fish("feederfish") //Kill the fish to reflect it's sacrifice, but don't increase the filth_level food_level += 1 //The corpse became food for the other fish, ecology at it's finest + if("glofish") + glo_light++ + if(!light_switch && (glo_light > 0)) + set_light(2,glo_light,"#99FF66") check_food_level() check_filth_level() check_water_level() @@ -330,6 +338,22 @@ egg_list.Cut() //Destroy any excess eggs, clearing the egg_list +/obj/machinery/fishtank/proc/harvest_fish(var/mob/user) + if(!fish_count) //Can't catch non-existant fish! + usr << "There are no fish in \the [src] to catch!" + return + + var/caught_fish + caught_fish = input("Select a fish to catch.", "Fishing", caught_fish) in fish_list //Select a fish from the tank + if(caught_fish) + var/dead_fish = null + dead_fish = fish_items_list[caught_fish] //Locate the appropriate fish_item for the caught fish + if(!dead_fish) //No fish_item found, possibly due to typo or not being listed. Do nothing. + return + kill_fish(caught_fish) //Kill the caught fish from the tank + user.visible_message("[user.name] harvests \a [caught_fish] from \the [src].", "You scoop \a [caught_fish] out of \the [src].") + new dead_fish(get_turf(user)) //Spawn the appropriate fish_item at the user's feet. + /obj/machinery/fishtank/proc/destroy(var/deconstruct = 0) var/turf/T = get_turf(src) //Store the tank's turf for atmos updating after deletion of tank if(!deconstruct) //Check if we are deconstructing or breaking the tank @@ -680,13 +704,7 @@ return //Fish net if(istype(O, /obj/item/weapon/fish_net)) - if(fish_count > 0) - var/caught_fish = pick(fish_list) - usr << "You catch and remove a [caught_fish] from \the [src]." - kill_fish(caught_fish) - //TODO: Fish object spawning, need to get sprites before I can code the fish objects - else - usr << "There are no fish in \the [src] to catch!" + harvest_fish(user) return //Tank brush if(istype(O, /obj/item/weapon/tank_brush)) diff --git a/code/modules/food/cooker.dm b/code/modules/food/cooker.dm index 30e2dac9ac7..7512209fc1b 100644 --- a/code/modules/food/cooker.dm +++ b/code/modules/food/cooker.dm @@ -14,26 +14,26 @@ var/firechance = 0 var/cooktime = 0 var/foodcolor = null - + var/has_specials = 0 //Set to 1 if the machine has specials to check, otherwise leave it at 0 // checks if the snack has been cooked in a certain way -obj/machinery/cooker/proc/checkCooked(obj/item/weapon/reagent_containers/food/snacks/D) +/obj/machinery/cooker/proc/checkCooked(obj/item/weapon/reagent_containers/food/snacks/D) if (D.cooktype[thiscooktype]) return 1 return 0 // Sets the new snack's cooktype list to the same as the old one - no more cooking something in the same machine more than once! -obj/machinery/cooker/proc/setCooked(obj/item/weapon/reagent_containers/food/snacks/oldtypes, obj/item/weapon/reagent_containers/food/snacks/newtypes) +/obj/machinery/cooker/proc/setCooked(obj/item/weapon/reagent_containers/food/snacks/oldtypes, obj/item/weapon/reagent_containers/food/snacks/newtypes) var/ct for(ct in oldtypes.cooktype) newtypes.cooktype[ct] = oldtypes.cooktype[ct] // transfers reagents -obj/machinery/cooker/proc/setRegents(obj/item/weapon/reagent_containers/OldReg, obj/item/weapon/reagent_containers/NewReg) +/obj/machinery/cooker/proc/setRegents(obj/item/weapon/reagent_containers/OldReg, obj/item/weapon/reagent_containers/NewReg) OldReg.reagents.trans_to(NewReg, OldReg.reagents.total_volume) // check if you can put it in the machine -obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user) +/obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user) if(on) user << "[src] is still active!" return 0 @@ -42,13 +42,13 @@ obj/machinery/cooker/proc/checkValid(obj/item/check, mob/user) user << "You can only process food!" return 0 -obj/machinery/cooker/proc/setIcon(obj/item/copyme, obj/item/copyto) +/obj/machinery/cooker/proc/setIcon(obj/item/copyme, obj/item/copyto) copyto.color = foodcolor copyto.icon = copyme.icon copyto.icon_state = copyme.icon_state copyto.overlays += copyme.overlays -obj/machinery/cooker/proc/turnoff(obj/item/olditem) +/obj/machinery/cooker/proc/turnoff(obj/item/olditem) icon_state = officon playsound(loc, 'sound/machines/ding.ogg', 50, 1) on = 0 @@ -58,7 +58,7 @@ obj/machinery/cooker/proc/turnoff(obj/item/olditem) // Burns the food with a chance of starting a fire - for if you try cooking something that's already been cooked that way // if burns = 0 then it'll just tell you that the item is already that foodtype and it would do nothing // if you wanted a different side effect set burns to 1 and override burn() -obj/machinery/cooker/proc/burn(mob/user, obj/item/weapon/reagent_containers/props) +/obj/machinery/cooker/proc/burn(mob/user, obj/item/weapon/reagent_containers/props) var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/burnt = new(get_turf(src)) setRegents(props, burnt) user << "You smell burning coming from the [src]!" @@ -74,11 +74,11 @@ obj/machinery/cooker/proc/burn(mob/user, obj/item/weapon/reagent_containers/prop location.hotspot_expose(700, 50, 1) //TODO have a chance of setting the tile on fire -obj/machinery/cooker/proc/changename(obj/item/name, obj/item/setme) +/obj/machinery/cooker/proc/changename(obj/item/name, obj/item/setme) setme.name = "[thiscooktype] [name.name]" setme.desc = "[name.desc]. It has been [thiscooktype]" -obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef) +/obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef) icon_state = onicon chef << "You put [tocook] into [src]." on = 1 @@ -86,11 +86,11 @@ obj/machinery/cooker/proc/putIn(obj/item/tocook, mob/chef) tocook.loc = src // Override this with the correct snack type -obj/machinery/cooker/proc/gettype() +/obj/machinery/cooker/proc/gettype() var/obj/item/weapon/reagent_containers/food/snacks/type = new(get_turf(src)) return type -obj/machinery/cooker/attackby(obj/item/I, mob/user, params) +/obj/machinery/cooker/attackby(obj/item/I, mob/user, params) if(stat & (NOPOWER|BROKEN)) return if (!checkValid(I, user)) @@ -103,6 +103,14 @@ obj/machinery/cooker/attackby(obj/item/I, mob/user, params) putIn(I, user) sleep(cooktime) if(I && I.loc == src) + //New interaction to allow special foods to be made/cooked via deepfryer without removing original functionality + //Define the foods/results on the specific machine --FalseIncarnate + if(has_specials) //Checks if the machine has any special recipes that should be checked + var/special = checkSpecials(I) //Checks if the inserted item is one of the specials + if(special) //If the inserted item is not special, it will skip this and run normally + cookSpecial(special) //Handle cooking the item as appropriate + turnoff(I) //Shut off the machine and qdel the original item + return if(istype(I, /obj/item/weapon/reagent_containers/food/snacks)) if(checkCooked(I)) burn(user, I) @@ -119,5 +127,12 @@ obj/machinery/cooker/attackby(obj/item/I, mob/user, params) turnoff(I) //del(I) +// MAKE SURE TO OVERRIDE THESE ON THE MACHINE IF IT HAS SPECIAL FOOD INTERACTIONS! +// FAILURE TO OVERRIDE WILL RESULT IN FAILURE TO PROPERLY HANDLE SPECIAL INTERACTIONS! --FalseIncarnate +/obj/machinery/cooker/proc/checkSpecials(obj/item/I) + if(!I) + return 0 + return 0 - +/obj/machinery/cooker/proc/cookSpecial(var/special) + return diff --git a/code/modules/food/customizables.dm b/code/modules/food/customizables.dm index c1bbcdb50dc..e0445f31395 100644 --- a/code/modules/food/customizables.dm +++ b/code/modules/food/customizables.dm @@ -41,7 +41,7 @@ /obj/item/trash/bowl name = "bowl" desc = "An empty bowl. Put some food in it to start making a soup." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "soup" /obj/item/trash/bowl/attackby(obj/item/W as obj, mob/user as mob, params) diff --git a/code/modules/food/deep_fryer.dm b/code/modules/food/deep_fryer.dm index cfe117c832e..4805983fdf4 100644 --- a/code/modules/food/deep_fryer.dm +++ b/code/modules/food/deep_fryer.dm @@ -10,9 +10,61 @@ foodcolor = "#FFAD33" officon = "fryer_off" onicon = "fryer_on" + has_specials = 1 -obj/machinery/cooker/deepfryer/gettype() +/obj/machinery/cooker/deepfryer/gettype() var/obj/item/weapon/reagent_containers/food/snacks/deepfryholder/type = new(get_turf(src)) return type +/obj/machinery/cooker/deepfryer/checkSpecials(obj/item/I) + if(!I) + return 0 + for (var/Type in subtypesof(/datum/deepfryer_special)) + var/datum/deepfryer_special/P = new Type() + if(istype(I, /obj/item/weapon/reagent_containers/food/snacks/grown)) + var/obj/item/weapon/reagent_containers/food/snacks/grown/G = I + if(G.seed.kitchen_tag != P.input) + continue + else if (!istype(I, P.input)) + continue + return P + return 0 + +/obj/machinery/cooker/deepfryer/cookSpecial(special) + if(!special) + return 0 + var/datum/deepfryer_special/recipe = special + if(!recipe.output) + return 0 + new recipe.output(get_turf(src)) + + +////////////////////////////////// +// Deepfryer Special // +// Interaction Datums // +////////////////////////////////// + +/datum/deepfryer_special + var/input //Thing that goes in + var/output //Thing that comes out + +/datum/deepfryer_special/shrimp + input = /obj/item/weapon/reagent_containers/food/snacks/shrimp + output = /obj/item/weapon/reagent_containers/food/snacks/fried_shrimp + +/datum/deepfryer_special/banana + input = "banana" + output = /obj/item/weapon/reagent_containers/food/snacks/friedbanana + +/datum/deepfryer_special/potato_chips + input = /obj/item/weapon/reagent_containers/food/snacks/rawsticks + output = /obj/item/weapon/reagent_containers/food/snacks/chips + +/datum/deepfryer_special/corn_chips + input = "corn" + output = /obj/item/weapon/reagent_containers/food/snacks/cornchips + +/datum/deepfryer_special/fried_tofu + input = /obj/item/weapon/reagent_containers/food/snacks/tofu + output = /obj/item/weapon/reagent_containers/food/snacks/fried_tofu diff --git a/code/modules/food/recipes_grill.dm b/code/modules/food/recipes_grill.dm index 6246b333558..aaf1bbf3da6 100644 --- a/code/modules/food/recipes_grill.dm +++ b/code/modules/food/recipes_grill.dm @@ -30,6 +30,13 @@ ) result = /obj/item/weapon/reagent_containers/food/snacks/meatsteak +/datum/recipe/grill/salmonsteak + reagents = list("sodiumchloride" = 1, "blackpepper" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/salmonmeat + ) + result = /obj/item/weapon/reagent_containers/food/snacks/salmonsteak + /datum/recipe/grill/syntisteak reagents = list("sodiumchloride" = 1, "blackpepper" = 1) items = list( @@ -129,4 +136,21 @@ /obj/item/weapon/reagent_containers/food/snacks/tofu, /obj/item/weapon/reagent_containers/food/snacks/tofu, ) - result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob \ No newline at end of file + result = /obj/item/weapon/reagent_containers/food/snacks/tofukabob + +/datum/recipe/grill/sushi_Tamago + reagents = list("sake" = 5) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/egg, + /obj/item/weapon/reagent_containers/food/snacks/boiledrice, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tamago + +/datum/recipe/grill/sushi_Unagi + reagents = list("sake" = 5) + items = list( + /obj/item/weapon/fish/electric_eel, + /obj/item/weapon/reagent_containers/food/snacks/boiledrice, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Unagi + diff --git a/code/modules/food/recipes_microwave.dm b/code/modules/food/recipes_microwave.dm index ffd1c575cd9..580f626bf47 100644 --- a/code/modules/food/recipes_microwave.dm +++ b/code/modules/food/recipes_microwave.dm @@ -631,3 +631,9 @@ reagents = list("sugar" = 5, "frostoil" = 5) result = /obj/item/weapon/reagent_containers/food/snacks/mint +/datum/recipe/microwave/boiled_shrimp + reagents = list("water" = 1) + items = list( + /obj/item/weapon/reagent_containers/food/snacks/shrimp + ) + result = /obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp diff --git a/code/modules/food/recipes_table.dm b/code/modules/food/recipes_table.dm index c501db81375..0c9f72dd6d5 100644 --- a/code/modules/food/recipes_table.dm +++ b/code/modules/food/recipes_table.dm @@ -94,3 +94,75 @@ /obj/item/weapon/reagent_containers/food/snacks/friedegg = 1, ) result = /obj/item/weapon/reagent_containers/food/snacks/wrap + +/datum/table_recipe/sushi_Ebi + name = "Ebi Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi + +/datum/table_recipe/sushi_Ikura + name = "Ikura Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/fish_eggs/salmon = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura + +/datum/table_recipe/sushi_Inari + name = "Inari Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/fried_tofu = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Inari + +/datum/table_recipe/sushi_Sake + name = "Sake Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/salmonmeat = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Sake + +/datum/table_recipe/sushi_SmokedSalmon + name = "Smoked Salmon Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/salmonsteak = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon + +/datum/table_recipe/sushi_Masago + name = "Masago Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/fish_eggs/goldfish = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Masago + +/datum/table_recipe/sushi_Tobiko + name = "Tobiko Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/fish_eggs/shark = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko + +/datum/table_recipe/sushi_TobikoEgg + name = "Tobiko and Egg Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko = 1, + /obj/item/weapon/reagent_containers/food/snacks/egg = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg + +/datum/table_recipe/sushi_Tai + name = "Tai Sushi" + reqs = list( + /obj/item/weapon/reagent_containers/food/snacks/boiledrice = 1, + /obj/item/weapon/reagent_containers/food/snacks/catfishmeat = 1, + ) + result = /obj/item/weapon/reagent_containers/food/snacks/sushi_Tai \ No newline at end of file diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6a2722470b2..3c61d7c2f6e 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -79,7 +79,7 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi mind = body.mind //we don't transfer the mind but we keep a reference to it. if(!T) T = pick(latejoin) //Safety in case we cannot find the body's position - loc = T + forceMove(T) if(!name) //To prevent nameless ghosts name = capitalize(pick(first_names_male)) + " " + capitalize(pick(last_names)) @@ -96,12 +96,12 @@ var/list/image/ghost_darkness_images = list() //this is a list of images for thi /mob/dead/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) return 1 + + /* Transfer_mind is there to check if mob is being deleted/not going to have a body. Works together with spawning an observer, noted above. */ - - /mob/dead/observer/Life() ..() if(!loc) return @@ -200,10 +200,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return -/mob/dead/observer/Move(NewLoc, direct) +/mob/dead/observer/Move(NewLoc, direct) + following = null dir = direct if(NewLoc) - loc = NewLoc + forceMove(NewLoc) for(var/obj/effect/step_trigger/S in NewLoc) S.Crossed(src) @@ -212,7 +213,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp A.Entered(src) return - loc = get_turf(src) //Get out of closets and such as a ghost + forceMove(get_turf(src)) //Get out of closets and such as a ghost if((direct & NORTH) && y < world.maxy) y++ else if((direct & SOUTH) && y > 1) @@ -228,6 +229,8 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp var/area/A = get_area_master(src) if(A) A.Entered(src) + + ..() /mob/dead/observer/experience_pressure_difference() return 0 @@ -326,7 +329,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp M.antagHUD = 1 src << "\blue AntagHUD Enabled" -/mob/dead/observer/proc/dead_tele() +/mob/dead/observer/proc/dead_tele(A in ghostteleportlocs) set category = "Ghost" set name = "Teleport" set desc= "Teleport to a location" @@ -338,73 +341,107 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp usr.verbs -= /mob/dead/observer/proc/dead_tele spawn(30) usr.verbs += /mob/dead/observer/proc/dead_tele - var/A - A = input("Area to jump to", "BOOYEA", A) as null|anything in ghostteleportlocs + var/area/thearea = ghostteleportlocs[A] if(!thearea) return var/list/L = list() for(var/turf/T in get_area_turfs(thearea.type)) - L+=T + L += T if(!L || !L.len) - usr << "No area available." + usr << "No area available." usr.forceMove(pick(L)) + following = null -/mob/dead/observer/verb/follow() +/mob/dead/observer/verb/follow(input in getmobs()) set category = "Ghost" set name = "Follow" // "Haunt" set desc = "Follow and haunt a mob." - if(istype(usr, /mob/dead/observer)) - var/list/mobs = getmobs() - var/input = input("Please, select a mob!", "Haunt", null, null) as null|anything in mobs - var/mob/target = mobs[input] - if(target && target != usr) - following = target - spawn(0) - var/turf/pos = get_turf(src) - while(src.loc == pos) + var/target = getmobs()[input] + if(!target) return + ManualFollow(target) +// This is the ghost's follow verb with an argument +/mob/dead/observer/proc/ManualFollow(var/atom/movable/target) + if(!target) + return + + if(target != src) + if(following && following == target) + return + following = target + src << "Now following [target]" + if(ismob(target)) + forceMove(get_turf(target)) + var/mob/M = target + M.following_mobs += src + else + spawn(0) + while(target && following == target && client) var/turf/T = get_turf(target) if(!T) break - if(following != target) - break - if(!client) - break - src.loc = T - pos = src.loc + // To stop the ghost flickering. + if(loc != T) + forceMove(T) sleep(15) - following = null +/mob/proc/update_following() + . = get_turf(src) + for(var/mob/dead/observer/M in following_mobs) + if(M.following != src) + following_mobs -= M + else + if(M.loc != .) + M.forceMove(.) -/mob/dead/observer/verb/jumptomob() //Moves the ghost instead of just changing the ghosts's eye -Nodrak +/mob + var/list/following_mobs = list() + +/mob/Destroy() + for(var/mob/dead/observer/M in following_mobs) + M.following = null + following_mobs = null + return ..() + +/mob/dead/observer/Destroy() + if(ismob(following)) + var/mob/M = following + M.following_mobs -= src + following = null + return ..() + +/mob/Move() + . = ..() + if(.) + update_following() + +/mob/Life() + // to catch teleports etc which directly set loc + update_following() + return ..() + +/mob/dead/observer/verb/jumptomob(target in getmobs()) //Moves the ghost instead of just changing the ghosts's eye -Nodrak set category = "Ghost" set name = "Jump to Mob" set desc = "Teleport to a mob" if(istype(usr, /mob/dead/observer)) //Make sure they're an observer! - - var/list/dest = list() //List of possible destinations (mobs) - var/target = null //Chosen target. - - dest += getmobs() //Fill list, prompt user with list - target = input("Please, select a player!", "Jump to Mob", null, null) as null|anything in dest - if (!target)//Make sure we actually have a target return else - var/mob/M = dest[target] //Destination mob - var/mob/A = src //Source mob + var/mob/M = getmobs()[target] //Destination mob var/turf/T = get_turf(M) //Turf of the destination mob if(T && isturf(T)) //Make sure the turf exists, then move the source to that destination. - A.loc = T + forceMove(T) + following = null else - A << "This mob is not located in the game world." + src << "This mob is not located in the game world." /* Now a spell. See spells.dm @@ -548,7 +585,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return if(!client) return - loc = T + forceMove(T) following = null ..() //END TELEPORT HREF CODE diff --git a/code/modules/mob/living/carbon/human/species/station.dm b/code/modules/mob/living/carbon/human/species/station.dm index 908e3f4566e..b59efdda468 100644 --- a/code/modules/mob/living/carbon/human/species/station.dm +++ b/code/modules/mob/living/carbon/human/species/station.dm @@ -452,8 +452,8 @@ unarmed_type = /datum/unarmed_attack/punch eyes = "blank_eyes" - brute_mod = 1.5 - burn_mod = 1.5 + brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150% + burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall. cold_level_1 = 50 cold_level_2 = -1 diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 65864f5d912..fa834fa581b 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -526,7 +526,7 @@ src << "You wriggle out of [M]'s grip!" else if(istype(H.loc,/obj/item)) src << "You struggle free of [H.loc]." - H.loc = get_turf(H) + H.forceMove(get_turf(H)) if(istype(M)) for(var/atom/A in M.contents) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm index 285948e6073..3522cce7bc0 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs.dm @@ -269,7 +269,7 @@ /obj/item/asteroid/hivelord_core name = "hivelord remains" desc = "All that remains of a hivelord, it seems to be what allows it to break pieces of itself off without being hurt... its healing properties will soon become inert if not used quickly. Try not to think about what you're eating." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "boiledrorocore" var/inert = 0 diff --git a/code/modules/nano/modules/power_monitor.dm b/code/modules/nano/modules/power_monitor.dm index 1bcf9bc2176..73651c7835d 100644 --- a/code/modules/nano/modules/power_monitor.dm +++ b/code/modules/nano/modules/power_monitor.dm @@ -25,6 +25,7 @@ return data["poweravail"] = powermonitor.powernet.avail data["powerload"] = num2text(powermonitor.powernet.viewload,10) + data["powerdemand"] = powermonitor.powernet.load data["apcs"] = apc_repository.apc_data(powermonitor) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 44a4eda8612..083fe7009c2 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -44,6 +44,12 @@ return powernet.avail else return 0 + +/obj/machinery/power/proc/load() + if(powernet) + return powernet.load + else + return 0 /obj/machinery/power/proc/disconnect_terminal() // machines without a terminal will just return, no harm no fowl. return diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index 4b2763c0d86..43d66d02855 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -16,6 +16,8 @@ var/active = 0 var/powered = 0 var/fire_delay = 100 + var/maximum_fire_delay = 100 + var/minimum_fire_delay = 20 var/last_shot = 0 var/shot_number = 0 var/state = 0 @@ -25,6 +27,30 @@ var/id_tag = null var/datum/radio_frequency/radio_connection +/obj/machinery/power/emitter/New() + ..() + component_parts = list() + component_parts += new /obj/item/weapon/circuitboard/emitter(null) + component_parts += new /obj/item/weapon/stock_parts/micro_laser(null) + component_parts += new /obj/item/weapon/stock_parts/manipulator(null) + RefreshParts() + +/obj/machinery/power/emitter/RefreshParts() + var/max_firedelay = 120 + var/firedelay = 120 + var/min_firedelay = 24 + var/power_usage = 350 + for(var/obj/item/weapon/stock_parts/micro_laser/L in component_parts) + max_firedelay -= 20 * L.rating + min_firedelay -= 4 * L.rating + firedelay -= 20 * L.rating + maximum_fire_delay = max_firedelay + minimum_fire_delay = min_firedelay + fire_delay = firedelay + for(var/obj/item/weapon/stock_parts/manipulator/M in component_parts) + power_usage -= 50 * M.rating + active_power_usage = power_usage + //Radio remote control /obj/machinery/power/emitter/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) @@ -114,7 +140,7 @@ src.active = 1 user << "You turn on the [src]." src.shot_number = 0 - src.fire_delay = 100 + src.fire_delay = maximum_fire_delay message_admins("Emitter turned on by [key_name_admin(user)] in ([x],[y],[z] - JMP)",0,1) log_game("Emitter turned on by [key_name(user)] in ([x],[y],[z])") investigate_log("turned on by [key_name(usr)]","singulo") @@ -162,7 +188,7 @@ src.fire_delay = 2 src.shot_number ++ else - src.fire_delay = rand(20,100) + src.fire_delay = rand(minimum_fire_delay,maximum_fire_delay) src.shot_number = 0 var/obj/item/projectile/beam/emitter/A = PoolOrNew(/obj/item/projectile/beam/emitter,src.loc) @@ -269,6 +295,14 @@ user << "\red Access denied." return + if(default_deconstruction_screwdriver(user, "emitter_open", "emitter", W)) + return + + if(exchange_parts(user, W)) + return + + default_deconstruction_crowbar(W) + ..() return diff --git a/code/modules/reagents/Chemistry-Machinery.dm b/code/modules/reagents/Chemistry-Machinery.dm index 03dd8cfbcf6..0599e90f373 100644 --- a/code/modules/reagents/Chemistry-Machinery.dm +++ b/code/modules/reagents/Chemistry-Machinery.dm @@ -245,7 +245,7 @@ /obj/machinery/chem_dispenser/attack_ai(mob/user as mob) return src.attack_hand(user) - + /obj/machinery/chem_dispenser/attack_ghost(mob/user as mob) return src.attack_hand(user) @@ -293,7 +293,8 @@ dispensable_reagents = list() var/list/special_reagents = list(list("hydrogen", "oxygen", "silicon", "phosphorus", "sulfur", "carbon", "nitrogen", "tungsten", "water"), list("lithium", "sugar", "copper", "mercury", "sodium","iodine","bromine"), - list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver")) + list("ethanol", "chlorine", "potassium", "aluminum","plasma", "radium", "fluorine", "iron", "silver"), + list("oil", "ash", "acetone", "saltpetre", "ammonia", "diethylamine", "fuel")) /obj/machinery/chem_dispenser/constructable/New() ..() @@ -306,7 +307,7 @@ component_parts += new /obj/item/weapon/stock_parts/console_screen(null) component_parts += new /obj/item/weapon/stock_parts/cell/super(null) RefreshParts() - + /obj/machinery/chem_dispenser/constructable/upgraded/New() ..() component_parts = list() @@ -640,7 +641,7 @@ /obj/machinery/chem_master/attack_ai(mob/user as mob) return src.attack_hand(user) - + /obj/machinery/chem_master/attack_ghost(mob/user as mob) return src.attack_hand(user) diff --git a/code/modules/reagents/reagent_containers/food/condiment.dm b/code/modules/reagents/reagent_containers/food/condiment.dm index 309f928288b..ea7633fa7aa 100644 --- a/code/modules/reagents/reagent_containers/food/condiment.dm +++ b/code/modules/reagents/reagent_containers/food/condiment.dm @@ -8,7 +8,7 @@ /obj/item/weapon/reagent_containers/food/condiment name = "Condiment Container" desc = "Just your average condiment container." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "emptycondiment" flags = OPENCONTAINER possible_transfer_amounts = list(1,5,10) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index 8528e364dc7..374f9cf603a 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -203,7 +203,7 @@ /obj/item/weapon/reagent_containers/food/drinks/flour name = "flour sack" desc = "A big bag of flour. Good for baking!" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "flour" item_state = "flour" New() diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index 760988b4977..89f14c26358 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -2,7 +2,7 @@ /obj/item/weapon/reagent_containers/food/snacks name = "snack" desc = "yummy" - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = null var/bitesize = 1 var/bitecount = 0 @@ -296,7 +296,7 @@ ///obj/item/weapon/reagent_containers/food/snacks/xenoburger //Identification path for the object. // name = "Xenoburger" //Name that displays in the UI. // desc = "Smells caustic. Tastes like heresy." //Duh -// icon_state = "xburger" //Refers to an icon in food.dmi +// icon_state = "xburger" //Refers to an icon in food/food.dmi // New() //Don't mess with this. // ..() //Same here. // reagents.add_reagent("xenomicrobes", 10) //This is what is in the food item. you may copy/paste @@ -368,6 +368,18 @@ reagents.add_reagent("nutriment", 3) bitesize = 1 +/obj/item/weapon/reagent_containers/food/snacks/cornchips + name = "corn chips" + desc = "Goes great with salsa! OLE!" + icon_state = "chips" + trash = /obj/item/trash/chips + filling_color = "#E8C31E" + + New() + ..() + reagents.add_reagent("nutriment", 3) + bitesize = 1 + /obj/item/weapon/reagent_containers/food/snacks/cookie name = "cookie" desc = "COOKIE!!!" @@ -663,6 +675,17 @@ desc = "We all love tofu." filling_color = "#FFFEE0" + New() + ..() + reagents.add_reagent("plantmatter", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fried_tofu + name = "Fried Tofu" + icon_state = "tofu" + desc = "Proof that even vegetarians crave unhealthy foods." + filling_color = "#FFFEE0" + New() ..() reagents.add_reagent("nutriment", 3) @@ -691,30 +714,6 @@ reagents.add_reagent("nutriment", 3) bitesize = 1 -/obj/item/weapon/reagent_containers/food/snacks/carpmeat - name = "carp fillet" - desc = "A fillet of spess carp meat" - icon_state = "fishfillet" - filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("protein", 3) - reagents.add_reagent("carpotoxin", 3) - src.bitesize = 6 - -/obj/item/weapon/reagent_containers/food/snacks/fishfingers - name = "Fish Fingers" - desc = "A finger of fish." - icon_state = "fishfingers" - filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("nutriment", 4) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 - /obj/item/weapon/reagent_containers/food/snacks/hugemushroomslice name = "huge mushroom slice" desc = "A slice from a huge mushroom." @@ -896,18 +895,6 @@ reagents.add_reagent("nutriment", 6) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/fishburger - name = "Fillet -o- Carp Sandwich" - desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." - icon_state = "fishburger" - filling_color = "#FFDEFE" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 - /obj/item/weapon/reagent_containers/food/snacks/tofuburger name = "Tofu Burger" desc = "What.. is that meat?" @@ -1199,20 +1186,6 @@ reagents.add_reagent("nutriment", 8) bitesize = 2 -/obj/item/weapon/reagent_containers/food/snacks/cubancarp - name = "Cuban Carp" - desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" - icon_state = "cubancarp" - trash = /obj/item/trash/plate - filling_color = "#E9ADFF" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - reagents.add_reagent("capsaicin", 3) - bitesize = 3 - /obj/item/weapon/reagent_containers/food/snacks/popcorn name = "Popcorn" desc = "Now let's find some cinema." @@ -1853,18 +1826,6 @@ reagents.add_reagent("sodiumchloride", 1) bitesize = 3 -/obj/item/weapon/reagent_containers/food/snacks/fishandchips - name = "Fish and Chips" - desc = "I do say so myself chap." - icon_state = "fishandchips" - filling_color = "#E3D796" - - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("carpotoxin", 3) - bitesize = 3 - /obj/item/weapon/reagent_containers/food/snacks/sandwich name = "Sandwich" desc = "A grand creation of meat, cheese, bread, and several leaves of lettuce! Arthur Dent would be proud." @@ -2308,7 +2269,7 @@ /obj/item/weapon/reagent_containers/food/snacks/dough_ball name = "ball of raw dough" desc = "A ball of raw dough, ready to be molded into new recipes." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" New() ..() @@ -2331,7 +2292,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough name = "flattened dough" desc = "Still raw. You resist the temptation to cover it in tomato sauce." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flatdough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 @@ -2343,7 +2304,7 @@ /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "slice of dough" desc = "an individual portion of raw dough, ready to be cooked." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "doughslice" bitesize = 2 @@ -2860,7 +2821,7 @@ /obj/item/pizzabox name = "pizza box" desc = "A box suited for pizzas." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "pizzabox1" var/open = 0 // Is the box open? @@ -2897,7 +2858,7 @@ icon_state = "pizzabox_open" if( pizza ) - var/image/pizzaimg = image("food.dmi", icon_state = pizza.icon_state) + var/image/pizzaimg = image("food/food.dmi", icon_state = pizza.icon_state) pizzaimg.pixel_y = -3 overlays += pizzaimg @@ -2914,7 +2875,7 @@ doimgtag = 1 if( doimgtag ) - var/image/tagimg = image("food.dmi", icon_state = "pizzabox_tag") + var/image/tagimg = image("food/food.dmi", icon_state = "pizzabox_tag") tagimg.pixel_y = boxes.len * 3 overlays += tagimg @@ -3188,17 +3149,6 @@ reagents.add_reagent("toxin", 3) bitesize = 4 -/obj/item/weapon/reagent_containers/food/snacks/sashimi - name = "carp sashimi" - desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." - icon_state = "sashimi" - New() - ..() - reagents.add_reagent("nutriment", 6) - reagents.add_reagent("toxin", 5) - bitesize = 3 - - ////////////////////////////////ICE CREAM/////////////////////////////////// /obj/item/weapon/reagent_containers/food/snacks/icecream name = "ice cream" @@ -3245,7 +3195,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cereal name = "box of cereal" desc = "A box of cereal." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "cereal_box" bitesize = 2 New() @@ -3254,7 +3204,7 @@ /obj/item/weapon/reagent_containers/food/snacks/deepfryholder name = "Deep Fried Foods Holder Obj" desc = "If you can see this description the code for the deep fryer fucked up." - icon = 'icons/obj/food.dmi' + icon = 'icons/obj/food/food.dmi' icon_state = "deepfried_holder_icon" bitesize = 2 New() @@ -3280,7 +3230,7 @@ /obj/item/weapon/reagent_containers/food/snacks/dough name = "dough" desc = "A piece of dough." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "dough" bitesize = 2 New() @@ -3303,7 +3253,7 @@ /obj/item/weapon/reagent_containers/food/snacks/sliceable/flatdough name = "flat dough" desc = "Some flattened dough." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flat dough" slice_path = /obj/item/weapon/reagent_containers/food/snacks/doughslice slices_num = 3 @@ -3314,7 +3264,7 @@ /obj/item/weapon/reagent_containers/food/snacks/doughslice name = "dough slice" desc = "The building block of an impressive dish." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "doughslice" bitesize = 2 New() @@ -3324,7 +3274,7 @@ /obj/item/weapon/reagent_containers/food/snacks/bun name = "bun" desc = "The base for any self-respecting burger." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "bun" bitesize = 2 New() @@ -3344,7 +3294,7 @@ /obj/item/weapon/reagent_containers/food/snacks/rawcutlet name = "raw cutlet" desc = "A thin piece of raw meat." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawcutlet" bitesize = 1 New() @@ -3354,7 +3304,7 @@ /obj/item/weapon/reagent_containers/food/snacks/cutlet name = "cutlet" desc = "A tasty meat slice." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "cutlet" bitesize = 2 New() @@ -3364,7 +3314,7 @@ /obj/item/weapon/reagent_containers/food/snacks/rawmeatball name = "raw meatball" desc = "A raw meatball." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawmeatball" bitesize = 2 New() @@ -3383,7 +3333,7 @@ /obj/item/weapon/reagent_containers/food/snacks/flatbread name = "flatbread" desc = "Bland but filling." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "flatbread" bitesize = 2 New() @@ -3402,7 +3352,7 @@ /obj/item/weapon/reagent_containers/food/snacks/rawsticks name = "raw potato sticks" desc = "Raw fries, not very tasty." - icon = 'icons/obj/food_ingredients.dmi' + icon = 'icons/obj/food/food_ingredients.dmi' icon_state = "rawsticks" bitesize = 2 New() diff --git a/code/modules/reagents/reagent_containers/food/snacks/seafood.dm b/code/modules/reagents/reagent_containers/food/snacks/seafood.dm new file mode 100644 index 00000000000..47216996470 --- /dev/null +++ b/code/modules/reagents/reagent_containers/food/snacks/seafood.dm @@ -0,0 +1,266 @@ + +/obj/item/weapon/reagent_containers/food/snacks/carpmeat + name = "carp fillet" + desc = "A fillet of spess carp meat" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishfillet" + filling_color = "#FFDEFE" + + New() + ..() + reagents.add_reagent("protein", 3) + reagents.add_reagent("carpotoxin", 3) + src.bitesize = 6 + +/obj/item/weapon/reagent_containers/food/snacks/salmonmeat + name = "raw salmon" + desc = "A fillet of raw salmon" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishfillet" + filling_color = "#FFDEFE" + + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/salmonsteak + name = "Salmon steak" + desc = "A piece of freshly-grilled salmon meat." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "salmonsteak" + trash = /obj/item/trash/plate + filling_color = "#7A3D11" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("sodiumchloride", 1) + reagents.add_reagent("blackpepper", 1) + bitesize = 3 + + +/obj/item/weapon/reagent_containers/food/snacks/catfishmeat + name = "raw catfish" + desc = "A fillet of raw catfish" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishfillet" + filling_color = "#FFDEFE" + + New() + ..() + reagents.add_reagent("protein", 3) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishfingers + name = "Fish Fingers" + desc = "A finger of fish." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishfingers" + filling_color = "#FFDEFE" + + New() + ..() + reagents.add_reagent("nutriment", 4) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishburger + name = "Fillet -o- Carp Sandwich" + desc = "Almost like a carp is yelling somewhere... Give me back that fillet -o- carp, give me that carp." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishburger" + filling_color = "#FFDEFE" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/cubancarp + name = "Cuban Carp" + desc = "A grifftastic sandwich that burns your tongue and then leaves it numb!" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "cubancarp" + trash = /obj/item/trash/plate + filling_color = "#E9ADFF" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + reagents.add_reagent("capsaicin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fishandchips + name = "Fish and Chips" + desc = "I do say so myself chap." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "fishandchips" + filling_color = "#E3D796" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("carpotoxin", 3) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sashimi + name = "carp sashimi" + desc = "Celebrate surviving attack from hostile alien lifeforms by hospitalising yourself." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sashimi" + + New() + ..() + reagents.add_reagent("nutriment", 6) + reagents.add_reagent("toxin", 5) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/fried_shrimp + name = "fried shrimp" + desc = "Just one of the many things you can do with shrimp!" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "shrimp_fried" + + New() + ..() + reagents.add_reagent("nutriment", 2) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/boiled_shrimp + name = "boiled shrimp" + desc = "Just one of the many things you can do with shrimp!" + icon = 'icons/obj/food/seafood.dmi' + icon_state = "shrimp_cooked" + + New() + ..() + reagents.add_reagent("nutriment", 2) + src.bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Ebi + name = "Ebi Sushi" + desc = "A simple sushi consisting of cooked shrimp and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Ebi" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Ikura + name = "Ikura Sushi" + desc = "A simple sushi consisting of salmon roe." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Ikura" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protien", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Sake + name = "Sake Sushi" + desc = "A simple sushi consisting of raw salmon and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Sake" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_SmokedSalmon + name = "Smoked Salmon Sushi" + desc = "A simple sushi consisting of cooked salmon and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_SmokedSalmon" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Tamago + name = "Tamago Sushi" + desc = "A simple sushi consisting of egg and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Tamago" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Inari + name = "Inari Sushi" + desc = "A piece of fried tofu stuffed with rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Inari" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Masago + name = "Masago Sushi" + desc = "A simple sushi consisting of goldfish roe." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Masago" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protien", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Tobiko + name = "Ikura Sushi" + desc = "A simple sushi consisting of shark roe." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Tobiko" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protien", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_TobikoEgg + name = "Tobiko and Egg Sushi" + desc = "A sushi consisting of shark roe and an egg." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_TobikoEgg" + + New() + ..() + reagents.add_reagent("nutriment", 2) + reagents.add_reagent("protien", 1) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Tai + name = "Tai Sushi" + desc = "A simple sushi consisting of catfish and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Tai" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 + +/obj/item/weapon/reagent_containers/food/snacks/sushi_Unagi + name = "Unagi Sushi" + desc = "A simple sushi consisting of eel and rice." + icon = 'icons/obj/food/seafood.dmi' + icon_state = "sushi_Hokki" + + New() + ..() + reagents.add_reagent("nutriment", 2) + bitesize = 3 \ No newline at end of file diff --git a/code/modules/research/designs/machine_designs.dm b/code/modules/research/designs/machine_designs.dm index ffe87160b5c..f7c2252dbd9 100644 --- a/code/modules/research/designs/machine_designs.dm +++ b/code/modules/research/designs/machine_designs.dm @@ -22,6 +22,16 @@ build_path = /obj/item/weapon/circuitboard/smes category = list ("Engineering Machinery") +/datum/design/emitter + name = "Machine Board (Emitter)" + desc = "The circuit board for an emitter." + id = "emitter" + req_tech = list("programming" = 4, "powerstorage" = 5, "engineering" = 5) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/emitter + category = list ("Engineering Machinery") + /datum/design/telepad name = "Machine Board (Telepad Board)" desc = "Allows for the construction of circuit boards used to build a Telepad." @@ -242,6 +252,76 @@ build_path = /obj/item/weapon/circuitboard/rdserver category = list("Research Machinery") +/datum/design/gibber + name = "Machine Design (Gibber Board)" + desc = "The circuit board for a gibber." + id = "gibber" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/gibber + category = list ("Misc. Machinery") + +/datum/design/smartfridge + name = "Machine Design (Smartfridge Board)" + desc = "The circuit board for a smartfridge." + id = "smartfridge" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/smartfridge + category = list ("Misc. Machinery") + +/datum/design/monkey_recycler + name = "Machine Design (Monkey Recycler Board)" + desc = "The circuit board for a monkey recycler." + id = "monkey_recycler" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/monkey_recycler + category = list ("Misc. Machinery") + +/datum/design/seed_extractor + name = "Machine Design (Seed Extractor Board)" + desc = "The circuit board for a seed extractor." + id = "seed_extractor" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/seed_extractor + category = list ("Misc. Machinery") + +/datum/design/processor + name = "Machine Design (Processor Board)" + desc = "The circuit board for a processor." + id = "processor" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/processor + category = list ("Misc. Machinery") + +/datum/design/recycler + name = "Machine Design (Recycler Board)" + desc = "The circuit board for a recycler." + id = "recycler" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/recycler + category = list ("Misc. Machinery") + +/datum/design/holopad + name = "Machine Design (AI Holopad Board)" + desc = "The circuit board for a holopad." + id = "holopad" + req_tech = list("programming" = 1) + build_type = IMPRINTER + materials = list("$glass" = 1000, "sacid" = 20) + build_path = /obj/item/weapon/circuitboard/holopad + category = list ("Misc. Machinery") + /datum/design/arcadebattle name = "Machine Board (Battle Arcade Machine)" desc = "Allows for the construction of circuit boards used to build a new Arcade Machine." diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index debf1aef3f1..2ae7d1216d3 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -969,4 +969,31 @@ build_path =/obj/item/mecha_parts/mecha_tracking materials = list("$metal"=500) construction_time = 50 + category = list("Misc") + +/datum/design/ipc_head + name = "IPC Head" + id = "ipc_head" + build_type = MECHFAB + build_path = /obj/item/organ/external/head/ipc + materials = list("$metal"=15000, "$glass"=5000) + construction_time = 350 + category = list("Misc") + +/datum/design/ipc_cell + name = "IPC Microbattery" + id = "ipc_cell" + build_type = MECHFAB + build_path = /obj/item/organ/cell + materials = list("$metal"=2000, "$glass"=750) + construction_time = 200 + category = list("Misc") + +/datum/design/ipc_optics + name = "IPC Optical Sensor" + id = "ipc_optics" + build_type = MECHFAB + build_path = /obj/item/organ/optical_sensor + materials = list("$metal"=1000, "$glass"=2500) + construction_time = 200 category = list("Misc") \ No newline at end of file diff --git a/code/modules/research/designs/power_designs.dm b/code/modules/research/designs/power_designs.dm index ec67de5717a..70be59438fa 100644 --- a/code/modules/research/designs/power_designs.dm +++ b/code/modules/research/designs/power_designs.dm @@ -48,6 +48,18 @@ build_path = /obj/item/weapon/stock_parts/cell/super category = list("Misc","Power") +/datum/design/bluespace_cell + name = "Bluespace Power Cell" + desc = "A power cell that holds 40000 units of energy." + id = "bluespace_cell" + req_tech = list("powerstorage" = 6, "materials" = 5) + reliability_base = 70 + build_type = PROTOLATHE | MECHFAB + materials = list("$metal" = 800, "$gold" = 300, "$silver" = 300, "$glass" = 160, "$diamond" = 160) + construction_time=100 + build_path = /obj/item/weapon/stock_parts/cell/bluespace + category = list("Misc","Power") + /datum/design/pacman name = "Machine Board (PACMAN-type Generator)" desc = "The circuit board that for a PACMAN-type portable generator." diff --git a/code/modules/research/designs/stock_parts_designs.dm b/code/modules/research/designs/stock_parts_designs.dm index c98376f66e0..6f8ff421069 100644 --- a/code/modules/research/designs/stock_parts_designs.dm +++ b/code/modules/research/designs/stock_parts_designs.dm @@ -156,13 +156,78 @@ reliability_base = 75 build_path = /obj/item/weapon/stock_parts/matter_bin/super category = list("Stock Parts") - + +/datum/design/quadratic_capacitor + name = "Quadratic Capacitor" + desc = "A stock part used in the construction of various devices." + id = "quadratic_capacitor" + req_tech = list("powerstorage" = 6, "materials" = 5) + build_type = PROTOLATHE + reliability_base = 71 + materials = list("$metal" = 100, "$glass" = 100, "$diamond" = 40) + build_path = /obj/item/weapon/stock_parts/capacitor/quadratic + category = list("Stock Parts") + +/datum/design/triphasic_scanning + name = "Triphasic Scanning Module" + desc = "A stock part used in the construction of various devices." + id = "triphasic_scanning" + req_tech = list("magnets" = 6, "materials" = 4) + build_type = PROTOLATHE + materials = list("$metal" = 100, "$glass" = 40, "$diamond" = 20) + reliability_base = 72 + build_path = /obj/item/weapon/stock_parts/scanning_module/triphasic + category = list("Stock Parts") + +/datum/design/femto_mani + name = "Femto Manipulator" + desc = "A stock part used in the construction of various devices." + id = "femto_mani" + req_tech = list("materials" = 6, "programming" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 60, "$diamond" = 30) + reliability_base = 73 + build_path = /obj/item/weapon/stock_parts/manipulator/femto + category = list("Stock Parts") + +/datum/design/quadultra_micro_laser + name = "Quad-Ultra Micro-Laser" + desc = "A stock part used in the construction of various devices." + id = "quadultra_micro_laser" + req_tech = list("magnets" = 6, "materials" = 6) + build_type = PROTOLATHE + materials = list("$metal" = 20, "$glass" = 40, "$uranium" = 20, "$diamond" = 20) + reliability_base = 70 + build_path = /obj/item/weapon/stock_parts/micro_laser/quadultra + category = list("Stock Parts") + +/datum/design/bluespace_matter_bin + name = "Bluespace Matter Bin" + desc = "A stock part used in the construction of various devices." + id = "bluespace_matter_bin" + req_tech = list("materials" = 6) + build_type = PROTOLATHE + materials = list("$metal" = 160, "$diamond" = 200) + reliability_base = 75 + build_path = /obj/item/weapon/stock_parts/matter_bin/bluespace + category = list("Stock Parts") + /datum/design/RPED name = "Rapid Part Exchange Device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." id = "rped" req_tech = list("engineering" = 3, "materials" = 3) build_type = PROTOLATHE - materials = list("$metal" = 15000, "$glass" = 5000) //hardcore + materials = list("$metal" = 10000, "$glass" = 5000) //hardcore build_path = /obj/item/weapon/storage/part_replacer + category = list("Stock Parts") + +/datum/design/BS_RPED + name = "Bluespace RPED" + desc = "Powered by bluespace technology, this RPED variant can upgrade buildings from a distance, without needing to remove the panel first." + id = "bs_rped" + req_tech = list("engineering" = 3, "materials" = 5, "programming" = 3, "bluespace" = 3) + build_type = PROTOLATHE + materials = list("$metal" = 15000, "$glass" = 5000, "$silver" = 2500) //hardcore + build_path = /obj/item/weapon/storage/part_replacer/bluespace category = list("Stock Parts") \ No newline at end of file diff --git a/code/stylesheet.dm b/code/stylesheet.dm index 9ba50242b59..64b854d3bc5 100644 --- a/code/stylesheet.dm +++ b/code/stylesheet.dm @@ -74,7 +74,7 @@ h1.alert, h2.alert {color: #000000;} .tajaran {color: #803B56;} .tajaran_signlang {color: #941C1C;} .skrell {color: #00CED1;} -.soghun {color: #228B22;} +.soghun {color: #145314;} .solcom {color: #22228B;} .changeling {color: #800080;} .vox {color: #AA00AA;} @@ -101,4 +101,4 @@ h1.alert, h2.alert {color: #000000;} BIG IMG.icon {width: 32px; height: 32px;} -"} \ No newline at end of file +"} diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 299c0a12e65..9e6b8ad7130 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/obj/fish_items.dmi b/icons/obj/fish_items.dmi index f21be0bb9e6..22294911bfb 100644 Binary files a/icons/obj/fish_items.dmi and b/icons/obj/fish_items.dmi differ diff --git a/icons/obj/food.dmi b/icons/obj/food.dmi deleted file mode 100644 index 870e6a3ae09..00000000000 Binary files a/icons/obj/food.dmi and /dev/null differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi new file mode 100644 index 00000000000..872b90a79e0 Binary files /dev/null and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/food_ingredients.dmi b/icons/obj/food/food_ingredients.dmi similarity index 100% rename from icons/obj/food_ingredients.dmi rename to icons/obj/food/food_ingredients.dmi diff --git a/icons/obj/food/seafood.dmi b/icons/obj/food/seafood.dmi new file mode 100644 index 00000000000..5c3e4673273 Binary files /dev/null and b/icons/obj/food/seafood.dmi differ diff --git a/icons/obj/hydroponics_machines.dmi b/icons/obj/hydroponics_machines.dmi index 3373d03152f..8db938aded3 100644 Binary files a/icons/obj/hydroponics_machines.dmi and b/icons/obj/hydroponics_machines.dmi differ diff --git a/icons/obj/kitchen.dmi b/icons/obj/kitchen.dmi index b13d335712c..17d798b595b 100644 Binary files a/icons/obj/kitchen.dmi and b/icons/obj/kitchen.dmi differ diff --git a/icons/obj/power.dmi b/icons/obj/power.dmi index 19e56047c76..105a6a04bd4 100644 Binary files a/icons/obj/power.dmi and b/icons/obj/power.dmi differ diff --git a/icons/obj/recycling.dmi b/icons/obj/recycling.dmi index 8661194c0d9..297eaf76e2f 100644 Binary files a/icons/obj/recycling.dmi and b/icons/obj/recycling.dmi differ diff --git a/icons/obj/singularity.dmi b/icons/obj/singularity.dmi index 1124662d10f..29426aebbd8 100644 Binary files a/icons/obj/singularity.dmi and b/icons/obj/singularity.dmi differ diff --git a/icons/obj/stationobjs.dmi b/icons/obj/stationobjs.dmi index e20d878e3b0..5e025cdb38e 100755 Binary files a/icons/obj/stationobjs.dmi and b/icons/obj/stationobjs.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index d263d057cbc..6c24ded6f48 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index a2fe52b8847..4a3c4172c7f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/nano/templates/pda.tmpl b/nano/templates/pda.tmpl index 35a7d9e57bb..8b2920bb23b 100644 --- a/nano/templates/pda.tmpl +++ b/nano/templates/pda.tmpl @@ -535,7 +535,15 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm {{if data.records.powerconnected == 1}}
- Current Load: + Total Power: +
+
+ {{:data.records.poweravail}} W +
+
+
+
+ Total Load:
{{:data.records.powerload}} W @@ -543,24 +551,22 @@ Used In File(s): \code\game\objects\items\devices\PDA\PDA.dm
- Total Power: + Total Demand:
- {{:data.records.poweravail}} W + {{:data.records.powerdemand}} W
-
- - {{for data.records.apcs}} - {{if index % 20 === 0}} - - {{/if}} - - {{:helper.string('', value.Equipment==1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.Lights==1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.Environment==1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.CellStatus==1 ? '#4f7529' : '#8f1414', value.CellStatus==-1 ? 'No Cell' : value.CellPct + '%')}} +
 Area  Eqp.  Lgt.  Env  Cell 
{{:value.Name}}   {1}
+ + {{for data.records.apcs}} + + {{:helper.string('', value.Equipment == "On" || value.Equipment == "AOn" ? '#4f7529' : '#8f1414', value.Equipment)}} + {{:helper.string('', value.Lights == "On" || value.Lights == "AOn" ? '#4f7529' : '#8f1414', value.Lights)}} + {{:helper.string('', value.Environment == "On" || value.Environment == "AOn" ? '#4f7529' : '#8f1414', value.Environment)}} + {{:helper.string('', value.CellStatus == "F" ? '#4f7529' : value.CellStatus == "C" ? '#cd6500' : '#8f1414', value.CellStatus == "M" ? 'No Cell' : value.CellPct + '%', value.CellStatus == "M" ? '' : ' (' + value.CellStatus + ')')}} + {{/for}}
AreaEquip.LightingEnviron.CellLoad
{{:value.Name}}{1}{1}{1}{1}{2}{{:value.Load}}W
diff --git a/nano/templates/power_monitor.tmpl b/nano/templates/power_monitor.tmpl index 8adf7f7ed72..af19740ce26 100644 --- a/nano/templates/power_monitor.tmpl +++ b/nano/templates/power_monitor.tmpl @@ -21,14 +21,6 @@ Used In File(s): \code\modules\nano\modules\power_monitor.dm {{:helper.link('Return', 'gear', { 'return' : 1 }, null, null)}} {{/if}}

Powernet Status

-
-
- Current Load: -
-
- {{:data.powerload}} W -
-
Total Power: @@ -38,14 +30,31 @@ Used In File(s): \code\modules\nano\modules\power_monitor.dm
- - +
+ Total Load: +
+
+ {{:data.powerload}} W +
+ +
+
+ Total Demand: +
+
+ {{:data.powerdemand}} W +
+
+
+
AreaEquip.LightingEnviron.Cell
+ {{for data.apcs}} - - {{:helper.string('', value.Equipment == 1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.Lights == 1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.Environment == 1 ? '#4f7529' : '#8f1414')}} - {{:helper.string('', value.CellStatus == 1 ? '#4f7529' : '#8f1414', value.CellStatus == -1 ? 'No Cell' : value.CellPct + '%')}} + + {{:helper.string('', value.Equipment == "On" || value.Equipment == "AOn" ? '#4f7529' : '#8f1414', value.Equipment)}} + {{:helper.string('', value.Lights == "On" || value.Lights == "AOn" ? '#4f7529' : '#8f1414', value.Lights)}} + {{:helper.string('', value.Environment == "On" || value.Environment == "AOn" ? '#4f7529' : '#8f1414', value.Environment)}} + {{:helper.string('', value.CellStatus == "F" ? '#4f7529' : value.CellStatus == "C" ? '#cd6500' : '#8f1414', value.CellStatus == "M" ? 'No Cell' : value.CellPct + '%', value.CellStatus == "M" ? '' : ' (' + value.CellStatus + ')')}} + {{/for}}
AreaEquip.LightingEnviron.CellLoad
{{:value.Name}}   {1}
{{:value.Name}}{1}{1}{1}{1}{2}{{:value.Load}}W
diff --git a/nano/templates/turret_control.tmpl b/nano/templates/turret_control.tmpl index af506ea1b24..25e3c2a592c 100644 --- a/nano/templates/turret_control.tmpl +++ b/nano/templates/turret_control.tmpl @@ -1,41 +1,72 @@
-
- Behaviour controls are {{:data.locked ? "locked" : "unlocked"}}. -
+ Behaviour controls are {{:data.locked ? "locked" : "unlocked"}}.

{{if data.access}} -
-
- Turret Status: + {{if !data.screen}} +
+
+ Turret Status: +
+
+ {{:helper.link('Enabled', null, {'command' : 'enable', 'value' : 1}, data.enabled ?'redButton' : null)}} + {{:helper.link('Disabled',null, {'command' : 'enable', 'value' : 0}, !data.enabled ? 'selected' : null)}} +
+
+ {{if data.accesses}} +
+
+ Required Access: +
+
+ {{:helper.link('Modify', null, {'command' : 'screen', 'value' : 1})}} +
+
+ {{/if}} + {{if data.is_lethal}} +
+
+ Lethal Mode: +
+
+ {{:helper.link('On', null, {'command' : 'lethal', 'value' : 1}, data.lethal ?'redButton' : null)}} + {{:helper.link('Off',null, {'command' : 'lethal', 'value' : 0}, !data.lethal ? 'selected' : null)}} +
+
+ {{/if}} + + {{for data.settings}} +
+
+ {{:value.category}} +
+
+ {{:helper.link('On', null, {'command' : value.setting, 'value' : 1}, value.value ? 'selected' : null)}} + {{:helper.link('Off',null, {'command' : value.setting, 'value' : 0}, !value.value ? 'selected' : null)}} +
+
+ {{/for}} + {{else}} +
+
+ Turret Settings: +
+
+ {{:helper.link('Modify', null, {'command' : 'screen', 'value' : 0})}} +
-
- {{:helper.link('Enabled', null, {'command' : 'enable', 'value' : 1}, data.enabled ?'redButton' : null)}} - {{:helper.link('Disabled',null, {'command' : 'enable', 'value' : 0}, !data.enabled ? 'selected' : null)}} -
-
- - {{if data.is_lethal}} -
-
- Lethal Mode: -
-
- {{:helper.link('On', null, {'command' : 'lethal', 'value' : 1}, data.lethal ?'redButton' : null)}} - {{:helper.link('Off',null, {'command' : 'lethal', 'value' : 0}, !data.lethal ? 'selected' : null)}} -
-
- {{/if}} - - {{for data.settings}} -
-
- {{:value.category}} -
-
- {{:helper.link('On', null, {'command' : value.setting, 'value' : 1}, value.value ? 'selected' : null)}} - {{:helper.link('Off',null, {'command' : value.setting, 'value' : 0}, !value.value ? 'selected' : null)}} -
-
- {{/for}} +
+
+ Access Type: +
+
+ {{:helper.link('All', null, {'one_access' : 0}, !data.one_access ? 'selected' : null)}} + {{:helper.link('One', null, {'one_access' : 1}, data.one_access ? 'selected' : null)}} +
+
+

Select Access

+ {{for data.accesses}} + {{:helper.link(value.name, null, {'access' : value.number}, null, value.active ? 'selected' : null)}} + {{/for}} + {{/if}} {{/if}} diff --git a/paradise.dme b/paradise.dme index 9c403b2d803..ccbdd95af88 100644 --- a/paradise.dme +++ b/paradise.dme @@ -905,6 +905,7 @@ #include "code\modules\admin\create_turf.dm" #include "code\modules\admin\holder2.dm" #include "code\modules\admin\IsBanned.dm" +#include "code\modules\admin\machine_upgrade.dm" #include "code\modules\admin\NewBan.dm" #include "code\modules\admin\newbanjob.dm" #include "code\modules\admin\player_notes.dm" @@ -1657,6 +1658,7 @@ #include "code\modules\reagents\reagent_containers\food\drinks\bottle\robot.dm" #include "code\modules\reagents\reagent_containers\food\snacks\candy.dm" #include "code\modules\reagents\reagent_containers\food\snacks\meat.dm" +#include "code\modules\reagents\reagent_containers\food\snacks\seafood.dm" #include "code\modules\reagents\reagent_containers\glass\bottle.dm" #include "code\modules\reagents\reagent_containers\glass\bottle\robot.dm" #include "code\modules\recycling\conveyor2.dm" diff --git a/sound/items/PSHOOM.ogg b/sound/items/PSHOOM.ogg new file mode 100644 index 00000000000..5628842f534 Binary files /dev/null and b/sound/items/PSHOOM.ogg differ diff --git a/sound/items/PSHOOM_2.ogg b/sound/items/PSHOOM_2.ogg new file mode 100644 index 00000000000..480b302fad8 Binary files /dev/null and b/sound/items/PSHOOM_2.ogg differ