diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm new file mode 100644 index 0000000000..05e6e4b63f --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_1x3.dmm @@ -0,0 +1,2760 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ac" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"at" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/cartridge/atmos, +/turf/open/floor/engine, +/area/engine/engineering) +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"aC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/engine, +/area/engine/supermatter) +"aX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space, +/area/space/nearstation) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bl" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/engine/engineering) +"bo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bq" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"bH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4; + name = "Output to Waste" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"bT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"cN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Cooling Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"cY" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"de" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Port"; + dir = 4; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"df" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/machinery/power/rad_collector/anchored, +/turf/open/floor/engine, +/area/engine/supermatter) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"dD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"ej" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Cooling Loop Bypass" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ey" = ( +/obj/structure/reflector/single/anchored{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ez" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"fa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fj" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"fq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fK" = ( +/obj/machinery/light, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"fW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gf" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"gj" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"gB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gQ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"hy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ii" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"in" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iC" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"iJ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas to Filter" + }, +/obj/machinery/airalarm/engine{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"iU" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"jp" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"jr" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"js" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jB" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"kW" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ln" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lw" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"lG" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) +"lQ" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"mi" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"mj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"mk" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"mW" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"mX" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/engine/engineering) +"nd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Cooling Loop to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"nH" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"nV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nW" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/rad_collector/anchored, +/turf/open/floor/engine, +/area/engine/supermatter) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"pb" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"px" = ( +/obj/machinery/status_display/ai, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"pA" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"pL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"pP" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qc" = ( +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"qe" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Bypass" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qA" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"rt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"ry" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"rJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering) +"rY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sm" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space, +/area/space/nearstation) +"sn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"so" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"sq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"sA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Gas to Mix" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"td" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"te" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"ti" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"tn" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/machinery/power/rad_collector/anchored, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"un" = ( +/obj/structure/reflector/single/anchored{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"uz" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"uC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"uR" = ( +/obj/machinery/power/supermatter_crystal/engine, +/turf/open/floor/engine, +/area/engine/supermatter) +"vD" = ( +/obj/structure/girder, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"vN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vO" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vX" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wz" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"wG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"xo" = ( +/obj/structure/reflector/box/anchored{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"xB" = ( +/turf/open/floor/engine, +/area/engine/engineering) +"yd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"yA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"yD" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yZ" = ( +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Fore"; + dir = 1; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"zf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zh" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/pipe_dispenser, +/turf/open/floor/engine, +/area/engine/engineering) +"zF" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"zS" = ( +/turf/open/space/basic, +/area/space) +"Ab" = ( +/obj/item/crowbar/large, +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Ah" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Bl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/geiger_counter, +/obj/item/geiger_counter, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"BD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Output Release" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Cb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Cn" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"CT" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Chamber" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"CW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Dj" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Dz" = ( +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"DA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ef" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Es" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ex" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ey" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"EM" = ( +/obj/item/wrench, +/obj/structure/rack, +/obj/item/weldingtool/hugetank, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Fr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Gb" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Gl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Starboard"; + dir = 8; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Gz" = ( +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_y = -24; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"GK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"GX" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Hj" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Hw" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Hz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ik" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"In" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"IE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"IF" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/emitter/anchored{ + dir = 8; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Jn" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Jp" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"JH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"JK" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"JV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Laser Room"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"KX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"KZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) +"Le" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Lg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Lv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Lw" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"LJ" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/engineering) +"LS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Ml" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8; + filter_type = "n2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Mr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Mu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"MJ" = ( +/turf/open/floor/plating, +/area/engine/engineering) +"MK" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Np" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Nx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NK" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"NU" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Aft"; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/engine, +/area/engine/engineering) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"OK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pa" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External Gas to Loop" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"Ph" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Py" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Qn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"Qu" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/engine, +/area/engine/engineering) +"QD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"QJ" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"RA" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"RV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"Sn" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"SL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"SR" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"SX" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"TB" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"TC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"TO" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ub" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Uq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ur" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uu" = ( +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"UM" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"UN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Vg" = ( +/obj/item/wrench, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Vn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Vz" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"VP" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Wf" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"WB" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"WI" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"WT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Xy" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"XA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"XG" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"XK" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"XY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"YB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YD" = ( +/obj/structure/reflector/double/anchored{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"YF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YX" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Filter" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ZO" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ZT" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +pL +aX +pL +yA +Sn +yA +yA +Sn +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +uC +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +yf +yf +yf +yf +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +yf +yf +Rh +yf +yf +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +bI +KZ +lG +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +YZ +YZ +tw +Rh +Rh +Rh +yf +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +sq +aA +rJ +gf +rJ +rJ +td +yf +yf +yf +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(11,1,1) = {" +oC +GB +UN +sn +sn +sn +de +GK +wG +TC +mj +fW +at +XA +td +MP +MP +MP +MP +MP +MP +yf +WB +YZ +WB +yf +"} +(12,1,1) = {" +cS +hJ +qe +ry +ry +ry +ry +cX +ry +ry +nd +ry +yD +Ex +ck +iC +Uu +kW +Uu +EM +MP +yf +YZ +Oj +YZ +yf +"} +(13,1,1) = {" +ME +qr +Hz +gj +bl +te +ez +Mr +DA +ej +Dz +jZ +gB +SR +SX +Vn +Vn +cp +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(14,1,1) = {" +Ne +yd +bW +VP +Qu +Vg +KX +px +nW +Vz +cN +xB +WI +IE +JV +Bc +JH +Lv +XY +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(15,1,1) = {" +MP +zh +QD +Hj +rt +lQ +KX +RA +tE +Vz +cN +Xy +Ml +Ef +iD +MJ +QJ +pP +pP +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(16,1,1) = {" +MP +aC +bW +TO +fK +uz +RA +ti +YY +Vz +cN +JK +WT +Ef +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(17,1,1) = {" +oS +fa +bW +ZO +yZ +qA +iJ +pb +so +jr +js +CW +YF +Py +iD +YD +Uu +Uu +ey +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(18,1,1) = {" +iD +fa +bW +YX +Qu +aV +jp +tn +uR +Jp +NU +Hw +ac +ac +iD +xo +Uu +xo +vD +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(19,1,1) = {" +oS +fa +bW +vO +Gz +lE +CT +Gb +UM +Wf +Mu +jB +Nx +aw +iD +Uu +Uu +Uu +un +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(20,1,1) = {" +MP +Bl +bW +iU +fK +RA +Wf +mW +bq +Vz +cN +JK +WT +Ef +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(21,1,1) = {" +MP +nV +mE +vO +Pa +wz +fj +RA +cY +Vz +cN +vO +Np +Ef +iD +MJ +Dj +IF +Dj +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(22,1,1) = {" +iD +fa +hy +vO +Pa +Ey +fj +Cn +df +Vz +cN +JK +lw +bH +JV +Bc +Ph +Ph +nH +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(23,1,1) = {" +iD +vX +bo +GX +mk +Ik +SL +YB +RV +qm +MK +ii +rY +Qn +ab +ZH +ZH +MI +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(24,1,1) = {" +mH +bT +Lg +zf +ry +ry +ry +OK +ry +ry +sA +ry +mX +BD +Uq +zF +Uu +GI +Uu +Ab +MP +Rh +YZ +Oj +YZ +yf +"} +(25,1,1) = {" +iD +mU +in +Ur +Es +Kv +Gl +aY +Kv +Kv +Fr +vN +nz +In +Ub +MP +MP +MP +MP +MP +MP +yf +YZ +YZ +YZ +yf +"} +(26,1,1) = {" +wt +av +kA +qo +EL +MP +MP +Cb +Uu +Uu +pA +jg +qc +fq +LS +Hn +dw +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +Uu +mi +NK +NK +Ah +Uu +Jn +MP +dw +dw +dw +Rh +Rh +Rh +Rh +tw +Rh +Rh +Rh +Rh +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +gx +TB +gQ +gQ +ln +XK +MP +yf +yf +Rh +yf +Rh +Oj +YZ +yf +yf +Rh +yf +yf +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +MP +MP +MP +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +yf +Rh +yf +zS +"} diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm new file mode 100644 index 0000000000..3356ebaa77 --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_3x.dmm @@ -0,0 +1,2777 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ac" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"at" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/cartridge/atmos, +/turf/open/floor/engine, +/area/engine/engineering) +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"aC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aV" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"aX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space, +/area/space/nearstation) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bo" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/valve{ + dir = 4; + name = "Output to Waste" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"bT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Cooling Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"de" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Port"; + dir = 4; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"df" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"dD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"ej" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Cooling Loop Bypass" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ey" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/engine, +/area/engine/supermatter) +"ez" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"fa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fj" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"fq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fK" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"fW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gf" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"gj" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"gB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gQ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"hy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ii" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"in" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iC" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"iJ" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"iU" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"jp" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"js" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"jB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"jZ" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"kW" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ln" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lw" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lE" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Chamber" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"lG" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) +"mi" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"mj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"mE" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"mX" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/engine, +/area/engine/engineering) +"na" = ( +/obj/machinery/camera{ + c_tag = "Supermatter Chamber"; + network = list("engine"); + pixel_x = 23 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"nd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Cooling Loop to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ni" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"nH" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"nV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nW" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/turf/open/floor/plating, +/area/engine/supermatter) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"px" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"pA" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"pL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"pP" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qc" = ( +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"qe" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Bypass" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qA" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas to Filter" + }, +/obj/machinery/airalarm/engine{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"re" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"rt" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ry" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"rJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering) +"rY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sm" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space, +/area/space/nearstation) +"sn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"so" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"sq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"sA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Gas to Mix" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"td" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"te" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tE" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"un" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"uC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"uR" = ( +/obj/machinery/power/supermatter_crystal/engine, +/turf/open/floor/engine, +/area/engine/supermatter) +"vD" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"vN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vO" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vX" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wz" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"wG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"xo" = ( +/obj/structure/reflector/box/anchored{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"xB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"yA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"yD" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yZ" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"zf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zh" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/pipe_dispenser, +/turf/open/floor/engine, +/area/engine/engineering) +"zF" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"zS" = ( +/turf/open/space/basic, +/area/space) +"Ab" = ( +/obj/item/crowbar/large, +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Ah" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Bk" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"Bl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/geiger_counter, +/obj/item/geiger_counter, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"BD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/components/binary/valve/digital/on{ + dir = 4; + name = "Output Release" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Cb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Cn" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"CT" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"CW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Dz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"DA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ef" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Es" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ex" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"EM" = ( +/obj/item/wrench, +/obj/structure/rack, +/obj/item/weldingtool/hugetank, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"EX" = ( +/obj/item/wrench, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Fr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"FL" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Gl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Starboard"; + dir = 8; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Gz" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"GK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"GX" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Hj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Hw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Aft"; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Hz" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ik" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"In" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"IE" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"IF" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/emitter/anchored{ + dir = 8; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Jn" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"JH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"JK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"JL" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"JV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Laser Room"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"KX" = ( +/obj/machinery/status_display/ai, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"KZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) +"Le" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Lg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Lv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Lw" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"LE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_y = -24; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"LJ" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/engineering) +"LS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Ml" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8; + filter_type = "n2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Mr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"MJ" = ( +/turf/open/floor/plating, +/area/engine/engineering) +"MK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Np" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Nw" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"Nx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NK" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"NU" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plating, +/area/engine/supermatter) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"OK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"OR" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pa" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External Gas to Loop" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Ph" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Py" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Qn" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"Qu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/engine, +/area/engine/supermatter) +"QD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"RA" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine, +/area/engine/supermatter) +"RV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"Sn" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"SL" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"SR" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"SX" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"TB" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"TC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"TO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ub" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Uq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ur" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uu" = ( +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"UN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Vg" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Vn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"VN" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External Gas to Loop" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"VP" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Wf" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Ws" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"WB" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"WI" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"WT" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Xy" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"XA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"XG" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"XK" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"XY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"YB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YX" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Filter" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ZO" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Fore"; + dir = 1; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ZT" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +pL +aX +pL +yA +Sn +yA +yA +Sn +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +uC +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +yf +yf +yf +yf +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +yf +yf +Rh +yf +yf +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +bI +KZ +lG +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +YZ +YZ +tw +Rh +Rh +Rh +yf +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +sq +aA +rJ +gf +rJ +rJ +td +yf +yf +yf +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(11,1,1) = {" +oC +GB +UN +sn +sn +sn +de +GK +wG +TC +mj +fW +at +XA +td +MP +MP +MP +MP +MP +MP +yf +WB +YZ +WB +yf +"} +(12,1,1) = {" +cS +hJ +qe +ry +ry +ry +ry +cX +ry +ry +nd +ry +yD +Ex +ck +iC +Uu +kW +Uu +EM +MP +yf +YZ +Oj +YZ +yf +"} +(13,1,1) = {" +ME +qr +Hz +gj +te +te +ez +Mr +DA +ej +Dz +jZ +gB +SR +SX +Vn +Vn +cp +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(14,1,1) = {" +Ne +yd +bW +VP +EX +Vg +KX +px +nW +Cn +fj +xB +WI +IE +JV +Bc +JH +Lv +XY +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(15,1,1) = {" +MP +zh +QD +Hj +rt +Vg +JL +na +tE +tE +JL +Xy +Ml +Ef +iD +MJ +pP +pP +pP +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(16,1,1) = {" +MP +aC +bW +TO +fK +JL +JL +Bk +Bk +Bk +FL +JK +WT +Ef +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(17,1,1) = {" +oS +fa +bW +ZO +yZ +qA +iJ +so +uR +ey +js +CW +YF +Py +iD +Uu +xo +Uu +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(18,1,1) = {" +iD +fa +bW +YX +Qu +aV +jp +so +uR +ey +NU +Hw +ac +ac +iD +Uu +Uu +xo +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(19,1,1) = {" +oS +fa +bW +LE +Gz +lE +CT +so +uR +ey +un +jB +Nx +aw +iD +Uu +Uu +Uu +xo +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(20,1,1) = {" +MP +Bl +bW +iU +JL +OR +Wf +RA +RA +RA +vD +JK +WT +Ef +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(21,1,1) = {" +MP +nV +mE +Ws +VN +wz +JL +tE +tE +tE +JL +vO +Np +Ef +iD +MJ +IF +IF +IF +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(22,1,1) = {" +iD +fa +hy +Ws +Pa +wz +fj +Nw +df +re +KX +ni +lw +bH +JV +Bc +Ph +Ph +nH +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(23,1,1) = {" +iD +vX +bo +GX +Ik +Ik +SL +YB +RV +qm +MK +ii +rY +Qn +ab +ZH +ZH +MI +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(24,1,1) = {" +mH +bT +Lg +zf +ry +ry +ry +OK +ry +ry +sA +ry +mX +BD +Uq +zF +Uu +GI +Uu +Ab +MP +Rh +YZ +Oj +YZ +yf +"} +(25,1,1) = {" +iD +mU +in +Ur +Es +Kv +Gl +aY +Kv +Kv +Fr +vN +nz +In +Ub +MP +MP +MP +MP +MP +MP +yf +YZ +YZ +YZ +yf +"} +(26,1,1) = {" +wt +av +kA +qo +EL +MP +MP +Cb +Uu +Uu +pA +jg +qc +fq +LS +Hn +dw +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +Uu +mi +NK +NK +Ah +Uu +Jn +MP +dw +dw +dw +Rh +Rh +Rh +Rh +tw +Rh +Rh +Rh +Rh +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +gx +TB +gQ +gQ +ln +XK +MP +yf +yf +Rh +yf +Rh +Oj +YZ +yf +yf +Rh +yf +yf +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +MP +MP +MP +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +yf +Rh +yf +zS +"} diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm new file mode 100644 index 0000000000..2b24fa2a70 --- /dev/null +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm @@ -0,0 +1,2871 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"ab" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ac" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"at" = ( +/obj/structure/closet/crate/bin, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/cartridge/atmos, +/turf/open/floor/engine, +/area/engine/engineering) +"av" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"aC" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/tank/internals/emergency_oxygen/engi{ + pixel_x = 5 + }, +/obj/item/clothing/gloves/color/black, +/obj/item/clothing/glasses/meson/engine, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"aV" = ( +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"aX" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/turf/open/space, +/area/space/nearstation) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bo" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bH" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bI" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"bT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"bW" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cp" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"cP" = ( +/obj/structure/table, +/obj/item/clothing/gloves/color/yellow, +/obj/item/storage/toolbox/electrical{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"cS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"cX" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Cooling Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"de" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Port"; + dir = 4; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"df" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/oil, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"dl" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"dw" = ( +/obj/structure/lattice/catwalk, +/turf/open/space, +/area/space/nearstation) +"dD" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"ej" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/binary/pump{ + name = "Cooling Loop Bypass" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ey" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ez" = ( +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"fa" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/firealarm{ + dir = 1; + pixel_y = -26 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Fore"; + dir = 1; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"fq" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"fK" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"fW" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gf" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"gj" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 8; + name = "Gas to Filter" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"gx" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"gB" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"gQ" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"hy" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hJ" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"hK" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 5 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"ii" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"in" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iC" = ( +/obj/structure/rack, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = 6 + }, +/obj/item/storage/toolbox/artistic{ + icon_state = "yellow"; + item_state = "toolbox_yellow"; + name = "Cable Toolbox"; + pixel_y = -4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"iD" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"iJ" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/button/door{ + id = "engsm"; + name = "Radiation Shutters Control"; + pixel_y = -24; + req_access_txt = "10" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"iU" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"jg" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"jp" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"js" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External Gas to Loop" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"jB" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"jZ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"kA" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"kW" = ( +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ln" = ( +/obj/structure/closet/firecloset, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"lw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"lE" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"lG" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) +"mi" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"mj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/engine, +/area/engine/engineering) +"mE" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"mH" = ( +/obj/structure/sign/poster/official/safety_eye_protection, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"mU" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"mW" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"mX" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"na" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"nd" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Cooling Loop to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ni" = ( +/obj/machinery/status_display/ai, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"nz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/engine/engineering) +"nH" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"nR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"nV" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/clothing/glasses/meson, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"nW" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/item/tank/internals/plasma, +/turf/open/floor/plating, +/area/engine/supermatter) +"ou" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"oC" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"oS" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"px" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"pA" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"pL" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"pP" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/emitter/anchored{ + dir = 4; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qc" = ( +/obj/structure/table, +/obj/item/pipe_dispenser, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"qe" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Mix Bypass" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qo" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"qr" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"qA" = ( +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"re" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"rt" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ry" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"rJ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/engine/engineering) +"rY" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"sm" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 6 + }, +/turf/open/space, +/area/space/nearstation) +"sn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"so" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"sq" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"sA" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 4; + name = "Gas to Mix" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"td" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"te" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"ti" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"tn" = ( +/turf/open/floor/engine, +/area/engine/supermatter) +"tw" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tE" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"un" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"uC" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"uR" = ( +/obj/machinery/power/supermatter_crystal/engine, +/turf/open/floor/engine, +/area/engine/supermatter) +"vD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"vN" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"vO" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"vX" = ( +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/engineering) +"wz" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"wG" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"wS" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"xo" = ( +/obj/structure/reflector/box/anchored{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"xB" = ( +/obj/machinery/status_display, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"yd" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yf" = ( +/turf/open/space/basic, +/area/space/nearstation) +"yA" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"yD" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"yZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "Gas to Filter" + }, +/obj/machinery/airalarm/engine{ + dir = 4; + pixel_x = -23 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"zf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Atmos to Loop" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zh" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/structure/table/reinforced, +/obj/item/storage/toolbox/mechanical, +/obj/item/flashlight, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/item/pipe_dispenser, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"zF" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"zS" = ( +/turf/open/space/basic, +/area/space) +"Ab" = ( +/obj/item/crowbar/large, +/obj/structure/rack, +/obj/item/flashlight, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Ah" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"AH" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Bc" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Bk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"Bl" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/table/reinforced, +/obj/item/clothing/suit/radiation, +/obj/item/clothing/head/radiation, +/obj/item/clothing/glasses/meson, +/obj/item/geiger_counter, +/obj/item/geiger_counter, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"BD" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Cb" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Cn" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"CH" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Supermatter Engine Room"; + req_access_txt = "10" + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"CT" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Supermatter Chamber"; + network = list("engine"); + pixel_x = 23 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"CW" = ( +/obj/structure/sign/warning/electricshock, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Dj" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 4 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Supermatter Chamber"; + network = list("engine"); + pixel_x = 23 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"Dz" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/manifold/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"DA" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"DC" = ( +/obj/structure/rack, +/obj/item/clothing/mask/gas{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/mask/gas, +/obj/item/clothing/mask/gas{ + pixel_x = -3; + pixel_y = -3 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Ef" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8; + filter_type = "n2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ei" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Es" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ex" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"EL" = ( +/turf/closed/wall, +/area/engine/engineering) +"EM" = ( +/obj/item/wrench, +/obj/structure/rack, +/obj/item/weldingtool/hugetank, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/head/welding{ + pixel_x = -3; + pixel_y = 5 + }, +/obj/item/clothing/glasses/welding, +/obj/item/clothing/glasses/welding, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"EX" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/effect/turf_decal/bot, +/obj/machinery/portable_atmospherics/canister, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Fr" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"FG" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Gl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Starboard"; + dir = 8; + network = list("ss13","engine") + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Gz" = ( +/obj/machinery/atmospherics/components/binary/pump{ + name = "Gas to Chamber" + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"GB" = ( +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"GI" = ( +/obj/machinery/firealarm{ + dir = 4; + pixel_x = 24 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"GK" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"GX" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Hj" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 4 + }, +/obj/machinery/meter, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Hn" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ + dir = 1 + }, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Hw" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/supermatter) +"Hz" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ik" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"In" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"IE" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"IF" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/emitter/anchored{ + dir = 8; + state = 2 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Jn" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"JH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"JK" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"JL" = ( +/obj/structure/sign/warning/fire, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"JV" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/engineering/glass{ + name = "Laser Room"; + req_access_txt = "10" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Ke" = ( +/obj/structure/table, +/obj/item/storage/toolbox/mechanical{ + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/obj/item/flashlight{ + pixel_x = 1; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Kv" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"KX" = ( +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-8" + }, +/obj/structure/window/plasma/reinforced{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"KZ" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/turf/open/space, +/area/space/nearstation) +"Le" = ( +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 10 + }, +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"Lg" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Lv" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Lw" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"LE" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"LJ" = ( +/obj/machinery/light, +/turf/open/floor/plating, +/area/engine/engineering) +"LS" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, +/turf/open/floor/plating/airless, +/area/engine/engineering) +"Ml" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 6 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Mr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/yellow{ + icon_state = "1-4" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ME" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"MI" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"MJ" = ( +/turf/open/floor/plating, +/area/engine/engineering) +"MK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"MP" = ( +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ne" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/plasma/reinforced, +/turf/open/floor/plating, +/area/engine/engineering) +"Np" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Nw" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + id = "engsm"; + name = "Radiation Chamber Shutters" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/engine/supermatter) +"Nx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"ND" = ( +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/obj/machinery/door/airlock/external{ + name = "Engineering External Access"; + req_access_txt = "10;13" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"NK" = ( +/obj/machinery/atmospherics/pipe/manifold/general/visible{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"NU" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 9 + }, +/obj/machinery/power/rad_collector/anchored, +/obj/structure/cable/yellow{ + icon_state = "0-4" + }, +/obj/structure/window/plasma/reinforced{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"NZ" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Oj" = ( +/turf/closed/wall/r_wall, +/area/space/nearstation) +"Ok" = ( +/turf/open/floor/plasteel, +/area/engine/engineering) +"OK" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8; + name = "Mix to Gas" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"OR" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"OU" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/obj/machinery/meter, +/turf/open/floor/plasteel, +/area/engine/engineering) +"Pa" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Ph" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Py" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Qn" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Qu" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/engine, +/area/engine/supermatter) +"QD" = ( +/obj/effect/turf_decal/stripes/line, +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"QJ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Engineering Supermatter Aft"; + network = list("ss13","engine"); + pixel_x = 23 + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Rh" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space/nearstation) +"RA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"RV" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine, +/area/engine/engineering) +"Sn" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple, +/turf/open/space, +/area/space/nearstation) +"SL" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/turf/open/floor/engine, +/area/engine/engineering) +"SR" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 5 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"SX" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"Tk" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/closet/emcloset/anchored, +/turf/open/floor/plating, +/area/engine/engineering) +"TB" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"TC" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"TO" = ( +/obj/structure/sign/warning/radiation, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Ub" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Uq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"Ur" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Uu" = ( +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"UM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"UN" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"UP" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"Vg" = ( +/obj/machinery/status_display/ai, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"Vn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"VN" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/nitrogen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"VP" = ( +/obj/item/wrench, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 6 + }, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"Wf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/supermatter) +"Ws" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1; + name = "External Gas to Loop" + }, +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"WB" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"WI" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"WT" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"Xy" = ( +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"XA" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/engine/engineering) +"XG" = ( +/obj/structure/lattice/catwalk, +/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ + dir = 4 + }, +/turf/open/space, +/area/space/nearstation) +"XK" = ( +/obj/structure/closet/secure_closet/engineering_personal, +/obj/item/radio/headset/headset_eng, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"XY" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/engine/engineering) +"YB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable/yellow{ + icon_state = "1-8" + }, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YD" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ + dir = 8 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/turf/open/floor/engine, +/area/engine/engineering) +"YX" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/door/airlock/engineering/glass/critical{ + heat_proof = 1; + name = "Supermatter Chamber"; + req_access_txt = "10" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/engine, +/area/engine/supermatter) +"YZ" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) +"Zn" = ( +/obj/structure/sign/warning/vacuum/external{ + pixel_x = 32 + }, +/turf/open/floor/plating, +/area/engine/engineering) +"ZH" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/engine/engineering) +"ZO" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible, +/turf/closed/wall/r_wall, +/area/engine/supermatter) +"ZT" = ( +/turf/template_noop, +/area/template_noop) + +(1,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +yf +Rh +yf +yf +Rh +yf +yf +Rh +yf +yf +yf +YZ +YZ +YZ +ZT +ZT +ZT +ZT +ZT +"} +(2,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +pL +aX +pL +yA +Sn +yA +yA +Sn +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(3,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(4,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +uC +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(5,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(6,1,1) = {" +ZT +ZT +ZT +ZT +ZT +ZT +ZT +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +ZT +ZT +ZT +ZT +ZT +"} +(7,1,1) = {" +ZT +ZT +ZT +ZT +EL +EL +MP +bI +XG +bI +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +Oj +YZ +yf +yf +yf +yf +zS +"} +(8,1,1) = {" +ZT +ZT +cP +Ke +EL +Tk +MP +wS +XG +uC +Le +dD +yA +yA +dD +hK +yf +yf +YZ +Oj +YZ +yf +yf +Rh +yf +yf +"} +(9,1,1) = {" +ZT +ZT +dl +Ok +ND +Zn +Ei +bI +KZ +lG +sm +dD +Sn +Sn +dD +lG +Rh +Rh +YZ +YZ +YZ +tw +Rh +Rh +Rh +yf +"} +(10,1,1) = {" +ZT +nR +AH +iD +MP +MP +MP +sq +aA +rJ +gf +rJ +rJ +td +yf +yf +yf +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(11,1,1) = {" +oC +GB +UN +sn +sn +sn +de +GK +wG +TC +mj +fW +at +XA +td +MP +MP +MP +MP +MP +MP +yf +WB +YZ +WB +yf +"} +(12,1,1) = {" +cS +hJ +qe +ry +ry +ry +ry +cX +ry +ry +nd +ry +yD +Ex +ck +iC +Uu +kW +Uu +EM +MP +yf +YZ +Oj +YZ +yf +"} +(13,1,1) = {" +ME +qr +Hz +te +te +so +ez +Mr +DA +ej +Dz +jZ +gB +SR +SX +Vn +Vn +cp +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(14,1,1) = {" +Ne +yd +bW +VP +EX +Vg +px +px +nW +Cn +Cn +xB +WI +IE +JV +Bc +JH +Lv +XY +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(15,1,1) = {" +MP +zh +QD +Hj +EX +un +CT +na +na +KX +KX +Xy +Ml +Ef +iD +MJ +pP +pP +pP +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(16,1,1) = {" +MP +aC +ey +TO +Xy +OR +UP +UP +UP +UP +UP +Xy +WT +UM +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(17,1,1) = {" +oS +fa +fj +ZO +yZ +qA +tn +tn +tn +tn +tn +CW +YF +Py +iD +Uu +Uu +Uu +Uu +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(18,1,1) = {" +iD +fa +gj +YX +Qu +aV +tn +tn +uR +tn +tn +Hw +QJ +ac +iD +Uu +xo +xo +xo +Uu +MP +yf +YZ +Oj +YZ +yf +"} +(19,1,1) = {" +oS +fa +iJ +LE +Gz +lE +tn +tn +tn +tn +tn +JL +Nx +aw +iD +Uu +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(20,1,1) = {" +MP +Bl +jp +Xy +JL +OR +Wf +Wf +Wf +Wf +Wf +Xy +WT +UM +MP +Lw +Uu +Uu +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(21,1,1) = {" +MP +nV +mE +Ws +VN +wz +Dj +tE +tE +NU +NU +Xy +Np +YD +iD +MJ +IF +IF +IF +MJ +MP +yf +YZ +Oj +YZ +yf +"} +(22,1,1) = {" +iD +fa +mE +js +VN +xB +Nw +Nw +df +re +re +Vg +lw +bH +JV +Bc +Ph +Ph +nH +LJ +MP +Rh +YZ +Oj +YZ +Rh +"} +(23,1,1) = {" +iD +vX +bo +GX +Ik +vD +SL +YB +RV +qm +MK +ii +rY +Qn +ab +ZH +ZH +MI +Uu +Uu +MP +Rh +YZ +Oj +YZ +yf +"} +(24,1,1) = {" +mH +bT +Lg +zf +ry +ry +ry +OK +ry +ry +sA +ry +mX +BD +Uq +zF +Uu +GI +Uu +Ab +MP +Rh +YZ +Oj +YZ +yf +"} +(25,1,1) = {" +iD +mU +in +Ur +Es +Kv +Gl +aY +Kv +Kv +Fr +vN +nz +In +Ub +MP +MP +MP +MP +MP +MP +yf +YZ +YZ +YZ +yf +"} +(26,1,1) = {" +wt +av +kA +qo +EL +MP +MP +Cb +Uu +Uu +pA +jg +qc +fq +LS +Hn +dw +yf +Rh +yf +yf +yf +yf +Rh +yf +yf +"} +(27,1,1) = {" +ZT +ZT +ZT +ou +DC +iD +Uu +mi +NK +NK +Ah +Uu +Jn +MP +dw +dw +dw +Rh +Rh +Rh +Rh +tw +Rh +Rh +Rh +Rh +"} +(28,1,1) = {" +ZT +ZT +ZT +OU +Ok +CH +GI +gx +TB +gQ +gQ +ln +XK +MP +yf +yf +Rh +yf +Rh +Oj +YZ +yf +yf +Rh +yf +yf +"} +(29,1,1) = {" +ZT +ZT +ZT +FG +NZ +MP +MP +MP +MP +MP +iD +iD +iD +MP +Rh +Rh +Rh +Rh +Rh +Oj +YZ +yf +yf +Rh +yf +zS +"} diff --git a/_maps/RandomZLevels/Cabin.dmm b/_maps/RandomZLevels/Cabin.dmm index f4a18fd87c..4d07c02565 100644 --- a/_maps/RandomZLevels/Cabin.dmm +++ b/_maps/RandomZLevels/Cabin.dmm @@ -967,10 +967,6 @@ }, /turf/open/floor/plating, /area/awaymission/cabin) -"dw" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/closed/indestructible/rock/snow, -/area/space) (1,1,1) = {" aa @@ -1227,7 +1223,7 @@ aa aa aa aa -dw +aa "} (2,1,1) = {" aa diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index 8f6eda450c..bae0b05e3d 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -4,9 +4,15 @@ /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave/mountain) "ab" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowdin/cave/mountain) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/simple_animal/hostile/netherworld/migo, +/turf/open/floor/plasteel, +/area/awaymission/snowdin/post/mining_dock) "ac" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave/mountain) @@ -10267,16 +10273,6 @@ /obj/item/shard, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"xA" = ( -/mob/living/simple_animal/hostile/netherworld/migo, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_dock) "xB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -16013,7 +16009,7 @@ ac ac "} (2,1,1) = {" -ab +ac ac ac ac @@ -66518,7 +66514,7 @@ wD wT xe xs -xA +ab xI xN wL diff --git a/_maps/RandomZLevels/caves.dmm b/_maps/RandomZLevels/caves.dmm index d50480c381..96c1a08b1f 100644 --- a/_maps/RandomZLevels/caves.dmm +++ b/_maps/RandomZLevels/caves.dmm @@ -2251,10 +2251,6 @@ initial_gas_mix = "n2=23;o2=14" }, /area/awaymission/caves/BMP_asteroid) -"gW" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/closed/indestructible/rock, -/area/space/nearstation) "gX" = ( /obj/effect/baseturf_helper/lava, /turf/closed/mineral/volcanic, @@ -2536,7 +2532,7 @@ aa aa aa aa -gW +aa "} (2,1,1) = {" aa diff --git a/_maps/RandomZLevels/moonoutpost19.dmm b/_maps/RandomZLevels/moonoutpost19.dmm index ddc8778ac1..8c33326703 100644 --- a/_maps/RandomZLevels/moonoutpost19.dmm +++ b/_maps/RandomZLevels/moonoutpost19.dmm @@ -7215,10 +7215,6 @@ heat_capacity = 1e+006 }, /area/awaymission/moonoutpost19/research) -"oV" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/open/space, -/area/space) "vV" = ( /obj/machinery/door/airlock/external, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ @@ -7512,7 +7508,7 @@ aa aa aa aa -oV +aa "} (2,1,1) = {" aa diff --git a/_maps/RandomZLevels/snowdin.dmm b/_maps/RandomZLevels/snowdin.dmm index 525c8fcf7b..57e03061dd 100644 --- a/_maps/RandomZLevels/snowdin.dmm +++ b/_maps/RandomZLevels/snowdin.dmm @@ -4,9 +4,15 @@ /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave/mountain) "ab" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/closed/indestructible/rock/snow, -/area/awaymission/snowdin/cave/mountain) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/mob/living/simple_animal/hostile/netherworld/migo, +/turf/open/floor/plasteel, +/area/awaymission/snowdin/post/mining_dock) "ac" = ( /turf/closed/indestructible/rock/snow, /area/awaymission/snowdin/cave/mountain) @@ -10331,16 +10337,6 @@ /obj/item/shard, /turf/open/floor/plating, /area/awaymission/snowdin/post/mining_dock) -"xA" = ( -/mob/living/simple_animal/hostile/netherworld/migo, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/snowdin/post/mining_dock) "xB" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -16108,7 +16104,7 @@ ac ac "} (2,1,1) = {" -ab +ac ac ac ac @@ -66613,7 +66609,7 @@ wD wT xe xs -xA +ab xI xN wL diff --git a/_maps/RandomZLevels/spacebattle.dmm b/_maps/RandomZLevels/spacebattle.dmm index 21cd37f78f..66d7f556b4 100644 --- a/_maps/RandomZLevels/spacebattle.dmm +++ b/_maps/RandomZLevels/spacebattle.dmm @@ -5,6 +5,16 @@ "ab" = ( /turf/open/space, /area/space) +"ac" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/mob/living/simple_animal/hostile/syndicate/melee/sword, +/turf/open/floor/plasteel, +/area/awaymission/spacebattle/cruiser) "ad" = ( /obj/structure/shuttle/engine/propulsion/right{ dir = 1 @@ -2597,16 +2607,6 @@ /obj/effect/spawner/lootdrop/armory_contraband, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) -"jK" = ( -/mob/living/simple_animal/hostile/syndicate/melee/sword, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/awaymission/spacebattle/cruiser) "jL" = ( /obj/machinery/door/poddoor{ id = "spacebattlearmory"; @@ -2894,10 +2894,6 @@ /obj/item/mecha_parts/mecha_equipment/weapon/energy/ion, /turf/open/floor/plating, /area/awaymission/spacebattle/cruiser) -"kM" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/closed/mineral/random, -/area/space/nearstation) "vw" = ( /turf/closed/wall/mineral/plastitanium/nodiagonal, /area/awaymission/spacebattle/syndicate5) @@ -3175,7 +3171,7 @@ aa aa aa aa -kM +aa "} (2,1,1) = {" aa @@ -35686,10 +35682,10 @@ eC cn fL cp -jK +ac fs fO -jK +ac eM eM eM diff --git a/_maps/RandomZLevels/undergroundoutpost45.dmm b/_maps/RandomZLevels/undergroundoutpost45.dmm index f6d46ef97d..56018b943a 100644 --- a/_maps/RandomZLevels/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/undergroundoutpost45.dmm @@ -25,6 +25,9 @@ "ag" = ( /turf/closed/wall/mineral/titanium, /area/awaymission/undergroundoutpost45/central) +"ah" = ( +/turf/open/space, +/area/space/nearstation) "aj" = ( /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel{ @@ -13945,10 +13948,6 @@ temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) -"zi" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/open/space, -/area/space/nearstation) "KE" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -14211,7 +14210,7 @@ aa aa aa aa -zi +ah "} (2,1,1) = {" aa diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index 92ceb0ac34..b6463f7147 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -35,6 +35,12 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/bar) +"aad" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "aae" = ( /obj/effect/landmark/carpspawn, /turf/open/space, @@ -139,7 +145,6 @@ /obj/structure/sign/warning/electricshock{ pixel_y = 32 }, -/obj/machinery/seed_extractor, /turf/open/floor/plasteel, /area/security/prison) "aat" = ( @@ -168,6 +173,10 @@ "aay" = ( /turf/open/floor/plating, /area/security/prison) +"aaA" = ( +/obj/machinery/seed_extractor, +/turf/open/floor/plasteel, +/area/security/prison) "aaB" = ( /obj/structure/window/reinforced, /obj/machinery/hydroponics/soil, @@ -226,10 +235,6 @@ /turf/open/floor/plasteel, /area/security/prison) "aaN" = ( -/obj/structure/chair/sofa/left, -/turf/open/floor/plasteel, -/area/security/prison) -"aaO" = ( /obj/structure/chair/sofa/right, /turf/open/floor/plasteel, /area/security/prison) @@ -262,12 +267,15 @@ /area/space/nearstation) "aaV" = ( /obj/structure/table/wood, -/obj/item/toy/cards/deck, +/obj/item/storage/pill_bottle/dice, /turf/open/floor/plasteel, /area/security/prison) "aaW" = ( -/obj/structure/table/wood, -/obj/item/storage/pill_bottle/dice, +/obj/effect/landmark/event_spawn, +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 4 + }, /turf/open/floor/plasteel, /area/security/prison) "aaX" = ( @@ -350,7 +358,6 @@ /obj/structure/table, /obj/item/storage/box/firingpins, /obj/item/storage/box/firingpins, -/obj/item/key/security, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -453,6 +460,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/security/execution/transfer) +"abz" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/engine, +/area/science/xenobiology) "abA" = ( /obj/machinery/light, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ @@ -1551,14 +1565,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/carpet, /area/crew_quarters/heads/hos) -"adO" = ( -/obj/effect/landmark/event_spawn, -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) "adP" = ( /obj/structure/cable{ icon_state = "2-8" @@ -1881,14 +1887,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/obj/item/gun/energy/pumpaction/blaster{ - pixel_x = 3; - pixel_y = -3 - }, -/obj/item/gun/energy/pumpaction/blaster{ - pixel_x = 3; - pixel_y = -3 - }, +/obj/item/key/security, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) "aet" = ( @@ -4904,6 +4903,9 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/security/brig) "akt" = ( @@ -4926,13 +4928,16 @@ /turf/open/floor/plasteel, /area/security/brig) "aku" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 }, +/turf/open/floor/plasteel, +/area/security/brig) +"akv" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) "akw" = ( @@ -4960,11 +4965,6 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) -"akz" = ( -/obj/machinery/vending/snack/random, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "akA" = ( /obj/structure/chair{ dir = 8; @@ -5174,6 +5174,9 @@ /obj/structure/cable{ icon_state = "1-8" }, +/obj/structure/cable{ + icon_state = "1-4" + }, /turf/open/floor/plasteel, /area/security/brig) "akX" = ( @@ -5197,6 +5200,40 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"akY" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating, +/area/security/brig) +"ala" = ( +/obj/machinery/door/window/brigdoor/security/cell{ + desc = "A rare fourth cell, known for faulty wiring..."; + id = "Cell 4"; + name = "Cell 4" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/security/brig) "alb" = ( /obj/structure/chair{ dir = 4; @@ -5408,11 +5445,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/security/courtroom) -"alE" = ( -/obj/machinery/vending/cigarette, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) "alF" = ( /obj/machinery/atmospherics/components/unary/tank/air, /turf/open/floor/plating, @@ -5644,6 +5676,13 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/brig) +"amp" = ( +/obj/structure/closet/secure_closet/brig{ + id = "Cell 4"; + name = "Cell 4 Locker" + }, +/turf/open/floor/plasteel, +/area/security/brig) "amr" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -6482,8 +6521,8 @@ /area/hallway/primary/fore) "aoC" = ( /obj/effect/turf_decal/tile/red, -/obj/structure, /obj/item/storage/box/drinkingglasses, +/obj/structure/table, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoD" = ( @@ -6501,14 +6540,14 @@ /area/hallway/primary/fore) "aoE" = ( /obj/effect/turf_decal/tile/red, -/obj/structure, /obj/item/storage/box/cups, +/obj/structure/table, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoF" = ( /obj/effect/turf_decal/tile/red, -/obj/structure, /obj/machinery/chem_dispenser/drinks, +/obj/structure/table, /turf/open/floor/plasteel, /area/hallway/primary/fore) "aoG" = ( @@ -6666,6 +6705,7 @@ "ape" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/engineering/abandoned{ + abandoned = 0; name = "Vacant Office B"; req_access_txt = "32" }, @@ -9200,9 +9240,6 @@ /area/crew_quarters/dorms) "aww" = ( /obj/effect/landmark/event_spawn, -/obj/structure/cable{ - icon_state = "1-2" - }, /turf/open/floor/plasteel, /area/security/brig) "awx" = ( @@ -9581,15 +9618,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port/fore) -"axm" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/fore) "axn" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -9622,9 +9650,6 @@ /turf/open/floor/plating, /area/maintenance/fore) "axr" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = -32 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -10032,41 +10057,29 @@ /turf/closed/wall/r_wall, /area/maintenance/port/fore) "ayA" = ( -/obj/structure/cable{ - icon_state = "0-8" +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" }, +/obj/machinery/door/firedoor, /obj/structure/cable{ - icon_state = "0-4" + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, /area/maintenance/fore) "ayC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/maintenance/fore) "ayD" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, +/turf/open/floor/plasteel/dark, /area/maintenance/fore) "ayE" = ( /turf/closed/wall/r_wall, /area/maintenance/fore) -"ayF" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/fore) "ayG" = ( /turf/closed/wall/r_wall, /area/gateway) @@ -11313,18 +11326,21 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/nuke_storage) "aBU" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/machinery/atmospherics/pipe/manifold4w/supply, /turf/open/floor/wood, /area/crew_quarters/theatre) "aBV" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ dir = 8; light_color = "#e8eaff" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/wood, /area/crew_quarters/theatre) "aBW" = ( @@ -13591,6 +13607,15 @@ /obj/structure/sign/warning/securearea, /turf/closed/wall/r_wall, /area/ai_monitored/nuke_storage) +"aHG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "aHH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -14188,6 +14213,12 @@ /obj/machinery/disposal/bin, /turf/open/floor/plasteel, /area/storage/primary) +"aJe" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "aJf" = ( /obj/machinery/camera{ c_tag = "EVA South"; @@ -14605,17 +14636,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/storage/primary) -"aKb" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) "aKc" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/command{ @@ -14706,9 +14726,7 @@ /obj/item/radio/intercom{ pixel_y = 25 }, -/obj/machinery/camera{ - c_tag = "Theatre Stage" - }, +/obj/machinery/camera, /obj/structure/chair/comfy/brown{ dir = 4 }, @@ -14729,31 +14747,7 @@ /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/storage/primary) -"aKt" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) "aKu" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) -"aKv" = ( -/obj/structure/cable, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/crew_quarters/theatre) @@ -14761,12 +14755,6 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, /obj/machinery/door/firedoor, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -14781,13 +14769,9 @@ /obj/machinery/door/airlock/public/glass{ name = "Central Access" }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/theatre) -"aKx" = ( /obj/structure/cable{ - icon_state = "0-8" + icon_state = "1-2" }, -/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plasteel/dark, /area/crew_quarters/theatre) "aKy" = ( @@ -15088,9 +15072,6 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aLl" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/effect/turf_decal/stripes/corner{ dir = 4 @@ -15246,18 +15227,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aLJ" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "aLK" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, @@ -20011,6 +19980,7 @@ /area/chapel/main) "aXX" = ( /obj/machinery/door/airlock/engineering/abandoned{ + abandoned = 0; name = "Vacant Office A"; req_access_txt = "32" }, @@ -21831,12 +21801,10 @@ /turf/open/floor/carpet, /area/crew_quarters/heads/captain) "bcQ" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, -/turf/open/floor/carpet, +/turf/open/floor/wood, /area/crew_quarters/heads/captain) "bcR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -21906,6 +21874,9 @@ /area/hallway/primary/starboard) "bdd" = ( /obj/machinery/vending/cola/random, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/wood, /area/bridge/meeting_room) "bde" = ( @@ -21949,12 +21920,8 @@ /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/ai_upload) "bdi" = ( -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Captain's Desk"; - departmentType = 5; - name = "Captain RC"; - pixel_x = -30 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) @@ -22868,6 +22835,9 @@ dir = 8; pixel_x = 27 }, +/obj/machinery/light{ + dir = 4 + }, /turf/open/floor/wood, /area/bridge/meeting_room) "bfs" = ( @@ -22906,6 +22876,13 @@ pixel_y = 7 }, /obj/item/pen, +/obj/machinery/requests_console{ + announcementConsole = 1; + department = "Captain's Desk"; + departmentType = 5; + name = "Captain RC"; + pixel_x = -30 + }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bfz" = ( @@ -22927,6 +22904,14 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/captain) +"bfC" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) "bfD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -23354,9 +23339,6 @@ /turf/open/floor/wood, /area/bridge/meeting_room) "bgM" = ( -/obj/machinery/light{ - dir = 4 - }, /obj/structure/cable{ icon_state = "4-8" }, @@ -23386,14 +23368,9 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "bgS" = ( -/obj/machinery/requests_console{ - announcementConsole = 1; - department = "Captain's Desk"; - departmentType = 5; - name = "Captain RC"; - pixel_x = -30 +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/filingcabinet, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bgT" = ( @@ -23401,6 +23378,9 @@ dir = 8 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bgU" = ( @@ -23409,12 +23389,18 @@ }, /obj/effect/landmark/start/captain, /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bgV" = ( /obj/structure/table/wood, /obj/item/book/manual/wiki/security_space_law, /obj/item/coin/plasma, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bgW" = ( @@ -24011,11 +23997,22 @@ pixel_x = -28 }, /obj/machinery/suit_storage_unit/captain, +/obj/machinery/light{ + light_color = "#c9d3e8" + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"bil" = ( +/obj/machinery/computer/card{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bim" = ( /obj/structure/table/wood, /obj/machinery/recharger, +/obj/item/melee/chainofcommand, /turf/open/floor/wood, /area/crew_quarters/heads/captain) "bin" = ( @@ -28239,11 +28236,10 @@ /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "bsb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) +/obj/structure/table, +/obj/item/hand_labeler, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "bsc" = ( /turf/open/floor/plasteel, /area/engine/gravity_generator) @@ -28251,6 +28247,16 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"bsg" = ( +/obj/structure/table, +/obj/item/hand_labeler, +/obj/machinery/camera{ + c_tag = "Medbay Morgue"; + dir = 8; + network = list("ss13","medbay") + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "bsh" = ( /turf/closed/wall, /area/teleporter) @@ -34910,20 +34916,6 @@ }, /turf/open/floor/plasteel/white, /area/science/research) -"bHg" = ( -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - dir = 5; - icon_state = "roomnum"; - name = "Room Number 7"; - pixel_y = 24 - }, -/obj/structure/chair/sofa/right, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) "bHh" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -45354,14 +45346,9 @@ /area/engine/engineering) "cgw" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/engineering) -"cgx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) "cgy" = ( /obj/machinery/light/small{ dir = 1 @@ -45431,32 +45418,8 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "cgI" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgJ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"cgL" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) +/turf/template_noop, +/area/template_noop) "cgO" = ( /obj/structure/rack, /obj/item/lighter, @@ -45865,27 +45828,6 @@ /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"chF" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) -"chG" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chH" = ( /obj/structure/closet/firecloset, /turf/open/floor/plating, @@ -45974,36 +45916,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"chV" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/tank/internals/emergency_oxygen/engi{ - pixel_x = 5 - }, -/obj/item/clothing/gloves/color/black, -/obj/item/clothing/glasses/meson/engine, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"chX" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "chY" = ( /obj/machinery/shieldgen, /turf/open/floor/plating, @@ -46086,24 +45998,6 @@ "cig" = ( /turf/closed/wall, /area/engine/engineering) -"cii" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/geiger_counter, -/obj/item/geiger_counter, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cij" = ( /obj/machinery/modular_computer/console/preset/engineering, /obj/structure/cable{ @@ -46169,15 +46063,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/crew_quarters/heads/chief) -"cip" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciq" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -46187,13 +46072,6 @@ }, /turf/open/floor/plating, /area/crew_quarters/heads/chief) -"cir" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cis" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, @@ -46338,16 +46216,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engine/engineering) -"ciO" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) "ciP" = ( /obj/structure/cable{ icon_state = "0-2" @@ -46515,12 +46383,6 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/heads/chief) -"cjh" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cji" = ( /obj/structure/cable{ icon_state = "1-2" @@ -46806,6 +46668,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/structure/closet/wardrobe/engineering_yellow, /turf/open/floor/plasteel, /area/engine/engineering) "cjT" = ( @@ -47673,15 +47536,6 @@ }, /turf/open/floor/plasteel/showroomfloor, /area/security/warden) -"cmm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) "cmo" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, @@ -48058,18 +47912,6 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engine/engineering) -"cnx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cny" = ( /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, @@ -48328,19 +48170,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"coc" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"coj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/crew_quarters/dorms) "cop" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 1 @@ -48432,9 +48261,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/engine/engine_smes) "coz" = ( @@ -48447,9 +48274,6 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, /turf/open/floor/plasteel, /area/engine/engine_smes) "coA" = ( @@ -48514,16 +48338,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"coK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "coL" = ( /obj/structure/cable/yellow{ icon_state = "4-8" @@ -48536,18 +48350,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"coM" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) "coS" = ( /obj/structure/rack, /obj/item/gun/energy/laser{ @@ -48664,6 +48466,9 @@ /area/engine/engine_smes) "cpk" = ( /obj/effect/turf_decal/stripes/corner, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpl" = ( @@ -48680,18 +48485,20 @@ dir = 1; pixel_y = -22 }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpn" = ( /obj/machinery/light, /obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/engine/engine_smes) "cpo" = ( @@ -48731,52 +48538,6 @@ /obj/machinery/cell_charger, /turf/open/floor/plasteel, /area/engine/engineering) -"cpt" = ( -/obj/structure/table, -/obj/item/clothing/gloves/color/yellow, -/obj/item/storage/toolbox/electrical{ - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cpu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpv" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpx" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cpy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpA" = ( /obj/structure/cable{ icon_state = "1-2" @@ -48791,15 +48552,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/bridge) -"cpD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) "cpE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -48914,133 +48666,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cpZ" = ( -/obj/structure/table, -/obj/item/storage/toolbox/mechanical{ - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/obj/item/flashlight{ - pixel_x = 1; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cqa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqc" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqd" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqe" = ( -/obj/effect/turf_decal/stripes/corner, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqf" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/atmospherics/pipe/simple/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqg" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Filter" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqh" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Fore"; - dir = 1; - network = list("ss13","engine"); - pixel_x = 23 - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqi" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/light, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqj" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/button/door{ - id = "engsm"; - name = "Radiation Shutters Control"; - pixel_y = -24; - req_access_txt = "10" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cql" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqm" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel, -/area/engine/engineering) "cqn" = ( /obj/structure/grille, /turf/open/floor/plating, @@ -49122,53 +48747,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cqA" = ( -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/obj/machinery/door/airlock/external{ - name = "Engineering External Access"; - req_access_txt = "10;13" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cqC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cqD" = ( -/obj/structure/sign/warning/radiation, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cqE" = ( -/obj/effect/decal/cleanable/dirt, -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper, -/turf/open/floor/engine, -/area/engine/supermatter) -"cqF" = ( -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cqG" = ( /obj/structure/rack, /obj/item/storage/box/rubbershot{ @@ -49265,70 +48843,10 @@ /obj/structure/reagent_dispensers/fueltank, /turf/open/floor/plasteel, /area/engine/engineering) -"cqS" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/closet/emcloset/anchored, -/turf/open/floor/plating, -/area/engine/engineering) -"cqT" = ( -/obj/structure/sign/warning/vacuum/external{ - pixel_x = 32 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cqU" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/machinery/portable_atmospherics/canister, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "cqY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) -"cqZ" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"cra" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Gas to Filter" - }, -/obj/machinery/airalarm/engine{ - dir = 4; - pixel_x = -23 - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crb" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Gas to Chamber" - }, -/obj/effect/decal/cleanable/dirt, -/turf/open/floor/engine, -/area/engine/supermatter) -"crc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"crd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "crh" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -49393,36 +48911,6 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/engine/engineering) -"crs" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crt" = ( -/obj/machinery/door/airlock/engineering/glass/critical{ - heat_proof = 1; - name = "Supermatter Chamber"; - req_access_txt = "10" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cru" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crv" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "crw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -49513,44 +49001,6 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/solar/starboard/aft) -"crH" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crI" = ( -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"crJ" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crK" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"crL" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"crM" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "crP" = ( /obj/machinery/light, /turf/open/floor/plasteel, @@ -49562,26 +49012,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"crT" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) -"crU" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/turf/open/space, -/area/space/nearstation) -"crV" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "crW" = ( /obj/machinery/light/small{ dir = 8 @@ -49600,39 +49030,11 @@ /obj/structure/transit_tube, /turf/open/floor/plating, /area/engine/engineering) -"crZ" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"csa" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/engine/engineering) -"csb" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 9 - }, -/turf/open/space, -/area/space/nearstation) "csc" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /turf/open/space, /area/maintenance/aft) -"csd" = ( -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cse" = ( -/obj/machinery/atmospherics/components/unary/thermomachine/freezer{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "csg" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 1 @@ -49649,13 +49051,6 @@ }, /turf/open/space, /area/space/nearstation) -"csj" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/junction{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engineering) "csk" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating/airless, @@ -49681,10 +49076,6 @@ /obj/structure/transit_tube/crossing/horizontal, /turf/open/space, /area/space/nearstation) -"csp" = ( -/obj/effect/landmark/event_spawn, -/turf/closed/wall, -/area/crew_quarters/fitness) "csq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -49707,68 +49098,16 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"css" = ( -/obj/structure/lattice/catwalk, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) -"csu" = ( -/obj/structure/closet/firecloset, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"csv" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"csx" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/turf/open/space, -/area/space/nearstation) "csy" = ( /obj/structure/disposalpipe/segment, /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"csA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) "csD" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"csH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csM" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/yellow/visible, @@ -49784,30 +49123,6 @@ /obj/structure/transit_tube/horizontal, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"csP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/green/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"csR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) "csT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/landmark/xmastree, @@ -51491,6 +50806,14 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) +"cwP" = ( +/obj/structure/fireplace, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 + }, +/turf/open/floor/plating, +/area/maintenance/port) "cwT" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 2"; @@ -51649,13 +50972,6 @@ }, /turf/open/floor/plating, /area/hallway/secondary/exit) -"cyi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "cyl" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -51807,6 +51123,14 @@ }, /turf/open/floor/plating, /area/engine/engineering) +"czi" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "czk" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -51817,23 +51141,6 @@ }, /turf/open/floor/plating, /area/ai_monitored/turret_protected/aisat_interior) -"czD" = ( -/obj/structure/extinguisher_cabinet, -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"czE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"czF" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) "czG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -52033,96 +51340,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"cAl" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cAm" = ( -/obj/machinery/power/supermatter_crystal/engine, -/turf/open/floor/engine, -/area/engine/supermatter) -"cAo" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAp" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Cooling Loop to Gas" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAq" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAr" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 4; - name = "Gas to Mix" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAs" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAt" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cAu" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/power/emitter/anchored{ - dir = 4; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) "cAy" = ( /obj/structure/closet/secure_closet/freezer/kitchen/maintenance, /turf/open/floor/plating, @@ -52229,10 +51446,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"cAP" = ( -/obj/structure/sign/warning/fire, -/turf/closed/wall/r_wall, -/area/engine/supermatter) "cAQ" = ( /obj/structure/chair, /turf/open/floor/plating, @@ -52652,15 +51865,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/engine/air, /area/engine/atmos) -"cBR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cBS" = ( /obj/structure/cable{ icon_state = "1-2" @@ -52897,79 +52101,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"cDe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/closet/radiation, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDh" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/structure/table/reinforced, -/obj/item/storage/toolbox/mechanical, -/obj/item/flashlight, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/item/pipe_dispenser, -/turf/open/floor/engine, -/area/engine/engineering) -"cDi" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/table/reinforced, -/obj/item/clothing/suit/radiation, -/obj/item/clothing/head/radiation, -/obj/item/clothing/glasses/meson, -/obj/item/clothing/glasses/meson, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDj" = ( -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) "cDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -52984,92 +52115,6 @@ /obj/machinery/vending/engivend, /turf/open/floor/plasteel, /area/engine/engineering) -"cDo" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDp" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDr" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDs" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDv" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDw" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Atmos to Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDy" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cDz" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cDB" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53077,70 +52122,6 @@ /obj/effect/landmark/start/station_engineer, /turf/open/floor/plasteel, /area/engine/engineering) -"cDC" = ( -/obj/item/wrench, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDD" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ - dir = 4 - }, -/obj/machinery/meter, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDE" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDF" = ( -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "External Gas to Loop" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cDG" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cDH" = ( -/obj/structure/rack, -/obj/item/clothing/mask/gas{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/mask/gas, -/obj/item/clothing/mask/gas{ - pixel_x = -3; - pixel_y = -3 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) -"cDI" = ( -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engine/engineering) "cDJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -53181,831 +52162,6 @@ /obj/structure/closet/radiation, /turf/open/floor/plasteel, /area/engine/engineering) -"cEa" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 1 - }, -/obj/machinery/portable_atmospherics/canister/nitrogen, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Port"; - dir = 4; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEe" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/green/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEf" = ( -/obj/machinery/status_display/ai, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEg" = ( -/obj/machinery/status_display, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cEh" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/light{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEi" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Starboard"; - dir = 8; - network = list("ss13","engine") - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEk" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cEl" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cEr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEs" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Gas to Cooling Loop" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEt" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEu" = ( -/obj/machinery/camera{ - c_tag = "Supermatter Chamber"; - network = list("engine"); - pixel_x = 23 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEv" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 8 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEw" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEx" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEy" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible{ - dir = 4 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEz" = ( -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cEA" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEC" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 8; - name = "Mix to Gas" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cED" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEE" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 5 - }, -/turf/open/space, -/area/space/nearstation) -"cEK" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cEL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cEM" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/obj/item/tank/internals/plasma, -/turf/open/floor/plating, -/area/engine/supermatter) -"cET" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/decal/cleanable/oil, -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cEU" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cEW" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/structure/cable/yellow{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/components/binary/pump{ - name = "Cooling Loop Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFe" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-8" - }, -/obj/structure/window/plasma/reinforced{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFh" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 9 - }, -/obj/machinery/power/rad_collector/anchored, -/obj/structure/cable/yellow{ - icon_state = "0-4" - }, -/obj/structure/window/plasma/reinforced{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/supermatter) -"cFj" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - id = "engsm"; - name = "Radiation Chamber Shutters" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/engine/supermatter) -"cFk" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable/yellow{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/components/binary/pump{ - dir = 1; - name = "Mix Bypass" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFm" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFn" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 6 - }, -/turf/open/space, -/area/space/nearstation) -"cFo" = ( -/obj/machinery/atmospherics/pipe/heat_exchanging/simple{ - dir = 10 - }, -/obj/structure/lattice, -/turf/open/space, -/area/space/nearstation) -"cFu" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cFw" = ( -/obj/structure/sign/warning/electricshock, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cFy" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFz" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFA" = ( -/obj/machinery/atmospherics/pipe/manifold/general/visible, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFF" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/crew_quarters/fitness) -"cFI" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible, -/turf/open/floor/engine, -/area/engine/engineering) -"cFK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFL" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFM" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/light{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFO" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/camera{ - c_tag = "Engineering Supermatter Aft"; - network = list("ss13","engine"); - pixel_x = 23 - }, -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cFP" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 1 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFT" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cFU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGd" = ( -/obj/structure/closet/crate/bin, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/cartridge/atmos, -/turf/open/floor/engine, -/area/engine/engineering) -"cGe" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGf" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8; - filter_type = "n2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGg" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGh" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/engine, -/area/engine/engineering) -"cGi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/engine, -/area/engine/engineering) -"cGj" = ( -/obj/structure/table, -/obj/item/pipe_dispenser, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGk" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGl" = ( -/obj/structure/closet/secure_closet/engineering_personal, -/obj/item/radio/headset/headset_eng, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGt" = ( -/obj/structure/closet/wardrobe/engineering_yellow, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGu" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 6 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGx" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible, -/obj/machinery/meter, -/turf/open/floor/engine, -/area/engine/engineering) -"cGC" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/atmospherics/components/binary/valve/digital/on{ - dir = 4; - name = "Output Release" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGE" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGH" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGI" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Laser Room"; - req_access_txt = "10" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cGK" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"cGM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cGR" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGS" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cGT" = ( -/obj/machinery/light{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGU" = ( -/obj/structure/reflector/double/anchored{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGV" = ( -/obj/structure/reflector/box/anchored{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGY" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cGZ" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ - dir = 1 - }, -/turf/open/floor/plating/airless, -/area/engine/engineering) -"cHa" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHb" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHc" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHd" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHe" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHg" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHj" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/emitter/anchored{ - dir = 8; - state = 2 - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHn" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/engine/engineering) -"cHo" = ( -/obj/structure/reflector/single/anchored{ - dir = 9 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHp" = ( -/obj/structure/reflector/single/anchored{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cHr" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/engine/engineering) "cHD" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54315,33 +52471,27 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) -"cII" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/silver, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"cIW" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/vending/kink, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"cJl" = ( -/obj/structure/toilet{ +"cJn" = ( +/obj/structure/reagent_dispensers/watertank/high, +/obj/effect/turf_decal/tile/yellow{ dir = 8 }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"cMm" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/engineering) +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/box, +/turf/open/floor/plasteel, +/area/engine/atmos) +"cMk" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) "cMC" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -54362,16 +52512,6 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) -"cMD" = ( -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cMH" = ( -/turf/open/floor/engine, -/area/engine/supermatter) -"cMN" = ( -/obj/effect/spawner/structure/window/plasma/reinforced, -/turf/open/floor/plating, -/area/engine/supermatter) "cMQ" = ( /obj/structure/cable{ icon_state = "0-2" @@ -54559,10 +52699,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"cPO" = ( -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) "cQw" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54581,6 +52717,47 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"cRz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/button/door{ + id = "holoprivacy"; + name = "Holodeck Privacy"; + pixel_y = 24 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"cRD" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/obj/structure/dresser, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/theatre"; + dir = 8; + name = "Theatre APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/theatre) +"cSn" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) "cSA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54599,42 +52776,6 @@ }, /turf/open/floor/plasteel/dark/telecomms, /area/tcommsat/server) -"cSG" = ( -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/turf/closed/wall/r_wall, -/area/engine/supermatter) -"cSH" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 5 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSI" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"cSJ" = ( -/obj/machinery/atmospherics/components/trinary/filter/flipped/critical{ - dir = 8 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"cSK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 10 - }, -/turf/open/floor/engine, -/area/engine/engineering) "cSL" = ( /obj/machinery/button/door{ id = "atmos"; @@ -55003,10 +53144,60 @@ "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) +"cVp" = ( +/obj/structure/window/reinforced/tinted{ + dir = 8 + }, +/obj/structure/window/reinforced/tinted{ + dir = 4 + }, +/obj/structure/curtain, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"cVu" = ( +/obj/machinery/camera{ + c_tag = "Locker Room South"; + dir = 8 + }, +/obj/structure/closet/secure_closet/personal, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) "cVK" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) +"cXx" = ( +/obj/machinery/door/airlock/security{ + name = "Labor Shuttle"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/processing) +"dbn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"dbM" = ( +/turf/open/floor/plating, +/area/space/nearstation) +"dcG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/closet/wardrobe/pjs, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/maid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/under/janimaid, +/obj/item/clothing/accessory/maidapron, +/obj/item/clothing/accessory/maidapron, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "dfh" = ( /obj/machinery/power/apc{ areastring = "/area/science/circuit"; @@ -55021,63 +53212,257 @@ }, /turf/open/floor/plasteel, /area/science/circuit) -"dfH" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/light{ - dir = 4 - }, -/obj/machinery/power/apc{ - areastring = "/area/security/main"; - dir = 4; - name = "Firing Range APC"; - pixel_x = 24 +"dfI" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = -32 }, /turf/open/floor/plasteel, -/area/security/prison) +/area/hallway/primary/starboard) "dfL" = ( /obj/structure/reagent_dispensers/keg/gargle, /turf/open/floor/wood, /area/maintenance/bar) +"dgh" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/machinery/camera{ + c_tag = "VR Sleepers"; + dir = 1 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel/white/side{ + dir = 1 + }, +/area/crew_quarters/fitness) "dgz" = ( /turf/closed/wall, /area/crew_quarters/cryopod) -"djq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"dhx" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/machinery/light/small{ dir = 4 }, -/turf/open/floor/plasteel, +/turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) -"djB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"dkk" = ( +/obj/machinery/photocopier{ + pixel_x = -5; + pixel_y = -5 }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/fore) +/turf/open/floor/wood, +/area/library) "dok" = ( -/obj/machinery/portable_atmospherics/pump, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"doP" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) "dqu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"dqD" = ( +"dtE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dvc" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"dvO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/closed/wall, +/area/science/circuit) +"dwc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/door/airlock/vault, -/obj/effect/mapping_helpers/airlock/locked, -/turf/closed/wall/r_wall, -/area/ai_monitored/nuke_storage) -"dqG" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"dxB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"dzi" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"dzy" = ( +/obj/machinery/door/airlock{ + name = "Shower Room" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/toilet) +"dHb" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"dKP" = ( +/turf/closed/wall, +/area/maintenance/bar) +"dKV" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/maintenance/bar) +"dMu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"dMX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/chair/comfy/brown, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"dMZ" = ( +/obj/structure/sign/poster/official/random{ + pixel_y = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"dRC" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/hydroponics) +"dSv" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/apc{ + areastring = "/area/crew_quarters/abandoned_gambling_den"; + name = "Abandoned Gambling Den APC"; + pixel_y = -24 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"dTe" = ( +/obj/structure/chair/comfy/beige{ + dir = 8 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/grimy, +/area/hallway/secondary/entry) +"dTJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/heads/captain) +"eaI" = ( +/obj/structure/table/reinforced, +/obj/item/radio/intercom{ + pixel_x = -30 + }, +/obj/item/stock_parts/cell/high, +/obj/item/stock_parts/cell/high, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"edH" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"ego" = ( +/obj/machinery/atmospherics/components/binary/valve, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"egQ" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" + }, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/kitchen) +"egS" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/item/reagent_containers/food/snacks/burger/plain, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"elw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"epV" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm6"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"eqm" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"est" = ( /obj/machinery/light{ dir = 1 }, @@ -55091,277 +53476,13 @@ dir = 1 }, /area/hallway/secondary/entry) -"dsV" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, -/turf/open/floor/wood, -/area/crew_quarters/dorms) -"duc" = ( -/obj/machinery/shower{ - dir = 8 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"dvc" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"dvO" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/science/circuit) -"dyS" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"dzi" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"dBt" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"dCk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) -"dEZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/obj/machinery/door/window/westleft{ - base_state = "right"; - dir = 4; - icon_state = "right"; - name = "Shooting Range" - }, -/turf/open/floor/plating, -/area/security/prison) -"dGY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/poster/official/safety_eye_protection, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"dHx" = ( -/obj/structure/light_construct{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"dHP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"dIA" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"dIH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/turf/open/floor/plating, -/area/security/prison) -"dKe" = ( -/obj/machinery/atmospherics/components/binary/valve, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"dKg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"dKP" = ( -/turf/closed/wall, -/area/maintenance/bar) -"dKV" = ( -/obj/structure/chair/stool/bar, -/turf/open/floor/wood, -/area/maintenance/bar) -"dLh" = ( -/obj/structure/table/wood, -/obj/item/instrument/trumpet, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"dMZ" = ( -/obj/structure/sign/poster/official/random{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"dQy" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/security/prison) -"dQz" = ( -/obj/structure/reagent_dispensers/water_cooler, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"dSI" = ( -/obj/machinery/door/airlock{ - desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; - id_tag = "MaintDorm1"; - name = "Furniture Storage" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/port) -"dSM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/chair/comfy/brown, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"eaD" = ( -/obj/effect/turf_decal/stripes/corner, -/turf/open/floor/plasteel, -/area/hydroponics) -"eaI" = ( -/obj/structure/table/reinforced, -/obj/item/radio/intercom{ - pixel_x = -30 - }, -/obj/item/stock_parts/cell/high, -/obj/item/stock_parts/cell/high, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"eeD" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/machinery/power/apc{ - areastring = "/area/engine/gravity_generator"; - dir = 8; - name = "Gravity Generator APC"; - pixel_x = -25; - pixel_y = 1 - }, -/obj/structure/table, -/obj/item/paper/guides/jobs/engi/gravity_gen, -/obj/item/pen/blue, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"efo" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"ekY" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"epP" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/engine_smes) -"eqs" = ( -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 - }, -/obj/machinery/requests_console{ - department = "Bar"; - departmentType = 2; - pixel_x = -30; - pixel_y = 45; - receive_ore_updates = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"ese" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) "evR" = ( /turf/open/floor/plating, /area/maintenance/bar) -"eyC" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +"ewZ" = ( +/obj/structure/chair/sofa/right, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "eyM" = ( /obj/machinery/mineral/ore_redemption{ input_dir = 2; @@ -55370,90 +53491,111 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"eAE" = ( -/obj/structure/bookcase{ - name = "Forbidden Knowledge" - }, -/turf/open/floor/carpet, -/area/library) -"eBm" = ( -/obj/structure/chair/sofa/left, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"eDq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/light/small, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"eDv" = ( -/turf/open/floor/carpet, -/area/crew_quarters/theatre) "eHI" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) -"eIe" = ( -/obj/structure/table/wood, -/obj/machinery/light{ +"eLH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/item/instrument/trombone, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"eJk" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/brig) -"eJz" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"eMQ" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/machinery/vending/wardrobe/curator_wardrobe, +/turf/open/floor/carpet, +/area/library) +"eND" = ( +/obj/structure/filingcabinet, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"eNK" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"eNW" = ( +/turf/open/floor/plasteel/dark, +/area/crew_quarters/dorms) +"eOv" = ( +/obj/effect/landmark/event_spawn, +/turf/closed/wall, +/area/crew_quarters/fitness) +"eOy" = ( +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"ePO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 }, /turf/open/floor/wood, /area/crew_quarters/theatre) -"eMb" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/space/nearstation) -"eMV" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/security/prison) +"eRk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"eRn" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/quartermaster/warehouse) "eRz" = ( /obj/structure/lattice, /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"eTc" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 +"eUd" = ( +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 +/obj/structure/chair/comfy/brown{ + dir = 8 }, -/turf/open/floor/plating, -/area/maintenance/port) -"eUR" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "eVC" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/firedoor, @@ -55469,93 +53611,45 @@ }, /turf/open/floor/plasteel, /area/quartermaster/miningdock) -"eWl" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/cable{ - icon_state = "1-2" +"eXm" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"fbm" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 }, /turf/open/floor/wood, -/area/crew_quarters/theatre) -"eWv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"eWV" = ( -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"eYr" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plating, -/area/space/nearstation) -"fcc" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/crew_quarters/fitness) -"fcu" = ( -/obj/structure/lattice/catwalk, +/area/crew_quarters/bar) +"fby" = ( /obj/structure/cable{ - icon_state = "0-4" + icon_state = "2-4" }, -/turf/open/space, -/area/solar/port/aft) +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) "fcG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/closed/wall/r_wall, /area/science/mixing) -"fey" = ( -/obj/structure/chair/sofa, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"ffm" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/quartermaster/warehouse) -"ffU" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"fkx" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/departments/evac{ - pixel_y = 32 +"fhP" = ( +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" }, /turf/open/floor/plasteel, -/area/hallway/primary/starboard) +/area/engine/gravity_generator) +"fjy" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/crew_quarters/heads/captain) "flc" = ( /obj/structure/table/reinforced, /obj/item/storage/fancy/donut_box, @@ -55574,20 +53668,67 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"fpd" = ( +"fnJ" = ( +/obj/structure/sign/mining{ + pixel_y = 7 + }, +/turf/closed/wall, +/area/quartermaster/miningdock) +"frE" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/fitness) +"fsk" = ( +/obj/structure/lattice/catwalk, +/obj/item/stack/marker_beacon{ + anchored = 1; + icon_state = "markerburgundy-on"; + light_power = 3; + light_range = 3; + name = "Docking Beacon"; + picked_color = "Burgundy" + }, +/turf/open/floor/plating, +/area/space/nearstation) +"ftv" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"fuo" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/grass, +/area/security/prison) +"fvk" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"fvW" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/closed/wall, -/area/crew_quarters/dorms) -"fsQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ftK" = ( -/obj/structure/bed, -/turf/open/floor/plating, -/area/maintenance/port) +/turf/open/floor/wood, +/area/crew_quarters/bar) "fvY" = ( /obj/machinery/computer/cryopod{ pixel_y = 26 @@ -55597,54 +53738,28 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) -"fwD" = ( -/obj/structure/sign/poster/official/ion_rifle, -/turf/closed/wall/r_wall, -/area/ai_monitored/security/armory) "fxa" = ( /obj/structure/chair/wood/normal, /turf/open/floor/wood{ icon_state = "wood-broken4" }, /area/maintenance/bar) -"fyr" = ( -/obj/machinery/door/window/southright{ - name = "Target Storage" +"fyq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1; + pixel_x = 5 }, -/obj/item/target/alien, -/obj/item/target/alien, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/security/prison) -"fBj" = ( -/obj/machinery/atmospherics/components/binary/pump/on{ - dir = 4; - name = "Air In" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"fDV" = ( -/obj/machinery/computer/card{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"fEo" = ( -/obj/machinery/recharge_station, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"fFp" = ( -/obj/structure/table/wood/fancy/royalblue, -/obj/item/crowbar/red, -/turf/open/floor/plating, -/area/maintenance/port) +/obj/machinery/light/small, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"fyM" = ( +/obj/structure/closet/wardrobe/cargotech, +/obj/item/radio/headset/headset_cargo, +/turf/open/floor/plasteel, +/area/quartermaster/storage) +"fzd" = ( +/turf/closed/wall, +/area/crew_quarters/abandoned_gambling_den) "fGf" = ( /obj/machinery/smartfridge/disks{ pixel_y = 2 @@ -55655,30 +53770,42 @@ }, /turf/open/floor/plasteel, /area/hydroponics) -"fIK" = ( -/obj/structure/closet{ - name = "Costume Closet" +"fGl" = ( +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/item/clothing/head/russobluecamohat, -/obj/item/clothing/head/russobluecamohat, -/obj/item/clothing/head/russofurhat, -/obj/item/clothing/head/russofurhat, -/obj/item/clothing/head/russofurhat, -/obj/item/clothing/head/russofurhat, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/under/mw2_russian_para, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, -/obj/item/clothing/shoes/jackboots, +/turf/open/floor/plasteel, +/area/security/brig) +"fGC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/vault, +/obj/effect/mapping_helpers/airlock/locked, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"fHK" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"fIn" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/meter, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"fJA" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 +"fJa" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4; + pixel_y = 5 + }, +/obj/structure/chair/sofa{ + dir = 1 }, /turf/open/floor/plasteel, /area/crew_quarters/fitness) @@ -55687,679 +53814,7 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plasteel, /area/science/circuit) -"fLb" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"fLn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/table, -/obj/item/storage/firstaid/regular{ - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"fLX" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"fOB" = ( -/obj/structure/chair/sofa{ - dir = 1 - }, -/obj/structure/window, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"fPz" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1; - pixel_x = 5 - }, -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"fRa" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/sign/warning/fire{ - desc = "A sign that states the labeled room's number."; - icon_state = "roomnum"; - name = "Room Number 1"; - pixel_x = -30; - pixel_y = -7 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"fSL" = ( -/obj/machinery/door/window/westleft{ - base_state = "right"; - icon_state = "right"; - name = "Unisex Showers" - }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"fTg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/firealarm{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"fXo" = ( -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/sign/poster/contraband/lizard{ - pixel_x = -32 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"fXH" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"fZD" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/effect/landmark/start/mime, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"gbb" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = 5; - pixel_y = 7 - }, -/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ - pixel_x = -3; - pixel_y = 2 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"gbq" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plating, -/area/construction) -"gbT" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/obj/item/stack/sheet/glass/fifty, -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"gfn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"gfD" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"gjl" = ( -/turf/closed/wall, -/area/quartermaster/warehouse) -"gks" = ( -/turf/open/floor/grass, -/area/security/prison) -"gmc" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green, -/obj/machinery/camera{ - c_tag = "VR Sleepers"; - dir = 1 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/crew_quarters/fitness) -"gnM" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"gnW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable, -/turf/open/space, -/area/solar/starboard/aft) -"gqp" = ( -/obj/structure/frame/computer{ - dir = 1 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"gqR" = ( -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"gro" = ( -/obj/machinery/door/airlock/engineering{ - name = "Gravity Generator"; - req_access_txt = "11" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"guh" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "kitchen shutters" - }, -/obj/item/reagent_containers/food/snacks/cheesynachos{ - pixel_y = 5 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"gvC" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"gwd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"gxH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "2-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"gzA" = ( -/obj/structure/table/wood/fancy, -/obj/machinery/light, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 20 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"gzJ" = ( -/obj/structure/sign/poster/official/cohiba_robusto_ad, -/turf/closed/wall, -/area/lawoffice) -"gBo" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"gBY" = ( -/obj/machinery/power/apc{ - areastring = "/area/maintenance/starboard/fore"; - dir = 1; - name = "Starboard Bow Maintenance APC"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"gDv" = ( -/obj/structure/table, -/obj/item/clothing/gloves/boxing/yellow, -/obj/item/clothing/gloves/boxing/green, -/obj/item/clothing/gloves/boxing/blue, -/obj/item/clothing/gloves/boxing/blue, -/obj/item/clothing/gloves/boxing, -/obj/item/clothing/gloves/boxing, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"gFY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/wood, -/area/bridge/meeting_room) -"gGD" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"gGK" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light_switch{ - pixel_y = -25 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"gIT" = ( -/obj/structure/table/reinforced, -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "kitchen"; - name = "kitchen shutters" - }, -/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ - pixel_y = 5 - }, -/turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/kitchen) -"gJR" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar{ - pixel_x = -7 - }, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"gLH" = ( -/obj/machinery/door/airlock/external{ - name = "External Access"; - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"gMl" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"gOZ" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"gTx" = ( -/obj/structure/bed, -/obj/machinery/button/door{ - id = "Dorm5"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/wood, -/area/crew_quarters/dorms) -"gUz" = ( -/obj/structure/sign/poster/official/safety_eye_protection, -/turf/closed/wall/r_wall, -/area/engine/engineering) -"gWd" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/construction) -"gXs" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) -"gYK" = ( -/obj/machinery/light/small, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"gYR" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"gZG" = ( -/obj/structure/closet/crate/freezer/surplus_limbs, -/obj/item/reagent_containers/glass/beaker/synthflesh, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/medical/sleeper) -"hmv" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hot" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/window, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"hvD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hxw" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/obj/machinery/meter, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"hFk" = ( -/obj/structure/piano{ - icon_state = "piano" - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hIi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"hIJ" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"hKI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/fore) -"hKX" = ( -/obj/machinery/button/door{ - desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; - id = "RIPFUN"; - name = "Powerful Gamer Toggle"; - normaldoorcontrol = 1; - pixel_x = -24; - pixel_y = 7; - specialfunctions = 4 - }, -/obj/structure/table_frame/wood, -/turf/open/floor/plating, -/area/maintenance/port) -"hMk" = ( -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "Secure Gate"; - name = "brig shutters" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/security/brig) -"hRa" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/cell_charger{ - pixel_y = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"hSS" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/silver, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"hUC" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-06" - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/secondary/entry) -"hVk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/warehouse"; - dir = 4; - name = "Cargo Warehouse APC"; - pixel_x = 26 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"hYH" = ( -/obj/machinery/door/airlock/security{ - name = "Labor Shuttle"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/processing) -"iaq" = ( -/obj/machinery/power/smes{ - charge = 5e+006 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"iiH" = ( -/obj/structure/table/wood/fancy, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/item/reagent_containers/food/drinks/britcup{ - desc = "Kingston's personal cup."; - pixel_x = 5; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"iiW" = ( -/turf/open/floor/wood, -/area/maintenance/bar) -"ijc" = ( -/obj/structure/table, -/obj/item/stack/sheet/metal/fifty, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"ilO" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"imi" = ( -/turf/open/floor/plasteel/dark, -/area/crew_quarters/dorms) -"imH" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/maintenance/bar) -"imK" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/light_construct{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ioS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) -"ipA" = ( -/turf/open/floor/plating, -/area/maintenance/department/medical/morgue) -"ipU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"itE" = ( -/obj/structure/window/reinforced/tinted{ - dir = 8 - }, -/obj/structure/window/reinforced/tinted{ - dir = 4 - }, -/obj/structure/curtain, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"itG" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"itP" = ( -/obj/structure/chair/comfy/brown{ - color = "#596479"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ium" = ( -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N." - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"ixv" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"izv" = ( -/obj/machinery/vending/clothing, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"izL" = ( -/obj/machinery/door/firedoor, -/obj/structure/sign/departments/evac{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"iCE" = ( +"fLd" = ( /obj/structure/table/wood, /obj/machinery/requests_console{ department = "Theatre"; @@ -56380,740 +53835,96 @@ dir = 4 }, /area/crew_quarters/theatre) -"iEc" = ( -/obj/structure/safe, -/obj/item/clothing/head/bearpelt, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, -/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, -/obj/effect/turf_decal/bot_white/left, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/gun/ballistic/revolver/nagant, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"iEJ" = ( -/obj/machinery/door/airlock/external{ - name = "Escape Pod One" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) -"iFt" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"iGV" = ( -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"iHq" = ( -/obj/machinery/door/airlock{ - name = "Recharging Station" - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"iNn" = ( -/obj/machinery/camera{ - c_tag = "Kitchen Cold Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/reagent_dispensers/cooking_oil, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) -"iQA" = ( -/obj/structure/rack, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/decal/cleanable/cobweb, -/obj/item/clothing/under/color/grey, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"iRI" = ( -/obj/structure/chair/comfy/beige{ - dir = 8 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/grimy, -/area/hallway/secondary/entry) -"iSB" = ( -/obj/machinery/door/window/southleft{ - name = "Target Storage" - }, -/obj/item/target/clown, -/obj/item/target/clown, -/obj/item/target, -/obj/item/target, -/turf/open/floor/plating, -/area/security/prison) -"iTd" = ( -/obj/structure/closet/secure_closet/personal/cabinet{ - desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; - name = "Personal ID-Locked Closet"; - pixel_y = 15 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"iTD" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -3; - pixel_y = 5 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"iVU" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/spawner/structure/window, -/obj/machinery/door/firedoor, -/turf/open/floor/plating, -/area/crew_quarters/cryopod) -"iWm" = ( -/obj/machinery/camera{ - c_tag = "Bar West"; - dir = 4 - }, -/obj/machinery/computer/arcade/orion_trail, -/obj/structure/sign/poster/official/foam_force_ad{ - pixel_x = -32 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"jav" = ( -/obj/structure/chair/sofa/right, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"jbf" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/power/apc{ - areastring = "/area/hallway/secondary/service"; - dir = 1; - name = "Service Hall APC"; - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"jcN" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"jde" = ( +"fOc" = ( +/obj/structure/bed, +/obj/item/bedsheet/random, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/obj/structure/chair/sofa{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"jgm" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/obj/machinery/camera{ - c_tag = "Circuitry Lab"; - dir = 8; - network = list("ss13","rd") - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"jil" = ( -/obj/machinery/vr_sleeper{ dir = 8 }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 8 - }, -/area/crew_quarters/fitness) -"jlm" = ( -/obj/machinery/rnd/production/techfab/department/cargo, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"joc" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/dresser, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/theatre"; - dir = 8; - name = "Theatre APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/theatre) -"joq" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"jqv" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken7" - }, -/area/maintenance/bar) -"jrE" = ( -/obj/structure/sign/poster/official/random{ - pixel_x = 32 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"jtp" = ( -/obj/structure/sign/poster/contraband/red_rum{ - pixel_y = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"jtY" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/bar) -"juV" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"jvm" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/space, -/area/solar/starboard/aft) -"jxp" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"fPs" = ( /obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ - dir = 1 +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "kitchen"; + name = "kitchen shutters" }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/crew_quarters/bar) -"jAD" = ( -/obj/structure/grille, -/turf/open/floor/plating/airless, -/area/space/nearstation) -"jCq" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"jDh" = ( -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"jHt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"jJF" = ( -/obj/machinery/door/airlock/maintenance, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/maintenance/port/aft) -"jKM" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window{ - dir = 1 +/obj/item/reagent_containers/food/snacks/cheesynachos{ + pixel_y = 5 }, /turf/open/floor/plasteel/cafeteria, -/area/crew_quarters/locker) -"jMa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"jMY" = ( -/obj/structure/rack, -/obj/item/storage/toolbox/artistic{ - icon_state = "yellow"; - item_state = "toolbox_yellow"; - name = "Cable Toolbox"; - pixel_y = 6 - }, -/obj/item/storage/toolbox/artistic{ - icon_state = "yellow"; - item_state = "toolbox_yellow"; - name = "Cable Toolbox"; - pixel_y = -4 - }, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"jNS" = ( -/obj/structure/filingcabinet, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"jOF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port) -"jRc" = ( -/obj/structure/table, -/obj/item/storage/pill_bottle/dice{ - pixel_x = 4; - pixel_y = 4 - }, -/obj/item/reagent_containers/food/snacks/cherrycupcake, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"jRs" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"jSk" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/security/prison) -"jSO" = ( -/obj/machinery/light{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"jTp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"jUc" = ( -/obj/structure/closet/radiation, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"jVl" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"jYg" = ( -/obj/structure/table/wood/fancy, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 9 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 9 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"jYD" = ( -/obj/structure/closet{ - name = "Suit Closet" - }, -/obj/item/clothing/under/suit_jacket/white, -/obj/item/clothing/under/suit_jacket/tan, -/obj/item/clothing/under/suit_jacket/red, -/obj/item/clothing/under/suit_jacket/really_black, -/obj/item/clothing/under/suit_jacket/navy, -/obj/item/clothing/under/suit_jacket/green, -/obj/item/clothing/under/suit_jacket/female, -/obj/item/clothing/under/suit_jacket/checkered, -/obj/item/clothing/under/suit_jacket/charcoal, -/obj/item/clothing/under/suit_jacket/burgundy, -/obj/item/clothing/under/suit_jacket, -/obj/item/clothing/under/lawyer/black, -/obj/item/clothing/under/lawyer/blacksuit, -/obj/item/clothing/under/lawyer/blue, -/obj/item/clothing/under/lawyer/bluesuit, -/obj/item/clothing/under/lawyer/female, -/obj/item/clothing/under/lawyer/purpsuit, -/obj/item/clothing/under/lawyer/really_black, -/obj/item/clothing/under/lawyer/red, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"kcg" = ( -/obj/structure/reagent_dispensers/watertank/high, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/box, -/turf/open/floor/plasteel, -/area/engine/atmos) -"kgf" = ( -/obj/machinery/button/door{ - id = "maintdiy"; - name = "Shutters Control Button"; - pixel_x = -6; +/area/crew_quarters/kitchen) +"fQF" = ( +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + dir = 5; + icon_state = "roomnum"; + name = "Room Number 7"; pixel_y = 24 }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"khb" = ( +/obj/structure/chair/sofa/right, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/table, -/obj/item/kitchen/rollingpin, -/obj/item/shovel/spade, -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"khB" = ( -/obj/machinery/door/airlock/external{ - req_access_txt = "13" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"kiH" = ( -/obj/machinery/door/airlock{ - name = "Bar Back Room" - }, -/turf/open/space/basic, -/area/crew_quarters/bar) -"kmf" = ( -/obj/machinery/vending/autodrobe/all_access, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"kmw" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"knx" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Central Access" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"knR" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"kob" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"ktc" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/hydroponics) -"kte" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"kuT" = ( -/obj/effect/landmark/blobstart, -/turf/open/floor/plating, -/area/maintenance/department/electrical) -"kwj" = ( -/obj/machinery/door/airlock{ - name = "Instrument Storage" - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) -"kwW" = ( -/obj/structure/table/wood, -/obj/item/book/codex_gigas, -/obj/item/clothing/under/suit_jacket/red, -/obj/structure/destructible/cult/tome, -/turf/open/floor/carpet, -/area/library) -"kyA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"kyF" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/wood, -/area/maintenance/bar) -"kzT" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/science/mixing) -"kBF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"kCq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/carpet, -/area/crew_quarters/heads/captain) -"kCK" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"kDw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"kFf" = ( -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/preopen{ - id = "bridge blast"; - name = "bridge blast door" - }, -/turf/open/floor/plating, -/area/hallway/primary/central) -"kMg" = ( -/turf/open/space/basic, -/area/space/nearstation) -"kMO" = ( -/obj/machinery/shower{ dir = 4 }, -/obj/item/soap, -/turf/open/floor/mineral/titanium/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"fSr" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/trunk{ + dir = 4 + }, +/obj/machinery/disposal/bin, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light, +/turf/open/floor/plasteel, /area/crew_quarters/dorms) -"kMY" = ( -/obj/machinery/door/airlock{ - desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; - id_tag = "PrivateStudy"; - name = "Private Study" - }, -/obj/machinery/door/firedoor, -/obj/structure/disposalpipe/segment, -/turf/open/floor/wood, -/area/library) -"kOA" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +"fTg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/button/door{ - id = "holoprivacy"; - name = "Holodeck Privacy"; +/obj/machinery/firealarm{ pixel_y = 24 }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"kPd" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"kQg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - alpha = 255; - dir = 1 - }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"kQk" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +"fVU" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" }, -/obj/item/storage/toolbox/electrical, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"fZD" = ( +/obj/structure/filingcabinet, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"gbq" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/construction) +"gbT" = ( +/obj/structure/table, +/obj/item/stack/sheet/metal/fifty, +/obj/item/stack/sheet/glass/fifty, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"kQq" = ( -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ - dir = 4 - }, -/turf/open/floor/engine, -/area/engine/engineering) -"kSb" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/quartermaster/miningdock) -"kTe" = ( -/obj/structure/shuttle/engine/heater{ - dir = 1 - }, -/turf/closed/wall/mineral/titanium, -/area/space/nearstation) -"lev" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"lfx" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "maintdiy"; - name = "Security Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"liD" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-22" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"ljN" = ( +"gdu" = ( /obj/structure/toilet{ dir = 4 }, @@ -57137,1017 +53948,167 @@ }, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/toilet/locker) -"lmT" = ( +"gfD" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"ggg" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable, +/turf/open/space, +/area/solar/starboard/aft) +"ghs" = ( /obj/structure/table/wood/fancy, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/machinery/light, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4; pixel_y = 5 }, -/obj/item/reagent_containers/food/snacks/burger/plain, /turf/open/floor/wood, /area/crew_quarters/bar) -"lnu" = ( -/obj/structure/chair/wood/normal{ - dir = 4 - }, -/turf/open/floor/wood{ - icon_state = "wood-broken6" - }, -/area/maintenance/bar) -"lqe" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair/sofa, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"lre" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-18" - }, -/turf/open/floor/plasteel, -/area/hallway/secondary/entry) -"lrF" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"lrH" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"ltC" = ( -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"lwn" = ( -/obj/structure/table, -/obj/item/book/manual/hydroponics_pod_people{ - pixel_x = -4; - pixel_y = 5 - }, -/obj/item/paper/guides/jobs/hydroponics{ - pixel_x = -5; - pixel_y = 3 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"lyB" = ( -/obj/effect/turf_decal/tile/red{ +"ghJ" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/effect/turf_decal/tile/red{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/machinery/camera{ - c_tag = "Firing Range"; - dir = 1 +/obj/structure/sign/warning/fire{ + desc = "A sign that states the labeled room's number."; + icon_state = "roomnum"; + name = "Room Number 1"; + pixel_x = -30; + pixel_y = -7 }, -/turf/open/floor/plasteel, -/area/security/prison) -"lzY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/engine_smes) -"lAB" = ( -/obj/structure/sign/nanotrasen, -/turf/closed/wall, -/area/science/circuit) -"lAY" = ( -/obj/structure/closet/lasertag/red, -/obj/item/clothing/under/pj/red, -/obj/item/clothing/under/pj/red, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"lBk" = ( -/obj/structure/chair/sofa/left{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"lCi" = ( -/obj/docking_port/stationary/public_mining_dock{ - dir = 8 - }, -/turf/open/floor/plating, -/area/construction/mining/aux_base) -"lDF" = ( -/obj/structure/shuttle/engine/propulsion{ - dir = 1 - }, -/turf/open/space/basic, -/area/space/nearstation) -"lHE" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/poddoor/preopen{ - id = "maint2" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"lJX" = ( -/obj/machinery/light/small{ - brightness = 3; - dir = 8 - }, -/turf/open/floor/plating, -/area/security/prison) -"lMg" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"lNn" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/ai_monitored/nuke_storage) -"lNz" = ( -/obj/structure/sign/mining{ - pixel_y = 7 - }, -/turf/closed/wall, -/area/quartermaster/miningdock) -"lQG" = ( -/obj/effect/spawner/structure/window, -/turf/open/floor/plating, -/area/science/circuit) -"lQR" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"lUd" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"lUR" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"maz" = ( -/obj/machinery/door/airlock/command{ - name = "Captain's Office"; - req_access_txt = "20" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/crew_quarters/heads/captain) -"maK" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"mbl" = ( -/obj/structure/chair/sofa/left, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"mcQ" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, -/obj/structure/closet/wardrobe/black, -/obj/item/clothing/under/skirt/black, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/head/beret/black, -/obj/item/clothing/under/trendy_fit, -/obj/item/clothing/under/trendy_fit, -/obj/item/clothing/under/sundress, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"mdp" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"mdQ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"mgT" = ( -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"mjr" = ( -/obj/structure/reagent_dispensers/keg/milk, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"mnP" = ( -/obj/effect/turf_decal/bot, -/obj/structure/sign/poster/official/pda_ad{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"moa" = ( -/obj/structure/chair/comfy/black{ - dir = 1 - }, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"mpA" = ( -/obj/structure/table/wood, -/obj/item/melee/chainofcommand, +"ghY" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"mpI" = ( -/obj/structure/table/wood, -/turf/open/floor/wood{ - icon_state = "wood-broken5" - }, -/area/maintenance/bar) -"mqZ" = ( -/obj/structure/reagent_dispensers/keg/aphro/strong, -/obj/item/reagent_containers/glass/beaker, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, -/area/maintenance/bar) -"mrR" = ( -/obj/effect/spawner/lootdrop/keg, +/area/maintenance/starboard/fore) +"gjf" = ( +/obj/machinery/vending/coffee, /turf/open/floor/wood, -/area/maintenance/bar) -"muq" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/area/bridge/meeting_room) +"gjl" = ( +/turf/closed/wall, +/area/quartermaster/warehouse) +"gjC" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"gtL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, /turf/closed/wall/r_wall, /area/engine/gravity_generator) -"mvB" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"mwm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/crew_quarters/toilet) -"mBv" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/stripes/line, -/obj/machinery/atmospherics/components/binary/valve{ - dir = 4; - name = "Output to Waste" - }, -/turf/open/floor/engine, -/area/engine/engineering) -"mDU" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/port) -"mFJ" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/sign/poster/contraband/free_drone{ - pixel_y = 32 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"mHC" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"mHW" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, +"gwd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/fitness) -"mJU" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"mKU" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"mMb" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-14" - }, /turf/open/floor/plasteel, -/area/hallway/primary/port) -"mNi" = ( -/obj/machinery/light_switch{ - pixel_x = -20 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, /area/science/circuit) -"mOL" = ( -/obj/structure/bed, -/obj/machinery/button/door{ - id = "Dorm6"; - name = "Cabin Bolt Control"; - normaldoorcontrol = 1; - pixel_y = -25; - specialfunctions = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/spawner/lootdrop/bedsheet, +"gwi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, -/area/crew_quarters/dorms) -"mPj" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/sign/departments/restroom{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"mPE" = ( -/obj/machinery/chem_dispenser/drinks, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) -"mRe" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"mRj" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"mTi" = ( -/obj/structure/table/wood/poker, -/obj/item/toy/cards/deck{ - pixel_y = 5 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"mTj" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"ncB" = ( -/obj/machinery/camera{ - c_tag = "Gravity Generator Room"; - dir = 8 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"ncI" = ( -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/table, -/turf/open/floor/plasteel, -/area/security/prison) -"ndo" = ( -/obj/structure/chair/comfy/black{ - dir = 8 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"neq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/chair{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"neT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"nfm" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/wood, -/area/maintenance/bar) -"nhn" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/area/crew_quarters/theatre) +"gBo" = ( /obj/structure/cable{ icon_state = "1-8" }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/maintenance/bar) +"gCe" = ( +/obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"niE" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall, -/area/maintenance/port) -"nlN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"nnb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"noK" = ( -/obj/structure/girder, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"npV" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"nqP" = ( -/obj/machinery/vending/cola/red, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"nuI" = ( -/obj/machinery/vending/coffee, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"nvw" = ( -/obj/machinery/photocopier{ - pixel_x = -5; - pixel_y = -5 - }, -/turf/open/floor/wood, -/area/library) -"nxv" = ( -/obj/machinery/power/apc{ - areastring = "/area/construction"; - name = "Construction Area APC"; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, +"gFD" = ( +/obj/structure/table/wood/fancy/royalblue, +/obj/item/crowbar/red, /turf/open/floor/plating, -/area/construction) -"nxN" = ( +/area/maintenance/port) +"gIO" = ( +/obj/structure/bed, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/plating, +/area/security/prison) +"gJg" = ( /turf/closed/wall/mineral/titanium, /area/space/nearstation) -"nyF" = ( -/obj/machinery/vending/coffee, -/turf/open/floor/wood, -/area/bridge/meeting_room) -"nzc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"nzh" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"nDn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"nGt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"gKk" = ( +/obj/machinery/vr_sleeper{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"nGN" = ( -/obj/structure/piano, -/obj/structure/window/reinforced, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) -"nNY" = ( -/obj/structure/chair/comfy/brown{ +/obj/effect/turf_decal/tile/green{ dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) +"gLH" = ( +/obj/machinery/door/airlock/external{ + name = "External Access"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"gMl" = ( +/obj/structure/chair/wood/normal{ dir = 4 }, /turf/open/floor/wood, -/area/crew_quarters/bar) -"nOD" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/light_construct{ - dir = 8 +/area/maintenance/bar) +"gOZ" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) -"nRG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"nTu" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/plasteel, -/area/security/prison) -"oaB" = ( +/area/crew_quarters/fitness) +"gQn" = ( +/obj/machinery/light/small, /turf/open/floor/mineral/titanium/blue, /area/crew_quarters/dorms) -"oaP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"oaT" = ( -/obj/structure/window, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"oce" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"odx" = ( -/obj/machinery/vending/kink, -/turf/open/floor/plating, -/area/maintenance/bar) -"odR" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"ogU" = ( -/obj/machinery/door/airlock/security{ - name = "Firing Range"; - req_access_txt = "2" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/prison) -"ohe" = ( -/obj/machinery/hydroponics/constructable, -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = 29 - }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) -"olr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"ope" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plating, -/area/storage/tech) -"oqa" = ( -/obj/structure/lattice/catwalk, -/obj/item/stack/marker_beacon{ - anchored = 1; - icon_state = "markerburgundy-on"; - light_power = 3; - light_range = 3; - name = "Docking Beacon"; - picked_color = "Burgundy" - }, -/turf/open/space/basic, +"gSH" = ( +/obj/structure/grille, +/turf/closed/wall/r_wall, /area/space/nearstation) -"osd" = ( -/obj/structure/sign/poster/contraband/tools, -/turf/closed/wall, -/area/storage/primary) -"ove" = ( -/obj/machinery/door/airlock/command{ - name = "Conference Room"; - req_access_txt = "19" - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space/basic, -/area/bridge/meeting_room) -"ovG" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/sign/poster/official/love_ian{ - pixel_x = 32; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"oxA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"oAc" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"oAV" = ( -/obj/structure/table, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/glasses/sunglasses{ - pixel_x = 3; - pixel_y = 3 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/item/clothing/ears/earmuffs{ - pixel_x = -3; - pixel_y = -2 - }, -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"oBB" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"oDF" = ( -/obj/machinery/light, -/turf/open/floor/plating, -/area/engine/engineering) -"oFY" = ( -/obj/effect/spawner/structure/window, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"oGS" = ( -/obj/structure/chair{ - dir = 8 - }, -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"oHU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"oIt" = ( -/obj/machinery/button/door{ - desc = "Bolts the doors to the Private Study."; - id = "PrivateStudy"; - name = "Private Study Lock"; - pixel_x = 25; - pixel_y = 25; - req_access_txt = ""; - req_one_access_txt = "28;63" - }, -/turf/open/floor/wood, -/area/library) -"oIx" = ( -/obj/machinery/button/door{ - id = "Room Two"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 7; - pixel_y = -24; - specialfunctions = 4 - }, -/obj/structure/chair/comfy/brown{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"oJs" = ( +"gVX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 }, /turf/closed/wall/r_wall, /area/engine/engine_smes) -"oKh" = ( -/obj/structure/chair/wood/normal{ - dir = 8 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"oKy" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"oLI" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"oNq" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"oNN" = ( -/obj/item/electropack/shockcollar, -/obj/item/assembly/signaler, -/turf/open/floor/plating, -/area/security/prison) -"oSk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"oSW" = ( -/obj/structure/grille/broken, -/turf/open/floor/plating, -/area/space/nearstation) -"oTI" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_y = -29 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"oUh" = ( -/obj/structure/disposalpipe/trunk{ - dir = 1 - }, -/obj/machinery/disposal/bin, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"oVS" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/structure/window, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"oWe" = ( -/obj/machinery/door/poddoor/shutters/preopen{ - desc = "Privacy shutters for the Private Study. Stops people spying in on your game."; - id = "PrivateStudy1"; - name = "Private Study Privacy Shutters" - }, -/obj/effect/spawner/structure/window, -/turf/open/floor/wood, -/area/library) -"oZl" = ( -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/structure/sign/departments/security{ - pixel_x = -32; - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"pbw" = ( -/obj/structure/chair{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"pdg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/machinery/door/window/eastleft{ - name = "Blue Corner" - }, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"pet" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/security/brig) -"pgY" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/disposalpipe/junction/flip, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"phP" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/space, -/area/solar/starboard/aft) -"pmf" = ( +"gVY" = ( /obj/structure/reagent_dispensers/foamtank, /obj/effect/turf_decal/tile/yellow{ dir = 8 @@ -58162,30 +54123,84 @@ /obj/effect/turf_decal/stripes/box, /turf/open/floor/plasteel, /area/engine/atmos) -"pmj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"pnl" = ( -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" +"gWd" = ( +/obj/structure/cable{ + icon_state = "1-4" }, /turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"pnx" = ( -/obj/machinery/light_switch{ - pixel_y = 28 +/area/construction) +"gXs" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"gZG" = ( +/obj/structure/closet/crate/freezer/surplus_limbs, +/obj/item/reagent_containers/glass/beaker/synthflesh, +/turf/open/floor/plasteel/white/side{ + dir = 8 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ +/area/medical/sleeper) +"haz" = ( +/obj/machinery/autolathe{ + name = "public autolathe" + }, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"haX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"hcd" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/sleeper) +"hdb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hdp" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"hfe" = ( +/obj/structure/sign/poster/contraband/smoke{ + desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"hgX" = ( +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/light/small, +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 + }, +/turf/open/floor/plasteel/white/side{ dir = 1 }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"pnS" = ( +/area/crew_quarters/fitness) +"hho" = ( /obj/structure/lattice/catwalk, /obj/item/stack/marker_beacon{ anchored = 1; @@ -58195,142 +54210,445 @@ name = "Docking Beacon"; picked_color = "Burgundy" }, -/turf/open/floor/plating, +/turf/open/space/basic, /area/space/nearstation) -"poc" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"hik" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/structure/chair{ +/turf/open/space, +/area/solar/starboard/aft) +"hjw" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"hkg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/dorms) +"hlY" = ( +/obj/machinery/door/airlock{ + name = "Recharging Station" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"hoo" = ( +/obj/effect/landmark/carpspawn, +/turf/open/space/basic, +/area/space) +"htr" = ( +/obj/effect/turf_decal/stripes/line{ dir = 4 }, /turf/open/floor/plasteel, -/area/science/mixing) -"puG" = ( -/obj/structure/closet{ - name = "Suit Closet" +/area/hydroponics) +"hvS" = ( +/obj/effect/landmark/stationroom/box/engine, +/turf/open/space/basic, +/area/space) +"hwu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"hzw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 }, -/obj/item/clothing/under/suit_jacket/white, -/obj/item/clothing/under/suit_jacket/tan, -/obj/item/clothing/under/suit_jacket/red, -/obj/item/clothing/under/suit_jacket/really_black, -/obj/item/clothing/under/suit_jacket/navy, -/obj/item/clothing/under/suit_jacket/green, -/obj/item/clothing/under/suit_jacket/female, -/obj/item/clothing/under/suit_jacket/checkered, -/obj/item/clothing/under/suit_jacket/charcoal, -/obj/item/clothing/under/suit_jacket/burgundy, -/obj/item/clothing/under/suit_jacket, -/obj/item/clothing/under/lawyer/black, -/obj/item/clothing/under/lawyer/blacksuit, -/obj/item/clothing/under/lawyer/blue, -/obj/item/clothing/under/lawyer/bluesuit, -/obj/item/clothing/under/lawyer/female, -/obj/item/clothing/under/lawyer/purpsuit, -/obj/item/clothing/under/lawyer/really_black, -/obj/item/clothing/under/lawyer/red, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"pAE" = ( -/obj/machinery/vending/cola/space_up, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"pGr" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"pHl" = ( -/obj/structure/table, -/obj/item/storage/box/beakers{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/storage/box/syringes, -/obj/item/reagent_containers/glass/bottle/epinephrine{ - pixel_x = 7; - pixel_y = -3 - }, -/obj/item/reagent_containers/glass/bottle/morphine{ - pixel_x = 8; - pixel_y = -3 - }, -/obj/item/reagent_containers/syringe{ - pixel_x = 6; - pixel_y = -3 - }, -/obj/item/radio/intercom{ - frequency = 1485; - name = "Station Intercom (Medbay)"; - pixel_x = 30 - }, -/turf/open/floor/plasteel/white, -/area/medical/sleeper) -"pIA" = ( -/obj/structure/chair/comfy/brown{ +"hzR" = ( +/obj/machinery/light{ dir = 4 }, /turf/open/floor/wood, /area/crew_quarters/bar) -"pKz" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/port) -"pLn" = ( -/obj/machinery/conveyor/inverted{ - dir = 5; - id = "garbage" - }, -/turf/open/floor/plating, -/area/maintenance/disposal) -"pMv" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-04" - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"pNj" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/starboard/fore) -"pNO" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) -"pQA" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/tank/air{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"pRx" = ( -/obj/effect/decal/cleanable/cobweb/cobweb2, -/obj/machinery/computer/slot_machine, -/obj/item/coin/iron, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"pUo" = ( -/obj/structure/fireplace, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"pVa" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +"hKF" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/storage/tech) +"hMx" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"hRa" = ( +/obj/structure/table/reinforced, +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/cell_charger{ + pixel_y = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"hRz" = ( +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"hRT" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/department/electrical) +"hRX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/wood, -/area/crew_quarters/heads/captain) -"pWH" = ( +/area/crew_quarters/theatre) +"hSU" = ( +/obj/structure/chair/sofa/left, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"hVw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"hWn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"hYW" = ( +/obj/machinery/light/small{ + dir = 4 + }, +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"hZH" = ( +/obj/machinery/hydroponics/constructable, +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = 29 + }, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"idX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"iep" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/obj/structure/toilet{ + dir = 4 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"ier" = ( +/obj/machinery/button/door{ + id = "Room Two"; + name = "Door Bolt Control"; + normaldoorcontrol = 1; + pixel_x = 7; + pixel_y = -24; + specialfunctions = 4 + }, +/obj/structure/chair/comfy/brown{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"igT" = ( +/obj/structure/table/wood/poker, +/obj/item/toy/cards/deck{ + pixel_y = 5 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"ihm" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/junction/flip, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ihC" = ( +/obj/item/chair/wood, +/turf/open/floor/plating, +/area/maintenance/port) +"iiW" = ( +/turf/open/floor/wood, +/area/maintenance/bar) +"ikx" = ( +/turf/open/floor/plating/foam, +/area/space/nearstation) +"ilJ" = ( +/obj/effect/turf_decal/tile/red, +/obj/machinery/light{ + light_color = "#c9d3e8" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"imH" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/maintenance/bar) +"ioB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/landmark/start/mime, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"ioG" = ( +/obj/machinery/vending/cola/red, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"ioX" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"ipc" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/engine_smes) +"ipA" = ( +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"iqw" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/security/brig) +"isy" = ( +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"itG" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"itT" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"ium" = ( +/mob/living/simple_animal/bot/cleanbot{ + name = "C.L.E.A.N." + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"ivF" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"iyC" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-06" + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) +"izv" = ( +/obj/machinery/vending/clothing, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"iEx" = ( +/obj/structure/table/wood, +/obj/machinery/light{ + dir = 4 + }, +/obj/item/instrument/trombone, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"iEI" = ( +/obj/machinery/vending/autodrobe/all_access, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"iEJ" = ( +/obj/machinery/door/airlock/external{ + name = "Escape Pod One" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"iES" = ( +/obj/structure/fireplace, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"iFL" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"iMG" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-14" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"iNn" = ( +/obj/machinery/camera{ + c_tag = "Kitchen Cold Room" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/reagent_dispensers/cooking_oil, +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/kitchen) +"iOt" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"iOV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/light_construct{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"iRJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/storage"; + name = "Cargo Bay APC"; + pixel_x = 1; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port) +"iVU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/spawner/structure/window, +/obj/machinery/door/firedoor, +/turf/open/floor/plating, +/area/crew_quarters/cryopod) +"iWa" = ( /obj/structure/closet/crate, /obj/item/book/manual/wiki/telescience, /obj/item/book/manual/wiki/engineering_guide, @@ -58357,338 +54675,142 @@ }, /turf/open/floor/wood, /area/library) -"pWO" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"qaZ" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"qcu" = ( -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green, -/turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"qdm" = ( -/obj/machinery/autolathe{ - name = "public autolathe" - }, -/turf/open/floor/plasteel, -/area/quartermaster/office) -"qet" = ( -/obj/structure/flora/ausbushes/fullgrass, -/obj/structure/flora/ausbushes/sparsegrass, -/obj/structure/flora/ausbushes/ppflowers, -/obj/structure/flora/ausbushes/ywflowers, -/obj/structure/flora/ausbushes/brflowers, -/obj/effect/spawner/structure/window, -/turf/open/floor/grass, -/area/crew_quarters/bar) -"qeQ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"qeZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/crew_quarters/bar) -"qnd" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/structure/light_construct{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"qqY" = ( -/obj/effect/turf_decal/tile/blue{ - alpha = 255 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - alpha = 255; - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"quT" = ( -/obj/structure/lattice, -/obj/structure/grille/broken, -/turf/open/space/basic, -/area/space/nearstation) -"qvo" = ( -/obj/structure/chair/comfy/brown{ - color = "#66b266"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"qwZ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"qxb" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"qzE" = ( -/obj/machinery/door/airlock{ - name = "Shower Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/toilet) -"qGM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"qIw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"iWk" = ( +/obj/structure/bookcase{ + name = "Forbidden Knowledge" }, /turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"qIT" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"qIZ" = ( +/area/library) +"iYz" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /obj/effect/turf_decal/tile/red{ dir = 1 }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/effect/turf_decal/tile/yellow{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/locker) -"qKJ" = ( -/obj/structure/cable{ - icon_state = "4-8" +/area/crew_quarters/theatre) +"jaa" = ( +/obj/machinery/hydroponics/constructable, +/obj/machinery/light{ + dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"qKZ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/security/execution/transfer) -"qMf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/door/poddoor/shutters/preopen{ - id = "holoprivacy"; - name = "Holodeck Shutters" - }, -/turf/open/floor/plating, -/area/crew_quarters/fitness) -"qPl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/structure/disposalpipe/junction, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"qPJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 - }, -/obj/machinery/camera{ - c_tag = "Bar Backroom"; - dir = 2 - }, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"qRq" = ( -/obj/structure/table, +/turf/open/floor/plasteel/dark, +/area/hydroponics) +"jbf" = ( /obj/structure/cable{ icon_state = "0-2" }, -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/machinery/power/apc{ + areastring = "/area/hallway/secondary/service"; + dir = 1; + name = "Service Hall APC"; + pixel_y = 25 }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/recharger, -/obj/item/gun/energy/laser/practice, -/obj/item/gun/energy/laser/practice, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"jdT" = ( +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"jeR" = ( +/obj/structure/chair/sofa/left, /turf/open/floor/plasteel, /area/security/prison) -"qVa" = ( -/obj/structure/sign/poster/official/help_others{ - pixel_y = -32 +"jeT" = ( +/obj/machinery/vending/clothing, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jgm" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/machinery/camera{ + c_tag = "Circuitry Lab"; + dir = 8; + network = list("ss13","rd") }, /turf/open/floor/plasteel, -/area/hallway/primary/starboard) -"qXl" = ( +/area/science/circuit) +"jgv" = ( +/obj/structure/chair/comfy/brown{ + color = "#596479"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jhF" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"jiR" = ( /obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, +/obj/structure/window, /obj/structure/window{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, +/obj/effect/landmark/start/assistant, /turf/open/floor/plasteel, /area/crew_quarters/locker) -"qYi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 5 +"jlm" = ( +/obj/machinery/rnd/production/techfab/department/cargo, +/turf/open/floor/plasteel, +/area/quartermaster/office) +"jly" = ( +/obj/structure/chair/stool{ + pixel_y = 8 }, -/obj/structure/window/reinforced{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/turf/open/floor/plating, -/area/security/prison) -"qZv" = ( -/obj/structure/cable{ - icon_state = "2-4" +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"rak" = ( -/obj/structure/bed, -/obj/item/bedsheet/random, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"rcD" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/science/circuit) -"rfu" = ( -/obj/item/reagent_containers/glass/bucket, -/turf/open/floor/grass, -/area/security/prison) -"rfE" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/security/prison) -"rfW" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/maintenance/disposal/incinerator) -"rgv" = ( -/obj/structure/bed, -/obj/effect/spawner/lootdrop/bedsheet, -/turf/open/floor/plating, -/area/security/prison) -"rkR" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/carpet, /area/crew_quarters/theatre) -"rmC" = ( -/obj/structure/fans/tiny/invisible, +"jmC" = ( +/obj/structure/lattice/catwalk, /turf/open/space/basic, -/area/space) -"rmX" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"rmY" = ( -/obj/machinery/light/small{ - dir = 4; - light_color = "#d8b1b1" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"rnY" = ( -/obj/effect/spawner/structure/window/shuttle, -/turf/open/floor/plating, /area/space/nearstation) -"rrJ" = ( +"jnm" = ( +/obj/machinery/power/smes{ + charge = 5e+006 + }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, -/turf/open/floor/plating, -/area/space/nearstation) -"ruS" = ( -/obj/structure/closet/athletic_mixed, +/obj/structure/cable{ + icon_state = "0-8" + }, /turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"rAJ" = ( +/area/engine/gravity_generator) +"job" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -58707,49 +54829,2030 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/locker) +"jqv" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/bar) +"jrE" = ( +/obj/structure/sign/poster/official/random{ + pixel_x = 32 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"jsy" = ( +/obj/structure/closet{ + name = "Suit Closet" + }, +/obj/item/clothing/under/suit_jacket/white, +/obj/item/clothing/under/suit_jacket/tan, +/obj/item/clothing/under/suit_jacket/red, +/obj/item/clothing/under/suit_jacket/really_black, +/obj/item/clothing/under/suit_jacket/navy, +/obj/item/clothing/under/suit_jacket/green, +/obj/item/clothing/under/suit_jacket/female, +/obj/item/clothing/under/suit_jacket/checkered, +/obj/item/clothing/under/suit_jacket/charcoal, +/obj/item/clothing/under/suit_jacket/burgundy, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/under/lawyer/black, +/obj/item/clothing/under/lawyer/blacksuit, +/obj/item/clothing/under/lawyer/blue, +/obj/item/clothing/under/lawyer/bluesuit, +/obj/item/clothing/under/lawyer/female, +/obj/item/clothing/under/lawyer/purpsuit, +/obj/item/clothing/under/lawyer/really_black, +/obj/item/clothing/under/lawyer/red, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"jtk" = ( +/obj/structure/chair/comfy/black{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"jtU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/security/execution/transfer) +"jvN" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"jwi" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"jzi" = ( +/obj/structure/grille, +/obj/structure/lattice, +/turf/open/floor/plating, +/area/space/nearstation) +"jzD" = ( +/obj/structure/piano{ + icon_state = "piano" + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"jAD" = ( +/obj/structure/grille, +/turf/open/floor/plating/airless, +/area/space/nearstation) +"jBZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"jCq" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"jDY" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"jFy" = ( +/obj/machinery/door/airlock{ + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" + }, +/obj/machinery/door/firedoor, +/obj/structure/disposalpipe/segment, +/turf/open/floor/wood, +/area/library) +"jHt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"jHM" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/security/prison) +"jJF" = ( +/obj/machinery/door/airlock/maintenance, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/maintenance/port/aft) +"jLM" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"jMK" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jNo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"jRy" = ( +/obj/machinery/door/airlock{ + name = "Instrument Storage" + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"jSa" = ( +/obj/item/electropack/shockcollar, +/obj/item/assembly/signaler, +/turf/open/floor/plating, +/area/security/prison) +"jSD" = ( +/obj/machinery/door/airlock/security{ + name = "Firing Range"; + req_access_txt = "2" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"jSO" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"jVl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"jXg" = ( +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/nuke_storage"; + dir = 1; + name = "Vault APC"; + pixel_y = 25 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) +"jYI" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"kay" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"kcj" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"kdm" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating, +/area/security/prison) +"kel" = ( +/obj/effect/landmark/blobstart, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kfE" = ( +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/table, +/turf/open/floor/plasteel, +/area/security/prison) +"khb" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/table, +/obj/item/kitchen/rollingpin, +/obj/item/shovel/spade, +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"khA" = ( +/obj/structure/table, +/obj/item/instrument/guitar{ + pixel_x = -7 + }, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/obj/item/instrument/violin, +/obj/item/instrument/trombone, +/obj/item/instrument/saxophone, +/obj/item/instrument/piano_synth, +/obj/item/instrument/recorder, +/obj/item/instrument/accordion, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"khB" = ( +/obj/machinery/door/airlock/external{ + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"klu" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) +"knx" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"kob" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"ksn" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"kuY" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "maint2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kvb" = ( +/obj/structure/shuttle/engine/heater{ + dir = 1 + }, +/turf/closed/wall/mineral/titanium, +/area/space/nearstation) +"kvZ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"kwy" = ( +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Bar"; + departmentType = 2; + pixel_x = -30; + pixel_y = 45; + receive_ore_updates = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"kxc" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"kyi" = ( +/obj/structure/bed, +/obj/machinery/button/door{ + id = "Dorm5"; + name = "Cabin Bolt Control"; + normaldoorcontrol = 1; + pixel_y = -25; + specialfunctions = 4 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/obj/effect/spawner/lootdrop/bedsheet, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"kyF" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/wood, +/area/maintenance/bar) +"kzT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/science/mixing) +"kCk" = ( +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/structure/sink{ + dir = 1; + pixel_y = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"kCW" = ( +/obj/machinery/portable_atmospherics/scrubber, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"kDD" = ( +/obj/structure/lattice, +/turf/closed/wall/r_wall, +/area/ai_monitored/nuke_storage) +"kHJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"kHK" = ( +/obj/machinery/button/door{ + desc = "Bolts the doors to the Private Study."; + id = "PrivateStudy"; + name = "Private Study Lock"; + pixel_x = 25; + pixel_y = 25; + req_access_txt = ""; + req_one_access_txt = "28;63" + }, +/turf/open/floor/wood, +/area/library) +"kJr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"kJY" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 + }, +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 + }, +/turf/open/floor/plating, +/area/maintenance/port) +"kKw" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/space, +/area/solar/port/aft) +"kLR" = ( +/obj/machinery/door/poddoor/shutters/preopen{ + desc = "Privacy shutters for the Private Study. Stops people spying in on your game."; + id = "PrivateStudy1"; + name = "Private Study Privacy Shutters" + }, +/obj/effect/spawner/structure/window, +/turf/open/floor/wood, +/area/library) +"kOf" = ( +/obj/structure/chair{ + dir = 8 + }, +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"kPd" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"kQk" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/item/storage/toolbox/electrical, +/turf/open/floor/plating, +/area/maintenance/department/medical/morgue) +"kQZ" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"kRk" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/structure/chair/sofa/right{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"kSb" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/miningdock) +"kSh" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_y = -29 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"kSB" = ( +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"kTz" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"kWI" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/plasteel/cafeteria, +/area/crew_quarters/locker) +"lhg" = ( +/obj/machinery/vending/clothing, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"lmi" = ( +/obj/structure/door_assembly/door_assembly_mai, +/obj/item/electronics/airlock, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"lnu" = ( +/obj/structure/chair/wood/normal{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/bar) +"lwj" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = 5; + pixel_y = 7 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/dr_gibb{ + pixel_x = -3; + pixel_y = 2 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"lwp" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"lwY" = ( +/obj/machinery/door/window/westleft{ + base_state = "right"; + icon_state = "right"; + name = "Unisex Showers" + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"lxx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/crew_quarters/bar) +"lAB" = ( +/obj/structure/sign/nanotrasen, +/turf/closed/wall, +/area/science/circuit) +"lBE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"lCi" = ( +/obj/docking_port/stationary/public_mining_dock{ + dir = 8 + }, +/turf/open/floor/plating, +/area/construction/mining/aux_base) +"lCB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"lCL" = ( +/turf/open/space/basic, +/area/space/nearstation) +"lFl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"lLt" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"lLI" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lMg" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"lMx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/crew_quarters/dorms) +"lMY" = ( +/obj/structure/flora/ausbushes/fullgrass, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/ausbushes/ppflowers, +/obj/structure/flora/ausbushes/ywflowers, +/obj/structure/flora/ausbushes/brflowers, +/obj/effect/spawner/structure/window, +/turf/open/floor/grass, +/area/crew_quarters/bar) +"lNB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plating, +/area/space/nearstation) +"lQG" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/science/circuit) +"lTq" = ( +/obj/structure/table, +/obj/item/folder/blue, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"lYU" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/sign/departments/security{ + pixel_x = -32; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"lYZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/disposalpipe/junction, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"maC" = ( +/obj/structure/table, +/obj/item/storage/pill_bottle/dice{ + pixel_x = 4; + pixel_y = 4 + }, +/obj/item/reagent_containers/food/snacks/cherrycupcake, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mbD" = ( +/obj/structure/closet{ + name = "Suit Closet" + }, +/obj/item/clothing/under/suit_jacket/white, +/obj/item/clothing/under/suit_jacket/tan, +/obj/item/clothing/under/suit_jacket/red, +/obj/item/clothing/under/suit_jacket/really_black, +/obj/item/clothing/under/suit_jacket/navy, +/obj/item/clothing/under/suit_jacket/green, +/obj/item/clothing/under/suit_jacket/female, +/obj/item/clothing/under/suit_jacket/checkered, +/obj/item/clothing/under/suit_jacket/charcoal, +/obj/item/clothing/under/suit_jacket/burgundy, +/obj/item/clothing/under/suit_jacket, +/obj/item/clothing/under/lawyer/black, +/obj/item/clothing/under/lawyer/blacksuit, +/obj/item/clothing/under/lawyer/blue, +/obj/item/clothing/under/lawyer/bluesuit, +/obj/item/clothing/under/lawyer/female, +/obj/item/clothing/under/lawyer/purpsuit, +/obj/item/clothing/under/lawyer/really_black, +/obj/item/clothing/under/lawyer/red, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"mfb" = ( +/obj/structure/toilet{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"mjr" = ( +/obj/structure/reagent_dispensers/keg/milk, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mlr" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/light_construct{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"moq" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"mpI" = ( +/obj/structure/table/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/bar) +"mqa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"mqZ" = ( +/obj/structure/reagent_dispensers/keg/aphro/strong, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plating, +/area/maintenance/bar) +"mrR" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/wood, +/area/maintenance/bar) +"mte" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"mwb" = ( +/obj/effect/spawner/structure/window/shuttle, +/turf/open/floor/plating, +/area/space/nearstation) +"mwO" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"myt" = ( +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"mCq" = ( +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"mEN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/freezer, +/area/crew_quarters/toilet) +"mHC" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"mIS" = ( +/obj/structure/table, +/obj/item/clothing/gloves/boxing/yellow, +/obj/item/clothing/gloves/boxing/green, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing/blue, +/obj/item/clothing/gloves/boxing, +/obj/item/clothing/gloves/boxing, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"mNi" = ( +/obj/machinery/light_switch{ + pixel_x = -20 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"mPE" = ( +/obj/machinery/chem_dispenser/drinks, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"mQR" = ( +/obj/machinery/camera{ + c_tag = "Gravity Generator Room"; + dir = 8 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"mRe" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"mTp" = ( +/obj/structure/chair/sofa/left, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"mXB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"ncj" = ( +/obj/effect/turf_decal/tile/blue, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"ndC" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"nea" = ( +/obj/machinery/recharge_station, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"neb" = ( +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"nel" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"new" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/security/prison) +"neC" = ( +/obj/structure/table/wood, +/obj/item/toy/cards/deck, +/turf/open/floor/plasteel, +/area/security/prison) +"nfm" = ( +/obj/machinery/vending/autodrobe, +/turf/open/floor/wood, +/area/maintenance/bar) +"nie" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"nlt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"nmx" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"nmS" = ( +/obj/structure/closet/athletic_mixed, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"nrR" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"nsJ" = ( +/obj/machinery/door/airlock{ + desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; + id_tag = "PrivateStudy"; + name = "Private Study" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/wood, +/area/library) +"ntf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"nuV" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"nxv" = ( +/obj/machinery/power/apc{ + areastring = "/area/construction"; + name = "Construction Area APC"; + pixel_y = -24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/construction) +"nyH" = ( +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"nGt" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nGS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"nIE" = ( +/obj/structure/sign/poster/contraband/tools, +/turf/closed/wall, +/area/storage/primary) +"nLf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/bridge/meeting_room) +"nMx" = ( +/obj/effect/mapping_helpers/airlock/locked, +/obj/machinery/door/airlock/vault, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"nOS" = ( +/obj/structure/safe, +/obj/item/clothing/head/bearpelt, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass, +/obj/item/reagent_containers/food/drinks/bottle/vodka/badminka, +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/gun/ballistic/revolver/nagant, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"nQr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall, +/area/maintenance/port) +"nRG" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"nTE" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"nWq" = ( +/obj/machinery/door/airlock/engineering{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"nXa" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"oce" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"odx" = ( +/obj/machinery/vending/kink, +/turf/open/floor/plating, +/area/maintenance/bar) +"oeJ" = ( +/obj/structure/table/wood, +/obj/item/instrument/violin, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"oeQ" = ( +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"ohX" = ( +/obj/structure/table/wood, +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/wood, +/area/security/vacantoffice) +"olr" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"olv" = ( +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers, +/turf/open/floor/plasteel, +/area/security/brig) +"olw" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 4; + name = "4maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"oma" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"orw" = ( +/obj/structure/table, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/recharger, +/obj/item/gun/energy/laser/practice, +/obj/item/gun/energy/laser/practice, +/turf/open/floor/plasteel, +/area/security/prison) +"ory" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"otF" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/extinguisher_cabinet{ + pixel_x = 5; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"ouD" = ( +/obj/structure/reagent_dispensers/keg/semen, +/turf/open/floor/plating, +/area/maintenance/bar) +"oBp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/reagent_dispensers/fueltank, +/turf/open/floor/plating, +/area/maintenance/port) +"oDy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-04" + }, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"oFk" = ( +/obj/structure/closet/boxinggloves, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"oHU" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"oKh" = ( +/obj/structure/chair/wood/normal{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"oMY" = ( +/obj/machinery/button/door{ + desc = "Alright, GAMER! Want to take your PWRGAME addiction to the MAX? Just smash this button with your chubby chetto encrusted hands an- oh, you broke the switch. Good job, idiot."; + id = "RIPFUN"; + name = "Powerful Gamer Toggle"; + normaldoorcontrol = 1; + pixel_x = -24; + pixel_y = 7; + specialfunctions = 4 + }, +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/maintenance/port) +"oNb" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"oNQ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"oOb" = ( +/obj/structure/sign/poster/official/cohiba_robusto_ad, +/turf/closed/wall, +/area/lawoffice) +"oSO" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/chair/sofa, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"oUh" = ( +/obj/structure/disposalpipe/trunk{ + dir = 1 + }, +/obj/machinery/disposal/bin, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"oXL" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"oYc" = ( +/obj/machinery/light/small{ + dir = 4; + light_color = "#d8b1b1" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"phu" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"phH" = ( +/turf/open/floor/grass, +/area/security/prison) +"phY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"pjh" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light_switch{ + pixel_y = -25 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"poa" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"poc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) +"ppY" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/structure/sign/poster/official/love_ian{ + pixel_x = 32; + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pqR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"prP" = ( +/obj/structure/grille, +/turf/open/space/basic, +/area/space/nearstation) +"prU" = ( +/obj/item/radio/intercom{ + dir = 4; + name = "Station Intercom (General)"; + pixel_x = 27 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"ptV" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"puG" = ( +/obj/structure/rack, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, +/obj/effect/decal/cleanable/cobweb, +/obj/item/clothing/under/color/grey, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"pxD" = ( +/obj/structure/chair/sofa, +/obj/structure/window{ + dir = 1 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"pzk" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/obj/structure/table, +/obj/item/coin/gold, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pAl" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/tank/air{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"pFt" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/starboard/aft) +"pHl" = ( +/obj/structure/table, +/obj/item/storage/box/beakers{ + pixel_x = 2; + pixel_y = 2 + }, +/obj/item/storage/box/syringes, +/obj/item/reagent_containers/glass/bottle/epinephrine{ + pixel_x = 7; + pixel_y = -3 + }, +/obj/item/reagent_containers/glass/bottle/morphine{ + pixel_x = 8; + pixel_y = -3 + }, +/obj/item/reagent_containers/syringe{ + pixel_x = 6; + pixel_y = -3 + }, +/obj/item/radio/intercom{ + frequency = 1485; + name = "Station Intercom (Medbay)"; + pixel_x = 30 + }, +/turf/open/floor/plasteel/white, +/area/medical/sleeper) +"pHo" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"pLn" = ( +/obj/machinery/conveyor/inverted{ + dir = 5; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"pLt" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/light{ + dir = 4 + }, +/obj/machinery/power/apc{ + areastring = "/area/security/main"; + dir = 4; + name = "Firing Range APC"; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"pNH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/door/window, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"pNI" = ( +/obj/effect/turf_decal/bot, +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pPE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue, +/obj/machinery/door/window/eastleft{ + name = "Blue Corner" + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"pQr" = ( +/obj/structure/table, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/glasses/sunglasses{ + pixel_x = 3; + pixel_y = 3 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/item/clothing/ears/earmuffs{ + pixel_x = -3; + pixel_y = -2 + }, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"pQD" = ( +/obj/structure/sign/poster/official/ion_rifle, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"pSf" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"pTn" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/power/terminal, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"pTR" = ( +/obj/machinery/light{ + dir = 1 + }, +/obj/item/radio/intercom{ + pixel_y = 25 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"pUl" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command{ + name = "Command Access To Vault" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"pZv" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"qbx" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ + pixel_x = -3; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qeQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"qje" = ( +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"qkC" = ( +/obj/machinery/power/apc{ + areastring = "/area/maintenance/starboard/fore"; + dir = 1; + name = "Starboard Bow Maintenance APC"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"qlr" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/window{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/locker) +"qlF" = ( +/obj/structure/lattice, +/turf/closed/wall, +/area/security/prison) +"qmM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"qoP" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/structure/chair/sofa/left, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qpA" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/sign/poster/official/cohiba_robusto_ad{ + pixel_y = -32 + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"qux" = ( +/obj/structure/chair/sofa/left{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"quT" = ( +/obj/structure/lattice, +/obj/structure/grille/broken, +/turf/open/space/basic, +/area/space/nearstation) +"qvM" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/circuit, +/area/ai_monitored/nuke_storage) +"qwe" = ( +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"qwB" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/engineering/glass{ + name = "Gravity Generator"; + req_access_txt = "11" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel/dark, +/area/engine/gravity_generator) +"qxc" = ( +/obj/effect/decal/cleanable/cobweb/cobweb2, +/obj/machinery/computer/slot_machine, +/obj/item/coin/iron, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"qAQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/table, +/obj/item/storage/firstaid/regular{ + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qBc" = ( +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"qBe" = ( +/obj/structure/chair/comfy/black{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/bridge/meeting_room) +"qEv" = ( +/obj/structure/table/wood/fancy, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/item/reagent_containers/food/drinks/britcup{ + desc = "Kingston's personal cup."; + pixel_x = 5; + pixel_y = 5 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"qHB" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"qIf" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/bar) +"qIw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"qJZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"qMu" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"qNs" = ( +/obj/structure/table/wood, +/obj/item/flashlight/lamp/green{ + on = 0; + pixel_x = -7; + pixel_y = 12 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"qOf" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"qQJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/theatre) +"qUm" = ( +/obj/structure/filingcabinet/employment, +/turf/open/floor/wood, +/area/crew_quarters/heads/captain) +"qXH" = ( +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rcD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/science/circuit) +"reZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/engine/engine_smes) +"rfW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/maintenance/disposal/incinerator) +"rgF" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"rhb" = ( +/obj/machinery/vending/cola/space_up, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"riA" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/camera{ + c_tag = "Firing Range"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"riB" = ( +/obj/machinery/door/firedoor, +/obj/structure/sign/departments/evac{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"rmX" = ( +/obj/structure/table, +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"rsv" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/space, +/area/solar/starboard/fore) +"rsX" = ( +/obj/effect/turf_decal/tile/red, +/obj/structure/chair{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"rtT" = ( +/obj/structure/chair/comfy/brown{ + color = "#66b266"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"rvZ" = ( +/obj/structure/target_stake, +/obj/item/target/syndicate, +/turf/open/floor/plating, +/area/security/prison) +"rxH" = ( +/obj/structure/girder, +/turf/open/floor/plating, +/area/space/nearstation) +"rzg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) "rBq" = ( /obj/item/clothing/head/kitty, /obj/item/clothing/under/maid, /obj/item/clothing/mask/muzzle, /turf/open/floor/plating, /area/maintenance/bar) -"rEQ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"rJv" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/sign/poster/official/space_cops{ - pixel_x = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"rKP" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 +"rEV" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" }, /turf/open/floor/plating, -/area/construction) -"rKZ" = ( -/obj/structure/chair/comfy/brown{ - dir = 8 +/area/crew_quarters/fitness) +"rFc" = ( +/obj/machinery/door/airlock{ + desc = "To keep the station within regulations, space IKEA requires one storage cupboard for their Nanotrasen partnership to continue."; + id_tag = "MaintDorm1"; + name = "Furniture Storage" }, -/turf/open/floor/plasteel, -/area/security/prison) -"rLg" = ( -/turf/closed/wall/r_wall, -/area/hallway/primary/central) -"rMI" = ( +/turf/open/floor/plasteel/dark, +/area/maintenance/port) +"rKc" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ icon_state = "0-2" }, /turf/open/space, /area/solar/port/fore) +"rKP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, +/turf/open/floor/plating, +/area/construction) +"rLr" = ( +/obj/structure/window, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rLR" = ( +/obj/structure/sign/poster/contraband/space_up{ + pixel_x = -32; + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"rMc" = ( +/obj/structure/table/wood/fancy/black, +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) "rMN" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -58772,29 +56875,38 @@ }, /turf/open/floor/plasteel, /area/science/mixing) -"rTD" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"rOm" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 23 }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"rTQ" = ( +/obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"rXv" = ( -/obj/machinery/hydroponics/constructable, -/obj/machinery/light{ +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/turf/open/floor/plasteel/dark, -/area/hydroponics) +/turf/open/floor/plasteel/white/side{ + dir = 8 + }, +/area/crew_quarters/fitness) +"rUQ" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/turf/open/floor/plating, +/area/space/nearstation) "saK" = ( /obj/structure/closet/crate, /obj/item/target/alien, @@ -58807,43 +56919,60 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel/white, /area/science/circuit) -"sbs" = ( -/turf/open/floor/plating, -/area/space/nearstation) -"sfO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/closet/wardrobe/pjs, -/obj/item/clothing/under/maid, -/obj/item/clothing/under/maid, -/obj/item/clothing/under/janimaid, -/obj/item/clothing/under/janimaid, -/obj/item/clothing/accessory/maidapron, -/obj/item/clothing/accessory/maidapron, -/obj/machinery/light{ +"sdL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"sfa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"sgV" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 4; + name = "Air In" + }, +/obj/effect/turf_decal/stripes/line{ dir = 8 }, +/turf/open/floor/plating, +/area/maintenance/fore/secondary) +"sjm" = ( +/obj/structure/table/wood, +/obj/item/instrument/piano_synth, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"sjw" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/obj/structure/closet/wardrobe/black, +/obj/item/clothing/under/skirt/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/head/beret/black, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/trendy_fit, +/obj/item/clothing/under/sundress, /turf/open/floor/plasteel, /area/crew_quarters/fitness) -"sfY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"sjT" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"shX" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"siG" = ( -/obj/machinery/vending/clothing, -/obj/structure/disposalpipe/segment{ - dir = 4 +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 }, /turf/open/floor/plasteel, -/area/crew_quarters/locker) +/area/security/prison) "slk" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -58856,33 +56985,86 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"sno" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"slp" = ( +/obj/effect/turf_decal/tile/blue{ + alpha = 255 + }, +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/obj/structure/sign/poster/official/cohiba_robusto_ad{ - pixel_y = -32 +/obj/effect/turf_decal/tile/blue{ + alpha = 255; + dir = 1 }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"srw" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"svt" = ( -/obj/structure/target_stake, -/obj/item/target/syndicate, -/turf/open/floor/plating, -/area/security/prison) -"sxe" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/effect/turf_decal/tile/blue{ dir = 8 }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"smn" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"snG" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/space, +/area/solar/port/aft) +"spX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"sqa" = ( +/obj/item/twohanded/required/kirbyplants{ + icon_state = "applebush" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"srq" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/bridge/meeting_room) +"ssL" = ( +/obj/structure/lattice/catwalk, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/space, +/area/solar/starboard/fore) +"suI" = ( +/obj/machinery/door/window/southleft{ + name = "Target Storage" + }, +/obj/item/target/clown, +/obj/item/target/clown, +/obj/item/target, +/obj/item/target, +/turf/open/floor/plating, +/area/security/prison) +"svw" = ( +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "sxs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table, @@ -58896,61 +57078,52 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) -"szF" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +"sxX" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"szH" = ( -/obj/machinery/shower{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/turf/open/floor/plasteel/freezer, -/area/security/prison) +/area/maintenance/starboard/fore) +"sAI" = ( +/obj/structure/table/wood/fancy, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 9 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 9 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "sAM" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" }, /area/maintenance/bar) -"sBu" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 4 - }, -/area/crew_quarters/fitness) -"sCo" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/space, -/area/solar/starboard/fore) "sEt" = ( /turf/open/floor/wood{ icon_state = "wood-broken7" }, /area/maintenance/bar) -"sEJ" = ( -/obj/structure/cable{ - icon_state = "0-8" +"sIe" = ( +/obj/structure/sign/poster/official/fruit_bowl{ + pixel_y = 32 }, -/obj/machinery/power/apc{ - areastring = "/area/crew_quarters/abandoned_gambling_den"; - name = "Abandoned Gambling Den APC"; - pixel_y = -24 +/turf/open/floor/plasteel/white/corner{ + dir = 1 }, +/area/hallway/primary/starboard) +"sLr" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/silver, /turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) +/area/maintenance/starboard/fore) "sLv" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -58959,6 +57132,17 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"sMa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/vending/kink, +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) "sOs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -58966,29 +57150,6 @@ /obj/machinery/door/airlock/maintenance/abandoned, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"sOO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"sPj" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance, -/obj/item/coin/gold, -/obj/item/coin/gold, -/obj/item/coin/gold, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"sPA" = ( -/turf/open/floor/carpet, -/area/crew_quarters/dorms) "sQX" = ( /turf/open/floor/plating, /area/space) @@ -59000,38 +57161,6 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) -"sTt" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"sVN" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"sWr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) "sWR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59041,16 +57170,6 @@ }, /turf/open/floor/plasteel, /area/quartermaster/office) -"sXo" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) "sXy" = ( /obj/machinery/door/airlock/external{ name = "Security External Airlock"; @@ -59065,58 +57184,59 @@ /obj/machinery/vending/boozeomat/all_access, /turf/closed/wall, /area/maintenance/bar) +"sYv" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"sZa" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Bar Backroom"; + dir = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"sZR" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) "tal" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) -"taU" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window, -/obj/effect/turf_decal/tile/blue{ - dir = 1 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"tcE" = ( -/obj/structure/door_assembly/door_assembly_mai, -/obj/item/electronics/airlock, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"thl" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, -/area/medical/sleeper) -"thY" = ( +"tdF" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plating, -/area/maintenance/fore/secondary) -"tku" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/light{ + dir = 4 }, -/turf/open/floor/carpet, -/area/crew_quarters/theatre) +/turf/open/floor/plating, +/area/maintenance/port/aft) +"thr" = ( +/obj/structure/frame/computer{ + dir = 1 + }, +/turf/open/floor/plating, +/area/space/nearstation) "tkU" = ( /turf/open/floor/wood{ icon_state = "wood-broken5" }, /area/maintenance/bar) -"tpb" = ( -/turf/open/floor/plating/foam, -/area/space/nearstation) "tqg" = ( /obj/machinery/cryopod{ dir = 4 @@ -59126,808 +57246,20 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"tqt" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) "trb" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/plasteel, /area/security/courtroom) -"trk" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"trl" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"trM" = ( -/obj/structure/table, -/obj/item/instrument/guitar{ - pixel_x = -7 - }, -/obj/item/instrument/eguitar{ - pixel_x = 5 - }, -/obj/item/instrument/violin, -/obj/item/instrument/trombone, -/obj/item/instrument/saxophone, -/obj/item/instrument/piano_synth, -/obj/item/instrument/recorder, -/obj/item/instrument/accordion, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"tsY" = ( -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/toilet) -"ttp" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"ttF" = ( -/obj/machinery/vr_sleeper{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/crew_quarters/fitness) -"tur" = ( -/obj/item/restraints/handcuffs/fake, -/turf/open/floor/plating, -/area/maintenance/bar) -"tyg" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"tDE" = ( -/obj/structure/grille, -/obj/structure/lattice, -/turf/open/floor/plating, -/area/space/nearstation) -"tEy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"tMl" = ( -/obj/effect/turf_decal/loading_area, -/turf/open/floor/plasteel/showroomfloor, -/area/crew_quarters/kitchen) -"tOq" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/mixing) -"tPS" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/crew_quarters/theatre) -"tPT" = ( -/obj/machinery/chem_dispenser/drinks/beer, -/obj/structure/table/wood, -/turf/open/floor/wood, -/area/maintenance/bar) -"tQu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"tRe" = ( -/obj/machinery/chem_master, -/turf/open/floor/plasteel/white, -/area/medical/medbay/central) -"tRF" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"tTh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/trunk{ - dir = 4 - }, -/obj/machinery/disposal/bin, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"tTt" = ( -/obj/structure/sign/departments/restroom, -/turf/closed/wall, -/area/crew_quarters/toilet) -"tVp" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"tVQ" = ( -/obj/structure/table, -/obj/item/folder/blue, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"tXL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"tYn" = ( -/obj/structure/falsewall, -/turf/open/floor/plating, -/area/security/prison) -"uao" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"uaw" = ( -/obj/machinery/power/apc{ - areastring = "/area/storage/art"; - dir = 1; - name = "Maint bar"; - pixel_y = 24 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"udn" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" - }, -/obj/structure/chair/sofa/right{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"udp" = ( -/obj/item/crowbar/large, -/obj/structure/rack, -/obj/item/flashlight, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"udS" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"ueP" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"uhG" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/light, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"uhH" = ( -/obj/item/wrench, -/obj/structure/rack, -/obj/item/weldingtool/hugetank, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/head/welding{ - pixel_x = -3; - pixel_y = 5 - }, -/obj/item/clothing/glasses/welding, -/obj/item/clothing/glasses/welding, -/turf/open/floor/plasteel/dark, -/area/engine/engineering) -"uip" = ( -/obj/machinery/vending/clothing, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"uiR" = ( -/obj/structure/lattice, -/turf/closed/wall, -/area/security/prison) -"uiT" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"ujF" = ( -/obj/machinery/cryopod{ - dir = 4 - }, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"ukL" = ( -/obj/structure/closet/boxinggloves, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"ulP" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"unN" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue, -/obj/structure/window{ - dir = 1 - }, -/obj/structure/window{ - dir = 4 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"uoB" = ( -/obj/structure/table/reinforced, -/obj/item/multitool, -/obj/item/screwdriver, -/obj/machinery/camera{ - c_tag = "Circuitry Lab North"; - network = list("ss13","rd") - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"uqO" = ( -/obj/effect/turf_decal/tile/blue, -/obj/structure/sign/poster/contraband/fun_police{ - pixel_x = 32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"urH" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"usD" = ( -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/theatre) -"usO" = ( -/obj/machinery/vending/snack/random, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"uuG" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"uuT" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"uvZ" = ( -/obj/structure/mineral_door/wood, -/turf/open/floor/wood, -/area/maintenance/bar) -"uBW" = ( -/turf/closed/wall, -/area/crew_quarters/abandoned_gambling_den) -"uFF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plating, -/area/space/nearstation) -"uGq" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/engine/engine_smes) -"uJq" = ( -/obj/machinery/vr_sleeper{ - dir = 4 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/crew_quarters/fitness) -"uJI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"uNs" = ( -/obj/item/flashlight/lamp/green{ - pixel_x = -3; - pixel_y = 22 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4; - pixel_y = 5 - }, -/obj/structure/dresser{ - desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; - name = "Dresser"; - pixel_y = 7 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"uNu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"uOb" = ( -/obj/machinery/light{ - dir = 1 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"uOn" = ( -/obj/structure/chair/office/light, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 9 - }, -/turf/open/floor/plasteel, -/area/engine/gravity_generator) -"uPT" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"uTQ" = ( -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"uUC" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/space, -/area/solar/port/aft) -"uVo" = ( -/obj/structure/table/wood, -/obj/item/flashlight/lamp/green{ - on = 0; - pixel_x = -7; - pixel_y = 12 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"uVS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"uWs" = ( -/obj/effect/turf_decal/tile/red, -/obj/structure/chair{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/fore) -"uXD" = ( -/obj/structure/grille, -/turf/open/space/basic, -/area/space/nearstation) -"vbc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/engine/gravity_generator) -"vbD" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command/glass{ - name = "EVA Storage"; - req_access_txt = "18" - }, -/obj/effect/mapping_helpers/airlock/cyclelink_helper{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/ai_monitored/storage/eva) -"vbP" = ( -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/light/small, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 - }, -/turf/open/floor/plasteel/white/side{ - dir = 1 - }, -/area/crew_quarters/fitness) -"vfe" = ( -/obj/structure/chair{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"vgX" = ( -/obj/item/radio/intercom{ - dir = 4; - name = "Station Intercom (General)"; - pixel_x = 27 - }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"vhc" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/machinery/washing_machine, -/turf/open/floor/plasteel/freezer, -/area/security/prison) -"viT" = ( -/obj/structure/lattice/catwalk, -/turf/open/space/basic, -/area/space/nearstation) -"vjm" = ( -/obj/structure/table/wood, -/obj/item/reagent_containers/rag, -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"vnw" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/aft) -"voH" = ( -/obj/structure/closet/wardrobe/cargotech, -/obj/item/radio/headset/headset_cargo, -/turf/open/floor/plasteel, -/area/quartermaster/storage) -"vpY" = ( -/obj/structure/closet/lasertag/blue, -/obj/item/clothing/under/pj/blue, -/obj/item/clothing/under/pj/blue, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"vqa" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/sign/departments/custodian{ - pixel_y = -32 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) -"vsM" = ( -/obj/machinery/power/apc/auto_name/south, -/obj/structure/cable, -/turf/open/floor/carpet, -/area/crew_quarters/cryopod) -"vtO" = ( -/obj/structure/sign/poster/official/twelve_gauge, -/turf/closed/wall/r_wall, -/area/ai_monitored/security/armory) -"vxh" = ( -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 8; - name = "8maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"vzp" = ( -/obj/structure/table/reinforced, -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, -/obj/item/stock_parts/cell/high, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"vzO" = ( -/obj/structure/chair/wood/normal{ - dir = 1 - }, -/turf/open/floor/wood, -/area/maintenance/bar) -"vAP" = ( -/obj/structure/table/wood, -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/turf/open/floor/wood, -/area/security/vacantoffice) -"vAZ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hydroponics) -"vBb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"vBN" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"vCb" = ( -/obj/machinery/rnd/production/techfab/department/service, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"vCt" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"vEA" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/table/wood, -/obj/item/reagent_containers/food/condiment/saltshaker{ - pixel_x = -3; - pixel_y = 20 - }, -/obj/item/reagent_containers/food/condiment/peppermill{ - dir = 1; - pixel_x = 3; - pixel_y = 20 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/item/reagent_containers/food/drinks/britcup, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"vGp" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/machinery/power/apc{ - areastring = "/area/quartermaster/storage"; - name = "Cargo Bay APC"; - pixel_x = 1; - pixel_y = -24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plating, -/area/maintenance/port) -"vHj" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Cryogenics " - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/crew_quarters/cryopod) -"vHY" = ( -/turf/open/floor/plating, -/area/science/mixing) -"vKR" = ( -/obj/machinery/computer/arcade/minesweeper{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) -"vMd" = ( -/obj/structure/chair/comfy/black{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/crew_quarters/dorms) -"vOw" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"vPl" = ( -/obj/structure/girder, -/turf/open/floor/plating, -/area/space/nearstation) -"vPE" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) -"vQS" = ( -/obj/structure/sign/poster/contraband/smoke{ - desc = "This poster reminds us all that the Detective is a parasite. Year after year, they must get replacement lungs because of their addiction. "; - pixel_y = -32 - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"vXW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/obj/structure/table, -/obj/item/coin/gold, -/turf/open/floor/plasteel, -/area/crew_quarters/fitness) -"wab" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/crew_quarters/theatre) -"wbB" = ( +"tru" = ( /obj/machinery/airalarm{ dir = 4; pixel_x = -22 @@ -59949,7 +57281,149 @@ /obj/item/megaphone/clown, /turf/open/floor/plasteel, /area/crew_quarters/theatre) -"wcX" = ( +"trY" = ( +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/sign/poster/contraband/lizard{ + pixel_x = -32 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"tsr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"tuj" = ( +/obj/structure/light_construct{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"tur" = ( +/obj/item/restraints/handcuffs/fake, +/turf/open/floor/plating, +/area/maintenance/bar) +"tuN" = ( +/obj/structure/chair/sofa, +/obj/structure/window{ + dir = 1 + }, +/obj/effect/landmark/start/assistant, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tAb" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/airlock/command{ + name = "Captain's Vault Access"; + req_access_txt = "20" + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/heads/captain) +"tAE" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/wood, +/obj/item/reagent_containers/food/condiment/saltshaker{ + pixel_x = -3; + pixel_y = 20 + }, +/obj/item/reagent_containers/food/condiment/peppermill{ + dir = 1; + pixel_x = 3; + pixel_y = 20 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/item/reagent_containers/food/drinks/britcup, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tAV" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"tCi" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) +"tFt" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"tGG" = ( +/obj/structure/table/wood, +/obj/item/book/codex_gigas, +/obj/item/clothing/under/suit_jacket/red, +/obj/structure/destructible/cult/tome, +/turf/open/floor/carpet, +/area/library) +"tHx" = ( +/obj/machinery/computer/arcade/minesweeper{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"tIk" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "maintdiy"; + name = "Security Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"tIC" = ( +/obj/structure/table/wood, +/obj/item/instrument/guitar{ + pixel_x = -7 + }, +/obj/item/instrument/eguitar{ + pixel_x = 5 + }, +/obj/item/instrument/violin, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"tLl" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) +"tMl" = ( +/obj/effect/turf_decal/loading_area, +/turf/open/floor/plasteel/showroomfloor, +/area/crew_quarters/kitchen) +"tMS" = ( /obj/structure/table, /obj/item/paper_bin{ pixel_y = 6 @@ -59957,26 +57431,698 @@ /obj/item/pen/fountain, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) -"wdQ" = ( -/obj/structure/fireplace, +"tNJ" = ( +/obj/effect/spawner/structure/window, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"tOd" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/turf/open/floor/plating, +/area/security/prison) +"tOq" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/mixing) +"tOU" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/light/small, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"tPT" = ( +/obj/machinery/chem_dispenser/drinks/beer, +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"tQk" = ( +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"tRe" = ( +/obj/machinery/chem_master, +/turf/open/floor/plasteel/white, +/area/medical/medbay/central) +"tRF" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"tTW" = ( +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"tUm" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/port) +"tUw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"tWs" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"tWR" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/structure/disposalpipe/segment{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"tXL" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"uaw" = ( +/obj/machinery/power/apc{ + areastring = "/area/storage/art"; + dir = 1; + name = "Maint bar"; + pixel_y = 24 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"udi" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, /obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 + dir = 1; + pixel_y = -22 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ued" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"uhm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/quartermaster/warehouse"; + dir = 4; + name = "Cargo Warehouse APC"; + pixel_x = 26 + }, +/obj/structure/cable{ + icon_state = "0-2" }, /turf/open/floor/plating, /area/maintenance/port) +"ujF" = ( +/obj/machinery/cryopod{ + dir = 4 + }, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"uko" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/security/brig) +"ukP" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"ukS" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/item/soap, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/dorms) +"unl" = ( +/obj/item/flashlight/lamp/green{ + pixel_x = -3; + pixel_y = 22 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4; + pixel_y = 5 + }, +/obj/structure/dresser{ + desc = "There's plenty of clothes here to change into! It has a surprising amount of variety, too."; + name = "Dresser"; + pixel_y = 7 + }, +/turf/open/floor/carpet, +/area/crew_quarters/dorms) +"unu" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"unE" = ( +/obj/structure/fans/tiny/invisible, +/turf/open/space/basic, +/area/space) +"unY" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/sign/departments/custodian{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/central) +"uoB" = ( +/obj/structure/table/reinforced, +/obj/item/multitool, +/obj/item/screwdriver, +/obj/machinery/camera{ + c_tag = "Circuitry Lab North"; + network = list("ss13","rd") + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"upX" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" + }, +/area/crew_quarters/theatre) +"usO" = ( +/obj/machinery/vending/snack/random, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"uuG" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) +"uvZ" = ( +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/maintenance/bar) +"uya" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/structure/sign/departments/restroom{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uzk" = ( +/obj/structure/sign/departments/restroom, +/turf/closed/wall, +/area/crew_quarters/toilet) +"uDW" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"uNu" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/science/circuit) +"uPT" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"uTq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"uVq" = ( +/obj/machinery/light{ + dir = 1; + light_color = "#d1dfff" + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uVt" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/turf/open/floor/plating, +/area/security/prison) +"uVS" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"uYE" = ( +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"uZM" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/sign/poster/official/space_cops{ + pixel_x = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/fore) +"vbD" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command/glass{ + name = "EVA Storage"; + req_access_txt = "18" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/ai_monitored/storage/eva) +"vbY" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 4 + }, +/area/crew_quarters/fitness) +"vdz" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/security/prison) +"vdH" = ( +/obj/structure/bed, +/turf/open/floor/plating, +/area/maintenance/port) +"vgp" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/engine/gravity_generator) +"vjm" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/rag, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"vjq" = ( +/obj/structure/table/reinforced, +/obj/effect/turf_decal/tile/bar, +/obj/effect/turf_decal/tile/bar{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/crew_quarters/bar) +"vpm" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, +/turf/open/floor/plating, +/area/crew_quarters/fitness) +"vpz" = ( +/obj/structure/sign/poster/official/twelve_gauge, +/turf/closed/wall/r_wall, +/area/ai_monitored/security/armory) +"vpY" = ( +/obj/structure/closet/lasertag/blue, +/obj/item/clothing/under/pj/blue, +/obj/item/clothing/under/pj/blue, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"vrM" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-18" + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) +"vsM" = ( +/obj/machinery/power/apc/auto_name/south, +/obj/structure/cable, +/turf/open/floor/carpet, +/area/crew_quarters/cryopod) +"vxh" = ( +/obj/structure/table, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vys" = ( +/obj/machinery/vr_sleeper{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/crew_quarters/fitness) +"vzp" = ( +/obj/structure/table/reinforced, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 + }, +/obj/item/stock_parts/cell/high, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"vzO" = ( +/obj/structure/chair/wood/normal{ + dir = 1 + }, +/turf/open/floor/wood, +/area/maintenance/bar) +"vzS" = ( +/obj/structure/table, +/obj/item/book/manual/hydroponics_pod_people{ + pixel_x = -4; + pixel_y = 5 + }, +/obj/item/paper/guides/jobs/hydroponics{ + pixel_x = -5; + pixel_y = 3 + }, +/turf/open/floor/plasteel, +/area/hydroponics) +"vCb" = ( +/obj/machinery/rnd/production/techfab/department/service, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"vCt" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"vDq" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/space/nearstation) +"vFt" = ( +/obj/machinery/portable_atmospherics/pump, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vGX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/structure/closet/secure_closet/personal/cabinet{ + desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; + name = "Personal ID-Locked Closet"; + pixel_y = 15 + }, +/turf/open/floor/wood, +/area/crew_quarters/dorms) +"vHj" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Cryogenics " + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/crew_quarters/cryopod) +"vHv" = ( +/obj/structure/closet{ + name = "Costume Closet" + }, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russobluecamohat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/head/russofurhat, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/under/mw2_russian_para, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/obj/item/clothing/shoes/jackboots, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"vHM" = ( +/obj/machinery/vr_sleeper{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/crew_quarters/fitness) +"vHY" = ( +/turf/open/floor/plating, +/area/science/mixing) +"vLD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 1; + network = list("vault") + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/nuke_storage) +"vNh" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/carpet, +/area/crew_quarters/theatre) +"vOq" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/coin/gold, +/obj/item/coin/gold, +/obj/item/coin/gold, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"vPE" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) +"vRr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/window/westleft{ + base_state = "right"; + dir = 4; + icon_state = "right"; + name = "Shooting Range" + }, +/turf/open/floor/plating, +/area/security/prison) +"vRX" = ( +/obj/machinery/power/apc{ + areastring = "/area/security/detectives_office"; + dir = 4; + name = "Detective's Office APC"; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plasteel/grimy, +/area/security/detectives_office) +"vUR" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating, +/area/security/prison) +"vVP" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/machinery/power/apc{ + areastring = "/area/engine/gravity_generator"; + dir = 8; + name = "Gravity Generator APC"; + pixel_x = -25; + pixel_y = 1 + }, +/obj/structure/table, +/obj/item/paper/guides/jobs/engi/gravity_gen, +/obj/item/pen/blue, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"vWw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/security/prison) +"vYa" = ( +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"wcy" = ( +/obj/structure/reagent_dispensers/water_cooler, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) "wfR" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, /turf/open/floor/plating, /area/maintenance/bar) -"wgV" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/public/glass{ - name = "Holodeck Door" - }, -/turf/open/floor/plasteel/dark, -/area/crew_quarters/fitness) +"wgb" = ( +/obj/structure/falsewall, +/turf/open/floor/plating, +/area/security/prison) "wkN" = ( /turf/closed/wall, /area/science/circuit) @@ -59986,6 +58132,15 @@ }, /turf/open/floor/carpet, /area/crew_quarters/cryopod) +"woX" = ( +/obj/machinery/door/window/southright{ + name = "Target Storage" + }, +/obj/item/target/alien, +/obj/item/target/alien, +/obj/item/target/syndicate, +/turf/open/floor/plating, +/area/security/prison) "wph" = ( /obj/docking_port/stationary{ area_type = /area/construction/mining/aux_base; @@ -60000,6 +58155,17 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) +"wpo" = ( +/obj/machinery/camera{ + c_tag = "Bar West"; + dir = 4 + }, +/obj/machinery/computer/arcade/orion_trail, +/obj/structure/sign/poster/official/foam_force_ad{ + pixel_x = -32 + }, +/turf/open/floor/wood, +/area/crew_quarters/bar) "wrp" = ( /obj/machinery/light{ dir = 8 @@ -60009,90 +58175,19 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wuB" = ( +/obj/structure/chair/comfy/brown{ + dir = 1 + }, +/turf/open/floor/wood, +/area/library) "wvX" = ( /obj/structure/table/reinforced, /obj/machinery/light, /obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) -"wBd" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 - }, -/turf/closed/wall, -/area/hallway/secondary/service) -"wCs" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" - }, -/obj/machinery/door/firedoor, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/maintenance/fore) -"wDQ" = ( -/obj/item/twohanded/required/kirbyplants{ - icon_state = "applebush" - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"wHz" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/maintenance/disposal/incinerator) -"wJq" = ( -/obj/effect/landmark/carpspawn, -/turf/open/space/basic, -/area/space) -"wLe" = ( -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) -"wNd" = ( -/obj/machinery/portable_atmospherics/scrubber, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"wSg" = ( -/obj/machinery/airalarm{ - pixel_y = 23 - }, -/obj/structure/chair/sofa/left, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"wTu" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"wTC" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/chair/comfy/brown{ - dir = 1 - }, -/turf/open/floor/wood, -/area/library) -"wUY" = ( -/obj/structure/table, -/obj/item/stack/packageWrap, -/obj/item/stack/packageWrap, -/obj/item/hand_labeler, -/turf/open/floor/plasteel, -/area/hallway/secondary/service) -"wVp" = ( -/obj/machinery/camera{ - c_tag = "Locker Room South"; - dir = 8 - }, -/obj/structure/closet/secure_closet/personal, -/turf/open/floor/plasteel, -/area/crew_quarters/locker) -"wWo" = ( +"wwn" = ( /obj/structure/cable{ icon_state = "4-8" }, @@ -60105,70 +58200,216 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/crew_quarters/dorms) -"wWF" = ( +"wwB" = ( +/turf/closed/wall/r_wall, +/area/hallway/primary/central) +"wwC" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 25 + }, +/turf/open/floor/mineral/titanium/blue, +/area/crew_quarters/toilet) +"wyM" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/door/airlock/engineering/glass{ - name = "Gravity Generator"; - req_access_txt = "11" +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"wAB" = ( +/obj/structure/chair/office/light, +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/turf/open/floor/plasteel/dark, -/area/engine/gravity_generator) -"wZk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/stripes/line{ dir = 9 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel, /area/engine/gravity_generator) -"wZI" = ( -/obj/effect/spawner/lootdrop/keg, +"wBd" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/closed/wall, +/area/hallway/secondary/service) +"wCa" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/shutters/preopen{ + id = "holoprivacy"; + name = "Holodeck Shutters" + }, /turf/open/floor/plating, -/area/maintenance/starboard/fore) -"xah" = ( -/obj/structure/chair/comfy/brown{ - dir = 1 +/area/crew_quarters/fitness) +"wDR" = ( +/obj/structure/sign/poster/official/help_others{ + pixel_y = -32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) +"wEp" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/door/poddoor/preopen{ + id = "bridge blast"; + name = "bridge blast door" + }, +/turf/open/floor/plating, +/area/hallway/primary/central) +"wFk" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/security/prison) +"wFX" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/public/glass{ + name = "Holodeck Door" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/dark, +/area/crew_quarters/fitness) +"wGP" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/crew_quarters/dorms) +"wHz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) +"wJz" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"wLT" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, +/turf/closed/wall, +/area/maintenance/port) +"wNM" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"wOT" = ( +/obj/effect/turf_decal/stripes/corner, +/turf/open/floor/plasteel, +/area/hydroponics) +"wUY" = ( +/obj/structure/table, +/obj/item/stack/packageWrap, +/obj/item/stack/packageWrap, +/obj/item/hand_labeler, +/turf/open/floor/plasteel, +/area/hallway/secondary/service) +"wVs" = ( +/obj/structure/table/wood, +/obj/item/instrument/trumpet, +/turf/open/floor/wood, +/area/crew_quarters/theatre) +"wXP" = ( +/obj/machinery/button/door{ + id = "maintdiy"; + name = "Shutters Control Button"; + pixel_x = -6; + pixel_y = 24 + }, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"wZB" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"xbu" = ( +/obj/structure/chair/comfy/black{ + dir = 8 }, /turf/open/floor/wood, -/area/library) -"xbZ" = ( +/area/crew_quarters/bar) +"xcg" = ( /obj/effect/turf_decal/stripes/line{ - dir = 1 + dir = 9 }, /turf/open/floor/plating, -/area/security/prison) -"xcw" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/area/space/nearstation) +"xdb" = ( +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 8; + name = "8maintenance loot spawner" + }, +/obj/item/radio/intercom{ + pixel_y = 25 }, /turf/open/floor/plating, -/area/maintenance/starboard/aft) +/area/crew_quarters/abandoned_gambling_den) +"xdV" = ( +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" + }, +/turf/open/floor/wood, +/area/crew_quarters/theatre) "xgF" = ( /obj/structure/chair/stool/bar, /turf/open/floor/wood{ icon_state = "wood-broken5" }, /area/maintenance/bar) -"xgY" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +"xhx" = ( +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) -"xgZ" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 +/obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-4" }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/turf/open/floor/plasteel, -/area/security/brig) +/turf/open/floor/wood, +/area/bridge/meeting_room) "xhV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60189,68 +58430,63 @@ }, /turf/open/floor/plating, /area/hallway/secondary/service) -"xlX" = ( -/obj/machinery/door/firedoor, -/turf/open/space/basic, -/area/space) -"xqV" = ( -/obj/structure/table/wood, -/obj/item/instrument/piano_synth, +"xkk" = ( +/obj/structure/piano, +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/wood, /area/crew_quarters/theatre) -"xwI" = ( -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/obj/machinery/vending/wardrobe/curator_wardrobe, -/turf/open/floor/carpet, -/area/library) -"xyp" = ( -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +"xlN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/nuke_storage) -"xzw" = ( /obj/structure/cable{ icon_state = "4-8" }, -/obj/structure/extinguisher_cabinet{ - pixel_x = 5; - pixel_y = -32 +/turf/open/floor/plating, +/area/maintenance/port/aft) +"xpx" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) -"xzU" = ( -/obj/structure/reagent_dispensers/keg/semen, +/area/crew_quarters/fitness) +"xqW" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/door/poddoor/preopen{ + id = "Secure Gate"; + name = "brig shutters" + }, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "1-8" + }, /turf/open/floor/plating, -/area/maintenance/bar) -"xCs" = ( -/obj/structure/chair/sofa, -/obj/structure/window{ +/area/security/brig) +"xzh" = ( +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/landmark/start/assistant, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"xCE" = ( -/obj/structure/table/wood/fancy/black, -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/turf/open/floor/carpet, -/area/crew_quarters/dorms) +/turf/open/floor/plating, +/area/space/nearstation) +"xzy" = ( +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hydroponics) "xEu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 @@ -60262,81 +58498,46 @@ /obj/effect/spawner/lootdrop/grille_or_trash, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"xIU" = ( -/obj/item/chair/wood, -/turf/open/floor/plating, -/area/maintenance/port) -"xNd" = ( -/obj/machinery/door/airlock{ - desc = "Private study room where nerds are probably playing Dungeons and Dragons 13e, or a place for blood cult rituals."; - id_tag = "PrivateStudy"; - name = "Private Study" - }, -/obj/machinery/door/firedoor, -/turf/open/floor/wood, -/area/library) -"xPX" = ( -/obj/structure/disposalpipe/segment{ - dir = 10 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) -"xWW" = ( -/obj/structure/lattice/catwalk, -/obj/structure/cable{ - icon_state = "0-2" - }, -/turf/open/space, -/area/solar/starboard/fore) -"xXW" = ( -/obj/structure/mirror{ - pixel_y = 32 - }, -/obj/structure/sink{ - dir = 1; - pixel_y = 25 - }, -/obj/structure/toilet{ - dir = 4 - }, -/turf/open/floor/mineral/titanium/blue, -/area/crew_quarters/dorms) -"xZr" = ( -/obj/structure/sign/poster/official/fruit_bowl{ - pixel_y = 32 - }, -/turf/open/floor/plasteel/white/corner{ - dir = 1 - }, -/area/hallway/primary/starboard) -"xZN" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/nuke_storage"; - dir = 1; - name = "Vault APC"; - pixel_y = 25 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/turf/open/floor/circuit, -/area/ai_monitored/nuke_storage) -"yar" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" +"xIn" = ( +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 8 }, /turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/crew_quarters/locker) +"xLZ" = ( +/obj/structure/closet/radiation, +/turf/open/floor/plasteel, +/area/engine/gravity_generator) +"xMl" = ( +/obj/structure/chair/sofa{ + dir = 1 + }, +/obj/structure/window, +/turf/open/floor/wood, +/area/crew_quarters/bar) +"xNY" = ( +/obj/structure/shuttle/engine/propulsion{ + dir = 1 + }, +/turf/open/space/basic, +/area/space/nearstation) +"xWM" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating, +/area/space/nearstation) +"xXY" = ( +/obj/structure/closet/lasertag/red, +/obj/item/clothing/under/pj/red, +/obj/item/clothing/under/pj/red, +/turf/open/floor/plasteel, +/area/crew_quarters/fitness) +"xYO" = ( +/obj/structure/sign/poster/contraband/red_rum{ + pixel_y = 32 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/starboard) "ycu" = ( /obj/structure/cable{ icon_state = "2-4" @@ -60348,47 +58549,18 @@ /obj/machinery/suit_storage_unit/rd, /turf/open/floor/plasteel, /area/science/mixing) -"ydZ" = ( -/obj/structure/table/reinforced, -/obj/effect/turf_decal/tile/bar, -/obj/effect/turf_decal/tile/bar{ +"yiN" = ( +/obj/effect/turf_decal/tile/green{ dir = 1 }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/effect/turf_decal/tile/green{ + dir = 4 }, -/obj/item/reagent_containers/food/drinks/soda_cans/starkist{ - pixel_x = -3; - pixel_y = 5 +/obj/effect/turf_decal/tile/green{ + dir = 8 }, /turf/open/floor/plasteel, -/area/crew_quarters/bar) -"yeR" = ( -/obj/structure/sign/poster/contraband/space_up{ - pixel_x = -32; - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) -"yfs" = ( -/obj/machinery/power/apc{ - areastring = "/area/security/detectives_office"; - dir = 4; - name = "Detective's Office APC"; - pixel_x = 24 - }, -/obj/structure/cable{ - icon_state = "0-8" - }, -/turf/open/floor/plasteel/grimy, -/area/security/detectives_office) -"yhO" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/snacks/bluecherrycupcake{ - pixel_y = 5 - }, -/turf/open/floor/wood, -/area/crew_quarters/bar) +/area/hallway/primary/starboard) (1,1,1) = {" aaa @@ -66410,11 +64582,11 @@ aaa aaa aaa aaa -pnS +fsk aaa aaa aaa -pnS +fsk aaa aaa aaa @@ -66427,7 +64599,7 @@ aaa aaa aaa aaa -wJq +hoo aaa aaa aaa @@ -66661,9 +64833,9 @@ aaa aaa aaa aaa -pnS +fsk aaa -pnS +fsk aaa aaa aaa @@ -66675,9 +64847,9 @@ gXs aaa aaa aaa -pnS +fsk aaa -pnS +fsk aaa aaa aaa @@ -66924,11 +65096,11 @@ gXs aaa aaa gXs -viT +jmC gXs gXs gXs -viT +jmC gXs aaa aaa @@ -67174,11 +65346,11 @@ aaa aaa aaa aaa -viT -viT +jmC +jmC gXs aag -viT +jmC gXs gXs aaa @@ -67188,11 +65360,11 @@ aaa aaa gXs gXs -viT -viT -pNO +jmC +jmC +klu aag -viT +jmC aaa aaa aaa @@ -67431,11 +65603,11 @@ aaa aaa aaa aaa -kyA -maK +xcg +lLt aaa -maK -hIi +lLt +jNo gXs aoV aaa @@ -67445,11 +65617,11 @@ aaa aaa aaa gXs -kyA -maK +xcg +lLt aaa -maK -hIi +lLt +jNo aaa aaa aaa @@ -67688,11 +65860,11 @@ aaa aaa aaa aaa -uFF +xzh aaa cpe aaa -eYr +vDq aaa aaa aaa @@ -67702,11 +65874,11 @@ aaa aaa aaa aaa -uFF +xzh aaa cwV aaa -eYr +vDq aaa aaa aaa @@ -67944,7 +66116,7 @@ aaa aaa aaa aae -kMg +lCL gXs aaa aaa @@ -68201,7 +66373,7 @@ aaa aaa aaa aaa -kMg +lCL gXs aaa aaa @@ -68458,7 +66630,7 @@ aaa aaa aaa aaa -kMg +lCL gXs aaa aaa @@ -68715,7 +66887,7 @@ aaa aaa aaa aaa -kMg +lCL gXs aaa cqq @@ -68972,7 +67144,7 @@ aaf aaf aaf aaa -kMg +lCL arB asE cyb @@ -69745,7 +67917,7 @@ apN apN apN apJ -hUC +iyC ayk awW aAD @@ -69769,7 +67941,7 @@ aaa aaa aaa arB -dqG +est ayk awW aAD @@ -71045,7 +69217,7 @@ aaa awW aOh ayl -cPO +tTW aRY awW aaa @@ -72341,7 +70513,7 @@ awW arB awZ aym -lre +vrM awW aaf aaa @@ -73622,7 +71794,7 @@ aUO aUy aWm aWf -vAP +ohX czK bhN bcl @@ -74640,7 +72812,7 @@ aHy ayl aKk aLA -iRI +dTe aNf aLA aQD @@ -76666,7 +74838,7 @@ ady ady ady ady -rMI +rKc ajq ajW akB @@ -76710,7 +74882,7 @@ aXQ aXQ aPz aPz -dSI +rFc aPz bhQ bjj @@ -76964,11 +75136,11 @@ aPA aXQ aZt aXQ -ljN +gdu aPz -eTc -xIU -hKX +kJY +ihC +oMY bhQ bjj bkF @@ -77224,10 +75396,10 @@ aXQ bbL aPz bdJ -fFp +gFD bgr -niE -mDU +nQr +tUm bkF aaa aaa @@ -77482,7 +75654,7 @@ aZw aPz bct bfa -ftK +vdH bhQ bjk bkE @@ -77737,10 +75909,10 @@ baO aZo baw aPz -wdQ +cwP cBn bgs -pKz +wLT bjk bkF aaa @@ -78041,7 +76213,7 @@ ccb ccb ccb aaa -fcu +snG aaa ccb ccb @@ -78236,7 +76408,7 @@ bxk aDo aDo aIX -osd +nIE aLE aLE aOp @@ -78250,7 +76422,7 @@ aQN aQN aQN aQN -jKM +kWI bbO aPA bgt @@ -78298,7 +76470,7 @@ aaa aaf aaa aaa -uUC +kKw aaa aaa aaf @@ -78313,7 +76485,7 @@ aaa aaa aaa aaa -wJq +hoo aaa aaa aaa @@ -78502,7 +76674,7 @@ aQN aQN aTz aUp -rAJ +job aXr aZx aQN @@ -78555,7 +76727,7 @@ aaf aaf aaf aaf -uUC +kKw aaf aaf aaf @@ -78764,7 +76936,7 @@ aXv aYS aQN aQN -jKM +kWI bbO aPA aSg @@ -79007,18 +77179,18 @@ aDo aDo aDo aIY -osd +nIE aLE aLE aOl aPA -siG +lhg aQN aTC aUs -qIZ +phY aXt -taU +ksn aQN aQN aPA @@ -79273,9 +77445,9 @@ aQV aQN aTC aUu -rTD +eRk aXt -taU +ksn aQN aQN aZB @@ -79528,11 +77700,11 @@ aOl aPA aQU aQN -unN -qXl -pdg +hzw +qlr +pPE aXw -oVS +jiR aQN aQN aZA @@ -80025,7 +78197,7 @@ alU ali ali atO -axm +axo ayz ayz ayz @@ -80036,14 +78208,14 @@ aBR aBR aBR aBR -aLJ +aLm aLE aOl aPA -jDh +xIn aQN aTD -gDv +mIS aUZ aYU aYU @@ -80284,14 +78456,14 @@ aaf avY axo arP -iCE -joc +fLd +cRD aGD -wbB +tru aCr -eDv -rkR -eDv +qBc +iFL +qBc aKu aLM aLF @@ -80301,14 +78473,14 @@ aPG aPG aPG aPG -puG +jsy aQW aQW aQW aQW -wVp +cVu aPA -jOF +oBp aYb aZE bjp @@ -80541,15 +78713,15 @@ aaa avY axo arP -usD -fZD +qwe +ioB aGr aHI -kmw -qIT -trl -eDv -aKt +xdV +ePO +phu +qBc +aKu aLL bDe aOl @@ -80799,14 +78971,14 @@ avY axo arP aCh -oSk -dCk +qQJ +iYz aHK aCr -lUd -wab -eDv -aKt +tUw +mqa +qBc +aKu aLN aLE aOl @@ -80819,13 +78991,13 @@ aWu aYc aZD aZD -hVk +uhm aZD aZD bff -vGp +iRJ aZE -voH +fyM bjr ama bmh @@ -80884,18 +79056,18 @@ bLv bLv bLv aaa -uXD -uXD -uXD -uXD -uXD -uXD -uXD -uXD -uXD +prP +prP +prP +prP +prP +prP +prP +prP +prP aaa aaa -wJq +hoo aaa aaa aaa @@ -81056,14 +79228,14 @@ avZ axp ayC azH -eJz +wyM aGv aCr aCr -lUd -wab -eDv -aKv +tUw +mqa +qBc +aKu aLN aLE aOl @@ -81073,7 +79245,7 @@ aRa aTF aPG aSX -ffm +eRn aZF aZF aZF @@ -81141,7 +79313,7 @@ cqK crl bLv aaa -uXD +prP ctv ctv ctv @@ -81149,7 +79321,7 @@ ctv ctv ctv ctv -uXD +prP aaa aaa aaa @@ -81310,16 +79482,16 @@ aGh aqR aqR awb -djB -wCs -eWl -eyC +eLH +ayA +fHK +hRX aBV -hot -nzc -jRs -aBU -aMr +pNH +sfa +ioX +aHG +aJe aKw aLP aMR @@ -81398,15 +79570,15 @@ cAQ crm bLv aaa -uXD -uXD -uXD -uXD -uXD -uXD -uXD -uXD -uXD +prP +prP +prP +prP +prP +prP +prP +prP +prP aaa aaa aaa @@ -81570,14 +79742,14 @@ awa axq ayD azI -dyS +gwi aBU -nGN -gvC -lUd -tPS -eDv -aKb +xkk +upX +qJZ +doP +qBc +aKu aLN aMQ aNT @@ -81623,7 +79795,7 @@ aoV bCq bHE bHE -iQA +puG cdb bCq bVE @@ -81665,9 +79837,9 @@ gXs aaa aaa aaa -uXD -uXD -uXD +prP +prP +prP aaa aaa aaa @@ -81824,17 +79996,17 @@ aaa aaa aag avY -hKI -ayA -fLb +jLM +ayD +oeJ aMr -sxe +qOf aDv -gvC -lUd -tPS -eDv -aKt +lwp +tUw +jly +qBc +aKu aLN aMS aOt @@ -81922,9 +80094,9 @@ gXs aaa aaa aaa -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -82081,21 +80253,21 @@ aaa aaa aag avY -hKI -ayA -dLh +jLM +ayD +wVs aMr aMr aOH -gvC -tku -joq -eDv -aKt +lwp +vNh +qHB +qBc +aKu aLN aMS aOi -wDQ +sqa aPK aSl aTH @@ -82150,7 +80322,7 @@ mrR dKP odx rBq -xzU +ouD bCq bUs bLv @@ -82169,19 +80341,19 @@ aaf aaa aaf gXs -muq +sYv crn bij bij bij bij bij -vbc +hWn btG aaa -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -82339,16 +80511,16 @@ aaa aag avY axs -ayF -xqV -vOw -eIe +ayD +sjm +eNK +iEx aOH -eDv -eDv -fXH -eDv -aKx +qBc +qBc +tAV +qBc +aKu aLN aMS aOi @@ -82377,7 +80549,7 @@ bbR btu bbR bOL -lNz +fnJ byF bwW bGm @@ -82419,26 +80591,26 @@ cjJ cjJ cjJ cjJ -oJs -uGq -uGq +gVX +reZ +reZ bij crn bij bij -ilO -udS +sZR +ued bnT bph bsc +fhP bsc -bsc -mdQ +eXm btG gXs -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -82679,12 +80851,12 @@ cov cpj cpS cjJ -jUc -mdQ +xLZ +ivF btG -uOn -eeD -srw +wAB +vVP +mwO bnV bph bih @@ -82693,9 +80865,9 @@ bii bsc btG aaa -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -82871,8 +81043,8 @@ aPK aSn aTK aPK -yfs -lev +vRX +hwu asW baW bLE @@ -82935,14 +81107,14 @@ cnN cox cpl cpU -epP -oLI -oLI -gro -oLI -oLI -qZv -wWF +ipc +edH +edH +nWq +edH +wZB +fby +qwB bph big bgN @@ -82950,9 +81122,9 @@ bkZ bsc btG aaa -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -83089,7 +81261,7 @@ aaa acd acd acd -eMV +jHM acd acd aaa @@ -83133,7 +81305,7 @@ aYi aqW aqW bbQ -sno +qpA apd aZH aZK @@ -83193,12 +81365,12 @@ cow cpk cpT cjJ -jUc -qwZ +xLZ +oNQ btG -qPJ -nlN -lQR +sZa +jhF +qmM bnV bph bii @@ -83207,9 +81379,9 @@ bih bsc btG aaa -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -83344,10 +81516,10 @@ abc abc afu abc -iSB -kBF -knR -eWv +suI +qMu +kJr +dxB acd aaa aaa @@ -83448,25 +81620,25 @@ clG cnP coz cpn -lzY -lzY +dbn +dbn bgO -sWr +hjw bgO -trk -bsb -iaq +nTE +pTn +jnm bnW bph bsc -ncB +mQR bsc -qwZ +wNM btG gXs -uXD +prP ctv -uXD +prP aaa aaa aaa @@ -83601,11 +81773,11 @@ aea aeH aft abc -fyr -xbZ -svt -dQy -eMV +woX +kdm +rvZ +vUR +jHM aaa aaa aiU @@ -83711,19 +81883,19 @@ aaf aaa aaa gXs -szF +gtL bgO bgO bgO bgO bgO bgO -wZk +vgp btG aaa -eMb +gSH ctv -uXD +prP aaa aaa aaa @@ -83847,7 +82019,7 @@ aaa aaa gXs gXs -sbs +dbM abc abu abu @@ -83859,10 +82031,10 @@ aeJ afw abc abc -xbZ +kdm aay -dQy -uiR +vUR +qlF aaf aaf aiU @@ -83930,7 +82102,7 @@ bCq bHD bJe bCq -vnw +czi bHE bHE bHE @@ -83978,7 +82150,7 @@ aaa aaa aaa aaa -uXD +prP ctv aaT aaa @@ -84116,9 +82288,9 @@ aeI afv agf abc -xbZ +kdm aay -dQy +vUR aiT aiT aiV @@ -84151,7 +82323,7 @@ aKA aLN aMS aOz -mMb +iMG aPQ aSa aSr @@ -84161,7 +82333,7 @@ aYZ bLE aqW aqW -vQS +hfe apd beA bqp @@ -84169,7 +82341,7 @@ cNG cNJ bLF aZK -qdm +haz bbR bqt cBq @@ -84235,8 +82407,8 @@ aaa aaa aaa aaa -uXD -uXD +prP +prP aaT aaa aaa @@ -84360,8 +82532,8 @@ aaa aaa aaa aai -oNN -lJX +jSa +uVt abe abw acc @@ -84373,9 +82545,9 @@ aeL afy agh abc -qYi -dEZ -dIH +tOd +vRr +tLl aiT ajs akb @@ -84617,7 +82789,7 @@ aaa aaa gXs aai -rgv +gIO aay abd abv @@ -84630,9 +82802,9 @@ aeK afx agg abc -qRq -npV -lyB +orw +jMK +riA aiU ajr aka @@ -84873,11 +83045,11 @@ aaa aaa aaf aaf -ctv +aai acd -tYn +wgb abg -qKZ +jtU aby aby aby @@ -84887,10 +83059,10 @@ aeN afA afA abc -nTu -fLX -rfE -hYH +vWw +wFk +oXL +cXx aju akd akK @@ -84957,14 +83129,14 @@ bCn bGq bGq bGq -tyg +tdF bLw bGq bGq bGq bLw bGq -tyg +tdF bTD bUx bVI @@ -84979,7 +83151,7 @@ bVI bVI bVI bTA -sOO +xlN bHE bHE bHE @@ -84994,25 +83166,25 @@ cpV cqw cqO crp -aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaf -aaa -aaa -aaa -aaT -aaT -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa aaa +hvS aaa aaa aaa @@ -85133,7 +83305,7 @@ aai aai abf aat -vKR +tHx abx acd acC @@ -85142,12 +83314,12 @@ adF aef aeM afz -ogU +jSD aav -ueP -dfH -oAV -jSk +sjT +pLt +pQr +new ajt akc akJ @@ -85251,20 +83423,20 @@ cgR cgR cqN cro -cEl -cEE -cEl -cFm -csx -cFm -cFm -csx -csv -aaa -aaa -aaT -ctv -aaT +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -85460,7 +83632,7 @@ bqw aJq aJq aYl -ovG +ppY aLX aJq aJq @@ -85508,20 +83680,20 @@ ciN cji cDZ crr -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -85644,7 +83816,7 @@ aai aan aaw aaB -ncI +kfE aaJ aat abh @@ -85765,20 +83937,20 @@ cgR cDB cqP crq -crZ -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -85899,9 +84071,9 @@ aag aaa aak aap -rfu +fuo aaD -aat +aau aat aat aat @@ -85974,7 +84146,7 @@ bqy cBr bqy buK -mnP +pNI aJw aJq aJq @@ -86006,7 +84178,7 @@ bWB bWB cec bVI -mFJ +iOt ccw chY ciX @@ -86022,20 +84194,20 @@ cgR cqx cgR crp -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -86158,9 +84330,9 @@ aaj aao aax aaC +aaA aat aat -adO aat aei acd @@ -86279,20 +84451,20 @@ cpX cqz cqR ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -86413,12 +84585,12 @@ aag aaa aal aar -gks +phH aaF aat -aaO +aat aaW -qvo +aat abB acf abM @@ -86492,7 +84664,7 @@ bwi bmr aMm aJq -xzw +otF bCs bCs bEY @@ -86533,28 +84705,28 @@ coa coJ clJ clJ -cig -cig -ccw -crJ -crT -crJ -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -ctv -aaT -aaa -aaa -aaa -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -86670,12 +84842,12 @@ aag aaf aaj aaq -iGV +eOy aaE aat aaN aaV -itP +rtT aat acd abL @@ -86754,7 +84926,7 @@ bCs bDv bEX bFb -ope +hKF bFa bKt bLx @@ -86788,30 +84960,30 @@ ccw ccw cnZ coH -cpt -cpZ -cig -cqS -ccw -crH -crT -crZ -cFo -css -cFm -cFm -css -csv -aaa -aaa -aaT -ctv -aaT -aaa -aaa -aaf -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -86926,13 +85098,13 @@ aaa aag aaa aal -aau aat aat aat aat -rKZ -aat +jeR +neC +jgv abD acd acd @@ -86950,9 +85122,9 @@ agj auj akl akO -pet -pet -hMk +uko +uko +xqW anw anz aox @@ -87045,30 +85217,30 @@ cmG cnt cob coL -cDo -cgR -cqA -cqT -csg -crJ -crU -csb -cFn -css -csx -csx -css -csb -aaf -aaf -aaT -aaT -aaT -gXs -aaf -aaf -aaf -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -87188,7 +85360,7 @@ aat aat aat aat -aat +hRz aat abC acd @@ -87210,7 +85382,7 @@ akN alw amg amR -anw +anz anR aow apg @@ -87232,7 +85404,7 @@ aGq aHO aJl ayW -gYR +neb aJq aOE aJn @@ -87245,7 +85417,7 @@ aYq aZO aZC baK -bbC +qBe bbC bdI bgK @@ -87301,31 +85473,31 @@ cTc cTe cfG cgw -coK -cpu -cMm -ccw -ccw -ccw -crK -cEK -csa -csj -csa -csa -cGr -aaa -aaa -aaa -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -87502,10 +85674,10 @@ aYs aZQ bbi bde +nLf bcd bcd -bcd -gFY +xhx bcd bcd bcd @@ -87558,31 +85730,31 @@ clJ cmF cgR cgI -chF -ciO -cqc -cqc -cqc -cEd -cEr -cEL -cFb -cFu -cFI -cGd -cGs -cGr -ccw -ccw -ccw -ccw -ccw -ccw -aaa -eRz -aaT -eRz -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -87697,14 +85869,14 @@ aaa aag aaf aai -qxb -qxb +cMk +cMk aaG -qxb +cMk aaP aaX -vhc -fSL +unu +lwY acd acD acY @@ -87760,7 +85932,7 @@ aZP bbh bcc bdd -nyF +gjf bfr bgM bif @@ -87814,32 +85986,32 @@ cTa ceZ clQ cgR -dGY -coM -cpv -cqb -cqb -cqb -cqb -cEs -cqb -cqb -cAp -cqb -cAo -cGt -cgx -jMY -csd -cHa -csd -uhH -ccw -aaa -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -87978,10 +86150,10 @@ aiz ajg akl akR -pet -pet -hMk -anw +uko +uko +xqW +anz anz aov aph @@ -88016,22 +86188,22 @@ aYu aYt bbk bbk -bbk +bfu bbk bfs -ove +pUl aZM aZM aaf aaf -kMg +lCL aaf -kMg +lCL aaf -kMg +lCL aaf -kMg -rLg +lCL +wwB aXf aJq bBi @@ -88071,32 +86243,32 @@ cTb cTd ckF ckF -cgK -cDg -cDp -cqe -cqB -cqB -cEe -csP -cAl -cFc -cAq -cFJ -cSH -cGu -cGH -fsQ -fsQ -cGR -csd -csd -ccw -aaa -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -88218,7 +86390,7 @@ aaa aaf aai abi -szH +vdz ach acK adf @@ -88276,19 +86448,19 @@ bce bdf beb aYv -tVp -lNn +kTz +kDD aaf aaf -kMg -kMg +lCL +lCL aaf -rLg -rLg -rLg -rLg -rLg -rLg +wwB +wwB +wwB +wwB +wwB +wwB aXf aJq byU @@ -88328,32 +86500,32 @@ cnA cev cfg cgU -cgJ -chG -cpx -cqd -cDC -cqU -cEf -cEt -cEM -csA -cEg -cFK -cGe -cGv -cGI -cGS -cHb -cHg -cHn -oDF -ccw -aaf -aaT -ctv -aaT -aaf +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -88533,19 +86705,19 @@ aZR bbm bec bfu -nnb +sdL aBa aBa aBa aBa aBa aBa -rLg -gGD -tVQ -wcX -dBt -kFf +wwB +bsb +lTq +tMS +eND +wEp aXf aJq bBi @@ -88585,32 +86757,32 @@ cig cig cTf cgR -ccw -cDh -cpy -cDv -cDD -cqU -cMD -cEu -cEz -cEz -cMD -cFL -cGf -kQq -cMm -ciZ -cHc -cAu -cAu -ciZ -ccw -aaa -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -88739,7 +86911,7 @@ cpg acv adi adi -fwD +pQD aeW agQ ahv @@ -88752,11 +86924,11 @@ akP aly amj amR -anw +anz anz aov aph -gzJ +oOb ard ard ard @@ -88790,7 +86962,7 @@ aZR aZR aZR bft -oaP +srq aBa aBT aDs @@ -88799,13 +86971,13 @@ aGb aBa bqD bsa -vfe +oeQ bsa bsa -kFf +wEp byS aJq -yar +idX bCs bCs bCs @@ -88842,32 +87014,32 @@ ckI clJ cmL cBO -ccw -chV -cpx -cqf -cqD -cMD -crs -cEv -cEv -cFe -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw -aaf -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -88996,7 +87168,7 @@ acl cxA acL adi -vtO +vpz agp agT ahx @@ -89006,12 +87178,12 @@ ajc ajI akl akT -aww -pet -hMk +fGl +uko +xqW anw anz -oZl +lYU apk anw anw @@ -89022,7 +87194,7 @@ avj awl axC ayY -rJv +uZM azZ azZ azZ @@ -89047,16 +87219,16 @@ bbm bdh bee bfv -nDn +vLD aBb -pnx +cSn aDr aEM aGa aHF bqF bsa -iFt +nmx buQ buQ bxI @@ -89099,34 +87271,34 @@ ckK clJ cmL cgR -cgL -chX -cpx -cqh -cqF -cra -crI -cEw -cEw -cEw -cFw -cFN -csH -csR -cMm -cGU -csd -csd -cHo -csd -ccw +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa -aaT -ctv -aaT -aaa -aaa -aae +hoo aaa aaa aaa @@ -89304,13 +87476,13 @@ bcf bdg bed bfv -sVN -dqD -wTu +kvZ +fGC +qvM alu aEM aGd -xyp +nMx bqE bqE bqE @@ -89356,32 +87528,32 @@ ckI clJ cmL cnv -cMm -chX -cpx -cqg -cqE -cqZ -crt -cMH -cAm -cMH -cMN -cFO -cSI -cSI -cMm -cGV -csd -cGV -noK -csd -ccw -aaa -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -89536,7 +87708,7 @@ avk awk axE ayZ -uqO +ncj aBu aAa aAa @@ -89561,18 +87733,18 @@ bbm bdh bef bfv -jTp +smn aBc -xZN +jXg aDt aEO aGc aHF aKG bsf -lrF -lrF -lrF +kxc +kxc +kxc bxK bwh bAh @@ -89613,32 +87785,32 @@ cfb ccw cmN cgR -cgL -chX -cpx -cqj -cSG -crb -cru -cEx -cEx -cEx -cAP -cFP -csI -cAt -cMm -csd -csd -csd -cHp -csd -ccw -aaf -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -89782,7 +87954,7 @@ aml amT anw anz -ltC +ilJ apl aqc aqc @@ -89818,19 +87990,19 @@ aZR aZR aZR bfw -uJI +rzg aBa aBW bjy aEP -iEc +nOS aBa bqG bsa -mRj +jDY bsa bsa -kFf +wEp bwb aJq bBr @@ -89870,32 +88042,32 @@ cfb clM cfz cgR -ccw -cii -cpx -cqi -cMD -cAP -crv -cEy -cEy -cFh -cMD -cFM -czE -kQq -ccw -cGT -csd -csd -csd -csd -ccw -aaf -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -90039,7 +88211,7 @@ amn amV anw anz -uWs +rsX aod aqf ahT @@ -90075,19 +88247,19 @@ aZR bbm beh bfx -kDw +spX aBa aBa aBa aBa aBa aBa -czD -gGD -tVQ -wcX -ekY -kFf +mte +bsg +lTq +tMS +fZD +wEp aJq aJq bBu @@ -90127,32 +88299,32 @@ cfb cfa cje cgR -ccw -cDi -cDr -cDw -cDE -cEa -cMD -cEz -cEz -cEz -cMD -cFR -cSJ -kQq -cMm -ciZ -cHd -cHj -cHd -ciZ -ccw -aaa -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -90332,19 +88504,19 @@ bcg aZU beg aYB -tVp -lNn +ptV +fjy aaf aaf -kMg -kMg +lCL +lCL aaf -rLg -rLg -rLg -rLg -rLg -rLg +wwB +wwB +wwB +wwB +wwB +wwB aJq aJq bBt @@ -90384,32 +88556,32 @@ ckL cmF cje cgR -cMm -chX -cpD -cDw -cDF -cEa -cEg -cEA -cET -cFj -cEf -cFS -cGg -mBv -cGI -cGS -cHe -cHe -cHr -oDF -ccw -aaf -aaT -ctv -aaT -aaf +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -90549,9 +88721,9 @@ ajJ akr akX alC -xgZ +iqw amX -lUR +elw anz aoB aod @@ -90586,22 +88758,22 @@ aYC aYA bbp bbp -bbp +bfx bbp bfz -maz +tAb aZV aZV aaf aaf -kMg +lCL aaf -kMg +lCL aaf -kMg +lCL aaf -kMg -rLg +lCL +wwB aJq aJq aXf @@ -90641,32 +88813,32 @@ ceq clQ cje cgR -cMm -cDj -cDs -cql -cDG -cDG -cEh -cEB -cEU -cFk -cAs -cFT -cSK -cGx -cGK -nzh -nzh -cGY -csd -csd -ccw -aaf -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -90808,9 +88980,9 @@ akW aiG amo amW -eWV +uYE anz -uWs +rsX aod aqe arf @@ -90844,9 +89016,9 @@ aZV bbo bch bdi +bbw bfy bgS -ffU bik aZV aZV @@ -90861,7 +89033,7 @@ bsh bqH aJq aJq -vqa +unY bCv bDJ bCt @@ -90898,32 +89070,32 @@ ckO ckH cja cny -gUz -cip -cnx -cDx -cqb -cqb -cqb -cEC -cqb -cqb -cAr -cqb -cGh -cGC -cey -ijc -csd -cEk -csd -udp -ccw -aaf -aaT -ctv -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -91061,9 +89233,9 @@ adR aiQ ajI akt -amS -aiX -aiX +akQ +agj +agj aiX anw anz @@ -91100,10 +89272,10 @@ aYD aZX baf bdk +jwi bek bfB bgU -pVa bdk bjF blc @@ -91155,32 +89327,32 @@ cfb clR cgR cgR -cMm -cir -cDt -cDy -cqC -crc -cEi -cED -crc -crc -cFy -cBR -cGi -cGD -cGL -ccw -ccw -ccw -ccw -ccw -ccw -aaa -aaT -aaT -aaT -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -91318,10 +89490,10 @@ cBV ajf ajK aks +akY +aly +amj aiX -nuI -anw -anw anw anz aoC @@ -91343,7 +89515,7 @@ vHj eVC dgz aJv -nqP +ioG aMg bHt aOE @@ -91358,10 +89530,10 @@ aZW aZG bej bdj +bej bfA bgT -fDV -bej +bil bej blb bmy @@ -91412,32 +89584,32 @@ ces clN ccm ckF -cDe -cDk -coc -cqa -cig -ccw -ccw -czF -csd -csd -cFz -cFU -cGj -cGE -cGM -cGZ -aag -aaa -aaf -aaa -aaa -aaa -aaa -aaf -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -91573,13 +89745,13 @@ ahC aia aiP aiR -eJk -akl +olv +akv +ala +aww +afM aiX -akz -anz -anz -anz +uVq anz aoF apo @@ -91590,8 +89762,8 @@ atj aul auR atj -gnM -fRa +kcj +ghJ atj aAX azc @@ -91614,10 +89786,10 @@ aPR aZV baq baQ -kCq +dTJ bcQ +bfC bgV -mpA bim bjG aZV @@ -91672,29 +89844,29 @@ cgU cgU cis cjN -cDz -cDH -cMm -csd -crM -crV -crV -cFA -csd -cGk -ccw -aag -aag -aag -aaf -aaf -aaf -aaf -gXs -aaf -aaf -aaf -aaf +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -91832,10 +90004,10 @@ adR aiG ajL aku +akS +alw +amp aiX -alE -anA -anA anA anz aoE @@ -91850,8 +90022,8 @@ avt axL bbl azT -gxH -tEy +nlt +dwc aDG aFd auk @@ -91874,7 +90046,7 @@ baP bbZ bcP cBo -ffU +bgS bbw bbw aZV @@ -91904,7 +90076,7 @@ bOV bQj bRw bSF -pmf +gVY bTP bRA bWQ @@ -91929,29 +90101,29 @@ cfI cgQ cjS cjN -cqm -cgR -crd -cEk -crL -cEW -cse -cse -csu -cGl -ccw -aaa -aaa -aaf -aaa -aaf -ctv -aaT -aaa -aaa -aaf -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -92103,11 +90275,11 @@ arf arf arf arf -dHP -djq +ukP +oma awr awr -wWo +wwn aAh aAh aAh @@ -92144,7 +90316,7 @@ btL buY buY bqH -gYR +neb aJq aXf bCv @@ -92161,7 +90333,7 @@ bOV bQo bRz bSH -kcg +cJn bTP bRA bWQ @@ -92186,29 +90358,29 @@ ccw ccw cDl cjN -cjh -cDI -ccw -ccw -ccw -ccw -ccw -cMm -cMm -cMm -ccw -aaf -aaf -aaf -aaf -aaf -ctv -aaT -aaa -aaa -aaf -aaa -aaa +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI +cgI aaa aaa aaa @@ -92364,7 +90536,7 @@ avv awu awr aAd -qKJ +uDW aAh aDL aAh @@ -92418,7 +90590,7 @@ bOV bQj bRy bSG -pmf +gVY bUK bVT bWR @@ -92621,7 +90793,7 @@ awp axN awr awr -oTI +kSh aAh aDQ aAh @@ -92629,7 +90801,7 @@ aGl aAh aBy aAh -uOb +pTR aJq aOE aJn @@ -92642,7 +90814,7 @@ aYF aZV bbw bcn -jNS +qUm ben bfE bgX @@ -92872,13 +91044,13 @@ aqe arf ari asu -gTx +kyi aun avR -djq -vMd +oma +dHb awr -mPj +uya aAh aDM aGx @@ -93131,18 +91303,18 @@ arf arf arf arf -dHP +ukP axP azb aAi -sTt +wGP aCn -mvB -ipU +rOm +wwC aGm aHV aDM -urH +nrR aJq aJq aJq @@ -93173,9 +91345,9 @@ bva bwu bwu bwu -pgY +ihm bBB -pAE +rhb bzs bFp bGJ @@ -93391,8 +91563,8 @@ arf awq axO aza -moa -uhG +jtk +pqR aAh aAh aAh @@ -93641,7 +91813,7 @@ ajo aps aqk arf -dsV +vGX blU aHw avn @@ -93649,14 +91821,14 @@ awv axX aze awr -uuT +hMx aAh aDU aBz aBz aAh -tsY -tTt +isy +uzk aJq aJq aJq @@ -93900,7 +92072,7 @@ aqj arf ark asu -mOL +epV aun awt awr @@ -93909,10 +92081,10 @@ azX aAZ aCe aDT -mwm -mwm -qzE -fPz +mEN +mEN +dzy +fyq aAh aJC aJC @@ -94169,18 +92341,18 @@ aDP aBx aBx aAh -oNq -jtY +kCk +qIf aMq adq aQb aPZ aRu -iWm +wpo aKR -gJR +tIC aXi -jRc +maC baa aJC bcq @@ -94420,7 +92592,7 @@ awy awr awr avG -tQu +udi aAh aAh aAh @@ -94430,13 +92602,13 @@ aAh aAh aKR aKR -fey +pxD aPY -fOB +xMl aRx aKR -hFk -xCs +jzD +tuN aPY aZZ aQg @@ -94677,24 +92849,24 @@ awA axT axW aAl -vEA +tAE aJC aDR aFl -oaT +rLr aHZ aJC aKJ -yeR +rLR aKR -eBm -yhO +hSU +kay aQd aQa aKR -ndo -eBm -gbb +xbu +hSU +lwj bac aJC aYV @@ -94918,7 +93090,7 @@ aif aif aif bkV -thY +fvk alK aif aif @@ -94926,19 +93098,19 @@ anc anD aoI arf -iTd +myt asN aur avy -neT +tWR axS azk aAk -oxA +eUd aJC aDY aDY -oaT +rLr aKR aJk aKR @@ -94954,7 +93126,7 @@ aKR aKR bab aJC -jtp +xYO aYV ber bfF @@ -95166,13 +93338,13 @@ abp afo abp abp -iHq +hlY ahn aiA aiA aiA ahn -qaZ +hYW anF aod ahn @@ -95183,15 +93355,15 @@ ahn ahn ahn arf -pUo -sPA +iES +jdT aut arf aXF awr awr aAn -dQz +wcy aJC aEc aFk @@ -95201,19 +93373,19 @@ aJC aKr aKR aKR -pIA -pIA -jcN +fbm +fbm +hzR aKR aKR aKR -pIA +fbm aKR aKR bbx aYV aYV -qVa +wDR bfF bhd bis @@ -95419,11 +93591,11 @@ aaf aaf aaf abp -rmC +unE afp -rmC +unE abp -fEo +nea ahn aaa aaf @@ -95433,39 +93605,39 @@ ahn anE aod aoK -fBj +sgV aqp ahn -kMO -oaB -itE -sPA -sPA -sPA -xCE +ukS +tQk +cVp +jdT +jdT +jdT +rMc aun avz awr awr aAn -tTh +fSr aJC aJC -kiH -qeZ +gjC +lxx aJC aJC aKq aKR aNF -lmT -gzA -qet +egS +ghs +lMY aSH aKR -dSM -mTi -hmv +dMX +igT +moq aKR aQg aYV @@ -95491,7 +93663,7 @@ bvj bvj bvd bFu -thl +hcd bvj bvd bKH @@ -95693,19 +93865,19 @@ aoL apy aqq ahn -ttp -cJl +dhx +mfb arf -uNs +unl ast -sPA +jdT auv arf avA axW azo aAp -qPl +lYZ aBC aCt aEA @@ -95716,13 +93888,13 @@ aKN aKR aKR aOJ -nNY -hIJ +fvW +dtE aKR aKR aUg bFC -hmv +moq aKR bbx aYV @@ -95730,9 +93902,9 @@ aYV bet bfH bhf -qqY +slp bhh -qqY +slp bmJ bof bpu @@ -95958,11 +94130,11 @@ arf arf arf arf -fpd -imi +hkg +eNW azf aAo -coj +lMx aBB aBB aBB @@ -95972,12 +94144,12 @@ cNE aKM aMu aMu -ese -sfY +poa +hdb aMu aMu aMu -mdp +uTq aSq aKR bad @@ -95989,7 +94161,7 @@ bfG bhe bit bjS -kQg +nGS bli boe bli @@ -96204,24 +94376,24 @@ aag aag aag arf -xXW -gYK +iep +gQn arf -iTd -uVo -coj -mcQ +myt +qNs +lMx +sjw clO asZ aua -sfO +dcG awB att azh -mgT -mgT -uJq -fcc +vYa +vYa +gKk +vbY alP aGI aId @@ -96235,7 +94407,7 @@ aMx aMx aMx aMx -hvD +eqm aKR aZb aJC @@ -96446,11 +94618,11 @@ aaa aaa aaa aaa -uFF +xzh aaa aqG aaa -eYr +vDq aaa aaa aaa @@ -96461,24 +94633,24 @@ aaa aaa aaa arf -duc -oaB -itE -sPA -oIx +pZv +tQk +cVp +jdT +ier arf arm -mgT +vYa aya -mgT -mgT +vYa +vYa auB atZ azg azp -mgT +vYa aCu -gmc +dgh alP aGH aIc @@ -96703,11 +94875,11 @@ aaa aaa aaa aaa -oBB -ixv +lCB +lNB aaa -ixv -rrJ +lNB +rUQ aaa aaa aaa @@ -96721,21 +94893,21 @@ arf arf arf arf -pUo -xgY +iES +jYI aqs -gfn -mgT -mgT -mgT -mgT -vBb -mgT +hVw +vYa +vYa +vYa +vYa +pSf +vYa ayb -fJA -mgT +ndC +vYa aCv -cFF +frE alP aGJ aIe @@ -96749,7 +94921,7 @@ aXj aVy aSY aVy -ydZ +oNb acN bah aJC @@ -96960,11 +95132,11 @@ aaa aaa aaa aaa -viT -viT +jmC +jmC gXs -viT -viT +jmC +jmC aaa aaa aaa @@ -96977,22 +95149,22 @@ aaa aaa aaa arf -jav -sPA -eDq +ewZ +jdT +tOU arf -bHg -iTD -lBk -mgT -mgT -vBb -mgT +fQF +qbx +qux +vYa +vYa +pSf +vYa ayb -fJA -mgT -mHW -sBu +ndC +vYa +vys +tCi alP aGJ aIe @@ -97002,11 +95174,11 @@ aKQ aNu aJC aPw -eqs +kwy aQc aSZ aQc -jxp +vjq acN bag aJC @@ -97234,22 +95406,22 @@ aaa aaa aaa arf -wSg -vgX -rak +qoP +prU +fOc arf -lqe -jYg -jde -mgT -pbw -neq -mTj -qGM -ulP -mgT +oSO +sAI +fJa +vYa +svw +ntf +jvN +lBE +xpx +vYa aCu -vbP +hgX alP aGA aHS @@ -97271,7 +95443,7 @@ aYV aYV bet bfH -liD +dok bhh bhg bln @@ -97475,9 +95647,9 @@ aaa aaa aaa aaa -oqa +hho aaa -oqa +hho aaa aaa aaa @@ -97495,18 +95667,18 @@ arf arf arf arf -mbl -iiH -udn -vBN -fLn -vXW -mgT -cIW -kmf -uip -jil -ttF +mTp +qEv +kRk +mXB +qAQ +pzk +vYa +sMa +iEI +jeT +rTQ +vHM alP aGL aHM @@ -97751,18 +95923,18 @@ aaa aaa aaa gXs -jMa -qMf -qMf -kte -wgV -odR -odR -wgV -kCK -cmm -cmm -dKg +kHJ +rEV +rEV +kQZ +fVU +vpm +vpm +fVU +nel +wCa +wCa +lFl arj alP aGL @@ -97986,7 +96158,7 @@ aaa aaa aaa aaa -xlX +aaa aaa aaa aaa @@ -98037,7 +96209,7 @@ aVz aVz aYJ aJI -xZr +sIe aYV aYV aYV @@ -98554,7 +96726,7 @@ baj bbz aYV bdp -pWO +itT bfK bfK bfK @@ -98807,7 +96979,7 @@ aVD aVE aXm aVz -gIT +egQ bbz aYV bdp @@ -99293,17 +97465,17 @@ aaa aaa aaa aaa -mHC -qMf -qMf -qMf -sXo -odR -odR -ioS -cmm -cmm -cmm +haX +rEV +rEV +rEV +nie +vpm +vpm +wFX +wCa +wCa +wCa aCy arj alP @@ -99321,7 +97493,7 @@ aTO cCq aVz aVz -guh +fPs bbz aYV bdp @@ -99554,14 +97726,14 @@ aaa aaa aaa arj -kOA +cRz avD awC ayb -jYD -ruS -ukL -lAY +mbD +nmS +oFk +xXY vpY alP aGJ @@ -99607,7 +97779,7 @@ bCR bqQ bGX bCR -pMv +oDy bRN bIK bPq @@ -99813,13 +97985,13 @@ aaf arj auz avC -oGS +kOf aya -mgT -mgT -rmY -mgT -mgT +vYa +vYa +oYc +vYa +vYa gOZ aGJ avI @@ -100070,7 +98242,7 @@ alO arj arj arj -csp +eOv gOZ cVb cVb @@ -100582,10 +98754,10 @@ cxW anf aqv ayf -hxw -dKe +fIn +ego awE -pGr +dMu cVb vCb wUY @@ -100838,8 +99010,8 @@ aag alO anf alO -gqR -pQA +kSB +pAl alP anf aCG @@ -100855,11 +99027,11 @@ aIq aKK aMy aIp -rXv +jaa aQm -eaD -vAZ -vAZ +wOT +htr +htr aVK aRJ aRJ @@ -101101,10 +99273,10 @@ alP awF aCG alP -uTQ +olw aBE aCz -fXo +trY aCJ aGT aIn @@ -101114,10 +99286,10 @@ aMt aIp aOW aQm -ktc +dRC aSS aUj -uao +pHo aRJ aYQ cBg @@ -101351,7 +99523,7 @@ aoN apA aof arq -qnd +hdp atv auD alP @@ -101371,14 +99543,14 @@ aMA aIp aOX aQm -ktc +dRC aST aUk -uao +pHo aRJ aYQ bam -oAc +yiN aYV aYV aYV @@ -101595,10 +99767,10 @@ adU adU adU adU -xWW -sCo -sCo -sCo +ssL +rsv +rsv +rsv acx amv ane @@ -101628,14 +99800,14 @@ aMz aNQ aOX aQm -pmj -lrH -lrH -rEQ +tFt +tsr +tsr +xzy aRJ aYR ban -efo +qje aYV aYV bez @@ -101879,7 +100051,7 @@ aaa aFq aGX aIp -lwn +vzS aKU aME aNN @@ -101892,7 +100064,7 @@ aXo aXo aYO bap -efo +qje aYV bci beB @@ -102121,7 +100293,7 @@ aof aof aof aof -gBY +qkC aoP atw auF @@ -102129,7 +100301,7 @@ alP aoP auF azr -juV +kel atw alP alP @@ -102143,13 +100315,13 @@ aNQ aOZ aOX aOX -ohe +hZH aUz aVM aOX aYT bam -qcu +ory baR bcb bdl @@ -102206,7 +100378,7 @@ bAw bAw clp aag -viT +jmC aaa aaa aaa @@ -102384,7 +100556,7 @@ aty auF alP aAt -lHE +kuY alP alP alP @@ -102635,7 +100807,7 @@ aaa aaa apC anf -juV +kel alP atx auF @@ -102644,7 +100816,7 @@ auD auF apE aAs -trM +khA alP aCG aFr @@ -102697,15 +100869,15 @@ bOx bPx bJN bRT -bEm +aad bEm bJN bRT -bEm +aad bEm bJN bRT -bEm +aad bEm bDb cfr @@ -102897,12 +101069,12 @@ alP apE auG alP -hSS +rgF auF apE anf anf -kwj +jRy aCG aDZ aFu @@ -103166,8 +101338,8 @@ bbE aIr bav aLf -nvw -oWe +dkk +kLR aRO aQp aRN @@ -103231,11 +101403,11 @@ cQB czY cOT aaa -viT -viT -viT -viT -viT +jmC +jmC +jmC +jmC +jmC aaa aaa aaa @@ -103408,12 +101580,12 @@ apC alP alP alP -dHx +tuj auH avF awI ayc -nOD +mlr asw asw aCD @@ -103424,7 +101596,7 @@ aIu aJQ aIt aIt -oWe +kLR aRO aIt aRN @@ -103679,9 +101851,9 @@ anf aFu aIs aJP -xah +wuB aIt -xNd +nsJ aYW aYW aYW @@ -103748,10 +101920,10 @@ aaa aaa aaa aaa -tpb -rnY -oSW -vPl +ikx +mwb +xWM +rxH aaa aaa aaa @@ -103936,9 +102108,9 @@ aFu aFu aIw aJS -wTC +tqt aNP -kMY +jFy aOS aOS aOS @@ -104002,14 +102174,14 @@ cQB cAa cOT gXs -lDF -kTe +xNY +kvb aaa aaa -tpb -tpb -tpb -vPl +ikx +ikx +ikx +rxH aaa aaa aaa @@ -104186,7 +102358,7 @@ awJ anf alP aAv -wZI +gCe aCE aDZ aFu @@ -104195,7 +102367,7 @@ aIv aJR aIt aIt -oWe +kLR aRO aIt aPd @@ -104259,14 +102431,14 @@ czU czZ cOT aaa -viT -sbs -sbs -tpb -tpb -tpb -gqp -rnY +jmC +dbM +dbM +ikx +ikx +ikx +thr +mwb aaa aaa aaa @@ -104452,7 +102624,7 @@ aIx aJF aQq aNS -oWe +kLR aRO aIt aPd @@ -104516,14 +102688,14 @@ cgm czY cOT gXs -lDF -kTe -nxN -sbs -sbs +xNY +kvb +gJg +dbM +dbM aaa aaa -nxN +gJg aaa aaa aaa @@ -104713,12 +102885,12 @@ aFu aPf aQq aRP -oIt +kHK aIt aIt aWd aXV -pWH +iWa bbD aYV aXq @@ -104775,10 +102947,10 @@ cNW aaa aaa aaa -nxN -nxN -rnY -tpb +gJg +gJg +mwb +ikx gXs aaa aaa @@ -104949,8 +103121,8 @@ alO anf anf arw -uiT -cII +ftv +sLr anf alP awL @@ -105223,7 +103395,7 @@ aIy aJG cAz aFw -eAE +iWk aPg aQr aFu @@ -105290,10 +103462,10 @@ aaa aaa aaa aaa -viT -viT -viT -viT +jmC +jmC +jmC +jmC aaa aaa aaa @@ -105460,10 +103632,10 @@ aaa aaa gXs alP -pRx +qxc ayf -eUR -imK +nuV +iOV aFn aFn aBB @@ -105480,7 +103652,7 @@ aFw aLo aLb aFw -xwI +eMQ aYW aYW aRQ @@ -105714,13 +103886,13 @@ aaa aaa aaa aaa -uBW -uBW -uBW -uBW -oFY -uBW -uBW +fzd +fzd +fzd +fzd +tNJ +fzd +fzd atB alP alP @@ -105737,7 +103909,7 @@ aIz aJM aLa aFw -kwW +tGG aYW aQs aFu @@ -105781,15 +103953,15 @@ bOx bPI bJN bEm -bEm +abz bUi bJN bEm -bEm +abz bUi bJN bEm -bEm +abz bUi bDb aaf @@ -105971,21 +104143,21 @@ aaa aaa aaa aaa -uBW -mKU -wLe -shX -mJU -cyi -tcE -dIA -pNj -dIA -nhn +fzd +xdb +mCq +wJz +mHC +tWs +lmi +ghY +sxX +ghY +jBZ avI asA apE -fIK +vHv aCG aEf aFw @@ -106228,12 +104400,12 @@ aaa aaa aaa aaa -lfx -wLe -wLe -wLe -wLe -gGK +tIk +mCq +mCq +mCq +mCq +pjh asB asB asB @@ -106324,7 +104496,7 @@ cOe cBT aag gXs -viT +jmC aaa aaa aaa @@ -106485,12 +104657,12 @@ aaa aaa aaa aaa -lfx -wLe -wLe -wLe -wLe -sEJ +tIk +mCq +mCq +mCq +mCq +dSv asB atD auJ @@ -106742,12 +104914,12 @@ aaa aaa aaa aaa -uBW -wLe -wLe -wLe -wLe -wLe +fzd +mCq +mCq +mCq +mCq +mCq asB atC auI @@ -106831,7 +105003,7 @@ cNW cNW cNW cOe -xPX +qXH csy cko cAf @@ -106999,12 +105171,12 @@ aaa aaa aaa aaa -lfx -wLe -wLe -wLe -wLe -wLe +tIk +mCq +mCq +mCq +mCq +mCq asB atE auI @@ -107256,18 +105428,18 @@ aaa aaa aaa aaa -lfx -wLe -wLe -wLe -wLe -wLe +tIk +mCq +mCq +mCq +mCq +mCq asB asB asB avL awR -kuT +hRT azu aAz asB @@ -107341,7 +105513,7 @@ cgp chv ciJ cbf -xcw +lLI clr bnt cOe @@ -107513,12 +105685,12 @@ aaa aaa aaa aaa -uBW -kgf -wLe -pnl -wLe -oKy +fzd +wXP +mCq +nXa +mCq +nyH asB atG auL @@ -107770,12 +105942,12 @@ aaa aaa aaa aaa -uBW -uBW -uBW -uBW -uBW -uBW +fzd +fzd +fzd +fzd +fzd +fzd asB atF auK @@ -108061,9 +106233,9 @@ aXB aZh baB aCR -fkx +riB bdx -izL +dfI bgc bgc biX @@ -108377,13 +106549,13 @@ cOe cOe cOe sQX -tDE -tDE -tDE -tDE -tDE -tDE -tDE +jzi +jzi +jzi +jzi +jzi +jzi +jzi aaS aaS aba @@ -109135,7 +107307,7 @@ cbZ bSl cmo cNW -sPj +vOq cNW chC ciL @@ -110435,17 +108607,17 @@ cpi cpi cpi cqJ -gnW +ggg crk crk crk crk crk -phP +pFt cqJ -gnW +ggg crk -phP +pFt cpi cpi ctB @@ -110701,7 +108873,7 @@ crF aaa aaa aaa -jvm +hik aaa aaa aaa @@ -111440,7 +109612,7 @@ cNW cNW cNW cNW -dok +vFt clt cac cbh @@ -111706,7 +109878,7 @@ cbf cbf ceT cNW -wNd +kCW chH cNW aaf diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index b47944146f..c59e0698f9 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -1449,26 +1449,6 @@ }, /turf/open/floor/plating, /area/construction/mining/aux_base) -"agv" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/obj/machinery/airalarm{ - dir = 2; - pixel_y = 22 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "agB" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -56088,8 +56068,6 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/obj/item/gun/energy/pumpaction/blaster, -/obj/item/gun/energy/pumpaction/blaster, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "bRx" = ( @@ -120804,17 +120782,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dWi" = ( -/obj/structure/table, -/obj/machinery/computer/libraryconsole/bookmanagement, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating, -/area/security/prison) "dWm" = ( /obj/structure/reagent_dispensers/virusfood{ pixel_x = -32 @@ -126401,18 +126368,22 @@ }, /turf/open/floor/plasteel/dark, /area/library) -"euu" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "exE" = ( /obj/machinery/air_sensor/atmos/toxins_mixing_tank, /turf/open/floor/engine/vacuum, /area/science/mixing) +"eCJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "eCM" = ( /obj/structure/cable/white{ icon_state = "4-8" @@ -126423,27 +126394,6 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab) -"eHb" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"eIC" = ( -/obj/structure/reagent_dispensers/watertank, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "eJc" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /turf/closed/wall/r_wall, @@ -126485,6 +126435,13 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) +"ePi" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "eTv" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -126537,24 +126494,6 @@ }, /turf/open/floor/plasteel, /area/medical/medbay/central) -"flG" = ( -/obj/effect/decal/cleanable/dirt, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/computer/arcade{ - icon_state = "arcade"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) "fno" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -126580,6 +126519,16 @@ /obj/machinery/door/airlock/research/glass/incinerator/toxmix_interior, /turf/open/floor/engine, /area/science/mixing) +"fCs" = ( +/obj/machinery/door/window/northright{ + name = "Coffin Storage" + }, +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, +/area/chapel/office) "fFK" = ( /obj/machinery/ore_silo, /obj/effect/turf_decal/tile/neutral{ @@ -126598,6 +126547,22 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/science/circuit) +"fLh" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/delivery, +/obj/structure/closet, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "fLR" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -126614,6 +126579,31 @@ }, /turf/open/floor/plating, /area/maintenance/port) +"fXF" = ( +/obj/machinery/button/crematorium{ + id = "cremawheat"; + pixel_x = -26; + req_access_txt = "27" + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/table, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/obj/item/clothing/under/burial, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "gbV" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1 @@ -126626,49 +126616,56 @@ }, /turf/open/floor/engine, /area/science/mixing) -"gkl" = ( -/obj/effect/turf_decal/tile/neutral{ +"giN" = ( +/obj/structure/window/reinforced{ dir = 8 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plating, /area/chapel/office) "gmj" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/circuit) -"gug" = ( -/obj/machinery/light/small, -/turf/open/floor/plasteel, -/area/security/prison) -"gER" = ( -/obj/structure/cable/white{ - icon_state = "4-8" +"gut" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/cable/white{ - icon_state = "2-4" - }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"gBd" = ( /turf/open/floor/plasteel, -/area/maintenance/port/aft) +/area/security/prison) +"gKo" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "gKr" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, /turf/open/floor/circuit/green, /area/science/research/abandoned) +"gLe" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/grape, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "gNw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/table/glass, @@ -126726,6 +126723,13 @@ /obj/item/clothing/mask/muzzle, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"gVZ" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "gXn" = ( /obj/effect/decal/cleanable/dirt, /obj/effect/turf_decal/stripes/line{ @@ -126736,10 +126740,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/department/electrical) -"hds" = ( -/obj/structure/grille, -/turf/open/space, -/area/space/nearstation) "hdH" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -126757,21 +126757,10 @@ dir = 10 }, /area/science/circuit) -"hig" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) +"hix" = ( +/obj/structure/sign/warning/vacuum, +/turf/closed/wall/r_wall, +/area/chapel/office) "hrP" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -126793,19 +126782,13 @@ }, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"hsc" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"hsy" = ( +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/turf/open/floor/plasteel, +/area/security/prison) "hFo" = ( /obj/structure/lattice, /obj/structure/disposalpipe/segment{ @@ -126837,9 +126820,6 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"hJk" = ( -/turf/open/space, -/area/space) "hNZ" = ( /obj/structure/chair/office/light{ dir = 8 @@ -126859,11 +126839,36 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/medbay/central) -"hUt" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" +"hTX" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"iaF" = ( +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/research) +"iho" = ( +/obj/structure/sign/warning/nosmoking, +/turf/closed/wall, +/area/medical/surgery) +"ijB" = ( +/obj/structure/reagent_dispensers/keg/aphro/strong, +/obj/item/reagent_containers/glass/beaker, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"ioW" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ @@ -126872,17 +126877,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"iaF" = ( -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/science/research) -"ijB" = ( -/obj/structure/reagent_dispensers/keg/aphro/strong, -/obj/item/reagent_containers/glass/beaker, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) "iwL" = ( /obj/machinery/status_display{ pixel_x = 32 @@ -126941,37 +126941,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"iUn" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"iZm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/computer/arcade{ - icon_state = "arcade"; - dir = 1 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/fore) "jdO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -126996,13 +126965,6 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"jie" = ( -/obj/machinery/vr_sleeper, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) "jjN" = ( /obj/structure/table/reinforced, /obj/machinery/camera{ @@ -127100,10 +127062,6 @@ /obj/machinery/chem_master, /turf/open/floor/plasteel/dark, /area/medical/medbay/central) -"jPL" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/r_wall, -/area/chapel/office) "jRy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -127124,16 +127082,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/science/mixing) -"jTP" = ( -/obj/machinery/door/window/northleft{ - name = "Mass Driver" - }, -/obj/machinery/mass_driver{ - id = "chapelgun"; - name = "Holy Driver" - }, -/turf/open/floor/plating, -/area/chapel/office) "kam" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/conveyor{ @@ -127142,11 +127090,48 @@ }, /turf/open/floor/plating, /area/quartermaster/storage) -"ktV" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 2 +"kiJ" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/turf/open/floor/plating, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/maintenance/starboard/fore) +"kqa" = ( +/obj/structure/table, +/obj/effect/decal/cleanable/cobweb, +/obj/item/storage/crayons, +/obj/item/storage/crayons, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) +"krb" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/chapel/office) "kvf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -127173,6 +127158,19 @@ }, /turf/open/floor/plasteel, /area/maintenance/port) +"kKn" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/machinery/door/window{ + req_one_access_txt = "48,50" + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/quartermaster/sorting) "kLu" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -127188,27 +127186,11 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) -"kTU" = ( -/obj/effect/decal/cleanable/dirt, -/turf/closed/wall/r_wall, -/area/chapel/office) -"lag" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "lak" = ( /turf/open/floor/plasteel/white/side{ dir = 10 }, /area/science/circuit) -"lem" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/grape, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) "loI" = ( /obj/machinery/autolathe, /obj/machinery/door/window/southleft{ @@ -127240,13 +127222,6 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"lva" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "lyU" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix{ dir = 8 @@ -127302,6 +127277,20 @@ }, /turf/open/floor/plasteel, /area/science/circuit) +"lLY" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/closet/crate/coffin, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "lOY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 @@ -127360,38 +127349,16 @@ dir = 1 }, /area/science/circuit) -"lYm" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +"mbd" = ( +/obj/structure/cable/white{ + icon_state = "4-8" }, /obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/delivery, -/obj/structure/closet, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"mhH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "mkm" = ( /obj/machinery/atmospherics/components/binary/valve, /obj/machinery/embedded_controller/radio/airlock_controller/incinerator_toxmix{ @@ -127410,9 +127377,21 @@ }, /turf/open/floor/plasteel/dark, /area/science/mixing) -"mqT" = ( +"mpP" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, /turf/open/floor/plasteel, -/area/security/prison) +/area/maintenance/port/fore) "mvm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127439,31 +127418,23 @@ /obj/item/assembly/signaler, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"mIQ" = ( -/obj/machinery/button/crematorium{ - id = "cremawheat"; - pixel_x = -26; - req_access_txt = "27" +"mPj" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 2 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/structure/table, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/obj/item/clothing/under/burial, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plating, /area/chapel/office) +"mPH" = ( +/obj/structure/table, +/obj/machinery/computer/libraryconsole/bookmanagement, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, +/turf/open/floor/plating, +/area/security/prison) "mQE" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -127487,38 +127458,35 @@ }, /turf/open/floor/engine, /area/science/mixing) +"nbW" = ( +/obj/structure/grille, +/turf/open/space, +/area/space/nearstation) "nyN" = ( /obj/machinery/vending/kink, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) +"nFW" = ( +/obj/machinery/door/poddoor{ + id = "chapelgun"; + name = "Chapel Launcher Door" + }, +/obj/structure/fans/tiny, +/turf/open/floor/plating, +/area/chapel/office) +"nNX" = ( +/obj/structure/reagent_dispensers/watertank, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) "nSh" = ( /obj/machinery/atmospherics/pipe/simple/general/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"nUj" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"nZa" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/machinery/door/window{ - req_one_access_txt = "48,50" - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel, -/area/quartermaster/sorting) -"oDr" = ( +"oHk" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -127531,7 +127499,7 @@ }, /obj/machinery/computer/arcade{ icon_state = "arcade"; - dir = 4 + dir = 1 }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/fore) @@ -127633,6 +127601,39 @@ }, /turf/open/floor/wood, /area/bridge/showroom/corporate) +"oZY" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) +"pfC" = ( +/obj/machinery/seed_extractor, +/obj/item/reagent_containers/glass/bucket, +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) +"pgU" = ( +/obj/effect/turf_decal/delivery, +/obj/machinery/hydroponics/soil, +/obj/item/seeds/lime{ + pixel_x = 6 + }, +/turf/open/floor/plasteel, +/area/hydroponics/garden/abandoned{ + name = "Maintenance Garden" + }) "pmQ" = ( /obj/structure/table/reinforced, /obj/machinery/newscaster{ @@ -127643,6 +127644,22 @@ dir = 1 }, /area/science/circuit) +"pnK" = ( +/obj/structure/filingcabinet/chestdrawer, +/obj/effect/turf_decal/tile/brown{ + dir = 1 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 4 + }, +/obj/effect/turf_decal/tile/brown{ + dir = 8 + }, +/obj/machinery/keycard_auth{ + pixel_x = -25 + }, +/turf/open/floor/plasteel, +/area/quartermaster/qm) "poI" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -127674,36 +127691,6 @@ }, /turf/open/floor/plating, /area/science/research/abandoned) -"pDQ" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) -"pLz" = ( -/obj/structure/sign/warning/nosmoking, -/turf/closed/wall, -/area/medical/surgery) -"pPt" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/structure/bodycontainer/morgue, -/turf/open/floor/plasteel/dark, -/area/chapel/office) "pQm" = ( /obj/effect/decal/cleanable/dirt, /obj/structure/cable/white{ @@ -127721,7 +127708,47 @@ }, /turf/open/floor/plasteel, /area/science/research/abandoned) -"qbg" = ( +"qhc" = ( +/obj/structure/table/reinforced, +/obj/item/integrated_electronics/analyzer, +/obj/item/integrated_electronics/debugger, +/obj/item/integrated_electronics/wirer, +/turf/open/floor/plasteel/white/side{ + dir = 9 + }, +/area/science/circuit) +"qnx" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, +/turf/open/floor/engine/vacuum, +/area/science/mixing) +"qoc" = ( +/obj/machinery/door/window/northleft{ + name = "Mass Driver" + }, +/obj/machinery/mass_driver{ + id = "chapelgun"; + name = "Holy Driver" + }, +/turf/open/floor/plating, +/area/chapel/office) +"qpq" = ( +/turf/open/floor/plasteel/white/side{ + dir = 5 + }, +/area/science/circuit) +"qAV" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/maintenance/port/fore) +"qBG" = ( +/obj/effect/spawner/lootdrop/keg, +/turf/open/floor/plating, +/area/crew_quarters/abandoned_gambling_den) +"ray" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -127742,42 +127769,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"qhc" = ( -/obj/structure/table/reinforced, -/obj/item/integrated_electronics/analyzer, -/obj/item/integrated_electronics/debugger, -/obj/item/integrated_electronics/wirer, -/turf/open/floor/plasteel/white/side{ - dir = 9 - }, -/area/science/circuit) -"qkw" = ( -/obj/effect/landmark/barthpot, -/turf/open/floor/wood, -/area/library) -"qnx" = ( -/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/toxins_mixing_input, -/turf/open/floor/engine/vacuum, -/area/science/mixing) -"qpq" = ( -/turf/open/floor/plasteel/white/side{ - dir = 5 - }, -/area/science/circuit) -"qzY" = ( -/obj/machinery/door/window/northright{ - name = "Coffin Storage" - }, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/chapel/office) -"qBG" = ( -/obj/effect/spawner/lootdrop/keg, -/turf/open/floor/plating, -/area/crew_quarters/abandoned_gambling_den) "rhO" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -127786,23 +127777,42 @@ dir = 9 }, /area/science/circuit) +"rqh" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "rCv" = ( /turf/open/floor/plasteel/white/side{ dir = 6 }, /area/science/circuit) -"rTc" = ( -/obj/structure/sign/warning/electricshock{ - pixel_y = 32 +"rIi" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/vr_sleeper, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"rKU" = ( /obj/structure/cable/white{ icon_state = "4-8" }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" +/obj/structure/cable/white{ + icon_state = "2-4" }, -/area/security/prison) +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "rUD" = ( /obj/machinery/meter, /obj/machinery/atmospherics/pipe/manifold/general/visible{ @@ -127844,54 +127854,32 @@ /obj/effect/decal/remains/xeno, /turf/open/floor/engine/vacuum, /area/science/mixing) -"siB" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/closet/crate/coffin, -/turf/open/floor/plating, -/area/chapel/office) +"sfL" = ( +/turf/open/space, +/area/space) "svv" = ( /obj/machinery/door/poddoor/incinerator_toxmix, /turf/open/floor/engine/vacuum, /area/science/mixing) -"sBk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"sww" = ( +/obj/effect/decal/cleanable/dirt, +/turf/closed/wall/r_wall, +/area/chapel/office) +"sCQ" = ( +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel{ - heat_capacity = 1e+006 - }, -/area/maintenance/port/aft) -"tma" = ( -/obj/structure/filingcabinet/chestdrawer, -/obj/effect/turf_decal/tile/brown{ - dir = 1 - }, -/obj/effect/turf_decal/tile/brown{ - dir = 4 - }, -/obj/effect/turf_decal/tile/brown{ dir = 8 }, -/obj/machinery/keycard_auth{ - pixel_x = -25 - }, -/turf/open/floor/plasteel, -/area/quartermaster/qm) -"tmi" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/science/circuit) -"tra" = ( +/obj/effect/turf_decal/tile/neutral, +/obj/structure/bodycontainer/morgue, +/turf/open/floor/plasteel/dark, +/area/chapel/office) +"sVX" = ( /obj/effect/turf_decal/tile/neutral{ dir = 8 }, @@ -127902,8 +127890,21 @@ dir = 4 }, /obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/machinery/airalarm{ + dir = 2; + pixel_y = 22 + }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"tmi" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/circuit) "twt" = ( /obj/machinery/vr_sleeper, /obj/effect/turf_decal/tile/neutral{ @@ -127911,7 +127912,7 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"tzT" = ( +"tBE" = ( /obj/structure/cable/white{ icon_state = "1-2" }, @@ -127944,16 +127945,22 @@ /obj/machinery/chem_heater, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"umo" = ( -/obj/structure/table, -/obj/effect/decal/cleanable/cobweb, -/obj/item/storage/crayons, -/obj/item/storage/crayons, -/obj/structure/cable/white{ - icon_state = "4-8" +"tVN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/security/prison) +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "upk" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -127986,10 +127993,31 @@ }, /turf/open/floor/plasteel/white, /area/science/misc_lab) -"uNx" = ( -/obj/item/twohanded/required/kirbyplants/random, -/turf/open/floor/plasteel, +"usi" = ( +/obj/structure/sign/warning/electricshock{ + pixel_y = 32 + }, +/obj/machinery/vr_sleeper, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, /area/security/prison) +"uuP" = ( +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, +/area/chapel/office) "uNP" = ( /obj/machinery/atmospherics/pipe/simple/general/visible, /obj/effect/turf_decal/stripes/line{ @@ -128022,15 +128050,6 @@ /obj/item/clothing/under/color/grey, /turf/open/floor/plating, /area/crew_quarters/abandoned_gambling_den) -"vph" = ( -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "vAb" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -128040,27 +128059,14 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"vAW" = ( +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/security/prison) "wei" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/circuit) -"wjb" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, -/obj/item/seeds/lime{ - pixel_x = 6 - }, -/turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) -"wsI" = ( -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/port/fore) "wAA" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall/r_wall, @@ -128076,28 +128082,10 @@ /obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel/white, /area/science/misc_lab) -"wJf" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/chapel/office) -"wQz" = ( -/obj/machinery/seed_extractor, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/delivery, +"wIf" = ( +/obj/item/twohanded/required/kirbyplants/random, /turf/open/floor/plasteel, -/area/hydroponics/garden/abandoned{ - name = "Maintenance Garden" - }) +/area/security/prison) "xaf" = ( /obj/machinery/door/airlock/public/glass{ name = "Holodeck Access" @@ -128116,14 +128104,20 @@ }, /turf/open/floor/plasteel, /area/crew_quarters/fitness/recreation) -"xdG" = ( -/obj/machinery/door/poddoor{ - id = "chapelgun"; - name = "Chapel Launcher Door" +"xdZ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/fans/tiny, -/turf/open/floor/plating, -/area/chapel/office) +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel{ + heat_capacity = 1e+006 + }, +/area/maintenance/port/aft) "xmt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -128133,6 +128127,10 @@ }, /turf/open/floor/plasteel/white, /area/science/mixing) +"xuu" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/wood, +/area/library) "xwK" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -157117,7 +157115,7 @@ arB aug alg alg -pDQ +eCJ aKg alf aMO @@ -157374,7 +157372,7 @@ aAb aAb aAb aAb -vph +gKo aKh alf aMN @@ -157632,7 +157630,7 @@ aCv aFJ aAb aIH -eIC +nNX alf aMP aDw @@ -158146,7 +158144,7 @@ aEB aFL aAb aIH -lva +ePi avm arB arB @@ -158398,7 +158396,7 @@ alf aAb aBj aCv -wQz +pfC aEC aFM aAb @@ -158529,7 +158527,7 @@ edL eep eff aad -lag +rqh aaa ajr aaa @@ -158655,7 +158653,7 @@ alg aAb aBk aCv -lem +gLe aEC aFN aAb @@ -158786,7 +158784,7 @@ edM eeq dLY aad -hds +nbW aaa aad aaa @@ -158917,7 +158915,7 @@ aED aFO aHm aII -euu +qAV aLz aMR aOq @@ -159174,7 +159172,7 @@ aEE aFP aHn aIJ -wsI +gVZ aLz aMS aOr @@ -159426,12 +159424,12 @@ ayX aAb aBn aCx -wjb +pgU aCv aFQ aAb -hig -wsI +mpP +gVZ aLz aMT aOs @@ -159804,7 +159802,7 @@ dXz dYt dON dOl -gER +rKU eaX dYu ect @@ -160060,8 +160058,8 @@ dON dON dON dON -sBk -nUj +xdZ +mbd ebc ebQ ecu @@ -160202,7 +160200,7 @@ aAb aAb aAb aIL -lva +ePi aLz aLz aLz @@ -160323,12 +160321,12 @@ dZN dZN dZN dZN -jPL +hix dZN dZN dLY aad -lag +rqh aad aad aaa @@ -160459,7 +160457,7 @@ aEG aFS aHp aIM -tzT +tBE aLB aFS aEG @@ -160574,20 +160572,20 @@ dWJ dLW dYu dZg -lYm -hUt +fLh +oZY dZN -hsc -gkl -qbg -jTP -ktV -xdG +gut +krb +ray +qoc +mPj +nFW aaa -hJk +sfL aaa aaa -hJk +sfL aaa aaa aaa @@ -160763,7 +160761,7 @@ caG chU cjt ckR -qkw +xuu cnR cpv cqQ @@ -160833,12 +160831,12 @@ dTw dTw dZN dZN -kTU -agv -eHb -eHb -qzY -siB +sww +sVX +hTX +hTX +fCs +giN dTw aad aad @@ -161082,17 +161080,17 @@ dRB dSz dTx dUi -iUn +lLY dVN -iUn +lLY dXB dYv dTw dZO -mIQ -pPt -mhH -tra +fXF +sCQ +tVN +uuP dTw dTw dTw @@ -161345,7 +161343,7 @@ dUj dXC dYw dZh -wJf +rIi eau edr ebS @@ -168167,7 +168165,7 @@ aCP avQ aFe aGp -nZa +kKn aJg aKF aLP @@ -170724,7 +170722,7 @@ aox apu aqy arb -flG +ioW aig auA avU @@ -171491,7 +171489,7 @@ akU alI amE anz -oDr +kiJ apw aqA apy @@ -172009,7 +172007,7 @@ aiC apy apy apu -iZm +oHk atw auD avW @@ -174934,7 +174932,7 @@ dkv dma dma dma -pLz +iho dsI dro dvz @@ -175370,7 +175368,7 @@ aaa aaa aad aQR -tma +pnK aUq aVR aXF @@ -179473,7 +179471,7 @@ aaa aaa aaa aaa -lag +rqh aFm aIc aFm @@ -179730,9 +179728,9 @@ aaa aaa aaa aaa -lag +rqh aFm -umo +kqa bbt aFm aMc @@ -179987,10 +179985,10 @@ aaa aaa aaa aaa -lag +rqh aFm -jie -gug +hsy +vAW aFm aKV aNy @@ -180246,10 +180244,10 @@ ajr ajr aad aFm -rTc -mqT -uNx -mqT +usi +gBd +wIf +gBd aNz aPh aQZ @@ -180503,7 +180501,7 @@ ajr aad aad aFn -dWi +mPH aJA aJA aMe diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index f2eab05785..3516d61080 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -3528,7 +3528,6 @@ pixel_x = -22 }, /obj/structure/rack, -/obj/item/storage/fancy/donut_box, /obj/item/gun/energy/e_gun/dragnet, /obj/item/gun/energy/e_gun/dragnet, /obj/effect/turf_decal/tile/neutral{ @@ -4004,8 +4003,7 @@ dir = 8 }, /obj/structure/rack, -/obj/item/gun/energy/pumpaction/blaster, -/obj/item/gun/energy/pumpaction/blaster, +/obj/item/storage/fancy/donut_box, /turf/open/floor/plasteel/dark, /area/ai_monitored/security/armory) "ahJ" = ( @@ -27117,6 +27115,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 2 }, +/obj/structure/sign/departments/custodian{ + pixel_x = 32; + pixel_y = -32 + }, /turf/open/floor/plasteel, /area/hallway/primary/central) "baI" = ( @@ -83444,6 +83446,10 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"iCn" = ( +/obj/machinery/vr_sleeper, +/turf/open/floor/plasteel, +/area/security/prison) "iLj" = ( /obj/structure/table, /turf/open/floor/plating, @@ -83462,6 +83468,16 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/crew_quarters/fitness/recreation) +"jhu" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/door/airlock/public/glass{ + id_tag = "permahydro"; + name = "Recreation Module" + }, +/turf/open/floor/plasteel, +/area/security/prison) "jwW" = ( /turf/closed/wall/mineral/plastitanium, /area/crew_quarters/fitness/recreation) @@ -83519,16 +83535,6 @@ "krD" = ( /turf/closed/wall, /area/science/circuit) -"kwg" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/machinery/door/airlock/public/glass{ - id_tag = "permahydro"; - name = "Recreation Module" - }, -/turf/open/floor/plasteel, -/area/security/prison) "kwI" = ( /obj/item/wrench, /obj/item/clothing/suit/apron, @@ -83589,10 +83595,6 @@ }, /turf/open/floor/plasteel/white, /area/science/circuit) -"kRT" = ( -/obj/machinery/vr_sleeper, -/turf/open/floor/plasteel, -/area/security/prison) "kVo" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -83612,13 +83614,6 @@ /obj/item/integrated_circuit_printer, /turf/open/floor/plasteel/white, /area/science/circuit) -"lmg" = ( -/obj/machinery/computer/arcade{ - icon_state = "arcade"; - dir = 1 - }, -/turf/open/floor/plasteel, -/area/security/prison) "lsv" = ( /obj/machinery/power/apc{ areastring = "/area/science/circuit"; @@ -83667,6 +83662,10 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"lWL" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/surgery) "lWY" = ( /obj/machinery/door/airlock/hatch{ name = "Telecomms Server Room" @@ -83788,13 +83787,6 @@ /obj/item/storage/fancy/candle_box, /turf/open/floor/engine/cult, /area/library) -"oba" = ( -/obj/structure/chair/stool, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/security/prison) "obb" = ( /obj/structure/target_stake, /obj/effect/turf_decal/stripes/line{ @@ -84063,6 +84055,20 @@ }, /turf/open/floor/plasteel/dark, /area/crew_quarters/cryopod) +"ram" = ( +/obj/machinery/computer/arcade{ + icon_state = "arcade"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/security/prison) +"roa" = ( +/obj/structure/chair/stool, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/security/prison) "rzX" = ( /obj/structure/chair/office/light{ dir = 1; @@ -84076,6 +84082,17 @@ }, /turf/open/floor/plasteel/white, /area/science/lab) +"rLV" = ( +/obj/structure/table, +/obj/item/folder, +/obj/item/paper/guides/jobs/hydroponics, +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/item/pen, +/obj/item/storage/crayons, +/turf/open/floor/plasteel, +/area/security/prison) "rMS" = ( /obj/machinery/status_display/supply, /turf/closed/wall, @@ -84271,15 +84288,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"uHA" = ( -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/structure/cable/yellow{ - icon_state = "2-8" - }, -/turf/open/floor/plasteel, -/area/security/prison) "uJU" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -84364,10 +84372,6 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space) -"vPN" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, -/area/medical/surgery) "wdu" = ( /obj/structure/grille, /obj/structure/lattice, @@ -84440,17 +84444,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/misc_lab) -"xcb" = ( -/obj/structure/table, -/obj/item/folder, -/obj/item/paper/guides/jobs/hydroponics, -/obj/structure/cable/yellow{ - icon_state = "1-2" - }, -/obj/item/pen, -/obj/item/storage/crayons, -/turf/open/floor/plasteel, -/area/security/prison) "xeC" = ( /obj/machinery/light, /turf/open/floor/plasteel/dark, @@ -84507,6 +84500,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) +"xIi" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/structure/cable/yellow{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel, +/area/security/prison) "xVl" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -104237,7 +104239,7 @@ cia cia cpX cia -vPN +lWL cia ceu dyg @@ -106710,11 +106712,11 @@ aaa aaf aaf aay -xcb -uHA +rLV +xIi abC -kwg -uHA +jhu +xIi abC abC acr @@ -106968,10 +106970,10 @@ aaf aaa aax abl -oba -lmg +roa +ram aax -kRT +iCn aaR aaR aaI diff --git a/_maps/map_files/Mining/Lavaland.dmm b/_maps/map_files/Mining/Lavaland.dmm index de42e1ac63..99c536bd3c 100644 --- a/_maps/map_files/Mining/Lavaland.dmm +++ b/_maps/map_files/Mining/Lavaland.dmm @@ -3571,14 +3571,6 @@ }, /turf/open/floor/plating/asteroid/basalt/lava_land_surface, /area/lavaland/surface/outdoors) -"Wt" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall, -/area/mine/laborcamp/security) -"Wz" = ( -/obj/effect/mapping_helpers/planet_z, -/turf/open/lava/smooth/lava_land_surface, -/area/lavaland/surface/outdoors) "WA" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -3630,26 +3622,6 @@ }, /turf/open/floor/plasteel, /area/mine/production) -"WF" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall, -/area/mine/laborcamp) -"WH" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall, -/area/mine/eva) -"WI" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall, -/area/mine/production) -"WJ" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall/r_wall, -/area/mine/maintenance) -"WK" = ( -/obj/effect/baseturf_helper/lava_land/surface, -/turf/closed/wall, -/area/mine/living_quarters) (1,1,1) = {" aa @@ -3906,7 +3878,7 @@ aj aj aj aj -Wz +aj "} (2,1,1) = {" aa @@ -8751,7 +8723,7 @@ aq WB aq bi -WF +aq WC aq bZ @@ -9012,7 +8984,7 @@ az az aq ca -Wt +ca ca aj aj @@ -12102,7 +12074,7 @@ ai cQ dk dA -WJ +cQ ed er eM @@ -13134,7 +13106,7 @@ dR ef es dZ -WK +cM fg cM cM @@ -20320,9 +20292,9 @@ bt bH bV cq -WH +bf +bq bq -WI db bP bP diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index be4128208a..b9462f214d 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -2812,7 +2812,6 @@ /obj/structure/table, /obj/item/storage/box/firingpins, /obj/item/storage/box/firingpins, -/obj/item/key/security, /obj/machinery/power/apc/highcap/five_k{ dir = 4; name = "Armory APC"; @@ -3848,8 +3847,7 @@ "akN" = ( /obj/effect/landmark/event_spawn, /obj/structure/rack, -/obj/item/gun/energy/pumpaction/blaster, -/obj/item/gun/energy/pumpaction/blaster, +/obj/item/key/security, /turf/open/floor/plasteel/dark, /area/security/armory) "akO" = ( @@ -24561,12 +24559,6 @@ /obj/machinery/shieldwallgen, /turf/open/floor/plating, /area/maintenance/department/cargo) -"bfQ" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "bfY" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/turf_decal/tile/neutral, @@ -40142,6 +40134,14 @@ /obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) +"bNE" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "bNF" = ( /obj/item/stack/medical/bruise_pack, /turf/open/floor/plasteel/dark, @@ -46926,16 +46926,6 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) -"ceG" = ( -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/structure/rack, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) "ceH" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -51972,12 +51962,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/library/lounge) -"cxW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "cxX" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53159,6 +53143,9 @@ }, /turf/open/floor/plasteel/dark, /area/chapel/office) +"dpc" = ( +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "dps" = ( /obj/machinery/status_display/ai, /turf/closed/wall, @@ -53391,18 +53378,6 @@ /obj/machinery/shieldwallgen/xenobiologyaccess, /turf/open/floor/plating, /area/maintenance/department/engine) -"dQj" = ( -/mob/living/simple_animal/bot/secbot{ - arrest_type = 1; - health = 45; - icon_state = "secbot1"; - idcheck = 1; - name = "Sergeant-at-Armsky"; - on = 1; - weaponscheck = 1 - }, -/turf/open/floor/plasteel/dark, -/area/security/armory) "dSp" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/engine_waste{ dir = 1 @@ -53413,35 +53388,12 @@ /obj/item/chair, /turf/open/floor/wood, /area/maintenance/department/engine) -"dTz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/twohanded/required/kirbyplants{ - icon_state = "plant-10" - }, -/turf/open/floor/plasteel/dark, -/area/chapel/main/monastery) "dTV" = ( /obj/structure/disposalpipe/segment{ dir = 4 }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) -"dUI" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "dVI" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -53472,6 +53424,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"dYe" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "dZj" = ( /obj/machinery/atmospherics/pipe/manifold/green/visible, /obj/machinery/airalarm/engine{ @@ -53495,10 +53453,6 @@ }, /turf/open/floor/plating, /area/lawoffice) -"ebT" = ( -/mob/living/simple_animal/hostile/retaliate/goose, -/turf/open/floor/wood, -/area/maintenance/department/crew_quarters/dorms) "edl" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -53551,6 +53505,13 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"eit" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "eiV" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -53558,26 +53519,20 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) -"ejJ" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "ekU" = ( /obj/effect/decal/cleanable/cobweb{ icon_state = "cobweb2" }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"ekV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "elk" = ( /obj/structure/chair/office/dark, /turf/open/floor/wood, /area/lawoffice) +"epg" = ( +/obj/structure/lattice, +/turf/open/space, +/area/space) "epj" = ( /obj/machinery/cryopod{ dir = 8 @@ -53766,6 +53721,16 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"eNc" = ( +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/obj/structure/rack, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "eNq" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -53790,12 +53755,6 @@ }, /turf/closed/wall, /area/maintenance/department/security/brig) -"eQa" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/department/chapel/monastery) "eQN" = ( /obj/structure/chair/stool, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -53850,6 +53809,12 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"eVT" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "eWi" = ( /obj/structure/cable{ icon_state = "0-4" @@ -53937,9 +53902,6 @@ }, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"ffK" = ( -/turf/open/space/basic, -/area/hallway/secondary/entry) "fhM" = ( /obj/item/storage/secure/safe{ pixel_x = -22 @@ -53966,16 +53928,6 @@ }, /turf/open/floor/plasteel/white, /area/science/explab) -"fjC" = ( -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 3; - name = "3maintenance loot spawner" - }, -/obj/structure/rack, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) "fjD" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 @@ -54201,17 +54153,6 @@ }, /turf/open/floor/engine, /area/engine/supermatter) -"fCC" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) "fFv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/firealarm{ @@ -54671,14 +54612,6 @@ /obj/item/clothing/glasses/welding, /turf/open/floor/plasteel/dark, /area/science/lab) -"gFw" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) "gGy" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -54792,17 +54725,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"gOI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/chapel/dock) "gPV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -54826,6 +54748,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"gTy" = ( +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "gUb" = ( /obj/structure/chair/office/dark{ dir = 4 @@ -54857,14 +54787,6 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) -"haq" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/chapel/dock) "haA" = ( /obj/structure/table, /obj/item/stack/sheet/metal/fifty, @@ -55074,12 +54996,14 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port) -"hCR" = ( -/obj/machinery/light/small, -/turf/open/floor/plating{ - icon_state = "panelscorched" +"hCb" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Monastery Transit" }, -/area/maintenance/department/chapel/monastery) +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, +/area/hallway/secondary/entry) "hDG" = ( /obj/machinery/door/airlock/engineering{ name = "Auxillary Base Construction"; @@ -55463,9 +55387,6 @@ "iqc" = ( /turf/open/floor/plasteel/stairs/right, /area/maintenance/department/crew_quarters/dorms) -"irD" = ( -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "irM" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/line{ @@ -55505,6 +55426,18 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"ivO" = ( +/mob/living/simple_animal/bot/secbot{ + arrest_type = 1; + health = 45; + icon_state = "secbot1"; + idcheck = 1; + name = "Sergeant-at-Armsky"; + on = 1; + weaponscheck = 1 + }, +/turf/open/floor/plasteel/dark, +/area/security/armory) "iwe" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/blue{ @@ -55642,6 +55575,21 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"iLR" = ( +/obj/structure/table, +/obj/structure/bedsheetbin, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window/reinforced, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "iPj" = ( /obj/machinery/igniter{ id = "xenoigniter"; @@ -55672,6 +55620,19 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"iPH" = ( +/obj/machinery/vr_sleeper{ + icon_state = "sleeper"; + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "iPO" = ( /obj/machinery/door/poddoor/shutters{ id = "aux_base_shutters"; @@ -55724,6 +55685,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/cargo) +"iXx" = ( +/obj/machinery/light/small, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "jcT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -55744,13 +55711,6 @@ dir = 1 }, /area/hallway/secondary/exit/departure_lounge) -"jfr" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "jgr" = ( /obj/machinery/door/airlock/grunge{ name = "Library" @@ -56013,6 +55973,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"jSa" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/chapel/main/monastery) "jTh" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56034,14 +55998,6 @@ }, /turf/open/floor/carpet, /area/lawoffice) -"jTN" = ( -/obj/structure/window/reinforced{ - dir = 4 - }, -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "jTU" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/structure/cable/yellow{ @@ -56211,16 +56167,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"koE" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "kpK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, /turf/open/floor/plating, /area/maintenance/department/engine) -"kqV" = ( -/obj/structure/lattice, -/turf/open/space, -/area/space) "krU" = ( /obj/structure/chair{ dir = 4 @@ -56234,10 +56190,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) -"kuT" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/maintenance/department/engine) "kvj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56295,15 +56247,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"kzK" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) "kAa" = ( /obj/structure/chair{ dir = 8 @@ -56407,9 +56350,23 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"kGc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/white, +"kGe" = ( +/obj/structure/transit_tube/horizontal, +/obj/structure/sign/departments/holy{ + pixel_x = -32 + }, +/turf/open/floor/plating, +/area/hallway/secondary/entry) +"kIc" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Monastery Transit" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, /area/hallway/secondary/entry) "kIo" = ( /obj/structure/table, @@ -56445,16 +56402,6 @@ /obj/structure/closet, /turf/open/floor/plating, /area/maintenance/department/cargo) -"kLT" = ( -/obj/effect/spawner/lootdrop/maintenance, -/obj/structure/rack, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) "kNf" = ( /obj/machinery/door/window/northleft{ base_state = "right"; @@ -56522,6 +56469,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"kSb" = ( +/obj/structure/lattice, +/obj/structure/grille, +/turf/open/space/basic, +/area/space) "kSF" = ( /obj/structure/cable{ icon_state = "1-4" @@ -56559,6 +56511,12 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"kVy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "kWQ" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible, /obj/structure/cable/yellow{ @@ -56572,6 +56530,23 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"kXx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/item/twohanded/required/kirbyplants{ + icon_state = "plant-10" + }, +/turf/open/floor/plasteel/dark, +/area/chapel/main/monastery) "kYM" = ( /obj/structure/extinguisher_cabinet{ pixel_x = 27 @@ -56708,20 +56683,12 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) -"ltB" = ( -/obj/structure/cable{ - icon_state = "2-8" +"lxI" = ( +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plating{ + icon_state = "platingdmg1" }, -/turf/open/floor/plasteel/dark, -/area/security/prison) -"lxm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/chapel/dock) +/area/maintenance/department/chapel/monastery) "lzJ" = ( /obj/structure/closet/crate/bin, /turf/open/floor/carpet, @@ -57027,6 +56994,11 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) +"mgU" = ( +/obj/effect/landmark/carpspawn, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "mhl" = ( /obj/machinery/power/emitter, /obj/machinery/light{ @@ -57060,12 +57032,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"mjk" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "mjn" = ( /obj/machinery/jukebox, /turf/open/floor/plasteel/dark, @@ -57189,15 +57155,6 @@ /obj/item/gun/ballistic/shotgun/toy, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"mwl" = ( -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) "mwG" = ( /obj/effect/turf_decal/tile/yellow, /obj/effect/turf_decal/tile/yellow{ @@ -57206,12 +57163,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/engine/engineering) -"mxu" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "mxy" = ( /obj/machinery/power/terminal{ dir = 4 @@ -57345,6 +57296,14 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/maintenance/department/science) +"mSY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, +/area/chapel/dock) "mTS" = ( /obj/structure/cable{ icon_state = "4-8" @@ -57354,6 +57313,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"mVD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "mVM" = ( /turf/open/floor/plating/airless, /area/space/nearstation) @@ -57431,6 +57396,12 @@ /obj/item/chair/stool, /turf/open/floor/carpet, /area/maintenance/department/crew_quarters/dorms) +"nho" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "nih" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/costume, @@ -57470,11 +57441,6 @@ /obj/item/stack/spacecash/c10, /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) -"nog" = ( -/turf/open/floor/plating{ - icon_state = "panelscorched" - }, -/area/maintenance/department/chapel/monastery) "noC" = ( /obj/machinery/vending/kink, /turf/open/floor/wood, @@ -57706,6 +57672,11 @@ }, /turf/open/floor/engine, /area/science/explab) +"nKo" = ( +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "nLl" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -57832,20 +57803,12 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/secondary/exit/departure_lounge) -"nYM" = ( -/obj/machinery/light, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "nZw" = ( /obj/machinery/door/airlock/abandoned{ name = "Backup Laboratory" }, /turf/open/floor/plating, /area/maintenance/department/cargo) -"obh" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "obj" = ( /obj/structure/cable{ icon_state = "4-8" @@ -57870,6 +57833,10 @@ initial_gas_mix = "o2=0.01;n2=0.01" }, /area/maintenance/department/science) +"odM" = ( +/obj/effect/landmark/barthpot, +/turf/open/floor/carpet, +/area/library/lounge) "oep" = ( /obj/structure/table/glass, /obj/item/paper_bin, @@ -57902,14 +57869,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"ogn" = ( -/obj/structure/lattice, -/obj/structure/window/reinforced{ - dir = 8 - }, -/obj/structure/window/reinforced, -/turf/open/space, -/area/space/nearstation) "ohR" = ( /obj/item/chair, /turf/open/floor/plating, @@ -58003,13 +57962,15 @@ }, /turf/open/floor/plating/airless, /area/space/nearstation) -"ovg" = ( -/obj/structure/transit_tube/horizontal, -/obj/structure/sign/departments/holy{ - pixel_x = -32 +"ovB" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 }, -/turf/open/floor/plating, -/area/hallway/secondary/entry) +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "ovM" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 4 @@ -58046,6 +58007,10 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel, /area/storage/primary) +"ozO" = ( +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/plating, +/area/maintenance/department/engine) "oAw" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -58415,6 +58380,12 @@ }, /turf/open/floor/plating, /area/science/explab) +"peE" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "pfz" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -58447,6 +58418,23 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"phS" = ( +/obj/machinery/conveyor{ + dir = 8; + id = "garbage" + }, +/turf/open/floor/plating, +/area/maintenance/disposal) +"pia" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/rack, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "pjH" = ( /obj/structure/cable{ icon_state = "1-2" @@ -58498,6 +58486,17 @@ }, /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/exit/departure_lounge) +"ppY" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/door/airlock/public/glass{ + name = "Monastery Transit" + }, +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, +/area/chapel/dock) "prQ" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -58512,21 +58511,6 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/engine, /area/engine/supermatter) -"pua" = ( -/obj/structure/table, -/obj/structure/bedsheetbin, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window/reinforced, -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) "puw" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, @@ -58576,6 +58560,9 @@ /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/medical/chemistry) +"pyw" = ( +/turf/open/space/basic, +/area/hallway/secondary/entry) "pBD" = ( /obj/structure/cable{ icon_state = "0-8" @@ -58602,12 +58589,6 @@ }, /turf/open/floor/plating, /area/engine/engineering) -"pDd" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "pDP" = ( /obj/machinery/vending/assist, /obj/effect/turf_decal/tile/neutral{ @@ -58672,14 +58653,6 @@ /obj/structure/closet/crate, /turf/open/floor/plating, /area/maintenance/department/cargo) -"pKg" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) "pMG" = ( /obj/structure/sink{ dir = 8; @@ -58928,6 +58901,10 @@ }, /turf/open/floor/engine, /area/engine/engineering) +"qni" = ( +/obj/machinery/smartfridge/organ/preloaded, +/turf/closed/wall, +/area/medical/surgery) "qnT" = ( /obj/machinery/iv_drip, /turf/open/floor/plating, @@ -59199,6 +59176,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"qWo" = ( +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/maintenance/department/chapel/monastery) "qWG" = ( /obj/structure/closet/emcloset/anchored, /turf/open/floor/plating, @@ -59985,6 +59967,22 @@ }, /turf/open/space, /area/space/nearstation) +"tbF" = ( +/obj/structure/window/reinforced, +/obj/structure/window/reinforced{ + dir = 4 + }, +/obj/structure/lattice, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) +"tbY" = ( +/obj/structure/closet/emcloset, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "tcY" = ( /obj/structure/cable{ icon_state = "4-8" @@ -60116,6 +60114,19 @@ }, /turf/open/floor/plasteel/dark, /area/engine/engineering) +"tnP" = ( +/obj/machinery/seed_extractor, +/obj/effect/turf_decal/tile/green{ + dir = 1 + }, +/obj/effect/turf_decal/tile/green{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/security/prison) "tnY" = ( /obj/machinery/button/door{ id = "aux_base_shutters"; @@ -60294,11 +60305,6 @@ icon_state = "panelscorched" }, /area/maintenance/department/engine) -"tSk" = ( -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space/nearstation) "tSL" = ( /turf/open/floor/plating{ icon_state = "panelscorched" @@ -60325,25 +60331,6 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"tZk" = ( -/obj/machinery/door/airlock/public/glass{ - name = "Monastery Transit" - }, -/turf/open/floor/plasteel/white{ - heat_capacity = 1e+006 - }, -/area/hallway/secondary/entry) -"tZu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) -"uau" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "uaC" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -60376,11 +60363,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/mixing) -"ucT" = ( -/obj/effect/landmark/carpspawn, -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "udl" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -60555,6 +60537,15 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/science/explab) +"utg" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/security/prison) "uug" = ( /turf/open/floor/plating{ icon_state = "platingdmg1" @@ -60615,6 +60606,10 @@ /obj/machinery/field/generator, /turf/open/floor/plating, /area/maintenance/department/engine) +"uxI" = ( +/obj/machinery/light, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "uxP" = ( /obj/structure/disposalpipe/segment{ dir = 9 @@ -60709,16 +60704,6 @@ }, /turf/closed/wall/r_wall, /area/engine/engineering) -"uJI" = ( -/obj/structure/window/reinforced{ - dir = 8 - }, -/turf/open/space/basic, -/area/space) -"uKS" = ( -/obj/machinery/smartfridge/organ/preloaded, -/turf/closed/wall, -/area/medical/surgery) "uLF" = ( /obj/structure/cable{ icon_state = "1-4" @@ -60755,10 +60740,6 @@ /obj/effect/turf_decal/plaque, /turf/open/floor/plating, /area/maintenance/department/engine) -"uNP" = ( -/obj/effect/landmark/barthpot, -/turf/open/floor/carpet, -/area/library/lounge) "uQR" = ( /obj/item/ammo_casing/shotgun/beanbag, /turf/open/floor/plating, @@ -60772,11 +60753,6 @@ }, /turf/open/floor/engine, /area/engine/engineering) -"uTY" = ( -/turf/open/floor/plating{ - icon_state = "platingdmg3" - }, -/area/maintenance/department/chapel/monastery) "uUQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance"; @@ -60803,19 +60779,6 @@ /obj/item/stamp/law, /turf/open/floor/carpet, /area/lawoffice) -"uWP" = ( -/obj/machinery/seed_extractor, -/obj/effect/turf_decal/tile/green{ - dir = 1 - }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/security/prison) "uXG" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -60838,14 +60801,13 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) -"uYk" = ( -/obj/structure/window/reinforced, +"uZb" = ( +/obj/structure/lattice, /obj/structure/window/reinforced{ - dir = 4 + dir = 8 }, -/obj/structure/lattice, -/obj/structure/lattice, -/turf/open/space/basic, +/obj/structure/window/reinforced, +/turf/open/space, /area/space/nearstation) "vay" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -60853,6 +60815,22 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"vaB" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) +"vco" = ( +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) +"veF" = ( +/obj/structure/window/reinforced{ + dir = 8 + }, +/turf/open/space/basic, +/area/space) "veM" = ( /obj/machinery/suit_storage_unit/rd, /obj/machinery/light{ @@ -60980,11 +60958,6 @@ initial_gas_mix = "o2=0.01;n2=0.01" }, /area/maintenance/department/science) -"vsc" = ( -/obj/structure/lattice, -/obj/structure/grille, -/turf/open/space/basic, -/area/space) "vsk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -61077,6 +61050,12 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) +"vxZ" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "vzz" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -61149,13 +61128,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"vFZ" = ( -/obj/structure/closet/emcloset, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/white, -/area/hallway/secondary/entry) "vGg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 9 @@ -61479,19 +61451,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) -"wxa" = ( -/obj/machinery/vr_sleeper{ - icon_state = "sleeper"; - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/turf/open/floor/plasteel/cafeteria, -/area/security/prison) "wxb" = ( /obj/structure/cable{ icon_state = "4-8" @@ -61539,6 +61498,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/crew_quarters/bar) +"wDe" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Monastery Transit" + }, +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, +/area/chapel/dock) "wDl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/turf_decal/stripes/corner, @@ -61741,6 +61708,10 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"wUc" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "wUf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, @@ -61751,10 +61722,6 @@ icon_state = "panelscorched" }, /area/maintenance/department/security/brig) -"wUW" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plating, -/area/maintenance/department/chapel/monastery) "wVC" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=Sci"; @@ -61779,10 +61746,25 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"wYJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) "wYK" = ( /obj/machinery/power/supermatter_crystal/engine, /turf/open/floor/engine, /area/engine/supermatter) +"wZs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white{ + heat_capacity = 1e+006 + }, +/area/hallway/secondary/entry) "xah" = ( /obj/structure/cable{ icon_state = "1-2" @@ -61841,6 +61823,14 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/wood, /area/lawoffice) +"xeN" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white, +/area/hallway/secondary/entry) +"xgh" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/department/chapel/monastery) "xgG" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -61871,10 +61861,6 @@ }, /turf/open/floor/plasteel, /area/engine/engineering) -"xhW" = ( -/obj/structure/lattice, -/turf/open/space/basic, -/area/space) "xja" = ( /obj/machinery/light/small{ dir = 4 @@ -61898,6 +61884,10 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"xjg" = ( +/mob/living/simple_animal/hostile/retaliate/goose, +/turf/open/floor/wood, +/area/maintenance/department/crew_quarters/dorms) "xjK" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -62130,10 +62120,6 @@ /obj/structure/disposalpipe/segment, /turf/open/floor/plasteel/dark, /area/lawoffice) -"xNw" = ( -/obj/machinery/door/airlock/maintenance, -/turf/open/floor/plating, -/area/chapel/main/monastery) "xNx" = ( /obj/structure/lattice, /obj/structure/disposalpipe/junction/flip, @@ -62176,13 +62162,10 @@ /obj/effect/mapping_helpers/airlock/unres, /turf/open/floor/plasteel/freezer, /area/storage/emergency/port) -"xRE" = ( -/obj/machinery/conveyor{ - dir = 8; - id = "garbage" - }, +"xSd" = ( +/obj/machinery/light/small, /turf/open/floor/plating, -/area/maintenance/disposal) +/area/maintenance/department/chapel/monastery) "xSX" = ( /obj/machinery/airalarm/unlocked{ pixel_y = 23 @@ -62196,6 +62179,16 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"xVt" = ( +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/structure/rack, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "xWl" = ( /obj/item/pen, /obj/item/paper_bin{ @@ -62207,6 +62200,11 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"xYV" = ( +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/department/chapel/monastery) "ybX" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance, @@ -79927,7 +79925,7 @@ ckT xhj xhj cwK -uNP +odM xhj cxn xhj @@ -80378,7 +80376,7 @@ aaa aaa aaa aaa -ffK +pyw bsl btL aZx @@ -80394,11 +80392,11 @@ aaa aaa aaa aaa -xhW +koE aqG bGE bKf -lxm +mSY bMw bNy bNw @@ -80635,7 +80633,7 @@ aaa aaa aaa aaa -ffK +pyw aZx bcX aZx @@ -80650,12 +80648,12 @@ aaa aaa aaa aaa -xhW -xhW +koE +koE aqG bGE bKf -lxm +mSY bMx bNz bHM @@ -80906,13 +80904,13 @@ aaa aaa aaa aaa -xhW -xhW -xhW +koE +koE +koE aqG bGE -haq -gOI +wDe +ppY bHM bNA bHM @@ -80949,7 +80947,7 @@ cvc cho cvk cdx -dTz +kXx csS cfm cwe @@ -81162,11 +81160,11 @@ bVp bVp bVp bVp -jfr -jTN -jfr -jfr -uYk +eit +gTy +eit +eit +tbF aZx bIY bLs @@ -81207,7 +81205,7 @@ ciF cuQ cfm cfm -xNw +jSa cfm cwe ckp @@ -81426,7 +81424,7 @@ aZx aZx aZx bIY -pKg +wZs aZx amC aaa @@ -81435,7 +81433,7 @@ aby aby abI bSn -ogn +uZb cqS bNs bQe @@ -81672,18 +81670,18 @@ aaa aaa bGI aZx -vFZ -tZu -uau -uau -uau -tZu -uau -dUI -irD -mjk +tbY +wYJ +xeN +xeN +xeN +wYJ +xeN +eVT +dpc +vxZ bIY -mxu +nho aZx amB aht @@ -81693,7 +81691,7 @@ aaa abI abI abI -ogn +uZb bNs bNs bNs @@ -81721,7 +81719,7 @@ chr chL cfm cfN -obh +xSd cfN cfN cfN @@ -81929,18 +81927,18 @@ aaa aaa bGI aZx -cxW -irD -irD -irD -ejJ -kGc -kGc -kGc -kGc -kGc -kGc -ekV +mVD +dpc +dpc +dpc +wUc +vaB +vaB +vaB +vaB +vaB +vaB +kVy aZx amC aaa @@ -81951,7 +81949,7 @@ aaa aaa abI aaa -uJI +veF bQR bNs bNs @@ -82186,8 +82184,8 @@ aaa aaa bGI aZx -cxW -irD +mVD +dpc aZx aZx aZx @@ -82443,19 +82441,19 @@ aaa aaa aqG aZx -cxW -irD +mVD +dpc aZx -xhW -xhW -xhW -xhW -xhW -xhW -xhW -xhW -xhW -xhW +koE +koE +koE +koE +koE +koE +koE +koE +koE +koE amD aaa aht @@ -82697,11 +82695,11 @@ bon aZx aaa aaa -xhW +koE aqG aZx -cxW -irD +mVD +dpc aZx bBV bDf @@ -82957,12 +82955,12 @@ aZx aZx aZx aZx -cxW -nYM +mVD +uxI bAI -kqV +epg abI -xhW +koE abI aaa bva @@ -83006,7 +83004,7 @@ cfN cfN cfN cfN -hCR +iXx cjm cfN cfN @@ -83136,7 +83134,7 @@ abI aen aet aeH -bfQ +peE afo afG aeU @@ -83214,8 +83212,8 @@ bbR bbR bbR aZx -fCC -tZk +kIc +hCb bAJ bBX bBX @@ -83263,9 +83261,9 @@ cfN cfN cfN cfN -nog +xYV cjm -xhW +koE aaa aaa aaa @@ -83392,8 +83390,8 @@ adR aaa aem aeu -uWP -ltB +tnP +dYe aeH afH aeH @@ -83473,7 +83471,7 @@ baK aZx bxY bzz -ovg +kGe bBX bDg bEj @@ -83520,10 +83518,10 @@ cfN cfN cfN cfN -uTY +qWo cjm cjm -xhW +koE aaa aaa aaa @@ -83763,22 +83761,22 @@ bIZ cba cbT bDi -kuT +ozO cwA cwA cwA cwA -pDd +vco cwA cwA cwA cwA -nog -gFw -nog -uTY -eQa -ceG +xYV +bNE +xYV +qWo +lxI +xVt cjm aht aaa @@ -83906,8 +83904,8 @@ adR aaa aem aeW -mwl -kzK +ovB +utg afr agy agc @@ -84023,19 +84021,19 @@ ccO bIZ cjm cjm -wUW -wUW +xgh +xgh cjm cjm cjm -wUW -wUW +xgh +xgh cjm cjm cjm cjm -fjC -kLT +eNc +pia cjm aht aaa @@ -84163,9 +84161,9 @@ adR aaa aem aeX -pua -wxa -wxa +iLR +iPH +iPH agy agd agp @@ -84278,10 +84276,10 @@ bva bNK bva bva -xhW -ucT -vsc -vsc +koE +mgU +kSb +kSb aht aht mau @@ -84547,11 +84545,11 @@ aaa aaa aaa aaa -vsc -vsc -xhW -xhW -tSk +kSb +kSb +koE +koE +nKo aaa aaa aaa @@ -85207,7 +85205,7 @@ aiM ajh ajR akN -dQj +ivO amj amX anH @@ -92219,7 +92217,7 @@ bFU bFU bIn bJt -uKS +qni bFU bFU bFU @@ -99337,7 +99335,7 @@ cBk jhD cBo alQ -ebT +xjg cBw noC aiS @@ -108109,7 +108107,7 @@ aaa aLm aLm aNU -xRE +phS dqY aRv sZh @@ -108366,7 +108364,7 @@ aaa aLm aME eFG -xRE +phS dqY aRw sqQ @@ -108623,7 +108621,7 @@ aaa aLo aMF aNV -xRE +phS cvf aQn sqQ @@ -108880,7 +108878,7 @@ aaa aLo aMG aNX -xRE +phS xer aRy aSn diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 7e095329af..6129d263fd 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2108,10 +2108,6 @@ }, /turf/closed/indestructible/riveted, /area/space) -"fy" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/tdome/arena_source) "fz" = ( /turf/open/floor/plasteel, /area/tdome/arena_source) @@ -4830,7 +4826,7 @@ pixel_x = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "mb" = ( /obj/structure/table/reinforced, @@ -6429,7 +6425,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "oX" = ( /obj/structure/bookcase/random, @@ -6800,7 +6796,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "pH" = ( /obj/structure/table/wood, @@ -7316,7 +7312,7 @@ color = "#596479"; dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "qQ" = ( /obj/machinery/door/airlock/centcom{ @@ -8702,7 +8698,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "tX" = ( /obj/machinery/door/airlock{ @@ -8717,7 +8713,7 @@ /area/centcom/supplypod) "tZ" = ( /obj/structure/chair/wood/normal, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "uc" = ( /obj/effect/turf_decal/tile/green{ @@ -9330,7 +9326,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "vt" = ( /obj/structure/rack, @@ -9338,7 +9334,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "vu" = ( /obj/structure/chair/stool, @@ -10363,7 +10359,7 @@ /obj/machinery/light{ dir = 8 }, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "yg" = ( /obj/structure/chair, @@ -10611,7 +10607,7 @@ /obj/structure/table/wood/bar, /obj/structure/safe/floor, /obj/item/seeds/cherry/bomb, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "yN" = ( /obj/structure/table/reinforced, @@ -11058,6 +11054,9 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) +"zT" = ( +/turf/open/indestructible/boss/air, +/area/centcom/holding) "zU" = ( /obj/structure/closet/crate/freezer, /turf/open/floor/plasteel/cafeteria, @@ -11342,7 +11341,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "AD" = ( /obj/machinery/door/airlock/centcom{ @@ -11583,12 +11582,12 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Bs" = ( /obj/structure/table/wood, /obj/machinery/computer/libraryconsole/bookmanagement, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Bu" = ( /obj/structure/table/wood, @@ -12465,11 +12464,11 @@ /obj/machinery/vr_sleeper{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "CV" = ( /obj/structure/chair/stool, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "CX" = ( /obj/structure/closet/secure_closet/security, @@ -12663,12 +12662,16 @@ /obj/machinery/vr_sleeper{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Dk" = ( /obj/structure/table, /turf/open/floor/plasteel/cafeteria, /area/syndicate_mothership) +"Dl" = ( +/obj/structure/mineral_door/paperframe, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Do" = ( /obj/effect/turf_decal/tile/bar, /obj/effect/turf_decal/tile/bar{ @@ -13475,21 +13478,21 @@ /obj/structure/table/wood, /obj/item/instrument/piano_synth, /obj/item/instrument/guitar, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fb" = ( /obj/structure/piano, /obj/machinery/light{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fc" = ( /obj/structure/sign/barsign{ pixel_y = 32 }, /obj/structure/chair/stool, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fg" = ( /obj/structure/flora/grass/brown, @@ -13506,11 +13509,11 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fj" = ( /obj/machinery/vending/cigarette, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Fm" = ( /obj/machinery/shower{ @@ -13798,7 +13801,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "FX" = ( /turf/open/floor/plasteel/stairs, @@ -13972,7 +13975,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Gu" = ( /obj/machinery/door/airlock/silver{ @@ -14345,7 +14348,7 @@ /obj/structure/chair/wood/wings{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ha" = ( /obj/effect/turf_decal/tile/brown{ @@ -14431,7 +14434,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Hn" = ( /obj/structure/sink{ @@ -14653,7 +14656,7 @@ /area/space) "HH" = ( /obj/machinery/light, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "HI" = ( /obj/structure/sink{ @@ -14777,7 +14780,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "HR" = ( /obj/structure/sink{ @@ -15117,10 +15120,6 @@ }, /turf/open/floor/plasteel, /area/tdome/tdomeobserve) -"Is" = ( -/obj/effect/turf_decal/delivery, -/turf/open/floor/plasteel, -/area/tdome/arena) "It" = ( /turf/open/floor/plasteel, /area/tdome/arena) @@ -16220,7 +16219,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "KU" = ( /obj/structure/closet/emcloset, @@ -16577,7 +16576,7 @@ /obj/effect/mob_spawn/human/ghostcafe{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Mt" = ( /obj/structure/window/reinforced{ @@ -16586,7 +16585,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Mu" = ( /obj/machinery/light{ @@ -16602,7 +16601,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Mv" = ( /obj/structure/table/reinforced, @@ -16618,7 +16617,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "My" = ( /obj/docking_port/stationary{ @@ -16687,11 +16686,11 @@ /obj/machinery/light/small{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "MM" = ( /obj/structure/window/reinforced, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "MP" = ( /obj/machinery/light{ @@ -16703,7 +16702,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "MS" = ( /obj/structure/table, @@ -16750,7 +16749,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Nk" = ( /obj/machinery/door/airlock/centcom{ @@ -16772,7 +16771,7 @@ /obj/item/storage/fancy/candle_box, /obj/item/storage/fancy/candle_box, /obj/item/storage/box/lights/mixed, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nn" = ( /obj/structure/closet/secure_closet/hydroponics{ @@ -16788,7 +16787,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nu" = ( /turf/open/floor/wood, @@ -16806,7 +16805,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Nz" = ( /obj/effect/turf_decal/tile/brown{ @@ -16826,7 +16825,7 @@ /obj/item/reagent_containers/medspray/synthflesh, /obj/item/reagent_containers/medspray/synthflesh, /obj/item/reagent_containers/medspray/synthflesh, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NF" = ( /obj/structure/ladder/unbreakable/binary, @@ -16858,13 +16857,13 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NT" = ( /obj/structure/window/paperframe{ CanAtmosPass = 0 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "NU" = ( /obj/machinery/door/airlock/centcom{ @@ -16934,7 +16933,7 @@ /area/centcom/control) "Ol" = ( /obj/structure/table/wood/fancy, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Om" = ( /obj/effect/turf_decal/tile/brown, @@ -17003,7 +17002,7 @@ /obj/machinery/light{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OH" = ( /obj/effect/spawner/structure/window/reinforced, @@ -17013,7 +17012,7 @@ /obj/structure/mineral_door/paperframe{ name = "Dojo" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OM" = ( /obj/machinery/light{ @@ -17036,7 +17035,7 @@ /obj/item/clothing/under/kilt, /obj/structure/closet, /obj/item/clothing/under/roman, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "OV" = ( /obj/machinery/light{ @@ -17060,14 +17059,14 @@ /area/centcom/supplypod) "Ph" = ( /obj/structure/closet/crate/bin, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Pl" = ( /obj/structure/window/reinforced, /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Pn" = ( /turf/closed/indestructible/fakedoor{ @@ -17078,7 +17077,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Pq" = ( /obj/structure/urinal{ @@ -17119,7 +17118,7 @@ /obj/structure/window/reinforced{ dir = 4 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "PD" = ( /turf/open/floor/plasteel/cafeteria, @@ -17131,7 +17130,7 @@ /obj/machinery/light{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PG" = ( /obj/structure/table/reinforced, @@ -17150,7 +17149,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PJ" = ( /obj/effect/turf_decal/stripes/line{ @@ -17160,7 +17159,7 @@ /area/syndicate_mothership) "PL" = ( /obj/machinery/autolathe, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PM" = ( /obj/machinery/vending/clothing{ @@ -17180,7 +17179,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PP" = ( /obj/machinery/door/airlock/external{ @@ -17214,7 +17213,7 @@ /area/holodeck/rec_center/firingrange) "PX" = ( /obj/machinery/computer/arcade/battle, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PY" = ( /obj/effect/turf_decal/tile/green{ @@ -17227,7 +17226,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "PZ" = ( /obj/effect/turf_decal/delivery, @@ -17256,7 +17255,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Qm" = ( /obj/singularity/wizard/mapped, @@ -17311,7 +17310,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QH" = ( /obj/machinery/chem_master/condimaster{ @@ -17329,7 +17328,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QI" = ( /obj/structure/toilet{ @@ -17346,7 +17345,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "QN" = ( /obj/machinery/light{ @@ -17401,7 +17400,7 @@ /area/holodeck/rec_center/basketball) "Ra" = ( /obj/machinery/door/window/eastright, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Rb" = ( /obj/effect/turf_decal/stripes/corner{ @@ -17421,7 +17420,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Re" = ( /obj/structure/mineral_door/paperframe, @@ -17441,7 +17440,7 @@ /obj/structure/chair/wood/normal{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rj" = ( /obj/machinery/vending/hydroseeds, @@ -17455,7 +17454,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rl" = ( /obj/structure/mirror{ @@ -17469,7 +17468,7 @@ /obj/structure/chair/wood/wings{ dir = 3 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ro" = ( /obj/structure/closet{ @@ -17488,14 +17487,14 @@ /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, /obj/item/tank/internals/plasmaman/belt/full, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Rq" = ( /obj/machinery/light{ dir = 1; light_color = "#cee5d2" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ru" = ( /obj/structure/fireplace, @@ -17542,7 +17541,7 @@ pixel_x = -3; pixel_y = 3 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RR" = ( /turf/open/floor/plasteel, @@ -17556,13 +17555,13 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RX" = ( /obj/structure/chair/comfy/brown{ color = "#596479" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "RZ" = ( /obj/effect/turf_decal/tile/bar, @@ -17582,7 +17581,7 @@ /turf/open/floor/plasteel/dark, /area/syndicate_mothership) "Sd" = ( -/turf/open/floor/carpet/black, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sf" = ( /obj/structure/chair{ @@ -17616,7 +17615,7 @@ /obj/machinery/defibrillator_mount/loaded{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sw" = ( /obj/machinery/hydroponics/constructable, @@ -17633,7 +17632,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Sy" = ( /obj/effect/turf_decal/tile/brown{ @@ -17715,7 +17714,7 @@ /obj/item/wallframe/newscaster, /obj/item/paper_bin, /obj/item/pen/fountain, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SV" = ( /obj/effect/turf_decal/tile/bar, @@ -17737,11 +17736,11 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SY" = ( /obj/structure/table/wood, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "SZ" = ( /obj/machinery/door/airlock/wood{ @@ -17752,7 +17751,7 @@ /area/centcom/holding) "Tb" = ( /obj/structure/closet/crate/freezer/blood, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tc" = ( /obj/machinery/button/door{ @@ -17762,7 +17761,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tj" = ( /obj/effect/turf_decal/tile/bar, @@ -17777,7 +17776,7 @@ /obj/item/candle/infinite{ pixel_y = 6 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "To" = ( /turf/open/indestructible/airblock, @@ -17788,7 +17787,7 @@ /obj/item/stack/sheet/metal/fifty, /obj/item/storage/toolbox/mechanical, /obj/item/multitool, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tr" = ( /obj/structure/closet/chefcloset, @@ -17800,7 +17799,7 @@ /obj/structure/flora/ausbushes/ppflowers, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tw" = ( /obj/structure/closet{ @@ -17817,7 +17816,7 @@ /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman, /obj/item/clothing/head/helmet/space/plasmaman, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Tz" = ( /obj/effect/light_emitter, @@ -17847,7 +17846,7 @@ /obj/structure/mirror{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "TM" = ( /mob/living/simple_animal/bot/medbot{ @@ -17856,7 +17855,7 @@ radio_key = null; stationary_mode = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "TO" = ( /obj/effect/turf_decal/tile/bar, @@ -17876,11 +17875,11 @@ /area/syndicate_mothership) "Ud" = ( /obj/effect/landmark/holding_facility, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Uf" = ( /obj/structure/closet/secure_closet, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ug" = ( /obj/machinery/door/poddoor/shuttledock{ @@ -17899,7 +17898,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Uj" = ( /obj/machinery/door/airlock/centcom{ @@ -17934,7 +17933,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, -/turf/open/floor/plasteel/white, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Un" = ( /obj/machinery/door/airlock/centcom{ @@ -17978,11 +17977,11 @@ desc = "Swipe your ID on the closet to claim it. First come first serve, this one is wooden and fancy. Store your stuff here."; name = "Personal ID-Locked Closet" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UE" = ( /obj/structure/chair/stool/bar, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UG" = ( /obj/structure/flora/tree/pine, @@ -18027,11 +18026,11 @@ /obj/structure/chair/wood/wings{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UV" = ( /obj/machinery/computer/arcade, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "UW" = ( /obj/effect/turf_decal/tile/brown{ @@ -18115,7 +18114,7 @@ /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, /obj/machinery/light, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Vv" = ( /obj/structure/table, @@ -18165,7 +18164,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "VO" = ( /turf/closed/indestructible/riveted, @@ -18201,7 +18200,7 @@ /area/space) "Wb" = ( /obj/machinery/door/window/westleft, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "Wc" = ( /obj/machinery/door/airlock/centcom{ @@ -18233,6 +18232,10 @@ }, /turf/open/floor/plating, /area/syndicate_mothership) +"Wl" = ( +/obj/machinery/door/airlock/wood, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "Wr" = ( /turf/open/floor/plasteel/dark, /area/centcom/supplypod) @@ -18243,6 +18246,12 @@ }, /turf/open/floor/wood, /area/centcom/holding) +"Ww" = ( +/obj/structure/bodycontainer/crematorium{ + dir = 4 + }, +/turf/open/indestructible/hotelwood, +/area/centcom/holding) "WC" = ( /obj/structure/table/reinforced, /obj/item/pen, @@ -18283,7 +18292,7 @@ /obj/structure/extinguisher_cabinet{ pixel_y = 32 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "WN" = ( /obj/machinery/button/door{ @@ -18293,7 +18302,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "WO" = ( /obj/effect/turf_decal/tile/brown, @@ -18337,11 +18346,11 @@ /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/palebush, /obj/structure/window/reinforced/fulltile, -/turf/open/floor/grass, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xe" = ( /obj/machinery/vending/autodrobe, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xg" = ( /obj/effect/turf_decal/tile/red{ @@ -18355,9 +18364,6 @@ }, /turf/open/floor/holofloor, /area/holodeck/rec_center/basketball) -"Xk" = ( -/turf/open/floor/wood, -/area/centcom/holding) "Xl" = ( /obj/structure/closet/syndicate/personal, /obj/effect/turf_decal/stripes/line{ @@ -18368,7 +18374,7 @@ "Xn" = ( /obj/structure/bed, /obj/item/bedsheet/random, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xo" = ( /obj/machinery/vending/dinnerware, @@ -18393,7 +18399,7 @@ /area/centcom/supplypod/loading/four) "Xs" = ( /obj/structure/chair/comfy/brown, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xt" = ( /obj/machinery/door/airlock/centcom{ @@ -18416,13 +18422,7 @@ /area/holodeck/rec_center/firingrange) "Xw" = ( /obj/structure/table/wood/fancy/royalblue, -/turf/open/floor/wood, -/area/centcom/holding) -"Xx" = ( -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Xy" = ( /obj/machinery/door/airlock/external{ @@ -18444,7 +18444,7 @@ pixel_y = 25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XE" = ( /obj/machinery/door/airlock/centcom{ @@ -18461,12 +18461,12 @@ /obj/structure/chair/wood/wings{ dir = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XT" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/sashimi, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XU" = ( /obj/machinery/computer/secure_data{ @@ -18477,7 +18477,7 @@ "XX" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/drinks/bottle/sake, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "XY" = ( /obj/machinery/door/poddoor/shutters{ @@ -18494,7 +18494,7 @@ pixel_y = -25; specialfunctions = 4 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yc" = ( /obj/effect/turf_decal/stripes/line, @@ -18512,12 +18512,12 @@ /obj/machinery/defibrillator_mount/loaded{ pixel_y = 28 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yf" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/chawanmushi, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yg" = ( /obj/effect/turf_decal/stripes/corner{ @@ -18529,7 +18529,7 @@ /obj/structure/extinguisher_cabinet{ pixel_x = -27 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yi" = ( /obj/structure/dresser, @@ -18537,13 +18537,13 @@ /area/syndicate_mothership) "Ym" = ( /obj/machinery/computer/arcade/orion_trail, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Yo" = ( /obj/machinery/light{ dir = 8 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Ys" = ( /obj/structure/table/reinforced, @@ -18585,7 +18585,7 @@ /area/centcom/holding) "YL" = ( /obj/machinery/vending/clothing, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "YN" = ( /obj/structure/window/reinforced{ @@ -18598,7 +18598,7 @@ /obj/structure/chair/comfy/brown{ dir = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "YQ" = ( /obj/structure/table, @@ -18609,7 +18609,7 @@ /obj/structure/window/reinforced{ dir = 1 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "YV" = ( /obj/machinery/light{ @@ -18620,10 +18620,7 @@ damtype = "stamina"; force = 30 }, -/turf/open/floor/wood, -/area/centcom/holding) -"YW" = ( -/turf/open/floor/plating, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Za" = ( /obj/machinery/door/airlock/wood{ @@ -18638,7 +18635,7 @@ /obj/item/twohanded/required/kirbyplants{ icon_state = "plant-10" }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Zi" = ( /turf/open/floor/plasteel, @@ -18677,7 +18674,7 @@ radio_key = null; stationary_mode = 1 }, -/turf/open/floor/wood, +/turf/open/indestructible/hotelwood, /area/centcom/holding) "Zz" = ( /obj/effect/landmark/start/nukeop_leader, @@ -18749,7 +18746,7 @@ /obj/structure/window/reinforced{ dir = 8 }, -/turf/open/floor/carpet/black, +/turf/open/indestructible/boss/air, /area/centcom/holding) "ZV" = ( /obj/effect/turf_decal/tile/brown, @@ -43132,13 +43129,13 @@ Rm Tn UT yd -Xk -Xk +Sd +Sd XM NT UV CV -Xk +Sd NT CT oV @@ -43148,15 +43145,15 @@ CT oV CT Nd -Xk -Xk -Xk +Sd +Ww +Sd Nd aa Nd Uf -Xk -Xk +Sd +Sd Nd aa aa @@ -43385,35 +43382,35 @@ Pq ZW ZW Za -Xk -Xk -Xk +Sd +Sd +Sd Tu -Xk -Xk +Sd +Sd Tn NT RQ -Xk -Xk +Sd +Sd NT -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk +Sd HH Nd aa Nd MJ -Xk -YW +Sd +Sd Nd aa aa @@ -43642,35 +43639,35 @@ Pa ZW ZW Nd -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd GY NT UV CV -Xk +Sd NT Dj PF Dj -Xk +Sd Dj PF Dj Nd -Xk -Xk -Xk +Sd +Sd +Sd Nd aa Nd ma -YW -Xk +Sd +Sd Nd aa aa @@ -43899,17 +43896,17 @@ SB ZW Nw Nd -Xk -Xk -Xk +Sd +Sd +Sd Ph -Xk +Sd Tu Vu Nd Gs -Xk -Xk +Sd +Sd Nd Nd Nd @@ -44156,34 +44153,34 @@ Nd Nd Nd Nd -Xk -Xk +Sd +Sd XM QL -Xk -Xk +Sd +Sd XM NT PX CV -Xk +Sd NT -Xk +Sd Yo -Xk -Xk -Xk +Sd +Sd +Sd Yo -Xk +Sd Nd -Xk -Xk +Sd +Sd Yo -Xk -Xk +Sd +Sd Yo -Xk -Xk +Sd +Sd WE Nd aa @@ -44409,38 +44406,38 @@ Nd Nd py Nd -Xk +Sd Yo -Xk -XL -Xk -Xk +Sd +Wl +Sd +Sd Tn Tu -Xk -Xk +Sd +Sd Tn NT Zh -Xk -Xk -Re -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Dl +Sd +Sd +Sd +Sd +Sd +Sd +Sd Qu -Xk -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd Zu Nd aa @@ -44659,45 +44656,45 @@ aa aa Nd PL -Xk +Sd Yo -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd Yh -Xk +Sd Nd Nd Nd Gs -Xk +Sd GY Tu -Xk -Xk +Sd +Sd GY NT Ym CV -Xk +Sd NT -Xk -Xx -Xk -Xk -Xk -Xx -Xk +Sd +MR +Sd +Sd +Sd +MR +Sd Nd -Xk -Xk -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd +Sd +Sd PM Nd aa @@ -44916,7 +44913,7 @@ aa aa Nd Tq -Xk +Sd MG YN Nd @@ -44927,17 +44924,17 @@ Nd Nd Fa KT -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd HH Nd -Xk -Xk -Xk +Sd +Sd +Sd Nd Nd Nd @@ -45172,8 +45169,8 @@ aa aa aa Nd -Xk -Xk +Sd +Sd Rh Mm Nd @@ -45184,17 +45181,17 @@ Nd Fb Sd KT -Xk -Xk +Sd +Sd Sd Sd Sd Sd Sd Re -Xk -Xk -Xk +Sd +Sd +Sd NT vt YV @@ -45207,8 +45204,8 @@ UD tZ SY Nd -Xk -Xk +Sd +Sd Nd SY Ri @@ -45429,8 +45426,8 @@ aa aa aa Nd -Xk -Xk +Sd +Sd Rh ZT Nd @@ -45441,8 +45438,8 @@ Nd Fc Sd KT -Xk -Xk +Sd +Sd Sd Sd Sd @@ -45451,24 +45448,24 @@ Sd Nd Gs Zx -Xk +Sd OL -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk -Xk +Sd +Sd lS -Xk -Xk +Sd +Sd RP -Xk -Xk +Sd +Sd HH Nd aa @@ -45698,34 +45695,34 @@ Nd MR Sd FW -Xk -Xk +Sd +Sd Sd Sd Sd Sd Sd Re -Xk -Xk -Xk +Sd +Sd +Sd NT So XM -Xk +Sd XM XM -Xk +Sd Nd Xn -Xk +Sd Ya Nd -Xk -Xk +Sd +Sd Nd XD -Xk +Sd Xn Nd aa @@ -45944,9 +45941,9 @@ aa aa Nd yM -Xk +Sd Yo -Xk +Sd Nd SG Fh @@ -45955,12 +45952,12 @@ Nd Nd Sd FX -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd HH Nd WM @@ -45972,14 +45969,14 @@ Po Wb Po ZU -Xk +Sd Nd Nd Nd Nd Nd -Xk -Xk +Sd +Sd Nd Nd Nd @@ -46201,9 +46198,9 @@ aa aa Nd OG -Xk -Xk -Xk +Sd +Sd +Sd Nd zX Fh @@ -46213,30 +46210,30 @@ Nd Nd Nd Gs -Xk +Sd XM Tu -Xk -Xk +Sd +Sd XM NT -Xk +Sd Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM -Xk +Sd Nd UD tZ SY Nd -Xk -Xk +Sd +Sd Nd SY Ri @@ -46458,9 +46455,9 @@ aa aa Nd TK -Xk -Xk -Xk +Sd +Sd +Sd Nd QA Fh @@ -46469,12 +46466,12 @@ ED Yo Yf UE -Xk -Xk +Sd +Sd Tn Xd -Xk -Xk +Sd +Sd Tn NT Ro @@ -46482,21 +46479,21 @@ Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM TM Nd Gs -Xk -Xk +Sd +Sd uh -Xk -Xk +Sd +Sd zW -Xk -Xk +Sd +Sd HH Nd aa @@ -46715,23 +46712,23 @@ aa aa Nd YL -Xk -Xk -Xk +Sd +Sd +Sd Nd Xo Fh Fh py -Xk +Sd SY UE -Xk -Xk +Sd +Sd GY Tu -Xk -Xk +Sd +Sd GY NT Tw @@ -46739,21 +46736,21 @@ Ud Ud NT YU -Sd -Sd -Sd +zT +zT +zT MM -Xk +Sd Nd Xn -Xk +Sd Tc Nd -Xk -Xk +Sd +Sd Nd AC -Xk +Sd Xn Nd aa @@ -46972,22 +46969,22 @@ aa aa Nd Xe -Xk -Xk -Xk +Sd +Sd +Sd Nd TB Fh Fh BV -Xk +Sd XT UE -Xk -Xk -Xk +Sd +Sd +Sd Ph -Xk +Sd Qk Vu Nd @@ -47000,7 +46997,7 @@ PA Ra PA Pl -Xk +Sd Nd Nd Nd @@ -47229,42 +47226,42 @@ aa aa Nd Ny -Xk -Xk -Xk +Sd +Sd +Sd Nd Vz Fh YJ QT -Xk +Sd SY UE -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd XM NT -Xk -Xk -Xk +Sd +Sd +Sd NT Ye GY -Xk +Sd GY GY -Xk +Sd Nd Xs Ol YO Nd -Xk -Xk +Sd +Sd Nd RX Xw @@ -47487,44 +47484,44 @@ aa Nd Bs Ri -Xk -Xk +Sd +Sd XL Fh Fh Fh XL -Xk +Sd XX UE -Xk -Xk -Xk +Sd +Sd +Sd Tu -Xk -Xk +Sd +Sd Tn NT -Xk -Xk -Xk +Sd +Sd +Sd OL -Xk -Xk -Xk -Xk -Xk -Xk +Sd +Sd +Sd +Sd +Sd +Sd Nd Gs -Xk -Xk +Sd +Sd SZ -Xk -Xk +Sd +Sd Ws -Xk -Xk +Sd +Sd HH Nd aa @@ -47743,8 +47740,8 @@ aa aa Nd SU -Xk -Xx +Sd +MR Nm Nd SN @@ -47758,13 +47755,13 @@ Fi Tn UT Hm -Xk -Xk +Sd +Sd GY NT -Xk +Sd Ms -Xk +Sd NT vt Mx @@ -47777,8 +47774,8 @@ Ru Of QF Nd -Xk -Xk +Sd +Sd Nd WN Ur @@ -48032,12 +48029,12 @@ Nd Nd Kf WV -Xk +Sd Nd Nd Nd Nd -Xk +Sd zY Rv Nd @@ -60356,14 +60353,14 @@ GM HW HW Il -Is +IF IE IX Jh Jh Js IE -Is +IF JI JP JZ @@ -63954,14 +63951,14 @@ GM HW HW Il -Is +IF IJ IY Jk Jk Jt IJ -Is +IF JI JP Kc @@ -78178,14 +78175,14 @@ fa fn fr fx -fy +fF fE fL fN fN fS fE -fy +fF ab aa aa @@ -81776,14 +81773,14 @@ dA dA dA fx -fy +fF fJ fM fQ fQ fT fJ -fy +fF ab aa aa diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index 74a6796bd2..41b5deb302 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -9,13 +9,12 @@ #define META_GAS_FUSION_POWER 7 //ATMOS //stuff you should probably leave well alone! -#define R_IDEAL_GAS_EQUATION 8.31446261815324 //kPa*L/(K*mol) -#define ONE_ATMOSPHERE 101.325 //kPa -#define TCMB 2.7 // -270.3degC -#define TCRYO 225 // -48.15degC -#define T0C 273.15 // 0degC -#define T20C 293.15 // 20degC -#define STEFANBOLTZMANN (5.670373*10e-8) // W/(m^2*K^4) +#define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) +#define ONE_ATMOSPHERE 101.325 //kPa +#define TCMB 2.7 // -270.3degC +#define TCRYO 225 // -48.15degC +#define T0C 273.15 // 0degC +#define T20C 293.15 // 20degC #define MOLES_CELLSTANDARD (ONE_ATMOSPHERE*CELL_VOLUME/(T20C*R_IDEAL_GAS_EQUATION)) //moles in a 2.5 m^3 cell at 101.325 Pa and 20 degC #define M_CELL_WITH_RATIO (MOLES_CELLSTANDARD * 0.005) //compared against for superconductivity @@ -150,9 +149,9 @@ //OPEN TURF ATMOS #define OPENTURF_DEFAULT_ATMOS "o2=22;n2=82;TEMP=293.15" //the default air mix that open turfs spawn -#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms +#define TCOMMS_ATMOS "n2=100;TEMP=80" //-193,15°C telecommunications. also used for xenobiology slime killrooms #define AIRLESS_ATMOS "TEMP=2.7" //space -#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs +#define FROZEN_ATMOS "o2=22;n2=82;TEMP=180" //-93.15°C snow and ice turfs #define BURNMIX_ATMOS "o2=2500;plasma=5000;TEMP=370" //used in the holodeck burn test program //ATMOSPHERICS DEPARTMENT GAS TANK TURFS diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 47b5c2f602..e29be375e6 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -109,8 +109,16 @@ #define MEDIHOUND_SLEEPER (1<<0) #define EATING_NOISES (1<<1) #define DIGESTION_NOISES (1<<2) +#define BREAST_ENLARGEMENT (1<<3) +#define PENIS_ENLARGEMENT (1<<4) +#define FORCED_FEM (1<<5) +#define FORCED_MASC (1<<6) +#define HYPNO (1<<7) +#define NEVER_HYPNO (1<<8) +#define NO_APHRO (1<<9) +#define NO_ASS_SLAP (1<<10) -#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES) +#define TOGGLES_CITADEL (EATING_NOISES|DIGESTION_NOISES|BREAST_ENLARGEMENT|PENIS_ENLARGEMENT) //component stuff #define COMSIG_COMBAT_TOGGLED "combatmode_toggled" //called by combat mode toggle on all equipped items. args: (mob/user, combatmode) diff --git a/code/__DEFINES/components.dm b/code/__DEFINES/components.dm index 7b2dd8663c..b0cc9030cb 100644 --- a/code/__DEFINES/components.dm +++ b/code/__DEFINES/components.dm @@ -177,6 +177,7 @@ #define COMSIG_MOB_PRE_PLAYER_CHANGE "mob_pre_player_change" //sent to the target mob from base of /mob/transfer_ckey() and /mind/transfer_to(): (our_character, their_character) // #define COMPONENT_STOP_MIND_TRANSFER 1 #define COMSIG_MOB_UPDATE_SIGHT "mob_update_sight" //from base of /mob/update_sight(): () +#define COMSIG_MOB_ON_NEW_MIND "mob_on_new_mind" //called when a new mind is assigned to a mob: () #define COMSIG_MOB_SAY "mob_say" // from /mob/living/say(): (proc args list) #define COMPONENT_UPPERCASE_SPEECH 1 // used to access COMSIG_MOB_SAY argslist diff --git a/code/__DEFINES/dynamic.dm b/code/__DEFINES/dynamic.dm new file mode 100644 index 0000000000..45c1ba9cb2 --- /dev/null +++ b/code/__DEFINES/dynamic.dm @@ -0,0 +1,14 @@ +#define CURRENT_LIVING_PLAYERS 1 +#define CURRENT_LIVING_ANTAGS 2 +#define CURRENT_DEAD_PLAYERS 3 +#define CURRENT_OBSERVERS 4 + +#define NO_ASSASSIN (1<<0) +#define WAROPS_ALWAYS_ALLOWED (1<<1) + +#define ONLY_RULESET (1<<0) +#define HIGHLANDER_RULESET (1<<1) +#define TRAITOR_RULESET (1<<2) +#define MINOR_RULESET (1<<3) + +#define RULESET_STOP_PROCESSING 1 diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index 1b42217fe1..73e900226e 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -38,8 +38,6 @@ require only minor tweaks. #define ZTRAIT_SPACE_RUINS "Space Ruins" #define ZTRAIT_LAVA_RUINS "Lava Ruins" #define ZTRAIT_ISOLATED_RUINS "Isolated Ruins" //Placing ruins on z levels with this trait will use turf reservation instead of usual placement. -// prevents certain turfs from being stripped by a singularity -#define ZTRAIT_PLANET "Planet" // number - bombcap is multiplied by this before being applied to bombs #define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier" @@ -60,11 +58,18 @@ require only minor tweaks. // CROSSLINKED - mixed in with the cross-linked space pool #define CROSSLINKED "Cross" +// string - type path of the z-level's baseturf (defaults to space) +#define ZTRAIT_BASETURF "Baseturf" + // default trait definitions, used by SSmapping #define ZTRAITS_CENTCOM list(ZTRAIT_CENTCOM = TRUE) #define ZTRAITS_STATION list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_STATION = TRUE) #define ZTRAITS_SPACE list(ZTRAIT_LINKAGE = CROSSLINKED, ZTRAIT_SPACE_RUINS = TRUE) -#define ZTRAITS_LAVALAND list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 5) +#define ZTRAITS_LAVALAND list(\ + ZTRAIT_MINING = TRUE, \ + ZTRAIT_LAVA_RUINS = TRUE, \ + ZTRAIT_BOMBCAP_MULTIPLIER = 5, \ + ZTRAIT_BASETURF = /turf/open/lava/smooth/lava_land_surface) #define ZTRAITS_REEBE list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5) #define DL_NAME "name" diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 29ff0a8fae..d595abd3ec 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -427,6 +427,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S //Dummy mob reserve slots #define DUMMY_HUMAN_SLOT_PREFERENCES "dummy_preference_preview" +#define DUMMY_HUMAN_SLOT_HOLOFORM "dummy_holoform_generation" #define DUMMY_HUMAN_SLOT_ADMIN "admintools" #define DUMMY_HUMAN_SLOT_MANIFEST "dummy_manifest_generation" @@ -528,3 +529,11 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S #define FOURSPACES "    " #define CRYOMOBS 'icons/obj/cryo_mobs.dmi' + +#define CUSTOM_HOLOFORM_DELAY 10 SECONDS //prevents spamming to make lag. it's pretty expensive to do this. + +#define HOLOFORM_FILTER_AI "FILTER_AI" +#define HOLOFORM_FILTER_PAI "FILTER_PAI" +#define HOLOFORM_FILTER_STATIC "FILTER_STATIC" + +#define CANT_REENTER_ROUND -1 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 439b3d1493..b7a5975ad5 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -134,6 +134,7 @@ #define TRAIT_NORUNNING "norunning" // You walk! #define TRAIT_NOMARROW "nomarrow" // You don't make blood, with chemicals or nanites. #define TRAIT_NOPULSE "nopulse" // Your heart doesn't beat. +#define TRAIT_EXEMPT_HEALTH_EVENTS "exempt-health-events" //non-mob traits @@ -160,19 +161,18 @@ #define TRAIT_TAGGER "tagger" #define TRAIT_PHOTOGRAPHER "photographer" #define TRAIT_MUSICIAN "musician" -#define TRAIT_CROCRIN_IMMUNE "crocin_immune" #define TRAIT_NYMPHO "nymphomania" #define TRAIT_MASO "masochism" #define TRAIT_EXHIBITIONIST "exhibitionist" #define TRAIT_HIGH_BLOOD "high_blood" -#define TRAIT_PHARMA "hepatic_pharmacokinesis" #define TRAIT_PARA "paraplegic" #define TRAIT_EMPATH "empath" #define TRAIT_FRIENDLY "friendly" -#define TRAIT_ASSBLASTUSA "assblastusa" #define TRAIT_CULT_EYES "cult_eyes" +#define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" +#define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" - +#define TRAIT_NO_ALCOHOL "alcohol_intolerance" // common trait sources #define TRAIT_GENERIC "generic" @@ -193,6 +193,7 @@ #define ABSTRACT_ITEM_TRAIT "abstract-item" #define STATUS_EFFECT_TRAIT "status-effect" #define ROUNDSTART_TRAIT "roundstart" //cannot be removed without admin intervention +#define GHOSTROLE_TRAIT "ghostrole" // unique trait sources, still defines #define STATUE_MUTE "statue" @@ -228,6 +229,7 @@ #define SLEEPING_CARP_TRAIT "sleeping_carp" #define RISING_BASS_TRAIT "rising_bass" #define ABDUCTOR_ANTAGONIST "abductor-antagonist" +#define NUKEOP_ANTAGONIST "nukeop-antagonist" #define MADE_UNCLONEABLE "made-uncloneable" #define NUKEOP_TRAIT "nuke-op" #define DEATHSQUAD_TRAIT "deathsquad" diff --git a/code/__DEFINES/vote.dm b/code/__DEFINES/vote.dm new file mode 100644 index 0000000000..8fb2e6deab --- /dev/null +++ b/code/__DEFINES/vote.dm @@ -0,0 +1,6 @@ +#define PLURALITY_VOTING 0 +#define APPROVAL_VOTING 1 +#define RANKED_CHOICE_VOTING 2 +#define SCORE_VOTING 3 + +GLOBAL_LIST_INIT(vote_score_options,list("Bad","Poor","Acceptable","Good","Great")) diff --git a/code/__HELPERS/_logging.dm b/code/__HELPERS/_logging.dm index c259831f94..3ee77d3edc 100644 --- a/code/__HELPERS/_logging.dm +++ b/code/__HELPERS/_logging.dm @@ -157,6 +157,8 @@ WRITE_LOG(GLOB.config_error_log, text) SEND_TEXT(world.log, text) +/proc/log_mapping(text) + WRITE_LOG(GLOB.world_map_error_log, text) /* For logging round startup. */ /proc/start_log(log) diff --git a/code/__HELPERS/custom_holoforms.dm b/code/__HELPERS/custom_holoforms.dm new file mode 100644 index 0000000000..0e97314f1f --- /dev/null +++ b/code/__HELPERS/custom_holoforms.dm @@ -0,0 +1,62 @@ +// Generates a holoform appearance +// Equipment list is slot = path. +/proc/generate_custom_holoform_from_prefs(datum/preferences/prefs, list/equipment_by_slot, list/inhand_equipment, copy_job = FALSE, apply_loadout = FALSE) + ASSERT(prefs) + var/mob/living/carbon/human/dummy/mannequin = generate_or_wait_for_human_dummy(DUMMY_HUMAN_SLOT_HOLOFORM) + prefs.copy_to(mannequin) + if(apply_loadout && prefs.parent) + SSjob.equip_loadout(prefs.parent.mob, mannequin, bypass_prereqs = TRUE) + if(copy_job) + var/datum/job/highest = prefs.get_highest_job() + if(highest && !istype(highest, /datum/job/ai) && !istype(highest, /datum/job/cyborg)) + highest.equip(mannequin, TRUE, preference_source = prefs.parent) + + if(length(equipment_by_slot)) + for(var/slot in equipment_by_slot) + var/obj/item/I = new equipment_by_slot[slot] + mannequin.equip_to_slot_if_possible(I, slot, TRUE, TRUE, TRUE, TRUE) + if(length(inhand_equipment)) + for(var/path in inhand_equipment) + var/obj/item/I = new path + mannequin.equip_to_slot_if_possible(I, SLOT_HANDS, TRUE, TRUE, TRUE, TRUE) + + + var/icon/combined = new + for(var/d in GLOB.cardinals) + mannequin.setDir(d) + COMPILE_OVERLAYS(mannequin) + CHECK_TICK + var/icon/capture = getFlatIcon(mannequin) + CHECK_TICK + combined.Insert(capture, dir = d) + CHECK_TICK + + unset_busy_human_dummy(DUMMY_HUMAN_SLOT_HOLOFORM) + return combined + +/proc/process_holoform_icon_filter(icon/I, filter_type, clone = TRUE) + if(clone) + I = icon(I) //Clone + switch(filter_type) + if(HOLOFORM_FILTER_AI) + I = getHologramIcon(I) + if(HOLOFORM_FILTER_STATIC) + I = getStaticIcon(I) + if(HOLOFORM_FILTER_PAI) + I = getPAIHologramIcon(I) + return I + +//Errors go to user. +/proc/generate_custom_holoform_from_prefs_safe(datum/preferences/prefs, mob/user) + if(user) + if(user.client.prefs.last_custom_holoform > world.time - CUSTOM_HOLOFORM_DELAY) + to_chat(user, "You are attempting to set your custom holoform too fast!") + return + return generate_custom_holoform_from_prefs(prefs, null, null, TRUE, TRUE) + +//Prompts this client for custom holoform parameters. +/proc/user_interface_custom_holoform(client/C) + var/datum/preferences/target_prefs = C.prefs + ASSERT(target_prefs) + //In the future, maybe add custom path allowances a la admin create outfit but for now.. + return generate_custom_holoform_from_prefs_safe(target_prefs, C.mob) diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index d76fc7731a..65c7145d8f 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -444,12 +444,8 @@ candidates -= M /proc/pollGhostCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE) - var/list/candidates = list() - - for(var/mob/dead/observer/G in GLOB.player_list) - if(G.reenter_round_timeout < world.realtime) - candidates += G - + var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + var/list/candidates = eligibility.get_all_ghost_role_eligible() return pollCandidates(Question, jobbanType, gametypeCheck, be_special_flag, poll_time, ignore_category, flashwindow, candidates) /proc/pollCandidates(Question, jobbanType, datum/game_mode/gametypeCheck, be_special_flag = 0, poll_time = 300, ignore_category = null, flashwindow = TRUE, list/group = null) diff --git a/code/__HELPERS/icons.dm b/code/__HELPERS/icons.dm index 5fb64004c0..1af3143d9d 100644 --- a/code/__HELPERS/icons.dm +++ b/code/__HELPERS/icons.dm @@ -939,7 +939,7 @@ world I.pixel_y++ add_overlay(I)//And finally add the overlay. -/proc/getHologramIcon(icon/A, safety=1)//If safety is on, a new icon is not created. +/proc/getHologramIcon(icon/A, safety = TRUE)//If safety is on, a new icon is not created. var/icon/flat_icon = safety ? A : new(A)//Has to be a new icon to not constantly change the same icon. flat_icon.ColorTone(rgb(125,180,225))//Let's make it bluish. flat_icon.ChangeOpacity(0.5)//Make it half transparent. @@ -947,6 +947,14 @@ world flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect. return flat_icon +/proc/getPAIHologramIcon(icon/A, safety = TRUE) + var/icon/flat_icon = safety? A : new(A) + flat_icon.SetIntensity(0.75, 1, 0.75) + flat_icon.ChangeOpacity(0.7) + var/icon/alpha_mask = new('icons/effects/effects.dmi', "scanlineslow")//Scanline effect. + flat_icon.AddAlphaMask(alpha_mask)//Finally, let's mix in a distortion effect. + return flat_icon + //What the mob looks like as animated static //By vg's ComicIronic /proc/getStaticIcon(icon/A, safety = TRUE) diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index 55ee069321..3e6e88c8fa 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -12,6 +12,3 @@ #define is_reserved_level(z) SSmapping.level_trait(z, ZTRAIT_RESERVED) #define is_away_level(z) SSmapping.level_trait(z, ZTRAIT_AWAY) - -// If true, the singularity cannot strip away asteroid turf on this Z -#define is_planet_level(z) SSmapping.level_trait(z, ZTRAIT_PLANET) diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm index ce8b2e4cf0..cdf0f604b8 100644 --- a/code/__HELPERS/mobs.dm +++ b/code/__HELPERS/mobs.dm @@ -20,8 +20,6 @@ else return "000" -#define UNDIE_COLORABLE(U) (U?.has_color) - /proc/random_underwear(gender) if(!GLOB.underwear_list.len) init_sprite_accessory_subtypes(/datum/sprite_accessory/underwear/bottom, GLOB.underwear_list, GLOB.underwear_m, GLOB.underwear_f) diff --git a/code/__HELPERS/roundend.dm b/code/__HELPERS/roundend.dm index 27f1a81fef..49825bcb50 100644 --- a/code/__HELPERS/roundend.dm +++ b/code/__HELPERS/roundend.dm @@ -19,6 +19,9 @@ var/list/mob_data = list() if(isnewplayer(m)) continue + if (m.client && m.client.prefs && m.client.prefs.auto_ooc) + if (!(m.client.prefs.chat_toggles & CHAT_OOC)) + m.client.prefs.chat_toggles ^= CHAT_OOC if(m.mind) if(m.stat != DEAD && !isbrain(m) && !iscameramob(m)) num_survivors++ diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 29f5331fd3..74c32dd52f 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -758,16 +758,6 @@ GLOBAL_LIST_INIT(can_embed_types, typecacheof(list( /obj/item/stack/rods, /obj/item/pipe))) -/proc/can_embed(obj/item/W) - if(W.get_sharpness()) - return 1 - if(is_pointed(W)) - return 1 - - if(is_type_in_typecache(W, GLOB.can_embed_types)) - return 1 - - /* Checks if that loc and dir has an item on the wall */ diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index c25ebf5b0a..914e45add5 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -115,5 +115,6 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/clothing/shoes/kindleKicks = 1, /obj/item/autosurgeon/penis = 1, /obj/item/autosurgeon/testicles = 1, + /obj/item/storage/box/marshmallow = 2, "" = 3 )) diff --git a/code/_globalvars/logging.dm b/code/_globalvars/logging.dm index 8e5da083e3..5ca3513e66 100644 --- a/code/_globalvars/logging.dm +++ b/code/_globalvars/logging.dm @@ -28,6 +28,8 @@ GLOBAL_VAR(world_job_debug_log) GLOBAL_PROTECT(world_job_debug_log) GLOBAL_VAR(world_virus_log) GLOBAL_PROTECT(world_virus_log) +GLOBAL_VAR(world_map_error_log) +GLOBAL_PROTECT(world_map_error_log) GLOBAL_LIST_EMPTY(bombers) GLOBAL_PROTECT(bombers) diff --git a/code/_globalvars/misc.dm b/code/_globalvars/misc.dm index af31e2b5a5..ec3593ee9d 100644 --- a/code/_globalvars/misc.dm +++ b/code/_globalvars/misc.dm @@ -23,6 +23,8 @@ GLOBAL_VAR_INIT(bsa_unlock, FALSE) //BSA unlocked by head ID swipes GLOBAL_LIST_EMPTY(player_details) // ckey -> /datum/player_details +GLOBAL_LIST_EMPTY(clientless_round_timeouts) // ckey -> time that ckey can rejoin round + // All religion stuff GLOBAL_VAR(religion) GLOBAL_VAR(deity) diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index f082f2ad16..e6b2a63673 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -98,17 +98,19 @@ take_damage(I.force, I.damtype, "melee", 1) /mob/living/attacked_by(obj/item/I, mob/living/user) + //CIT CHANGES START HERE - combatmode and resting checks + var/totitemdamage = I.force + if(iscarbon(user)) + var/mob/living/carbon/tempcarb = user + if(!tempcarb.combatmode) + totitemdamage *= 0.5 + if(user.resting) + totitemdamage *= 0.5 + //CIT CHANGES END HERE + if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) + return FALSE send_item_attack_message(I, user) if(I.force) - //CIT CHANGES START HERE - combatmode and resting checks - var/totitemdamage = I.force - if(iscarbon(user)) - var/mob/living/carbon/tempcarb = user - if(!tempcarb.combatmode) - totitemdamage *= 0.5 - if(user.resting) - totitemdamage *= 0.5 - //CIT CHANGES END HERE apply_damage(totitemdamage, I.damtype) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && !HAS_TRAIT(src, TRAIT_NOMARROW)) if(prob(33)) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 30e6883d24..6ee7d51091 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -91,6 +91,8 @@ var/obj/item/clothing/gloves/G = gloves if(istype(G) && G.Touch(A,0)) // for magic gloves return + if (istype(glasses) && glasses.ranged_attack(src,A,mouseparams)) + return for(var/datum/mutation/human/HM in dna.mutations) HM.on_ranged_attack(src, A, mouseparams) diff --git a/code/controllers/configuration/configuration.dm b/code/controllers/configuration/configuration.dm index a5d27819b8..14954524fa 100644 --- a/code/controllers/configuration/configuration.dm +++ b/code/controllers/configuration/configuration.dm @@ -14,6 +14,7 @@ var/list/modes // allowed modes var/list/gamemode_cache var/list/votable_modes // votable modes + var/list/storyteller_cache var/list/mode_names var/list/mode_reports var/list/mode_false_report_weight @@ -37,6 +38,7 @@ CRASH("/datum/controller/configuration/Load() called more than once!") InitEntries() LoadModes() + storyteller_cache = typecacheof(/datum/dynamic_storyteller, TRUE) if(fexists("[directory]/config.txt") && LoadEntries("config.txt") <= 1) var/list/legacy_configs = list("game_options.txt", "dbconfig.txt", "comms.txt") for(var/I in legacy_configs) @@ -227,6 +229,7 @@ for(var/T in gamemode_cache) // I wish I didn't have to instance the game modes in order to look up // their information, but it is the only way (at least that I know of). + // for future reference: just use initial() lol var/datum/game_mode/M = new T() if(M.config_tag) @@ -317,6 +320,14 @@ return new T return new /datum/game_mode/extended() +/datum/controller/configuration/proc/pick_storyteller(storyteller_name) + for(var/T in storyteller_cache) + var/datum/dynamic_storyteller/S = T + var/name = initial(S.name) + if(name && name == storyteller_name) + return T + return /datum/dynamic_storyteller/classic + /datum/controller/configuration/proc/get_runnable_modes() var/list/datum/game_mode/runnable_modes = new var/list/probabilities = Get(/datum/config_entry/keyed_list/probability) diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm index 61b5788ef8..b95ef43d37 100644 --- a/code/controllers/configuration/entries/game_options.dm +++ b/code/controllers/configuration/entries/game_options.dm @@ -386,6 +386,8 @@ config_entry_value = 72000 min_val = 0 +/datum/config_entry/flag/pai_custom_holoforms + /datum/config_entry/number/marauder_delay_non_reebe config_entry_value = 1800 min_val = 0 diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 1bfdc79d27..2a59558bcd 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -315,7 +315,7 @@ SUBSYSTEM_DEF(air) var/starting_ats = active_turfs.len sleep(world.tick_lag) var/timer = world.timeofday - warning("There are [starting_ats] active turfs at roundstart, this is a mapping error caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required)") + log_mapping("There are [starting_ats] active turfs at roundstart caused by a difference of the air between the adjacent turfs. You can see its coordinates using \"Mapping -> Show roundstart AT list\" verb (debug verbs required).") for(var/turf/T in active_turfs) GLOB.active_turfs_startlist += T diff --git a/code/controllers/subsystem/job.dm b/code/controllers/subsystem/job.dm index af7ae825f4..7597a9229a 100644 --- a/code/controllers/subsystem/job.dm +++ b/code/controllers/subsystem/job.dm @@ -658,7 +658,7 @@ SUBSYSTEM_DEF(job) message_admins(msg) CRASH(msg) -/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff) +/datum/controller/subsystem/job/proc/equip_loadout(mob/dead/new_player/N, mob/living/M, equipbackpackstuff, bypass_prereqs = FALSE) var/mob/the_mob = N if(!the_mob) the_mob = M // cause this doesn't get assigned if player is a latejoiner @@ -671,7 +671,7 @@ SUBSYSTEM_DEF(job) if(!G) continue var/permitted = TRUE - if(G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles)) + if(!bypass_prereqs && G.restricted_roles && G.restricted_roles.len && !(M.mind.assigned_role in G.restricted_roles)) permitted = FALSE if(G.donoritem && !G.donator_ckey_check(the_mob.client.ckey)) permitted = FALSE diff --git a/code/controllers/subsystem/persistence.dm b/code/controllers/subsystem/persistence.dm index 8329493818..e43c8f21a2 100644 --- a/code/controllers/subsystem/persistence.dm +++ b/code/controllers/subsystem/persistence.dm @@ -13,13 +13,14 @@ SUBSYSTEM_DEF(persistence) var/list/saved_messages = list() var/list/saved_modes = list(1,2,3) var/list/saved_dynamic_rules = list(list(),list(),list()) - var/list/saved_threat_levels = list(1,1,1) + var/list/saved_storytellers = list("foo","bar","baz","foo again","bar again") var/list/saved_maps var/list/saved_trophies = list() var/list/spawned_objects = list() var/list/antag_rep = list() var/list/antag_rep_change = list() var/list/picture_logging_information = list() + var/list/saved_votes = list() var/list/obj/structure/sign/picture_frame/photo_frames var/list/obj/item/storage/photo_album/photo_albums @@ -29,9 +30,12 @@ SUBSYSTEM_DEF(persistence) LoadChiselMessages() LoadTrophies() LoadRecentModes() - LoadRecentThreats() + LoadRecentStorytellers() + LoadRecentRulesets() LoadRecentMaps() LoadPhotoPersistence() + for(var/client/C in GLOB.clients) + LoadSavedVote(C.ckey) if(CONFIG_GET(flag/use_antag_rep)) LoadAntagReputation() LoadRandomizedRecipes() @@ -169,14 +173,23 @@ SUBSYSTEM_DEF(persistence) return saved_modes = json["data"] -/datum/controller/subsystem/persistence/proc/LoadRecentThreats() - var/json_file = file("data/RecentThreatLevels.json") +/datum/controller/subsystem/persistence/proc/LoadRecentRulesets() + var/json_file = file("data/RecentRulesets.json") if(!fexists(json_file)) return var/list/json = json_decode(file2text(json_file)) if(!json) return - saved_threat_levels = json["data"] + saved_dynamic_rules = json["data"] + +/datum/controller/subsystem/persistence/proc/LoadRecentStorytellers() + var/json_file = file("data/RecentStorytellers.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_storytellers = json["data"] /datum/controller/subsystem/persistence/proc/LoadRecentMaps() var/json_file = file("data/RecentMaps.json") @@ -197,6 +210,15 @@ SUBSYSTEM_DEF(persistence) return antag_rep = json_decode(json) +/datum/controller/subsystem/persistence/proc/LoadSavedVote(var/ckey) + var/json_file = file("data/player_saves/[copytext(ckey,1,2)]/[ckey]/SavedVotes.json") + if(!fexists(json_file)) + return + var/list/json = json_decode(file2text(json_file)) + if(!json) + return + saved_votes[ckey] = json["data"] + /datum/controller/subsystem/persistence/proc/SetUpTrophies(list/trophy_items) for(var/A in GLOB.trophy_cases) var/obj/structure/displaycase/trophy/T = A @@ -230,7 +252,7 @@ SUBSYSTEM_DEF(persistence) CollectRoundtype() if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - CollectThreatLevel(mode) + CollectStoryteller(mode) CollectRulesets(mode) RecordMaps() SavePhotoPersistence() //THIS IS PERSISTENCE, NOT THE LOGGING PORTION. @@ -388,13 +410,16 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) -/datum/controller/subsystem/persistence/proc/CollectThreatLevel(var/datum/game_mode/dynamic/mode) - saved_threat_levels[3] = saved_threat_levels[2] - saved_threat_levels[2] = saved_threat_levels [1] - saved_threat_levels[1] = mode.threat_level - var/json_file = file("data/RecentThreatLevels.json") +/datum/controller/subsystem/persistence/proc/CollectStoryteller(var/datum/game_mode/dynamic/mode) + saved_storytellers.len = 5 + saved_storytellers[5] = saved_storytellers[4] + saved_storytellers[4] = saved_storytellers[3] + saved_storytellers[3] = saved_storytellers[2] + saved_storytellers[2] = saved_storytellers[1] + saved_storytellers[1] = mode.storyteller.name + var/json_file = file("data/RecentStorytellers.json") var/list/file_data = list() - file_data["data"] = saved_threat_levels + file_data["data"] = saved_storytellers fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) @@ -402,8 +427,9 @@ SUBSYSTEM_DEF(persistence) saved_dynamic_rules[3] = saved_dynamic_rules[2] saved_dynamic_rules[2] = saved_dynamic_rules[1] saved_dynamic_rules[1] = list() - for(var/datum/dynamic_ruleset/ruleset in mode.executed_rules) - saved_dynamic_rules[1] += ruleset.config_tag + for(var/r in mode.executed_rules) + var/datum/dynamic_ruleset/rule = r + saved_dynamic_rules[1] += rule.config_tag var/json_file = file("data/RecentRulesets.json") var/list/file_data = list() file_data["data"] = saved_dynamic_rules @@ -473,3 +499,11 @@ SUBSYSTEM_DEF(persistence) fdel(json_file) WRITE_FILE(json_file, json_encode(file_data)) + +/datum/controller/subsystem/persistence/proc/SaveSavedVotes() + for(var/ckey in saved_votes) + var/json_file = file("data/player_saves/[copytext(ckey,1,2)]/[ckey]/SavedVotes.json") + var/list/file_data = list() + file_data["data"] = saved_votes[ckey] + fdel(json_file) + WRITE_FILE(json_file, json_encode(file_data)) diff --git a/code/controllers/subsystem/processing/nanites.dm b/code/controllers/subsystem/processing/nanites.dm index 69bd5781de..5b53f9f884 100644 --- a/code/controllers/subsystem/processing/nanites.dm +++ b/code/controllers/subsystem/processing/nanites.dm @@ -6,6 +6,7 @@ PROCESSING_SUBSYSTEM_DEF(nanites) var/list/datum/nanite_cloud_backup/cloud_backups = list() var/list/mob/living/nanite_monitored_mobs = list() var/list/datum/nanite_program/relay/nanite_relays = list() + var/neural_network_count = 0 /datum/controller/subsystem/processing/nanites/proc/check_hardware(datum/nanite_cloud_backup/backup) if(QDELETED(backup.storage) || (backup.storage.stat & (NOPOWER|BROKEN))) diff --git a/code/controllers/subsystem/processing/quirks.dm b/code/controllers/subsystem/processing/quirks.dm index 0b9284a144..a52bcf4607 100644 --- a/code/controllers/subsystem/processing/quirks.dm +++ b/code/controllers/subsystem/processing/quirks.dm @@ -17,7 +17,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) /datum/controller/subsystem/processing/quirks/Initialize(timeofday) if(!quirks.len) SetupQuirks() - quirk_blacklist = list(list("Blind","Nearsighted"),list("Jolly","Depression","Apathetic"),list("Ageusia","Deviant Tastes"),list("Ananas Affinity","Ananas Aversion")) + quirk_blacklist = list(list("Blind","Nearsighted"),list("Jolly","Depression","Apathetic"),list("Ageusia","Deviant Tastes"),list("Ananas Affinity","Ananas Aversion"),list("Alcohol Tolerance","Alcohol Intolerance"),list("Alcohol Intolerance","Drunken Resilience")) return ..() /datum/controller/subsystem/processing/quirks/proc/SetupQuirks() @@ -46,8 +46,8 @@ PROCESSING_SUBSYSTEM_DEF(quirks) badquirk = TRUE if(badquirk) cli.prefs.save_character() - if(!silent && LAZYLEN(cut)) - to_chat(to_chat_target || user, "All of your non-neutral character quirks have been cut due to these quirks conflicting with your job assignment: [english_list(cut)].") + if (!silent && LAZYLEN(cut)) + to_chat(to_chat_target || user, "Some quirks have been cut from your character because of these quirks conflicting with your job assignment: [english_list(cut)].") /datum/controller/subsystem/processing/quirks/proc/quirk_path_by_name(name) return quirks[name] @@ -66,6 +66,7 @@ PROCESSING_SUBSYSTEM_DEF(quirks) /datum/controller/subsystem/processing/quirks/proc/filter_quirks(list/our_quirks, datum/job/job) var/list/cut = list() var/list/banned_names = list() + var/pointscut = 0 for(var/i in job.blacklisted_quirks) var/name = quirk_name_by_path(i) if(name) @@ -75,7 +76,17 @@ PROCESSING_SUBSYSTEM_DEF(quirks) for(var/i in blacklisted) our_quirks -= i cut += i - + pointscut += quirk_points_by_name(i) + if (pointscut != 0) + for (var/i in shuffle(our_quirks)) + if (quirk_points_by_name(i) < pointscut || (pointscut < 0) ? quirk_points_by_name(i) <= 0 : quirk_points_by_name(i) >= 0) + continue + else + our_quirks -= i + cut += i + pointscut += quirk_points_by_name(i) + if (pointscut >= 0) //with how it works, it needs to be above zero, not below, as points for positive is positive, and negative is negative, we only want it to break if it's above zero, ie. we cut more positive than negative + break /* //Code to automatically reduce positive quirks until balance is even. var/points_used = total_points(our_quirks) if(points_used > 0) @@ -91,10 +102,11 @@ PROCESSING_SUBSYSTEM_DEF(quirks) */ //Nah, let's null all non-neutrals out. - if(cut.len) - for(var/i in our_quirks) - if(quirk_points_by_name(i) != 0) - //cut += i -- Commented out: Only show the ones that triggered the quirk purge. - our_quirks -= i + if (pointscut != 0)// only if the pointscutting didn't work. + if(cut.len) + for(var/i in our_quirks) + if(quirk_points_by_name(i) != 0) + //cut += i -- Commented out: Only show the ones that triggered the quirk purge. + our_quirks -= i return cut diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index fe40b3f01f..b406a8ccad 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -37,7 +37,7 @@ SUBSYSTEM_DEF(shuttle) var/points = 5000 //number of trade-points we have var/centcom_message = "" //Remarks from CentCom on how well you checked the last order. var/list/discoveredPlants = list() //Typepaths for unusual plants we've already sent CentCom, associated with their potencies - var/passive_supply_points_per_minute = 750 + var/passive_supply_points_per_minute = 500 var/list/supply_packs = list() var/list/shoppinglist = list() diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index 890725fbb1..45c8e3c8fe 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -401,6 +401,9 @@ SUBSYSTEM_DEF(ticker) qdel(player) living.notransform = TRUE if(living.client) + if (living.client.prefs && living.client.prefs.auto_ooc) + if (living.client.prefs.chat_toggles & CHAT_OOC) + living.client.prefs.chat_toggles ^= CHAT_OOC var/obj/screen/splash/S = new(living.client, TRUE) S.Fade(TRUE) livings += living @@ -480,7 +483,10 @@ SUBSYSTEM_DEF(ticker) SSticker.timeLeft = 900 SSticker.modevoted = TRUE var/dynamic = CONFIG_GET(flag/dynamic_voting) - SSvote.initiate_vote(dynamic ? "dynamic" : "roundtype","server",TRUE) + if(dynamic) + SSvote.initiate_vote("dynamic","server",hideresults=TRUE,votesystem=SCORE_VOTING,forced=TRUE,vote_time = 2 MINUTES) + else + SSvote.initiate_vote("roundtype","server",hideresults=TRUE,votesystem=PLURALITY_VOTING,forced=TRUE, vote_time = 2 MINUTES) /datum/controller/subsystem/ticker/Recover() current_state = SSticker.current_state diff --git a/code/controllers/subsystem/vote.dm b/code/controllers/subsystem/vote.dm index dee10e4998..573c89a5af 100644 --- a/code/controllers/subsystem/vote.dm +++ b/code/controllers/subsystem/vote.dm @@ -1,3 +1,5 @@ +#define VOTE_COOLDOWN 10 + SUBSYSTEM_DEF(vote) name = "Vote" wait = 10 @@ -8,13 +10,17 @@ SUBSYSTEM_DEF(vote) var/initiator = null var/started_time = null - var/time_remaining = 0 + var/end_time = 0 var/mode = null + var/vote_system = PLURALITY_VOTING var/question = null var/list/choices = list() + var/list/choice_descs = list() // optional descriptions var/list/voted = list() var/list/voting = list() + var/list/saved = list() var/list/generated_actions = list() + var/next_pop = 0 var/obfuscated = FALSE//CIT CHANGE - adds obfuscated/admin-only votes @@ -22,28 +28,30 @@ SUBSYSTEM_DEF(vote) /datum/controller/subsystem/vote/fire() //called by master_controller if(mode) - time_remaining = round((started_time + CONFIG_GET(number/vote_period) - world.time)/10) - - if(time_remaining < 0) + if(end_time < world.time) result() + SSpersistence.SaveSavedVotes() for(var/client/C in voting) C << browse(null, "window=vote;can_close=0") reset() - else + else if(next_pop < world.time) var/datum/browser/client_popup for(var/client/C in voting) - client_popup = new(C, "vote", "Voting Panel") + client_popup = new(C, "vote", "Voting Panel", nwidth=600,nheight=700) client_popup.set_window_options("can_close=0") client_popup.set_content(interface(C)) client_popup.open(0) + next_pop = world.time+VOTE_COOLDOWN + /datum/controller/subsystem/vote/proc/reset() initiator = null - time_remaining = 0 + end_time = 0 mode = null question = null choices.Cut() + choice_descs.Cut() voted.Cut() voting.Cut() obfuscated = FALSE //CIT CHANGE - obfuscated votes @@ -84,17 +92,114 @@ SUBSYSTEM_DEF(vote) . += option return . +/datum/controller/subsystem/vote/proc/calculate_condorcet_votes(var/blackbox_text) + // https://en.wikipedia.org/wiki/Schulze_method#Implementation + var/list/d[][] = new/list(choices.len,choices.len) // the basic vote matrix, how many times a beats b + for(var/ckey in voted) + var/list/this_vote = voted[ckey] + for(var/a in 1 to choices.len) + for(var/b in a+1 to choices.len) + var/a_rank = this_vote.Find(a) + var/b_rank = this_vote.Find(b) + a_rank = a_rank ? a_rank : choices.len+1 + b_rank = b_rank ? b_rank : choices.len+1 + if(a_rankopposite_pref) + p[i][j] = d[i][j] + p[j][i] = 0 + else + p[i][j] = 0 + p[j][i] = d[i][j] + for(var/i in 1 to choices.len) + for(var/j in 1 to choices.len) + if(i != j) + for(var/k in 1 to choices.len) // YEAH O(n^3) !! + if(i != k && j != k) + p[j][k] = max(p[j][k],min(p[j][i], p[i][k])) + //one last pass, now that we've done the math + for(var/i in 1 to choices.len) + for(var/j in 1 to choices.len) + if(i != j) + SSblackbox.record_feedback("nested tally","voting",p[i][j],list(blackbox_text,"Shortest Paths",choices[i],choices[j])) + if(p[i][j] >= p[j][i]) + choices[choices[i]]++ // higher shortest path = better candidate, so we add to choices here + // choices[choices[i]] is the schulze ranking, here, rather than raw vote numbers + +/datum/controller/subsystem/vote/proc/calculate_majority_judgement_vote(var/blackbox_text) + // https://en.wikipedia.org/wiki/Majority_judgment + var/list/scores_by_choice = list() + for(var/choice in choices) + scores_by_choice[choice] = list() + for(var/ckey in voted) + var/list/this_vote = voted[ckey] + var/list/pretty_vote = list() + for(var/choice in this_vote) + sorted_insert(scores_by_choice[choice],this_vote[choice],/proc/cmp_numeric_asc) + // START BALLOT GATHERING + pretty_vote += choice + pretty_vote[choice] = GLOB.vote_score_options[this_vote[choice]] + SSblackbox.record_feedback("associative","voting_ballots",1,pretty_vote) + // END BALLOT GATHERING + for(var/score_name in scores_by_choice) + var/list/score = scores_by_choice[score_name] + for(var/indiv_score in score) + SSblackbox.record_feedback("nested tally","voting",1,list(blackbox_text,"Scores",score_name,GLOB.vote_score_options[indiv_score])) + if(score.len == 0) + scores_by_choice -= score_name + while(scores_by_choice.len > 1) + var/highest_median = 0 + for(var/score_name in scores_by_choice) // first get highest median + var/list/score = scores_by_choice[score_name] + if(!score.len) + scores_by_choice -= score_name + continue + var/median = score[max(1,round(score.len/2))] + if(median >= highest_median) + highest_median = median + for(var/score_name in scores_by_choice) // then, remove + var/list/score = scores_by_choice[score_name] + var/median = score[max(1,round(score.len/2))] + if(median < highest_median) + scores_by_choice -= score_name + for(var/score_name in scores_by_choice) // after removals + var/list/score = scores_by_choice[score_name] + if(score.len == 0) + choices[score_name] += 100 // we're in a tie situation--just go with the first one + return + var/median_pos = max(1,round(score.len/2)) + score.Cut(median_pos,median_pos+1) + choices[score_name]++ + /datum/controller/subsystem/vote/proc/announce_result() - var/list/winners = get_result() + var/vote_title_text var/text + if(question) + text += "[question]" + vote_title_text = "[question]" + else + text += "[capitalize(mode)] Vote" + vote_title_text = "[capitalize(mode)] Vote" + if(vote_system == RANKED_CHOICE_VOTING) + calculate_condorcet_votes(vote_title_text) + if(vote_system == SCORE_VOTING) + calculate_majority_judgement_vote(vote_title_text) + var/list/winners = get_result() var/was_roundtype_vote = mode == "roundtype" || mode == "dynamic" if(winners.len > 0) - if(question) - text += "[question]" - else - text += "[capitalize(mode)] Vote" if(was_roundtype_vote) stored_gamemode_votes = list() + if(!obfuscated && vote_system == RANKED_CHOICE_VOTING) + text += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] if(!votes) @@ -116,17 +221,25 @@ SUBSYSTEM_DEF(vote) log_vote(text) remove_action_buttons() to_chat(world, "\n[text]") + switch(vote_system) + if(APPROVAL_VOTING,PLURALITY_VOTING) + for(var/i=1,i<=choices.len,i++) + SSblackbox.record_feedback("nested tally","voting",choices[choices[i]],list(vote_title_text,choices[i])) + if(RANKED_CHOICE_VOTING) + for(var/i=1,i<=voted.len,i++) + var/list/myvote = voted[voted[i]] + for(var/j=1,j<=myvote.len,j++) + SSblackbox.record_feedback("nested tally","voting",1,list(vote_title_text,"[j]\th",choices[myvote[j]])) if(obfuscated) //CIT CHANGE - adds obfuscated votes. this messages admins with the vote's true results var/admintext = "Obfuscated results" + if(vote_system == RANKED_CHOICE_VOTING) + admintext += "\nIt should be noted that this is not a raw tally of votes (impossible in ranked choice) but the score determined by the schulze method of voting, so the numbers will look weird!" for(var/i=1,i<=choices.len,i++) var/votes = choices[choices[i]] admintext += "\n[choices[i]]: [votes]" message_admins(admintext) return . -#define PEACE "calm" -#define CHAOS "chaotic" - /datum/controller/subsystem/vote/proc/result() . = announce_result() var/restart = 0 @@ -152,33 +265,15 @@ SUBSYSTEM_DEF(vote) if("dynamic") if(SSticker.current_state > GAME_STATE_PREGAME)//Don't change the mode if the round already started. return message_admins("A vote has tried to change the gamemode, but the game has already started. Aborting.") - GLOB.master_mode = "dynamic" - if("extended" in choices) - if(. == "extended") - GLOB.dynamic_forced_extended = TRUE // we still do the rest of the stuff - choices[PEACE] += choices["extended"] - var/mean = 0 - var/voters = 0 - for(var/client/c in GLOB.clients) - var/vote = c.prefs.preferred_chaos - if(vote) - voters += 1 - switch(vote) - if(CHAOS_NONE) - mean -= 0.1 - if(CHAOS_LOW) - mean -= 0.05 - if(CHAOS_HIGH) - mean += 0.05 - if(CHAOS_MAX) - mean += 0.1 - mean/=voters - if(voted.len != 0) - mean += (choices[PEACE]*-1+choices[CHAOS])/voted.len - GLOB.dynamic_curve_centre = mean*20 - GLOB.dynamic_curve_width = CLAMP(2-abs(mean*5),0.5,4) - to_chat(world,"Dynamic curve centre set to [GLOB.dynamic_curve_centre] and width set to [GLOB.dynamic_curve_width].") - log_admin("Dynamic curve centre set to [GLOB.dynamic_curve_centre] and width set to [GLOB.dynamic_curve_width]") + if(. == "Secret") + GLOB.master_mode = "secret" + SSticker.save_mode(.) + message_admins("The gamemode has been voted for, and has been changed to: [GLOB.master_mode]") + log_admin("Gamemode has been voted for and switched to: [GLOB.master_mode].") + else + GLOB.master_mode = "dynamic" + var/datum/dynamic_storyteller/S = config.pick_storyteller(.) + GLOB.dynamic_storyteller_type = S if("map") var/datum/map_config/VM = config.maplist[.] message_admins("The map has been voted for and will change to: [VM.map_name]") @@ -196,27 +291,58 @@ SUBSYSTEM_DEF(vote) else to_chat(world, "Notice:Restart vote will not restart the server automatically because there are active admins on.") message_admins("A restart vote has passed, but there are active admins on with +server, so it has been canceled. If you wish, you may restart the server.") - + return . -/datum/controller/subsystem/vote/proc/submit_vote(vote) +/datum/controller/subsystem/vote/proc/submit_vote(vote, score = 0) if(mode) if(CONFIG_GET(flag/no_dead_vote) && usr.stat == DEAD && !usr.client.holder) return 0 - if(!(usr.ckey in voted)) - if(vote && 1<=vote && vote<=choices.len) - voted += usr.ckey - voted[usr.ckey] = vote - choices[choices[vote]]++ //check this - return vote - else if(vote && 1<=vote && vote<=choices.len) - choices[choices[voted[usr.ckey]]]-- - voted[usr.ckey] = vote - choices[choices[vote]]++ - return vote + if(vote && ISINRANGE(vote, 1, choices.len)) + switch(vote_system) + if(PLURALITY_VOTING) + if(usr.ckey in voted) + choices[choices[voted[usr.ckey]]]-- + voted[usr.ckey] = vote + choices[choices[vote]]++ + return vote + else + voted += usr.ckey + voted[usr.ckey] = vote + choices[choices[vote]]++ //check this + return vote + if(APPROVAL_VOTING) + if(usr.ckey in voted) + if(vote in voted[usr.ckey]) + voted[usr.ckey] -= vote + choices[choices[vote]]-- + else + voted[usr.ckey] += vote + choices[choices[vote]]++ + else + voted += usr.ckey + voted[usr.ckey] = list(vote) + choices[choices[vote]]++ + return vote + if(RANKED_CHOICE_VOTING) + if(usr.ckey in voted) + if(vote in voted[usr.ckey]) + voted[usr.ckey] -= vote + else + voted += usr.ckey + voted[usr.ckey] = list() + voted[usr.ckey] += vote + saved -= usr.ckey + if(SCORE_VOTING) + if(!(usr.ckey in voted)) + voted += usr.ckey + voted[usr.ckey] = list() + voted[usr.ckey][choices[vote]] = score + saved -= usr.ckey return 0 -/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, hideresults)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes +/datum/controller/subsystem/vote/proc/initiate_vote(vote_type, initiator_key, hideresults, votesystem = PLURALITY_VOTING, forced = FALSE,vote_time = -1)//CIT CHANGE - adds hideresults argument to votes to allow for obfuscated votes + vote_system = votesystem if(!mode) if(started_time) var/next_allowed_time = (started_time + CONFIG_GET(number/vote_delay)) @@ -257,11 +383,17 @@ SUBSYSTEM_DEF(vote) if("roundtype") //CIT CHANGE - adds the roundstart secret/extended vote choices.Add("secret", "extended") if("dynamic") - var/saved_threats = SSpersistence.saved_threat_levels - if((saved_threats[1]+saved_threats[2]+saved_threats[3])>150) - choices.Add("extended",PEACE,CHAOS) - else - choices.Add(PEACE,CHAOS) + for(var/T in config.storyteller_cache) + var/datum/dynamic_storyteller/S = T + var/recent_rounds = 0 + for(var/i in 1 to SSpersistence.saved_storytellers.len) + if(SSpersistence.saved_storytellers[i] == initial(S.name)) + recent_rounds++ + if(recent_rounds < initial(S.weight)) + choices.Add(initial(S.name)) + choice_descs.Add(initial(S.desc)) + choices.Add("Secret") + choice_descs.Add("Standard secret. Switches mode if it wins.") if("custom") question = stripped_input(usr,"What is the vote for?") if(!question) @@ -280,9 +412,11 @@ SUBSYSTEM_DEF(vote) if(mode == "custom") text += "\n[question]" log_vote(text) - var/vp = CONFIG_GET(number/vote_period) + var/vp = vote_time + if(vp == -1) + vp = CONFIG_GET(number/vote_period) to_chat(world, "\n[text]\nType vote or click here to place your votes.\nYou have [DisplayTimeText(vp)] to vote.") - time_remaining = round(vp/10) + end_time = started_time+vp for(var/c in GLOB.clients) SEND_SOUND(c, sound('sound/misc/server-ready.ogg')) var/client/C = c @@ -292,6 +426,11 @@ SUBSYSTEM_DEF(vote) C.player_details.player_actions += V V.Grant(C.mob) generated_actions += V + if(forced) + var/datum/browser/popup = new(C, "vote", "Voting Panel",nwidth=600,nheight=700) + popup.set_window_options("can_close=0") + popup.set_content(SSvote.interface(C)) + popup.open(0) return 1 return 0 @@ -311,14 +450,71 @@ SUBSYSTEM_DEF(vote) . += "

Vote: '[question]'

" else . += "

Vote: [capitalize(mode)]

" - . += "Time Left: [time_remaining] s

" + switch(vote_system) + if(PLURALITY_VOTING) + . += "

Vote one.

" + if(APPROVAL_VOTING) + . += "

Vote any number of choices.

" + if(RANKED_CHOICE_VOTING) + . += "

Vote by order of preference. Revoting will demote to the bottom. 1 is your favorite, and higher numbers are worse.

" + if(SCORE_VOTING) + . += "

Grade the candidates by how much you like them.

" + . += "

No-votes have no power--your opinion is only heard if you vote!

" + . += "Time Left: [DisplayTimeText(end_time-world.time)]

" + if(RANKED_CHOICE_VOTING) + var/list/myvote = voted[C.ckey] + for(var/i=1,i<=choices.len,i++) + var/vote = (myvote ? (myvote.Find(i)) : 0) + if(vote) + . += "
  • [choices[i]] ([vote])
  • " + else + . += "
  • [choices[i]]
  • " + if(choice_descs.len >= i) + . += "
  • [choice_descs[i]]
  • " + . += "
    " + if(!(C.ckey in saved)) + . += "(Save vote)" + else + . += "(Saved!)" + . += "(Load vote from save)" + . += "(Reset votes)" + if(SCORE_VOTING) + var/list/myvote = voted[C.ckey] + for(var/i=1,i<=choices.len,i++) + . += "
  • [choices[i]]" + for(var/r in 1 to GLOB.vote_score_options.len) + . += " " + if((choices[i] in myvote) && myvote[choices[i]] == r) + . +="([GLOB.vote_score_options[r]])" + else + . +="[GLOB.vote_score_options[r]]" + . += "" + . += "
  • " + if(choice_descs.len >= i) + . += "
  • [choice_descs[i]]
  • " + . += "
    " + if(!(C.ckey in saved)) + . += "(Save vote)" + else + . += "(Saved!)" + . += "(Load vote from save)" + . += "(Reset votes)" if(admin) . += "(Cancel Vote) " else @@ -376,8 +572,31 @@ SUBSYSTEM_DEF(vote) if("custom") if(usr.client.holder) initiate_vote("custom",usr.key) + if("reset") + if(usr.ckey in voted) + voted -= usr.ckey + if("save") + if(usr.ckey in voted) + if(!(usr.ckey in SSpersistence.saved_votes)) + SSpersistence.saved_votes[usr.ckey] = list() + SSpersistence.saved_votes[usr.ckey][mode] = voted[usr.ckey] + saved += usr.ckey + if("load") + if(!(usr.ckey in SSpersistence.saved_votes)) + SSpersistence.LoadSavedVote(usr.ckey) + if(!(usr.ckey in SSpersistence.saved_votes)) + SSpersistence.saved_votes[usr.ckey] = list() + if(usr.ckey in voted) + SSpersistence.saved_votes[usr.ckey][mode] = voted[usr.ckey] + else + SSpersistence.saved_votes[usr.ckey][mode] = list() + voted[usr.ckey] = SSpersistence.saved_votes[usr.ckey][mode] + saved += usr.ckey else - submit_vote(round(text2num(href_list["vote"]))) + if(vote_system == SCORE_VOTING) + submit_vote(round(text2num(href_list["vote"])),round(text2num(href_list["score"]))) + else + submit_vote(round(text2num(href_list["vote"]))) usr.vote() /datum/controller/subsystem/vote/proc/remove_action_buttons() @@ -392,7 +611,7 @@ SUBSYSTEM_DEF(vote) set category = "OOC" set name = "Vote" - var/datum/browser/popup = new(src, "vote", "Voting Panel") + var/datum/browser/popup = new(src, "vote", "Voting Panel",nwidth=600,nheight=700) popup.set_window_options("can_close=0") popup.set_content(SSvote.interface(client)) popup.open(0) @@ -419,6 +638,3 @@ SUBSYSTEM_DEF(vote) var/datum/player_details/P = GLOB.player_details[owner.ckey] if(P) P.player_actions -= src - -#undef PEACE -#undef CHAOS diff --git a/code/datums/action.dm b/code/datums/action.dm index 77aa729eb1..cb56c26b91 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -141,6 +141,17 @@ current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) current_button.button_icon_state = button_icon_state +/datum/action/ghost + icon_icon = 'icons/mob/mob.dmi' + button_icon_state = "ghost" + name = "Ghostize" + desc = "Turn into a ghost and freely come back to your body." + +/datum/action/ghost/Trigger() + if(!..()) + return 0 + var/mob/M = target + M.ghostize(1) //Presets for item actions /datum/action/item_action diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index d5af47ea1f..06169f64bf 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -32,7 +32,7 @@ if(ishuman(M) && source.force && source.get_sharpness()) var/mob/living/carbon/human/H = M - if((H.health <= H.crit_threshold || (user.pulling == H && user.grab_state >= GRAB_NECK) || H.IsSleeping()) && user.zone_selected == BODY_ZONE_HEAD) // Only sleeping, neck grabbed, or crit, can be sliced. + if((H.health <= H.crit_threshold || (user.pulling == H && user.grab_state >= GRAB_NECK) || H.IsSleeping()) && user.zone_selected == BODY_ZONE_PRECISE_MOUTH) // Only sleeping, neck grabbed, or crit, can be sliced. if(H.has_status_effect(/datum/status_effect/neck_slice)) user.show_message("[H]'s neck has already been already cut, you can't make the bleeding any worse!", 1, \ "Their neck has already been already cut, you can't make the bleeding any worse!") @@ -120,4 +120,4 @@ if(eater.safety_mode || (eater.stat & (BROKEN|NOPOWER))) //I'm so sorry. return if(L.stat == DEAD && (L.butcher_results || L.guaranteed_butcher_results)) - Butcher(parent, L) \ No newline at end of file + Butcher(parent, L) diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 0ef13b514b..89c4deb2e9 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -11,8 +11,9 @@ var/list/datum/nanite_program/programs = list() var/max_programs = NANITE_PROGRAM_LIMIT - var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans, and does not display the program list on nanite scans - + var/stealth = FALSE //if TRUE, does not appear on HUDs and health scans + var/diagnostics = TRUE //if TRUE, displays program list when scanned by nanite scanners + /datum/component/nanites/Initialize(amount = 100, cloud = 0) if(!isliving(parent) && !istype(parent, /datum/nanite_cloud_backup)) return COMPONENT_INCOMPATIBLE @@ -252,8 +253,8 @@ to_chat(user, "Cloud ID: [cloud_id ? cloud_id : "Disabled"]") to_chat(user, "================") to_chat(user, "Program List:") - if(stealth) - to_chat(user, "%#$ENCRYPTED&^@") + if(!diagnostics) + to_chat(user, "Diagnostics Disabled") else for(var/X in programs) var/datum/nanite_program/NP = X diff --git a/code/datums/components/storage/concrete/_concrete.dm b/code/datums/components/storage/concrete/_concrete.dm index f7ca711421..accc8cadaf 100644 --- a/code/datums/components/storage/concrete/_concrete.dm +++ b/code/datums/components/storage/concrete/_concrete.dm @@ -66,7 +66,7 @@ /datum/component/storage/concrete/_insert_physical_item(obj/item/I, override = FALSE) . = TRUE var/atom/real_location = real_location() - if(I.loc != real_location) + if(I.loc != real_location && real_location) I.forceMove(real_location) refresh_mob_views() diff --git a/code/datums/elements/_element.dm b/code/datums/elements/_element.dm index 8f9b97db22..17e2b12232 100644 --- a/code/datums/elements/_element.dm +++ b/code/datums/elements/_element.dm @@ -11,7 +11,7 @@ if(type == /datum/element) return ELEMENT_INCOMPATIBLE if(element_flags & ELEMENT_DETACH) - RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach) + RegisterSignal(target, COMSIG_PARENT_QDELETING, .proc/Detach, override = TRUE) /datum/element/proc/Detach(datum/source, force) UnregisterSignal(source, COMSIG_PARENT_QDELETING) @@ -36,4 +36,4 @@ */ /datum/proc/RemoveElement(eletype, ...) var/datum/element/ele = SSdcs.GetElement(arglist(args)) - ele.Detach(src) \ No newline at end of file + ele.Detach(src) diff --git a/code/datums/elements/ghost_role_eligibility.dm b/code/datums/elements/ghost_role_eligibility.dm new file mode 100644 index 0000000000..8ecb579bc8 --- /dev/null +++ b/code/datums/elements/ghost_role_eligibility.dm @@ -0,0 +1,54 @@ +/datum/element/ghost_role_eligibility + element_flags = ELEMENT_DETACH + var/list/timeouts = list() + var/list/mob/eligible_mobs = list() + +/datum/element/ghost_role_eligibility/Attach(datum/target,penalize = FALSE) + . = ..() + if(!ismob(target)) + return ELEMENT_INCOMPATIBLE + var/mob/M = target + if(!(M in eligible_mobs)) + eligible_mobs += M + if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. + var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES + var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES + if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. + penalty += roundstart_quit_limit - world.time + if(penalty) + penalty += world.realtime + if(penalty - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) + penalty = CANT_REENTER_ROUND + if(!(M.ckey in timeouts)) + timeouts += M.ckey + timeouts[M.ckey] = 0 + timeouts[M.ckey] = max(timeouts[M.ckey],penalty) + +/datum/element/ghost_role_eligibility/Detach(mob/M) + . = ..() + if(M in eligible_mobs) + eligible_mobs -= M + +/datum/element/ghost_role_eligibility/proc/get_all_ghost_role_eligible(silent = FALSE) + var/list/candidates = list() + for(var/m in eligible_mobs) + var/mob/M = m + if(M.can_reenter_round(TRUE)) + candidates += M + return candidates + +/mob/proc/can_reenter_round(silent = FALSE) + var/datum/element/ghost_role_eligibility/eli = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + return eli.can_reenter_round(src,silent) + +/datum/element/ghost_role_eligibility/proc/can_reenter_round(var/mob/M,silent = FALSE) + if(!(M in eligible_mobs)) + return FALSE + if(!(M.ckey in timeouts)) + return TRUE + var/timeout = timeouts[M.ckey] + if(timeout != CANT_REENTER_ROUND && timeout <= world.realtime) + return TRUE + if(!silent && M.client) + to_chat(M, "You are unable to reenter the round[timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(timeout - world.realtime)]" : ""].") + return FALSE diff --git a/code/datums/emotes.dm b/code/datums/emotes.dm index f0fca5db5a..599c492d4c 100644 --- a/code/datums/emotes.dm +++ b/code/datums/emotes.dm @@ -136,9 +136,10 @@ /datum/emote/sound var/sound //Sound to play when emote is called var/vary = FALSE //used for the honk borg emote + var/volume = 50 mob_type_allowed_typecache = list(/mob/living/brain, /mob/living/silicon) /datum/emote/sound/run_emote(mob/user, params) . = ..() if(.) - playsound(user.loc, sound, 50, vary) + playsound(user.loc, sound, volume, vary) diff --git a/code/datums/martial/rising_bass.dm b/code/datums/martial/rising_bass.dm index a3b71c6784..9e00c90a92 100644 --- a/code/datums/martial/rising_bass.dm +++ b/code/datums/martial/rising_bass.dm @@ -150,7 +150,9 @@ if(!.) return ADD_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) + ADD_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) /datum/martial_art/the_rising_bass/on_remove(mob/living/carbon/human/H) . = ..() - REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) \ No newline at end of file + REMOVE_TRAIT(H, TRAIT_NOGUNS, RISING_BASS_TRAIT) + REMOVE_TRAIT(H, TRAIT_AUTO_CATCH_ITEM, RISING_BASS_TRAIT) \ No newline at end of file diff --git a/code/datums/mind.dm b/code/datums/mind.dm index d1b4e51a7d..5c92c83fb5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -135,8 +135,12 @@ if(L.client && L.client.prefs) L.canbearoused = L.client.prefs.arousable //Technically this should make taking over a character mean the body gain the new minds setting... L.update_arousal_hud() //Removes the old icon + if (L.client.prefs.auto_ooc) + if (L.client.prefs.chat_toggles & CHAT_OOC) + L.client.prefs.chat_toggles ^= CHAT_OOC SEND_SIGNAL(src, COMSIG_MIND_TRANSFER, new_character, old_character) + SEND_SIGNAL(new_character, COMSIG_MOB_ON_NEW_MIND) /datum/mind/proc/store_memory(new_text) if((length(memory) + length(new_text)) <= MAX_MESSAGE_LEN) @@ -744,6 +748,7 @@ else mind = new /datum/mind(key) SSticker.minds += mind + SEND_SIGNAL(src, COMSIG_MOB_ON_NEW_MIND) if(!mind.name) mind.name = real_name mind.current = src diff --git a/code/datums/radiation_wave.dm b/code/datums/radiation_wave.dm index 5dce5791c2..4795f8da60 100644 --- a/code/datums/radiation_wave.dm +++ b/code/datums/radiation_wave.dm @@ -117,7 +117,7 @@ continue contam_atoms += thing var/did_contam = 0 - if(can_contam) + if(length(can_contam)) var/rad_strength = ((strength-RAD_MINIMUM_CONTAMINATION) * RAD_CONTAMINATION_STR_COEFFICIENT)/contam_atoms.len for(var/k in 1 to contam_atoms.len) var/atom/thing = contam_atoms[k] diff --git a/code/datums/ruins/station.dm b/code/datums/ruins/station.dm index 156356788f..624081156a 100644 --- a/code/datums/ruins/station.dm +++ b/code/datums/ruins/station.dm @@ -10,6 +10,21 @@ suffix = "Box/Engine/engine_sm.dmm" name = "Engine SM" +/datum/map_template/ruin/station/box/engine/onebythree + id = "engine_sm_1x3" + suffix = "Box/Engine/engine_sm_1x3.dmm" + name = "Engine SM 1x3" + +/datum/map_template/ruin/station/box/engine/fivebyfive + id = "engine_sm_5x5" + suffix = "Box/Engine/engine_sm_5x5.dmm" + name = "Engine SM 5x5" + +/datum/map_template/ruin/station/box/engine/threesm + id = "engine_sm_3x" + suffix = "Box/Engine/engine_sm_3x.dmm" + name = "Engine SM 3x" + /datum/map_template/ruin/station/box/engine/singulo id = "engine_singulo" suffix = "Box/Engine/engine_singulo.dmm" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index 5c4fc61827..5dab98d5ca 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -292,6 +292,7 @@ var/mob/living/carbon/C = owner for(var/X in C.bodyparts) var/obj/item/bodypart/BP = X + BP.max_damage *= 10 BP.brute_dam *= 10 BP.burn_dam *= 10 owner.toxloss *= 10 @@ -377,6 +378,7 @@ var/obj/item/bodypart/BP = X BP.brute_dam *= 0.1 BP.burn_dam *= 0.1 + BP.max_damage /= 10 owner.toxloss *= 0.1 owner.oxyloss *= 0.1 owner.cloneloss *= 0.1 diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index eae2db6a5f..e712a38df1 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -88,15 +88,6 @@ if(quirk_holder) quirk_holder.remove_client_colour(/datum/client_colour/monochrome) -/datum/quirk/crocrin_immunity - name = "Crocin Immunity" - desc = "You're one of the few people in the galaxy who are genetically immune to Crocin and Hexacrocin products and their addictive properties! However, you can still get brain damage from Hexacrocin addiction." - mob_trait = TRAIT_CROCRIN_IMMUNE - value = 0 - gain_text = "You feel more prudish." - lose_text = "You don't feel as prudish as before." - medical_record_text = "Patient exhibits a special gene that makes them immune to aphrodisiacs." - /datum/quirk/libido name = "Nymphomania" desc = "You're always feeling a bit in heat. Also, you get aroused faster than usual." @@ -131,22 +122,20 @@ gain_text = "You feel like exposing yourself to the world." lose_text = "Indecent exposure doesn't sound as charming to you anymore." -/datum/quirk/pharmacokinesis //Prevents unwanted organ additions. - name = "Acute hepatic pharmacokinesis" - desc = "You've a rare genetic disorder that causes Incubus draft and Sucubus milk to be absorbed by your liver instead." +/datum/quirk/alcohol_intolerance + name = "Alcohol Intolerance" + desc = "You take toxin damage from alcohol rather than getting drunk." value = 0 - mob_trait = TRAIT_PHARMA - lose_text = "Your liver feels different." - medical_record_text = "Non-invasive tests report that the patient's metabolism is indeed incompatible with a certain \"stimulants\"." - var/active = FALSE - var/power = 0 - var/cachedmoveCalc = 1 + mob_trait = TRAIT_NO_ALCOHOL + medical_record_text = "Patient's body does not react properly to ethyl alcohol." -/datum/quirk/assblastusa - name = "Buns of Steel" - desc = "You've never skipped ass day. With this trait, you are completely immune to all forms of ass slapping and anyone who tries to slap your rock hard ass usually gets a broken hand." - mob_trait = TRAIT_ASSBLASTUSA - value = 0 - medical_record_text = "Patient never skipped ass day." - gain_text = "Your ass rivals those of golems." - lose_text = "Your butt feels more squishy and slappable." \ No newline at end of file +/datum/quirk/alcohol_intolerance/add() + var/mob/living/carbon/human/H = quirk_holder + var/datum/species/species = H.dna.species + species.disliked_food |= ALCOHOL + +/datum/quirk/alcohol_intolerance/remove() + var/mob/living/carbon/human/H = quirk_holder + if(H) + var/datum/species/species = H.dna.species + species.disliked_food &= ~ALCOHOL diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 66570205e3..36b701aae1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -47,7 +47,7 @@ /atom/New(loc, ...) //atom creation method that preloads variables at creation if(GLOB.use_preloader && (src.type == GLOB._preloader.target_path))//in case the instanciated atom is creating other atoms in New() - GLOB._preloader.load(src) + world.preloader_load(src) if(datum_flags & DF_USE_TAG) GenerateTag() @@ -166,7 +166,7 @@ return FALSE -/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/atom/proc/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) SEND_SIGNAL(src, COMSIG_ATOM_HULK_ATTACK, user) if(does_attack_animation) user.changeNext_move(CLICK_CD_MELEE) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index ef20b6e35e..7c57de74a4 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -515,10 +515,10 @@ step(src, AM.dir) ..() -/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) - return throw_at(target, range, speed, thrower, spin, diagonals_first, callback) +/atom/movable/proc/safe_throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback, messy_throw = TRUE) + return throw_at(target, range, speed, thrower, spin, diagonals_first, callback, messy_throw) -/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback) //If this returns FALSE then callback will not be called. +/atom/movable/proc/throw_at(atom/target, range, speed, mob/thrower, spin=TRUE, diagonals_first = FALSE, var/datum/callback/callback, messy_throw = TRUE) //If this returns FALSE then callback will not be called. . = FALSE if (!target || speed <= 0) return diff --git a/code/game/gamemodes/clown_ops/clown_ops.dm b/code/game/gamemodes/clown_ops/clown_ops.dm index 49a336e16a..11898701fa 100644 --- a/code/game/gamemodes/clown_ops/clown_ops.dm +++ b/code/game/gamemodes/clown_ops/clown_ops.dm @@ -57,7 +57,6 @@ ..() if(visualsOnly) return - H.dna.add_mutation(CLOWNMUT) H.dna.add_mutation(SMILE) /datum/outfit/syndicate/clownop/leader diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 0890d81dfb..821c819664 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -1,14 +1,3 @@ -#define CURRENT_LIVING_PLAYERS 1 -#define CURRENT_LIVING_ANTAGS 2 -#define CURRENT_DEAD_PLAYERS 3 -#define CURRENT_OBSERVERS 4 - -#define ONLY_RULESET 1 -#define HIGHLANDER_RULESET 2 -#define TRAITOR_RULESET 4 -#define MINOR_RULESET 8 - -#define RULESET_STOP_PROCESSING 1 // -- Injection delays GLOBAL_VAR_INIT(dynamic_latejoin_delay_min, (10 MINUTES)) @@ -52,6 +41,8 @@ GLOBAL_LIST_EMPTY(dynamic_forced_roundstart_ruleset) // Forced threat level, setting this to zero or higher forces the roundstart threat to the value. GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) +GLOBAL_VAR_INIT(dynamic_storyteller_type, null) + /datum/game_mode/dynamic name = "dynamic mode" config_tag = "dynamic" @@ -60,7 +51,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) announce_text = "Dynamic mode!" // This needs to be changed maybe reroll_friendly = FALSE; - + // Current storyteller + var/datum/dynamic_storyteller/storyteller = null // Threat logging vars /// The "threat cap", threat shouldn't normally go above this and is used in ruleset calculations var/threat_level = 0 @@ -164,6 +156,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "Threat to Spend: [threat] \[Adjust\] \[View Log\]
    " dat += "
    " + dat += "Storyteller: [storyteller.name]
    " dat += "Parameters: centre = [GLOB.dynamic_curve_centre] ; width = [GLOB.dynamic_curve_width].
    " dat += "On average, [peaceful_percentage]% of the rounds are more peaceful.
    " dat += "Forced extended: [GLOB.dynamic_forced_extended ? "On" : "Off"]
    " @@ -178,7 +171,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) dat += "[DR.ruletype] - [DR.name]
    " else dat += "none.
    " - dat += "
    Injection Timers: ([get_injection_chance(TRUE)]% chance)
    " + dat += "
    Injection Timers: ([storyteller.get_injection_chance(TRUE)]% chance)
    " dat += "Latejoin: [(latejoin_injection_cooldown-world.time)>60*10 ? "[round((latejoin_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(latejoin_injection_cooldown-world.time)] seconds"] \[Now!\]
    " dat += "Midround: [(midround_injection_cooldown-world.time)>60*10 ? "[round((midround_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(midround_injection_cooldown-world.time)] seconds"] \[Now!\]
    " dat += "Event: [(event_injection_cooldown-world.time)>60*10 ? "[round((event_injection_cooldown-world.time)/60/10,0.1)] minutes" : "[(event_injection_cooldown-world.time)] seconds"] \[Now!\]
    " @@ -336,6 +329,9 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) SSblackbox.record_feedback("tally","dynamic_threat",peaceful_percentage,"Percent of same-vote rounds that are more peaceful") /datum/game_mode/dynamic/can_start() + storyteller = new GLOB.dynamic_storyteller_type // this is where all the initialization happens + storyteller.on_start() + SSblackbox.record_feedback("text","dynamic_storyteller",1,storyteller.name) message_admins("Dynamic mode parameters for the round:") message_admins("Centre is [GLOB.dynamic_curve_centre], Width is [GLOB.dynamic_curve_width], Forced extended is [GLOB.dynamic_forced_extended ? "Enabled" : "Disabled"], No stacking is [GLOB.dynamic_no_stacking ? "Enabled" : "Disabled"].") message_admins("Stacking limit is [GLOB.dynamic_stacking_limit], Classic secret is [GLOB.dynamic_classic_secret ? "Enabled" : "Disabled"], High population limit is [GLOB.dynamic_high_pop_limit].") @@ -345,19 +341,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if(GLOB.dynamic_forced_threat_level >= 0) threat_level = round(GLOB.dynamic_forced_threat_level, 0.1) threat = threat_level - SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Threat level (forced by admins)") + SSblackbox.record_feedback("tally","dynamic_threat",threat_level,"Threat level (forced)") else generate_threat() - var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time + storyteller.start_injection_cooldowns() - var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max) - midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time - - var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) - log_game("DYNAMIC: Dynamic Mode initialized with a Threat Level of... [threat_level]!") initial_threat_level = threat_level return TRUE @@ -391,7 +380,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) log_game("DYNAMIC: [roundstart_rules.len] rules.") return TRUE SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Roundstart rules considered") - SSblackbox.record_feedback("tally","dynamic",roundstart_rules.len,"Players readied up") + SSblackbox.record_feedback("tally","dynamic",roundstart_pop_ready,"Players readied up") if(GLOB.dynamic_forced_roundstart_ruleset.len > 0) rigged_roundstart() else @@ -429,13 +418,7 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (GLOB.dynamic_forced_extended) log_game("DYNAMIC: Starting a round of forced extended.") return TRUE - var/list/drafted_rules = list() - for (var/datum/dynamic_ruleset/roundstart/rule in roundstart_rules) - if (rule.acceptable(roundstart_pop_ready, threat_level) && threat >= rule.cost) // If we got the population and threat required - rule.candidates = candidates.Copy() - rule.trim_candidates() - if (rule.ready() && rule.candidates.len > 0) - drafted_rules[rule] = rule.weight + var/list/drafted_rules = storyteller.roundstart_draft() if(!drafted_rules.len) message_admins("Not enough threat level for roundstart antags!") log_game("DYNAMIC: Not enough threat level for roundstart antags!") @@ -653,7 +636,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) if (rule.persistent) current_rules += rule return TRUE - rule.clean_up() stack_trace("The [rule.ruletype] rule \"[rule.name]\" failed to execute.") return FALSE @@ -667,62 +649,41 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) current_rules -= rule SSblackbox.record_feedback("tally","dynamic",1,"Rulesets finished") SSblackbox.record_feedback("associative","dynamic_rulesets_finished",1,rule.get_blackbox_info()) - + + storyteller.do_process() + if (midround_injection_cooldown < world.time) if (GLOB.dynamic_forced_extended) return // Somehow it managed to trigger midround multiple times so this was moved here. // There is no way this should be able to trigger an injection twice now. - var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) - midround_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + world.time) + midround_injection_cooldown = storyteller.get_midround_cooldown() + world.time // Time to inject some threat into the round if(EMERGENCY_ESCAPED_OR_ENDGAMED) // Unless the shuttle is gone return + if((world.realtime - SSshuttle.realtimeofstart) > SSshuttle.auto_call) // no rules after shuttle is auto-called + return message_admins("DYNAMIC: Checking for midround injection.") log_game("DYNAMIC: Checking for midround injection.") update_playercounts() - if (get_injection_chance()) + if (prob(storyteller.get_injection_chance())) SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections") - var/cur_threat_frac = threat/threat_level - var/list/drafted_rules = list() - var/antag_num = current_players[CURRENT_LIVING_ANTAGS].len - for (var/datum/dynamic_ruleset/midround/rule in midround_rules) - // if there are antags OR the rule is an antag rule, antag_acceptable will be true. - if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) - // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) - continue - rule.trim_candidates() - if (rule.ready()) - if(!antag_num) - drafted_rules[rule] = round(rule.get_weight() + (rule.cost * cur_threat_frac)) - else - drafted_rules[rule] = rule.get_weight() - else if(threat < rule.cost) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + var/list/drafted_rules = storyteller.midround_draft() if (drafted_rules.len > 0) SSblackbox.record_feedback("tally","dynamic",1,"Successful midround injections") picking_midround_latejoin_rule(drafted_rules) - else - midround_injection_cooldown = (midround_injection_cooldown + world.time)/2 + // get_injection_chance can do things on fail if(event_injection_cooldown < world.time) SSblackbox.record_feedback("tally","dynamic",1,"Attempted event injections") - var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) - event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) + event_injection_cooldown = storyteller.get_event_cooldown() + world.time message_admins("DYNAMIC: Doing event injection.") log_game("DYNAMIC: Doing event injection.") update_playercounts() - var/list/drafted_rules = list() - for(var/datum/dynamic_ruleset/event/rule in events) - if(rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) - if(rule.ready()) - drafted_rules[rule] = rule.get_weight() - else if(threat < rule.cost) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + var/list/drafted_rules = storyteller.event_draft() if(drafted_rules.len > 0) SSblackbox.record_feedback("tally","dynamic",1,"Successful event injections") picking_midround_latejoin_rule(drafted_rules) @@ -748,31 +709,6 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) continue current_players[CURRENT_DEAD_PLAYERS].Add(M) // Players who actually died (and admins who ghosted, would be nice to avoid counting them somehow) -/// Gets the chance for latejoin and midround injection, the dry_run argument is only used for forced injection. -/datum/game_mode/dynamic/proc/get_injection_chance(dry_run = FALSE) - if(forced_injection) - forced_injection = !dry_run - return 100 - var/chance = 0 - // If the high pop override is in effect, we reduce the impact of population on the antag injection chance - var/high_pop_factor = (current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) - var/max_pop_per_antag = max(5,15 - round(threat_level/10) - round(current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) - if (!current_players[CURRENT_LIVING_ANTAGS].len) - chance += 80 // No antags at all? let's boost those odds! - else - var/current_pop_per_antag = current_players[CURRENT_LIVING_PLAYERS].len / current_players[CURRENT_LIVING_ANTAGS].len - if (current_pop_per_antag > max_pop_per_antag) - chance += min(50, 25+10*(current_pop_per_antag-max_pop_per_antag)) - else - chance += 25-10*(max_pop_per_antag-current_pop_per_antag) - if (current_players[CURRENT_DEAD_PLAYERS].len > current_players[CURRENT_LIVING_PLAYERS].len) - chance -= 30 // More than half the crew died? ew, let's calm down on antags - if (threat > 70) - chance += 15 - if (threat < 30) - chance -= 15 - return round(max(0,chance)) - /// Removes type from the list /datum/game_mode/dynamic/proc/remove_from_list(list/type_list, type) for(var/I in type_list) @@ -803,7 +739,8 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) return if(EMERGENCY_ESCAPED_OR_ENDGAMED) // No more rules after the shuttle has left return - + if((world.realtime - SSshuttle.realtimeofstart) > SSshuttle.auto_call) // no rules after shuttle is auto-called + return update_playercounts() if (forced_latejoin_rule) @@ -814,28 +751,12 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1) picking_midround_latejoin_rule(list(forced_latejoin_rule), forced = TRUE) forced_latejoin_rule = null - else if (latejoin_injection_cooldown < world.time && prob(get_injection_chance())) + else if (latejoin_injection_cooldown < world.time && prob(storyteller.get_injection_chance())) SSblackbox.record_feedback("tally","dynamic",1,"Attempted latejoin injections") - var/list/drafted_rules = list() - for (var/datum/dynamic_ruleset/latejoin/rule in latejoin_rules) - if (rule.acceptable(current_players[CURRENT_LIVING_PLAYERS].len, threat_level) && threat >= rule.cost) - // Classic secret : only autotraitor/minor roles - if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) - continue - // No stacking : only one round-ender, unless threat level > stacking_limit. - if (threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) - if(rule.flags & HIGHLANDER_RULESET && highlander_executed) - continue - - rule.candidates = list(newPlayer) - rule.trim_candidates() - if (rule.ready()) - drafted_rules[rule] = rule.get_weight() - + var/list/drafted_rules = storyteller.latejoin_draft(newPlayer) if (drafted_rules.len > 0 && picking_midround_latejoin_rule(drafted_rules)) SSblackbox.record_feedback("tally","dynamic",1,"Successful latejoin injections") - var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) - latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + world.time + latejoin_injection_cooldown = storyteller.get_latejoin_cooldown() + world.time /// Refund threat, but no more than threat_level. /datum/game_mode/dynamic/proc/refund_threat(regain) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets.dm b/code/game/gamemodes/dynamic/dynamic_rulesets.dm index 7f6ea088a1..2f143f7233 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets.dm @@ -80,9 +80,13 @@ /// Delay for when execute will get called from the time of post_setup (roundstart) or process (midround/latejoin). /// Make sure your ruleset works with execute being called during the game when using this, and that the clean_up proc reverts it properly in case of faliure. var/delay = 0 + /// List of tags for use in storytellers. + var/list/property_weights = list() /// Whether or not recent-round weight values are taken into account for this ruleset. /// Weight reduction uses the same values as secret's recent-round mode weight reduction. var/always_max_weight = FALSE + /// Weight reduction by recent-rounds. Saved on new. + var/weight_mult = 1 /datum/dynamic_ruleset/New() ..() @@ -96,13 +100,11 @@ var/high_population_requirements = CONFIG_GET(keyed_list/dynamic_high_population_requirement) var/list/repeated_mode_adjust = CONFIG_GET(number_list/repeated_mode_adjust) if(config_tag in weights) - var/weight_mult = 1 if(!always_max_weight && SSpersistence.saved_dynamic_rules.len == 3 && repeated_mode_adjust.len == 3) var/saved_dynamic_rules = SSpersistence.saved_dynamic_rules for(var/i in 1 to 3) if(config_tag in saved_dynamic_rules[i]) weight_mult -= (repeated_mode_adjust[i]/100) - weight = weights[config_tag] * weight_mult if(config_tag in costs) cost = costs[config_tag] if(config_tag in requirementses) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm index b6cd313bfc..23e94c4065 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_events.dm @@ -58,6 +58,7 @@ cost = 10 blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear) requirements = list(70,60,50,50,40,40,40,30,20,15) + property_weights = list("story_potential" = 1, "trust" = 1, "chaos" = 1) high_population_requirement = 15 /datum/dynamic_ruleset/event/pirates/ready(forced = FALSE) @@ -81,6 +82,7 @@ cost = 10 requirements = list(70,60,50,50,40,40,40,30,20,15) high_population_requirement = 15 + property_weights = list("chaos" = 1, "valid" = 1) ////////////////////////////////////////////// // // @@ -100,6 +102,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) // yes, can happen on fake-extended high_population_requirement = 5 repeatable = TRUE + property_weights = list("chaos" = 1, "extended" = 2) /datum/dynamic_ruleset/event/ventclog/ready() if(mode.threat_level > 30 && mode.threat >= 5 && prob(20)) @@ -133,10 +136,11 @@ required_enemies = list(1,1,0,0,0,0,0,0,0,0) weight = 4 // no repeatable weight decrease. too variable to be unfun multiple times in one round - cost = 3 + cost = 1 requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("story_potential" = 1, "extended" = 1) always_max_weight = TRUE ////////////////////////////////////////////// @@ -156,6 +160,7 @@ repeatable_weight_decrease = 2 requirements = list(60,50,40,30,30,30,30,30,30,30) high_population_requirement = 30 + property_weights = list("extended" = -2) /datum/dynamic_ruleset/event/meteor_wave/ready() if(mode.threat_level > 40 && mode.threat >= 25 && prob(20)) @@ -190,6 +195,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/anomaly_flux name = "Anomaly: Hyper-Energetic Flux" @@ -203,6 +209,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/anomaly_gravitational name = "Anomaly: Gravitational" @@ -214,6 +221,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/anomaly_pyroclastic name = "Anomaly: Pyroclastic" @@ -227,6 +235,7 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/anomaly_vortex name = "Anomaly: Vortex" @@ -240,6 +249,7 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = 1) ////////////////////////////////////////////// // // @@ -259,6 +269,7 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = -1, "chaos" = 1) /datum/dynamic_ruleset/event/carp_migration name = "Carp Migration" @@ -270,6 +281,7 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/communications_blackout name = "Communications Blackout" @@ -283,6 +295,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1, "chaos" = 1) /datum/dynamic_ruleset/event/processor_overload name = "Processor Overload" @@ -296,6 +309,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1, "chaos" = 1) always_max_weight = TRUE /datum/dynamic_ruleset/event/space_dust @@ -310,6 +324,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1) always_max_weight = TRUE /datum/dynamic_ruleset/event/major_dust @@ -324,6 +339,7 @@ requirements = list(10,10,10,10,10,10,10,10,10,10) high_population_requirement = 10 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/electrical_storm name = "Electrical Storm" @@ -337,6 +353,7 @@ requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1) /datum/dynamic_ruleset/event/heart_attack name = "Random Heart Attack" @@ -350,6 +367,7 @@ requirements = list(101,101,101,5,5,5,5,5,5,5) high_population_requirement = 5 repeatable = TRUE + property_weights = list("extended" = 1) always_max_weight = TRUE /datum/dynamic_ruleset/event/radiation_storm @@ -362,3 +380,4 @@ required_enemies = list(1,1,1,1,1,1,1,1,1,1) requirements = list(5,5,5,5,5,5,5,5,5,5) high_population_requirement = 5 + property_weights = list("extended" = 1,"chaos" = 1) diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm index fe9347d9d5..f4e9971a05 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_latejoin.dm @@ -69,8 +69,15 @@ high_population_requirement = 15 repeatable = TRUE flags = TRAITOR_RULESET + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) always_max_weight = TRUE +/datum/dynamic_ruleset/latejoin/infiltrator/execute() + . = ..() + for(var/datum/mind/M in assigned) + log_admin("[M.name] was made into a traitor by dynamic.") + message_admins("[M.name] was made into a traitor by dynamic.") + ////////////////////////////////////////////// // // // REVOLUTIONARY PROVOCATEUR // @@ -94,6 +101,7 @@ requirements = list(101,101,70,40,40,40,40,40,40,40) high_population_requirement = 40 flags = HIGHLANDER_RULESET + property_weights = list("trust" = -2, "chaos" = 2, "extended" = -2, "valid" = 2, "conversion" = 1) var/required_heads_of_staff = 3 var/finished = FALSE var/datum/team/revolution/revolution @@ -123,6 +131,8 @@ revolution.update_objectives() revolution.update_heads() SSshuttle.registerHostileEnvironment(src) + log_admin("[M.name] was made into a revolutionary by dynamic.") + message_admins("[M.name] was made into a revolutionary by dynamic.") return TRUE else log_game("DYNAMIC: [ruletype] [name] discarded [M.name] from head revolutionary due to ineligibility.") @@ -187,30 +197,31 @@ ////////////////////////////////////////////// // // -// VAMPIRE // +// BLOODSUCKERS // // // ////////////////////////////////////////////// -/* -/datum/dynamic_ruleset/latejoin/vampire - name = "vampire" - config_tag = "vampire_latejoin" - antag_flag = ROLE_VAMPIRE - antag_datum = ANTAG_DATUM_VAMPIRE - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") +/datum/dynamic_ruleset/latejoin/bloodsucker + name = "Bloodsucker Infiltrator" + config_tag = "latejoin_bloodsucker" + antag_datum = ANTAG_DATUM_BLOODSUCKER + antag_flag = ROLE_TRAITOR restricted_roles = list("AI", "Cyborg") + protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") required_candidates = 1 - weight = 5 - cost = 15 - requirements = list(80,70,60,50,40,20,20,15,15,15) + weight = 3 + cost = 10 + property_weights = list("story_potential" = 2, "extended" = 2, "trust" = -2, "valid" = 1) + requirements = list(70,65,60,55,50,45,40,35,30,30) + high_population_requirement = 30 repeatable = TRUE - high_population_requirement = 15 -/datum/dynamic_ruleset/latejoin/vampire/pre_execute() +/datum/dynamic_ruleset/latejoin/bloodsucker/execute() var/mob/M = pick(candidates) - candidates -= M assigned += M.mind - M.mind.restricted_roles = restricted_roles - M.mind.special_role = ROLE_VAMPIRE + M.mind.special_role = antag_flag + if(mode.make_bloodsucker(M.mind)) + mode.bloodsuckers += M + log_admin("[M.name] was made into a bloodsucker by dynamic.") + message_admins("[M.name] was made into a bloodsucker by dynamic.") return TRUE -*/ diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm index 91ac73d142..92a02f5920 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_midround.dm @@ -17,10 +17,10 @@ var/list/living_antags = list() var/list/dead_players = list() var/list/list_observers = list() + var/list/ghost_eligible = list() /datum/dynamic_ruleset/midround/from_ghosts weight = 0 - required_type = /mob/dead/observer /// Whether the ruleset should call generate_ruleset_body or not. var/makeBody = TRUE @@ -34,6 +34,8 @@ living_players = trim_list(mode.current_players[CURRENT_LIVING_PLAYERS]) living_antags = trim_list(mode.current_players[CURRENT_LIVING_ANTAGS]) list_observers = trim_list(mode.current_players[CURRENT_OBSERVERS]) + var/datum/element/ghost_role_eligibility/eligibility = SSdcs.GetElement(/datum/element/ghost_role_eligibility) + ghost_eligible = trim_list(eligibility.get_all_ghost_role_eligible()) /datum/dynamic_ruleset/midround/proc/trim_list(list/L = list()) var/list/trimmed_list = L.Copy() @@ -70,6 +72,25 @@ continue return trimmed_list +/datum/dynamic_ruleset/midround/from_ghosts/trim_list(list/L = list()) + var/list/trimmed_list = L.Copy() + for(var/mob/M in trimmed_list) + if (!M.client) // Are they connected? + trimmed_list.Remove(M) + continue + if(!mode.check_age(M.client, minimum_required_age)) + trimmed_list.Remove(M) + continue + if(antag_flag_override) + if(!(antag_flag_override in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag_override)) + trimmed_list.Remove(M) + continue + else + if(!(antag_flag in M.client.prefs.be_special) || jobban_isbanned(M.ckey, antag_flag)) + trimmed_list.Remove(M) + continue + return trimmed_list + // You can then for example prompt dead players in execute() to join as strike teams or whatever // Or autotator someone @@ -91,11 +112,15 @@ return FALSE return TRUE +/datum/dynamic_ruleset/midround/from_ghosts/ready(forced = FALSE) + if (required_candidates > ghost_eligible.len) + SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") + return FALSE + return ..() + + /datum/dynamic_ruleset/midround/from_ghosts/execute() - var/list/possible_candidates = list() - possible_candidates.Add(dead_players) - possible_candidates.Add(list_observers) - var/application_successful = send_applications(possible_candidates) + var/application_successful = send_applications(ghost_eligible) return assigned.len > 0 && application_successful /// This sends a poll to ghosts if they want to be a ghost spawn from a ruleset. @@ -108,8 +133,12 @@ candidates = pollGhostCandidates("The mode is looking for volunteers to become a [name]", antag_flag, SSticker.mode, antag_flag, poll_time = 300) - if(!candidates || candidates.len <= required_candidates) + if(!candidates || candidates.len < required_candidates) message_admins("The ruleset [name] did not receive enough applications.") + if(candidates) + message_admins("Only received [candidates.len], needed [required_candidates].") + else + message_admins("There were no candidates.") log_game("DYNAMIC: The ruleset [name] did not receive enough applications.") return FALSE @@ -180,6 +209,7 @@ repeatable = TRUE high_population_requirement = 15 flags = TRAITOR_RULESET + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1) always_max_weight = TRUE /datum/dynamic_ruleset/midround/autotraitor/acceptable(population = 0, threat = 0) @@ -214,6 +244,8 @@ living_players -= M var/datum/antagonist/traitor/newTraitor = new M.mind.add_antag_datum(newTraitor) + log_admin("[M] was made into a traitor by dynamic.") + message_admins("[M] was made into a traitor by dynamic.") return TRUE @@ -237,6 +269,7 @@ requirements = list(101,101,70,50,50,50,40,30,30,30) high_population_requirement = 30 required_type = /mob/living/silicon/ai + property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2) var/ion_announce = 33 var/removeDontImproveChance = 10 @@ -261,6 +294,8 @@ var/datum/antagonist/traitor/AI = new M.mind.special_role = antag_flag M.mind.add_antag_datum(AI) + log_admin("[M] was made into a malf AI by dynamic.") + message_admins("[M] was made into a malf AI by dynamic.") if(prob(ion_announce)) priority_announce("Ion storm detected near the station. Please check all AI-controlled equipment for errors.", "Anomaly Alert", "ionstorm") if(prob(removeDontImproveChance)) @@ -289,12 +324,10 @@ requirements = list(90,90,70,50,50,50,50,40,30,30) high_population_requirement = 30 repeatable = TRUE + property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2, "extended" = -2) var/datum/mind/wizard /datum/dynamic_ruleset/midround/from_ghosts/wizard/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE if(GLOB.wizardstart.len == 0) log_admin("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") message_admins("Cannot accept Wizard ruleset. Couldn't find any wizard spawn points.") @@ -337,6 +370,7 @@ cost = 35 requirements = list(90,90,90,80,70,60,50,40,40,40) high_population_requirement = 40 + property_weights = list("story_potential" = 2, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2) var/operative_cap = list(2,2,3,3,4,5,5,5,5,5) var/datum/team/nuclear/nuke_team flags = HIGHLANDER_RULESET @@ -354,12 +388,6 @@ required_candidates = operative_cap[indice_pop] return ..() -/datum/dynamic_ruleset/midround/from_ghosts/nuclear/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/nuclear/finish_setup(mob/new_character, index) new_character.mind.special_role = "Nuclear Operative" new_character.mind.assigned_role = "Nuclear Operative" @@ -390,12 +418,7 @@ requirements = list(101,101,101,80,60,50,50,50,50,50) high_population_requirement = 50 repeatable = TRUE - -/datum/dynamic_ruleset/midround/from_ghosts/blob/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() + property_weights = list("story_potential" = -1, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2) /datum/dynamic_ruleset/midround/from_ghosts/blob/generate_ruleset_body(mob/applicant) var/body = applicant.become_overmind() @@ -421,14 +444,9 @@ high_population_requirement = 50 repeatable_weight_decrease = 2 repeatable = TRUE + property_weights = list("story_potential" = -1, "trust" = 1, "chaos" = 2, "extended" = -2, "valid" = 2) var/list/vents = list() -/datum/dynamic_ruleset/midround/from_ghosts/xenomorph/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/xenomorph/execute() // 50% chance of being incremented by one required_candidates += prob(50) @@ -476,6 +494,7 @@ high_population_requirement = 50 repeatable_weight_decrease = 2 repeatable = TRUE + property_weights = list("story_potential" = 1, "trust" = 1, "extended" = 1, "valid" = 2, "integrity" = 2) var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/nightmare/execute() @@ -521,14 +540,9 @@ weight = 4 cost = 5 requirements = list(30,30,20,20,15,10,10,10,10,5) // yes, it can even happen in "extended"! + property_weights = list("story_potential" = 1, "extended" = 1, "valid" = -2) high_population_requirement = 5 -/datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/ready(forced = FALSE) - if (required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE - return ..() - /datum/dynamic_ruleset/midround/from_ghosts/sentient_disease/generate_ruleset_body(mob/applicant) var/mob/camera/disease/virus = new /mob/camera/disease(SSmapping.get_station_center()) applicant.transfer_ckey(virus, FALSE) @@ -555,17 +569,18 @@ cost = 5 requirements = list(30,30,30,30,20,15,15,15,15,15) high_population_requirement = 15 + property_weights = list("story_potential" = -2, "extended" = -1) var/list/spawn_locs = list() -/datum/dynamic_ruleset/midround/from_ghosts/revenant/ready(forced = FALSE) +/datum/dynamic_ruleset/midround/from_ghosts/revenant/acceptable(population = 0,threat = 0) var/deadMobs = 0 for(var/mob/M in GLOB.dead_mob_list) deadMobs++ if(deadMobs < REVENANT_SPAWN_THRESHOLD) return FALSE - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE + return ..() + +/datum/dynamic_ruleset/midround/from_ghosts/revenant/ready(forced = FALSE) for(var/mob/living/L in GLOB.dead_mob_list) //look for any dead bodies var/turf/T = get_turf(L) if(T && is_station_level(T.z)) @@ -607,13 +622,11 @@ weight = 4 cost = 15 requirements = list(101,101,101,90,80,70,60,50,40,30) + property_weights = list("story_potential" = -2, "extended" = -2, "integrity" = 2, "valid" = 2, "trust" = 2) high_population_requirement = 30 var/list/spawn_locs = list() /datum/dynamic_ruleset/midround/from_ghosts/slaughter_demon/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) if(isturf(L.loc)) spawn_locs += L.loc @@ -659,13 +672,11 @@ blocking_rules = list(/datum/dynamic_ruleset/roundstart/nuclear,/datum/dynamic_ruleset/midround/from_ghosts/nuclear) high_population_requirement = 15 var/datum/team/abductor_team/team + property_weights = list("story_potential" = 1, "extended" = -2, "valid" = 1, "trust" = -1, "chaos" = 2) repeatable_weight_decrease = 4 repeatable = TRUE /datum/dynamic_ruleset/midround/from_ghosts/abductors/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE team = new /datum/team/abductor_team if(team.team_number > ABDUCTOR_MAX_TEAMS) return FALSE @@ -699,13 +710,11 @@ cost = 15 requirements = list(101,101,101,90,80,70,60,50,40,30) high_population_requirement = 30 + property_weights = list("story_potential" = 1, "extended" = -2, "valid" = 2) var/list/spawn_locs = list() var/spawn_loc /datum/dynamic_ruleset/midround/from_ghosts/ninja/ready(forced = FALSE) - if(required_candidates > (dead_players.len + list_observers.len)) - SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough ghosts") - return FALSE if(!spawn_loc) var/list/spawn_locs = list() for(var/obj/effect/landmark/carpspawn/L in GLOB.landmarks_list) @@ -745,31 +754,3 @@ #undef ABDUCTOR_MAX_TEAMS #undef REVENANT_SPAWN_THRESHOLD - -////////////////////////////////////////////// -// // -// BLOODSUCKERS // -// // -////////////////////////////////////////////// - -/datum/dynamic_ruleset/latejoin/bloodsucker - name = "Bloodsucker Infiltrator" - config_tag = "latejoin_bloodsucker" - antag_datum = ANTAG_DATUM_BLOODSUCKER - antag_flag = ROLE_TRAITOR - restricted_roles = list("AI", "Cyborg") - protected_roles = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain", "Head of Personnel", "Chief Engineer", "Chief Medical Officer", "Research Director", "Quartermaster") - required_candidates = 1 - weight = 3 - cost = 10 - requirements = list(90,80,70,60,55,50,45,40,35,30) - high_population_requirement = 30 - repeatable = TRUE - -/datum/dynamic_ruleset/latejoin/bloodsucker/execute() - var/mob/M = pick(candidates) - assigned += M.mind - M.mind.special_role = antag_flag - if(mode.make_bloodsucker(M.mind)) - mode.bloodsuckers += M - return TRUE diff --git a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm index e5bb0af464..abd40a1756 100644 --- a/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm +++ b/code/game/gamemodes/dynamic/dynamic_rulesets_roundstart.dm @@ -21,6 +21,7 @@ requirements = list(50,50,50,50,50,50,50,50,50,50) high_population_requirement = 40 antag_cap = list(1,1,1,1,2,2,2,2,3,3) + property_weights = list("story_potential" = 2, "trust" = -1, "extended" = 1, "valid" = 1) always_max_weight = TRUE var/autotraitor_cooldown = 450 // 15 minutes (ticks once per 2 sec) @@ -61,6 +62,7 @@ requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 antag_cap = list(2,2,2,2,2,2,2,2,2,2) // Can pick 3 per team, but rare enough it doesn't matter. + property_weights = list("story_potential" = 1, "trust" = -1, "extended" = 1, "valid" = 1) var/list/datum/team/brother_team/pre_brother_teams = list() var/const/min_team_size = 2 @@ -108,6 +110,7 @@ cost = 15 scaling_cost = 15 requirements = list(101,101,101,101,101,101,101,101,101,101) + property_weights = list("trust" = -2, "valid" = 2) high_population_requirement = 10 antag_cap = list(1,1,1,1,1,2,2,2,2,3) var/team_mode_probability = 30 @@ -160,6 +163,7 @@ cost = 30 requirements = list(101,101,101,60,50,50,50,50,50,50) high_population_requirement = 50 + property_weights = list("story_potential" = 2, "trust" = 1, "chaos" = 2, "extended" = -2, "valid" = 2) var/list/roundstart_wizards = list() /datum/dynamic_ruleset/roundstart/wizard/acceptable(population=0, threat=0) @@ -222,6 +226,7 @@ weight = 3 cost = 30 requirements = list(101,101,101,80,70,60,50,50,50,50) + property_weights = list("story_potential" = -1, "trust" = -1, "chaos" = 1, "conversion" = 1, "extended" = -2, "valid" = 2) high_population_requirement = 50 flags = HIGHLANDER_RULESET antag_cap = list(2,2,2,3,3,4,4,4,4,4) @@ -283,6 +288,7 @@ high_population_requirement = 50 flags = HIGHLANDER_RULESET antag_cap = list(1,1,2,3,4,5,5,5,5,5) + property_weights = list("story_potential" = 2, "trust" = 2, "chaos" = 2, "extended" = -2, "valid" = 2) var/datum/team/nuclear/nuke_team /datum/dynamic_ruleset/roundstart/nuclear/ready(forced = FALSE) @@ -373,6 +379,7 @@ flags = HIGHLANDER_RULESET // I give up, just there should be enough heads with 35 players... minimum_players = 35 + property_weights = list("trust" = -2, "chaos" = 2, "extended" = -2, "valid" = 2, "conversion" = 1) var/datum/team/revolution/revolution var/finished = FALSE @@ -490,6 +497,7 @@ weight = 3 cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) + property_weights = list("extended" = 2) high_population_requirement = 101 /datum/dynamic_ruleset/roundstart/extended/pre_execute() @@ -517,6 +525,7 @@ high_population_requirement = 50 flags = HIGHLANDER_RULESET antag_cap = list(2,3,3,4,4,4,4,4,4,4) + property_weights = list("trust" = 2, "chaos" = 2, "extended" = -2, "conversion" = 1, "valid" = 2) var/ark_time /datum/dynamic_ruleset/roundstart/clockcult/pre_execute() @@ -616,6 +625,8 @@ antag_leader_datum = /datum/antagonist/nukeop/leader/clownop requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 + property_weights = list("trust" = 2, "chaos" = 2, "extended" = -2, "story_potential" = 2, "valid" = 2) + /datum/dynamic_ruleset/roundstart/nuclear/clown_ops/pre_execute() . = ..() @@ -647,6 +658,7 @@ requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 antag_cap = list(1,1,1,2,2,2,3,3,3,4) + property_weights = list("extended" = 1) /datum/dynamic_ruleset/roundstart/devil/pre_execute() var/num_devils = antag_cap[indice_pop] @@ -698,6 +710,7 @@ cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 + property_weights = list("extended" = -2, "chaos" = 2, "conversion" = 1, "valid" = 2) var/players_per_carrier = 30 var/monkeys_to_win = 1 var/escaped_monkeys = 0 @@ -759,6 +772,7 @@ cost = 0 requirements = list(101,101,101,101,101,101,101,101,101,101) high_population_requirement = 101 + property_weights = list("extended" = -2, "chaos" = 2, "trust" = 2) var/meteordelay = 2000 var/nometeors = 0 var/rampupdelta = 5 @@ -799,7 +813,8 @@ weight = 2 cost = 15 scaling_cost = 10 - requirements = list(90,80,70,60,50,50,50,50,50,50) + property_weights = list("story_potential" = 1, "extended" = 1, "trust" = -2, "valid" = 1) + requirements = list(70,65,60,55,50,50,50,50,50,50) high_population_requirement = 50 antag_cap = list(1,1,1,1,1,2,2,2,2,2) diff --git a/code/game/gamemodes/dynamic/dynamic_storytellers.dm b/code/game/gamemodes/dynamic/dynamic_storytellers.dm new file mode 100644 index 0000000000..afa6ed8ba7 --- /dev/null +++ b/code/game/gamemodes/dynamic/dynamic_storytellers.dm @@ -0,0 +1,235 @@ +/datum/dynamic_storyteller + var/name = "none" + var/desc = "A coder's idiocy." + var/list/property_weights = list() + var/curve_centre = 0 + var/curve_width = 1.8 + var/forced_threat_level = -1 + var/flags = 0 + var/weight = 3 // how many rounds need to have been recently played for this storyteller to be left out of the vote + var/datum/game_mode/dynamic/mode = null + +/** +Property weights are: +"story_potential" -- essentially how many different ways the antag can be played. +"trust" -- How much it makes the crew trust each other. Negative values means they're suspicious. Team antags are like this. +"chaos" -- How chaotic it makes the round. Has some overlap with "valid" and somewhat contradicts "extended". +"valid" -- How likely the non-antag-enemy crew are to get involved, e.g. nukies encouraging the warden to + let everyone into the armory, wizard moving around and being a nuisance, nightmare busting lights. +"extended" -- How much the antag is conducive to a long round. Nukies and cults are bad for this; Wizard is less bad; and so on. +"conversion" -- Basically a bool. Conversion antags, well, convert. It's its own class for a good reason. +*/ + +/datum/dynamic_storyteller/New() + ..() + if (istype(SSticker.mode, /datum/game_mode/dynamic)) + mode = SSticker.mode + GLOB.dynamic_curve_centre = curve_centre + GLOB.dynamic_curve_width = curve_width + GLOB.dynamic_forced_threat_level = forced_threat_level + +/datum/dynamic_storyteller/proc/start_injection_cooldowns() + var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_latejoin_delay_max + GLOB.dynamic_first_latejoin_delay_min) + mode.latejoin_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_first_latejoin_delay_min, GLOB.dynamic_first_latejoin_delay_max)) + world.time + + var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_first_midround_delay_min + GLOB.dynamic_first_midround_delay_max) + mode.midround_injection_cooldown = round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_first_midround_delay_min, GLOB.dynamic_first_midround_delay_max)) + world.time + + var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) + mode.event_injection_cooldown = (round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + world.time) + +/datum/dynamic_storyteller/proc/do_process() + return + +/datum/dynamic_storyteller/proc/on_start() + return + +/datum/dynamic_storyteller/proc/get_midround_cooldown() + var/midround_injection_cooldown_middle = 0.5*(GLOB.dynamic_midround_delay_max + GLOB.dynamic_midround_delay_min) + return round(CLAMP(EXP_DISTRIBUTION(midround_injection_cooldown_middle), GLOB.dynamic_midround_delay_min, GLOB.dynamic_midround_delay_max)) + +/datum/dynamic_storyteller/proc/get_event_cooldown() + var/event_injection_cooldown_middle = 0.5*(GLOB.dynamic_event_delay_max + GLOB.dynamic_event_delay_min) + return round(CLAMP(EXP_DISTRIBUTION(event_injection_cooldown_middle), GLOB.dynamic_event_delay_min, GLOB.dynamic_event_delay_max)) + +/datum/dynamic_storyteller/proc/get_latejoin_cooldown() + var/latejoin_injection_cooldown_middle = 0.5*(GLOB.dynamic_latejoin_delay_max + GLOB.dynamic_latejoin_delay_min) + return round(CLAMP(EXP_DISTRIBUTION(latejoin_injection_cooldown_middle), GLOB.dynamic_latejoin_delay_min, GLOB.dynamic_latejoin_delay_max)) + +/datum/dynamic_storyteller/proc/get_injection_chance(dry_run = FALSE) + if(mode.forced_injection) + mode.forced_injection = !dry_run + return 100 + var/chance = 0 + // If the high pop override is in effect, we reduce the impact of population on the antag injection chance + var/high_pop_factor = (mode.current_players[CURRENT_LIVING_PLAYERS].len >= GLOB.dynamic_high_pop_limit) + var/max_pop_per_antag = max(5,15 - round(mode.threat_level/10) - round(mode.current_players[CURRENT_LIVING_PLAYERS].len/(high_pop_factor ? 10 : 5))) + if (!mode.current_players[CURRENT_LIVING_ANTAGS].len) + chance += 80 // No antags at all? let's boost those odds! + else + var/current_pop_per_antag = mode.current_players[CURRENT_LIVING_PLAYERS].len / mode.current_players[CURRENT_LIVING_ANTAGS].len + if (current_pop_per_antag > max_pop_per_antag) + chance += min(50, 25+10*(current_pop_per_antag-max_pop_per_antag)) + else + chance += 25-10*(max_pop_per_antag-current_pop_per_antag) + if (mode.current_players[CURRENT_DEAD_PLAYERS].len > mode.current_players[CURRENT_LIVING_PLAYERS].len) + chance -= 30 // More than half the crew died? ew, let's calm down on antags + if (mode.threat > 70) + chance += 15 + if (mode.threat < 30) + chance -= 15 + return round(max(0,chance)) + +/datum/dynamic_storyteller/proc/roundstart_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/roundstart/rule in mode.roundstart_rules) + if (rule.acceptable(mode.roundstart_pop_ready, mode.threat_level) && mode.threat >= rule.cost) // If we got the population and threat required + rule.candidates = mode.candidates.Copy() + rule.trim_candidates() + if (rule.ready() && rule.candidates.len > 0) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) // just treat it as 0 if it's not in there + property_weight += rule.property_weights[property] * property_weights[property] + drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + return drafted_rules + +/datum/dynamic_storyteller/proc/midround_draft() + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/midround/rule in mode.midround_rules) + // if there are antags OR the rule is an antag rule, antag_acceptable will be true. + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + // Classic secret : only autotraitor/minor roles + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + continue + rule.trim_candidates() + if (rule.ready()) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) + property_weight += rule.property_weights[property] * property_weights[property] + drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + else if(mode.threat < rule.cost) + SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + return drafted_rules + +/datum/dynamic_storyteller/proc/latejoin_draft(mob/living/carbon/human/newPlayer) + var/list/drafted_rules = list() + for (var/datum/dynamic_ruleset/latejoin/rule in mode.latejoin_rules) + if (rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + // Classic secret : only autotraitor/minor roles + if (GLOB.dynamic_classic_secret && !((rule.flags & TRAITOR_RULESET) || (rule.flags & MINOR_RULESET))) + continue + // No stacking : only one round-ender, unless threat level > stacking_limit. + if (mode.threat_level > GLOB.dynamic_stacking_limit && GLOB.dynamic_no_stacking) + if(rule.flags & HIGHLANDER_RULESET && mode.highlander_executed) + continue + + rule.candidates = list(newPlayer) + rule.trim_candidates() + if (rule.ready()) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) + property_weight += rule.property_weights[property] * property_weights[property] + drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + else if(mode.threat < rule.cost) + SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + return drafted_rules + +/datum/dynamic_storyteller/proc/event_draft() + var/list/drafted_rules = list() + for(var/datum/dynamic_ruleset/event/rule in mode.events) + if(rule.acceptable(mode.current_players[CURRENT_LIVING_PLAYERS].len, mode.threat_level) && mode.threat >= rule.cost) + if(rule.ready()) + var/property_weight = 0 + for(var/property in property_weights) + if(property in rule.property_weights) + property_weight += rule.property_weights[property] * property_weights[property] + drafted_rules[rule] = (rule.get_weight() + property_weight)*rule.weight_mult + else if(mode.threat < rule.cost) + SSblackbox.record_feedback("tally","dynamic",1,"Times rulesets rejected due to not enough threat to spend") + return drafted_rules + + +/datum/dynamic_storyteller/cowabunga + name = "Chaotic" + curve_centre = 10 + desc = "Chaos: high. Variation: high. Likely antags: clock cult, revs, wizard." + property_weights = list("extended" = -1, "chaos" = 10) + weight = 2 + flags = WAROPS_ALWAYS_ALLOWED + var/refund_cooldown + +/datum/dynamic_storyteller/cowabunga/get_midround_cooldown() + return ..() / 4 + +/datum/dynamic_storyteller/cowabunga/get_latejoin_cooldown() + return ..() / 4 + +/datum/dynamic_storyteller/cowabunga/do_process() + if(refund_cooldown < world.time) + mode.refund_threat(10) + mode.log_threat("Cowabunga it is. Refunded 10 threat. Threat is now [mode.threat].") + refund_cooldown = world.time + 300 SECONDS + +/datum/dynamic_storyteller/team + name = "Teamwork" + desc = "Chaos: high. Variation: low. Likely antags: nukies, clockwork cult, wizard, blob, xenomorph." + curve_centre = 2 + curve_width = 1.5 + weight = 2 + flags = WAROPS_ALWAYS_ALLOWED + property_weights = list("valid" = 3, "trust" = 5) + +/datum/dynamic_storyteller/team/get_injection_chance(dry_run = FALSE) + return (mode.current_players[CURRENT_LIVING_ANTAGS].len ? 0 : ..()) + +/datum/dynamic_storyteller/conversion + name = "Conversion" + desc = "Chaos: high. Variation: medium. Likely antags: cults, bloodsuckers, revs." + curve_centre = 3 + curve_width = 1 + weight = 2 + flags = WAROPS_ALWAYS_ALLOWED + property_weights = list("valid" = 1, "conversion" = 20) + +/datum/dynamic_storyteller/classic + name = "Random" + desc = "Chaos: varies. Variation: highest. No special weights attached." + weight = 6 + curve_width = 4 + +/datum/dynamic_storyteller/memes + name = "Story" + desc = "Chaos: varies. Variation: high. Likely antags: abductors, nukies, wizard, traitor." + curve_width = 4 + property_weights = list("story_potential" = 10) + +/datum/dynamic_storyteller/suspicion + name = "Intrigue" + desc = "Chaos: low. Variation: high. Likely antags: traitor, bloodsucker. Rare: revs, blood cult." + curve_width = 4 + property_weights = list("trust" = -5) + +/datum/dynamic_storyteller/liteextended + name = "Calm" + desc = "Chaos: low. Variation: medium. Likely antags: bloodsuckers, traitors, sentient disease, revenant." + curve_centre = -5 + curve_width = 0.5 + flags = NO_ASSASSIN + weight = 2 + property_weights = list("extended" = 1, "chaos" = -1, "valid" = -1, "story_potential" = 1, "conversion" = -10) + +/datum/dynamic_storyteller/liteextended/get_injection_chance(dry_run = FALSE) + return ..()/2 + +/datum/dynamic_storyteller/extended + name = "Extended" + desc = "Chaos: none. Variation: none. Likely antags: none." + curve_centre = -20 + weight = 2 + curve_width = 0.5 + +/datum/dynamic_storyteller/extended/on_start() + GLOB.dynamic_forced_extended = TRUE diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 98dd91d3bd..e9d3006b06 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -491,4 +491,4 @@ //Attacks/effects. /obj/machinery/cryopod/blob_act() - return //Sorta gamey, but we don't really want these to be destroyed. \ No newline at end of file + return //Sorta gamey, but we don't really want these to be destroyed. diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 52b52eb288..03c1bb3bc8 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -180,7 +180,7 @@ limit-- while(!FoundDoor && limit) if (!FoundDoor) - log_world("### MAP WARNING, [src] at [AREACOORD(src)] failed to find a valid airlock to cyclelink with!") + log_mapping("[src] at [AREACOORD(src)] failed to find a valid airlock to cyclelink with!") return FoundDoor.cyclelinkedairlock = src cyclelinkedairlock = FoundDoor diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 1e7d720ee9..b1783ba940 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -500,7 +500,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ else return FALSE -/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf) +/obj/machinery/holopad/proc/move_hologram(mob/living/user, turf/new_turf, direction) if(LAZYLEN(masters) && masters[user]) var/obj/effect/overlay/holo_pad_hologram/holo = masters[user] var/transfered = FALSE @@ -512,6 +512,8 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ transfered = TRUE //All is good. holo.forceMove(new_turf) + if(direction) + holo.setDir(direction) if(!transfered) update_holoray(user,new_turf) return TRUE diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index aee1cf4f69..6d19776d86 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -222,5 +222,21 @@ . += "\t[attached ? attached : "No one"] is attached." +/obj/machinery/iv_drip/telescopic + name = "telescopic IV drip" + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down." + icon_state = "iv_drip" + +/obj/machinery/iv_drip/telescopic/update_icon() + ..() + icon_state = icon_state + "_tele" + +/obj/machinery/iv_drip/telescopic/AltClick(mob/user) + if (attached || beaker || !user.canUseTopic(src, BE_CLOSE)) + return ..() + new /obj/item/tele_iv(get_turf(src)) + qdel(src) + return TRUE + #undef IV_TAKING -#undef IV_INJECTING \ No newline at end of file +#undef IV_INJECTING diff --git a/code/game/mecha/equipment/tools/work_tools.dm b/code/game/mecha/equipment/tools/work_tools.dm index 36708fcf90..ca8e8cecd9 100644 --- a/code/game/mecha/equipment/tools/work_tools.dm +++ b/code/game/mecha/equipment/tools/work_tools.dm @@ -262,14 +262,14 @@ occupant_message("Deconstructing [W]...") if(do_after_cooldown(W)) chassis.spark_system.start() - W.ScrapeAway() + W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) playsound(W, 'sound/items/deconstruct.ogg', 50, 1) else if(isfloorturf(target)) var/turf/open/floor/F = target occupant_message("Deconstructing [F]...") if(do_after_cooldown(target)) chassis.spark_system.start() - F.ScrapeAway() + F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) playsound(F, 'sound/items/deconstruct.ogg', 50, 1) else if (istype(target, /obj/machinery/door/airlock)) occupant_message("Deconstructing [target]...") @@ -282,7 +282,7 @@ var/turf/open/space/S = target occupant_message("Building Floor...") if(do_after_cooldown(S)) - S.PlaceOnTop(/turf/open/floor/plating) + S.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) playsound(S, 'sound/items/deconstruct.ogg', 50, 1) chassis.spark_system.start() else if(isfloorturf(target)) diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 9c3df5395f..416644cada 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -107,7 +107,7 @@ //Wrapper procs that handle sanity and user feedback /atom/movable/proc/user_buckle_mob(mob/living/M, mob/user, check_loc = TRUE) - if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored) + if(!in_range(user, src) || !isturf(user.loc) || user.incapacitated() || M.anchored || !user.can_buckle_others(M, src)) return FALSE add_fingerprint(user) diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 10ee73915c..b6deaa1d06 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -123,7 +123,7 @@ if(metal) var/turf/T = get_turf(src) if(isspaceturf(T)) //Block up any exposed space - T.PlaceOnTop(/turf/open/floor/plating/foam) + T.PlaceOnTop(/turf/open/floor/plating/foam, flags = CHANGETURF_INHERIT_AIR) for(var/direction in GLOB.cardinals) var/turf/cardinal_turf = get_step(T, direction) if(get_area(cardinal_turf) != get_area(T)) //We're at an area boundary, so let's block off this turf! diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c5d198c05f..a410827347 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -578,21 +578,22 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) itempush = 0 //too light to push anything return A.hitby(src, 0, itempush) -/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) +/obj/item/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, messy_throw = TRUE) thrownby = thrower - callback = CALLBACK(src, .proc/after_throw, callback) //replace their callback with our own + callback = CALLBACK(src, .proc/after_throw, callback, (spin && messy_throw)) //replace their callback with our own . = ..(target, range, speed, thrower, spin, diagonals_first, callback) -/obj/item/proc/after_throw(datum/callback/callback) +/obj/item/proc/after_throw(datum/callback/callback, messy_throw) if (callback) //call the original callback . = callback.Invoke() throw_speed = initial(throw_speed) //explosions change this. item_flags &= ~IN_INVENTORY - var/matrix/M = matrix(transform) - M.Turn(rand(-170, 170)) - transform = M - pixel_x = rand(-8, 8) - pixel_y = rand(-8, 8) + if(messy_throw) + var/matrix/M = matrix(transform) + M.Turn(rand(-170, 170)) + transform = M + pixel_x = rand(-8, 8) + pixel_y = rand(-8, 8) /obj/item/proc/remove_item_from_storage(atom/newLoc) //please use this if you're going to snowflake an item out of a obj/item/storage if(!newLoc) diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index cf8d38d9c9..884f5c4400 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -863,3 +863,205 @@ CIGARETTE PACKETS ARE IN FANCY.DM if(reagents && reagents.total_volume) hand_reagents() + +/////////////// +/////BONGS///// +/////////////// + +/obj/item/bong + name = "bong" + desc = "A water bong used for smoking dried plants." + icon = 'icons/obj/bongs.dmi' + icon_state = null + item_state = null + w_class = WEIGHT_CLASS_NORMAL + light_color = "#FFCC66" + var/icon_off = "bong" + var/icon_on = "bong_lit" + var/chem_volume = 100 + var/last_used_time //for cooldown + var/firecharges = 0 //used for counting how many hits can be taken before the flame goes out + var/list/list_reagents = list() //For the base reagents bongs could get + + +/obj/item/bong/Initialize() + . = ..() + create_reagents(chem_volume, NO_REACT) // so it doesn't react until you light it + reagents.add_reagent_list(list_reagents) + icon_state = icon_off + +/obj/item/bong/attackby(obj/item/O, mob/user, params) + . = ..() + //If we're using a dried plant.. + if(istype(O,/obj/item/reagent_containers/food/snacks)) + var/obj/item/reagent_containers/food/snacks/DP = O + if (DP.dry) + //Nothing if our bong is full + if (reagents.holder_full()) + user.show_message("The bowl is full!", MSG_VISUAL) + return + + //Transfer reagents and remove the plant + user.show_message("You stuff the [DP] into the [src]'s bowl.", MSG_VISUAL) + DP.reagents.trans_to(src, 100) + qdel(DP) + return + else + user.show_message("[DP] must be dried first!", MSG_VISUAL) + return + + if (O.get_temperature() <= 500) + return + if (reagents && reagents.total_volume) //if there's stuff in the bong + var/lighting_text = O.ignition_effect(src, user) + if(lighting_text) + //Logic regarding igniting it on + if (firecharges == 0) + user.show_message("You light the [src] with the [O]!", MSG_VISUAL) + bongturnon() + else + user.show_message("You rekindle [src]'s flame with the [O]!", MSG_VISUAL) + + firecharges = 1 + return + else + user.show_message("There's nothing to light up in the bowl.", MSG_VISUAL) + return + +/obj/item/bong/CtrlShiftClick(mob/user) //empty reagents on alt click + ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + + if (reagents && reagents.total_volume) + user.show_message("You empty the [src].", MSG_VISUAL) + reagents.clear_reagents() + if(firecharges) + firecharges = 0 + bongturnoff() + else + user.show_message("The [src] is already empty.", MSG_VISUAL) + +/obj/item/bong/AltClick(mob/user) + ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + + if(firecharges) + firecharges = 0 + bongturnoff() + user.show_message("You quench the flame.", MSG_VISUAL) + return TRUE + +/obj/item/bong/examine(mob/user) + . = ..() + if(!reagents.total_volume) + . += "The bowl is empty." + else if (reagents.total_volume > 80) + . += "The bowl is filled to the brim." + else if (reagents.total_volume > 40) + . += "The bowl has plenty weed in it." + else + . += "The bowl has some weed in it." + + . += "Ctrl+Shift-click to empty." + . += "Alt-click to extinguish." + +/obj/item/bong/ignition_effect(atom/A, mob/user) + if(firecharges) + . = "[user] lights [A] off of the [src]." + else + . = "" + +/obj/item/bong/attack(mob/living/carbon/M, mob/living/carbon/user, obj/target) + //if it's lit up, some stuff in the bowl and the user is a target, and we're not on cooldown + + if (M != user) + return ..() + + if(user.is_mouth_covered(head_only = 1)) + to_chat(user, "Remove your headgear first.") + return ..() + + if(user.is_mouth_covered(mask_only = 1)) + to_chat(user, "Remove your mask first.") + return ..() + + if (!reagents.total_volume) + to_chat(user, "There's nothing in the bowl.") + return ..() + + if (!firecharges) + to_chat(user, "You have to light it up first.") + return ..() + + if (last_used_time + 30 >= world.time) + return ..() + var/hit_strength + var/noise + var/hittext = "" + //if the intent is help then you take a small hit, else a big one + if (user.a_intent == INTENT_HARM) + hit_strength = 2 + noise = 100 + hittext = "big hit" + else + hit_strength = 1 + noise = 70 + hittext = "hit" + //bubbling sound + playsound(user.loc,'sound/effects/bonghit.ogg', noise, 1) + + last_used_time = world.time + + //message + user.visible_message("[user] begins to take a [hittext] from the [src]!", \ + "You begin to take a [hittext] from [src].") + + //we take a hit here, after an uninterrupted delay + if(!do_after(user, 25, target = user)) + return + if (!(reagents && reagents.total_volume)) + return + + var/fraction = 12 * hit_strength + + var/datum/effect_system/smoke_spread/chem/smoke_machine/s = new + s.set_up(reagents, hit_strength, 18, user.loc) + s.start() + + reagents.reaction(user, INGEST, fraction) + if(!reagents.trans_to(user, fraction)) + reagents.remove_any(fraction) + + if (hit_strength == 2 && prob(15)) + user.emote("cough") + user.adjustOxyLoss(15) + + user.visible_message("[user] takes a [hittext] from the [src]!", \ + "You take a [hittext] from [src].") + + firecharges = firecharges - 1 + if (!firecharges) + bongturnoff() + if (!reagents.total_volume) + firecharges = 0 + bongturnoff() + + + +/obj/item/bong/proc/bongturnon() + icon_state = icon_on + set_light(3, 0.8) + +/obj/item/bong/proc/bongturnoff() + icon_state = icon_off + set_light(0, 0.0) + + + +/obj/item/bong/coconut + name = "coconut bong" + icon_off = "coconut_bong" + icon_on = "coconut_bong_lit" + desc = "A water bong used for smoking dried plants. This one's made out of a coconut and some bamboo." \ No newline at end of file diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 0c73d829ff..bf9c5daccd 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -2,7 +2,7 @@ name = "forcefield projector" desc = "An experimental device that can create several forcefields at a distance." icon = 'icons/obj/device.dmi' - icon_state = "signmaker_engi" + icon_state = "signmaker_forcefield" slot_flags = ITEM_SLOT_BELT w_class = WEIGHT_CLASS_SMALL item_flags = NOBLUDGEON diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index 7dc2f1d60b..3ee4a14a91 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -8,7 +8,8 @@ w_class = WEIGHT_CLASS_SMALL slot_flags = ITEM_SLOT_BELT var/mob/living/silicon/pai/pai - resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE + resistance_flags = FIRE_PROOF | ACID_PROOF + max_integrity = 200 /obj/item/paicard/suicide_act(mob/living/user) user.visible_message("[user] is staring sadly at [src]! [user.p_they()] can't keep living without real human intimacy!") @@ -45,6 +46,8 @@ dat += "Radio Uplink
    " dat += "Transmit: [(pai.radio.wires.is_cut(WIRE_TX)) ? "Disabled" : "Enabled"]
    " dat += "Receive: [(pai.radio.wires.is_cut(WIRE_RX)) ? "Disabled" : "Enabled"]
    " + if(pai.radio_short) + dat += "Reset radio short: \[RESET\]
    " else dat += "Radio Uplink
    " dat += "Radio firmware not loaded. Please install a pAI personality to load firmware.
    " @@ -82,7 +85,6 @@ pai.master = M.real_name pai.master_dna = M.dna.unique_enzymes to_chat(pai, "You have been bound to a new master.") - pai.emittersemicd = FALSE if(href_list["wipe"]) var/confirm = input("Are you CERTAIN you wish to delete the current personality? This action cannot be undone.", "Personality Wipe") in list("Yes", "No") if(confirm == "Yes") @@ -96,6 +98,8 @@ var/wire = text2num(href_list["wires"]) if(pai.radio) pai.radio.wires.cut(wire) + if(href_list["reset_radio_short"]) + pai.unshort_radio() if(href_list["setlaws"]) var/newlaws = copytext(sanitize(input("Enter any additional directives you would like your pAI personality to follow. Note that these directives will not override the personality's allegiance to its imprinted master. Conflicting directives will be ignored.", "pAI Directive Configuration", pai.laws.supplied[1]) as message),1,MAX_MESSAGE_LEN) if(newlaws && pai) diff --git a/code/game/objects/items/grenades/flashbang.dm b/code/game/objects/items/grenades/flashbang.dm index 66897fa722..724cfc8f9d 100644 --- a/code/game/objects/items/grenades/flashbang.dm +++ b/code/game/objects/items/grenades/flashbang.dm @@ -20,10 +20,10 @@ /obj/item/grenade/flashbang/proc/flashbang_mobs(turf/source, range) var/list/banged = get_hearers_in_view(range, source) var/list/flashed = viewers(range, source) - for(var/i in banged) - bang(i, source) - for(var/i in flashed) - flash(i, source) + for(var/mob/living/l in banged) + bang(l, source) + for(var/mob/living/l in flashed) + flash(l, source) /obj/item/grenade/flashbang/proc/bang(mob/living/M, turf/source) if(M.stat == DEAD) //They're dead! diff --git a/code/game/objects/items/holosign_creator.dm b/code/game/objects/items/holosign_creator.dm index 78881d901e..eb58089293 100644 --- a/code/game/objects/items/holosign_creator.dm +++ b/code/game/objects/items/holosign_creator.dm @@ -79,7 +79,7 @@ /obj/item/holosign_creator/atmos name = "ATMOS holofan projector" desc = "A holographic projector that creates holographic barriers that prevent changes in atmosphere conditions." - icon_state = "signmaker_engi" + icon_state = "signmaker_atmos" holosign_type = /obj/structure/holosign/barrier/atmos creation_time = 0 max_signs = 3 diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 7a83893f8b..c6c5547e54 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -479,10 +479,10 @@ possessed = TRUE - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as the spirit of [user.real_name]'s blade?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_POSSESSED_BLADE) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) var/mob/living/simple_animal/shade/S = new(src) S.real_name = name S.name = name diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 16262d61c3..4549dc73b6 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -374,7 +374,7 @@ It appears to have a wooden grip and a shaved down guard." icon_state = "cxsword_hilt_traitor" force_on = 30 - armour_penetration = 50 + armour_penetration = 35 embedding = list("embedded_pain_multiplier" = 10, "embed_chance" = 75, "embedded_fall_chance" = 0, "embedded_impact_pain_multiplier" = 10) block_chance = 50 hitsound_on = 'sound/weapons/blade1.ogg' diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index d8abff70a6..4242fb6c4b 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -216,10 +216,11 @@ return else if(last_hit < world.time) + if(target.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) + playsound(target, 'sound/weapons/genhit.ogg', 50, 1) + return if(ishuman(target)) var/mob/living/carbon/human/H = target - if (H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) - return if(check_martial_counter(H, user)) return playsound(get_turf(src), 'sound/effects/woodhit.ogg', 75, 1, -1) diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 27ed0f82e3..648f465a22 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -50,7 +50,6 @@ if(tank) updateTank(tank, 1, user) - /obj/item/melee/powerfist/proc/updateTank(obj/item/tank/internals/thetank, removing = 0, mob/living/carbon/human/user) if(removing) if(!tank) @@ -71,26 +70,42 @@ /obj/item/melee/powerfist/attack(mob/living/target, mob/living/user) - if(!tank) - to_chat(user, "\The [src] can't operate without a source of gas!") - return - if(tank && !tank.air_contents.remove(gasperfist * fisto_setting)) - to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") - playsound(loc, 'sound/effects/refill.ogg', 50, 1) - return - target.apply_damage(force * fisto_setting, BRUTE) - target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ - "You cry out in pain as [user]'s punch flings you backwards!") - new /obj/effect/temp_visual/kinetic_blast(target.loc) - playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) - playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) + if(!tank) + to_chat(user, "\The [src] can't operate without a source of gas!") + return + var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) + var/turf/T = get_turf(src) + if(!T) + return + T.assume_air(gasused) + T.air_update_turf() + if(!gasused) + to_chat(user, "\The [src]'s tank is empty!") + target.apply_damage((force / 5), BRUTE) + playsound(loc, 'sound/weapons/punch1.ogg', 50, 1) + target.visible_message("[user]'s powerfist lets out a dull thunk as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "[user]'s punches you!") + return + if(gasused.total_moles() < gasperfist * fisto_setting) + to_chat(user, "\The [src]'s piston-ram lets out a weak hiss, it needs more gas!") + playsound(loc, 'sound/weapons/punch4.ogg', 50, 1) + target.apply_damage((force / 2), BRUTE) + target.visible_message("[user]'s powerfist lets out a weak hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "[user]'s punch strikes with force!") + return + target.apply_damage(force * fisto_setting, BRUTE) + target.visible_message("[user]'s powerfist lets out a loud hiss as [user.p_they()] punch[user.p_es()] [target.name]!", \ + "You cry out in pain as [user]'s punch flings you backwards!") + new /obj/effect/temp_visual/kinetic_blast(target.loc) + playsound(loc, 'sound/weapons/resonator_blast.ogg', 50, 1) + playsound(loc, 'sound/weapons/genhit2.ogg', 50, 1) - var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) + var/atom/throw_target = get_edge_target_turf(target, get_dir(src, get_step_away(target, src))) - target.throw_at(throw_target, 5 * fisto_setting, 0.2) + target.throw_at(throw_target, 5 * fisto_setting, 0.5 + (fisto_setting / 2)) - log_combat(user, target, "power fisted", src) + log_combat(user, target, "power fisted", src) - user.changeNext_move(CLICK_CD_MELEE * click_delay) + user.changeNext_move(CLICK_CD_MELEE * click_delay) - return + return diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 77bc7ed810..c09f5b1b65 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -11,11 +11,9 @@ var/charge_cost = 30 /obj/item/borg/stun/attack(mob/living/M, mob/living/user) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - if(H.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK)) - playsound(M, 'sound/weapons/genhit.ogg', 50, 1) - return FALSE + if(M.check_shields(src, 0, "[M]'s [name]", MELEE_ATTACK)) + playsound(M, 'sound/weapons/genhit.ogg', 50, 1) + return FALSE if(iscyborg(user)) var/mob/living/silicon/robot/R = user if(!R.cell.use(charge_cost)) diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 4fc31ea674..b20f412620 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -398,39 +398,64 @@ GLOBAL_LIST_INIT(cloth_recipes, list ( \ * Cardboard */ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ - new/datum/stack_recipe("box", /obj/item/storage/box), \ - new/datum/stack_recipe("sec box", /obj/item/storage/box/seclooking), \ - new/datum/stack_recipe("light tubes", /obj/item/storage/box/lights/tubes), \ - new/datum/stack_recipe("light bulbs", /obj/item/storage/box/lights/bulbs), \ - new/datum/stack_recipe("mouse traps", /obj/item/storage/box/mousetraps), \ - new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ - new/datum/stack_recipe("power cell", /obj/item/storage/box/cells), \ - new/datum/stack_recipe("02", /obj/item/storage/box/otwo), \ - null, \ - new/datum/stack_recipe("lethal ammo box", /obj/item/storage/box/lethalshot), \ - new/datum/stack_recipe("rubber shot ammo box", /obj/item/storage/box/rubbershot), \ - new/datum/stack_recipe("bean bag ammo box", /obj/item/storage/box/beanbag), \ - new/datum/stack_recipe("12g ammo box", /obj/item/storage/box/lethalslugs), \ - new/datum/stack_recipe("stun slug ammo box", /obj/item/storage/box/stunslug), \ - new/datum/stack_recipe("tech shell ammo box", /obj/item/storage/box/techsslug), \ - new/datum/stack_recipe("incendiary ammo box", /obj/item/storage/box/fireshot), \ - new/datum/stack_recipe("firing pins", /obj/item/storage/box/firingpins), \ - new/datum/stack_recipe("loose ammo", /obj/item/storage/box/ammoshells), \ - null, \ - new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ - new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ - new/datum/stack_recipe("folder", /obj/item/folder), \ - new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \ - new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \ - null, \ - new/datum/stack_recipe("colored brown", /obj/item/storage/box/brown), \ - new/datum/stack_recipe("colored green", /obj/item/storage/box/green), \ - new/datum/stack_recipe("colored red", /obj/item/storage/box/blue), \ - new/datum/stack_recipe("colored blue", /obj/item/storage/box/red), \ - new/datum/stack_recipe("colored yellow", /obj/item/storage/box/yellow), \ - new/datum/stack_recipe("colored pink", /obj/item/storage/box/pink), \ - new/datum/stack_recipe("colored purple", /obj/item/storage/box/purple), \ - )) + new/datum/stack_recipe("box", /obj/item/storage/box), \ + new/datum/stack_recipe("cardborg suit", /obj/item/clothing/suit/cardborg, 3), \ + new/datum/stack_recipe("cardborg helmet", /obj/item/clothing/head/cardborg), \ + new/datum/stack_recipe("large box", /obj/structure/closet/cardboard, 4), \ + new/datum/stack_recipe("cardboard cutout", /obj/item/cardboard_cutout, 5), \ + new/datum/stack_recipe("pizza box", /obj/item/pizzabox), \ + new/datum/stack_recipe("folder", /obj/item/folder), \ + // holy fuck why are there so many boxes + new/datum/stack_recipe_list("fancy boxes", list ( \ + new /datum/stack_recipe("donut box", /obj/item/storage/fancy/donut_box), \ + new /datum/stack_recipe("egg box", /obj/item/storage/fancy/egg_box), \ + new /datum/stack_recipe("donk-pockets box", /obj/item/storage/box/donkpockets), \ + new /datum/stack_recipe("monkey cube box", /obj/item/storage/box/monkeycubes), \ + new /datum/stack_recipe("box (internals)", /obj/item/storage/box/otwo), \ + null, \ + new /datum/stack_recipe("security-styled box", /obj/item/storage/box/seclooking), \ + new /datum/stack_recipe("buckshot shell box", /obj/item/storage/box/lethalshot), \ + new /datum/stack_recipe("rubber shot shell box", /obj/item/storage/box/rubbershot), \ + new /datum/stack_recipe("beanbag shell box", /obj/item/storage/box/beanbag), \ + new /datum/stack_recipe("slug shell box", /obj/item/storage/box/lethalslugs), \ + new /datum/stack_recipe("stunslug shell box", /obj/item/storage/box/stunslug), \ + new /datum/stack_recipe("tech shell box", /obj/item/storage/box/techsslug), \ + new /datum/stack_recipe("incendiary ammo box", /obj/item/storage/box/fireshot), \ + new /datum/stack_recipe("loose ammo box", /obj/item/storage/box/ammoshells), \ + new /datum/stack_recipe("firing pins box", /obj/item/storage/box/firingpins), \ + null, \ + new /datum/stack_recipe("flashbang box", /obj/item/storage/box/flashbangs), \ + new /datum/stack_recipe("flashes box", /obj/item/storage/box/flashes), \ + new /datum/stack_recipe("handcuffs box", /obj/item/storage/box/handcuffs), \ + new /datum/stack_recipe("ID card box", /obj/item/storage/box/ids), \ + new /datum/stack_recipe("PDA box", /obj/item/storage/box/PDAs), \ + null, \ + new /datum/stack_recipe("pill bottle box", /obj/item/storage/box/pillbottles), \ + new /datum/stack_recipe("beaker box", /obj/item/storage/box/beakers), \ + new /datum/stack_recipe("syringe box", /obj/item/storage/box/syringes), \ + new /datum/stack_recipe("latex gloves box", /obj/item/storage/box/gloves), \ + new /datum/stack_recipe("sterile masks box", /obj/item/storage/box/masks), \ + new /datum/stack_recipe("body bag box", /obj/item/storage/box/bodybags), \ + new /datum/stack_recipe("prescription glasses box", /obj/item/storage/box/rxglasses), \ + null, \ + new /datum/stack_recipe("disk box", /obj/item/storage/box/disks), \ + new /datum/stack_recipe("light tubes box", /obj/item/storage/box/lights/tubes), \ + new /datum/stack_recipe("light bulbs box", /obj/item/storage/box/lights/bulbs), \ + new /datum/stack_recipe("mixed lights box", /obj/item/storage/box/lights/mixed), \ + new /datum/stack_recipe("power cell box", /obj/item/storage/box/cells), \ + new /datum/stack_recipe("mouse traps box", /obj/item/storage/box/mousetraps), \ + new /datum/stack_recipe("candle box", /obj/item/storage/fancy/candle_box), \ + null, \ + new /datum/stack_recipe("box (brown)", /obj/item/storage/box/brown), \ + new /datum/stack_recipe("box (green)", /obj/item/storage/box/green), \ + new /datum/stack_recipe("box (blue)", /obj/item/storage/box/blue), \ + new /datum/stack_recipe("box (red)", /obj/item/storage/box/red), \ + new /datum/stack_recipe("box (yellow)", /obj/item/storage/box/yellow), \ + new /datum/stack_recipe("box (pink)", /obj/item/storage/box/pink), \ + new /datum/stack_recipe("box (purple)", /obj/item/storage/box/purple), \ + )), + null, \ +)) /obj/item/stack/sheet/cardboard //BubbleWrap //it's cardboard you fuck name = "cardboard" @@ -456,7 +481,7 @@ GLOBAL_LIST_INIT(cardboard_recipes, list ( \ var/atom/droploc = drop_location() if(use(1)) playsound(I, 'sound/items/bikehorn.ogg', 50, 1, -1) - to_chat(user, "You stamp the cardboard! Its a clown box! Honk!") + to_chat(user, "You stamp the cardboard! It's a clown box! Honk!") if (amount >= 0) new/obj/item/storage/box/clown(droploc) //bugfix else @@ -521,31 +546,30 @@ GLOBAL_LIST_INIT(runed_metal_recipes, list ( \ */ GLOBAL_LIST_INIT(brass_recipes, list ( \ new/datum/stack_recipe("wall gear", /obj/structure/destructible/clockwork/wall_gear, 3, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ - null, + null, \ new/datum/stack_recipe("brass pinion airlock", /obj/machinery/door/airlock/clockwork, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass pinion airlock - windowed", /obj/machinery/door/airlock/clockwork/brass, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass windoor", /obj/machinery/door/window/clockwork, 2, time = 30, on_floor = TRUE, window_checks = TRUE), \ - null, + null, \ new/datum/stack_recipe("brass reflector", /obj/structure/destructible/clockwork/reflector, 10, time = 100, one_per_turf = TRUE, on_floor = TRUE, window_checks = TRUE), \ - null, + null, \ new/datum/stack_recipe("brass window - directional", /obj/structure/window/reinforced/clockwork/unanchored, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("brass window - fulltile", /obj/structure/window/reinforced/clockwork/fulltile/unanchored, 2, time = 0, on_floor = TRUE, window_checks = TRUE), \ new/datum/stack_recipe("brass chair", /obj/structure/chair/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass bar stool", /obj/structure/chair/stool/bar/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass stool", /obj/structure/chair/stool/brass, 1, time = 0, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("brass table frame", /obj/structure/table_frame/brass, 1, time = 5, one_per_turf = TRUE, on_floor = TRUE), \ - null, + null, \ new/datum/stack_recipe("sender - pressure sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - mech sensor", /obj/structure/destructible/clockwork/trap/trigger/pressure_sensor/mech, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - lever", /obj/structure/destructible/clockwork/trap/trigger/lever, 1, time = 10, one_per_turf = TRUE, on_floor = TRUE), \ new/datum/stack_recipe("sender - repeater", /obj/structure/destructible/clockwork/trap/trigger/repeater, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE), \ - null, + null, \ new/datum/stack_recipe("receiver - brass skewer", /obj/structure/destructible/clockwork/trap/brass_skewer, 2, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_ADJACENT), \ new/datum/stack_recipe("receiver - steam vent", /obj/structure/destructible/clockwork/trap/steam_vent, 3, time = 30, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ new/datum/stack_recipe("receiver - power nullifier", /obj/structure/destructible/clockwork/trap/power_nullifier, 5, time = 20, one_per_turf = TRUE, on_floor = TRUE, placement_checks = STACK_CHECK_CARDINALS), \ - null, + null, \ new/datum/stack_recipe("brass flask", /obj/item/reagent_containers/food/drinks/bottle/holyoil/empty), \ - )) /obj/item/stack/tile/brass @@ -673,7 +697,8 @@ GLOBAL_LIST_INIT(bronze_recipes, list ( \ merge_type = /obj/item/stack/sheet/bone GLOBAL_LIST_INIT(plastic_recipes, list( - new /datum/stack_recipe("plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ + new /datum/stack_recipe("see-through plastic flaps", /obj/structure/plasticflaps, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ + new /datum/stack_recipe("opaque plastic flaps", /obj/structure/plasticflaps/opaque, 5, one_per_turf = TRUE, on_floor = TRUE, time = 40), \ new /datum/stack_recipe("water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/empty), \ new /datum/stack_recipe("large water bottle", /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty,3), \ new /datum/stack_recipe("large trash cart", /obj/structure/closet/crate/bin,50),\ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index e8bd50f19b..4180681754 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -192,9 +192,15 @@ var/obj/O if(R.max_res_amount > 1) //Is it a stack? O = new R.result_type(usr.drop_location(), R.res_amount * multiplier) + else if(ispath(R.result_type, /turf)) + var/turf/T = usr.drop_location() + if(!isturf(T)) + return + T.PlaceOnTop(R.result_type, flags = CHANGETURF_INHERIT_AIR) else O = new R.result_type(usr.drop_location()) - O.setDir(usr.dir) + if(O) + O.setDir(usr.dir) use(R.req_amount * multiplier) //START: oh fuck i'm so sorry @@ -439,4 +445,4 @@ /datum/stack_recipe_list/New(title, recipes) src.title = title - src.recipes = recipes \ No newline at end of file + src.recipes = recipes diff --git a/code/game/objects/items/storage/belt.dm b/code/game/objects/items/storage/belt.dm index 3a4579d3f8..6c250029a6 100755 --- a/code/game/objects/items/storage/belt.dm +++ b/code/game/objects/items/storage/belt.dm @@ -61,6 +61,7 @@ /obj/item/radio, /obj/item/clothing/gloves, /obj/item/holosign_creator, + /obj/item/forcefield_projector, /obj/item/assembly/signaler )) STR.can_hold = can_hold @@ -458,8 +459,7 @@ /obj/item/extinguisher/mini, /obj/item/radio, /obj/item/clothing/gloves, - /obj/item/holosign_creator/atmos, - /obj/item/holosign_creator/engineering, + /obj/item/holosign_creator, /obj/item/forcefield_projector, /obj/item/assembly/signaler, /obj/item/lightreplacer, @@ -571,6 +571,7 @@ /obj/item/reagent_containers/spray, /obj/item/soap, /obj/item/holosign_creator, + /obj/item/forcefield_projector, /obj/item/key/janitor, /obj/item/clothing/gloves, /obj/item/melee/flyswatter, @@ -582,7 +583,7 @@ /obj/item/storage/belt/bandolier name = "bandolier" - desc = "A bandolier for holding shotgun ammunition." + desc = "A bandolier for holding ammunition." icon_state = "bandolier" item_state = "bandolier" @@ -592,7 +593,7 @@ STR.max_items = 18 STR.display_numerical_stacking = TRUE STR.can_hold = typecacheof(list( - /obj/item/ammo_casing/shotgun + /obj/item/ammo_casing )) /obj/item/storage/belt/bandolier/durathread diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index e214db3c71..4b2b3e2203 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -1259,3 +1259,12 @@ var/obj/item/stack/sheet/cardboard/I = new(user.drop_location()) qdel(src) user.put_in_hands(I) + +/obj/item/storage/box/marshmallow + name = "box of marshmallows" + desc = "A box of marshmallows." + illustration = "marshmallow" + +/obj/item/storage/box/marshmallow/PopulateContents() + for (var/i in 1 to 5) + new /obj/item/reagent_containers/food/snacks/marshmallow(src) \ No newline at end of file diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 484b9862ff..6972587263 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -36,7 +36,7 @@ . = ..() if(preload_cell_type) if(!ispath(preload_cell_type,/obj/item/stock_parts/cell)) - log_world("### MAP WARNING, [src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].") + log_mapping("[src] at [AREACOORD(src)] had an invalid preload_cell_type: [preload_cell_type].") else cell = new preload_cell_type(src) update_icon() @@ -168,11 +168,9 @@ /obj/item/melee/baton/proc/baton_stun(mob/living/L, mob/user) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that - playsound(L, 'sound/weapons/genhit.ogg', 50, 1) - return FALSE + if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) //No message; check_shields() handles that + playsound(L, 'sound/weapons/genhit.ogg', 50, 1) + return FALSE var/stunpwr = stunforce var/obj/item/stock_parts/cell/our_cell = get_cell() if(!our_cell) diff --git a/code/game/objects/items/telescopic_iv.dm b/code/game/objects/items/telescopic_iv.dm new file mode 100644 index 0000000000..9b0b714ea5 --- /dev/null +++ b/code/game/objects/items/telescopic_iv.dm @@ -0,0 +1,17 @@ +/obj/item/tele_iv + name = "telescopic IV drip" + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down." + icon = 'icons/obj/iv_drip.dmi' + icon_state = "tele_iv" + +/obj/item/tele_iv/attack_self(mob/user) + deploy_iv(user, user.loc) + +/obj/item/tele_iv/afterattack(atom/target, mob/user, proximity) + . = ..() + if(proximity && isopenturf(target) && user.CanReach(target)) + deploy_iv(user, target) + +/obj/item/tele_iv/proc/deploy_iv(mob/user, atom/location) + new /obj/machinery/iv_drip/telescopic(location) + qdel(src) diff --git a/code/game/objects/items/twohanded.dm b/code/game/objects/items/twohanded.dm index dd7d46d0d7..d7891feaa0 100644 --- a/code/game/objects/items/twohanded.dm +++ b/code/game/objects/items/twohanded.dm @@ -872,7 +872,7 @@ user.visible_message("[user] blasts \the [target] with \the [src]!") playsound(target, 'sound/magic/disintegrate.ogg', 100, 1) W.break_wall() - W.ScrapeAway() + W.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return //HF blade diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index f5dfa690db..14ac2f037e 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -80,13 +80,12 @@ SEND_SIGNAL(src, COMSIG_OBJ_SETANCHORED, anchorvalue) anchored = anchorvalue -/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback) - ..() +/obj/throw_at(atom/target, range, speed, mob/thrower, spin=1, diagonals_first = 0, datum/callback/callback, messy_throw) + . = ..() if(obj_flags & FROZEN) visible_message("[src] shatters into a million pieces!") qdel(src) - /obj/assume_air(datum/gas_mixture/giver) if(loc) return loc.assume_air(giver) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm index 8da50d488f..579b1444a5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm @@ -12,18 +12,12 @@ new /obj/item/clothing/head/hardhat/white(src) new /obj/item/clothing/head/hardhat/weldhat/white(src) new /obj/item/clothing/gloves/color/yellow(src) - new /obj/item/clothing/shoes/sneakers/brown(src) new /obj/item/tank/jetpack/suit(src) new /obj/item/cartridge/ce(src) new /obj/item/radio/headset/heads/ce(src) - new /obj/item/storage/toolbox/mechanical(src) - new /obj/item/clothing/suit/hazardvest(src) new /obj/item/megaphone/command(src) new /obj/item/areaeditor/blueprints(src) - new /obj/item/airlock_painter(src) new /obj/item/holosign_creator/engineering(src) - new /obj/item/clothing/mask/gas(src) - new /obj/item/multitool(src) new /obj/item/assembly/flash/handheld(src) new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/door_remote/chief_engineer(src) @@ -67,7 +61,7 @@ for(var/i in 1 to 3) new /obj/item/clothing/head/welding(src) for(var/i in 1 to 3) - new /obj/item/weldingtool(src) + new /obj/item/weldingtool/largetank(src) /obj/structure/closet/secure_closet/engineering_personal name = "engineer's locker" @@ -84,7 +78,6 @@ new /obj/item/clothing/glasses/meson/engine(src) new /obj/item/storage/box/emptysandbags(src) - /obj/structure/closet/secure_closet/atmospherics name = "\proper atmospheric technician's locker" req_access = list(ACCESS_ATMOSPHERICS) @@ -103,3 +96,33 @@ new /obj/item/clothing/head/hardhat/atmos(src) new /obj/item/clothing/glasses/meson/engine/tray(src) new /obj/item/extinguisher/advanced(src) + +/* + * Empty lockers + * Some of the lockers are filled with junk, and sometimes its nice to just fill it with your own set-up for your own map gimmicks. + */ + +/obj/structure/closet/secure_closet/engineering_chief/empty + +/obj/structure/closet/secure_closet/engineering_chief/empty/PopulateContents() + return + +/obj/structure/closet/secure_closet/engineering_electrical/empty + +/obj/structure/closet/secure_closet/engineering_electrical/empty/PopulateContents() + return + +/obj/structure/closet/secure_closet/engineering_welding/empty + +/obj/structure/closet/secure_closet/engineering_welding/empty/PopulateContents() + return + +/obj/structure/closet/secure_closet/engineering_personal/empty + +/obj/structure/closet/secure_closet/engineering_personal/empty/PopulateContents() + return + +/obj/structure/closet/secure_closet/atmospherics/empty + +/obj/structure/closet/secure_closet/atmospherics/empty/PopulateContents() + return diff --git a/code/game/objects/structures/dresser.dm b/code/game/objects/structures/dresser.dm index 05e62c196f..7f0c3c6eb8 100644 --- a/code/game/objects/structures/dresser.dm +++ b/code/game/objects/structures/dresser.dm @@ -30,11 +30,11 @@ return var/list/undergarment_choices = list("Underwear", "Underwear Color", "Undershirt", "Undershirt Color", "Socks", "Socks Color") - if(!UNDIE_COLORABLE(GLOB.underwear_list[H.underwear])) + if(!(GLOB.underwear_list[H.underwear]?.has_color)) undergarment_choices -= "Underwear Color" - if(!UNDIE_COLORABLE(GLOB.undershirt_list[H.undershirt])) + if(!(GLOB.undershirt_list[H.undershirt]?.has_color)) undergarment_choices -= "Undershirt Color" - if(!UNDIE_COLORABLE(GLOB.socks_list[H.socks])) + if(!(GLOB.socks_list[H.socks]?.has_color)) undergarment_choices -= "Socks Color" var/choice = input(H, "Underwear, Undershirt, or Socks?", "Changing") as null|anything in undergarment_choices diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm index fdc85475fb..705ca9a884 100644 --- a/code/game/objects/structures/ghost_role_spawners.dm +++ b/code/game/objects/structures/ghost_role_spawners.dm @@ -30,6 +30,8 @@ new/obj/structure/fluff/empty_terrarium(get_turf(src)) return ..() +/obj/effect/mob_spawn/human/seed_vault/special(mob/living/carbon/human/new_spawn) + ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) //Ash walker eggs: Spawns in ash walker dens in lavaland. Ghosts become unbreathing lizards that worship the Necropolis and are advised to retrieve corpses to create more ash walkers. /obj/effect/mob_spawn/human/ash_walker @@ -251,6 +253,9 @@ new/obj/structure/fluff/empty_cryostasis_sleeper(get_turf(src)) return ..() +/obj/effect/mob_spawn/human/hermit/special(mob/living/carbon/human/new_spawn) + ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) + //Broken rejuvenation pod: Spawns in animal hospitals in lavaland. Ghosts become disoriented interns and are advised to search for help. /obj/effect/mob_spawn/human/doctor/alive/lavaland name = "broken rejuvenation pod" @@ -353,6 +358,9 @@ new/obj/structure/fluff/empty_sleeper/syndicate(get_turf(src)) ..() +/obj/effect/mob_spawn/human/hotel_staff/special(mob/living/carbon/human/new_spawn) + ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) + /obj/effect/mob_spawn/human/demonic_friend name = "Essence of friendship" desc = "Oh boy! Oh boy! A friend!" @@ -597,7 +605,7 @@ rank = "Gunner" /obj/effect/mob_spawn/human/ghostcafe - name = "ghost cafe sleeper" + name = "Ghost Cafe Sleeper" uses = -1 icon = 'icons/obj/machines/sleeper.dmi' icon_state = "sleeper" @@ -618,12 +626,20 @@ O.equip(new_spawn, FALSE, new_spawn.client) SSjob.equip_loadout(null, new_spawn, FALSE) SSquirks.AssignQuirks(new_spawn, new_spawn.client, TRUE, TRUE, null, FALSE, new_spawn) + new_spawn.AddElement(/datum/element/ghost_role_eligibility) + ADD_TRAIT(new_spawn, TRAIT_SIXTHSENSE, GHOSTROLE_TRAIT) + ADD_TRAIT(new_spawn,TRAIT_EXEMPT_HEALTH_EVENTS,GHOSTROLE_TRAIT) + to_chat(new_spawn,"You maybe sharing your cafe with some ninja-captured individuals, so make sure to only interact with the ghosts you hear as a ghost!") + to_chat(new_spawn,"You can turn yourself into a ghost and freely reenter your body with the ghost action.") + var/datum/action/ghost/G = new(new_spawn) + G.Grant(new_spawn) /datum/outfit/ghostcafe name = "ID, jumpsuit and shoes" uniform = /obj/item/clothing/under/color/random shoes = /obj/item/clothing/shoes/sneakers/black id = /obj/item/card/id + r_hand = /obj/item/storage/box/syndie_kit/chameleon/ghostcafe /datum/outfit/ghostcafe/pre_equip(mob/living/carbon/human/H, visualsOnly = FALSE, client/preference_source) @@ -639,4 +655,18 @@ uniform = /obj/item/clothing/under/color/random else uniform = /obj/item/clothing/under/skirt/color/random - + +/obj/item/storage/box/syndie_kit/chameleon/ghostcafe + name = "ghost cafe costuming kit" + desc = "Look just the way you did in life - or better!" + +/obj/item/storage/box/syndie_kit/chameleon/ghostcafe/PopulateContents() // Doesn't contain a PDA, for isolation reasons. + new /obj/item/clothing/under/chameleon(src) + new /obj/item/clothing/suit/chameleon(src) + new /obj/item/clothing/gloves/chameleon(src) + new /obj/item/clothing/shoes/chameleon(src) + new /obj/item/clothing/glasses/chameleon(src) + new /obj/item/clothing/head/chameleon(src) + new /obj/item/clothing/mask/chameleon(src) + new /obj/item/storage/backpack/chameleon(src) + new /obj/item/clothing/neck/cloak/chameleon(src) diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index b946a06432..a7eaea0d16 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -60,7 +60,7 @@ to_chat(user, "You build a floor.") var/turf/T = src.loc if(isspaceturf(T)) - T.PlaceOnTop(/turf/open/floor/plating) + T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) qdel(src) return TRUE return FALSE diff --git a/code/game/objects/structures/stairs.dm b/code/game/objects/structures/stairs.dm index bd657fe1e8..f2c4e628e0 100644 --- a/code/game/objects/structures/stairs.dm +++ b/code/game/objects/structures/stairs.dm @@ -102,13 +102,13 @@ /obj/structure/stairs/proc/force_open_above() var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) if(T && !istype(T)) - T.ChangeTurf(/turf/open/openspace) + T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) /obj/structure/stairs/proc/on_multiz_new(turf/source, dir) if(dir == UP) var/turf/open/openspace/T = get_step_multiz(get_turf(src), UP) if(T && !istype(T)) - T.ChangeTurf(/turf/open/openspace) + T.ChangeTurf(/turf/open/openspace, flags = CHANGETURF_INHERIT_AIR) /obj/structure/stairs/intercept_zImpact(atom/movable/AM, levels = 1) . = ..() diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 76c8f7f11f..e2e0f703f7 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -5,6 +5,8 @@ icon_state = "toilet00" density = FALSE anchored = TRUE + can_buckle = TRUE + buckle_lying = 0 var/open = FALSE //if the lid is up var/cistern = 0 //if the cistern bit is open var/w_items = 0 //the combined w_class of all the items in the cistern @@ -682,4 +684,4 @@ else playsound(loc, 'sound/weapons/tap.ogg', 50, 1) if(BURN) - playsound(loc, 'sound/items/welder.ogg', 80, 1) \ No newline at end of file + playsound(loc, 'sound/items/welder.ogg', 80, 1) diff --git a/code/game/turfs/baseturf_skipover.dm b/code/game/turfs/baseturf_skipover.dm index 644714f8ed..4df8c86e62 100644 --- a/code/game/turfs/baseturf_skipover.dm +++ b/code/game/turfs/baseturf_skipover.dm @@ -10,4 +10,9 @@ /turf/baseturf_skipover/shuttle name = "Shuttle baseturf skipover" - desc = "Acts as the bottom of the shuttle, if this isn't here the shuttle floor is broken through." \ No newline at end of file + desc = "Acts as the bottom of the shuttle, if this isn't here the shuttle floor is broken through." + +/turf/baseturf_bottom + name = "Z-level baseturf placeholder" + desc = "Marker for z-level baseturf, usually resolves to space." + baseturfs = /turf/baseturf_bottom diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 6a055bbd35..bc4cd8df33 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -1,6 +1,7 @@ // This is a list of turf types we dont want to assign to baseturfs unless through initialization or explicitly GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/space, + /turf/baseturf_bottom ))) /turf/proc/empty(turf_type=/turf/open/space, baseturf_type, list/ignore_typecache, flags) @@ -56,12 +57,20 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( // Creates a new turf // new_baseturfs can be either a single type or list of types, formated the same as baseturfs. see turf.dm /turf/proc/ChangeTurf(path, list/new_baseturfs, flags) - if(!path) - return - if(path == /turf/open/space/basic) - // basic doesn't initialize and this will cause issues - // no warning though because this can happen naturaly as a result of it being built on top of - path = /turf/open/space + switch(path) + if(null) + return + if(/turf/baseturf_bottom) + path = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space + if (!ispath(path)) + path = text2path(path) + if (!ispath(path)) + warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'") + path = /turf/open/space + if(/turf/open/space/basic) + // basic doesn't initialize and this will cause issues + // no warning though because this can happen naturaly as a result of it being built on top of + path = /turf/open/space if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP)) // Don't no-op if the map loader requires it to be reconstructed return src if(flags & CHANGETURF_SKIP) @@ -128,16 +137,15 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/open/ChangeTurf(path, list/new_baseturfs, flags) if ((flags & CHANGETURF_INHERIT_AIR) && ispath(path, /turf/open)) SSair.remove_from_active(src) - var/stashed_air = air - air = null // so that it doesn't get deleted + var/datum/gas_mixture/stashed_air = new() + stashed_air.copy_from(air) . = ..() - if (!. || . == src) // changeturf failed or didn't do anything - air = stashed_air + if (!.) // changeturf failed or didn't do anything + QDEL_NULL(stashed_air) return var/turf/open/newTurf = . - if (!istype(newTurf.air, /datum/gas_mixture/immutable/space)) - QDEL_NULL(newTurf.air) - newTurf.air = stashed_air + newTurf.air.copy_from(stashed_air) + QDEL_NULL(stashed_air) SSair.add_to_active(newTurf) else if(ispath(path,/turf/closed)) @@ -215,7 +223,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( newT.assemble_baseturfs(initial(fake_turf_type.baseturfs)) // The baseturfs list is created like roundstart if(!length(newT.baseturfs)) newT.baseturfs = list(baseturfs) - newT.baseturfs -= newT.baseturfs & GLOB.blacklisted_automated_baseturfs + newT.baseturfs -= GLOB.blacklisted_automated_baseturfs newT.baseturfs.Insert(1, old_baseturfs) // The old baseturfs are put underneath return newT if(!length(baseturfs)) @@ -315,5 +323,5 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( SSair.add_to_active(src) /turf/proc/ReplaceWithLattice() - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) new /obj/structure/lattice(locate(x, y, z)) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 6297cadc63..9e593cafce 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -23,7 +23,7 @@ icon = 'icons/turf/walls.dmi' explosion_block = 50 -/turf/closed/indestructible/TerraformTurf(path, defer_change = FALSE, ignore_air = FALSE) +/turf/closed/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) return /turf/closed/indestructible/acid_act(acidpwr, acid_volume, acid_id) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 4bdb13effc..577c45a7f0 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -58,7 +58,7 @@ /turf/open/indestructible/singularity_act() return -/turf/open/indestructible/TerraformTurf(path, defer_change = FALSE, ignore_air = FALSE) +/turf/open/indestructible/TerraformTurf(path, new_baseturf, flags, defer_change = FALSE, ignore_air = FALSE) return /turf/open/indestructible/sound diff --git a/code/game/turfs/openspace/openspace.dm b/code/game/turfs/openspace/openspace.dm index e68aabcd08..66507e7053 100644 --- a/code/game/turfs/openspace/openspace.dm +++ b/code/game/turfs/openspace/openspace.dm @@ -106,7 +106,7 @@ qdel(L) playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, "You build a floor.") - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, "You need one floor tile to build a floor!") else diff --git a/code/game/turfs/simulated/chasm.dm b/code/game/turfs/simulated/chasm.dm index 0a7b507488..dab0c1c376 100644 --- a/code/game/turfs/simulated/chasm.dm +++ b/code/game/turfs/simulated/chasm.dm @@ -38,7 +38,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, "You build a floor.") - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE @@ -70,7 +70,7 @@ playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, "You build a floor.") // Create a floor, which has this chasm underneath it - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, "You need one floor tile to build a floor!") else diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index d14a4c7385..3f46994da9 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -62,29 +62,29 @@ if(severity != 1 && shielded && target != src) return if(target == src) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return if(target != null) severity = 3 switch(severity) if(1) - ScrapeAway(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(2) switch(pick(1,2;75,3)) if(1) if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) ReplaceWithLattice() else - ScrapeAway(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(prob(33)) new /obj/item/stack/sheet/metal(src) if(2) - ScrapeAway(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) if(3) if(prob(80)) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else break_tile() hotspot_expose(1000,CELL_VOLUME) @@ -135,7 +135,7 @@ burnt = 1 /turf/open/floor/proc/make_plating() - return ScrapeAway() + return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/ChangeTurf(path, new_baseturf, flags) if(!isfloorturf(src)) @@ -213,15 +213,15 @@ /turf/open/floor/narsie_act(force, ignore_mobs, probability = 20) . = ..() if(.) - ChangeTurf(/turf/open/floor/engine/cult) + ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/ratvar_act(force, ignore_mobs) . = ..() if(.) - ChangeTurf(/turf/open/floor/clockwork) + ChangeTurf(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/acid_melt() - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/rcd_vals(mob/user, obj/item/construction/rcd/the_rcd) switch(the_rcd.mode) @@ -267,7 +267,7 @@ A.autoclose = TRUE return TRUE if(RCD_DECONSTRUCT) - if(ScrapeAway() == src) + if(ScrapeAway(flags = CHANGETURF_INHERIT_AIR) == src) return FALSE to_chat(user, "You deconstruct [src].") return TRUE diff --git a/code/game/turfs/simulated/floor/plating.dm b/code/game/turfs/simulated/floor/plating.dm index ae67edf073..8e0eace9cd 100644 --- a/code/game/turfs/simulated/floor/plating.dm +++ b/code/game/turfs/simulated/floor/plating.dm @@ -11,7 +11,7 @@ name = "plating" icon_state = "plating" intact = FALSE - baseturfs = /turf/open/space + baseturfs = /turf/baseturf_bottom footstep = FOOTSTEP_PLATING barefootstep = FOOTSTEP_HARD_BAREFOOT clawfootstep = FOOTSTEP_HARD_CLAW @@ -61,7 +61,7 @@ to_chat(user, "You begin reinforcing the floor...") if(do_after(user, 30, target = src)) if (R.get_amount() >= 2 && !istype(src, /turf/open/floor/engine)) - PlaceOnTop(/turf/open/floor/engine) + PlaceOnTop(/turf/open/floor/engine, flags = CHANGETURF_INHERIT_AIR) playsound(src, 'sound/items/deconstruct.ogg', 80, 1) R.use(2) to_chat(user, "You reinforce the floor.") @@ -76,7 +76,7 @@ var/obj/item/stack/tile/W = C if(!W.use(1)) return - var/turf/open/floor/T = PlaceOnTop(W.turf_type) + var/turf/open/floor/T = PlaceOnTop(W.turf_type, flags = CHANGETURF_INHERIT_AIR) if(istype(W, /obj/item/stack/tile/light)) //TODO: get rid of this ugly check somehow var/obj/item/stack/tile/light/L = W var/turf/open/floor/light/F = T @@ -117,7 +117,7 @@ qdel(L) to_chat(user, "You reinforce the foamed plating with tiling.") playsound(src, 'sound/weapons/Genhit.ogg', 50, TRUE) - ChangeTurf(/turf/open/floor/plating) + ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else playsound(src, 'sound/weapons/tap.ogg', 100, TRUE) //The attack sound is muffled by the foam itself user.changeNext_move(CLICK_CD_MELEE) @@ -125,7 +125,7 @@ if(prob(I.force * 20 - 25)) user.visible_message("[user] smashes through [src]!", \ "You smash through [src] with [I]!") - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else to_chat(user, "You hit [src], to no effect!") @@ -136,13 +136,13 @@ /turf/open/floor/plating/foam/rcd_act(mob/user, obj/item/construction/rcd/the_rcd, passed_mode) if(passed_mode == RCD_FLOORWALL) to_chat(user, "You build a floor.") - ChangeTurf(/turf/open/floor/plating) + ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE /turf/open/floor/plating/foam/ex_act() ..() - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/plating/foam/tool_act(mob/living/user, obj/item/I, tool_type) return diff --git a/code/game/turfs/simulated/floor/plating/asteroid.dm b/code/game/turfs/simulated/floor/plating/asteroid.dm index 9f2da57312..ecc8ee5e8d 100644 --- a/code/game/turfs/simulated/floor/plating/asteroid.dm +++ b/code/game/turfs/simulated/floor/plating/asteroid.dm @@ -76,11 +76,6 @@ for(var/obj/item/stack/ore/O in src) SEND_SIGNAL(W, COMSIG_PARENT_ATTACKBY, O) -/turf/open/floor/plating/asteroid/singularity_act() - if(is_planet_level(z)) - return ..() - ScrapeAway() - /turf/open/floor/plating/asteroid/ex_act(severity, target) . = SEND_SIGNAL(src, COMSIG_ATOM_EX_ACT, severity, target) contents_explosion(severity, target) @@ -132,6 +127,7 @@ /turf/open/floor/plating/asteroid/airless initial_gas_mix = AIRLESS_ATMOS + baseturfs = /turf/open/floor/plating/asteroid/airless turf_type = /turf/open/floor/plating/asteroid/airless diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index b04f89f8be..28ffbbd1ff 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -43,7 +43,7 @@ return TRUE if(floor_tile) new floor_tile(src, 2) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return TRUE /turf/open/floor/engine/acid_act(acidpwr, acid_volume) @@ -56,23 +56,23 @@ if(severity != 1 && shielded && target != src) return if(target == src) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return switch(severity) if(1) if(prob(80)) if(!length(baseturfs) || !ispath(baseturfs[baseturfs.len-1], /turf/open/floor)) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) ReplaceWithLattice() else - ScrapeAway(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) else if(prob(50)) - ScrapeAway(2) + ScrapeAway(2, flags = CHANGETURF_INHERIT_AIR) else - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) if(2) if(prob(50)) - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) /turf/open/floor/engine/singularity_pull(S, current_size) ..() diff --git a/code/game/turfs/simulated/lava.dm b/code/game/turfs/simulated/lava.dm index 362b410cbb..2f8ae0cb93 100644 --- a/code/game/turfs/simulated/lava.dm +++ b/code/game/turfs/simulated/lava.dm @@ -54,7 +54,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, "You build a floor.") - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index f38f13e657..5278374abd 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -125,7 +125,7 @@ qdel(L) playsound(src, 'sound/weapons/genhit.ogg', 50, 1) to_chat(user, "You build a floor.") - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else to_chat(user, "You need one floor tile to build a floor!") else @@ -212,7 +212,7 @@ switch(passed_mode) if(RCD_FLOORWALL) to_chat(user, "You build a floor.") - PlaceOnTop(/turf/open/floor/plating) + PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) return TRUE return FALSE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index d618e457b0..d280ba408b 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -9,7 +9,7 @@ // A list will be created in initialization that figures out the baseturf's baseturf etc. // In the case of a list it is sorted from bottom layer to top. // This shouldn't be modified directly, use the helper procs. - var/list/baseturfs = /turf/open/space + var/list/baseturfs = /turf/baseturf_bottom var/temperature = T20C var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed @@ -391,7 +391,7 @@ continue if(O.invisibility == INVISIBILITY_MAXIMUM) O.singularity_act() - ScrapeAway() + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) return(2) /turf/proc/can_have_cabling() @@ -564,4 +564,4 @@ //Whatever happens after high temperature fire dies out or thermite reaction works. //Should return new turf /turf/proc/Melt() - return ScrapeAway() + return ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/world.dm b/code/game/world.dm index 25b8c4d9f3..4043f15f6f 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -108,6 +108,7 @@ GLOBAL_VAR(restart_counter) GLOB.world_href_log = "[GLOB.log_directory]/hrefs.log" GLOB.sql_error_log = "[GLOB.log_directory]/sql.log" GLOB.world_qdel_log = "[GLOB.log_directory]/qdel.log" + GLOB.world_map_error_log = "[GLOB.log_directory]/map_errors.log" GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log" GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log" GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log" diff --git a/code/modules/admin/IsBanned.dm b/code/modules/admin/IsBanned.dm index 839292871c..03670009f8 100644 --- a/code/modules/admin/IsBanned.dm +++ b/code/modules/admin/IsBanned.dm @@ -16,8 +16,16 @@ if (text2num(computer_id) == 2147483647) //this cid causes stickybans to go haywire log_access("Failed Login (invalid cid): [key] [address]-[computer_id]") return list("reason"="invalid login data", "desc"="Error: Could not check ban status, Please try again. Error message: Your computer provided an invalid Computer ID.)") - var/admin = 0 + + if (type == "world") + return ..() //shunt world topic banchecks to purely to byond's internal ban system + var/ckey = ckey(key) + var/client/C = GLOB.directory[ckey] + if (C && ckey == C.ckey && computer_id == C.computer_id && address == C.address) + return //don't recheck connected clients. + + var/admin = FALSE if(GLOB.admin_datums[ckey] || GLOB.deadmins[ckey]) admin = 1 @@ -126,7 +134,6 @@ bannedckey = ban["ckey"] var/newmatch = FALSE - var/client/C = GLOB.directory[ckey] var/cachedban = SSstickyban.cache[bannedckey] //rogue ban in the process of being reverted. diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 895f8c9f88..1cecbbd0e5 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -693,7 +693,7 @@ var/prev_dynamic_voting = CONFIG_GET(flag/dynamic_voting) CONFIG_SET(flag/dynamic_voting,!prev_dynamic_voting) if (!prev_dynamic_voting) - to_chat(world, "Vote is now between extended and dynamic chaos.") + to_chat(world, "Vote is now a ranked choice of dynamic storytellers.") else to_chat(world, "Vote is now between extended and secret.") log_admin("[key_name(usr)] [prev_dynamic_voting ? "disabled" : "enabled"] dynamic voting.") diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index 53fdb315b5..f08112939a 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -492,7 +492,7 @@ GLOBAL_PROTECT(AdminProcCallSpamPrevention) message_admins("[key_name_admin(usr)] assumed direct control of [M].") log_admin("[key_name(usr)] assumed direct control of [M].") var/mob/adminmob = src.mob - M.ckey = src.ckey + adminmob.transfer_ckey(M, send_signal = FALSE) if( isobserver(adminmob) ) qdel(adminmob) SSblackbox.record_feedback("tally", "admin_verb", 1, "Assume Direct Control") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index 2b8d365e15..acd320856a 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -35,6 +35,9 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/cmd_admin_grantfullaccess, /client/proc/cmd_admin_areatest_all, /client/proc/cmd_admin_areatest_station, + #ifdef TESTING + /client/proc/see_dirty_varedits, + #endif /client/proc/cmd_admin_test_atmos_controllers, /client/proc/cmd_admin_rejuvenate, /datum/admins/proc/show_traitor_panel, @@ -84,8 +87,24 @@ GLOBAL_PROTECT(admin_verbs_debug_mapping) SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! SSblackbox.record_feedback("tally", "admin_verb", 1, "Show Camera Range") +#ifdef TESTING +GLOBAL_LIST_EMPTY(dirty_vars) +/client/proc/see_dirty_varedits() + set category = "Mapping" + set name = "Dirty Varedits" + + var/list/dat = list() + dat += "

    Abandon all hope ye who enter here



    " + for(var/thing in GLOB.dirty_vars) + dat += "[thing]
    " + CHECK_TICK + var/datum/browser/popup = new(usr, "dirty_vars", "Dirty Varedits", 900, 750) + popup.set_content(dat.Join()) + popup.open() +#endif + /client/proc/sec_camera_report() set category = "Mapping" set name = "Camera Report" diff --git a/code/modules/admin/verbs/one_click_antag.dm b/code/modules/admin/verbs/one_click_antag.dm index 09a8f692d8..7675f858ee 100644 --- a/code/modules/admin/verbs/one_click_antag.dm +++ b/code/modules/admin/verbs/one_click_antag.dm @@ -137,9 +137,9 @@ /datum/admins/proc/makeWizard() - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null) + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for the position of a Wizard Foundation 'diplomat'?", ROLE_WIZARD, null) - var/mob/dead/observer/selected = pick_n_take(candidates) + var/mob/selected = pick_n_take(candidates) var/mob/living/carbon/human/new_character = makeBody(selected) new_character.mind.make_Wizard() @@ -214,9 +214,9 @@ /datum/admins/proc/makeNukeTeam() var/datum/game_mode/nuclear/temp = new - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp) - var/list/mob/dead/observer/chosen = list() - var/mob/dead/observer/theghost = null + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for a nuke team being sent in?", ROLE_OPERATIVE, temp) + var/list/mob/chosen = list() + var/mob/theghost = null if(candidates.len) var/numagents = 5 @@ -378,7 +378,7 @@ ertemplate.enforce_human = prefs["enforce_human"]["value"] == "Yes" ? TRUE : FALSE ertemplate.opendoors = prefs["open_armory"]["value"] == "Yes" ? TRUE : FALSE - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) + var/list/mob/candidates = pollGhostCandidates("Do you wish to be considered for [ertemplate.polldesc] ?", "deathsquad", null) var/teamSpawned = FALSE if(candidates.len > 0) @@ -404,7 +404,7 @@ numagents-- continue // This guy's unlucky, not enough spawn points, we skip him. var/spawnloc = spawnpoints[numagents] - var/mob/dead/observer/chosen_candidate = pick(candidates) + var/mob/chosen_candidate = pick(candidates) candidates -= chosen_candidate if(!chosen_candidate.key) continue diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index 433f52306b..fce45810d1 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -484,11 +484,9 @@ user.do_attack_animation(L) - if(ishuman(L)) - var/mob/living/carbon/human/H = L - if(H.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) - playsound(H, 'sound/weapons/genhit.ogg', 50, TRUE) - return FALSE + if(L.check_shields(src, 0, "[user]'s [name]", MELEE_ATTACK)) + playsound(L, 'sound/weapons/genhit.ogg', 50, TRUE) + return FALSE switch (mode) if(BATON_STUN) diff --git a/code/modules/antagonists/blob/blob/blobs/shield.dm b/code/modules/antagonists/blob/blob/blobs/shield.dm index 33e7e4392f..da165adef2 100644 --- a/code/modules/antagonists/blob/blob/blobs/shield.dm +++ b/code/modules/antagonists/blob/blob/blobs/shield.dm @@ -3,6 +3,7 @@ icon = 'icons/mob/blob.dmi' icon_state = "blob_shield" desc = "A solid wall of slightly twitching tendrils." + var/damaged_desc = "A wall of twitching tendrils." max_integrity = 150 brute_resist = 0.25 explosion_block = 3 @@ -21,10 +22,10 @@ /obj/structure/blob/shield/update_icon() ..() - if(obj_integrity <= 70) - icon_state = "blob_shield_damaged" - name = "weakened strong blob" - desc = "A wall of twitching tendrils." + if(obj_integrity < max_integrity * 0.5) + icon_state = "[initial(icon_state)]_damaged" + name = "weakened [initial(name)]" + desc = "[damaged_desc]" atmosblock = FALSE if(!weakened) armor = armor.setRating("melee" = 15, "bullet" = 15, "laser" = 5, "energy" = 0, "bomb" = 10, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) @@ -37,4 +38,27 @@ if(weakened) armor = armor.setRating("melee" = 25, "bullet" = 25, "laser" = 15, "energy" = 10, "bomb" = 20, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) weakened = FALSE - air_update_turf(1) \ No newline at end of file + air_update_turf(1) + +/obj/structure/blob/shield/reflective + name = "reflective blob" + desc = "A solid wall of slightly twitching tendrils with a reflective glow." + damaged_desc = "A wall of twitching tendrils with a reflective glow." + icon_state = "blob_glow" + flags_1 = CHECK_RICOCHET_1 + point_return = 8 + max_integrity = 50 + brute_resist = 1 + explosion_block = 2 + +/obj/structure/blob/shield/reflective/handle_ricochet(obj/item/projectile/P) + var/turf/p_turf = get_turf(P) + var/face_direction = get_dir(src, p_turf) + var/face_angle = dir2angle(face_direction) + var/incidence_s = GET_ANGLE_OF_INCIDENCE(face_angle, (P.Angle + 180)) + if(abs(incidence_s) > 90 && abs(incidence_s) < 270) + return FALSE + var/new_angle_s = SIMPLIFY_DEGREES(face_angle + incidence_s) + P.setAngle(new_angle_s) + visible_message("[P] reflects off [src]!") + return TRUE \ No newline at end of file diff --git a/code/modules/antagonists/blob/blob/powers.dm b/code/modules/antagonists/blob/blob/powers.dm index e49d186362..aeb1392432 100644 --- a/code/modules/antagonists/blob/blob/powers.dm +++ b/code/modules/antagonists/blob/blob/powers.dm @@ -113,12 +113,22 @@ /mob/camera/blob/verb/create_shield_power() set category = "Blob" - set name = "Create Shield Blob (15)" - set desc = "Create a shield blob, which will block fire and is hard to kill." + set name = "Create/Upgrade Shield Blob (15)" + set desc = "Create a shield blob, which will block fire and is hard to kill. Using this on an existing shield blob turns it into a reflective blob, capable of reflecting most projectiles but making it much weaker than usual to brute attacks." create_shield() /mob/camera/blob/proc/create_shield(turf/T) - createSpecial(15, /obj/structure/blob/shield, 0, 0, T) + var/obj/structure/blob/shield/S = locate(/obj/structure/blob/shield) in T + if(S) + if(!can_buy(15)) + return + if(S.obj_integrity < S.max_integrity * 0.5) + to_chat(src, "This shield blob is too damaged to be modified properly!") + return + to_chat(src, "You secrete a reflective ooze over the shield blob, allowing it to reflect projectiles at the cost of reduced intregrity.") + S.change_to(/obj/structure/blob/shield/reflective, src) + else + createSpecial(15, /obj/structure/blob/shield, 0, 0, T) /mob/camera/blob/verb/create_resource() set category = "Blob" @@ -156,7 +166,7 @@ if(!can_buy(40)) return - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly + var/list/mob/candidates = pollGhostCandidates("Do you want to play as a [blob_reagent_datum.name] blobbernaut?", ROLE_BLOB, null, ROLE_BLOB, 50) //players must answer rapidly if(LAZYLEN(candidates)) //if we got at least one candidate, they're a blobbernaut now. B.max_integrity = initial(B.max_integrity) * 0.25 //factories that produced a blobbernaut have much lower health B.obj_integrity = min(B.obj_integrity, B.max_integrity) @@ -171,7 +181,7 @@ blobber.update_icons() blobber.adjustHealth(blobber.maxHealth * 0.5) blob_mobs += blobber - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) C.transfer_ckey(blobber) SEND_SOUND(blobber, sound('sound/effects/blobattack.ogg')) SEND_SOUND(blobber, sound('sound/effects/attackblob.ogg')) @@ -359,7 +369,7 @@ to_chat(src, "You can expand, which will attack people, damage objects, or place a Normal Blob if the tile is clear.") to_chat(src, "Normal Blobs will expand your reach and can be upgraded into special blobs that perform certain functions.") to_chat(src, "You can upgrade normal blobs into the following types of blob:") - to_chat(src, "Shield Blobs are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires.") + to_chat(src, "Shield Blobs are strong and expensive blobs which take more damage. In additon, they are fireproof and can block air, use these to protect yourself from station fires. Upgrading them again will result in a reflective blob, capable of reflecting most projectiles at the cost of the strong blob's extra health.") to_chat(src, "Resource Blobs are blobs which produce more resources for you, build as many of these as possible to consume the station. This type of blob must be placed near node blobs or your core to work.") to_chat(src, "Factory Blobs are blobs that spawn blob spores which will attack nearby enemies. This type of blob must be placed near node blobs or your core to work.") to_chat(src, "Blobbernauts can be produced from factories for a cost, and are hard to kill, powerful, and moderately smart. The factory used to create one will become fragile and briefly unable to produce spores.") diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index febf53c324..97b4437298 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -183,7 +183,7 @@ BuyPower(new /datum/action/bloodsucker/masquerade) BuyPower(new /datum/action/bloodsucker/veil) // Traits - for (var/T in defaultTraits) + for(var/T in defaultTraits) ADD_TRAIT(owner.current, T, "bloodsucker") if(HAS_TRAIT(owner.current, TRAIT_TOXINLOVER)) //No slime bonuses here, no thank you had_toxlover = TRUE @@ -200,10 +200,10 @@ var/mob/living/carbon/human/H = owner.current var/datum/species/S = H.dna.species // Make Changes - S.brutemod *= 0.5 // <-------------------- Start small, but burn mod increases based on rank! - S.coldmod = 0 - S.stunmod *= 0.25 - S.siemens_coeff *= 0.75 //base electrocution coefficient 1 + H.physiology.brute_mod *= 0.8 // <-------------------- Start small, but burn mod increases based on rank! + H.physiology.cold_mod = 0 + H.physiology.stun_mod *= 0.35 + H.physiology.siemens_coeff *= 0.75 //base electrocution coefficient 1 //S.heatmod += 0.5 // Heat shouldn't affect. Only Fire. //S.punchstunthreshold = 8 //damage at which punches from this race will stun 9 S.punchdamagelow += 1 //lowest possible punch damage 0 @@ -319,12 +319,10 @@ datum/antagonist/bloodsucker/proc/SpendRank() if(ishuman(owner.current)) var/mob/living/carbon/human/H = owner.current var/datum/species/S = H.dna.species - S.burnmod *= 0.025 // Slightly more burn damage - S.stunmod *= 0.95 // Slightly less stun time. S.punchdamagelow += 0.5 S.punchdamagehigh += 0.5 // NOTE: This affects the hitting power of Brawn. // More Health - owner.current.setMaxHealth(owner.current.maxHealth + 5) + owner.current.setMaxHealth(owner.current.maxHealth + 10) // Vamp Stats regenRate += 0.05 // Points of brute healed (starts at 0.3) feedAmount += 2 // Increase how quickly I munch down vics (15) diff --git a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm index f73912d0f5..3493622945 100644 --- a/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm +++ b/code/modules/antagonists/bloodsucker/objects/bloodsucker_crypt.dm @@ -275,7 +275,7 @@ // All done! if(convert_progress <= 0) // FAIL: Can't be Vassal - if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) && HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY + if(!SSticker.mode.can_make_vassal(target, user, display_warning=FALSE) || HAS_TRAIT(target, TRAIT_MINDSHIELD)) // If I'm an unconvertable Antag ONLY to_chat(user, "[target] doesn't respond to your persuasion. It doesn't appear they can be converted to follow you, they either have a mindshield or their external loyalties are too difficult for you to break.\[ALT+click to release\]") convert_progress ++ // Pop it back up some. Avoids wasting Blood on a lost cause. // SUCCESS: All done! diff --git a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm index 0365ae63af..501bcdc1c4 100644 --- a/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm +++ b/code/modules/antagonists/clockcult/clock_items/replica_fabricator.dm @@ -139,7 +139,7 @@ var/new_thing_type = fabrication_values["new_obj_type"] if(isturf(target)) //if our target is a turf, we're just going to ChangeTurf it and assume it'll work out. var/turf/T = target - T.ChangeTurf(new_thing_type) + T.ChangeTurf(new_thing_type, flags = CHANGETURF_INHERIT_AIR) else if(new_thing_type) if(fabrication_values["dir_in_new"]) diff --git a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm index 32b1b61dd1..d823f19d4a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm +++ b/code/modules/antagonists/clockcult/clock_structures/wall_gear.dm @@ -59,7 +59,7 @@ if(anchored) T.PlaceOnTop(/turf/closed/wall/clockwork) else - T.PlaceOnTop(/turf/open/floor/clockwork) + T.PlaceOnTop(/turf/open/floor/clockwork, flags = CHANGETURF_INHERIT_AIR) new /obj/structure/falsewall/brass(T) qdel(src) else diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index f38f379abe..6f340b9271 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -239,9 +239,9 @@ var/turf/T = safepick(validturfs) if(T) if(istype(T, /turf/open/floor/plating)) - T.PlaceOnTop(/turf/open/floor/engine/cult) + T.PlaceOnTop(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR) else - T.ChangeTurf(/turf/open/floor/engine/cult) + T.ChangeTurf(/turf/open/floor/engine/cult, flags = CHANGETURF_INHERIT_AIR) else var/turf/open/floor/engine/cult/F = safepick(cultturfs) if(F) diff --git a/code/modules/antagonists/nukeop/clownop.dm b/code/modules/antagonists/nukeop/clownop.dm index 43e62c4638..58b492b578 100644 --- a/code/modules/antagonists/nukeop/clownop.dm +++ b/code/modules/antagonists/nukeop/clownop.dm @@ -5,6 +5,14 @@ antagpanel_category = "ClownOp" nukeop_outfit = /datum/outfit/syndicate/clownop +/datum/antagonist/nukeop/clownop/on_gain() + . = ..() + ADD_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST) + +/datum/antagonist/nukeop/clownop/on_removal() + REMOVE_TRAIT(owner, TRAIT_CLOWN_MENTALITY, NUKEOP_ANTAGONIST) + return ..() + /datum/antagonist/nukeop/leader/clownop name = "Clown Operative Leader" roundend_category = "clown operatives" diff --git a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm index 0a223f8b10..b5ce5538e9 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclear_challenge.dm @@ -76,9 +76,10 @@ GLOBAL_VAR_INIT(war_declared, FALSE) CONFIG_SET(number/shuttle_refuel_delay, max(CONFIG_GET(number/shuttle_refuel_delay), CHALLENGE_SHUTTLE_DELAY)) if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - var/threat_spent = CONFIG_GET(number/dynamic_warops_cost) - mode.spend_threat(threat_spent) - mode.log_threat("Nuke ops spent [threat_spent] on war ops.") + if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED)) + var/threat_spent = CONFIG_GET(number/dynamic_warops_cost) + mode.spend_threat(threat_spent) + mode.log_threat("Nuke ops spent [threat_spent] on war ops.") SSblackbox.record_feedback("amount", "nuclear_challenge_mode", 1) qdel(src) @@ -101,12 +102,13 @@ GLOBAL_VAR_INIT(war_declared, FALSE) return FALSE if(istype(SSticker.mode, /datum/game_mode/dynamic)) var/datum/game_mode/dynamic/mode = SSticker.mode - if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement)) - to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.") - return FALSE - else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost)) - to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.") - return FALSE + if(!(mode.storyteller.flags & WAROPS_ALWAYS_ALLOWED)) + if(mode.threat_level < CONFIG_GET(number/dynamic_warops_requirement)) + to_chat(user, "Due to the dynamic space in which the station resides, you are too deep into Nanotrasen territory to reasonably go loud.") + return FALSE + else if(mode.threat < CONFIG_GET(number/dynamic_warops_cost)) + to_chat(user, "Due to recent threats on the station, Nanotrasen is looking too closely for a war declaration to be wise.") + return FALSE return TRUE /obj/item/nuclear_challenge/clownops diff --git a/code/modules/antagonists/traitor/datum_traitor.dm b/code/modules/antagonists/traitor/datum_traitor.dm index ac19df3631..40d1712bc3 100644 --- a/code/modules/antagonists/traitor/datum_traitor.dm +++ b/code/modules/antagonists/traitor/datum_traitor.dm @@ -80,6 +80,8 @@ if(istype(SSticker.mode,/datum/game_mode/dynamic)) mode = SSticker.mode is_dynamic = TRUE + if(mode.storyteller.flags & NO_ASSASSIN) + is_hijacker = FALSE if(GLOB.joined_player_list.len>=GLOB.dynamic_high_pop_limit) is_hijacker = (prob(10) && mode.threat_level > CONFIG_GET(number/dynamic_hijack_high_population_requirement)) else @@ -180,7 +182,7 @@ destroy_objective.owner = owner destroy_objective.find_target() add_objective(destroy_objective) - else if(prob(30)) + else if(prob(30) || (mode.storyteller.flags & NO_ASSASSIN)) var/datum/objective/maroon/maroon_objective = new maroon_objective.owner = owner maroon_objective.find_target() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm index 07ee17a1bd..6bafba9abc 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/circulator.dm @@ -61,8 +61,6 @@ //Actually transfer the gas var/datum/gas_mixture/removed = air2.remove(transfer_moles) - removed.react(src) - update_parents() return removed diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index 19f3f58708..db8a8e90ad 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -57,10 +57,10 @@ if(item.parent) var/static/pipenetwarnings = 10 if(pipenetwarnings > 0) - warning("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z])") + log_mapping("build_pipeline(): [item.type] added to a pipenet while still having one. (pipes leading to the same spot stacking in one turf) Nearby: ([item.x], [item.y], [item.z]).") pipenetwarnings -= 1 if(pipenetwarnings == 0) - warning("build_pipeline(): further messages about pipenets will be suppressed") + log_mapping("build_pipeline(): further messages about pipenets will be suppressed") members += item possible_expansions += item @@ -154,11 +154,6 @@ var/partial_heat_capacity = total_heat_capacity*(share_volume/air.volume) var/target_temperature var/target_heat_capacity - // first calculate heat from radiation. there's an implied "* 1 tick" here. - // 0.05 magic multiplicand is, first, 0.1 deciseconds; second, half of the radiation's going right back into the gas. - var/share_constant = STEFANBOLTZMANN*(share_volume**(2/3))*0.05 - // Minimizing temp to 4 billion is mostly to prevent -infinity temperatures. - var/heat = share_constant*(min(air.temperature,4000000000)**4) if(isopenturf(target)) @@ -170,8 +165,8 @@ if((modeled_location.heat_capacity>0) && (partial_heat_capacity>0)) var/delta_temperature = air.temperature - target_temperature - heat -= share_constant*(min(target_temperature,4000000000)**4) - heat += thermal_conductivity*delta_temperature* \ + + var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*target_heat_capacity/(partial_heat_capacity+target_heat_capacity)) air.temperature -= heat/total_heat_capacity @@ -188,8 +183,7 @@ var/sharer_temperature_delta = 0 if((sharer_heat_capacity>0) && (partial_heat_capacity>0)) - heat -= share_constant*(min(target_temperature,4000000000)**4) - heat += thermal_conductivity*delta_temperature* \ + var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*sharer_heat_capacity/(partial_heat_capacity+sharer_heat_capacity)) self_temperature_delta = -heat/total_heat_capacity @@ -205,12 +199,10 @@ if((target.heat_capacity>0) && (partial_heat_capacity>0)) var/delta_temperature = air.temperature - target.temperature - heat -= share_constant*(min(target.temperature,4000000000)**4) - heat += thermal_conductivity*delta_temperature* \ + var/heat = thermal_conductivity*delta_temperature* \ (partial_heat_capacity*target.heat_capacity/(partial_heat_capacity+target.heat_capacity)) air.temperature -= heat/total_heat_capacity - air.temperature = CLAMP(air.temperature,TCMB,INFINITY) // i have no idea why TCMB needs to be the min but i ain't changing it update = TRUE /datum/pipeline/proc/return_air() diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index d0c78d21b3..329c77ba14 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -56,7 +56,7 @@ pixel_y = (new_layer - PIPING_LAYER_DEFAULT) * PIPING_LAYER_P_Y /obj/machinery/meter/process_atmos() - if(!target) + if(!(target?.flags_1 & INITIALIZED_1)) icon_state = "meterX" return 0 diff --git a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm index 79aa957d97..b087859a47 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -26,7 +26,9 @@ var/turf/T = loc if(istype(T)) - if(T.blocks_air) + if(islava(T)) + environment_temperature = 5000 + else if(T.blocks_air) environment_temperature = T.temperature else var/turf/open/OT = T diff --git a/code/modules/buildmode/submodes/basic.dm b/code/modules/buildmode/submodes/basic.dm index 4f7b176691..fe3d831d81 100644 --- a/code/modules/buildmode/submodes/basic.dm +++ b/code/modules/buildmode/submodes/basic.dm @@ -22,9 +22,9 @@ if(istype(object,/turf) && left_click && !alt_click && !ctrl_click) var/turf/T = object if(isspaceturf(object)) - T.PlaceOnTop(/turf/open/floor/plating) + T.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else if(isplatingturf(object)) - T.PlaceOnTop(/turf/open/floor/plasteel) + T.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else if(isfloorturf(object)) T.PlaceOnTop(/turf/closed/wall) else if(iswallturf(object)) @@ -35,7 +35,7 @@ log_admin("Build Mode: [key_name(c)] deleted [object] at [AREACOORD(object)]") if(isturf(object)) var/turf/T = object - T.ScrapeAway() + T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) else if(isobj(object)) qdel(object) return diff --git a/code/modules/cargo/packs/misc.dm b/code/modules/cargo/packs/misc.dm index aa680e1b1e..29133b78d2 100644 --- a/code/modules/cargo/packs/misc.dm +++ b/code/modules/cargo/packs/misc.dm @@ -13,17 +13,16 @@ //////////////////// Paperwork and Writing Supplies ////////////////////////// ////////////////////////////////////////////////////////////////////////////// -/* I did it Kevin /datum/supply_pack/misc/abandonedcrate - name = "Abandoned Crate" - desc = "Someone keeps finding these locked crates out in the boonies. How about you take a crack at it, we've had our fill. WARNING: EXPLOSIVE" + name = "Loot Box" + desc = "Try your luck with these highly secure loot boxes! Solve the lock, win great prizes! WARNING: EXPLOSIVE FAILURE." contraband = TRUE - cost = 12800 + cost = 15000 contains = list(/obj/structure/closet/crate/secure/loot) crate_name = "abandoned crate" crate_type = /obj/structure/closet/crate/large dangerous = TRUE -*/ + /datum/supply_pack/misc/artsupply name = "Art Supplies" desc = "Make some happy little accidents with six canvasses, two easels, two boxes of crayons, and a rainbow crayon!" diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index a54584d6cc..361b2a7517 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -79,4 +79,4 @@ var/client_keysend_amount = 0 var/next_keysend_reset = 0 var/next_keysend_trip_reset = 0 - var/keysend_tripped = FALSE \ No newline at end of file + var/keysend_tripped = FALSE diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 00cc01105d..7b7cf3413e 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -21,6 +21,10 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/last_ip var/last_id + var/icon/custom_holoform_icon + var/list/cached_holoform_icons + var/last_custom_holoform = 0 + //Cooldowns for saving/loading. These are four are all separate due to loading code calling these one after another var/saveprefcooldown var/loadprefcooldown @@ -195,6 +199,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/auto_fit_viewport = TRUE var/uplink_spawn_loc = UPLINK_PDA + + var/sprint_spacebar = FALSE + var/sprint_toggle = FALSE var/list/exp = list() var/list/menuoptions @@ -245,6 +252,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "Character Appearance" dat += "Loadout" dat += "Game Preferences" + dat += "Content Preferences" if(!path) dat += "
    Please create an account to save your preferences
    " @@ -721,13 +729,13 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += "
    " dat += "

    Clothing & Equipment

    " dat += "Underwear:[underwear]" - if(UNDIE_COLORABLE(GLOB.underwear_list[underwear])) + if(GLOB.underwear_list[underwear]?.has_color) dat += "Underwear Color:     Change
    " dat += "Undershirt:[undershirt]" - if(UNDIE_COLORABLE(GLOB.undershirt_list[undershirt])) + if(GLOB.undershirt_list[undershirt]?.has_color) dat += "Undershirt Color:     Change
    " dat += "Socks:[socks]" - if(UNDIE_COLORABLE(GLOB.socks_list[socks])) + if(GLOB.socks_list[socks]?.has_color) dat += "Socks Color:     Change
    " dat += "Backpack:[backbag]" dat += "Jumpsuit:
    [jumpsuit_style]
    " @@ -834,13 +842,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat +="
    " dat += "

    Citadel Preferences

    " //Because fuck me if preferences can't be fucking modularized and expected to update in a reasonable timeframe. - dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]
    " - dat += "Voracious MediHound sleepers: [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
    " - dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"]
    " - dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]
    " - dat += "Lewdchem:[lewdchem == TRUE ? "Enabled" : "Disabled"]
    " dat += "Widescreen: [widescreenpref ? "Enabled ([CONFIG_GET(string/default_view)])" : "Disabled (15x15)"]
    " dat += "Auto stand: [autostand ? "Enabled" : "Disabled"]
    " + dat += "Auto OOC: [auto_ooc ? "Enabled" : "Disabled"]
    " dat += "Screen Shake: [(screenshake==100) ? "Full" : ((screenshake==0) ? "None" : "[screenshake]")]
    " if (user && user.client && !user.client.prefs.screenshake==0) dat += "Damage Screen Shake: [(damagescreenshake==1) ? "On" : ((damagescreenshake==0) ? "Off" : "Only when down")]
    " @@ -892,6 +896,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "
    " dat += "Ambient Occlusion: [ambientocclusion ? "Enabled" : "Disabled"]
    " dat += "Fit Viewport: [auto_fit_viewport ? "Auto" : "Manual"]
    " + dat += "Sprint Key: [sprint_spacebar ? "Space" : "Shift"]
    " + dat += "Toggle Sprint: [sprint_toggle ? "Enabled" : "Disabled"]
    " if (CONFIG_GET(flag/maprotation) && CONFIG_GET(flag/tgstyle_maprotation)) var/p_map = preferred_map @@ -991,6 +997,26 @@ GLOBAL_LIST_EMPTY(preferences_datums) dat += "" dat += "
    [gear.description]
    " + if(4) // Content preferences + dat += "" + dat +="
    " + dat += "

    Fetish content prefs

    " + dat += "Arousal:[arousable == TRUE ? "Enabled" : "Disabled"]
    " + dat += "Voracious MediHound sleepers: [(cit_toggles & MEDIHOUND_SLEEPER) ? "Yes" : "No"]
    " + dat += "Hear Vore Sounds: [(cit_toggles & EATING_NOISES) ? "Yes" : "No"]
    " + dat += "Hear Vore Digestion Sounds: [(cit_toggles & DIGESTION_NOISES) ? "Yes" : "No"]
    " + dat += "Forced Feminization: [(cit_toggles & FORCED_FEM) ? "Allowed" : "Disallowed"]
    " + dat += "Forced Masculinization: [(cit_toggles & FORCED_MASC) ? "Allowed" : "Disallowed"]
    " + dat += "Lewd Hypno: [(cit_toggles & HYPNO) ? "Allowed" : "Disallowed"]
    " + dat += "
    " + dat += "

    Other content prefs

    " + dat += "Breast Enlargement: [(cit_toggles & BREAST_ENLARGEMENT) ? "Allowed" : "Disallowed"]
    " + dat += "Penis Enlargement: [(cit_toggles & PENIS_ENLARGEMENT) ? "Allowed" : "Disallowed"]
    " + dat += "Hypno: [(cit_toggles & NEVER_HYPNO) ? "Disallowed" : "Allowed"]
    " + dat += "Aphrodisiacs: [(cit_toggles & NO_APHRO) ? "Disallowed" : "Allowed"]
    " + dat += "Ass Slapping: [(cit_toggles & NO_ASS_SLAP) ? "Disallowed" : "Allowed"]
    " + dat += "
    " + dat += "
    " @@ -2036,8 +2062,6 @@ GLOBAL_LIST_EMPTY(preferences_datums) features["genitals_use_skintone"] = !features["genitals_use_skintone"] if("arousable") arousable = !arousable - if("lewdchem") - lewdchem = !lewdchem if("has_cock") features["has_cock"] = !features["has_cock"] if(features["has_cock"] == FALSE) @@ -2069,6 +2093,8 @@ GLOBAL_LIST_EMPTY(preferences_datums) user.client.change_view(CONFIG_GET(string/default_view)) if("autostand") autostand = !autostand + if("auto_ooc") + auto_ooc = !auto_ooc if ("screenshake") var/desiredshake = input(user, "Set the amount of screenshake you want. \n(0 = disabled, 100 = full, 200 = maximum.)", "Character Preference", screenshake) as null|num if (!isnull(desiredshake)) @@ -2184,6 +2210,31 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("toggledigestionnoise") cit_toggles ^= DIGESTION_NOISES + + if("breast_enlargement") + cit_toggles ^= BREAST_ENLARGEMENT + + if("penis_enlargement") + cit_toggles ^= PENIS_ENLARGEMENT + + if("feminization") + cit_toggles ^= FORCED_FEM + + if("masculinization") + cit_toggles ^= FORCED_MASC + + if("hypno") + cit_toggles ^= HYPNO + + if("never_hypno") + cit_toggles ^= NEVER_HYPNO + + if("aphro") + cit_toggles ^= NO_APHRO + + if("ass_slap") + cit_toggles ^= NO_ASS_SLAP + //END CITADEL EDIT if("ambientocclusion") @@ -2197,6 +2248,12 @@ GLOBAL_LIST_EMPTY(preferences_datums) if(auto_fit_viewport && parent) parent.fit_viewport() + if("sprint_key") + sprint_spacebar = !sprint_spacebar + + if("sprint_toggle") + sprint_toggle = !sprint_toggle + if("save") save_preferences() save_character() @@ -2369,3 +2426,11 @@ GLOBAL_LIST_EMPTY(preferences_datums) return else custom_names[name_id] = sanitized_name + +/datum/preferences/proc/get_filtered_holoform(filter_type) + if(!custom_holoform_icon) + return + LAZYINITLIST(cached_holoform_icons) + if(!cached_holoform_icons[filter_type]) + cached_holoform_icons[filter_type] = process_holoform_icon_filter(custom_holoform_icon, filter_type) + return cached_holoform_icons[filter_type] diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index c88d246b96..d78b9fe6fd 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -167,6 +167,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["parallax"] >> parallax S["ambientocclusion"] >> ambientocclusion S["auto_fit_viewport"] >> auto_fit_viewport + S["sprint_spacebar"] >> sprint_spacebar + S["sprint_toggle"] >> sprint_toggle S["menuoptions"] >> menuoptions S["enable_tips"] >> enable_tips S["tip_delay"] >> tip_delay @@ -181,8 +183,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["widescreenpref"] >> widescreenpref S["autostand"] >> autostand S["cit_toggles"] >> cit_toggles - S["lewdchem"] >> lewdchem S["preferred_chaos"] >> preferred_chaos + S["auto_ooc"] >> auto_ooc //try to fix any outdated data if necessary @@ -204,6 +206,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car parallax = sanitize_integer(parallax, PARALLAX_INSANE, PARALLAX_DISABLE, null) ambientocclusion = sanitize_integer(ambientocclusion, 0, 1, initial(ambientocclusion)) auto_fit_viewport = sanitize_integer(auto_fit_viewport, 0, 1, initial(auto_fit_viewport)) + sprint_spacebar = sanitize_integer(sprint_spacebar, 0, 1, initial(sprint_spacebar)) + sprint_toggle = sanitize_integer(sprint_toggle, 0, 1, initial(sprint_toggle)) ghost_form = sanitize_inlist(ghost_form, GLOB.ghost_forms, initial(ghost_form)) ghost_orbit = sanitize_inlist(ghost_orbit, GLOB.ghost_orbits, initial(ghost_orbit)) ghost_accs = sanitize_inlist(ghost_accs, GLOB.ghost_accs_options, GHOST_ACCS_DEFAULT_OPTION) @@ -219,7 +223,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car widescreenpref = sanitize_integer(widescreenpref, 0, 1, initial(widescreenpref)) autostand = sanitize_integer(autostand, 0, 1, initial(autostand)) cit_toggles = sanitize_integer(cit_toggles, 0, 65535, initial(cit_toggles)) - + auto_ooc = sanitize_integer(auto_ooc, 0, 1, initial(auto_ooc)) return 1 @@ -264,6 +268,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["parallax"], parallax) WRITE_FILE(S["ambientocclusion"], ambientocclusion) WRITE_FILE(S["auto_fit_viewport"], auto_fit_viewport) + WRITE_FILE(S["sprint_spacebar"], sprint_spacebar) + WRITE_FILE(S["sprint_toggle"], sprint_toggle) WRITE_FILE(S["menuoptions"], menuoptions) WRITE_FILE(S["enable_tips"], enable_tips) WRITE_FILE(S["tip_delay"], tip_delay) @@ -278,8 +284,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["widescreenpref"], widescreenpref) WRITE_FILE(S["autostand"], autostand) WRITE_FILE(S["cit_toggles"], cit_toggles) - WRITE_FILE(S["lewdchem"], lewdchem) WRITE_FILE(S["preferred_chaos"], preferred_chaos) + WRITE_FILE(S["auto_ooc"], auto_ooc) return 1 @@ -517,6 +523,21 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car all_quirks = SANITIZE_LIST(all_quirks) + for(var/V in all_quirks) // quirk migration + switch(V) + if("Acute hepatic pharmacokinesis") + DISABLE_BITFIELD(cit_toggles, PENIS_ENLARGEMENT) + DISABLE_BITFIELD(cit_toggles, BREAST_ENLARGEMENT) + ENABLE_BITFIELD(cit_toggles,FORCED_FEM) + ENABLE_BITFIELD(cit_toggles,FORCED_MASC) + all_quirks -= V + if("Crocin Immunity") + ENABLE_BITFIELD(cit_toggles,NO_APHRO) + all_quirks -= V + if("Buns of Steel") + ENABLE_BITFIELD(cit_toggles,NO_ASS_SLAP) + all_quirks -= V + cit_character_pref_load(S) return 1 diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 60b8e1565e..6fd1584e75 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -57,7 +57,6 @@ //No idea what this is but eh -tori var/force_alternate_icon = FALSE - /obj/item/clothing/Initialize() . = ..() if(CHECK_BITFIELD(clothing_flags, VOICEBOX_TOGGLABLE)) @@ -298,6 +297,33 @@ BLIND // can't see anything user.regenerate_icons() return TRUE +/obj/item/clothing/neck/AltClick(mob/user) + . = ..() + if(!istype(user) || !user.canUseTopic(src, BE_CLOSE, ismonkey(user))) + return + // Polychrome stuff: + if(hasprimary | hassecondary | hastertiary) + var/choice = input(user,"polychromic thread options", "Clothing Recolor") as null|anything in list("[hasprimary ? "Primary Color" : ""]", "[hassecondary ? "Secondary Color" : ""]", "[hastertiary ? "Tertiary Color" : ""]") //generates a list depending on the enabled overlays + switch(choice) //Lets the list's options actually lead to something + if("Primary Color") + var/primary_color_input = input(usr,"","Choose Primary Color",primary_color) as color|null //color input menu, the "|null" adds a cancel button to it. + if(primary_color_input) //Checks if the color selected is NULL, rejects it if it is NULL. + primary_color = sanitize_hexcolor(primary_color_input, desired_format=6, include_crunch=1) //formats the selected color properly + update_icon() //updates the item icon + user.regenerate_icons() //updates the worn icon. Probably a bad idea, but it works. + if("Secondary Color") + var/secondary_color_input = input(usr,"","Choose Secondary Color",secondary_color) as color|null + if(secondary_color_input) + secondary_color = sanitize_hexcolor(secondary_color_input, desired_format=6, include_crunch=1) + update_icon() + user.regenerate_icons() + if("Tertiary Color") + var/tertiary_color_input = input(usr,"","Choose Tertiary Color",tertiary_color) as color|null + if(tertiary_color_input) + tertiary_color = sanitize_hexcolor(tertiary_color_input, desired_format=6, include_crunch=1) + update_icon() + user.regenerate_icons() + return TRUE /obj/item/clothing/under/verb/jumpsuit_adjust() set name = "Adjust Jumpsuit Style" diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 1a178158d8..a80cf6fba3 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -54,6 +54,9 @@ H.blur_eyes(5) eyes.applyOrganDamage(5) +/obj/item/clothing/glasses/proc/ranged_attack(mob/living/carbon/human/user,atom/A, params) + return FALSE + /obj/item/clothing/glasses/meson name = "optical meson scanner" desc = "Used by engineering and mining staff to see basic structural and terrain layouts through walls, regardless of lighting conditions." diff --git a/code/modules/clothing/glasses/disablerglasses.dm b/code/modules/clothing/glasses/disablerglasses.dm new file mode 100644 index 0000000000..a46e4c8339 --- /dev/null +++ b/code/modules/clothing/glasses/disablerglasses.dm @@ -0,0 +1,15 @@ +/obj/item/clothing/glasses/hud/security/sunglasses/disablers + name = "true stunglasses" + desc = "Made for only the best of shitsec. Wear 'em like you're gonna robust all of those fuckers." + var/beamtype = /obj/item/projectile/beam/disabler //change for adminbus + +/obj/item/clothing/glasses/hud/security/sunglasses/disablers/ranged_attack(mob/living/carbon/human/user,atom/A, params) + user.changeNext_move(CLICK_CD_RANGE) + var/obj/item/projectile/beam/disabler/LE = new beamtype( loc ) + playsound(usr.loc, 'sound/weapons/taser2.ogg', 75, 1) + LE.firer = src + LE.def_zone = user.get_organ_target() + LE.preparePixelProjectile(A, src, params) + LE.fire() + return TRUE + //shamelessly copied \ No newline at end of file diff --git a/code/modules/clothing/glasses/engine_goggles.dm b/code/modules/clothing/glasses/engine_goggles.dm index 47706a3e1e..0132fa8596 100644 --- a/code/modules/clothing/glasses/engine_goggles.dm +++ b/code/modules/clothing/glasses/engine_goggles.dm @@ -90,7 +90,7 @@ for(var/i in rad_places) var/turf/place = i - if(get_dist(user, place) >= range*2) //Rads are easier to see than wires under the floor + if(get_dist(user, place) >= range*8) //Rads are easier to see than wires under the floor continue var/strength = round(rad_places[i] / 1000, 0.1) var/image/pic = new(loc = place) @@ -139,7 +139,6 @@ item_state = "trayson-t-ray" desc = "Used by engineering staff to see underfloor objects such as cables and pipes." range = 2 - modes = list(MODE_NONE = MODE_TRAY, MODE_TRAY = MODE_NONE) /obj/item/clothing/glasses/meson/engine/tray/prescription @@ -152,7 +151,6 @@ icon_state = "trayson-shuttle" item_state = "trayson-shuttle" desc = "Used to see the boundaries of shuttle regions." - modes = list(MODE_NONE = MODE_SHUTTLE, MODE_SHUTTLE = MODE_NONE) #undef MODE_NONE diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 3d318db761..43c99fe7fd 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -89,12 +89,12 @@ /obj/item/clothing/shoes/clown_shoes/equipped(mob/user, slot) . = ..() - if(user.mind && user.mind.assigned_role == "Clown") + if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)) SEND_SIGNAL(user, COMSIG_CLEAR_MOOD_EVENT, "noshoes") /obj/item/clothing/shoes/clown_shoes/dropped(mob/user) . = ..() - if(user.mind && user.mind.assigned_role == "Clown") + if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)) SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "noshoes", /datum/mood_event/noshoes) /obj/item/clothing/shoes/clown_shoes/jester diff --git a/code/modules/clothing/shoes/taeclowndo.dm b/code/modules/clothing/shoes/taeclowndo.dm index f2bbdf0ceb..7c891dbde4 100644 --- a/code/modules/clothing/shoes/taeclowndo.dm +++ b/code/modules/clothing/shoes/taeclowndo.dm @@ -13,7 +13,7 @@ if(!ishuman(user)) return var/mob/living/carbon/human/H = user - if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && H.mind.assigned_role == "Clown")) + if(!(HAS_TRAIT(H, TRAIT_CLUMSY)) && !(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY))) return if(slot == SLOT_SHOES) spells = new diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 9a5c919720..324d4bc722 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -590,8 +590,7 @@ /obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, slot) if(!..() || !ishuman(M)) return FALSE - var/mob/living/carbon/human/H = M - if(H.mind.assigned_role == "Clown") + if(M.mind && HAS_TRAIT(M.mind, TRAIT_CLOWN_MENTALITY)) return TRUE else return FALSE @@ -628,7 +627,9 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage, /obj/item/construction/rcd, /obj/item/pipe_dispenser) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | IMMUTABLE_SLOW resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + flags_1 = TESLA_IGNORE_1 /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason name = "M.A.S.O.N RIG helmet" @@ -638,12 +639,13 @@ armor = list("melee" = 20, "bullet" = 15, "laser" = 15, "energy" = 45, "bomb" = 100, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 100) item_color = "ancient" brightness_on = 16 - clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS flash_protect = 5 //We will not be flash by bombs tint = 1 var/obj/machinery/doppler_array/integrated/bomb_radar max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | ALLOWINTERNALS | SCAN_REAGENTS resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF + flags_1 = TESLA_IGNORE_1 /obj/item/clothing/head/helmet/space/hardsuit/ancient/mason/Initialize() . = ..() diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 58df911412..177bce672f 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -467,6 +467,33 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE +/obj/item/clothing/under/sundresswhite + name = "white sundress" + desc = "Makes you want to frolic in a field of lillies." + icon_state = "sundress_white" + item_color = "sundress_white" + body_parts_covered = CHEST|GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/greendress + name = "green dress" + desc = "A tight green dress" + icon_state = "dress_green" + item_color = "dress_green" + body_parts_covered = CHEST|GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/pinkdress + name = "pink dress" + desc = "A tight pink dress" + icon_state = "dress_pink" + item_color = "dress_pink" + body_parts_covered = CHEST|GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + /obj/item/clothing/under/captainparade name = "captain's parade uniform" desc = "A captain's luxury-wear, for special occasions." @@ -509,6 +536,24 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE +/obj/item/clothing/under/westernbustle + name = "western bustle dress" + desc = "Filled with Western fire." + icon_state = "western_bustle" + item_state = "wcoat" + item_color = "western_bustle" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/flamenco + name = "flamenco dress" + desc = "Filled with Latin fire." + icon_state = "flamenco" + item_state = "wcoat" + item_color = "flamenco" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + /obj/item/clothing/under/stripeddress name = "striped dress" desc = "Fashion in space." @@ -529,6 +574,44 @@ fitted = FEMALE_UNIFORM_TOP can_adjust = FALSE +/obj/item/clothing/under/flowerdress + name = "flower dress" + desc = "Lovely dress" + icon_state = "flower_dress" + item_state = "sailordress" + item_color = "flower_dress" + body_parts_covered = CHEST|GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/sweptskirt + name = "swept skirt" + desc = "Formal skirt" + icon_state = "skirt_swept" + item_color = "skirt_swept" + body_parts_covered = GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/corset + name = "black corset" + desc = "Nanotrasen is not resposible for any organ damage" + icon_state = "corset" + item_color = "corset" + body_parts_covered = CHEST|GROIN + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + +/obj/item/clothing/under/croptop + name = "crop top" + desc = "We've saved money by giving you half a shirt!" + icon_state = "sailor_dress" + item_state = "sailordress" + item_color = "sailor_dress" + body_parts_covered = CHEST|GROIN|ARMS + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE + /obj/item/clothing/under/redeveninggown name = "red evening gown" desc = "Fancy dress for space bar singers." diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 05616337db..97bb4c48bc 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -75,3 +75,34 @@ desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station." icon_state = "camopants" item_color = "camopants" + +/obj/item/clothing/under/pants/jeanripped + name = "ripped jeans" + desc = "If you're wearing this you're poor or a rebel" + icon_state = "jean_ripped" + item_color = "jean_ripped" + +/obj/item/clothing/under/pants/jeanshort + name = "jean shorts" + desc = "These are really just jeans cut in half" + icon_state = "jean_shorts" + item_color = "jean_shorts" + +/obj/item/clothing/under/pants/denimskirt + name = "denim skirt" + desc = "These are really just a jean leg hole cut from a pair" + icon_state = "denim_skirt" + item_color = "denim_skirt" + +/obj/item/clothing/under/pants/chaps + name = "black chaps" + body_parts_covered = LEGS + desc = "Yeehaw" + icon_state = "chaps" + item_color = "chaps" + +/obj/item/clothing/under/pants/yoga + name = "yoga pants" + desc = "Comfy!" + icon_state = "yoga_pants" + item_color = "yoga_pants" diff --git a/code/modules/crafting/recipes/recipes_misc.dm b/code/modules/crafting/recipes/recipes_misc.dm index 70dd4d1370..38ae3560e5 100644 --- a/code/modules/crafting/recipes/recipes_misc.dm +++ b/code/modules/crafting/recipes/recipes_misc.dm @@ -358,3 +358,11 @@ time = 100 category = CAT_MISC always_availible = FALSE // Disabled til learned + +/datum/crafting_recipe/coconut_bong + name = "Coconut Bong" + result = /obj/item/bong/coconut + reqs = list(/obj/item/stack/sheet/mineral/bamboo = 2, + /obj/item/reagent_containers/food/snacks/grown/coconut = 1) + time = 70 + category = CAT_MISC \ No newline at end of file diff --git a/code/modules/events/disease_outbreak.dm b/code/modules/events/disease_outbreak.dm index 07a399a1b6..00e3698e1e 100644 --- a/code/modules/events/disease_outbreak.dm +++ b/code/modules/events/disease_outbreak.dm @@ -37,6 +37,8 @@ continue if(!H.client) continue + if(HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) + continue if(H.stat == DEAD) continue if(HAS_TRAIT(H, TRAIT_VIRUSIMMUNE)) //Don't pick someone who's virus immune, only for it to not do anything. diff --git a/code/modules/events/heart_attack.dm b/code/modules/events/heart_attack.dm index 8db2d98bf0..a47a8b81b4 100644 --- a/code/modules/events/heart_attack.dm +++ b/code/modules/events/heart_attack.dm @@ -9,7 +9,7 @@ /datum/round_event/heart_attack/start() var/list/heart_attack_contestants = list() for(var/mob/living/carbon/human/H in shuffle(GLOB.player_list)) - if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest()) + if(!H.client || H.stat == DEAD || H.InCritical() || !H.can_heartattack() || H.has_status_effect(STATUS_EFFECT_EXERCISED) || (/datum/disease/heart_failure in H.diseases) || H.undergoing_cardiac_arrest() || HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) continue if(H.satiety <= -60) //Multiple junk food items recently heart_attack_contestants[H] = 3 diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 65d96ad150..ea63ee611f 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -75,7 +75,7 @@ /datum/round_event/santa/start() var/list/candidates = pollGhostCandidates("Santa is coming to town! Do you want to be Santa?", poll_time=150) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) C.transfer_ckey(santa, FALSE) diff --git a/code/modules/events/mass_hallucination.dm b/code/modules/events/mass_hallucination.dm index 2b0c16ebfc..0553f69b5b 100644 --- a/code/modules/events/mass_hallucination.dm +++ b/code/modules/events/mass_hallucination.dm @@ -35,4 +35,6 @@ /datum/hallucination/delusion, /datum/hallucination/oh_yeah) for(var/mob/living/carbon/C in GLOB.alive_mob_list) + if (HAS_TRAIT(C,TRAIT_EXEMPT_HEALTH_EVENTS)) + continue new picked_hallucination(C, TRUE) \ No newline at end of file diff --git a/code/modules/events/spontaneous_appendicitis.dm b/code/modules/events/spontaneous_appendicitis.dm index 901337cd52..8ee943beb9 100644 --- a/code/modules/events/spontaneous_appendicitis.dm +++ b/code/modules/events/spontaneous_appendicitis.dm @@ -15,6 +15,8 @@ continue if(H.stat == DEAD) continue + if (HAS_TRAIT(H,TRAIT_EXEMPT_HEALTH_EVENTS)) + continue if(!H.getorgan(/obj/item/organ/appendix)) //Don't give the disease to some who lacks it, only for it to be auto-cured continue if(!(MOB_ORGANIC in H.mob_biotypes)) //biotype sleeper bugs strike again, once again making appendicitis pick a target that can't take it diff --git a/code/modules/food_and_drinks/drinks/drinks.dm b/code/modules/food_and_drinks/drinks/drinks.dm index 92f412dd89..b33be2fa02 100644 --- a/code/modules/food_and_drinks/drinks/drinks.dm +++ b/code/modules/food_and_drinks/drinks/drinks.dm @@ -439,7 +439,6 @@ desc = "Quinine tastes funny, but at least it'll keep that Space Malaria away." icon_state = "tonic" list_reagents = list("tonic" = 50) - foodtype = ALCOHOL /obj/item/reagent_containers/food/drinks/soda_cans/sodawater name = "soda water" diff --git a/code/modules/food_and_drinks/food/snacks_frozen.dm b/code/modules/food_and_drinks/food/snacks_frozen.dm index 4a4c5ddb88..fb7bcf33b4 100644 --- a/code/modules/food_and_drinks/food/snacks_frozen.dm +++ b/code/modules/food_and_drinks/food/snacks_frozen.dm @@ -219,7 +219,7 @@ name = "space cola snowcone" desc = "Space Cola drizzled over a snowball in a paper cup." icon_state = "soda_sc" - list_reagents = list("nutriment" = 1, "space_cola" = 5) + list_reagents = list("nutriment" = 1, "cola" = 5) tastes = list("ice" = 1, "water" = 1, "cola" = 5) /obj/item/reagent_containers/food/snacks/snowcones/spacemountainwind @@ -248,4 +248,4 @@ desc = "A very colorful snowball in a paper cup." icon_state = "rainbow_sc" list_reagents = list("nutriment" = 5, "laughter" = 25) - tastes = list("ice" = 1, "water" = 1, "sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3) \ No newline at end of file + tastes = list("ice" = 1, "water" = 1, "sunlight" = 5, "light" = 5, "slime" = 5, "paint" = 3, "clouds" = 3) diff --git a/code/modules/food_and_drinks/food/snacks_other.dm b/code/modules/food_and_drinks/food/snacks_other.dm index 58a0ab4382..de22537063 100644 --- a/code/modules/food_and_drinks/food/snacks_other.dm +++ b/code/modules/food_and_drinks/food/snacks_other.dm @@ -609,4 +609,68 @@ filling_color = "#ECA735" tastes = list("fried corn" = 1) foodtype = JUNKFOOD | FRIED - dunkable = TRUE \ No newline at end of file + dunkable = TRUE + +/obj/item/reagent_containers/food/snacks/marshmallow + name = "marshmallow" + desc = "A marshmallow filled with fluffy marshmallow fluff." + icon_state = "marshmallow" + list_reagents = list("sugar" = 5, "nutriment" = 2) + filling_color = "#fafafa" + w_class = WEIGHT_CLASS_TINY + tastes = list("marshmallow" = 2) + foodtype = SUGAR | JUNKFOOD + var/burned = 0 + +/obj/item/reagent_containers/food/snacks/marshmallow/attackby(obj/item/I, mob/user) + switch (I.get_temperature()) + if (355 to 1500) + if (prob(30)) + burnmallow() + if (1500 to 2000) + if (prob(50)) + burnmallow() + else + burnmallow(TRUE) + if (2000 to 3000) + if (prob(10)) + burnmallow() + else + burnmallow(TRUE) + if (3000 to INFINITY) + burnmallow(TRUE) + return ..() + +/obj/item/reagent_containers/food/snacks/marshmallow/proc/burnmallow(reallyburned = FALSE) + if (reallyburned && burned == 1) + icon_state = "marshmallowrburned" + else if (burned == 0) + icon_state = "marshmallowburned" + +/obj/item/reagent_containers/food/snacks/marshmallow/examine(mob/user) + . = ..() + if (burned == 2) + . += "It looks very burned." + if (burned == 1) + . += "It looks just right for eating!" + +/obj/item/reagent_containers/food/snacks/marshmallow/fire_act(temp,volume) + switch (temp) + if (355 to 1500) + if (prob(30)) + burnmallow() + if (1500 to 2000) + if (prob(50)) + burnmallow() + else + burnmallow(TRUE) + if (2000 to 3000) + if (prob(10)) + burnmallow() + else + burnmallow(TRUE) + if (3000 to 7000) + burnmallow(TRUE) + if (7000 to INFINITY) + burn() + ..() diff --git a/code/modules/food_and_drinks/recipes/food_mixtures.dm b/code/modules/food_and_drinks/recipes/food_mixtures.dm index 404f3a6061..07732a415d 100644 --- a/code/modules/food_and_drinks/recipes/food_mixtures.dm +++ b/code/modules/food_and_drinks/recipes/food_mixtures.dm @@ -84,14 +84,6 @@ required_temp = 413 mob_react = FALSE -/datum/chemical_reaction/caramel_burned - name = "Caramel burned" - id = "caramel_burned" - results = list("carbon" = 1) - required_reagents = list("caramel" = 1) - required_temp = 483 - mob_react = FALSE - /datum/chemical_reaction/cheesewheel name = "Cheesewheel" id = "cheesewheel" @@ -182,4 +174,4 @@ name = "BBQ Sauce" id = "bbqsauce" results = list("bbqsauce" = 5) - required_reagents = list("ash" = 1, "tomatojuice" = 1, "salglu_solution" = 3, "blackpepper" = 1) \ No newline at end of file + required_reagents = list("ash" = 1, "tomatojuice" = 1, "salglu_solution" = 3, "blackpepper" = 1) diff --git a/code/modules/goonchat/browserOutput.dm b/code/modules/goonchat/browserOutput.dm index c273690571..6f1e19d5e0 100644 --- a/code/modules/goonchat/browserOutput.dm +++ b/code/modules/goonchat/browserOutput.dm @@ -8,6 +8,8 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico //On client, created on login /datum/chatOutput var/client/owner //client ref + var/total_checks = 0 + var/last_check = 0 var/loaded = FALSE // Has the client loaded the browser output area? var/list/messageQueue //If they haven't loaded chat, this is where messages will go until they do var/cookieSent = FALSE // Has the client sent a cookie for analysis @@ -150,6 +152,18 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico //Called by client, sent data to investigate (cookie history so far) /datum/chatOutput/proc/analyzeClientData(cookie = "") + //Spam check + if(world.time > last_check + (3 SECONDS)) + last_check = world.time + total_checks = 0 + + total_checks += 1 + + if(total_checks > SPAM_TRIGGER_AUTOMUTE) + message_admins("[key_name(owner)] kicked for goonchat topic spam") + qdel(owner) + return + if(!cookie) return @@ -158,13 +172,22 @@ GLOBAL_DATUM_INIT(iconCache, /savefile, new("tmp/iconCache.sav")) //Cache of ico if (connData && islist(connData) && connData.len > 0 && connData["connData"]) connectionHistory = connData["connData"] //lol fuck var/list/found = new() - for(var/i in connectionHistory.len to 1 step -1) + if(connectionHistory.len > 5) + message_admins("[key_name(src.owner)] was kicked for an invalid ban cookie)") + qdel(owner) + return + + for(var/i in min(connectionHistory.len, 5) to 1 step -1) + if(QDELETED(owner)) + //he got cleaned up before we were done + return var/list/row = src.connectionHistory[i] if (!row || row.len < 3 || (!row["ckey"] || !row["compid"] || !row["ip"])) //Passed malformed history object return if (world.IsBanned(row["ckey"], row["ip"], row["compid"], real_bans_only=TRUE)) found = row break + CHECK_TICK //Uh oh this fucker has a history of playing on a banned account!! if (found.len > 0) diff --git a/code/modules/goonchat/browserassets/js/browserOutput.js b/code/modules/goonchat/browserassets/js/browserOutput.js index abd05d29ed..823ad107d2 100644 --- a/code/modules/goonchat/browserassets/js/browserOutput.js +++ b/code/modules/goonchat/browserassets/js/browserOutput.js @@ -421,8 +421,8 @@ function handleClientData(ckey, ip, compid) { return; //Record already exists } } - - if (opts.clientData.length >= opts.clientDataLimit) { + //Lets make sure we obey our limit (can connect from server with higher limit) + while (opts.clientData.length >= opts.clientDataLimit) { opts.clientData.shift(); } } else { diff --git a/code/modules/holodeck/computer.dm b/code/modules/holodeck/computer.dm index 889706744a..d551222836 100644 --- a/code/modules/holodeck/computer.dm +++ b/code/modules/holodeck/computer.dm @@ -59,9 +59,7 @@ return var/area/AS = get_area(src) if(istype(AS, /area/holodeck)) - log_world("### MAPPING ERROR") - log_world("Holodeck computer cannot be in a holodeck.") - log_world("This would cause circular power dependency.") + log_mapping("Holodeck computer cannot be in a holodeck, This would cause circular power dependency.") qdel(src) return else diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index 3376bac1cc..77199b3496 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -240,7 +240,7 @@ dat += "
    " else dat += "No trait-related genes detected in sample.
    " - if(can_insert && istype(disk.gene, /datum/plant_gene/trait)) + if(can_insert && istype(disk.gene, /datum/plant_gene/trait) && !seed.is_gene_forbidden(disk.gene.type)) dat += "Insert: [disk.gene.get_name()]" dat += "" else diff --git a/code/modules/hydroponics/grown/grass_carpet.dm b/code/modules/hydroponics/grown/grass_carpet.dm index 8fc141e152..02b36d6a3f 100644 --- a/code/modules/hydroponics/grown/grass_carpet.dm +++ b/code/modules/hydroponics/grown/grass_carpet.dm @@ -27,7 +27,7 @@ bitesize_mod = 2 var/stacktype = /obj/item/stack/tile/grass var/tile_coefficient = 0.02 // 1/50 - wine_power = 15 + distill_reagent = /datum/reagent/consumable/ethanol/beer/light /obj/item/reagent_containers/food/snacks/grown/grass/attack_self(mob/user) to_chat(user, "You prepare the astroturf.") diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index b37e494233..3af284974e 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -232,7 +232,7 @@ /obj/item/reagent_containers/food/snacks/grown/cherry_bomb/proc/detonate() reagents.chem_temp = 1000 //Sets off the black powder reagents.handle_reactions() - + // Lavaland cactus /obj/item/seeds/lavaland/cactus @@ -244,3 +244,279 @@ product = /obj/item/reagent_containers/food/snacks/grown/ash_flora/cactus_fruit growing_icon = 'icons/obj/hydroponics/growing_fruits.dmi' growthstages = 2 + + +// Coconut +/obj/item/seeds/coconut + name = "pack of coconut seeds" + desc = "They're seeds that grow into coconut palm trees." + icon_state = "seed-coconut" + species = "coconut" + plantname = "Coconut Palm Tree" + product = /obj/item/reagent_containers/food/snacks/grown/coconut + lifespan = 50 + endurance = 30 + potency = 35 + growing_icon = 'icons/obj/hydroponics/growing.dmi' + icon_dead = "coconut-dead" + genes = list(/datum/plant_gene/trait/repeated_harvest) + forbiddengenes = list(/datum/plant_gene/trait/squash, /datum/plant_gene/trait/stinging) + reagents_add = list("coconutmilk" = 0.3) + +/obj/item/reagent_containers/food/snacks/grown/coconut + seed = /obj/item/seeds/coconut + name = "coconut" + desc = "Hard shell of a nut containing delicious milk inside. Perhaps try using something sharp?" + icon_state = "coconut" + item_state = "coconut" + possible_transfer_amounts = list(5, 10, 15, 20, 25, 30, 50) + spillable = FALSE + resistance_flags = ACID_PROOF + volume = 150 //so it won't cut reagents despite having the capacity for them + w_class = WEIGHT_CLASS_SMALL + force = 5 + throwforce = 5 + hitsound = 'sound/weapons/klonk.ogg' + attack_verb = list("klonked", "donked", "bonked") + var/opened = FALSE + var/carved = FALSE + var/chopped = FALSE + var/straw = FALSE + var/fused = FALSE + var/fusedactive = FALSE + var/defused = FALSE + +/obj/item/reagent_containers/food/snacks/grown/coconut/Initialize(mapload, obj/item/seeds/new_seed) + . = ..() + var/newvolume = 50 + round(seed.potency,10) + if (seed.get_gene(/datum/plant_gene/trait/maxchem)) + newvolume = newvolume + 50 + volume = newvolume + reagents.maximum_volume = newvolume + reagents.update_total() + + transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size? + +/obj/item/reagent_containers/food/snacks/grown/coconut/attack_self(mob/user) + if (!opened) + return + + if(!possible_transfer_amounts.len) + return + var/i=0 + for(var/A in possible_transfer_amounts) + i++ + if(A != amount_per_transfer_from_this) + continue + if(i[src]'s transfer amount is now [amount_per_transfer_from_this] units.") + return + +/obj/item/reagent_containers/food/snacks/grown/coconut/attackby(obj/item/W, mob/user, params) + //DEFUSING NADE LOGIC + if (W.tool_behaviour == TOOL_WIRECUTTER && fused) + user.show_message("You cut the fuse!", MSG_VISUAL) + playsound(user, W.hitsound, 50, 1, -1) + icon_state = "coconut_carved" + desc = "A coconut. This one's got a hole in it." + name = "coconut" + defused = TRUE + fused = FALSE + fusedactive = FALSE + if(!seed.get_gene(/datum/plant_gene/trait/glow)) + set_light(0, 0.0) + return + //IGNITING NADE LOGIC + if(!fusedactive && fused) + var/lighting_text = W.ignition_effect(src, user) + if(lighting_text) + user.visible_message("[user] ignites [src]'s fuse!", "You ignite the [src]'s fuse!") + fusedactive = TRUE + defused = FALSE + playsound(src, 'sound/effects/fuse.ogg', 100, 0) + message_admins("[ADMIN_LOOKUPFLW(user)] ignited a coconut bomb for detonation at [ADMIN_VERBOSEJMP(user)] [pretty_string_from_reagent_list(reagents.reagent_list)]") + log_game("[key_name(user)] primed a coconut grenade for detonation at [AREACOORD(user)].") + addtimer(CALLBACK(src, .proc/prime), 5 SECONDS) + icon_state = "coconut_grenade_active" + desc = "RUN!" + if(!seed.get_gene(/datum/plant_gene/trait/glow)) + light_color = "#FFCC66" //for the fuse + set_light(3, 0.8) + return + + //ADDING A FUSE, NADE LOGIC + if (istype(W,/obj/item/stack/sheet/cloth) || istype(W,/obj/item/stack/sheet/durathread)) + if (carved && !straw && !fused) + user.show_message("You add a fuse to the coconut!", 1) + W.use(1) + fused = TRUE + icon_state = "coconut_grenade" + desc = "A makeshift bomb made out of a coconut. You estimate the fuse is long enough for 5 seconds." + name = "coconut bomb" + return + //ADDING STRAW LOGIC + if (istype(W,/obj/item/stack/sheet/mineral/bamboo) && opened && !straw && fused) + user.show_message("You add a bamboo straw to the coconut!", 1) + straw = TRUE + W.use(1) + icon_state += "_straw" + desc = "You can already feel like you're on a tropical vacation." + return + //OPENING THE NUT LOGIC + if (!carved && !chopped) + var/screwdrivered = W.tool_behaviour == TOOL_SCREWDRIVER + if(screwdrivered || W.sharpness) + user.show_message("You [screwdrivered ? "make a hole in the coconut" : "slice the coconut open"]!", 1) + carved = TRUE + opened = TRUE + spillable = !screwdrivered + reagent_flags = OPENCONTAINER + ENABLE_BITFIELD(reagents.reagents_holder_flags, OPENCONTAINER) + icon_state = screwdrivered ? "coconut_carved" : "coconut_chopped" + desc = "A coconut. [screwdrivered ? "This one's got a hole in it" : "This one's sliced open, with all its delicious contents for your eyes to savour"]." + playsound(user, W.hitsound, 50, 1, -1) + return + return ..() + +/obj/item/reagent_containers/food/snacks/grown/coconut/attack(mob/living/M, mob/user, obj/target) + if(M && user.a_intent == INTENT_HARM && !spillable) + var/obj/item/bodypart/affecting = user.zone_selected //Find what the player is aiming at + if (affecting == BODY_ZONE_HEAD && prob(15)) + //smash the nut open + var/armor_block = min(90, M.run_armor_check(affecting, "melee", null, null,armour_penetration)) // For normal attack damage + M.apply_damage(force, BRUTE, affecting, armor_block) + + //Sound + playsound(user, hitsound, 100, 1, -1) + + //Attack logs + log_combat(user, M, "attacked", src) + + //Display an attack message. + if(M != user) + M.visible_message("[user] has cracked open a [name] on [M]'s head!", \ + "[user] has cracked open a [name] on [M]'s head!") + else + user.visible_message("[M] cracks open a [name] on their [M.p_them()] head!", \ + "[M] cracks open a [name] on [M.p_their()] head!") + + //The coconut breaks open so splash its reagents + spillable = TRUE + SplashReagents(M) + + //Lastly we remove the nut + qdel(src) + else + . = ..() + return + + if(fusedactive) + return + + if(!opened) + return + + if(!canconsume(M, user)) + return + + if(!reagents || !reagents.total_volume) + to_chat(user, "[src] is empty!") + return + + if(user.a_intent == INTENT_HARM && spillable) + var/R + M.visible_message("[user] splashes the contents of [src] onto [M]!", \ + "[user] splashes the contents of [src] onto [M]!") + if(reagents) + for(var/datum/reagent/A in reagents.reagent_list) + R += A.id + " (" + R += num2text(A.volume) + ")," + if(isturf(target) && reagents.reagent_list.len && thrownby) + log_combat(thrownby, target, "splashed (thrown) [english_list(reagents.reagent_list)]") + message_admins("[ADMIN_LOOKUPFLW(thrownby)] splashed (thrown) [english_list(reagents.reagent_list)] on [target] at [ADMIN_VERBOSEJMP(target)].") + reagents.reaction(M, TOUCH) + log_combat(user, M, "splashed", R) + reagents.clear_reagents() + else + if(M != user) + M.visible_message("[user] attempts to feed something to [M].", \ + "[user] attempts to feed something to you.") + if(!do_mob(user, M)) + return + if(!reagents || !reagents.total_volume) + return // The drink might be empty after the delay, such as by spam-feeding + M.visible_message("[user] feeds something to [M].", "[user] feeds something to you.") + log_combat(user, M, "fed", reagents.log_list()) + else + to_chat(user, "You swallow a gulp of [src].") + var/fraction = min(5/reagents.total_volume, 1) + reagents.reaction(M, INGEST, fraction) + addtimer(CALLBACK(reagents, /datum/reagents.proc/trans_to, M, 5), 5) + playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1) + +/obj/item/reagent_containers/food/snacks/grown/coconut/afterattack(obj/target, mob/user, proximity) + . = ..() + if(fusedactive) + return + + if((!proximity) || !check_allowed_items(target,target_self=1)) + return + + if(target.is_refillable()) //Something like a glass. Player probably wants to transfer TO it. + if(!reagents.total_volume) + to_chat(user, "[src] is empty!") + return + + if(target.reagents.holder_full()) + to_chat(user, "[target] is full.") + return + + var/trans = reagents.trans_to(target, amount_per_transfer_from_this) + to_chat(user, "You transfer [trans] unit\s of the solution to [target].") + + else if(target.is_drainable()) //A dispenser. Transfer FROM it TO us. + if(!target.reagents.total_volume) + to_chat(user, "[target] is empty and can't be refilled!") + return + + if(reagents.holder_full()) + to_chat(user, "[src] is full.") + return + + var/trans = target.reagents.trans_to(src, amount_per_transfer_from_this) + to_chat(user, "You fill [src] with [trans] unit\s of the contents of [target].") + + else if(reagents.total_volume) + if(user.a_intent == INTENT_HARM && spillable == TRUE) + user.visible_message("[user] splashes the contents of [src] onto [target]!", \ + "You splash the contents of [src] onto [target].") + reagents.reaction(target, TOUCH) + reagents.clear_reagents() + +/obj/item/reagent_containers/food/snacks/grown/coconut/dropped(mob/user) + . = ..() + transform *= TRANSFORM_USING_VARIABLE(40, 100) + 0.5 //temporary fix for size? + +/obj/item/reagent_containers/food/snacks/grown/coconut/proc/prime() + if (defused) + return + var/turf/T = get_turf(src) + reagents.chem_temp = 1000 + //Disable seperated contents when the grenade primes + if (seed.get_gene(/datum/plant_gene/trait/noreact)) + DISABLE_BITFIELD(reagents.reagents_holder_flags, NO_REACT) + reagents.handle_reactions() + log_game("Coconut bomb detonation at [AREACOORD(T)], location [loc]") + qdel(src) + +/obj/item/reagent_containers/food/snacks/grown/coconut/ex_act(severity) + qdel(src) + +/obj/item/reagent_containers/food/snacks/grown/coconut/deconstruct(disassembled = TRUE) + if(!disassembled && fused) + prime() + if(!QDELETED(src)) + qdel(src) diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 4132719389..39e97e3801 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -27,6 +27,7 @@ var/rarity = 0 // How rare the plant is. Used for giving points to cargo when shipping off to CentCom. var/list/mutatelist = list() // The type of plants that this plant can mutate into. var/list/genes = list() // Plant genes are stored here, see plant_genes.dm for more info. + var/list/forbiddengenes = list() var/list/reagents_add = list() // A list of reagents to add to product. // Format: "reagent_id" = potency multiplier @@ -96,6 +97,10 @@ S.reagents_add = reagents_add.Copy() // Faster than grabbing the list from genes. return S +obj/item/seeds/proc/is_gene_forbidden(typepath) + return (typepath in forbiddengenes) + + /obj/item/seeds/proc/get_gene(typepath) return (locate(typepath) in genes) @@ -448,7 +453,7 @@ for(var/i in 1 to amount_random_traits) var/random_trait = pick((subtypesof(/datum/plant_gene/trait)-typesof(/datum/plant_gene/trait/plant_type))) var/datum/plant_gene/trait/T = new random_trait - if(T.can_add(src)) + if(T.can_add(src) && !is_gene_forbidden(random_trait)) genes += T else qdel(T) diff --git a/code/modules/jobs/job_types/clown.dm b/code/modules/jobs/job_types/clown.dm index 922b335a39..f8a7e70473 100644 --- a/code/modules/jobs/job_types/clown.dm +++ b/code/modules/jobs/job_types/clown.dm @@ -14,6 +14,8 @@ access = list(ACCESS_THEATRE) minimal_access = list(ACCESS_THEATRE) + mind_traits = list(TRAIT_CLOWN_MENTALITY) + display_order = JOB_DISPLAY_ORDER_CLOWN /datum/outfit/job/clown diff --git a/code/modules/keybindings/bindings_human.dm b/code/modules/keybindings/bindings_human.dm index a9eafacef6..ed033935b2 100644 --- a/code/modules/keybindings/bindings_human.dm +++ b/code/modules/keybindings/bindings_human.dm @@ -58,13 +58,23 @@ return switch(_key) if("Shift") - sprint_hotkey(TRUE) + if(!user.prefs.sprint_spacebar) + user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) //Yes, this looks hacky. Yes, this works. + return + if("Space") + if(user.prefs.sprint_spacebar) + user.prefs.sprint_toggle ? togglesprint() : sprint_hotkey(TRUE) return return ..() /mob/living/carbon/human/key_up(_key, client/user) switch(_key) if("Shift") - sprint_hotkey(FALSE) + if(!user.prefs.sprint_spacebar && !user.prefs.sprint_toggle) + sprint_hotkey(FALSE) + return + if("Space") + if(user.prefs.sprint_spacebar && !user.prefs.sprint_toggle) + sprint_hotkey(FALSE) return return ..() diff --git a/code/modules/library/soapstone.dm b/code/modules/library/soapstone.dm index 295fc816e2..0d7ae7107b 100644 --- a/code/modules/library/soapstone.dm +++ b/code/modules/library/soapstone.dm @@ -117,6 +117,7 @@ anchored = TRUE max_integrity = 30 layer = LATTICE_LAYER + light_power = 0.3 var/hidden_message var/creator_key diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index 1f55f18823..3e361179de 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -70,7 +70,7 @@ //initialize things that are normally initialized after map load parsed.initTemplateBounds() smooth_zlevel(world.maxz) - log_game("Z-level [name] loaded at at [x],[y],[world.maxz]") + log_game("Z-level [name] loaded at [x],[y],[world.maxz]") return level @@ -84,6 +84,13 @@ if(T.y+height > world.maxy) return + var/list/border = block(locate(max(T.x-1, 1), max(T.y-1, 1), T.z), + locate(min(T.x+width+1, world.maxx), min(T.y+height+1, world.maxy), T.z)) + for(var/L in border) + var/turf/turf_to_disable = L + SSair.remove_from_active(turf_to_disable) //stop processing turfs along the border to prevent runtimes, we return it in initTemplateBounds() + turf_to_disable.atmos_adjacent_turfs?.Cut() + // Accept cached maps, but don't save them automatically - we don't want // ruins clogging up memory for the whole round. var/datum/parsed_map/parsed = cached_map || new(file(mappath)) @@ -100,7 +107,7 @@ //initialize things that are normally initialized after map load parsed.initTemplateBounds() - log_game("[name] loaded at at [T.x],[T.y],[T.z]") + log_game("[name] loaded at [T.x],[T.y],[T.z]") return bounds /datum/map_template/proc/get_affected_turfs(turf/T, centered = FALSE) diff --git a/code/modules/mapping/mapping_helpers.dm b/code/modules/mapping/mapping_helpers.dm index e2459d780a..a7f84fd71f 100644 --- a/code/modules/mapping/mapping_helpers.dm +++ b/code/modules/mapping/mapping_helpers.dm @@ -18,7 +18,7 @@ /obj/effect/baseturf_helper/LateInitialize() if(!baseturf_to_replace) - baseturf_to_replace = typecacheof(/turf/open/space) + baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom)) else if(!length(baseturf_to_replace)) baseturf_to_replace = list(baseturf_to_replace = TRUE) else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative @@ -45,7 +45,6 @@ thing.PlaceOnBottom(null, baseturf) else if(baseturf_to_replace[thing.baseturfs]) thing.assemble_baseturfs(baseturf) - return else thing.PlaceOnBottom(null, baseturf) @@ -107,16 +106,16 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper/Initialize(mapload) . = ..() if(!mapload) - log_world("### MAP WARNING, [src] spawned outside of mapload!") + log_mapping("[src] spawned outside of mapload!") return var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc if(airlock) if(airlock.cyclelinkeddir) - log_world("### MAP WARNING, [src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!") + log_mapping("[src] at [AREACOORD(src)] tried to set [airlock] cyclelinkeddir, but it's already set!") else airlock.cyclelinkeddir = dir else - log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]") + log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") /obj/effect/mapping_helpers/airlock/locked @@ -126,16 +125,16 @@ /obj/effect/mapping_helpers/airlock/locked/Initialize(mapload) . = ..() if(!mapload) - log_world("### MAP WARNING, [src] spawned outside of mapload!") + log_mapping("[src] spawned outside of mapload!") return var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc if(airlock) if(airlock.locked) - log_world("### MAP WARNING, [src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!") + log_mapping("[src] at [AREACOORD(src)] tried to bolt [airlock] but it's already locked!") else airlock.locked = TRUE else - log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]") + log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") /obj/effect/mapping_helpers/airlock/unres name = "airlock unresctricted side helper" @@ -144,13 +143,13 @@ /obj/effect/mapping_helpers/airlock/unres/Initialize(mapload) . = ..() if(!mapload) - log_world("### MAP WARNING, [src] spawned outside of mapload!") + log_mapping("[src] spawned outside of mapload!") return var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in loc if(airlock) airlock.unres_sides ^= dir else - log_world("### MAP WARNING, [src] failed to find an airlock at [AREACOORD(src)]") + log_mapping("[src] failed to find an airlock at [AREACOORD(src)]") //needs to do its thing before spawn_rivers() is called @@ -164,17 +163,6 @@ INITIALIZE_IMMEDIATE(/obj/effect/mapping_helpers/no_lava) var/turf/T = get_turf(src) T.flags_1 |= NO_LAVA_GEN_1 -/// Adds the map it is on to the z_is_planet list -/obj/effect/mapping_helpers/planet_z - name = "planet z helper" - layer = POINT_LAYER - -/obj/effect/mapping_helpers/planet_z/Initialize() - . = ..() - var/datum/space_level/S = SSmapping.get_level(z) - S.traits[ZTRAIT_PLANET] = TRUE - - //This helper applies components to things on the map directly. /obj/effect/mapping_helpers/component_injector name = "Component Injector" diff --git a/code/modules/mapping/preloader.dm b/code/modules/mapping/preloader.dm index e6fa2421a0..4b61663f66 100644 --- a/code/modules/mapping/preloader.dm +++ b/code/modules/mapping/preloader.dm @@ -8,18 +8,26 @@ GLOBAL_DATUM_INIT(_preloader, /datum/map_preloader, new) var/list/attributes var/target_path -/datum/map_preloader/proc/setup(list/the_attributes, path) +/world/proc/preloader_setup(list/the_attributes, path) if(the_attributes.len) GLOB.use_preloader = TRUE - attributes = the_attributes - target_path = path + var/datum/map_preloader/preloader_local = GLOB._preloader + preloader_local.attributes = the_attributes + preloader_local.target_path = path -/datum/map_preloader/proc/load(atom/what) +/world/proc/preloader_load(atom/what) GLOB.use_preloader = FALSE - for(var/attribute in attributes) - var/value = attributes[attribute] + var/datum/map_preloader/preloader_local = GLOB._preloader + for(var/attribute in preloader_local.attributes) + var/value = preloader_local.attributes[attribute] if(islist(value)) value = deepCopyList(value) + #ifdef TESTING + if(what.vars[attribute] == value) + var/message = "[what.type] at [AREACOORD(what)] - VAR: [attribute] = [isnull(value) ? "null" : (isnum(value) ? value : "\"[value]\"")]" + log_mapping("DIRTY VAR: [message]") + GLOB.dirty_vars += message + #endif what.vars[attribute] = value /area/template_noop diff --git a/code/modules/mapping/reader.dm b/code/modules/mapping/reader.dm index 22be4aa246..9b27691dd3 100644 --- a/code/modules/mapping/reader.dm +++ b/code/modules/mapping/reader.dm @@ -306,8 +306,8 @@ //first instance the /area and remove it from the members list index = members.len if(members[index] != /area/template_noop) - GLOB._preloader.setup(members_attributes[index])//preloader for assigning set variables on atom creation var/atype = members[index] + world.preloader_setup(members_attributes[index], atype)//preloader for assigning set variables on atom creation var/atom/instance = areaCache[atype] if (!instance) instance = GLOB.areas_by_type[atype] @@ -318,7 +318,7 @@ instance.contents.Add(crds) if(GLOB.use_preloader && instance) - GLOB._preloader.load(instance) + world.preloader_load(instance) //then instance the /turf and, if multiple tiles are presents, simulates the DMM underlays piling effect @@ -354,7 +354,7 @@ //Instance an atom at (x,y,z) and gives it the variables in attributes /datum/parsed_map/proc/instance_atom(path,list/attributes, turf/crds, no_changeturf, placeOnTop) - GLOB._preloader.setup(attributes, path) + world.preloader_setup(attributes, path) if(crds) if(ispath(path, /turf)) @@ -368,7 +368,7 @@ . = create_atom(path, crds)//first preloader pass if(GLOB.use_preloader && .)//second preloader pass, for those atoms that don't ..() in New() - GLOB._preloader.load(.) + world.preloader_load(.) //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize if(TICK_CHECK) diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index ab3b20ac9f..7bef9b652a 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -926,7 +926,7 @@ timer = world.time + create_delay + 1 if(do_after(user, create_delay, target = T)) var/old_name = T.name - if(T.TerraformTurf(turf_type)) + if(T.TerraformTurf(turf_type, flags = CHANGETURF_INHERIT_AIR)) user.visible_message("[user] turns \the [old_name] into [transform_string]!") message_admins("[ADMIN_LOOKUPFLW(user)] fired the lava staff at [ADMIN_VERBOSEJMP(T)]") log_game("[key_name(user)] fired the lava staff at [AREACOORD(T)].") @@ -937,7 +937,7 @@ qdel(L) else var/old_name = T.name - if(T.TerraformTurf(reset_turf_type)) + if(T.TerraformTurf(reset_turf_type, flags = CHANGETURF_INHERIT_AIR)) user.visible_message("[user] turns \the [old_name] into [reset_string]!") timer = world.time + reset_cooldown playsound(T,'sound/magic/fireball.ogg', 200, 1) diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 79da476719..b5f7bbf8ab 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -50,7 +50,7 @@ /obj/machinery/mineral/ore_redemption/examine(mob/user) . = ..() if(in_range(user, src) || isobserver(user)) - . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
    Ore pickup speed at [ore_pickup_rate].
    " + . += "The status display reads: Smelting [sheet_per_ore] sheet(s) per piece of ore.
    Reward point generation at [point_upgrade*100]%.
    Ore pickup speed at [ore_pickup_rate].
    " /obj/machinery/mineral/ore_redemption/proc/smelt_ore(obj/item/stack/ore/O) var/datum/component/material_container/mat_container = materials.mat_container @@ -63,7 +63,7 @@ ore_buffer -= O if(O && O.refined_type) - points += O.points * O.amount + points += O.points * point_upgrade * O.amount var/material_amount = mat_container.get_item_material_amount(O) diff --git a/code/modules/mob/dead/new_player/preferences_setup.dm b/code/modules/mob/dead/new_player/preferences_setup.dm index 7aae26526e..5b664dc01a 100644 --- a/code/modules/mob/dead/new_player/preferences_setup.dm +++ b/code/modules/mob/dead/new_player/preferences_setup.dm @@ -27,12 +27,7 @@ /datum/preferences/proc/update_preview_icon(equip_job = TRUE) // Determine what job is marked as 'High' priority, and dress them up as such. - var/datum/job/previewJob - var/highest_pref = 0 - for(var/job in job_preferences) - if(job_preferences["[job]"] > highest_pref) - previewJob = SSjob.GetJob(job) - highest_pref = job_preferences["[job]"] + var/datum/job/previewJob = get_highest_job() if(previewJob) // Silicons only need a very basic preview since there is no customization for them. @@ -57,3 +52,11 @@ parent.show_character_previews(new /mutable_appearance(mannequin)) unset_busy_human_dummy(DUMMY_HUMAN_SLOT_PREFERENCES) +/datum/preferences/proc/get_highest_job() + var/highest_pref = 0 + var/datum/job/highest_job + for(var/job in job_preferences) + if(job_preferences["[job]"] > highest_pref) + highest_job = SSjob.GetJob(job) + highest_pref = job_preferences["[job]"] + return highest_job diff --git a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm index dd66f68e5d..241ec8118e 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/_sprite_accessories.dm @@ -74,4 +74,5 @@ /datum/sprite_accessory/underwear icon = 'icons/mob/underwear.dmi' - var/has_color = FALSE \ No newline at end of file + var/has_color = FALSE + var/has_digitigrade = FALSE \ No newline at end of file diff --git a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm index 0a35f0cd26..19ec677a72 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/socks.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/socks.dm @@ -2,6 +2,9 @@ // Socks Definitions // /////////////////////// +/datum/sprite_accessory/underwear/socks + has_digitigrade = TRUE + /datum/sprite_accessory/underwear/socks/nude name = "Nude" icon_state = null diff --git a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm index 3356804cb3..9441b5120a 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/underwear.dm @@ -28,41 +28,49 @@ name = "Boxers" icon_state = "boxers" has_color = TRUE + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_bee name = "Boxers - Bee" icon_state = "bee_shorts" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_hearts name = "Boxers - Heart" icon_state = "boxers_heart" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_stripe name = "Boxers - Striped" icon_state = "boxers_striped" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_commie name = "Boxers - Striped Communist" icon_state = "boxers_commie" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_usastripe name = "Boxers - Striped Freedom" icon_state = "boxers_assblastusa" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/male_uk name = "Boxers - Striped UK" icon_state = "boxers_uk" + has_digitigrade = TRUE gender = MALE /datum/sprite_accessory/underwear/bottom/boxer_briefs name = "Boxer Briefs" icon_state = "boxer_briefs" + has_digitigrade = TRUE has_color = TRUE /datum/sprite_accessory/underwear/bottom/panties @@ -140,6 +148,7 @@ /datum/sprite_accessory/underwear/bottom/longjon name = "Long John Bottoms" icon_state = "ljonb" + has_digitigrade = TRUE has_color = TRUE /datum/sprite_accessory/underwear/bottom/swimsuit_red diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 2b9b01dc18..f1c4316c65 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -3,8 +3,6 @@ GLOBAL_LIST_EMPTY(ghost_images_simple) //this is a list of all ghost images as t GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) -#define CANT_REENTER_ROUND -1 - /mob/dead/observer name = "ghost" desc = "It's a g-g-g-g-ghooooost!" //jinkies! @@ -21,7 +19,6 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) hud_type = /datum/hud/ghost movement_type = GROUND | FLYING var/can_reenter_corpse - var/reenter_round_timeout = 0 // used to prevent people from coming back through ghost roles/midround antags as they suicide/cryo for a duration set by CONFIG_GET(number/suicide_reenter_round_timer) and CONFIG_GET(number/roundstart_suicide_time_limit) var/datum/hud/living/carbon/hud = null // hud var/bootime = 0 var/started_as_observer //This variable is set to 1 when you enter the game as an observer. @@ -137,7 +134,7 @@ GLOBAL_VAR_INIT(observer_default_invisibility, INVISIBILITY_OBSERVER) AA.onNewMob(src) . = ..() - + AddElement(/datum/element/ghost_role_eligibility) grant_all_languages() /mob/dead/observer/get_photo_description(obj/item/camera/camera) @@ -272,16 +269,12 @@ Works together with spawning an observer, noted above. var/mob/dead/observer/ghost = new(src) // Transfer safety to observer spawning proc. SStgui.on_transfer(src, ghost) // Transfer NanoUIs. ghost.can_reenter_corpse = can_reenter_corpse - if(penalize) //penalizing them from making a ghost role / midround antag comeback right away. - var/penalty = CONFIG_GET(number/suicide_reenter_round_timer) MINUTES - var/roundstart_quit_limit = CONFIG_GET(number/roundstart_suicide_time_limit) MINUTES - if(world.time < roundstart_quit_limit) //add up the time difference to their antag rolling penalty if they quit before half a (ingame) hour even passed. - penalty += roundstart_quit_limit - world.time - if(penalty) - ghost.reenter_round_timeout = world.realtime + penalty - if(ghost.reenter_round_timeout - SSshuttle.realtimeofstart > SSshuttle.auto_call + SSshuttle.emergencyCallTime + SSshuttle.emergencyDockTime + SSshuttle.emergencyEscapeTime) - ghost.reenter_round_timeout = CANT_REENTER_ROUND + if (client && client.prefs && client.prefs.auto_ooc) + if (!(client.prefs.chat_toggles & CHAT_OOC)) + client.prefs.chat_toggles ^= CHAT_OOC transfer_ckey(ghost, FALSE) + ghost.AddElement(/datum/element/ghost_role_eligibility,penalize) // technically already run earlier, but this adds the penalty + // needs to be done AFTER the ckey transfer, too return ghost /* @@ -338,12 +331,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return ghostize(0, penalize = TRUE) -/mob/dead/observer/proc/can_reenter_round(silent = FALSE) - if(reenter_round_timeout != CANT_REENTER_ROUND && reenter_round_timeout <= world.realtime) - return TRUE - if(!silent) - to_chat(src, "You are unable to reenter the round[reenter_round_timeout != CANT_REENTER_ROUND ? " yet. Your ghost role blacklist will expire in [DisplayTimeText(reenter_round_timeout - world.realtime)]" : ""].") - return FALSE + /mob/dead/observer/Move(NewLoc, direct) if(updatedir) @@ -898,5 +886,3 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp spawners_menu = new(src) spawners_menu.ui_interact(src) - -#undef CANT_REENTER_ROUND \ No newline at end of file diff --git a/code/modules/mob/living/carbon/alien/alien_defense.dm b/code/modules/mob/living/carbon/alien/alien_defense.dm index b9e27c0637..bdc691ce49 100644 --- a/code/modules/mob/living/carbon/alien/alien_defense.dm +++ b/code/modules/mob/living/carbon/alien/alien_defense.dm @@ -6,21 +6,21 @@ return 2 //no ears /mob/living/carbon/alien/hitby(atom/movable/AM, skipcatch, hitpush) - ..(AM, skipcatch = TRUE, hitpush = FALSE) + return ..(AM, skipcatch = TRUE, hitpush = FALSE) +/mob/living/carbon/alien/can_embed(obj/item/I) + return FALSE /*Code for aliens attacking aliens. Because aliens act on a hivemind, I don't see them as very aggressive with each other. As such, they can either help or harm other aliens. Help works like the human help command while harm is a simple nibble. In all, this is a lot like the monkey code. /N */ /mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M) - if(isturf(loc) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") + . = ..() + if(!.) // the attack was blocked or was help/grab intent return - switch(M.a_intent) - - if ("help") + if (INTENT_HELP) if(!recoveringstam) resting = 0 AdjustStun(-60) @@ -28,11 +28,7 @@ In all, this is a lot like the monkey code. /N AdjustUnconscious(-60) AdjustSleeping(-100) visible_message("[M.name] nuzzles [src] trying to wake [p_them()] up!") - - if ("grab") - grabbedby(M) - - else + if(INTENT_DISARM, INTENT_HARM) if(health > 0) M.do_attack_animation(src, ATTACK_EFFECT_BITE) playsound(loc, 'sound/weapons/bite.ogg', 50, 1, -1) @@ -50,28 +46,31 @@ In all, this is a lot like the monkey code. /N /mob/living/carbon/alien/attack_hand(mob/living/carbon/human/M) - if(..()) //to allow surgery to return properly. - return 0 - + . = ..() + if(.) //To allow surgery to return properly. + return switch(M.a_intent) - if("help") + if(INTENT_HELP) help_shake_act(M) - if("grab") + if(INTENT_GRAB) grabbedby(M) - if ("harm") + if (INTENT_HARM) + if(HAS_TRAIT(M, TRAIT_PACIFISM)) + to_chat(M, "You don't want to hurt [src]!") + return TRUE M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) - return 1 - if("disarm") + if(INTENT_DISARM) + if(HAS_TRAIT(M, TRAIT_PACIFISM)) + to_chat(M, "You don't want to hurt [src]!") + return TRUE M.do_attack_animation(src, ATTACK_EFFECT_DISARM) - return 1 - return 0 /mob/living/carbon/alien/attack_paw(mob/living/carbon/monkey/M) - if(..()) - if (stat != DEAD) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(rand(1, 3), BRUTE, affecting) + . = ..() + if(.) //successful monkey bite. + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + apply_damage(rand(1, 3), BRUTE, affecting) /mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M) @@ -93,13 +92,15 @@ In all, this is a lot like the monkey code. /N adjustStaminaLoss(damage) /mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(10, 40) - adjustBruteLoss(damage) - log_combat(M, src, "attacked") - updatehealth() + . = ..() + if(!.) //unsuccessful slime attack + return + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(10, 40) + adjustBruteLoss(damage) + log_combat(M, src, "attacked") + updatehealth() /mob/living/carbon/alien/ex_act(severity, target, origin) if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src)) diff --git a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm index fe682b5c99..d1ed09665b 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -63,12 +63,7 @@ if(A) if(isliving(A)) var/mob/living/L = A - var/blocked = FALSE - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) - blocked = TRUE - if(!blocked) + if(!L.check_shields(src, 0, "the [name]", attack_type = LEAP_ATTACK)) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") L.Knockdown(100) sleep(2)//Runtime prevention (infinite bump() calls on hulks) diff --git a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm index b3839a6033..1d613db07a 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/humanoid_defense.dm @@ -5,9 +5,11 @@ else ..() -/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/mob/living/carbon/alien/humanoid/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) - ..(user, 1) + . = ..(user, TRUE) + if(.) + return adjustBruteLoss(15) var/hitverb = "punched" if(mob_size < MOB_SIZE_LARGE) @@ -21,46 +23,46 @@ return 1 /mob/living/carbon/alien/humanoid/attack_hand(mob/living/carbon/human/M) - if(..()) - switch(M.a_intent) - if ("harm") - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, 1, -1) - visible_message("[M] has punched [src]!", \ - "[M] has punched [src]!", null, COMBAT_MESSAGE_RANGE) - if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of knocking an alien down. - Unconscious(40) - visible_message("[M] has knocked [src] down!", \ - "[M] has knocked [src] down!") - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - log_combat(M, src, "attacked") + . = ..() + if(.) //To allow surgery to return properly. + return + switch(M.a_intent) + if (INTENT_HARM) + var/damage = rand(1, 9) + if (prob(90)) + playsound(loc, "punch", 25, 1, -1) + visible_message("[M] has punched [src]!", \ + "[M] has punched [src]!", null, COMBAT_MESSAGE_RANGE) + if ((stat != DEAD) && (damage > 9 || prob(5)))//Regular humans have a very small chance of knocking an alien down. + Unconscious(40) + visible_message("[M] has knocked [src] down!", \ + "[M] has knocked [src] down!") + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + apply_damage(damage, BRUTE, affecting) + log_combat(M, src, "attacked") + else + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to punch [src]!", \ + "[M] has attempted to punch [src]!", null, COMBAT_MESSAGE_RANGE) + + if (INTENT_DISARM) + if (!lying) + if (prob(5)) + Unconscious(40) + playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) + log_combat(M, src, "pushed") + visible_message("[M] has pushed down [src]!", \ + "[M] has pushed down [src]!") else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to punch [src]!", \ - "[M] has attempted to punch [src]!", null, COMBAT_MESSAGE_RANGE) - - if ("disarm") - if (!lying) - if (prob(5)) - Unconscious(40) + if (prob(50)) + dropItemToGround(get_active_held_item()) playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - log_combat(M, src, "pushed") - visible_message("[M] has pushed down [src]!", \ - "[M] has pushed down [src]!") + visible_message("[M] has disarmed [src]!", \ + "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) else - if (prob(50)) - dropItemToGround(get_active_held_item()) - playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - visible_message("[M] has disarmed [src]!", \ - "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to disarm [src]!",\ - "[M] has attempted to disarm [src]!", null, COMBAT_MESSAGE_RANGE) - - + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to disarm [src]!",\ + "[M] has attempted to disarm [src]!", null, COMBAT_MESSAGE_RANGE) /mob/living/carbon/alien/humanoid/do_attack_animation(atom/A, visual_effect_icon, obj/item/used_item, no_effect) if(!no_effect && !visual_effect_icon) diff --git a/code/modules/mob/living/carbon/alien/larva/larva.dm b/code/modules/mob/living/carbon/alien/larva/larva.dm index e1e079cbae..8e1e5aab8d 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva.dm @@ -14,10 +14,9 @@ var/max_grown = 100 var/time_of_birth - rotate_on_lying = 0 + rotate_on_lying = FALSE bodyparts = list(/obj/item/bodypart/chest/larva, /obj/item/bodypart/head/larva) - //This is fine right now, if we're adding organ specific damage this needs to be updated /mob/living/carbon/alien/larva/Initialize() diff --git a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm index 69c1be707d..7dabcf5abf 100644 --- a/code/modules/mob/living/carbon/alien/larva/larva_defense.dm +++ b/code/modules/mob/living/carbon/alien/larva/larva_defense.dm @@ -1,26 +1,33 @@ /mob/living/carbon/alien/larva/attack_hand(mob/living/carbon/human/M) - if(..()) - var/damage = rand(1, 9) - if (prob(90)) - playsound(loc, "punch", 25, 1, -1) - log_combat(M, src, "attacked") - visible_message("[M] has kicked [src]!", \ - "[M] has kicked [src]!", null, COMBAT_MESSAGE_RANGE) - if ((stat != DEAD) && (damage > 4.9)) - Unconscious(rand(100,200)) + . = ..() + if(. || M.a_intent == INTENT_HELP || M.a_intent == INTENT_GRAB) + return + var/damage = rand(1, 9) + if (prob(90)) + playsound(loc, "punch", 25, 1, -1) + log_combat(M, src, "attacked") + visible_message("[M] has kicked [src]!", \ + "[M] has kicked [src]!", null, COMBAT_MESSAGE_RANGE) + if ((stat != DEAD) && (damage > 4.9)) + Unconscious(rand(100,200)) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - apply_damage(damage, BRUTE, affecting) - else - playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to kick [src]!", \ - "[M] has attempted to kick [src]!", null, COMBAT_MESSAGE_RANGE) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + apply_damage(damage, BRUTE, affecting) + else + playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to kick [src]!", \ + "[M] has attempted to kick [src]!", null, COMBAT_MESSAGE_RANGE) -/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/mob/living/carbon/alien/larva/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) - ..(user, 1) + . = ..(user, TRUE) + if(.) + return + playsound(loc, "punch", 25, 1, -1) + visible_message("[user] has pummeled [src]!", \ + "[user] has pummeled [src]!", null, COMBAT_MESSAGE_RANGE) adjustBruteLoss(5 + rand(1,9)) new /datum/forced_movement(src, get_step_away(user,src, 30), 1) return 1 diff --git a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm index 0bfd23cbff..c08fe4f582 100644 --- a/code/modules/mob/living/carbon/alien/special/alien_embryo.dm +++ b/code/modules/mob/living/carbon/alien/special/alien_embryo.dm @@ -103,15 +103,17 @@ new_xeno.notransform = 0 new_xeno.invisibility = 0 + var/mob/living/carbon/old_owner = owner if(kill_on_sucess) //ITS TOO LATE new_xeno.visible_message("[new_xeno] bursts out of [owner]!", "You exit [owner], your previous host.", "You hear organic matter ripping and tearing!") owner.apply_damage(rand(100,300),BRUTE,zone,FALSE) //Random high damage to torso so health sensors don't metagame. - owner.spill_organs(TRUE,FALSE,TRUE) //Lets still make the death gruesome and impossible to just simply defib someone. + var/obj/item/bodypart/B = owner.get_bodypart(zone) + B.drop_organs(owner) //Lets still make the death gruesome and impossible to just simply defib someone. owner.death(FALSE) //Just in case some freak occurance occurs where you somehow survive all your organs being removed from you and the 100-300 brute damage. else //When it is removed via surgery at a late stage, rather than forced. new_xeno.visible_message("[new_xeno] wriggles out of [owner]!", "You exit [owner], your previous host.") owner.adjustBruteLoss(40) - owner.cut_overlay(overlay) + old_owner.cut_overlay(overlay) qdel(src) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 52cf82a06a..102bc6fc3d 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -1,990 +1,991 @@ -/mob/living/carbon - blood_volume = BLOOD_VOLUME_NORMAL - -/mob/living/carbon/Initialize() - . = ..() - create_reagents(1000) - update_body_parts() //to update the carbon's new bodyparts appearance - GLOB.carbon_list += src - blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) - -/mob/living/carbon/Destroy() - //This must be done first, so the mob ghosts correctly before DNA etc is nulled - . = ..() - - QDEL_LIST(internal_organs) - QDEL_LIST(stomach_contents) - QDEL_LIST(bodyparts) - QDEL_LIST(implants) - remove_from_all_data_huds() - QDEL_NULL(dna) - GLOB.carbon_list -= src - -/mob/living/carbon/initialize_footstep() - AddComponent(/datum/component/footstep, 0.6, 2) - -/mob/living/carbon/relaymove(mob/user, direction) - if(user in src.stomach_contents) - if(prob(40)) - if(prob(25)) - audible_message("You hear something rumbling inside [src]'s stomach...", \ - "You hear something rumbling.", 4,\ - "Something is rumbling inside your stomach!") - var/obj/item/I = user.get_active_held_item() - if(I && I.force) - var/d = rand(round(I.force / 4), I.force) - var/obj/item/bodypart/BP = get_bodypart(BODY_ZONE_CHEST) - if(BP.receive_damage(d, 0)) - update_damage_overlays() - visible_message("[user] attacks [src]'s stomach wall with the [I.name]!", \ - "[user] attacks your stomach wall with the [I.name]!") - playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) - - if(prob(src.getBruteLoss() - 50)) - for(var/atom/movable/A in stomach_contents) - A.forceMove(drop_location()) - stomach_contents.Remove(A) - src.gib() - - -/mob/living/carbon/swap_hand(held_index) - if(!held_index) - held_index = (active_hand_index % held_items.len)+1 - - var/obj/item/item_in_hand = src.get_active_held_item() - if(item_in_hand) //this segment checks if the item in your hand is twohanded. - var/obj/item/twohanded/TH = item_in_hand - if(istype(TH)) - if(TH.wielded == 1) - to_chat(usr, "Your other hand is too busy holding [TH]") - return - var/oindex = active_hand_index - active_hand_index = held_index - if(hud_used) - var/obj/screen/inventory/hand/H - H = hud_used.hand_slots["[oindex]"] - if(H) - H.update_icon() - H = hud_used.hand_slots["[held_index]"] - if(H) - H.update_icon() - - -/mob/living/carbon/activate_hand(selhand) //l/r OR 1-held_items.len - if(!selhand) - selhand = (active_hand_index % held_items.len)+1 - - if(istext(selhand)) - selhand = lowertext(selhand) - if(selhand == "right" || selhand == "r") - selhand = 2 - if(selhand == "left" || selhand == "l") - selhand = 1 - - if(selhand != active_hand_index) - swap_hand(selhand) - else - mode() // Activate held item - -/mob/living/carbon/attackby(obj/item/I, mob/user, params) - if(lying && surgeries.len) - if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)) - for(var/datum/surgery/S in surgeries) - if(S.next_step(user,user.a_intent)) - return 1 - return ..() - -/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum) - . = ..() - var/hurt = TRUE - if(istype(throwingdatum, /datum/thrownthing)) - var/datum/thrownthing/D = throwingdatum - if(iscyborg(D.thrower)) - var/mob/living/silicon/robot/R = D.thrower - if(!R.emagged) - hurt = FALSE - if(hit_atom.density && isturf(hit_atom)) - if(hurt) - Knockdown(20) - take_bodypart_damage(10) - if(iscarbon(hit_atom) && hit_atom != src) - var/mob/living/carbon/victim = hit_atom - if(victim.movement_type & FLYING) - return - if(hurt) - victim.take_bodypart_damage(10) - take_bodypart_damage(10) - victim.Knockdown(20) - Knockdown(20) - visible_message("[src] crashes into [victim], knocking them both over!",\ - "You violently crash into [victim]!") - playsound(src,'sound/weapons/punch1.ogg',50,1) - - -//Throwing stuff -/mob/living/carbon/proc/toggle_throw_mode() - if(stat) - return - if(in_throw_mode) - throw_mode_off() - else - throw_mode_on() - - -/mob/living/carbon/proc/throw_mode_off() - in_throw_mode = 0 - if(client && hud_used) - hud_used.throw_icon.icon_state = "act_throw_off" - - -/mob/living/carbon/proc/throw_mode_on() - in_throw_mode = 1 - if(client && hud_used) - hud_used.throw_icon.icon_state = "act_throw_on" - -/mob/proc/throw_item(atom/target) - SEND_SIGNAL(src, COMSIG_MOB_THROW, target) - return - -/mob/living/carbon/throw_item(atom/target) - throw_mode_off() - if(!target || !isturf(loc)) - return - if(istype(target, /obj/screen)) - return - - //CIT CHANGES - makes it impossible to throw while in stamina softcrit - if(getStaminaLoss() >= STAMINA_SOFTCRIT) - to_chat(src, "You're too exhausted.") - return - //END OF CIT CHANGES - - var/obj/item/I = src.get_active_held_item() - - var/atom/movable/thrown_thing - var/mob/living/throwable_mob - - if(istype(I, /obj/item/clothing/head/mob_holder)) - var/obj/item/clothing/head/mob_holder/holder = I - if(holder.held_mob) - throwable_mob = holder.held_mob - holder.release() - - if(!I || throwable_mob) - if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) - throwable_mob = pulling - - if(throwable_mob && !throwable_mob.buckled) - thrown_thing = throwable_mob - if(pulling) - stop_pulling() - if(HAS_TRAIT(src, TRAIT_PACIFISM)) - to_chat(src, "You gently let go of [throwable_mob].") - return - - adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring - var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors - var/turf/end_T = get_turf(target) - if(start_T && end_T) - log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") - - else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) - thrown_thing = I - dropItemToGround(I) - - if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce) - to_chat(src, "You set [I] down gently on the ground.") - return - - adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so. - - if(thrown_thing) - visible_message("[src] has thrown [thrown_thing].") - src.log_message("has thrown [thrown_thing]", LOG_ATTACK) - do_attack_animation(target, no_effect = 1) - playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) - newtonian_move(get_dir(target, src)) - thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src) - - - -/mob/living/carbon/restrained(ignore_grab) - . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) - -/mob/living/carbon/proc/canBeHandcuffed() - return 0 - - -/mob/living/carbon/show_inv(mob/user) - user.set_machine(src) - var/dat = {" -
    - [name] -
    -
    Head: [(head && !(head.item_flags & ABSTRACT)) ? head : "Nothing"] -
    Mask: [(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Nothing"] -
    Neck: [(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Nothing"]"} - - for(var/i in 1 to held_items.len) - var/obj/item/I = get_item_for_held_index(i) - dat += "
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Nothing"]" - - dat += "
    Back: [back ? back : "Nothing"]" - - if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank)) - dat += "
    [internal ? "Disable Internals" : "Set Internals"]" - - if(handcuffed) - dat += "
    Handcuffed" - if(legcuffed) - dat += "
    Legcuffed" - - dat += {" -
    -
    Close - "} - user << browse(dat, "window=mob[REF(src)];size=325x500") - onclose(user, "mob[REF(src)]") - -/mob/living/carbon/Topic(href, href_list) - ..() - //strip panel - if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) - if(href_list["internal"]) - var/slot = text2num(href_list["internal"]) - var/obj/item/ITEM = get_item_by_slot(slot) - if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) - visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \ - "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].") - if(do_mob(usr, src, POCKET_STRIP_DELAY)) - if(internal) - internal = null - update_internals_hud_icon(0) - else if(ITEM && istype(ITEM, /obj/item/tank)) - if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE)) - internal = ITEM - update_internals_hud_icon(1) - - visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \ - "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].") - - -/mob/living/carbon/fall(forced) - loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing - -/mob/living/carbon/is_muzzled() - return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) - -/mob/living/carbon/hallucinating() - if(hallucination) - return TRUE - else - return FALSE - -/mob/living/carbon/resist_buckle() - if(restrained()) - changeNext_move(CLICK_CD_BREAKOUT) - last_special = world.time + CLICK_CD_BREAKOUT - var/buckle_cd = 600 - if(handcuffed) - var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) - buckle_cd = O.breakouttime - visible_message("[src] attempts to unbuckle [p_them()]self!", \ - "You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") - if(do_after(src, buckle_cd, 0, target = src)) - if(!buckled) - return - buckled.user_unbuckle_mob(src,src) - else - if(src && buckled) - to_chat(src, "You fail to unbuckle yourself!") - else - buckled.user_unbuckle_mob(src,src) - -/mob/living/carbon/resist_fire() - fire_stacks -= 5 - Knockdown(60, TRUE, TRUE) - spin(32,2) - visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \ - "You stop, drop, and roll!") - sleep(30) - if(fire_stacks <= 0) - visible_message("[src] has successfully extinguished [p_them()]self!", \ - "You extinguish yourself.") - ExtinguishMob() - return - -/mob/living/carbon/resist_restraints() - var/obj/item/I = null - var/type = 0 - if(handcuffed) - I = handcuffed - type = 1 - else if(legcuffed) - I = legcuffed - type = 2 - if(I) - if(type == 1) - changeNext_move(CLICK_CD_BREAKOUT) - last_special = world.time + CLICK_CD_BREAKOUT - if(type == 2) - changeNext_move(CLICK_CD_RANGE) - last_special = world.time + CLICK_CD_RANGE - cuff_resist(I) - - -/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) - if(I.item_flags & BEING_REMOVED) - to_chat(src, "You're already attempting to remove [I]!") - return - I.item_flags |= BEING_REMOVED - breakouttime = I.breakouttime - if(!cuff_break) - visible_message("[src] attempts to remove [I]!") - to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") - if(do_after(src, breakouttime, 0, target = src)) - clear_cuffs(I, cuff_break) - else - to_chat(src, "You fail to remove [I]!") - - else if(cuff_break == FAST_CUFFBREAK) - breakouttime = 50 - visible_message("[src] is trying to break [I]!") - to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)") - if(do_after(src, breakouttime, 0, target = src)) - clear_cuffs(I, cuff_break) - else - to_chat(src, "You fail to break [I]!") - - else if(cuff_break == INSTANT_CUFFBREAK) - clear_cuffs(I, cuff_break) - I.item_flags &= ~BEING_REMOVED - -/mob/living/carbon/proc/uncuff() - if (handcuffed) - var/obj/item/W = handcuffed - handcuffed = null - if (buckled && buckled.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - W.plane = initial(W.plane) - changeNext_move(0) - if (legcuffed) - var/obj/item/W = legcuffed - legcuffed = null - update_inv_legcuffed() - if (client) - client.screen -= W - if (W) - W.forceMove(drop_location()) - W.dropped(src) - if (W) - W.layer = initial(W.layer) - W.plane = initial(W.plane) - changeNext_move(0) - -/mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break) - if(!I.loc || buckled) - return - visible_message("[src] manages to [cuff_break ? "break" : "remove"] [I]!") - to_chat(src, "You successfully [cuff_break ? "break" : "remove"] [I].") - - if(cuff_break) - . = !((I == handcuffed) || (I == legcuffed)) - qdel(I) - return - - else - if(I == handcuffed) - handcuffed.forceMove(drop_location()) - handcuffed.dropped(src) - handcuffed = null - if(buckled && buckled.buckle_requires_restraints) - buckled.unbuckle_mob(src) - update_handcuffed() - return - if(I == legcuffed) - legcuffed.forceMove(drop_location()) - legcuffed.dropped() - legcuffed = null - update_inv_legcuffed() - return - else - dropItemToGround(I) - return - return TRUE - -/mob/living/carbon/get_standard_pixel_y_offset(lying = 0) - if(lying) - return -6 - else - return initial(pixel_y) - -/mob/living/carbon/proc/accident(obj/item/I) - if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP)) - return - - //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 - - var/modifier = 0 - - if(HAS_TRAIT(src, TRAIT_CLUMSY)) - modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! - - //CIT CHANGES START HERE - else if(combatmode) - modifier += 50 - - if(modifier < 100) - dropItemToGround(I) - //END OF CIT CHANGES - - switch(rand(1,100)+modifier) //91-100=Nothing special happens - if(-INFINITY to 0) //attack yourself - I.attack(src,src) - if(1 to 30) //throw it at yourself - I.throw_impact(src) - if(31 to 60) //Throw object in facing direction - var/turf/target = get_turf(loc) - var/range = rand(2,I.throw_range) - for(var/i = 1; i < range; i++) - var/turf/new_turf = get_step(target, dir) - target = new_turf - if(new_turf.density) - break - I.throw_at(target,I.throw_range,I.throw_speed,src) - if(61 to 90) //throw it down to the floor - var/turf/target = get_turf(loc) - I.throw_at(target,I.throw_range,I.throw_speed,src) - -/mob/living/carbon/Stat() - ..() - if(statpanel("Status")) - var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) - if(vessel) - stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]") - if(locate(/obj/item/assembly/health) in src) - stat(null, "Health: [health]") - - add_abilities_to_panel() - -/mob/living/carbon/attack_ui(slot) - if(!has_hand_for_held_index(active_hand_index)) - return 0 - return ..() - -/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) - if(HAS_TRAIT(src, TRAIT_NOHUNGER)) - return 1 - - if(nutrition < 100 && !blood) - if(message) - visible_message("[src] dry heaves!", \ - "You try to throw up, but there's nothing in your stomach!") - if(stun) - Knockdown(200) - return 1 - - if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious - if(message) - visible_message("[src] throws up all over [p_them()]self!", \ - "You throw up all over yourself!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomitself) - distance = 0 - else - if(message) - visible_message("[src] throws up!", "You throw up!") - if(!isflyperson(src)) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit) - if(stun) - Stun(80) - - playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) - var/turf/T = get_turf(src) - if(!blood) - nutrition -= lost_nutrition - adjustToxLoss(-3) - for(var/i=0 to distance) - if(blood) - if(T) - add_splatter_floor(T) - if(stun) - adjustBruteLoss(3) - else if(src.reagents.has_reagent("blazaam")) - if(T) - T.add_vomit_floor(src, VOMIT_PURPLE) - else - if(T) - T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different - T = get_step(T, dir) - if (is_blocked_turf(T)) - break - return 1 - -/mob/living/carbon/proc/spew_organ(power = 5, amt = 1) - for(var/i in 1 to amt) - if(!internal_organs.len) - break //Guess we're out of organs! - var/obj/item/organ/guts = pick(internal_organs) - var/turf/T = get_turf(src) - guts.Remove(src) - guts.forceMove(T) - var/atom/throw_target = get_edge_target_turf(guts, dir) - guts.throw_at(throw_target, power, 4, src) - - -/mob/living/carbon/fully_replace_character_name(oldname,newname) - ..() - if(dna) - dna.real_name = real_name - -//Updates the mob's health from bodyparts and mob damage variables -/mob/living/carbon/updatehealth() - if(status_flags & GODMODE) - return - var/total_burn = 0 - var/total_brute = 0 - var/total_stamina = 0 - for(var/X in bodyparts) //hardcoded to streamline things a bit - var/obj/item/bodypart/BP = X - total_brute += (BP.brute_dam * BP.body_damage_coeff) - total_burn += (BP.burn_dam * BP.body_damage_coeff) - total_stamina += (BP.stamina_dam * BP.stam_damage_coeff) - health = round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION) - staminaloss = round(total_stamina, DAMAGE_PRECISION) - update_stat() - if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) - become_husk("burn") - med_hud_set_health() - if(stat == SOFT_CRIT) - add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN) - else - remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE) - -/mob/living/carbon/update_stamina() - var/stam = getStaminaLoss() - if(stam > DAMAGE_PRECISION) - var/total_health = (health - stam) - if(total_health <= crit_threshold && !stat) - if(!IsKnockdown()) - to_chat(src, "You're too exhausted to keep going...") - Knockdown(100) - update_health_hud() - -/mob/living/carbon/update_sight() - if(!client) - return - if(stat == DEAD) - sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = 8 - see_invisible = SEE_INVISIBLE_OBSERVER - return - - sight = initial(sight) - lighting_alpha = initial(lighting_alpha) - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(!E) - update_tint() - else - see_invisible = E.see_invisible - see_in_dark = E.see_in_dark - sight |= E.sight_flags - if(!isnull(E.lighting_alpha)) - lighting_alpha = E.lighting_alpha - if(HAS_TRAIT(src, TRAIT_NIGHT_VISION)) - lighting_alpha = min(LIGHTING_PLANE_ALPHA_NV_TRAIT, lighting_alpha) - see_in_dark = max(NIGHT_VISION_DARKSIGHT_RANGE, see_in_dark) - - if(client.eye && client.eye != src) - var/atom/A = client.eye - if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. - return - - if(glasses) - var/obj/item/clothing/glasses/G = glasses - sight |= G.vision_flags - see_in_dark = max(G.darkness_view, see_in_dark) - if(G.invis_override) - see_invisible = G.invis_override - else - see_invisible = min(G.invis_view, see_invisible) - if(!isnull(G.lighting_alpha)) - lighting_alpha = min(lighting_alpha, G.lighting_alpha) - if(dna) - for(var/X in dna.mutations) - var/datum/mutation/M = X - if(M.name == XRAY) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) - see_in_dark = max(see_in_dark, 8) - - if(see_override) - see_invisible = see_override - . = ..() - - -//to recalculate and update the mob's total tint from tinted equipment it's wearing. -/mob/living/carbon/proc/update_tint() - if(!GLOB.tinted_weldhelh) - return - tinttotal = get_total_tint() - if(tinttotal >= TINT_BLIND) - become_blind(EYES_COVERED) - else if(tinttotal >= TINT_DARKENED) - cure_blind(EYES_COVERED) - overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) - else - cure_blind(EYES_COVERED) - clear_fullscreen("tint", 0) - -/mob/living/carbon/proc/get_total_tint() - . = 0 - if(istype(head, /obj/item/clothing/head)) - var/obj/item/clothing/head/HT = head - . += HT.tint - if(wear_mask) - . += wear_mask.tint - - var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) - if(E) - . += E.tint - - else - . += INFINITY - -/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS,CHEST,GROIN,LEGS,FEET,ARMS,HEAD)) - var/list/tally = list() - for(var/obj/item/I in get_equipped_items()) - for(var/zone in target_zones) - if(I.body_parts_covered & zone) - tally["[zone]"] = max(1 - I.permeability_coefficient, target_zones["[zone]"]) - var/protection = 0 - for(var/key in tally) - protection += tally[key] - protection *= INVERSE(target_zones.len) - return protection - -//this handles hud updates -/mob/living/carbon/update_damage_hud() - - if(!client) - return - - if(health <= crit_threshold) - var/severity = 0 - switch(health) - if(-20 to -10) - severity = 1 - if(-30 to -20) - severity = 2 - if(-40 to -30) - severity = 3 - if(-50 to -40) - severity = 4 - if(-50 to -40) - severity = 5 - if(-60 to -50) - severity = 6 - if(-70 to -60) - severity = 7 - if(-90 to -70) - severity = 8 - if(-95 to -90) - severity = 9 - if(-INFINITY to -95) - severity = 10 - if(!InFullCritical()) - var/visionseverity = 4 - switch(health) - if(-8 to -4) - visionseverity = 5 - if(-12 to -8) - visionseverity = 6 - if(-16 to -12) - visionseverity = 7 - if(-20 to -16) - visionseverity = 8 - if(-24 to -20) - visionseverity = 9 - if(-INFINITY to -24) - visionseverity = 10 - overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity) - else - clear_fullscreen("critvision") - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) - else - clear_fullscreen("crit") - clear_fullscreen("critvision") - - //Oxygen damage overlay - var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 - if(windedup) - var/severity = 0 - switch(windedup) - if(10 to 20) - severity = 1 - if(20 to 25) - severity = 2 - if(25 to 30) - severity = 3 - if(30 to 35) - severity = 4 - if(35 to 40) - severity = 5 - if(40 to 45) - severity = 6 - if(45 to INFINITY) - severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) - else - clear_fullscreen("oxy") - - //Fire and Brute damage overlay (BSSR) - var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp - if(hurtdamage) - var/severity = 0 - switch(hurtdamage) - if(5 to 15) - severity = 1 - if(15 to 30) - severity = 2 - if(30 to 45) - severity = 3 - if(45 to 70) - severity = 4 - if(70 to 85) - severity = 5 - if(85 to INFINITY) - severity = 6 - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) - else - clear_fullscreen("brute") - -/mob/living/carbon/update_health_hud(shown_health_amount) - if(!client || !hud_used) - return - if(hud_used.healths) - if(stat != DEAD) - . = 1 - if(!shown_health_amount) - shown_health_amount = health - if(shown_health_amount >= maxHealth) - hud_used.healths.icon_state = "health0" - else if(shown_health_amount > maxHealth*0.8) - hud_used.healths.icon_state = "health1" - else if(shown_health_amount > maxHealth*0.6) - hud_used.healths.icon_state = "health2" - else if(shown_health_amount > maxHealth*0.4) - hud_used.healths.icon_state = "health3" - else if(shown_health_amount > maxHealth*0.2) - hud_used.healths.icon_state = "health4" - else if(shown_health_amount > 0) - hud_used.healths.icon_state = "health5" - else - hud_used.healths.icon_state = "health6" - else - hud_used.healths.icon_state = "health7" - -/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0) - if(hud_used && hud_used.internals) - hud_used.internals.icon_state = "internal[internal_state]" - -/mob/living/carbon/update_stat() - if(status_flags & GODMODE) - return - if(stat != DEAD) - if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) - death() - return - if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) - stat = UNCONSCIOUS - blind_eyes(1) - if(combatmode) - toggle_combat_mode(TRUE, TRUE) - else - if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) - stat = SOFT_CRIT - if(combatmode) - toggle_combat_mode(TRUE, TRUE) - else - stat = CONSCIOUS - adjust_blindness(-1) - update_canmove() - update_damage_hud() - update_health_hud() - med_hud_set_status() - -//called when we get cuffed/uncuffed -/mob/living/carbon/proc/update_handcuffed() - if(handcuffed) - drop_all_held_items() - stop_pulling() - throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) - if(handcuffed.demoralize_criminals) - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) - else - clear_alert("handcuffed") - SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "handcuffed") - update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. - update_inv_handcuffed() - update_hud_handcuffed() - -/mob/living/carbon/fully_heal(admin_revive = FALSE) - if(reagents) - reagents.clear_reagents() - var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) - if(B) - B.brain_death = FALSE - for(var/thing in diseases) - var/datum/disease/D = thing - if(D.severity != DISEASE_SEVERITY_POSITIVE) - D.cure(FALSE) - if(admin_revive) - regenerate_limbs() - regenerate_organs() - handcuffed = initial(handcuffed) - for(var/obj/item/restraints/R in contents) //actually remove cuffs from inventory - qdel(R) - update_handcuffed() - if(reagents) - reagents.addiction_list = list() - cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) - ..() - // heal ears after healing traits, since ears check TRAIT_DEAF trait - // when healing. - restoreEars() - -/mob/living/carbon/can_be_revived() - . = ..() - if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling))) - return 0 - -/mob/living/carbon/harvest(mob/living/user) - if(QDELETED(src)) - return - var/organs_amt = 0 - for(var/X in internal_organs) - var/obj/item/organ/O = X - if(prob(50)) - organs_amt++ - O.Remove(src) - O.forceMove(drop_location()) - if(organs_amt) - to_chat(user, "You retrieve some of [src]\'s internal organs!") - -/mob/living/carbon/ExtinguishMob() - for(var/X in get_equipped_items()) - var/obj/item/I = X - I.acid_level = 0 //washes off the acid on our clothes - I.extinguish() //extinguishes our clothes - ..() - -/mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning") - var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) - new_fire_overlay.appearance_flags = RESET_COLOR - overlays_standing[FIRE_LAYER] = new_fire_overlay - apply_overlay(FIRE_LAYER) - -/mob/living/carbon/fakefireextinguish() - remove_overlay(FIRE_LAYER) - - -/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130) - C.visible_message("[src] is attempting to devour [C]!", \ - "[src] is attempting to devour you!") - if(!do_mob(src, C, devour_time)) - return - if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == INTENT_GRAB) - C.visible_message("[src] devours [C]!", \ - "[src] devours you!") - C.forceMove(src) - stomach_contents.Add(C) - log_combat(src, C, "devoured") - -/mob/living/carbon/proc/create_bodyparts() - var/l_arm_index_next = -1 - var/r_arm_index_next = 0 - for(var/X in bodyparts) - var/obj/item/bodypart/O = new X() - O.owner = src - bodyparts.Remove(X) - bodyparts.Add(O) - if(O.body_part == ARM_LEFT) - l_arm_index_next += 2 - O.held_index = l_arm_index_next //1, 3, 5, 7... - hand_bodyparts += O - else if(O.body_part == ARM_RIGHT) - r_arm_index_next += 2 - O.held_index = r_arm_index_next //2, 4, 6, 8... - hand_bodyparts += O - -/mob/living/carbon/do_after_coefficent() - . = ..() - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes. - if(mood) - switch(mood.sanity) //Alters do_after delay based on how sane you are - if(SANITY_INSANE to SANITY_DISTURBED) - . *= 1.25 - if(SANITY_NEUTRAL to SANITY_GREAT) - . *= 0.90 - - -/mob/living/carbon/proc/create_internal_organs() - for(var/X in internal_organs) - var/obj/item/organ/I = X - I.Insert(src) - -/mob/living/carbon/proc/update_disabled_bodyparts() - for(var/B in bodyparts) - var/obj/item/bodypart/BP = B - BP.update_disabled() - -/mob/living/carbon/vv_get_dropdown() - . = ..() - . += "---" - .["Make AI"] = "?_src_=vars;[HrefToken()];makeai=[REF(src)]" - .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]" - .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]" - .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]" - .["Give martial arts"] = "?_src_=vars;[HrefToken()];givemartialart=[REF(src)]" - .["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]" - .["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]" - -/mob/living/carbon/can_resist() - return bodyparts.len > 2 && ..() - -/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case - if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) - return FALSE - if(hallucinating()) - return TRUE - if(IsSleeping()) - return TRUE - if(HAS_TRAIT(src, TRAIT_DUMB)) - return TRUE - var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) - if(mood) - if(mood.sanity < SANITY_UNSTABLE) - return TRUE - -/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) - if(combatmode) - toggle_combat_mode(TRUE, TRUE) - return ..() - -/mob/living/carbon/can_see_reagents() - . = ..() - if(.) //No need to run through all of this if it's already true. - return - if(isclothing(head)) - var/obj/item/clothing/H = head - if(H.clothing_flags & SCAN_REAGENTS) - return TRUE - if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) - return TRUE +/mob/living/carbon + blood_volume = BLOOD_VOLUME_NORMAL + +/mob/living/carbon/Initialize() + . = ..() + create_reagents(1000) + update_body_parts() //to update the carbon's new bodyparts appearance + GLOB.carbon_list += src + blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) + +/mob/living/carbon/Destroy() + //This must be done first, so the mob ghosts correctly before DNA etc is nulled + . = ..() + + QDEL_LIST(internal_organs) + QDEL_LIST(stomach_contents) + QDEL_LIST(bodyparts) + QDEL_LIST(implants) + remove_from_all_data_huds() + QDEL_NULL(dna) + GLOB.carbon_list -= src + +/mob/living/carbon/initialize_footstep() + AddComponent(/datum/component/footstep, 0.6, 2) + +/mob/living/carbon/relaymove(mob/user, direction) + if(user in src.stomach_contents) + if(prob(40)) + if(prob(25)) + audible_message("You hear something rumbling inside [src]'s stomach...", \ + "You hear something rumbling.", 4,\ + "Something is rumbling inside your stomach!") + var/obj/item/I = user.get_active_held_item() + if(I && I.force) + var/d = rand(round(I.force / 4), I.force) + var/obj/item/bodypart/BP = get_bodypart(BODY_ZONE_CHEST) + if(BP.receive_damage(d, 0)) + update_damage_overlays() + visible_message("[user] attacks [src]'s stomach wall with the [I.name]!", \ + "[user] attacks your stomach wall with the [I.name]!") + playsound(user.loc, 'sound/effects/attackblob.ogg', 50, 1) + + if(prob(src.getBruteLoss() - 50)) + for(var/atom/movable/A in stomach_contents) + A.forceMove(drop_location()) + stomach_contents.Remove(A) + src.gib() + + +/mob/living/carbon/swap_hand(held_index) + if(!held_index) + held_index = (active_hand_index % held_items.len)+1 + + var/obj/item/item_in_hand = src.get_active_held_item() + if(item_in_hand) //this segment checks if the item in your hand is twohanded. + var/obj/item/twohanded/TH = item_in_hand + if(istype(TH)) + if(TH.wielded == 1) + to_chat(usr, "Your other hand is too busy holding [TH]") + return + var/oindex = active_hand_index + active_hand_index = held_index + if(hud_used) + var/obj/screen/inventory/hand/H + H = hud_used.hand_slots["[oindex]"] + if(H) + H.update_icon() + H = hud_used.hand_slots["[held_index]"] + if(H) + H.update_icon() + + +/mob/living/carbon/activate_hand(selhand) //l/r OR 1-held_items.len + if(!selhand) + selhand = (active_hand_index % held_items.len)+1 + + if(istext(selhand)) + selhand = lowertext(selhand) + if(selhand == "right" || selhand == "r") + selhand = 2 + if(selhand == "left" || selhand == "l") + selhand = 1 + + if(selhand != active_hand_index) + swap_hand(selhand) + else + mode() // Activate held item + +/mob/living/carbon/attackby(obj/item/I, mob/user, params) + if(lying && surgeries.len) + if(user != src && (user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM)) + for(var/datum/surgery/S in surgeries) + if(S.next_step(user,user.a_intent)) + return 1 + return ..() + +/mob/living/carbon/throw_impact(atom/hit_atom, throwingdatum) + . = ..() + var/hurt = TRUE + if(istype(throwingdatum, /datum/thrownthing)) + var/datum/thrownthing/D = throwingdatum + if(iscyborg(D.thrower)) + var/mob/living/silicon/robot/R = D.thrower + if(!R.emagged) + hurt = FALSE + if(hit_atom.density && isturf(hit_atom)) + if(hurt) + Knockdown(20) + take_bodypart_damage(10) + if(iscarbon(hit_atom) && hit_atom != src) + var/mob/living/carbon/victim = hit_atom + if(victim.movement_type & FLYING) + return + if(hurt) + victim.take_bodypart_damage(10) + take_bodypart_damage(10) + victim.Knockdown(20) + Knockdown(20) + visible_message("[src] crashes into [victim], knocking them both over!",\ + "You violently crash into [victim]!") + playsound(src,'sound/weapons/punch1.ogg',50,1) + + +//Throwing stuff +/mob/living/carbon/proc/toggle_throw_mode() + if(stat) + return + if(in_throw_mode) + throw_mode_off() + else + throw_mode_on() + + +/mob/living/carbon/proc/throw_mode_off() + in_throw_mode = 0 + if(client && hud_used) + hud_used.throw_icon.icon_state = "act_throw_off" + + +/mob/living/carbon/proc/throw_mode_on() + in_throw_mode = 1 + if(client && hud_used) + hud_used.throw_icon.icon_state = "act_throw_on" + +/mob/proc/throw_item(atom/target) + SEND_SIGNAL(src, COMSIG_MOB_THROW, target) + return + +/mob/living/carbon/throw_item(atom/target) + throw_mode_off() + if(!target || !isturf(loc)) + return + if(istype(target, /obj/screen)) + return + + //CIT CHANGES - makes it impossible to throw while in stamina softcrit + if(getStaminaLoss() >= STAMINA_SOFTCRIT) + to_chat(src, "You're too exhausted.") + return + var/random_turn = a_intent == INTENT_HARM + //END OF CIT CHANGES + + var/obj/item/I = src.get_active_held_item() + + var/atom/movable/thrown_thing + var/mob/living/throwable_mob + + if(istype(I, /obj/item/clothing/head/mob_holder)) + var/obj/item/clothing/head/mob_holder/holder = I + if(holder.held_mob) + throwable_mob = holder.held_mob + holder.release() + + if(!I || throwable_mob) + if(!throwable_mob && pulling && isliving(pulling) && grab_state >= GRAB_AGGRESSIVE) + throwable_mob = pulling + + if(throwable_mob && !throwable_mob.buckled) + thrown_thing = throwable_mob + if(pulling) + stop_pulling() + if(HAS_TRAIT(src, TRAIT_PACIFISM)) + to_chat(src, "You gently let go of [throwable_mob].") + return + + adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring + var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors + var/turf/end_T = get_turf(target) + if(start_T && end_T) + log_combat(src, throwable_mob, "thrown", addition="grab from tile in [AREACOORD(start_T)] towards tile at [AREACOORD(end_T)]") + + else if(!CHECK_BITFIELD(I.item_flags, ABSTRACT) && !HAS_TRAIT(I, TRAIT_NODROP)) + thrown_thing = I + dropItemToGround(I) + + if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce) + to_chat(src, "You set [I] down gently on the ground.") + return + + adjustStaminaLossBuffered(I.getweight()*2)//CIT CHANGE - throwing items shall be more tiring than swinging em. Doubly so. + + if(thrown_thing) + visible_message("[src] has thrown [thrown_thing].") + src.log_message("has thrown [thrown_thing]", LOG_ATTACK) + do_attack_animation(target, no_effect = 1) + playsound(loc, 'sound/weapons/punchmiss.ogg', 50, 1, -1) + newtonian_move(get_dir(target, src)) + thrown_thing.throw_at(target, thrown_thing.throw_range, thrown_thing.throw_speed, src, null, null, null, random_turn) + + + +/mob/living/carbon/restrained(ignore_grab) + . = (handcuffed || (!ignore_grab && pulledby && pulledby.grab_state >= GRAB_AGGRESSIVE)) + +/mob/living/carbon/proc/canBeHandcuffed() + return 0 + + +/mob/living/carbon/show_inv(mob/user) + user.set_machine(src) + var/dat = {" +
    + [name] +
    +
    Head: [(head && !(head.item_flags & ABSTRACT)) ? head : "Nothing"] +
    Mask: [(wear_mask && !(wear_mask.item_flags & ABSTRACT)) ? wear_mask : "Nothing"] +
    Neck: [(wear_neck && !(wear_neck.item_flags & ABSTRACT)) ? wear_neck : "Nothing"]"} + + for(var/i in 1 to held_items.len) + var/obj/item/I = get_item_for_held_index(i) + dat += "
    [get_held_index_name(i)]:[(I && !(I.item_flags & ABSTRACT)) ? I : "Nothing"]" + + dat += "
    Back: [back ? back : "Nothing"]" + + if(istype(wear_mask, /obj/item/clothing/mask) && istype(back, /obj/item/tank)) + dat += "
    [internal ? "Disable Internals" : "Set Internals"]" + + if(handcuffed) + dat += "
    Handcuffed" + if(legcuffed) + dat += "
    Legcuffed" + + dat += {" +
    +
    Close + "} + user << browse(dat, "window=mob[REF(src)];size=325x500") + onclose(user, "mob[REF(src)]") + +/mob/living/carbon/Topic(href, href_list) + ..() + //strip panel + if(usr.canUseTopic(src, BE_CLOSE, NO_DEXTERY)) + if(href_list["internal"]) + var/slot = text2num(href_list["internal"]) + var/obj/item/ITEM = get_item_by_slot(slot) + if(ITEM && istype(ITEM, /obj/item/tank) && wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) + visible_message("[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].", \ + "[usr] tries to [internal ? "close" : "open"] the valve on [src]'s [ITEM.name].") + if(do_mob(usr, src, POCKET_STRIP_DELAY)) + if(internal) + internal = null + update_internals_hud_icon(0) + else if(ITEM && istype(ITEM, /obj/item/tank)) + if((wear_mask && (wear_mask.clothing_flags & ALLOWINTERNALS)) || getorganslot(ORGAN_SLOT_BREATHING_TUBE)) + internal = ITEM + update_internals_hud_icon(1) + + visible_message("[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].", \ + "[usr] [internal ? "opens" : "closes"] the valve on [src]'s [ITEM.name].") + + +/mob/living/carbon/fall(forced) + loc.handle_fall(src, forced)//it's loc so it doesn't call the mob's handle_fall which does nothing + +/mob/living/carbon/is_muzzled() + return(istype(src.wear_mask, /obj/item/clothing/mask/muzzle)) + +/mob/living/carbon/hallucinating() + if(hallucination) + return TRUE + else + return FALSE + +/mob/living/carbon/resist_buckle() + if(restrained()) + changeNext_move(CLICK_CD_BREAKOUT) + last_special = world.time + CLICK_CD_BREAKOUT + var/buckle_cd = 600 + if(handcuffed) + var/obj/item/restraints/O = src.get_item_by_slot(SLOT_HANDCUFFED) + buckle_cd = O.breakouttime + visible_message("[src] attempts to unbuckle [p_them()]self!", \ + "You attempt to unbuckle yourself... (This will take around [round(buckle_cd/600,1)] minute\s, and you need to stay still.)") + if(do_after(src, buckle_cd, 0, target = src)) + if(!buckled) + return + buckled.user_unbuckle_mob(src,src) + else + if(src && buckled) + to_chat(src, "You fail to unbuckle yourself!") + else + buckled.user_unbuckle_mob(src,src) + +/mob/living/carbon/resist_fire() + fire_stacks -= 5 + Knockdown(60, TRUE, TRUE) + spin(32,2) + visible_message("[src] rolls on the floor, trying to put [p_them()]self out!", \ + "You stop, drop, and roll!") + sleep(30) + if(fire_stacks <= 0) + visible_message("[src] has successfully extinguished [p_them()]self!", \ + "You extinguish yourself.") + ExtinguishMob() + return + +/mob/living/carbon/resist_restraints() + var/obj/item/I = null + var/type = 0 + if(handcuffed) + I = handcuffed + type = 1 + else if(legcuffed) + I = legcuffed + type = 2 + if(I) + if(type == 1) + changeNext_move(CLICK_CD_BREAKOUT) + last_special = world.time + CLICK_CD_BREAKOUT + if(type == 2) + changeNext_move(CLICK_CD_RANGE) + last_special = world.time + CLICK_CD_RANGE + cuff_resist(I) + + +/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0) + if(I.item_flags & BEING_REMOVED) + to_chat(src, "You're already attempting to remove [I]!") + return + I.item_flags |= BEING_REMOVED + breakouttime = I.breakouttime + if(!cuff_break) + visible_message("[src] attempts to remove [I]!") + to_chat(src, "You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)") + if(do_after(src, breakouttime, 0, target = src)) + clear_cuffs(I, cuff_break) + else + to_chat(src, "You fail to remove [I]!") + + else if(cuff_break == FAST_CUFFBREAK) + breakouttime = 50 + visible_message("[src] is trying to break [I]!") + to_chat(src, "You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)") + if(do_after(src, breakouttime, 0, target = src)) + clear_cuffs(I, cuff_break) + else + to_chat(src, "You fail to break [I]!") + + else if(cuff_break == INSTANT_CUFFBREAK) + clear_cuffs(I, cuff_break) + I.item_flags &= ~BEING_REMOVED + +/mob/living/carbon/proc/uncuff() + if (handcuffed) + var/obj/item/W = handcuffed + handcuffed = null + if (buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob(src) + update_handcuffed() + if (client) + client.screen -= W + if (W) + W.forceMove(drop_location()) + W.dropped(src) + if (W) + W.layer = initial(W.layer) + W.plane = initial(W.plane) + changeNext_move(0) + if (legcuffed) + var/obj/item/W = legcuffed + legcuffed = null + update_inv_legcuffed() + if (client) + client.screen -= W + if (W) + W.forceMove(drop_location()) + W.dropped(src) + if (W) + W.layer = initial(W.layer) + W.plane = initial(W.plane) + changeNext_move(0) + +/mob/living/carbon/proc/clear_cuffs(obj/item/I, cuff_break) + if(!I.loc || buckled) + return + visible_message("[src] manages to [cuff_break ? "break" : "remove"] [I]!") + to_chat(src, "You successfully [cuff_break ? "break" : "remove"] [I].") + + if(cuff_break) + . = !((I == handcuffed) || (I == legcuffed)) + qdel(I) + return + + else + if(I == handcuffed) + handcuffed.forceMove(drop_location()) + handcuffed.dropped(src) + handcuffed = null + if(buckled && buckled.buckle_requires_restraints) + buckled.unbuckle_mob(src) + update_handcuffed() + return + if(I == legcuffed) + legcuffed.forceMove(drop_location()) + legcuffed.dropped() + legcuffed = null + update_inv_legcuffed() + return + else + dropItemToGround(I) + return + return TRUE + +/mob/living/carbon/get_standard_pixel_y_offset(lying = 0) + if(lying) + return -6 + else + return initial(pixel_y) + +/mob/living/carbon/proc/accident(obj/item/I) + if(!I || (I.item_flags & ABSTRACT) || HAS_TRAIT(I, TRAIT_NODROP)) + return + + //dropItemToGround(I) CIT CHANGE - makes it so the item doesn't drop if the modifier rolls above 100 + + var/modifier = 0 + + if(HAS_TRAIT(src, TRAIT_CLUMSY)) + modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! + + //CIT CHANGES START HERE + else if(combatmode) + modifier += 50 + + if(modifier < 100) + dropItemToGround(I) + //END OF CIT CHANGES + + switch(rand(1,100)+modifier) //91-100=Nothing special happens + if(-INFINITY to 0) //attack yourself + I.attack(src,src) + if(1 to 30) //throw it at yourself + I.throw_impact(src) + if(31 to 60) //Throw object in facing direction + var/turf/target = get_turf(loc) + var/range = rand(2,I.throw_range) + for(var/i = 1; i < range; i++) + var/turf/new_turf = get_step(target, dir) + target = new_turf + if(new_turf.density) + break + I.throw_at(target,I.throw_range,I.throw_speed,src) + if(61 to 90) //throw it down to the floor + var/turf/target = get_turf(loc) + I.throw_at(target,I.throw_range,I.throw_speed,src) + +/mob/living/carbon/Stat() + ..() + if(statpanel("Status")) + var/obj/item/organ/alien/plasmavessel/vessel = getorgan(/obj/item/organ/alien/plasmavessel) + if(vessel) + stat(null, "Plasma Stored: [vessel.storedPlasma]/[vessel.max_plasma]") + if(locate(/obj/item/assembly/health) in src) + stat(null, "Health: [health]") + + add_abilities_to_panel() + +/mob/living/carbon/attack_ui(slot) + if(!has_hand_for_held_index(active_hand_index)) + return 0 + return ..() + +/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE) + if(HAS_TRAIT(src, TRAIT_NOHUNGER)) + return 1 + + if(nutrition < 100 && !blood) + if(message) + visible_message("[src] dry heaves!", \ + "You try to throw up, but there's nothing in your stomach!") + if(stun) + Knockdown(200) + return 1 + + if(is_mouth_covered()) //make this add a blood/vomit overlay later it'll be hilarious + if(message) + visible_message("[src] throws up all over [p_them()]self!", \ + "You throw up all over yourself!") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomitself) + distance = 0 + else + if(message) + visible_message("[src] throws up!", "You throw up!") + if(!isflyperson(src)) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "vomit", /datum/mood_event/vomit) + if(stun) + Stun(80) + + playsound(get_turf(src), 'sound/effects/splat.ogg', 50, 1) + var/turf/T = get_turf(src) + if(!blood) + nutrition -= lost_nutrition + adjustToxLoss(-3) + for(var/i=0 to distance) + if(blood) + if(T) + add_splatter_floor(T) + if(stun) + adjustBruteLoss(3) + else if(src.reagents.has_reagent("blazaam")) + if(T) + T.add_vomit_floor(src, VOMIT_PURPLE) + else + if(T) + T.add_vomit_floor(src, VOMIT_TOXIC)//toxic barf looks different + T = get_step(T, dir) + if (is_blocked_turf(T)) + break + return 1 + +/mob/living/carbon/proc/spew_organ(power = 5, amt = 1) + for(var/i in 1 to amt) + if(!internal_organs.len) + break //Guess we're out of organs! + var/obj/item/organ/guts = pick(internal_organs) + var/turf/T = get_turf(src) + guts.Remove(src) + guts.forceMove(T) + var/atom/throw_target = get_edge_target_turf(guts, dir) + guts.throw_at(throw_target, power, 4, src) + + +/mob/living/carbon/fully_replace_character_name(oldname,newname) + ..() + if(dna) + dna.real_name = real_name + +//Updates the mob's health from bodyparts and mob damage variables +/mob/living/carbon/updatehealth() + if(status_flags & GODMODE) + return + var/total_burn = 0 + var/total_brute = 0 + var/total_stamina = 0 + for(var/X in bodyparts) //hardcoded to streamline things a bit + var/obj/item/bodypart/BP = X + total_brute += (BP.brute_dam * BP.body_damage_coeff) + total_burn += (BP.burn_dam * BP.body_damage_coeff) + total_stamina += (BP.stamina_dam * BP.stam_damage_coeff) + health = round(maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute, DAMAGE_PRECISION) + staminaloss = round(total_stamina, DAMAGE_PRECISION) + update_stat() + if(((maxHealth - total_burn) < HEALTH_THRESHOLD_DEAD) && stat == DEAD ) + become_husk("burn") + med_hud_set_health() + if(stat == SOFT_CRIT) + add_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE, multiplicative_slowdown = SOFTCRIT_ADD_SLOWDOWN) + else + remove_movespeed_modifier(MOVESPEED_ID_CARBON_SOFTCRIT, TRUE) + +/mob/living/carbon/update_stamina() + var/stam = getStaminaLoss() + if(stam > DAMAGE_PRECISION) + var/total_health = (health - stam) + if(total_health <= crit_threshold && !stat) + if(!IsKnockdown()) + to_chat(src, "You're too exhausted to keep going...") + Knockdown(100) + update_health_hud() + +/mob/living/carbon/update_sight() + if(!client) + return + if(stat == DEAD) + sight = (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = 8 + see_invisible = SEE_INVISIBLE_OBSERVER + return + + sight = initial(sight) + lighting_alpha = initial(lighting_alpha) + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + if(!E) + update_tint() + else + see_invisible = E.see_invisible + see_in_dark = E.see_in_dark + sight |= E.sight_flags + if(!isnull(E.lighting_alpha)) + lighting_alpha = E.lighting_alpha + if(HAS_TRAIT(src, TRAIT_NIGHT_VISION)) + lighting_alpha = min(LIGHTING_PLANE_ALPHA_NV_TRAIT, lighting_alpha) + see_in_dark = max(NIGHT_VISION_DARKSIGHT_RANGE, see_in_dark) + + if(client.eye && client.eye != src) + var/atom/A = client.eye + if(A.update_remote_sight(src)) //returns 1 if we override all other sight updates. + return + + if(glasses) + var/obj/item/clothing/glasses/G = glasses + sight |= G.vision_flags + see_in_dark = max(G.darkness_view, see_in_dark) + if(G.invis_override) + see_invisible = G.invis_override + else + see_invisible = min(G.invis_view, see_invisible) + if(!isnull(G.lighting_alpha)) + lighting_alpha = min(lighting_alpha, G.lighting_alpha) + if(dna) + for(var/X in dna.mutations) + var/datum/mutation/M = X + if(M.name == XRAY) + sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + see_in_dark = max(see_in_dark, 8) + + if(see_override) + see_invisible = see_override + . = ..() + + +//to recalculate and update the mob's total tint from tinted equipment it's wearing. +/mob/living/carbon/proc/update_tint() + if(!GLOB.tinted_weldhelh) + return + tinttotal = get_total_tint() + if(tinttotal >= TINT_BLIND) + become_blind(EYES_COVERED) + else if(tinttotal >= TINT_DARKENED) + cure_blind(EYES_COVERED) + overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) + else + cure_blind(EYES_COVERED) + clear_fullscreen("tint", 0) + +/mob/living/carbon/proc/get_total_tint() + . = 0 + if(istype(head, /obj/item/clothing/head)) + var/obj/item/clothing/head/HT = head + . += HT.tint + if(wear_mask) + . += wear_mask.tint + + var/obj/item/organ/eyes/E = getorganslot(ORGAN_SLOT_EYES) + if(E) + . += E.tint + + else + . += INFINITY + +/mob/living/carbon/get_permeability_protection(list/target_zones = list(HANDS,CHEST,GROIN,LEGS,FEET,ARMS,HEAD)) + var/list/tally = list() + for(var/obj/item/I in get_equipped_items()) + for(var/zone in target_zones) + if(I.body_parts_covered & zone) + tally["[zone]"] = max(1 - I.permeability_coefficient, target_zones["[zone]"]) + var/protection = 0 + for(var/key in tally) + protection += tally[key] + protection *= INVERSE(target_zones.len) + return protection + +//this handles hud updates +/mob/living/carbon/update_damage_hud() + + if(!client) + return + + if(health <= crit_threshold) + var/severity = 0 + switch(health) + if(-20 to -10) + severity = 1 + if(-30 to -20) + severity = 2 + if(-40 to -30) + severity = 3 + if(-50 to -40) + severity = 4 + if(-50 to -40) + severity = 5 + if(-60 to -50) + severity = 6 + if(-70 to -60) + severity = 7 + if(-90 to -70) + severity = 8 + if(-95 to -90) + severity = 9 + if(-INFINITY to -95) + severity = 10 + if(!InFullCritical()) + var/visionseverity = 4 + switch(health) + if(-8 to -4) + visionseverity = 5 + if(-12 to -8) + visionseverity = 6 + if(-16 to -12) + visionseverity = 7 + if(-20 to -16) + visionseverity = 8 + if(-24 to -20) + visionseverity = 9 + if(-INFINITY to -24) + visionseverity = 10 + overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity) + else + clear_fullscreen("critvision") + overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + else + clear_fullscreen("crit") + clear_fullscreen("critvision") + + //Oxygen damage overlay + var/windedup = getOxyLoss() + getStaminaLoss() * 0.2 + if(windedup) + var/severity = 0 + switch(windedup) + if(10 to 20) + severity = 1 + if(20 to 25) + severity = 2 + if(25 to 30) + severity = 3 + if(30 to 35) + severity = 4 + if(35 to 40) + severity = 5 + if(40 to 45) + severity = 6 + if(45 to INFINITY) + severity = 7 + overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + else + clear_fullscreen("oxy") + + //Fire and Brute damage overlay (BSSR) + var/hurtdamage = getBruteLoss() + getFireLoss() + damageoverlaytemp + if(hurtdamage) + var/severity = 0 + switch(hurtdamage) + if(5 to 15) + severity = 1 + if(15 to 30) + severity = 2 + if(30 to 45) + severity = 3 + if(45 to 70) + severity = 4 + if(70 to 85) + severity = 5 + if(85 to INFINITY) + severity = 6 + overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + else + clear_fullscreen("brute") + +/mob/living/carbon/update_health_hud(shown_health_amount) + if(!client || !hud_used) + return + if(hud_used.healths) + if(stat != DEAD) + . = 1 + if(!shown_health_amount) + shown_health_amount = health + if(shown_health_amount >= maxHealth) + hud_used.healths.icon_state = "health0" + else if(shown_health_amount > maxHealth*0.8) + hud_used.healths.icon_state = "health1" + else if(shown_health_amount > maxHealth*0.6) + hud_used.healths.icon_state = "health2" + else if(shown_health_amount > maxHealth*0.4) + hud_used.healths.icon_state = "health3" + else if(shown_health_amount > maxHealth*0.2) + hud_used.healths.icon_state = "health4" + else if(shown_health_amount > 0) + hud_used.healths.icon_state = "health5" + else + hud_used.healths.icon_state = "health6" + else + hud_used.healths.icon_state = "health7" + +/mob/living/carbon/proc/update_internals_hud_icon(internal_state = 0) + if(hud_used && hud_used.internals) + hud_used.internals.icon_state = "internal[internal_state]" + +/mob/living/carbon/update_stat() + if(status_flags & GODMODE) + return + if(stat != DEAD) + if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH)) + death() + return + if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT))) + stat = UNCONSCIOUS + blind_eyes(1) + if(combatmode) + toggle_combat_mode(TRUE, TRUE) + else + if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT)) + stat = SOFT_CRIT + if(combatmode) + toggle_combat_mode(TRUE, TRUE) + else + stat = CONSCIOUS + adjust_blindness(-1) + update_canmove() + update_damage_hud() + update_health_hud() + med_hud_set_status() + +//called when we get cuffed/uncuffed +/mob/living/carbon/proc/update_handcuffed() + if(handcuffed) + drop_all_held_items() + stop_pulling() + throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + if(handcuffed.demoralize_criminals) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "handcuffed", /datum/mood_event/handcuffed) + else + clear_alert("handcuffed") + SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "handcuffed") + update_action_buttons_icon() //some of our action buttons might be unusable when we're handcuffed. + update_inv_handcuffed() + update_hud_handcuffed() + +/mob/living/carbon/fully_heal(admin_revive = FALSE) + if(reagents) + reagents.clear_reagents() + var/obj/item/organ/brain/B = getorgan(/obj/item/organ/brain) + if(B) + B.brain_death = FALSE + for(var/thing in diseases) + var/datum/disease/D = thing + if(D.severity != DISEASE_SEVERITY_POSITIVE) + D.cure(FALSE) + if(admin_revive) + regenerate_limbs() + regenerate_organs() + handcuffed = initial(handcuffed) + for(var/obj/item/restraints/R in contents) //actually remove cuffs from inventory + qdel(R) + update_handcuffed() + if(reagents) + reagents.addiction_list = list() + cure_all_traumas(TRAUMA_RESILIENCE_MAGIC) + ..() + // heal ears after healing traits, since ears check TRAIT_DEAF trait + // when healing. + restoreEars() + +/mob/living/carbon/can_be_revived() + . = ..() + if(!getorgan(/obj/item/organ/brain) && (!mind || !mind.has_antag_datum(/datum/antagonist/changeling))) + return 0 + +/mob/living/carbon/harvest(mob/living/user) + if(QDELETED(src)) + return + var/organs_amt = 0 + for(var/X in internal_organs) + var/obj/item/organ/O = X + if(prob(50)) + organs_amt++ + O.Remove(src) + O.forceMove(drop_location()) + if(organs_amt) + to_chat(user, "You retrieve some of [src]\'s internal organs!") + +/mob/living/carbon/ExtinguishMob() + for(var/X in get_equipped_items()) + var/obj/item/I = X + I.acid_level = 0 //washes off the acid on our clothes + I.extinguish() //extinguishes our clothes + ..() + +/mob/living/carbon/fakefire(var/fire_icon = "Generic_mob_burning") + var/mutable_appearance/new_fire_overlay = mutable_appearance('icons/mob/OnFire.dmi', fire_icon, -FIRE_LAYER) + new_fire_overlay.appearance_flags = RESET_COLOR + overlays_standing[FIRE_LAYER] = new_fire_overlay + apply_overlay(FIRE_LAYER) + +/mob/living/carbon/fakefireextinguish() + remove_overlay(FIRE_LAYER) + + +/mob/living/carbon/proc/devour_mob(mob/living/carbon/C, devour_time = 130) + C.visible_message("[src] is attempting to devour [C]!", \ + "[src] is attempting to devour you!") + if(!do_mob(src, C, devour_time)) + return + if(pulling && pulling == C && grab_state >= GRAB_AGGRESSIVE && a_intent == INTENT_GRAB) + C.visible_message("[src] devours [C]!", \ + "[src] devours you!") + C.forceMove(src) + stomach_contents.Add(C) + log_combat(src, C, "devoured") + +/mob/living/carbon/proc/create_bodyparts() + var/l_arm_index_next = -1 + var/r_arm_index_next = 0 + for(var/X in bodyparts) + var/obj/item/bodypart/O = new X() + O.owner = src + bodyparts.Remove(X) + bodyparts.Add(O) + if(O.body_part == ARM_LEFT) + l_arm_index_next += 2 + O.held_index = l_arm_index_next //1, 3, 5, 7... + hand_bodyparts += O + else if(O.body_part == ARM_RIGHT) + r_arm_index_next += 2 + O.held_index = r_arm_index_next //2, 4, 6, 8... + hand_bodyparts += O + +/mob/living/carbon/do_after_coefficent() + . = ..() + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) //Currently, only carbons or higher use mood, move this once that changes. + if(mood) + switch(mood.sanity) //Alters do_after delay based on how sane you are + if(SANITY_INSANE to SANITY_DISTURBED) + . *= 1.25 + if(SANITY_NEUTRAL to SANITY_GREAT) + . *= 0.90 + + +/mob/living/carbon/proc/create_internal_organs() + for(var/X in internal_organs) + var/obj/item/organ/I = X + I.Insert(src) + +/mob/living/carbon/proc/update_disabled_bodyparts() + for(var/B in bodyparts) + var/obj/item/bodypart/BP = B + BP.update_disabled() + +/mob/living/carbon/vv_get_dropdown() + . = ..() + . += "---" + .["Make AI"] = "?_src_=vars;[HrefToken()];makeai=[REF(src)]" + .["Modify bodypart"] = "?_src_=vars;[HrefToken()];editbodypart=[REF(src)]" + .["Modify organs"] = "?_src_=vars;[HrefToken()];editorgans=[REF(src)]" + .["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]" + .["Give martial arts"] = "?_src_=vars;[HrefToken()];givemartialart=[REF(src)]" + .["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]" + .["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]" + +/mob/living/carbon/can_resist() + return bodyparts.len > 2 && ..() + +/mob/living/carbon/proc/hypnosis_vulnerable()//unused atm, but added in case + if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) + return FALSE + if(hallucinating()) + return TRUE + if(IsSleeping()) + return TRUE + if(HAS_TRAIT(src, TRAIT_DUMB)) + return TRUE + var/datum/component/mood/mood = src.GetComponent(/datum/component/mood) + if(mood) + if(mood.sanity < SANITY_UNSTABLE) + return TRUE + +/mob/living/carbon/transfer_ckey(mob/new_mob, send_signal = TRUE) + if(combatmode) + toggle_combat_mode(TRUE, TRUE) + return ..() + +/mob/living/carbon/can_see_reagents() + . = ..() + if(.) //No need to run through all of this if it's already true. + return + if(isclothing(head)) + var/obj/item/clothing/H = head + if(H.clothing_flags & SCAN_REAGENTS) + return TRUE + if(isclothing(wear_mask) && (wear_mask.clothing_flags & SCAN_REAGENTS)) + return TRUE diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 06575aa802..ba40ae8e5f 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -48,41 +48,42 @@ if(affecting && affecting.dismemberable && affecting.get_damage() >= (affecting.max_damage - P.dismemberment)) affecting.dismember(P.damtype) -/mob/living/carbon/proc/can_catch_item(skip_throw_mode_check) - . = FALSE - if(mind) - if(mind.martial_art && mind.martial_art.dodge_chance == 100) - return TRUE - if(!skip_throw_mode_check && !in_throw_mode) +/mob/living/carbon/catch_item(obj/item/I, skip_throw_mode_check = FALSE) + . = ..() + if(!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) && !skip_throw_mode_check && !in_throw_mode) return - if(get_active_held_item()) + if(get_active_held_item() || restrained()) return - if(restrained()) - return - return TRUE - -/mob/living/carbon/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) - if(!skipcatch) //ugly, but easy - if(can_catch_item()) - if(istype(AM, /obj/item)) - var/obj/item/I = AM - if (mind) - if (mind.martial_art && mind.martial_art.dodge_chance == 100) //autocatch for rising bass - if (get_active_held_item()) - visible_message("[I] falls to the ground as [src] chops it out of the air!") - return 1 - if(!in_throw_mode) - throw_mode_on() - if(isturf(I.loc)) - I.attack_hand(src) - if(get_active_held_item() == I) //if our attack_hand() picks up the item... - visible_message("[src] catches [I]!") //catch that sucker! - throw_mode_off() - return 1 - ..() + I.attack_hand(src) + if(get_active_held_item() == I) //if our attack_hand() picks up the item... + visible_message("[src] catches [I]!") //catch that sucker! + throw_mode_off() + return TRUE +/mob/living/carbon/embed_item(obj/item/I) + throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + var/obj/item/bodypart/L = pick(bodyparts) + L.embedded_objects |= I + I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! + I.forceMove(src) + L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) + visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) /mob/living/carbon/attacked_by(obj/item/I, mob/living/user) + //CIT CHANGES START HERE - combatmode and resting checks + var/totitemdamage = I.force + if(iscarbon(user)) + var/mob/living/carbon/tempcarb = user + if(!tempcarb.combatmode) + totitemdamage *= 0.5 + if(user.resting) + totitemdamage *= 0.5 + if(!combatmode) + totitemdamage *= 1.5 + //CIT CHANGES END HERE + if(user != src && check_shields(I, totitemdamage, "the [I.name]", MELEE_ATTACK, I.armour_penetration)) + return FALSE var/obj/item/bodypart/affecting if(user == src) affecting = get_bodypart(check_zone(user.zone_selected)) //we're self-mutilating! yay! @@ -93,17 +94,6 @@ SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, affecting.name) if(I.force) - //CIT CHANGES START HERE - combatmode and resting checks - var/totitemdamage = I.force - if(iscarbon(user)) - var/mob/living/carbon/tempcarb = user - if(!tempcarb.combatmode) - totitemdamage *= 0.5 - if(user.resting) - totitemdamage *= 0.5 - if(!combatmode) - totitemdamage *= 1.5 - //CIT CHANGES END HERE apply_damage(totitemdamage, I.damtype, affecting) //CIT CHANGE - replaces I.force with totitemdamage if(I.damtype == BRUTE && affecting.status == BODYPART_ORGANIC) var/basebloodychance = affecting.brute_dam + totitemdamage @@ -137,7 +127,9 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/carbon/attack_hand(mob/living/carbon/human/user) - + . = ..() + if(.) //was the attack blocked? + return for(var/thing in diseases) var/datum/disease/D = thing if(D.spread_flags & DISEASE_SPREAD_CONTACT_SKIN) @@ -152,8 +144,7 @@ if(user.a_intent == INTENT_HELP || user.a_intent == INTENT_DISARM) for(var/datum/surgery/S in surgeries) if(S.next_step(user, user.a_intent)) - return 1 - return 0 + return TRUE /mob/living/carbon/attack_paw(mob/living/carbon/monkey/M) @@ -173,7 +164,8 @@ help_shake_act(M) return 0 - if(..()) //successful monkey bite. + . = ..() + if(.) //successful monkey bite. for(var/thing in M.diseases) var/datum/disease/D = thing ForceContractDisease(D) @@ -181,26 +173,27 @@ /mob/living/carbon/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - if(M.powerlevel > 0) - var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 - if(prob(stunprob)) - M.powerlevel -= 3 - if(M.powerlevel < 0) - M.powerlevel = 0 + . = ..() + if(!.) + return + if(M.powerlevel > 0) + var/stunprob = M.powerlevel * 7 + 10 // 17 at level 1, 80 at level 10 + if(prob(stunprob)) + M.powerlevel -= 3 + if(M.powerlevel < 0) + M.powerlevel = 0 - visible_message("The [M.name] has shocked [src]!", \ - "The [M.name] has shocked [src]!") + visible_message("The [M.name] has shocked [src]!", \ + "The [M.name] has shocked [src]!") - do_sparks(5, TRUE, src) - var/power = M.powerlevel + rand(0,3) - Knockdown(power*20) - if(stuttering < power) - stuttering = power - if (prob(stunprob) && M.powerlevel >= 8) - adjustFireLoss(M.powerlevel * rand(6,10)) - updatehealth() - return 1 + do_sparks(5, TRUE, src) + var/power = M.powerlevel + rand(0,3) + Knockdown(power*20) + if(stuttering < power) + stuttering = power + if (prob(stunprob) && M.powerlevel >= 8) + adjustFireLoss(M.powerlevel * rand(6,10)) + updatehealth() /mob/living/carbon/proc/dismembering_strike(mob/living/attacker, dam_zone) if(!attacker.limb_destroyer) @@ -332,12 +325,12 @@ else return - + else if(check_zone(M.zone_selected) == "r_arm" || check_zone(M.zone_selected) == "l_arm") M.visible_message( \ "[M] shakes [src]'s hand.", \ "You shake [src]'s hand.", ) - + else M.visible_message("[M] hugs [src] to make [p_them()] feel better!", \ "You hug [src] to make [p_them()] feel better!") diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm index a1184613fe..9629dc3484 100644 --- a/code/modules/mob/living/carbon/carbon_defines.dm +++ b/code/modules/mob/living/carbon/carbon_defines.dm @@ -40,7 +40,7 @@ var/gib_type = /obj/effect/decal/cleanable/blood/gibs - var/rotate_on_lying = 1 + rotate_on_lying = TRUE var/tinttotal = 0 // Total level of visualy impairing items diff --git a/code/modules/mob/living/carbon/emote.dm b/code/modules/mob/living/carbon/emote.dm index 345279df29..559c2ebcdd 100644 --- a/code/modules/mob/living/carbon/emote.dm +++ b/code/modules/mob/living/carbon/emote.dm @@ -22,6 +22,7 @@ muzzle_ignore = TRUE restraint_check = TRUE emote_type = EMOTE_AUDIBLE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/carbon/clap/run_emote(mob/living/user, params) . = ..() diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 310ab6beeb..3a6f0e6724 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -308,7 +308,7 @@ var/obj/item/organ/vocal_cords/Vc = user.getorganslot(ORGAN_SLOT_VOICE) if(Vc) if(istype(Vc, /obj/item/organ/vocal_cords/velvet)) - if(client?.prefs.lewdchem) + if(client.prefs.cit_toggles & HYPNO) msg += "You feel your chords resonate looking at them.\n" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 93f33c3a3d..9cbb5b1a0a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -67,66 +67,36 @@ P.setAngle(rand(0, 360))//SHING return FALSE - if(!(P.original == src && P.firer == src)) //can't block or reflect when shooting yourself - if(P.is_reflectable) - if(check_reflect(def_zone)) // Checks if you've passed a reflection% check - visible_message("The [P.name] gets reflected by [src]!", \ - "The [P.name] gets reflected by [src]!") - // Find a turf near or on the original location to bounce to - if(P.starting) - var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) - var/turf/curloc = get_turf(src) + return ..() - // redirect the projectile - P.original = locate(new_x, new_y, P.z) - P.starting = curloc - P.firer = src - P.yo = new_y - curloc.y - P.xo = new_x - curloc.x - var/new_angle_s = P.Angle + rand(120,240) - while(new_angle_s > 180) // Translate to regular projectile degrees - new_angle_s -= 360 - P.setAngle(new_angle_s) +/mob/living/carbon/human/check_reflect(def_zone) + if(wear_suit?.IsReflect(def_zone)) + return TRUE + return ..() - return -1 // complete projectile permutation - - if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) - P.on_hit(src, 100, def_zone) - return 2 - - return (..(P , def_zone)) - -/mob/living/carbon/human/proc/check_reflect(def_zone) //Reflection checks for anything in your l_hand, r_hand, or wear_suit based on the reflection chance of the object - if(wear_suit) - if(wear_suit.IsReflect(def_zone) == 1) - return 1 - for(var/obj/item/I in held_items) - if(I.IsReflect(def_zone) == 1) - return 1 - return 0 - -/mob/living/carbon/human/proc/check_shields(atom/AM, var/damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) +/mob/living/carbon/human/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) + . = ..() + if(.) + return var/block_chance_modifier = round(damage / -3) - - for(var/obj/item/I in held_items) - if(!istype(I, /obj/item/clothing)) - var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example - if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return 1 if(wear_suit) var/final_block_chance = wear_suit.block_chance - (CLAMP((armour_penetration-wear_suit.armour_penetration)/2,0,100)) + block_chance_modifier if(wear_suit.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return 1 + return TRUE if(w_uniform) var/final_block_chance = w_uniform.block_chance - (CLAMP((armour_penetration-w_uniform.armour_penetration)/2,0,100)) + block_chance_modifier if(w_uniform.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return 1 + return TRUE if(wear_neck) var/final_block_chance = wear_neck.block_chance - (CLAMP((armour_penetration-wear_neck.armour_penetration)/2,0,100)) + block_chance_modifier if(wear_neck.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) - return 1 - return 0 + return TRUE + return FALSE + +/mob/living/carbon/human/can_embed(obj/item/I) + if(I.get_sharpness() || is_pointed(I) || is_type_in_typecache(I, GLOB.can_embed_types)) + return TRUE + return FALSE /mob/living/carbon/human/proc/check_block() if(mind) @@ -135,39 +105,7 @@ return FALSE /mob/living/carbon/human/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE) - if(dna && dna.species) - var/spec_return = dna.species.spec_hitby(AM, src) - if(spec_return) - return spec_return - var/obj/item/I - var/throwpower = 30 - if(istype(AM, /obj/item)) - I = AM - throwpower = I.throwforce - if(I.thrownby == src) //No throwing stuff at yourself to trigger hit reactions - return ..() - if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK)) - hitpush = FALSE - skipcatch = TRUE - blocked = TRUE - else if(I) - if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && !(mind.martial_art && mind.martial_art.dodge_chance == 100)) - if(can_embed(I)) - if(prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE)) - throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) - var/obj/item/bodypart/L = pick(bodyparts) - L.embedded_objects |= I - I.add_mob_blood(src)//it embedded itself in you, of course it's bloody! - I.forceMove(src) - L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier) - visible_message("[I] embeds itself in [src]'s [L.name]!","[I] embeds itself in your [L.name]!") - SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "embedded", /datum/mood_event/embedded) - hitpush = FALSE - skipcatch = TRUE //can't catch the now embedded item - if (mind) - if (mind.martial_art && mind.martial_art.dodge_chance == 100) - skipcatch = FALSE - return ..() + return dna?.species?.spec_hitby(AM, src) || ..() /mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0) if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (HAS_TRAIT(src, TRAIT_FAT)) && ismonkey(pulling)) @@ -201,12 +139,12 @@ return dna.species.spec_attacked_by(I, user, affecting, a_intent, src) -/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/mob/living/carbon/human/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) - var/hulk_verb = pick("smash","pummel") - if(check_shields(user, 15, "the [hulk_verb]ing")) + . = ..(user, TRUE) + if(.) return - ..(user, 1) + var/hulk_verb = pick("smash","pummel") playsound(loc, user.dna.species.attack_sound, 25, 1, -1) var/message = "[user] has [hulk_verb]ed [src]!" visible_message("[message]", \ @@ -215,7 +153,8 @@ return 1 /mob/living/carbon/human/attack_hand(mob/user) - if(..()) //to allow surgery to return properly. + . = ..() + if(.) //To allow surgery to return properly. return if(ishuman(user)) var/mob/living/carbon/human/H = user @@ -227,8 +166,7 @@ if(!affecting) affecting = get_bodypart(BODY_ZONE_CHEST) if(M.a_intent == INTENT_HELP) - ..() //shaking - return 0 + return ..() //shaking if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stunned instead. var/obj/item/I = get_active_held_item() @@ -249,78 +187,69 @@ if(can_inject(M, 1, affecting))//Thick suits can stop monkey bites. if(..()) //successful monkey bite, this handles disease contraction. var/damage = rand(1, 3) - if(check_shields(M, damage, "the [M.name]")) - return 0 - if(stat != DEAD) - apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) + apply_damage(damage, BRUTE, affecting, run_armor_check(affecting, "melee")) return 1 /mob/living/carbon/human/attack_alien(mob/living/carbon/alien/humanoid/M) - if(check_shields(M, 0, "the M.name")) - visible_message("[M] attempted to touch [src]!") - return 0 + . = ..() + if(!.) + return + if(M.a_intent == INTENT_HARM) + if (w_uniform) + w_uniform.add_fingerprint(M) + var/damage = prob(90) ? 20 : 0 + if(!damage) + playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) + visible_message("[M] has lunged at [src]!", \ + "[M] has lunged at [src]!") + return 0 + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor_block = run_armor_check(affecting, "melee", null, null,10) - if(..()) - if(M.a_intent == INTENT_HARM) - if (w_uniform) - w_uniform.add_fingerprint(M) - var/damage = prob(90) ? 20 : 0 - if(!damage) - playsound(loc, 'sound/weapons/slashmiss.ogg', 50, 1, -1) - visible_message("[M] has lunged at [src]!", \ - "[M] has lunged at [src]!") - return 0 - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee", null, null,10) + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + visible_message("[M] has slashed at [src]!", \ + "[M] has slashed at [src]!") + log_combat(M, src, "attacked") + if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful + return 1 + apply_damage(damage, BRUTE, affecting, armor_block) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - visible_message("[M] has slashed at [src]!", \ - "[M] has slashed at [src]!") - log_combat(M, src, "attacked") - if(!dismembering_strike(M, M.zone_selected)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting, armor_block) - - if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. - var/obj/item/I = get_active_held_item() - if(I && dropItemToGround(I)) - playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) - visible_message("[M] disarmed [src]!", \ - "[M] disarmed [src]!") + if(M.a_intent == INTENT_DISARM) //Always drop item in hand, if no item, get stun instead. + var/obj/item/I = get_active_held_item() + if(I && dropItemToGround(I)) + playsound(loc, 'sound/weapons/slash.ogg', 25, 1, -1) + visible_message("[M] disarmed [src]!", \ + "[M] disarmed [src]!") + else + playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + if(!lying) //CITADEL EDIT + Knockdown(100, TRUE, FALSE, 30, 25) else - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - if(!lying) //CITADEL EDIT - Knockdown(100, TRUE, FALSE, 30, 25) - else - Knockdown(100) - log_combat(M, src, "tackled") - visible_message("[M] has tackled down [src]!", \ - "[M] has tackled down [src]!") - + Knockdown(100) + log_combat(M, src, "tackled") + visible_message("[M] has tackled down [src]!", \ + "[M] has tackled down [src]!") /mob/living/carbon/human/attack_larva(mob/living/carbon/alien/larva/L) - - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(check_shields(L, damage, "the [L.name]")) - return 0 - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) + . = ..() + if(!.) //unsuccessful larva bite. + return + var/damage = rand(1, 3) + if(stat != DEAD) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor_block = run_armor_check(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block) /mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) . = ..() if(.) var/damage = rand(M.melee_damage_lower, M.melee_damage_upper) - if(check_shields(M, damage, "the [M.name]", MELEE_ATTACK, M.armour_penetration)) - return FALSE var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) if(!dam_zone) //Dismemberment successful return TRUE @@ -332,23 +261,22 @@ /mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 25) - if(M.is_adult) - damage = rand(10, 35) + . = ..() + if(!.) //unsuccessful slime attack + return + var/damage = rand(5, 25) + if(M.is_adult) + damage = rand(10, 35) - if(check_shields(M, damage, "the [M.name]")) - return 0 + var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(!dam_zone) //Dismemberment successful + return 1 - var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return 1 - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor_block = run_armor_check(affecting, "melee") - apply_damage(damage, BRUTE, affecting, armor_block) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor_block = run_armor_check(affecting, "melee") + apply_damage(damage, BRUTE, affecting, armor_block) /mob/living/carbon/human/mech_melee_attack(obj/mecha/M) if(M.occupant.a_intent == INTENT_HARM) @@ -405,7 +333,7 @@ switch (severity) if (1) if(bomb_armor) - b_loss = 500*bomb_armor + b_loss = (350*bomb_armor)+150 var/atom/throw_target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(throw_target, 200, 4) damage_clothes(400*bomb_armor, BRUTE, "bomb") @@ -652,7 +580,7 @@ if(mind) if((mind.assigned_role == "Station Engineer") || (mind.assigned_role == "Chief Engineer") ) gain = 100 - if(mind.assigned_role == "Clown") + if(HAS_TRAIT(mind, TRAIT_CLOWN_MENTALITY)) gain = rand(-300, 300) investigate_log("([key_name(src)]) has been consumed by the singularity.", INVESTIGATE_SINGULO) //Oh that's where the clown ended up! gib() diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 8bf6b4ad3a..2e069297b3 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -545,6 +545,20 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) //Underwear, Undershirts & Socks if(!(NO_UNDERWEAR in species_traits)) + + if(H.socks && H.get_num_legs(FALSE) >= 2) + if(H.hidden_socks) + H.socks = "Nude" + else + H.socks = H.saved_socks + var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] + if(S) + var/digilegs = ((DIGITIGRADE in species_traits) && S.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) + if(S.has_color) + MA.color = "#[H.socks_color]" + standing += MA + if(H.underwear) if(H.hidden_underwear) H.underwear = "Nude" @@ -552,8 +566,9 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.underwear = H.saved_underwear var/datum/sprite_accessory/underwear/bottom/B = GLOB.underwear_list[H.underwear] if(B) - var/mutable_appearance/MA = mutable_appearance(B.icon, B.icon_state, -BODY_LAYER) - if(UNDIE_COLORABLE(B)) + var/digilegs = ((DIGITIGRADE in species_traits) && B.has_digitigrade) ? "_d" : "" + var/mutable_appearance/MA = mutable_appearance(B.icon, "[B.icon_state][digilegs]", -BODY_LAYER) + if(B.has_color) MA.color = "#[H.undie_color]" standing += MA @@ -564,28 +579,16 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.undershirt = H.saved_undershirt var/datum/sprite_accessory/underwear/top/T = GLOB.undershirt_list[H.undershirt] if(T) + var/state = "[T.icon_state][((DIGITIGRADE in species_traits) && T.has_digitigrade) ? "_d" : ""]" var/mutable_appearance/MA if(H.dna.species.sexes && H.gender == FEMALE) - MA = wear_female_version(T.icon_state, T.icon, BODY_LAYER) + MA = wear_female_version(state, T.icon, BODY_LAYER) else - MA = mutable_appearance(T.icon, T.icon_state, -BODY_LAYER) - if(UNDIE_COLORABLE(T)) + MA = mutable_appearance(T.icon, state, -BODY_LAYER) + if(T.has_color) MA.color = "#[H.shirt_color]" standing += MA - if(H.socks && H.get_num_legs(FALSE) >= 2) - if(H.hidden_socks) - H.socks = "Nude" - else - H.socks = H.saved_socks - var/datum/sprite_accessory/underwear/socks/S = GLOB.socks_list[H.socks] - if(S) - var/digilegs = (DIGITIGRADE in species_traits) ? "_d" : "" - var/mutable_appearance/MA = mutable_appearance(S.icon, "[S.icon_state][digilegs]", -BODY_LAYER) - if(UNDIE_COLORABLE(S)) - MA.color = "#[H.socks_color]" - standing += MA - if(standing.len) H.overlays_standing[BODY_LAYER] = standing @@ -1589,20 +1592,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) user.adjustStaminaLossBuffered(3) return FALSE else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin)) + if(target.client?.prefs.cit_toggles & NO_ASS_SLAP) + to_chat(user,"A force stays your hand, preventing you from slapping \the [target]'s ass!") + return FALSE user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP) user.adjustStaminaLossBuffered(3) - if(HAS_TRAIT(target, TRAIT_ASSBLASTUSA)) - var/hit_zone = (user.held_index_to_dir(user.active_hand_index) == "l" ? "l_":"r_") + "arm" - user.adjustStaminaLoss(20, affected_zone = hit_zone) - user.visible_message(\ - "\The [user] slaps \the [target]'s ass, but their hand bounces off like they hit metal!",\ - "You slap [user == target ? "your" : "\the [target]'s"] ass, but feel an intense amount of pain as you realise their buns are harder than steel!",\ - "You hear a slap." - ) - playsound(target.loc, 'sound/weapons/tap.ogg', 50, 1, -1) - user.emote("scream") - return FALSE - playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1) user.visible_message(\ "\The [user] slaps \the [target]'s ass!",\ @@ -1691,11 +1685,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) attacker_style = M.mind.martial_art if(attacker_style?.pacifism_check && HAS_TRAIT(M, TRAIT_PACIFISM)) // most martial arts are quite harmful, alas. attacker_style = null - if((M != H) && M.a_intent != INTENT_HELP && H.check_shields(M, 0, M.name, attack_type = UNARMED_ATTACK)) - log_combat(M, H, "attempted to touch") - H.visible_message("[M] attempted to touch [H]!") - return 0 - SEND_SIGNAL(M, COMSIG_MOB_ATTACK_HAND, M, H, attacker_style) switch(M.a_intent) if("help") help(M, H, attacker_style) diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index ceadb28115..7744a65464 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -37,11 +37,16 @@ H.dna.features["caps"] = "Round" handle_mutant_bodyparts(H) H.faction |= "mushroom" - mush = new(null) - mush.teach(H) + mush = new() + mush.teach(H, TRUE) + RegisterSignal(C, COMSIG_MOB_ON_NEW_MIND, .proc/on_new_mind) + +/datum/species/mush/proc/on_new_mind(mob/owner) + mush.teach(owner, TRUE) //make_temporary TRUE as it shouldn't carry over to other mobs on mind transfer_to. /datum/species/mush/on_species_loss(mob/living/carbon/C) . = ..() + UnregisterSignal(C, COMSIG_MOB_ON_NEW_MIND) C.faction -= "mushroom" mush.remove(C) QDEL_NULL(mush) diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 3247c96632..52ae32b23c 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -51,11 +51,7 @@ . = ..() to_chat(C, "[info_text]") - C.real_name = "[pick(GLOB.nightmare_names)]" - C.name = C.real_name - if(C.mind) - C.mind.name = C.real_name - C.dna.real_name = C.real_name + C.fully_replace_character_name("[pick(GLOB.nightmare_names)]") /datum/species/shadow/nightmare/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H) var/turf/T = H.loc @@ -127,8 +123,8 @@ /obj/item/organ/heart/nightmare/Remove(mob/living/carbon/M, special = 0) respawn_progress = 0 if(blade && special != HEART_SPECIAL_SHADOWIFY) - QDEL_NULL(blade) M.visible_message("\The [blade] disintegrates!") + QDEL_NULL(blade) ..() /obj/item/organ/heart/nightmare/Stop() @@ -183,15 +179,21 @@ . = ..() if(!proximity) return - if(isopenturf(AM)) //So you can actually melee with it - return - if(isliving(AM)) + if(isopenturf(AM)) + var/turf/open/T = AM + if(T.light_range && !isspaceturf(T)) //no fairy grass or light tile can escape the fury of the darkness. + to_chat(user, "You scrape away [T] with your [name] and snuff out its lights.") + T.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + else if(isliving(AM)) var/mob/living/L = AM if(iscyborg(AM)) var/mob/living/silicon/robot/borg = AM - if(!borg.lamp_cooldown) + if(borg.lamp_intensity) borg.update_headlamp(TRUE, INFINITY) to_chat(borg, "Your headlamp is fried! You'll need a human to help replace it.") + for(var/obj/item/assembly/flash/cyborg/F in borg.held_items) + if(!F.crit_fail) + F.burn_out() else for(var/obj/item/O in AM) if(O.light_range && O.light_power) diff --git a/code/modules/mob/living/carbon/monkey/combat.dm b/code/modules/mob/living/carbon/monkey/combat.dm index 92ad87f6b5..56ef4fe24a 100644 --- a/code/modules/mob/living/carbon/monkey/combat.dm +++ b/code/modules/mob/living/carbon/monkey/combat.dm @@ -369,6 +369,23 @@ retaliate(L) return ..() +/mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) + if(M.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(M) + else if(M.a_intent == INTENT_DISARM && prob(MONKEY_RETALIATE_DISARM_PROB)) + retaliate(M) + return ..() + +/mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) + if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(L) + return ..() + +/mob/living/carbon/monkey/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + if(user.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) + retaliate(user) + return ..() + /mob/living/carbon/monkey/attack_paw(mob/living/L) if(L.a_intent == INTENT_HARM && prob(MONKEY_RETALIATE_HARM_PROB)) retaliate(L) diff --git a/code/modules/mob/living/carbon/monkey/monkey_defense.dm b/code/modules/mob/living/carbon/monkey/monkey_defense.dm index df90dd56fd..32e3d21ee2 100644 --- a/code/modules/mob/living/carbon/monkey/monkey_defense.dm +++ b/code/modules/mob/living/carbon/monkey/monkey_defense.dm @@ -6,37 +6,55 @@ ..() /mob/living/carbon/monkey/attack_paw(mob/living/M) - if(..()) //successful monkey bite. - var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(M.limb_destroyer) - dismembering_strike(M, affecting.body_zone) - if(stat != DEAD) - var/dmg = rand(1, 5) - apply_damage(dmg, BRUTE, affecting) + . = ..() + if(!.) //unsuccessful monkey bite. + return + var/dam_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + if(M.limb_destroyer) + dismembering_strike(M, affecting.body_zone) + var/dmg = rand(1, 5) + apply_damage(dmg, BRUTE, affecting) /mob/living/carbon/monkey/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. - var/damage = rand(1, 3) - if(stat != DEAD) - L.amount_grown = min(L.amount_grown + damage, L.max_grown) - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) + . = ..() + if(!.) //unsuccessful larva bite + return + var/damage = rand(1, 3) + if(stat != DEAD) + L.amount_grown = min(L.amount_grown + damage, L.max_grown) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(L.zone_selected)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + apply_damage(damage, BRUTE, affecting) + +/mob/living/carbon/monkey/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + . = ..(user, TRUE) + if(.) + return + var/hulk_verb = pick("smash","pummel") + playsound(loc, user.dna.species.attack_sound, 25, 1, -1) + var/message = "[user] has [hulk_verb]ed [src]!" + visible_message("[message]", \ + "[message]") + adjustBruteLoss(15) + return TRUE /mob/living/carbon/monkey/attack_hand(mob/living/carbon/human/M) - if(..()) //To allow surgery to return properly. + . = ..() + if(.) //To allow surgery to return properly. return - switch(M.a_intent) - if("help") + if(INTENT_HELP) help_shake_act(M) - if("grab") + if(INTENT_GRAB) grabbedby(M) - if("harm") + if(INTENT_HARM) + if(HAS_TRAIT(M, TRAIT_PACIFISM)) + to_chat(M, "You don't want to hurt [src]!") + return M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) if (prob(75)) visible_message("[M] has punched [name]!", \ @@ -60,7 +78,7 @@ playsound(loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1) visible_message("[M] has attempted to punch [name]!", \ "[M] has attempted to punch [name]!", null, COMBAT_MESSAGE_RANGE) - if("disarm") + if(INTENT_DISARM) if(!IsUnconscious()) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) if (prob(25)) @@ -74,50 +92,51 @@ visible_message("[M] has disarmed [src]!", "[M] has disarmed [src]!", null, COMBAT_MESSAGE_RANGE) /mob/living/carbon/monkey/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if (M.a_intent == INTENT_HARM) - if ((prob(95) && health > 0)) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - var/damage = rand(15, 30) - if (damage >= 25) - damage = rand(20, 40) - if(AmountUnconscious() < 300) - Unconscious(rand(200, 300)) - visible_message("[M] has wounded [name]!", \ - "[M] has wounded [name]!", null, COMBAT_MESSAGE_RANGE) - else - visible_message("[M] has slashed [name]!", \ - "[M] has slashed [name]!", null, COMBAT_MESSAGE_RANGE) - - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) - log_combat(M, src, "attacked") - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful - return 1 - apply_damage(damage, BRUTE, affecting) - + . = ..() + if(!.) // the attack was blocked or was help/grab intent + return + if (M.a_intent == INTENT_HARM) + if ((prob(95) && health > 0)) + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + var/damage = rand(15, 30) + if (damage >= 25) + damage = rand(20, 40) + if(AmountUnconscious() < 300) + Unconscious(rand(200, 300)) + visible_message("[M] has wounded [name]!", \ + "[M] has wounded [name]!", null, COMBAT_MESSAGE_RANGE) else - playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) - visible_message("[M] has attempted to lunge at [name]!", \ - "[M] has attempted to lunge at [name]!", null, COMBAT_MESSAGE_RANGE) + visible_message("[M] has slashed [name]!", \ + "[M] has slashed [name]!", null, COMBAT_MESSAGE_RANGE) - if (M.a_intent == INTENT_DISARM) - var/obj/item/I = null - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - if(prob(95)) - Knockdown(20) - visible_message("[M] has tackled down [name]!", \ - "[M] has tackled down [name]!", null, COMBAT_MESSAGE_RANGE) + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected)) + log_combat(M, src, "attacked") + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + if(!dismembering_strike(M, affecting.body_zone)) //Dismemberment successful + return 1 + apply_damage(damage, BRUTE, affecting) + + else + playsound(loc, 'sound/weapons/slashmiss.ogg', 25, 1, -1) + visible_message("[M] has attempted to lunge at [name]!", \ + "[M] has attempted to lunge at [name]!", null, COMBAT_MESSAGE_RANGE) + + else + var/obj/item/I = null + playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + if(prob(95)) + Knockdown(20) + visible_message("[M] has tackled down [name]!", \ + "[M] has tackled down [name]!", null, COMBAT_MESSAGE_RANGE) + else + I = get_active_held_item() + if(dropItemToGround(I)) + visible_message("[M] has disarmed [name]!", "[M] has disarmed [name]!", null, COMBAT_MESSAGE_RANGE) else - I = get_active_held_item() - if(dropItemToGround(I)) - visible_message("[M] has disarmed [name]!", "[M] has disarmed [name]!", null, COMBAT_MESSAGE_RANGE) - else - I = null - log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") - updatehealth() - + I = null + log_combat(M, src, "disarmed", "[I ? " removing \the [I]" : ""]") + updatehealth() /mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M) . = ..() @@ -132,17 +151,19 @@ apply_damage(damage, M.melee_damage_type, affecting) /mob/living/carbon/monkey/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - var/damage = rand(5, 35) - if(M.is_adult) - damage = rand(20, 40) - var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return 1 - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - apply_damage(damage, BRUTE, affecting) + . = ..() + if(!.) //unsuccessful slime attack + return + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(20, 40) + var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_HEAD, BODY_ZONE_CHEST, BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) + if(!dam_zone) //Dismemberment successful + return 1 + var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + apply_damage(damage, BRUTE, affecting) /mob/living/carbon/monkey/acid_act(acidpwr, acid_volume, bodyzone_hit) . = 1 diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index 66be8058f1..0155f2575d 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -1,31 +1,3 @@ -//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. -/mob/living/carbon/update_transform() - var/matrix/ntransform = matrix(transform) //aka transform.Copy() - var/final_pixel_y = pixel_y - var/final_dir = dir - var/changed = 0 - if(lying != lying_prev && rotate_on_lying) - changed++ - ntransform.TurnTo(lying_prev,lying) - if(lying == 0) //Lying to standing - final_pixel_y = get_standard_pixel_y_offset() - else //if(lying != 0) - if(lying_prev == 0) //Standing to lying - pixel_y = get_standard_pixel_y_offset() - final_pixel_y = get_standard_pixel_y_offset(lying) - if(dir & (EAST|WEST)) //Facing east or west - final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass - - if(resize != RESIZE_DEFAULT_SIZE) - changed++ - ntransform.Scale(resize) - resize = RESIZE_DEFAULT_SIZE - - if(changed) - animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) - setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). - - /mob/living/carbon var/list/overlays_standing[TOTAL_LAYERS] diff --git a/code/modules/mob/living/death.dm b/code/modules/mob/living/death.dm index 8345ef916d..1c6546fd83 100644 --- a/code/modules/mob/living/death.dm +++ b/code/modules/mob/living/death.dm @@ -91,7 +91,9 @@ if(mind && mind.name && mind.active && !istype(T.loc, /area/ctf) && !(signal & COMPONENT_BLOCK_DEATH_BROADCAST)) var/rendered = "[mind.name] has died at [get_area_name(T)]." deadchat_broadcast(rendered, follow_target = src, turf_target = T, message_type=DEADCHAT_DEATHRATTLE) - + if (client && client.prefs && client.prefs.auto_ooc) + if (!(client.prefs.chat_toggles & CHAT_OOC)) + client.prefs.chat_toggles ^= CHAT_OOC if (client) client.move_delay = initial(client.move_delay) diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 722c984309..3c5c5e3518 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -36,7 +36,50 @@ /mob/living/proc/on_hit(obj/item/projectile/P) return +/mob/living/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0) + var/block_chance_modifier = round(damage / -3) + for(var/obj/item/I in held_items) + if(!istype(I, /obj/item/clothing)) + var/final_block_chance = I.block_chance - (CLAMP((armour_penetration-I.armour_penetration)/2,0,100)) + block_chance_modifier //So armour piercing blades can still be parried by other blades, for example + if(I.hit_reaction(src, AM, attack_text, final_block_chance, damage, attack_type)) + return TRUE + return FALSE + +/mob/living/proc/check_reflect(def_zone) //Reflection checks for anything in your hands, based on the reflection chance of the object(s) + for(var/obj/item/I in held_items) + if(I.IsReflect(def_zone)) + return TRUE + return FALSE + +/mob/living/proc/reflect_bullet_check(obj/item/projectile/P, def_zone) + if(P.is_reflectable && check_reflect(def_zone)) // Checks if you've passed a reflection% check + visible_message("The [P.name] gets reflected by [src]!", \ + "The [P.name] gets reflected by [src]!") + // Find a turf near or on the original location to bounce to + if(P.starting) + var/new_x = P.starting.x + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/new_y = P.starting.y + pick(0, 0, 0, 0, 0, -1, 1, -2, 2) + var/turf/curloc = get_turf(src) + // redirect the projectile + P.original = locate(new_x, new_y, P.z) + P.starting = curloc + P.firer = src + P.yo = new_y - curloc.y + P.xo = new_x - curloc.x + var/new_angle_s = P.Angle + rand(120,240) + while(new_angle_s > 180) // Translate to regular projectile degrees + new_angle_s -= 360 + P.setAngle(new_angle_s) + return TRUE + return FALSE + /mob/living/bullet_act(obj/item/projectile/P, def_zone) + if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself + if(reflect_bullet_check(P, def_zone)) + return -1 // complete projectile permutation + if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) + P.on_hit(src, 100, def_zone) + return 2 var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null) if(!P.nodamage) apply_damage(P.damage, P.damage_type, def_zone, armor) @@ -55,9 +98,32 @@ else return 0 +/mob/living/proc/catch_item(obj/item/I, skip_throw_mode_check = FALSE) + return FALSE + +/mob/living/proc/embed_item(obj/item/I) + return + +/mob/living/proc/can_embed(obj/item/I) + return FALSE + /mob/living/hitby(atom/movable/AM, skipcatch, hitpush = TRUE, blocked = FALSE) - if(istype(AM, /obj/item)) - var/obj/item/I = AM + var/obj/item/I + var/throwpower = 30 + if(isitem(AM)) + I = AM + throwpower = I.throwforce + if(check_shields(AM, throwpower, "\the [AM.name]", THROWN_PROJECTILE_ATTACK)) + hitpush = FALSE + skipcatch = TRUE + blocked = TRUE + else if(I && I.throw_speed >= EMBED_THROWSPEED_THRESHOLD && can_embed(I, src) && prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && (!HAS_TRAIT(src, TRAIT_AUTO_CATCH_ITEM) || incapacitated() || get_active_held_item())) + embed_item(I) + hitpush = FALSE + skipcatch = TRUE //can't catch the now embedded item + if(I) + if(!skipcatch && isturf(I.loc) && catch_item(I)) + return TRUE var/zone = ran_zone(BODY_ZONE_CHEST, 65)//Hits a random part of the body, geared towards the chest var/dtype = BRUTE var/volume = I.get_volume_by_throwforce_and_or_w_class() @@ -214,6 +280,24 @@ Move(user.loc) return 1 +/mob/living/attack_hand(mob/user) + ..() //Ignoring parent return value here. + SEND_SIGNAL(src, COMSIG_MOB_ATTACK_HAND, user) + if((user != src) && user.a_intent != INTENT_HELP && check_shields(user, 0, user.name, attack_type = UNARMED_ATTACK)) + log_combat(user, src, "attempted to touch") + visible_message("[user] attempted to touch [src]!") + return TRUE + +/mob/living/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + if(user.a_intent == INTENT_HARM) + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to hurt [src]!") + return TRUE + var/hulk_verb = pick("smash","pummel") + if(user != src && check_shields(user, 15, "the [hulk_verb]ing")) + return TRUE + ..() + return FALSE /mob/living/attack_slime(mob/living/simple_animal/slime/M) if(!SSticker.HasRoundStarted()) @@ -229,6 +313,12 @@ to_chat(M, "You don't want to hurt anyone!") return FALSE + var/damage = rand(5, 35) + if(M.is_adult) + damage = rand(20, 40) + if(check_shields(M, damage, "the [M.name]")) + return FALSE + if (stat != DEAD) log_combat(M, src, "attacked") M.do_attack_animation(src) @@ -245,7 +335,8 @@ if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - + if(check_shields(M, rand(M.melee_damage_lower, M.melee_damage_upper), "the [M.name]", MELEE_ATTACK, M.armour_penetration)) + return FALSE if(M.attack_sound) playsound(loc, M.attack_sound, 50, 1, 1) M.do_attack_animation(src) @@ -256,10 +347,6 @@ /mob/living/attack_paw(mob/living/carbon/monkey/M) - if(isturf(loc) && istype(loc.loc, /area/start)) - to_chat(M, "No attacking people at spawn, you jackass.") - return FALSE - if (M.a_intent == INTENT_HARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") @@ -268,6 +355,8 @@ if(M.is_muzzled() || (M.wear_mask && M.wear_mask.flags_cover & MASKCOVERSMOUTH)) to_chat(M, "You can't bite with your mouth covered!") return FALSE + if(check_shields(M, 0, "the [M.name]")) + return FALSE M.do_attack_animation(src, ATTACK_EFFECT_BITE) if (prob(75)) log_combat(M, src, "attacked") @@ -282,15 +371,16 @@ /mob/living/attack_larva(mob/living/carbon/alien/larva/L) switch(L.a_intent) - if("help") + if(INTENT_HELP) visible_message("[L.name] rubs its head against [src].") return FALSE else if(HAS_TRAIT(L, TRAIT_PACIFISM)) to_chat(L, "You don't want to hurt anyone!") - return - + return FALSE + if(L != src && check_shields(L, rand(1, 3), "the [L.name]")) + return FALSE L.do_attack_animation(src) if(prob(90)) log_combat(L, src, "attacked") @@ -301,24 +391,29 @@ else visible_message("[L.name] has attempted to bite [src]!", \ "[L.name] has attempted to bite [src]!", null, COMBAT_MESSAGE_RANGE) - return FALSE /mob/living/attack_alien(mob/living/carbon/alien/humanoid/M) + if((M != src) && M.a_intent != INTENT_HELP && check_shields(M, 0, "the [M.name]")) + visible_message("[M] attempted to touch [src]!") + return FALSE switch(M.a_intent) - if ("help") - visible_message("[M] caresses [src] with its scythe like arm.") + if (INTENT_HELP) + if(!isalien(src)) //I know it's ugly, but the alien vs alien attack_alien behaviour is a bit different. + visible_message("[M] caresses [src] with its scythe like arm.") return FALSE - if ("grab") + if (INTENT_GRAB) grabbedby(M) return FALSE - if("harm") + if(INTENT_HARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt anyone!") return FALSE - M.do_attack_animation(src) + if(!isalien(src)) + M.do_attack_animation(src) return TRUE - if("disarm") - M.do_attack_animation(src, ATTACK_EFFECT_DISARM) + if(INTENT_DISARM) + if(!isalien(src)) + M.do_attack_animation(src, ATTACK_EFFECT_DISARM) return TRUE /mob/living/ex_act(severity, target, origin) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 4d2a36907d..783e044492 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -111,4 +111,6 @@ var/list/diseases = list() // list of all diseases in a mob var/list/disease_resistances = list() - var/drag_slowdown = TRUE //Whether the mob is slowed down when dragging another prone mob \ No newline at end of file + var/drag_slowdown = TRUE //Whether the mob is slowed down when dragging another prone mob + + var/rotate_on_lying = FALSE \ No newline at end of file diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 0444458841..1694d04b82 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -260,15 +260,6 @@ viewalerts = 1 src << browse(dat, "window=aialerts&can_close=0") -/mob/living/silicon/ai/proc/ai_roster() - var/dat = "Crew RosterCrew Roster:

    " - - dat += GLOB.data_core.get_manifest() - dat += "" - - src << browse(dat, "window=airoster") - onclose(src, "airoster") - /mob/living/silicon/ai/proc/ai_call_shuttle() if(control_disabled) to_chat(usr, "Wireless control is disabled!") @@ -681,18 +672,23 @@ "green face" = 'icons/mob/ai.dmi', "xeno queen" = 'icons/mob/alien.dmi', "horror" = 'icons/mob/ai.dmi', - "creature" = 'icons/mob/ai.dmi' + "creature" = 'icons/mob/ai.dmi', + "custom" ) input = input("Please select a hologram:") as null|anything in icon_list if(input) qdel(holo_icon) switch(input) - if("xeno queen") + if("custom") + if(client?.prefs?.custom_holoform_icon) + holo_icon = client.prefs.get_filtered_holoform(HOLOFORM_FILTER_AI) + else + holo_icon = getHologramIcon(icon('icons/mob/ai.dmi', "female")) + else if("xeno queen") holo_icon = getHologramIcon(icon(icon_list[input],"alienq")) else holo_icon = getHologramIcon(icon(icon_list[input], input)) - return /mob/living/silicon/ai/proc/corereturn() set category = "Malfunction" diff --git a/code/modules/mob/living/silicon/ai/ai_defense.dm b/code/modules/mob/living/silicon/ai/ai_defense.dm index 7c59c2b791..97d26f672a 100644 --- a/code/modules/mob/living/silicon/ai/ai_defense.dm +++ b/code/modules/mob/living/silicon/ai/ai_defense.dm @@ -1,15 +1,9 @@ - /mob/living/silicon/ai/attacked_by(obj/item/I, mob/living/user, def_zone) + . = ..() + if(!.) + return FALSE if(I.force && I.damtype != STAMINA && stat != DEAD) //only sparks if real damage is dealt. spark_system.start() - return ..() - - -/mob/living/silicon/ai/attack_alien(mob/living/carbon/alien/humanoid/M) - if(!SSticker.HasRoundStarted()) - to_chat(M, "You cannot attack people before the game has started.") - return - ..() /mob/living/silicon/ai/attack_slime(mob/living/simple_animal/slime/user) return //immune to slimes diff --git a/code/modules/mob/living/silicon/ai/freelook/eye.dm b/code/modules/mob/living/silicon/ai/freelook/eye.dm index 7477ba7713..38afaf8313 100644 --- a/code/modules/mob/living/silicon/ai/freelook/eye.dm +++ b/code/modules/mob/living/silicon/ai/freelook/eye.dm @@ -68,7 +68,7 @@ // Use this when setting the aiEye's location. // It will also stream the chunk that the new loc is in. -/mob/camera/aiEye/proc/setLoc(T, force_update = FALSE) +/mob/camera/aiEye/proc/setLoc(T, force_update = FALSE, dir) if(ai) if(!isturf(ai.loc)) return @@ -88,7 +88,7 @@ //Holopad if(istype(ai.current, /obj/machinery/holopad)) var/obj/machinery/holopad/H = ai.current - H.move_hologram(ai, T) + H.move_hologram(ai, T, dir) if(ai.camera_light_on) ai.light_cameras() if(ai.master_multicam) @@ -139,7 +139,7 @@ for(var/i = 0; i < max(user.sprint, initial); i += 20) var/turf/step = get_turf(get_step(user.eyeobj, direct)) if(step) - user.eyeobj.setLoc(step) + user.eyeobj.setLoc(step, null, direct) user.cooldown = world.timeofday + 5 if(user.acceleration) diff --git a/code/modules/mob/living/silicon/custom_holoform.dm b/code/modules/mob/living/silicon/custom_holoform.dm new file mode 100644 index 0000000000..8ce6e9a29a --- /dev/null +++ b/code/modules/mob/living/silicon/custom_holoform.dm @@ -0,0 +1,28 @@ +/mob/living/silicon/verb/clear_custom_holoform() + set name = "Clear Custom Holoform" + set desc = "Clear your current custom holoform" + set category = "OOC" + + if(!client.prefs) + to_chat(src, "No preferences datum on your client, contact an admin/coder!") + return + client.prefs.custom_holoform_icon = null + client.prefs.cached_holoform_icons = null + to_chat(src, "Holoform removed.") + +/mob/living/silicon/verb/set_custom_holoform() + set name = "Set Custom Holoform" + set desc = "Set your custom holoform using your current preferences slot and a specified set of gear." + set category = "OOC" + + if(!client.prefs) + to_chat(src, "No preferences datum on your client, contact an admin/coder!") + return + if(client.prefs.last_custom_holoform > world.time - CUSTOM_HOLOFORM_DELAY) + to_chat(src, "You are attempting to change custom holoforms too fast!") + var/icon/new_holoform = user_interface_custom_holoform(client) + if(new_holoform) + client.prefs.custom_holoform_icon = new_holoform + client.prefs.cached_holoform_icons = null + client.prefs.last_custom_holoform = world.time + to_chat(src, "Holoform set.") diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 7ec63cf415..7055838039 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -58,10 +58,12 @@ var/canholo = TRUE var/obj/item/card/id/access_card = null var/chassis = "repairbot" - var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, - "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE , - "parrot" = FALSE, "bear" = FALSE , "mushroom" = FALSE, "crow" = FALSE , - "fairy" = FALSE , "spiderbot" = FALSE) //assoc value is whether it can be picked up. + var/dynamic_chassis + var/dynamic_chassis_sit = FALSE //whether we're sitting instead of resting spritewise + var/dynamic_chassis_bellyup = FALSE //whether we're lying down bellyup + var/list/possible_chassis //initialized in initialize. + var/list/dynamic_chassis_icons //ditto. + var/list/chassis_pixel_offsets_x //stupid dogborgs var/static/item_head_icon = 'icons/mob/pai_item_head.dmi' var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi' var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi' @@ -69,22 +71,20 @@ var/emitterhealth = 20 var/emittermaxhealth = 20 var/emitterregen = 0.25 + var/emitter_next_use = 0 + var/emitter_emp_cd = 300 var/emittercd = 50 var/emitteroverloadcd = 100 - var/emittersemicd = FALSE - var/overload_ventcrawl = 0 - var/overload_bulletblock = 0 //Why is this a good idea? - var/overload_maxhealth = 0 + var/radio_short = FALSE + var/radio_short_cooldown = 5 MINUTES + var/radio_short_timerid + canmove = FALSE var/silent = FALSE var/brightness_power = 5 -/mob/living/silicon/pai/can_unbuckle() - return FALSE - -/mob/living/silicon/pai/can_buckle() - return FALSE + var/icon/custom_holoform_icon /mob/living/silicon/pai/Destroy() if (loc != card) @@ -118,6 +118,13 @@ pda.owner = text("[]", src) pda.name = pda.owner + " (" + pda.ownjob + ")" + possible_chassis = typelist(NAMEOF(src, possible_chassis), list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, + "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE, "borgi" = FALSE , + "parrot" = FALSE, "bear" = FALSE , "mushroom" = FALSE, "crow" = FALSE , + "fairy" = FALSE , "spiderbot" = FALSE)) //assoc value is whether it can be picked up. + dynamic_chassis_icons = typelist(NAMEOF(src, dynamic_chassis_icons), initialize_dynamic_chassis_icons()) + chassis_pixel_offsets_x = typelist(NAMEOF(src, chassis_pixel_offsets_x), default_chassis_pixel_offsets_x()) + . = ..() var/datum/action/innate/pai/software/SW = new @@ -133,8 +140,7 @@ AR.Grant(src) AL.Grant(src) ALM.Grant(src) - emittersemicd = TRUE - addtimer(CALLBACK(src, .proc/emittercool), 600) + emitter_next_use = world.time + 10 SECONDS /mob/living/silicon/pai/Life() if(hacking) @@ -228,7 +234,7 @@ /datum/action/innate/pai/shell/Trigger() ..() if(P.holoform) - P.fold_in(0) + P.fold_in(FALSE) else P.fold_out() @@ -292,3 +298,132 @@ /mob/living/silicon/pai/process() emitterhealth = CLAMP((emitterhealth + emitterregen), -50, emittermaxhealth) + +/mob/living/silicon/pai/proc/short_radio() + if(radio_short_timerid) + deltimer(radio_short_timerid) + radio_short = TRUE + to_chat(src, "Your radio shorts out!") + radio_short_timerid = addtimer(CALLBACK(src, .proc/unshort_radio), radio_short_cooldown, flags = TIMER_STOPPABLE) + +/mob/living/silicon/pai/proc/unshort_radio() + radio_short = FALSE + to_chat(src, "You feel your radio is operational once more.") + if(radio_short_timerid) + deltimer(radio_short_timerid) + +/mob/living/silicon/pai/proc/initialize_dynamic_chassis_icons() + . = list() + var/icon/curr //for inserts + + //This is a horrible system and I wish I was not as lazy and did something smarter, like just generating a new icon in memory which is probably more efficient. + + //Basic /tg/ cyborgs + .["Cyborg - Engineering (default)"] = process_holoform_icon_filter(icon('icons/mob/robots.dmi', "engineer"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (loaderborg)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "loaderborg"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (handyeng)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "handyeng"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (sleekeng)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "sleekeng"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (marinaeng)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "marinaeng"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (default)"] = process_holoform_icon_filter(icon('icons/mob/robots.dmi', "medical"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (marinamed)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "marinamed"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (eyebotmed)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "eyebotmed"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (default)"] = process_holoform_icon_filter(icon('icons/mob/robots.dmi', "sec"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (sleeksec)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "sleeksec"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (marinasec)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/robots.dmi', "marinasec"), HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Clown (default)"] = process_holoform_icon_filter(icon('icons/mob/robots.dmi', "clown"), HOLOFORM_FILTER_PAI, FALSE) + + //Citadel dogborgs + //Engi + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valeeng") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeeng-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeeng-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeeng-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (dog - valeeng)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "pupdozer") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "pupdozer-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "pupdozer-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "pupdozer-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Engineering (dog - pupdozer)"] = curr + //Med + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "medihound") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihound-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihound-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihound-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (dog - medihound)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "medihounddark") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihounddark-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihounddark-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "medihounddark-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (dog - medihounddark)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valemed") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valemed-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valemed-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valemed-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Medical (dog - valemed)"] = curr + //Sec + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "k9") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (dog - k9)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "k9dark") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9dark-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9dark-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "k9dark-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (dog - k9dark)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valesec") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesec-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesec-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesec-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Security (dog - valesec)"] = curr + //Service + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valeserv") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeserv-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeserv-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeserv-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Service (dog - valeserv)"] = curr + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valeservdark") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeservdark-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeservdark-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valeservdark-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Service (dog - valeservdark)"] = curr + //Sci + curr = icon('modular_citadel/icons/mob/widerobot.dmi', "valesci") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesci-rest"), "rest") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesci-sit"), "sit") + curr.Insert(icon('modular_citadel/icons/mob/widerobot.dmi', "valesci-bellyup"), "bellyup") + process_holoform_icon_filter(curr, HOLOFORM_FILTER_PAI, FALSE) + .["Cyborg - Science (dog - valesci)"] = curr + //Misc + .["Cyborg - Misc (dog - blade)"] = process_holoform_icon_filter(icon('modular_citadel/icons/mob/widerobot.dmi', "blade"), HOLOFORM_FILTER_PAI, FALSE) + +/mob/living/silicon/pai/proc/default_chassis_pixel_offsets_x() + . = list() + //Engi + .["Cyborg - Engineering (dog - valeeng)"] = -16 + .["Cyborg - Engineering (dog - pupdozer)"] = -16 + //Med + .["Cyborg - Medical (dog - medihound)"] = -16 + .["Cyborg - Medical (dog - medihounddark)"] = -16 + .["Cyborg - Medical (dog - valemed)"] = -16 + //Sec + .["Cyborg - Security (dog - k9)"] = -16 + .["Cyborg - Security (dog - valesec)"] = -16 + .["Cyborg - Security (dog - k9dark)"] = -16 + //Service + .["Cyborg - Service (dog - valeserv)"] = -16 + .["Cyborg - Service (dog - valeservdark)"] = -16 + //Sci + .["Cyborg - Security (dog - valesci)"] = -16 + //Misc + .["Cyborg - Misc (dog - blade)"] = -16 diff --git a/code/modules/mob/living/silicon/pai/pai_defense.dm b/code/modules/mob/living/silicon/pai/pai_defense.dm index dfc718f1ab..c727e100d8 100644 --- a/code/modules/mob/living/silicon/pai/pai_defense.dm +++ b/code/modules/mob/living/silicon/pai/pai_defense.dm @@ -8,9 +8,10 @@ return take_holo_damage(50/severity) Knockdown(400/severity) - silent = max(30/severity, silent) + silent = max((3 MINUTES)/severity, silent) if(holoform) fold_in(force = TRUE) + emitter_next_use = world.time + emitter_emp_cd //Need more effects that aren't instadeath or permanent law corruption. /mob/living/silicon/pai/ex_act(severity, target) @@ -26,13 +27,14 @@ fold_in(force = 1) Knockdown(200) +//ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/silicon/pai/attack_hand(mob/living/carbon/human/user) switch(user.a_intent) - if("help") + if(INTENT_HELP) visible_message("[user] gently pats [src] on the head, eliciting an off-putting buzzing from its holographic field.") - if("disarm") + if(INTENT_DISARM) visible_message("[user] boops [src] on the head!") - if("harm") + if(INTENT_HARM) user.do_attack_animation(src) if (user.name == master) visible_message("Responding to its master's touch, [src] disengages its holochassis emitter, rapidly losing coherence.") @@ -41,14 +43,19 @@ if(user.put_in_hands(card)) user.visible_message("[user] promptly scoops up [user.p_their()] pAI's card.") else + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + to_chat(user, "You don't want to hurt [src]!") + return visible_message("[user] stomps on [src]!.") take_holo_damage(2) + else + grabbedby(user) -/mob/living/silicon/pai/bullet_act(obj/item/projectile/Proj) - if(Proj.stun) +/mob/living/silicon/pai/bullet_act(obj/item/projectile/P, def_zone) + if(P.stun) fold_in(force = TRUE) - src.visible_message("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!") - . = ..(Proj) + visible_message("The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!") + . = ..() /mob/living/silicon/pai/stripPanelUnequip(obj/item/what, mob/who, where) //prevents stripping to_chat(src, "Your holochassis stutters and warps intensely as you attempt to interact with the object, forcing you to cease lest the field fail.") diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 164a3e7389..6577c26402 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -12,12 +12,11 @@ . = fold_in(force) return - if(emittersemicd) + if(world.time < emitter_next_use) to_chat(src, "Error: Holochassis emitters recycling. Please try again later.") return FALSE - emittersemicd = TRUE - addtimer(CALLBACK(src, .proc/emittercool), emittercd) + emitter_next_use = world.time + emittercd canmove = TRUE density = TRUE if(istype(card.loc, /obj/item/pda)) @@ -46,20 +45,17 @@ visible_message("[src] folds out its holochassis emitter and forms a holoshell around itself!") holoform = TRUE -/mob/living/silicon/pai/proc/emittercool() - emittersemicd = FALSE - /mob/living/silicon/pai/proc/fold_in(force = FALSE) - emittersemicd = TRUE - if(!force) - addtimer(CALLBACK(src, .proc/emittercool), emittercd) - else - addtimer(CALLBACK(src, .proc/emittercool), emitteroverloadcd) + emitter_next_use = world.time + (force? emitteroverloadcd : emittercd) icon_state = "[chassis]" if(!holoform) . = fold_out(force) return - visible_message("[src] deactivates its holochassis emitter and folds back into a compact card!") + if(force) + short_radio() + visible_message("[src] shorts out, collapsing back into their storage card, sparks emitted from their radio antenna!") + else + visible_message("[src] deactivates its holochassis emitter and folds back into a compact card!") stop_pulling() if(client) client.perspective = EYE_PERSPECTIVE @@ -78,28 +74,39 @@ if(!isturf(loc) && loc != card) to_chat(src, "You can not change your holochassis composite while not on the ground or in your card!") return FALSE - var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in possible_chassis - if(!choice) + var/list/choices = list("Preset - Basic", "Preset - Dynamic") + if(CONFIG_GET(flag/pai_custom_holoforms)) + choices += "Custom" + var/choicetype = input(src, "What type of chassis do you want to use?") as null|anything in choices + if(!choicetype) return FALSE - chassis = choice - icon_state = "[chassis]" - if(resting) - icon_state = "[chassis]_rest" + switch(choicetype) + if("Custom") + chassis = "custom" + if("Preset - Basic") + var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in possible_chassis + if(!choice) + return FALSE + chassis = choice + if("Preset - Dynamic") + var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in dynamic_chassis_icons + if(!choice) + return FALSE + chassis = "dynamic" + dynamic_chassis = choice + resist_a_rest(FALSE, TRUE) + update_icon() to_chat(src, "You switch your holochassis projection composite to [chassis]") /mob/living/silicon/pai/lay_down() - ..() - update_resting_icon(resting) - -/mob/living/silicon/pai/proc/update_resting_icon(rest) - if(rest) - icon_state = "[chassis]_rest" - else - icon_state = "[chassis]" + . = ..() if(loc != card) - visible_message("[src] [rest? "lays down for a moment..." : "perks up from the ground"]") + visible_message("[src] [resting? "lays down for a moment..." : "perks up from the ground"]") + update_icon() -/mob/living/silicon/pai/start_pulling(atom/movable/AM) +/mob/living/silicon/pai/start_pulling(atom/movable/AM, gs) + if(ispAI(AM)) + return ..() return FALSE /mob/living/silicon/pai/proc/toggle_integrated_light() @@ -122,3 +129,22 @@ to_chat(user, "[src]'s current form isn't able to be carried!") return FALSE return ..() + +/mob/living/silicon/pai/verb/toggle_chassis_sit() + set name = "Toggle Chassis Sit" + set category = "IC" + set desc = "Whether or not to try to use a sitting icon versus a resting icon. Takes priority over belly-up resting." + dynamic_chassis_sit = !dynamic_chassis_sit + to_chat(usr, "You are now [dynamic_chassis_sit? "sitting" : "lying down"].") + update_icon() + +/mob/living/silicon/pai/verb/toggle_chassis_bellyup() + set name = "Toggle Chassis Belly Up" + set category = "IC" + set desc = "Whether or not to try to use a belly up icon while resting. Overridden by sitting." + dynamic_chassis_bellyup = !dynamic_chassis_bellyup + to_chat(usr, "You are now lying on your [dynamic_chassis_bellyup? "back" : "front"].") + update_icon() + +/mob/living/silicon/pai/can_buckle_others(mob/living/target, atom/buckle_to) + return ispAI(target) && ..() diff --git a/code/modules/mob/living/silicon/pai/say.dm b/code/modules/mob/living/silicon/pai/say.dm index 9f07900a25..deedaa1382 100644 --- a/code/modules/mob/living/silicon/pai/say.dm +++ b/code/modules/mob/living/silicon/pai/say.dm @@ -5,4 +5,11 @@ ..(message) /mob/living/silicon/pai/binarycheck() - return 0 + return FALSE + +/mob/living/silicon/pai/radio(message, message_mode, list/spans, language) + if((message_mode == "robot") || (message_mode in GLOB.radiochannels)) + if(radio_short) + to_chat(src, "Your radio is shorted out!") + return ITALICS | REDUCE_RANGE + return ..() diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 9882d028d1..3ea018ccf6 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -283,7 +283,10 @@ dat += "Refresh
    " // Built-in dat += "Directives
    " - dat += "Radio Configuration
    " + if(radio_short) + dat += "\[RADIO SHORTED - Recalibrating!\]" + else + dat += "Radio Configuration
    " dat += "Screen Display
    " //dat += "Text Messaging
    " dat += "
    " diff --git a/code/modules/mob/living/silicon/pai/update_icon.dm b/code/modules/mob/living/silicon/pai/update_icon.dm new file mode 100644 index 0000000000..9e40b71c5d --- /dev/null +++ b/code/modules/mob/living/silicon/pai/update_icon.dm @@ -0,0 +1,27 @@ +/mob/living/silicon/pai/update_icon() + if(chassis == "custom") //Make sure custom exists if it's set to custom + custom_holoform_icon = client?.prefs?.get_filtered_holoform(HOLOFORM_FILTER_PAI) + if(!custom_holoform_icon) + chassis = pick(possible_chassis - "custom") + if(chassis == "dynamic") //handle dynamic generated icons + icon = dynamic_chassis_icons[dynamic_chassis] + var/list/states = icon_states(icon) + icon_state = "" + if(resting) //The next line is some bullshit but I can make it worse if you want and make it a single line instead of four.. :) + if(dynamic_chassis_sit && ("sit") in states) + icon_state = "sit" + else if(dynamic_chassis_bellyup && ("bellyup") in states) + icon_state = "bellyup" + else if("rest" in states) + icon_state = "rest" + rotate_on_lying = FALSE + else if(chassis == "custom") + icon = custom_holoform_icon + icon_state = "" + rotate_on_lying = TRUE + else + icon = initial(icon) + icon_state = "[chassis][resting? "_rest" : (stat == DEAD? "_dead" : "")]" + rotate_on_lying = FALSE + pixel_x = ((chassis == "dynamic") && chassis_pixel_offsets_x[dynamic_chassis]) || 0 + update_transform() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5df24406c5..5f7d3ca243 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1298,4 +1298,12 @@ /mob/living/silicon/robot/adjustStaminaLossBuffered(amount, updating_health = 1) if(istype(cell)) - cell.charge -= amount*5 \ No newline at end of file + cell.charge -= amount*5 + +/mob/living/silicon/robot/verb/viewmanifest() + set category = "Robot Commands" + set name = "View Crew Manifest" + + if(usr.stat == DEAD) + return //won't work if dead + ai_roster() \ No newline at end of file diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 0f09b6f62a..7e06c66eff 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -13,7 +13,19 @@ spark_system.start() return ..() +/mob/living/silicon/robot/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) + . = ..() + if(.) + spark_system.start() + spawn(0) + step_away(src,user,15) + sleep(3) + step_away(src,user,15) + /mob/living/silicon/robot/attack_alien(mob/living/carbon/alien/humanoid/M) + . = ..() + if(!.) // the attack was blocked or was help/grab intent + return if (M.a_intent == INTENT_DISARM) if(!(lying)) M.do_attack_animation(src, ATTACK_EFFECT_DISARM) @@ -30,24 +42,19 @@ visible_message("[M] has forced back [src]!", \ "[M] has forced back [src]!", null, COMBAT_MESSAGE_RANGE) playsound(loc, 'sound/weapons/pierce.ogg', 50, 1, -1) - else - ..() - return /mob/living/silicon/robot/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime shock - flash_act() - var/stunprob = M.powerlevel * 7 + 10 - if(prob(stunprob) && M.powerlevel >= 8) - adjustBruteLoss(M.powerlevel * rand(6,10)) - - var/damage = rand(1, 3) - + . = ..() + if(!.) //unsuccessful slime shock + return + var/stunprob = M.powerlevel * 7 + 10 + var/damage = M.powerlevel * rand(6,10) + if(prob(stunprob) && M.powerlevel >= 8) + flash_act(affect_silicon = TRUE) //my borg eyes! if(M.is_adult) - damage = rand(20, 40) + damage += rand(10, 20) else - damage = rand(5, 35) - damage = round(damage / 2) // borgs receive half damage + damage += rand(2, 17) adjustBruteLoss(damage) updatehealth() @@ -56,23 +63,17 @@ //ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/silicon/robot/attack_hand(mob/living/carbon/human/user) add_fingerprint(user) - if(opened && !wiresexposed && !issilicon(user)) - if(cell) - cell.update_icon() - cell.add_fingerprint(user) - user.put_in_active_hand(cell) - to_chat(user, "You remove \the [cell].") - cell = null - update_icons() - diag_hud_set_borgcell() + if(opened && !wiresexposed && cell && !issilicon(user)) + cell.update_icon() + cell.add_fingerprint(user) + user.put_in_active_hand(cell) + to_chat(user, "You remove \the [cell].") + cell = null + update_icons() + diag_hud_set_borgcell() if(!opened) - if(..()) // hulk attack - spark_system.start() - spawn(0) - step_away(src,user,15) - sleep(3) - step_away(src,user,15) + return ..() /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them @@ -182,9 +183,9 @@ if (stat != DEAD) adjustBruteLoss(30) -/mob/living/silicon/robot/bullet_act(var/obj/item/projectile/Proj) - ..(Proj) +/mob/living/silicon/robot/bullet_act(obj/item/projectile/P, def_zone) + ..() updatehealth() - if(prob(75) && Proj.damage > 0) + if(prob(75) && P.damage > 0) spark_system.start() return 2 diff --git a/code/modules/mob/living/silicon/silicon.dm b/code/modules/mob/living/silicon/silicon.dm index b9cee43138..699105ac4c 100644 --- a/code/modules/mob/living/silicon/silicon.dm +++ b/code/modules/mob/living/silicon/silicon.dm @@ -389,6 +389,15 @@ if (aicamera) return aicamera.selectpicture(user) +/mob/living/silicon/proc/ai_roster() + var/dat = "Crew RosterCrew Roster:

    " + + dat += GLOB.data_core.get_manifest() + dat += "" + + src << browse(dat, "window=airoster") + onclose(src, "airoster") + /mob/living/silicon/update_transform() var/matrix/ntransform = matrix(transform) //aka transform.Copy() var/changed = 0 diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 073a2eec2b..ca8ad25713 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -6,7 +6,10 @@ return 2 /mob/living/silicon/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent + . = ..() + if(!.) // the attack was blocked or was help/grab intent + return + if(M.a_intent == INTENT_HARM) var/damage = 20 if (prob(90)) log_combat(M, src, "attacked") @@ -49,34 +52,33 @@ /mob/living/silicon/attack_paw(mob/living/user) return attack_hand(user) -/mob/living/silicon/attack_larva(mob/living/carbon/alien/larva/L) - if(L.a_intent == INTENT_HELP) - visible_message("[L.name] rubs its head against [src].") - -/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/mob/living/silicon/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) - ..(user, 1) + . = ..(user, TRUE) + if(.) + return adjustBruteLoss(rand(10, 15)) playsound(loc, "punch", 25, 1, -1) visible_message("[user] has punched [src]!", \ "[user] has punched [src]!") - return 1 - return 0 + return TRUE + return FALSE -//ATTACK HAND IGNORING PARENT RETURN VALUE /mob/living/silicon/attack_hand(mob/living/carbon/human/M) + . = ..() + if(.) //the attack was blocked + return switch(M.a_intent) - if ("help") + if (INTENT_HELP) M.visible_message("[M] pets [src].", \ "You pet [src].") - if("grab") + if(INTENT_GRAB) grabbedby(M) else M.do_attack_animation(src, ATTACK_EFFECT_PUNCH) playsound(src.loc, 'sound/effects/bang.ogg', 10, 1) visible_message("[M] punches [src], but doesn't leave a dent.", \ "[M] punches [src], but doesn't leave a dent.", null, COMBAT_MESSAGE_RANGE) - return 0 /mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) if(M.a_intent == INTENT_HARM) @@ -108,19 +110,25 @@ M.visible_message("[M] is thrown off of [src]!") flash_act(affect_silicon = 1) -/mob/living/silicon/bullet_act(obj/item/projectile/Proj) - if((Proj.damage_type == BRUTE || Proj.damage_type == BURN)) - adjustBruteLoss(Proj.damage) - if(prob(Proj.damage*1.5)) +/mob/living/silicon/bullet_act(obj/item/projectile/P, def_zone) + if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself + if(reflect_bullet_check(P, def_zone)) + return -1 // complete projectile permutation + if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration)) + P.on_hit(src, 100, def_zone) + return 2 + if((P.damage_type == BRUTE || P.damage_type == BURN)) + adjustBruteLoss(P.damage) + if(prob(P.damage*1.5)) for(var/mob/living/M in buckled_mobs) M.visible_message("[M] is knocked off of [src]!") unbuckle_mob(M) M.Knockdown(40) - if(Proj.stun || Proj.knockdown) + if(P.stun || P.knockdown) for(var/mob/living/M in buckled_mobs) unbuckle_mob(M) - M.visible_message("[M] is knocked off of [src] by the [Proj]!") - Proj.on_hit(src) + M.visible_message("[M] is knocked off of [src] by the [P]!") + P.on_hit(src) return 2 /mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static) diff --git a/code/modules/mob/living/simple_animal/animal_defense.dm b/code/modules/mob/living/simple_animal/animal_defense.dm index 793df63c87..0dfa126e79 100644 --- a/code/modules/mob/living/simple_animal/animal_defense.dm +++ b/code/modules/mob/living/simple_animal/animal_defense.dm @@ -1,20 +1,22 @@ /mob/living/simple_animal/attack_hand(mob/living/carbon/human/M) - ..() + . = ..() + if(.) //the attack was blocked + return switch(M.a_intent) - if("help") + if(INTENT_HELP) if (health > 0) visible_message("[M] [response_help] [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - if("grab") + if(INTENT_GRAB) if(grab_state >= GRAB_AGGRESSIVE && isliving(pulling)) vore_attack(M, pulling) else grabbedby(M) - if("harm", "disarm") + if(INTENT_HARM, INTENT_DISARM) if(HAS_TRAIT(M, TRAIT_PACIFISM)) to_chat(M, "You don't want to hurt [src]!") return @@ -27,12 +29,11 @@ updatehealth() return TRUE -/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) +/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = FALSE) if(user.a_intent == INTENT_HARM) - if(HAS_TRAIT(user, TRAIT_PACIFISM)) - to_chat(user, "You don't want to hurt [src]!") - return FALSE - ..(user, 1) + . = ..(user, TRUE) + if(.) + return playsound(loc, "punch", 25, 1, -1) visible_message("[user] has punched [src]!", \ "[user] has punched [src]!", null, COMBAT_MESSAGE_RANGE) @@ -40,32 +41,32 @@ return TRUE /mob/living/simple_animal/attack_paw(mob/living/carbon/monkey/M) - if(..()) //successful monkey bite. - if(stat != DEAD) - var/damage = rand(1, 3) - attack_threshold_check(damage) - return 1 + . = ..() + if(.) //successful larva bite + var/damage = rand(1, 3) + attack_threshold_check(damage) + return 1 if (M.a_intent == INTENT_HELP) if (health > 0) visible_message("[M.name] [response_help] [src].") playsound(loc, 'sound/weapons/thudswoosh.ogg', 50, 1, -1) - /mob/living/simple_animal/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - if(M.a_intent == INTENT_DISARM) - playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) - visible_message("[M] [response_disarm] [name]!", \ - "[M] [response_disarm] [name]!", null, COMBAT_MESSAGE_RANGE) - log_combat(M, src, "disarmed") - else - var/damage = rand(15, 30) - visible_message("[M] has slashed at [src]!", \ - "[M] has slashed at [src]!", null, COMBAT_MESSAGE_RANGE) - playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) - attack_threshold_check(damage) - log_combat(M, src, "attacked") - return 1 + . = ..() + if(!.) // the attack was blocked or was help/grab intent + return + if(M.a_intent == INTENT_DISARM) + playsound(loc, 'sound/weapons/pierce.ogg', 25, 1, -1) + visible_message("[M] [response_disarm] [name]!", \ + "[M] [response_disarm] [name]!", null, COMBAT_MESSAGE_RANGE) + log_combat(M, src, "disarmed") + else + var/damage = rand(15, 30) + visible_message("[M] has slashed at [src]!", \ + "[M] has slashed at [src]!", null, COMBAT_MESSAGE_RANGE) + playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1) + attack_threshold_check(damage) + log_combat(M, src, "attacked") /mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L) . = ..() @@ -82,7 +83,8 @@ return attack_threshold_check(damage, M.melee_damage_type) /mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack + . = ..() + if(.) //successful slime shock var/damage = rand(15, 25) if(M.is_adult) damage = rand(20, 35) diff --git a/code/modules/mob/living/simple_animal/bot/floorbot.dm b/code/modules/mob/living/simple_animal/bot/floorbot.dm index 396c6de166..cae707ce46 100644 --- a/code/modules/mob/living/simple_animal/bot/floorbot.dm +++ b/code/modules/mob/living/simple_animal/bot/floorbot.dm @@ -318,9 +318,9 @@ sleep(50) if(mode == BOT_REPAIRING && src.loc == target_turf) if(autotile) //Build the floor and include a tile. - target_turf.PlaceOnTop(/turf/open/floor/plasteel) + target_turf.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) else //Build a hull plating without a floor tile. - target_turf.PlaceOnTop(/turf/open/floor/plating) + target_turf.PlaceOnTop(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) else var/turf/open/floor/F = target_turf @@ -334,7 +334,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = 0 F.burnt = 0 - F.PlaceOnTop(/turf/open/floor/plasteel) + F.PlaceOnTop(/turf/open/floor/plasteel, flags = CHANGETURF_INHERIT_AIR) if(replacetiles && F.type != initial(tiletype.turf_type) && specialtiles && !isplatingturf(F)) anchored = TRUE @@ -345,7 +345,7 @@ if(mode == BOT_REPAIRING && F && src.loc == F) F.broken = 0 F.burnt = 0 - F.PlaceOnTop(initial(tiletype.turf_type)) + F.PlaceOnTop(initial(tiletype.turf_type), flags = CHANGETURF_INHERIT_AIR) specialtiles -= 1 if(specialtiles == 0) speak("Requesting refill of custom floortiles to continue replacing.") diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 2de4ca39fd..109c7b4636 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -113,7 +113,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, mode = BOT_HUNT /mob/living/simple_animal/bot/honkbot/attack_hand(mob/living/carbon/human/H) - if(H.a_intent == "harm") + if(H.a_intent == INTENT_HARM) retaliate(H) addtimer(CALLBACK(src, .proc/react_buzz), 5) return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 02e171e4c4..bda309f7c7 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -232,9 +232,9 @@ /mob/living/simple_animal/pet/cat/attack_hand(mob/living/carbon/human/M) . = ..() switch(M.a_intent) - if("help") + if(INTENT_HELP) wuv(1, M) - if("harm") + if(INTENT_HARM) wuv(-1, M) /mob/living/simple_animal/pet/cat/proc/wuv(change, mob/M) @@ -290,7 +290,9 @@ D.decorate_donut() /mob/living/simple_animal/pet/cat/cak/attack_hand(mob/living/L) - ..() + . = ..() + if(.) //the attack was blocked + return if(L.a_intent == INTENT_HARM && L.reagents && !stat) L.reagents.add_reagent("nutriment", 0.4) L.reagents.add_reagent("vitamin", 0.4) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 0d933d171b..986e5c9b4d 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -643,9 +643,9 @@ /mob/living/simple_animal/pet/dog/attack_hand(mob/living/carbon/human/M) . = ..() switch(M.a_intent) - if("help") + if(INTENT_HELP) wuv(1,M) - if("harm") + if(INTENT_HARM) wuv(-1,M) /mob/living/simple_animal/pet/dog/proc/wuv(change, mob/M) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm index 521f458e2f..0f7b534d4f 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/extra_drone_types.dm @@ -130,6 +130,7 @@ hacked = TRUE visualAppearence = CLOCKDRONE can_be_held = FALSE + mouse_opacity = MOUSE_OPACITY_OPAQUE flavortext = "You are a cogscarab, a tiny building construct of Ratvar. While you're weak and can't recite scripture, \ you have a set of quick tools, as well as a replica fabricator that can create brass and convert objects.

    Work with the servants of Ratvar \ to construct and maintain defenses at the City of Cogs. If there are no servants, use this time to experiment with base designs!" diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index e40eb585e8..c9207fcf89 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -31,9 +31,9 @@ //picky up the drone c: /mob/living/simple_animal/drone/attack_hand(mob/user) - ..() - if(user.a_intent == INTENT_HELP) - mob_try_pickup(user) + if(user.a_intent != INTENT_HELP) + return ..() // TODO: convert picking up mobs into an element or component. + mob_try_pickup(user) /mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) var/mob/dead/observer/G = get_ghost() diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 1bd434b233..62c8588ac8 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -424,9 +424,9 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/mob/living/simple_animal/hostile/guardian/G = input(src, "Pick the guardian you wish to reset", "Guardian Reset") as null|anything in guardians if(G) to_chat(src, "You attempt to reset [G.real_name]'s personality...") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as [src.real_name]'s [G.real_name]?", ROLE_PAI, null, FALSE, 100) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) to_chat(G, "Your user reset you, and your body was taken over by a ghost. Looks like they weren't happy with your performance.") to_chat(src, "Your [G.real_name] has been successfully reset.") message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(G)])") @@ -498,10 +498,10 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians return used = TRUE to_chat(user, "[use_message]") - var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE) + var/list/mob/candidates = pollGhostCandidates("Do you want to play as the [mob_name] of [user.real_name]?", ROLE_PAI, null, FALSE, 100, POLL_IGNORE_HOLOPARASITE) if(LAZYLEN(candidates)) - var/mob/dead/observer/C = pick(candidates) + var/mob/C = pick(candidates) spawn_guardian(user, C.key) else to_chat(user, "[failure_message]") diff --git a/code/modules/mob/living/simple_animal/guardian/types/charger.dm b/code/modules/mob/living/simple_animal/guardian/types/charger.dm index 49514d0d12..914d38022f 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -54,10 +54,8 @@ var/blocked = FALSE if(hasmatchingsummoner(A)) //if the summoner matches don't hurt them blocked = TRUE - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) - blocked = TRUE + if(L.check_shields(src, 90, "[name]", attack_type = THROWN_PROJECTILE_ATTACK)) + blocked = TRUE if(!blocked) L.drop_all_held_items() L.visible_message("[src] slams into [L]!", "[src] slams into you!") diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm index 51a9d8d62b..c2c9f5a71f 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/colossus.dm @@ -486,10 +486,7 @@ Difficulty: Very Hard if(isturf(Stuff)) var/turf/T = Stuff if((isspaceturf(T) || isfloorturf(T)) && NewTerrainFloors) - var/turf/open/O = T.ChangeTurf(NewTerrainFloors) - if(O.air) - var/datum/gas_mixture/G = O.air - G.copy_from_turf(O) + var/turf/open/O = T.ChangeTurf(NewTerrainFloors, flags = CHANGETURF_INHERIT_AIR) if(prob(florachance) && NewFlora.len && !is_blocked_turf(O, TRUE)) var/atom/Picked = pick(NewFlora) new Picked(O) diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm index 397d40925b..7cfae9310a 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/hierophant.dm @@ -594,12 +594,15 @@ Difficulty: Normal var/list/hit_things = list() //we hit these already, ignore them var/friendly_fire_check = FALSE var/bursting = FALSE //if we're bursting and need to hit anyone crossing us + var/list/nohurt -/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once) +/obj/effect/temp_visual/hierophant/blast/Initialize(mapload, new_caster, friendly_fire, list/only_hit_once, list/donthurt = null) . = ..() if(only_hit_once) hit_things = only_hit_once friendly_fire_check = friendly_fire + if(donthurt) + hit_things += donthurt if(new_caster) hit_things += new_caster if(ismineralturf(loc)) //drill mineral turfs diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm index 8c2fbef15e..c6386540f7 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/megafauna.dm @@ -25,7 +25,7 @@ mob_size = MOB_SIZE_LARGE layer = LARGE_MOB_LAYER //Looks weird with them slipping under mineral walls and cameras and shit otherwise mouse_opacity = MOUSE_OPACITY_OPAQUE // Easier to click on in melee, they're giant targets anyway - flags_1 = PREVENT_CONTENTS_EXPLOSION_1 + flags_1 = PREVENT_CONTENTS_EXPLOSION_1 | HEAR_1 var/list/crusher_loot var/medal_type var/score_type = BOSS_SCORE diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 04a1b4a468..0a8320788e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -24,7 +24,8 @@ var/list/attack_action_types = list() var/can_talk = FALSE var/obj/loot_drop = null - + var/owner + //Gives player-controlled variants the ability to swap attacks /mob/living/simple_animal/hostile/asteroid/elite/Initialize(mapload) . = ..() @@ -53,14 +54,14 @@ if(ismineralturf(target)) var/turf/closed/mineral/M = target M.gets_drilled() - + //Elites can't talk (normally)! /mob/living/simple_animal/hostile/asteroid/elite/say(message, bubble_type, var/list/spans = list(), sanitize = TRUE, datum/language/language = null, ignore_spam = FALSE, forced = null) if(can_talk) . = ..() return TRUE return FALSE - + /*Basic setup for elite attacks, based on Whoneedspace's megafauna attack setup. While using this makes the system rely on OnFire, it still gives options for timers not tied to OnFire, and it makes using attacks consistent accross the board for player-controlled elites.*/ @@ -82,11 +83,11 @@ While using this makes the system rely on OnFire, it still gives options for tim /datum/action/innate/elite_attack/Activate() M.chosen_attack = chosen_attack_num to_chat(M, chosen_message) - + /mob/living/simple_animal/hostile/asteroid/elite/updatehealth() . = ..() update_health_hud() - + /mob/living/simple_animal/hostile/asteroid/elite/update_health_hud() if(hud_used) var/severity = 0 @@ -144,7 +145,7 @@ While using this makes the system rely on OnFire, it still gives options for tim gpstag = "Menacing Signal" desc = "You're not quite sure how a signal can be menacing." invisibility = 100 - + /obj/structure/elite_tumor/attack_hand(mob/user) . = ..() if(ishuman(user)) @@ -179,7 +180,7 @@ While using this makes the system rely on OnFire, it still gives options for tim activity = TUMOR_INACTIVE activator = null - + obj/structure/elite_tumor/proc/spawn_elite(var/mob/dead/observer/elitemind) var/selectedspawn = pick(potentialspawns) mychild = new selectedspawn(loc) @@ -199,18 +200,18 @@ obj/structure/elite_tumor/proc/return_elite() if(boosted) mychild.maxHealth = mychild.maxHealth * 2 mychild.health = mychild.maxHealth - + /obj/structure/elite_tumor/Initialize(mapload) . = ..() internal = new/obj/item/gps/internal/elite(src) START_PROCESSING(SSobj, src) - + /obj/structure/elite_tumor/Destroy() STOP_PROCESSING(SSobj, src) mychild = null activator = null return ..() - + /obj/structure/elite_tumor/process() if(isturf(loc)) for(var/mob/living/simple_animal/hostile/asteroid/elite/elitehere in loc) @@ -218,7 +219,7 @@ obj/structure/elite_tumor/proc/return_elite() mychild.adjustHealth(-mychild.maxHealth*0.05) var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(mychild)) H.color = "#FF0000" - + /obj/structure/elite_tumor/attackby(obj/item/I, mob/user, params) . = ..() if(istype(I, /obj/item/organ/regenerative_core) && activity == TUMOR_INACTIVE && !boosted) @@ -232,7 +233,7 @@ obj/structure/elite_tumor/proc/return_elite() desc = "[desc] This one seems to glow with a strong intensity." qdel(core) return TRUE - + /obj/structure/elite_tumor/proc/arena_checks() if(activity != TUMOR_ACTIVE || QDELETED(src)) return @@ -240,13 +241,13 @@ obj/structure/elite_tumor/proc/return_elite() INVOKE_ASYNC(src, .proc/arena_trap) //Gets another arena trap queued up for when this one runs out. INVOKE_ASYNC(src, .proc/border_check) //Checks to see if our fighters got out of the arena somehow. addtimer(CALLBACK(src, .proc/arena_checks), 50) - + /obj/structure/elite_tumor/proc/fighters_check() if(activator != null && activator.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(activator)) onEliteWon() if(mychild != null && mychild.stat == DEAD || activity == TUMOR_ACTIVE && QDELETED(mychild)) onEliteLoss() - + /obj/structure/elite_tumor/proc/arena_trap() var/turf/T = get_turf(src) if(loc == null) @@ -257,7 +258,7 @@ obj/structure/elite_tumor/proc/return_elite() newwall = new /obj/effect/temp_visual/elite_tumor_wall(t, src) newwall.activator = src.activator newwall.ourelite = src.mychild - + /obj/structure/elite_tumor/proc/border_check() if(activator != null && get_dist(src, activator) >= 12) activator.forceMove(loc) @@ -267,7 +268,7 @@ obj/structure/elite_tumor/proc/return_elite() mychild.forceMove(loc) visible_message("[mychild] suddenly reappears above [src]!") playsound(loc,'sound/effects/phasein.ogg', 200, 0, 50, TRUE, TRUE) - + obj/structure/elite_tumor/proc/onEliteLoss() playsound(loc,'sound/effects/tendril_destroyed.ogg', 200, 0, 50, TRUE, TRUE) visible_message("[src] begins to convulse violently before beginning to dissipate.") @@ -286,7 +287,7 @@ obj/structure/elite_tumor/proc/onEliteLoss() mychild = null activator = null qdel(src) - + obj/structure/elite_tumor/proc/onEliteWon() activity = TUMOR_PASSIVE activator = null @@ -300,7 +301,7 @@ obj/structure/elite_tumor/proc/onEliteWon() to_chat(mychild, "As the life in the activator's eyes fade, the forcefield around you dies out and you feel your power subside.\nDespite this inferno being your home, you feel as if you aren't welcome here anymore.\nWithout any guidance, your purpose is now for you to decide.") to_chat(mychild, "Your max health has been halved, but can now heal by standing on your tumor. Note, it's your only way to heal.\nBear in mind, if anyone interacts with your tumor, you'll be resummoned here to carry out another fight. In such a case, you will regain your full max health.\nAlso, be weary of your fellow inhabitants, they likely won't be happy to see you!") to_chat(mychild, "Note that you are a lavaland monster, and thus not allied to the station. You should not cooperate or act friendly with any station crew unless under extreme circumstances!") - + /obj/item/tumor_shard name = "tumor shard" desc = "A strange, sharp, crystal shard from an odd tumor on Lavaland. Stabbing the corpse of a lavaland elite with this will revive them, assuming their soul still lingers. Revived lavaland elites only have half their max health, but are completely loyal to their reviver." @@ -313,7 +314,7 @@ obj/structure/elite_tumor/proc/onEliteWon() w_class = WEIGHT_CLASS_SMALL throw_speed = 3 throw_range = 5 - + /obj/item/tumor_shard/afterattack(atom/target, mob/user, proximity_flag) . = ..() if(istype(target, /mob/living/simple_animal/hostile/asteroid/elite) && proximity_flag) @@ -331,10 +332,11 @@ obj/structure/elite_tumor/proc/onEliteWon() E.health = E.maxHealth E.desc = "[E.desc] However, this one appears appears less wild in nature, and calmer around people." E.sentience_type = SENTIENCE_ORGANIC + E.owner = user qdel(src) else to_chat(user, "[src] only works on the corpse of a sentient lavaland elite.") - + /obj/effect/temp_visual/elite_tumor_wall name = "magic wall" icon = 'icons/turf/walls/hierophant_wall_temp.dmi' @@ -347,7 +349,7 @@ obj/structure/elite_tumor/proc/onEliteWon() color = rgb(255,0,0) light_range = MINIMUM_USEFUL_LIGHT_RANGE light_color = LIGHT_COLOR_RED - + /obj/effect/temp_visual/elite_tumor_wall/Initialize(mapload, new_caster) . = ..() queue_smooth_neighbors(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm index 540470d505..e65c4f5b20 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/pandora.dm @@ -44,34 +44,34 @@ /datum/action/innate/elite_attack/magic_box, /datum/action/innate/elite_attack/pandora_teleport, /datum/action/innate/elite_attack/aoe_squares) - + var/sing_shot_length = 8 var/cooldown_time = 20 - + /datum/action/innate/elite_attack/singular_shot name = "Singular Shot" button_icon_state = "singular_shot" chosen_message = "You are now creating a single linear magic square." chosen_attack_num = SINGULAR_SHOT - + /datum/action/innate/elite_attack/magic_box name = "Magic Box" button_icon_state = "magic_box" chosen_message = "You are now attacking with a box of magic squares." chosen_attack_num = MAGIC_BOX - + /datum/action/innate/elite_attack/pandora_teleport name = "Line Teleport" button_icon_state = "pandora_teleport" chosen_message = "You will now teleport to your target." chosen_attack_num = PANDORA_TELEPORT - + /datum/action/innate/elite_attack/aoe_squares name = "AOE Blast" button_icon_state = "aoe_squares" chosen_message = "Your attacks will spawn an AOE blast at your target location." chosen_attack_num = AOE_SQUARES - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/OpenFire() if(client) switch(chosen_attack) @@ -94,7 +94,7 @@ pandora_teleport(target) if(AOE_SQUARES) aoe_squares(target) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/Life() . = ..() if(health >= maxHealth * 0.5) @@ -105,28 +105,28 @@ return else cooldown_time = 10 - -/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) + +/mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot(target) ranged_cooldown = world.time + (cooldown_time * 0.5) var/dir_to_target = get_dir(get_turf(src), get_turf(target)) var/turf/T = get_step(get_turf(src), dir_to_target) singular_shot_line(sing_shot_length, dir_to_target, T) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/singular_shot_line(var/procsleft, var/angleused, var/turf/T) if(procsleft <= 0) return - new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src, null, null, list(owner)) T = get_step(T, angleused) procsleft = procsleft - 1 addtimer(CALLBACK(src, .proc/singular_shot_line, procsleft, angleused, T), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/magic_box(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) for(var/t in spiral_range_turfs(3, T)) if(get_dist(t, T) > 1) - new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) - + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner)) + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) @@ -135,45 +135,45 @@ new /obj/effect/temp_visual/hierophant/telegraph(source, src) playsound(source,'sound/machines/airlockopen.ogg', 200, 1) addtimer(CALLBACK(src, .proc/pandora_teleport_2, T, source), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_2(var/turf/T, var/turf/source) new /obj/effect/temp_visual/hierophant/telegraph/teleport(T, src) new /obj/effect/temp_visual/hierophant/telegraph/teleport(source, src) for(var/t in RANGE_TURFS(1, T)) - new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner)) for(var/t in RANGE_TURFS(1, source)) - new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner)) animate(src, alpha = 0, time = 2, easing = EASE_OUT) //fade out visible_message("[src] fades out!") density = FALSE addtimer(CALLBACK(src, .proc/pandora_teleport_3, T), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/pandora_teleport_3(var/turf/T) forceMove(T) animate(src, alpha = 255, time = 2, easing = EASE_IN) //fade IN density = TRUE visible_message("[src] fades in!") - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares(target) ranged_cooldown = world.time + cooldown_time var/turf/T = get_turf(target) - new /obj/effect/temp_visual/hierophant/blast/pandora(T, src) + new /obj/effect/temp_visual/hierophant/blast/pandora(T, src, null, null, list(owner)) var/max_size = 2 addtimer(CALLBACK(src, .proc/aoe_squares_2, T, 0, max_size), 2) - + /mob/living/simple_animal/hostile/asteroid/elite/pandora/proc/aoe_squares_2(var/turf/T, var/ring, var/max_size) if(ring > max_size) return for(var/t in spiral_range_turfs(ring, T)) if(get_dist(t, T) == ring) - new /obj/effect/temp_visual/hierophant/blast/pandora(t, src) + new /obj/effect/temp_visual/hierophant/blast/pandora(t, src, null, null, list(owner)) addtimer(CALLBACK(src, .proc/aoe_squares_2, T, (ring + 1), max_size), 2) - + //The specific version of hiero's squares pandora uses /obj/effect/temp_visual/hierophant/blast/pandora damage = 20 monster_damage_boost = FALSE - + //Pandora's loot: Hope /obj/item/clothing/accessory/pandora_hope name = "Hope" @@ -181,7 +181,7 @@ icon = 'icons/obj/lavaland/elite_trophies.dmi' icon_state = "hope" resistance_flags = FIRE_PROOF - + /obj/item/clothing/accessory/pandora_hope/on_uniform_equip(obj/item/clothing/under/U, user) var/mob/living/L = user if(L && L.mind) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm index 05dec578bd..03d2365016 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/mining_mobs.dm @@ -20,7 +20,7 @@ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE mob_size = MOB_SIZE_LARGE var/icon_aggro = null - var/crusher_drop_mod = 5 + var/crusher_drop_mod = 25 /mob/living/simple_animal/hostile/asteroid/Initialize(mapload) . = ..() @@ -58,7 +58,7 @@ /mob/living/simple_animal/hostile/asteroid/death(gibbed) SSblackbox.record_feedback("tally", "mobs_killed_mining", 1, type) var/datum/status_effect/crusher_damage/C = has_status_effect(STATUS_EFFECT_CRUSHERDAMAGETRACKING) - if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 20 creatures before getting the item + if(C && crusher_loot && prob((C.total_damage/maxHealth) * crusher_drop_mod)) //on average, you'll need to kill 4 creatures before getting the item spawn_crusher_loot() ..(gibbed) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm index e3c81b2639..27ebb71c0e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/necropolis_tendril.dm @@ -91,5 +91,5 @@ visible_message("The tendril falls inward, the ground around it widening into a yawning chasm!") for(var/turf/T in range(2,src)) if(!T.density) - T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland) + T.TerraformTurf(/turf/open/chasm/lavaland, /turf/open/chasm/lavaland, flags = CHANGETURF_INHERIT_AIR) qdel(src) diff --git a/code/modules/mob/living/simple_animal/hostile/mushroom.dm b/code/modules/mob/living/simple_animal/hostile/mushroom.dm index 514edf896b..a5e3cd8120 100644 --- a/code/modules/mob/living/simple_animal/hostile/mushroom.dm +++ b/code/modules/mob/living/simple_animal/hostile/mushroom.dm @@ -166,7 +166,9 @@ ..() /mob/living/simple_animal/hostile/mushroom/attack_hand(mob/living/carbon/human/M) - ..() + . = ..() + if(.) // the attack was blocked + return if(M.a_intent == INTENT_HARM) Bruise() diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index d1e10ea693..439ea5b2bf 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -253,33 +253,34 @@ return /mob/living/simple_animal/slime/attack_slime(mob/living/simple_animal/slime/M) - if(..()) //successful slime attack - if(M == src) - return - if(buckled) - Feedstop(silent = TRUE) - visible_message("[M] pulls [src] off!") - return - attacked += 5 - if(nutrition >= 100) //steal some nutrition. negval handled in life() - nutrition -= (50 + (40 * M.is_adult)) - M.add_nutrition(50 + (40 * M.is_adult)) - if(health > 0) - M.adjustBruteLoss(-10 + (-10 * M.is_adult)) - M.updatehealth() + . = ..() + if(!. || M == src) //unsuccessful slime shock + return + if(buckled) + Feedstop(silent = TRUE) + visible_message("[M] pulls [src] off!") + return + attacked += 5 + if(nutrition >= 100) //steal some nutrition. negval handled in life() + nutrition -= (50 + (40 * M.is_adult)) + M.add_nutrition(50 + (40 * M.is_adult)) + if(health > 0) + M.adjustBruteLoss(-10 + (-10 * M.is_adult)) + M.updatehealth() /mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M) . = ..() if(.) attacked += 10 - /mob/living/simple_animal/slime/attack_paw(mob/living/carbon/monkey/M) - if(..()) //successful monkey bite. + . = ..() + if(.)//successful monkey bite. attacked += 10 /mob/living/simple_animal/slime/attack_larva(mob/living/carbon/alien/larva/L) - if(..()) //successful larva bite. + . = ..() + if(.) //successful larva bite. attacked += 10 /mob/living/simple_animal/slime/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0) @@ -321,9 +322,11 @@ attacked += 10 /mob/living/simple_animal/slime/attack_alien(mob/living/carbon/alien/humanoid/M) - if(..()) //if harm or disarm intent. - attacked += 10 - discipline_slime(M) + . = ..() + if(!.) // the attack was blocked or was help/grab intent + return + attacked += 10 + discipline_slime(M) /mob/living/simple_animal/slime/attackby(obj/item/W, mob/living/user, params) diff --git a/code/modules/mob/living/update_icons.dm b/code/modules/mob/living/update_icons.dm new file mode 100644 index 0000000000..8bf0dc98a9 --- /dev/null +++ b/code/modules/mob/living/update_icons.dm @@ -0,0 +1,26 @@ +//IMPORTANT: Multiple animate() calls do not stack well, so try to do them all at once if you can. +/mob/living/update_transform() + var/matrix/ntransform = matrix(transform) //aka transform.Copy() + var/final_pixel_y = pixel_y + var/final_dir = dir + var/changed = 0 + if(lying != lying_prev && rotate_on_lying) + changed++ + ntransform.TurnTo(lying_prev,lying) + if(lying == 0) //Lying to standing + final_pixel_y = get_standard_pixel_y_offset() + else //if(lying != 0) + if(lying_prev == 0) //Standing to lying + pixel_y = get_standard_pixel_y_offset() + final_pixel_y = get_standard_pixel_y_offset(lying) + if(dir & (EAST|WEST)) //Facing east or west + final_dir = pick(NORTH, SOUTH) //So you fall on your side rather than your face or ass + + if(resize != RESIZE_DEFAULT_SIZE) + changed++ + ntransform.Scale(resize) + resize = RESIZE_DEFAULT_SIZE + + if(changed) + animate(src, transform = ntransform, time = 2, pixel_y = final_pixel_y, dir = final_dir, easing = EASE_IN|EASE_OUT) + setMovetype(movement_type & ~FLOATING) // If we were without gravity, the bouncing animation got stopped, so we make sure we restart it in next life(). diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 1a3f2fca3b..b4c3c93824 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -459,6 +459,11 @@ mob/visible_message(message, self_message, blind_message, vision_distance = DEFA if(!ckey || !new_mob) CRASH("transfer_ckey() called [ckey ? "" : "on a ckey-less mob[new_mob ? "" : " and "]"][new_mob ? "" : "without a valid mob target"]!") SEND_SIGNAL(new_mob, COMSIG_MOB_PRE_PLAYER_CHANGE, new_mob, src) + if (client && client.prefs && client.prefs.auto_ooc) + if (client.prefs.chat_toggles & CHAT_OOC && isliving(new_mob)) + client.prefs.chat_toggles ^= CHAT_OOC + if (!(client.prefs.chat_toggles & CHAT_OOC) && isdead(new_mob)) + client.prefs.chat_toggles ^= CHAT_OOC new_mob.ckey = ckey if(send_signal) SEND_SIGNAL(src, COMSIG_MOB_KEY_CHANGE, new_mob, src) @@ -562,9 +567,9 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/is_muzzled() return 0 -/mob/Stat(delayoverride) - . = ..() - var/statdelay = delayoverride || 10 +/mob/Stat() + ..() + if(statpanel("Status")) if (client) stat(null, "Ping: [round(client.lastping, 1)]ms (Average: [round(client.avgping, 1)]ms)") @@ -572,7 +577,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) var/datum/map_config/cached = SSmapping.next_map_config if(cached) stat(null, "Next Map: [cached.map_name]") - stat(null, "Round ID: [GLOB.round_id || "NULL"]") + stat(null, "Round ID: [GLOB.round_id ? GLOB.round_id : "NULL"]") stat(null, "Server Time: [time2text(world.timeofday, "YYYY-MM-DD hh:mm:ss")]") stat(null, "Round Time: [WORLDTIME2TEXT("hh:mm:ss")]") stat(null, "Station Time: [STATION_TIME_TIMESTAMP("hh:mm:ss")]") @@ -582,9 +587,8 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) if(ETA) stat(null, "[ETA] [SSshuttle.emergency.getTimerStr()]") - if(client?.holder) + if(client && client.holder) if(statpanel("MC")) - statdelay = 0 //It's assumed that if you're doing this you are doing debug stuff, don't do ioditic things. var/turf/T = get_turf(client.eye) stat("Location:", COORD(T)) stat("CPU:", "[world.cpu]") @@ -610,7 +614,6 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) GLOB.ahelp_tickets.stat_entry() if(length(GLOB.sdql2_queries)) if(statpanel("SDQL2")) - statdelay = 0 //It's assumed that if you're doing this you are doing debug stuff, don't do ioditic things. stat("Access Global SDQL2 List", GLOB.sdql2_vv_statobj) for(var/i in GLOB.sdql2_queries) var/datum/SDQL2_query/Q = i @@ -634,13 +637,14 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) if(A.IsObscured()) continue statpanel(listed_turf.name, null, A) + + if(mind) add_spells_to_statpanel(mind.spell_list) var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling) if(changeling) add_stings_to_statpanel(changeling.purchasedpowers) add_spells_to_statpanel(mob_spell_list) - sleep(statdelay) /mob/proc/add_spells_to_statpanel(list/spells) for(var/obj/effect/proc_holder/spell/S in spells) @@ -797,11 +801,14 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) //can the mob be buckled to something by default? /mob/proc/can_buckle() - return 1 + return TRUE //can the mob be unbuckled from something by default? /mob/proc/can_unbuckle() - return 1 + return TRUE + +/mob/proc/can_buckle_others(mob/living/target, atom/buckle_to) + return TRUE //Can the mob interact() with an atom? /mob/proc/can_interact_with(atom/A) @@ -953,4 +960,4 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/setMovetype(newval) . = ..() - update_movespeed(FALSE) + update_movespeed(FALSE) \ No newline at end of file diff --git a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm index 8c304d8a2b..56c50078c1 100644 --- a/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm +++ b/code/modules/ninja/suit/n_suit_verbs/ninja_stealth.dm @@ -26,10 +26,9 @@ Contents: /obj/item/clothing/suit/space/space_ninja/proc/enable_signals() if(!affecting) return - RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE), .proc/reduce_stealth) + RegisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE), .proc/reduce_stealth) RegisterSignal(affecting, COMSIG_MOVABLE_BUMP, .proc/bumping_stealth) - /obj/item/clothing/suit/space/space_ninja/proc/reduce_stealth(datum/source) affecting.alpha = min(affecting.alpha + 40, 100) @@ -42,7 +41,7 @@ Contents: return FALSE stealth = !stealth stealth_cooldown = world.time + 5 SECONDS - UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE)) + UnregisterSignal(affecting, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_PARENT_ATTACKBY, COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE)) animate(affecting, alpha = 255, time = 3 SECONDS) affecting.visible_message("[affecting.name] appears from thin air!", \ "You are now visible.") diff --git a/code/modules/paperwork/paperplane.dm b/code/modules/paperwork/paperplane.dm index 2ca6ce2611..f3f7e45378 100644 --- a/code/modules/paperwork/paperplane.dm +++ b/code/modules/paperwork/paperplane.dm @@ -102,7 +102,7 @@ /obj/item/paperplane/throw_impact(atom/hit_atom) if(iscarbon(hit_atom)) var/mob/living/carbon/C = hit_atom - if(C.can_catch_item(TRUE)) + if(!C.get_active_held_item() && !C.restrained()) var/datum/action/innate/origami/origami_action = locate() in C.actions if(origami_action?.active) //if they're a master of origami and have the ability turned on, force throwmode on so they'll automatically catch the plane. C.throw_mode_on() diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index fcc2c6c144..8e121dc809 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -65,7 +65,7 @@ if(delta_temperature > 0 && cold_air_heat_capacity > 0 && hot_air_heat_capacity > 0) - var/efficiency = 0.00025 + (hot_air.reaction_results["fire"]*0.01) + var/efficiency = 0.45 var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 531c6082b0..19fdfd2b7e 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -37,6 +37,7 @@ var/burst_spread = 0 //Spread induced by the gun itself during burst fire per iteration. Only checked if spread is 0. var/randomspread = 1 //Set to 0 for shotguns. This is used for weapons that don't fire all their bullets at once. var/inaccuracy_modifier = 1 + var/pb_knockback = 0 lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' @@ -125,6 +126,10 @@ if(message) if(pointblank) user.visible_message("[user] fires [src] point blank at [pbtarget]!", null, null, COMBAT_MESSAGE_RANGE) + if(pb_knockback > 0) + var/atom/throw_target = get_edge_target_turf(pbtarget, user.dir) + pbtarget.throw_at(throw_target, pb_knockback, 2) + else user.visible_message("[user] fires [src]!", null, null, COMBAT_MESSAGE_RANGE) diff --git a/code/modules/projectiles/guns/ballistic/automatic.dm b/code/modules/projectiles/guns/ballistic/automatic.dm index bcb212a031..7fb4a8232e 100644 --- a/code/modules/projectiles/guns/ballistic/automatic.dm +++ b/code/modules/projectiles/guns/ballistic/automatic.dm @@ -267,6 +267,7 @@ fire_delay = 0 pin = /obj/item/firing_pin/implant/pindicate actions_types = list() + pb_knockback = 2 /obj/item/gun/ballistic/automatic/shotgun/bulldog/unrestricted pin = /obj/item/firing_pin diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index d1a5f12888..31a5131804 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -273,6 +273,7 @@ "Maple" = "dshotgun-l", "Rosewood" = "dshotgun-p" ) + pb_knockback = 3 // it's a super shotgun! /obj/item/gun/ballistic/revolver/doublebarrel/attackby(obj/item/A, mob/user, params) ..() @@ -352,7 +353,7 @@ clumsy_check = 0 /obj/item/gun/ballistic/revolver/reverse/can_trigger_gun(mob/living/user) - if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && user.mind.assigned_role == "Clown")) + if((HAS_TRAIT(user, TRAIT_CLUMSY)) || (user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY))) return ..() if(process_fire(user, user, FALSE, null, BODY_ZONE_HEAD)) user.visible_message("[user] somehow manages to shoot [user.p_them()]self in the face!", "You somehow shoot yourself in the face! How the hell?!") diff --git a/code/modules/projectiles/guns/ballistic/shotgun.dm b/code/modules/projectiles/guns/ballistic/shotgun.dm index 571525d8f0..deec187f88 100644 --- a/code/modules/projectiles/guns/ballistic/shotgun.dm +++ b/code/modules/projectiles/guns/ballistic/shotgun.dm @@ -12,6 +12,8 @@ var/recentpump = 0 // to prevent spammage weapon_weight = WEAPON_MEDIUM + pb_knockback = 2 + /obj/item/gun/ballistic/shotgun/attackby(obj/item/A, mob/user, params) . = ..() if(.) diff --git a/code/modules/projectiles/guns/ballistic/toy.dm b/code/modules/projectiles/guns/ballistic/toy.dm index 8b358832b0..8f9bc13583 100644 --- a/code/modules/projectiles/guns/ballistic/toy.dm +++ b/code/modules/projectiles/guns/ballistic/toy.dm @@ -56,6 +56,7 @@ item_flags = NONE casing_ejector = FALSE can_suppress = FALSE + pb_knockback = 0 /obj/item/gun/ballistic/shotgun/toy/process_chamber(empty_chamber = 0) ..() diff --git a/code/modules/projectiles/pins.dm b/code/modules/projectiles/pins.dm index 1e2070de1b..0465a611cd 100644 --- a/code/modules/projectiles/pins.dm +++ b/code/modules/projectiles/pins.dm @@ -135,7 +135,7 @@ // A gun with ultra-honk pin is useful for clown and useless for everyone else. /obj/item/firing_pin/clown/ultra/pin_auth(mob/living/user) playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1) - if(user && (!(HAS_TRAIT(user, TRAIT_CLUMSY)) && !(user.mind && user.mind.assigned_role == "Clown"))) + if(user && (!(HAS_TRAIT(user, TRAIT_CLUMSY)) && !(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)))) return FALSE return TRUE diff --git a/code/modules/projectiles/projectile/magic.dm b/code/modules/projectiles/projectile/magic.dm index 173d9721a9..791db320a2 100644 --- a/code/modules/projectiles/projectile/magic.dm +++ b/code/modules/projectiles/projectile/magic.dm @@ -93,7 +93,7 @@ /obj/item/projectile/magic/door/proc/CreateDoor(turf/T) var/door_type = pick(door_types) var/obj/structure/mineral_door/D = new door_type(T) - T.ChangeTurf(/turf/open/floor/plating) + T.ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) D.Open() /obj/item/projectile/magic/door/proc/OpenDoor(var/obj/machinery/door/D) diff --git a/code/modules/reagents/chemistry/machinery/chem_master.dm b/code/modules/reagents/chemistry/machinery/chem_master.dm index 1ac62ba651..513626465a 100644 --- a/code/modules/reagents/chemistry/machinery/chem_master.dm +++ b/code/modules/reagents/chemistry/machinery/chem_master.dm @@ -260,7 +260,7 @@ if(!amount) return vol_each = min(reagents.total_volume / amount, 50) - var/name = stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr,"Name:","Name your pill!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/pill/P @@ -287,7 +287,7 @@ adjust_item_drop_location(P) reagents.trans_to(P,vol_each) else - var/name = stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr, "Name:", "Name your pack!", reagents.get_master_reagent_name(), MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/food/condiment/pack/P = new/obj/item/reagent_containers/food/condiment/pack(drop_location()) @@ -313,7 +313,7 @@ if(!amount) return vol_each = min(reagents.total_volume / amount, 40) - var/name = stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr,"Name:","Name your patch!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/pill/P @@ -331,7 +331,7 @@ return if(condi) - var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return var/obj/item/reagent_containers/food/condiment/P = new(drop_location()) @@ -344,7 +344,7 @@ if(text2num(many)) amount_full = round(reagents.total_volume / 30) vol_part = ((reagents.total_volume*1000) % 30000) / 1000 //% operator doesn't support decimals. - var/name = stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr, "Name:","Name your bottle!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return @@ -372,7 +372,7 @@ if(text2num(many)) amount_full = round(reagents.total_volume / 60) vol_part = reagents.total_volume % 60 - var/name = stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr, "Name:","Name your hypovial!", (reagents.total_volume ? reagents.get_master_reagent_name() : " "), MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return @@ -407,7 +407,7 @@ return vol_each = min(reagents.total_volume / amount, 20) - var/name = stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN) + var/name = html_decode(stripped_input(usr,"Name:","Name your SmartDart!", "[reagents.get_master_reagent_name()] ([vol_each]u)", MAX_NAME_LEN)) if(!name || !reagents.total_volume || !src || QDELETED(src) || !usr.canUseTopic(src, !issilicon(usr))) return diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index fd28ff9c47..077ab1fb7a 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -36,7 +36,9 @@ All effects don't start immediately, but rather get worse over time; the rate is */ /datum/reagent/consumable/ethanol/on_mob_life(mob/living/carbon/C) - if(C.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER) + if(HAS_TRAIT(C, TRAIT_NO_ALCOHOL)) + C.adjustToxLoss((boozepwr/25)*REM,forced = TRUE) + else if(C.drunkenness < volume * boozepwr * ALCOHOL_THRESHOLD_MODIFIER) var/booze_power = boozepwr if(HAS_TRAIT(C, TRAIT_ALCOHOL_TOLERANCE)) //we're an accomplished drinker booze_power *= 0.7 diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index 5d31bfae9b..e8551074e7 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -247,6 +247,23 @@ . = 1 ..() +/datum/reagent/consumable/coconutmilk + name = "Coconut Milk" + id = "coconutmilk" + description = "A transparent white liquid extracted from coconuts. Rich in taste." + color = "#DFDFDF" // rgb: 223, 223, 223 + taste_description = "sweet milk" + quality = DRINK_GOOD + glass_icon_state = "glass_white" + glass_name = "glass of coconut milk" + glass_desc = "White and nutritious goodness!" + +/datum/reagent/consumable/coconutmilk/on_mob_life(mob/living/carbon/M) + if(M.getBruteLoss() && prob(20)) + M.heal_bodypart_damage(2,0, 0) + . = 1 + ..() + /datum/reagent/consumable/cream name = "Cream" id = "cream" diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 23eb24ed15..64e693a326 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -622,7 +622,7 @@ M.adjustBruteLoss(-1*REM, 0) M.adjustFireLoss(-1*REM, 0) M.adjustOxyLoss(-1*REM, 0) - M.adjustToxLoss(-1*REM, 0) + M.adjustToxLoss(-1*REM, 0, TRUE) //heals TOXINLOVERs ..() /datum/reagent/consumable/honey/reaction_mob(mob/living/M, method=TOUCH, reac_volume) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 512b8a21a1..bd6eb4244c 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -1870,133 +1870,82 @@ reagent_state = LIQUID color = "#b51d05" taste_description = "carpet" // Your tounge feels furry. + var/carpet_type = /turf/open/floor/carpet /datum/reagent/carpet/reaction_turf(turf/T, reac_volume) if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet) + F.PlaceOnTop(carpet_type, flags = CHANGETURF_INHERIT_AIR) ..() /datum/reagent/carpet/black name = "Liquid Black Carpet" id = "blackcarpet" color = "#363636" - -/datum/reagent/carpet/black/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/black) - ..() + carpet_type = /turf/open/floor/carpet/black /datum/reagent/carpet/blackred name = "Liquid Red Black Carpet" id = "blackredcarpet" color = "#342125" - -/datum/reagent/carpet/blackred/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/blackred) - ..() + carpet_type = /turf/open/floor/carpet/blackred /datum/reagent/carpet/monochrome name = "Liquid Monochrome Carpet" id = "monochromecarpet" color = "#b4b4b4" - -/datum/reagent/carpet/monochrome/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/monochrome) - ..() + carpet_type = /turf/open/floor/carpet/monochrome /datum/reagent/carpet/blue name = "Liquid Blue Carpet" id = "bluecarpet" color = "#1256ff" - -/datum/reagent/carpet/blue/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/blue) - ..() + carpet_type = /turf/open/floor/carpet/blue /datum/reagent/carpet/cyan name = "Liquid Cyan Carpet" id = "cyancarpet" color = "#3acfb9" - -/datum/reagent/carpet/cyan/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/cyan) - ..() + carpet_type = /turf/open/floor/carpet/cyan /datum/reagent/carpet/green name = "Liquid Green Carpet" id = "greencarpet" color = "#619b62" - -/datum/reagent/carpet/green/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/green) - ..() + carpet_type = /turf/open/floor/carpet/green /datum/reagent/carpet/orange name = "Liquid Orange Carpet" id = "orangecarpet" color = "#cc7900" - -/datum/reagent/carpet/orange/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/orange) - ..() + carpet_type = /turf/open/floor/carpet/orange /datum/reagent/carpet/purple name = "Liquid Purple Carpet" id = "purplecarpet" color = "#6d3392" + carpet_type = /turf/open/floor/carpet/purple -/datum/reagent/carpet/purple/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/purple) - ..() /datum/reagent/carpet/red name = "Liquid Red Carpet" id = "redcarpet" color = "#871515" + carpet_type = /turf/open/floor/carpet/red -/datum/reagent/carpet/red/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/red) - ..() /datum/reagent/carpet/royalblack name = "Liquid Royal Black Carpet" id = "royalblackcarpet" color = "#483d05" + carpet_type = /turf/open/floor/carpet/royalblack -/datum/reagent/carpet/royalblack/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/royalblack) - ..() /datum/reagent/carpet/royalblue name = "Liquid Royal Blue Carpet" id = "royalbluecarpet" color = "#24227e" - -/datum/reagent/carpet/royalblue/reaction_turf(turf/T, reac_volume) - if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) - var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/carpet/royalblue) - ..() + carpet_type = /turf/open/floor/carpet/royalblue // Virology virus food chems. diff --git a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm index c170858d98..36621aa662 100644 --- a/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/pyrotechnic_reagents.dm @@ -53,7 +53,7 @@ if(isplatingturf(T)) var/turf/open/floor/plating/F = T if(prob(10 + F.burnt + 5*F.broken)) //broken or burnt plating is more susceptible to being destroyed - F.ScrapeAway() + F.ScrapeAway(flags = CHANGETURF_INHERIT_AIR) if(isfloorturf(T)) var/turf/open/floor/F = T if(prob(reac_volume)) diff --git a/code/modules/reagents/chemistry/recipes/others.dm b/code/modules/reagents/chemistry/recipes/others.dm index eaae548d68..ad349ea926 100644 --- a/code/modules/reagents/chemistry/recipes/others.dm +++ b/code/modules/reagents/chemistry/recipes/others.dm @@ -142,9 +142,9 @@ /datum/chemical_reaction/fermis_plush name = "Fermis plush" id = "fermis_plush" - required_reagents = list("sugar" = 10, "blood" = 10, "stable_plasma" = 10) + required_reagents = list("caramel" = 10, "blood" = 10, "stable_plasma" = 10) mob_react = FALSE - required_temp = 400 + required_temp = 300 /datum/chemical_reaction/fermis_plush/on_reaction(datum/reagents/holder, created_volume) var/location = get_turf(holder.my_atom) diff --git a/code/modules/reagents/chemistry/recipes/special.dm b/code/modules/reagents/chemistry/recipes/special.dm index 59394e6e4b..08d07b8a52 100644 --- a/code/modules/reagents/chemistry/recipes/special.dm +++ b/code/modules/reagents/chemistry/recipes/special.dm @@ -123,24 +123,11 @@ GLOBAL_LIST_INIT(food_reagents, build_reagents_to_food()) //reagentid = related /datum/chemical_reaction/randomized/proc/LoadOldRecipe(recipe_data) created = text2num(recipe_data["timestamp"]) - - var/req_reag = unwrap_reagent_list(recipe_data["required_reagents"]) - if(!req_reag) - return FALSE - required_reagents = req_reag - - var/req_catalysts = unwrap_reagent_list(recipe_data["required_catalysts"]) - if(!req_catalysts) - return FALSE - required_catalysts = req_catalysts - + required_reagents = SANITIZE_LIST(recipe_data["required_reagents"]) + required_catalysts = SANITIZE_LIST(recipe_data["required_catalysts"]) required_temp = recipe_data["required_temp"] is_cold_recipe = recipe_data["is_cold_recipe"] - - var/temp_results = unwrap_reagent_list(recipe_data["results"]) - if(!temp_results) - return FALSE - results = temp_results + results = SANITIZE_LIST(recipe_data["results"]) var/containerpath = text2path(recipe_data["required_container"]) if(!containerpath) return FALSE diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 618b74fffb..b31b5c600d 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -19,18 +19,38 @@ var/container_HP = 2 var/cached_icon +/obj/item/reagent_containers/verb/set_APTFT(mob/user) //set amount_per_transfer_from_this + set name = "Set Transfer Amount" + set category = "Object" + var/N = input("Amount per transfer from this:","[src]") as null|anything in possible_transfer_amounts + if(N) + amount_per_transfer_from_this = N + to_chat(user, "[src]'s transfer amount is now [amount_per_transfer_from_this] units.") + /obj/item/reagent_containers/Initialize(mapload, vol) . = ..() if(isnum(vol) && vol > 0) volume = vol + if(!possible_transfer_amounts) + src.verbs -= /obj/item/reagent_containers/verb/set_APTFT create_reagents(volume, reagent_flags) if(spawned_disease) var/datum/disease/F = new spawned_disease() var/list/data = list("blood_DNA" = "UNKNOWN DNA", "blood_type" = "SY","viruses"= list(F)) reagents.add_reagent("blood", disease_amount, data) - add_initial_reagents() +/obj/item/reagent_containers/examine(mob/user) + . = ..() + . += "Currently transferring [amount_per_transfer_from_this] units per use." + if(possible_transfer_amounts && user.Adjacent(src)) + . += "Alt-click it to set its transfer amount." + +/obj/item/reagent_containers/AltClick(mob/user) + . = ..() + if(possible_transfer_amounts && user.Adjacent(src)) + set_APTFT() + /obj/item/reagent_containers/proc/add_initial_reagents() if(list_reagents) reagents.add_reagent_list(list_reagents) diff --git a/code/modules/reagents/reagent_containers/borghydro.dm b/code/modules/reagents/reagent_containers/borghydro.dm index 2bd5fb2d9f..94ad5fdb2c 100644 --- a/code/modules/reagents/reagent_containers/borghydro.dm +++ b/code/modules/reagents/reagent_containers/borghydro.dm @@ -26,12 +26,11 @@ Borg Hypospray var/bypass_protection = 0 //If the hypospray can go through armor or thick material var/list/datum/reagents/reagent_list = list() - var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin", "salglu_solution") + var/list/reagent_ids = list("dexalin", "kelotane", "bicaridine", "antitoxin", "epinephrine", "spaceacillin", "salglu_solution", "insulin") var/accepts_reagent_upgrades = TRUE //If upgrades can increase number of reagents dispensed. var/list/modes = list() //Basically the inverse of reagent_ids. Instead of having numbers as "keys" and strings as values it has strings as keys and numbers as values. //Used as list for input() in shakers. - /obj/item/reagent_containers/borghypo/Initialize() . = ..() @@ -40,12 +39,10 @@ Borg Hypospray START_PROCESSING(SSobj, src) - /obj/item/reagent_containers/borghypo/Destroy() STOP_PROCESSING(SSobj, src) return ..() - /obj/item/reagent_containers/borghypo/process() //Every [recharge_time] seconds, recharge some reagents for the cyborg charge_tick++ if(charge_tick >= recharge_time) @@ -162,7 +159,7 @@ Borg Hypospray icon_state = "borghypo_s" charge_cost = 20 recharge_time = 2 - reagent_ids = list("syndicate_nanites", "potass_iodide", "morphine") + reagent_ids = list("syndicate_nanites", "potass_iodide", "morphine", "insulin") bypass_protection = 1 accepts_reagent_upgrades = FALSE @@ -178,7 +175,6 @@ Borg Shaker charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("beer", "orangejuice", "grenadine", "limejuice", "tomatojuice", "cola", "tonic", "sodawater", "ice", "cream", "whiskey", "vodka", "rum", "gin", "tequila", "vermouth", "wine", "kahlua", "cognac", "ale", "milk", "coffee", "banana", "lemonjuice") /obj/item/reagent_containers/borghypo/borgshaker/attack(mob/M, mob/user) @@ -234,23 +230,21 @@ Borg Shaker charge_cost = 20 //Lots of reagents all regenerating at once, so the charge cost is lower. They also regenerate faster. recharge_time = 3 accepts_reagent_upgrades = FALSE - reagent_ids = list("fakebeer", "fernet") /obj/item/reagent_containers/borghypo/peace name = "Peace Hypospray" - - reagent_ids = list("dizzysolution","tiresolution","synthpax") + reagent_ids = list("dizzysolution", "tiresolution", "synthpax", "insulin") accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/peace/hacked desc = "Everything's peaceful in death!" icon_state = "borghypo_s" - reagent_ids = list("dizzysolution","tiresolution","synthpax","tirizene","sulfonal","sodium_thiopental","cyanide","fentanyl") + reagent_ids = list("dizzysolution", "tiresolution", "synthpax", "tirizene", "sulfonal", "sodium_thiopental", "cyanide", "fentanyl") accepts_reagent_upgrades = FALSE /obj/item/reagent_containers/borghypo/epi - name = "epinephrine injector" + name = "Stabilizer injector" desc = "An advanced chemical synthesizer and injection system, designed to stabilize patients." - reagent_ids = list("epinephrine") + reagent_ids = list("epinephrine", "insulin") accepts_reagent_upgrades = FALSE diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 3ed505c360..1b213fed0f 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -109,11 +109,13 @@ /obj/item/reagent_containers/glass/beaker name = "beaker" - desc = "A beaker. It can hold up to 50 units. Unable to withstand extreme pHes" + desc = "A beaker. It can hold up to 60 units. Unable to withstand extreme pHes." icon = 'icons/obj/chemical.dmi' + volume = 60 icon_state = "beaker" item_state = "beaker" materials = list(MAT_GLASS=500) + possible_transfer_amounts = list(5,10,15,20,25,30,50,60) beaker_weakness_bitflag = PH_WEAK /obj/item/reagent_containers/glass/beaker/Initialize() @@ -156,28 +158,28 @@ /obj/item/reagent_containers/glass/beaker/jar name = "honey jar" - desc = "A jar for honey. It can hold up to 50 units of sweet delight. Unable to withstand reagents of an extreme pH." + desc = "A jar for honey. It can hold up to 60 units of sweet delight. Unable to withstand reagents of an extreme pH." icon = 'icons/obj/chemical.dmi' icon_state = "vapour" /obj/item/reagent_containers/glass/beaker/large name = "large beaker" - desc = "A large beaker. Can hold up to 100 units. Unable to withstand reagents of an extreme pH." + desc = "A large beaker. Can hold up to 120 units. Unable to withstand reagents of an extreme pH." icon_state = "beakerlarge" materials = list(MAT_GLASS=2500) - volume = 100 + volume = 120 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100) + possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120) container_HP = 3 /obj/item/reagent_containers/glass/beaker/plastic name = "x-large beaker" - desc = "An extra-large beaker. Can hold up to 150 units. Is able to resist acid and alkaline solutions, but melts at 444K" + desc = "An extra-large beaker. Can hold up to 180 units. Is able to resist acid and alkaline solutions, but melts at 444 K." icon_state = "beakerwhite" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000) - volume = 150 + volume = 180 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100,150) + possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120,180) /obj/item/reagent_containers/glass/beaker/plastic/Initialize() beaker_weakness_bitflag &= ~PH_WEAK @@ -191,14 +193,14 @@ /obj/item/reagent_containers/glass/beaker/meta name = "metamaterial beaker" - desc = "A large beaker. Can hold up to 200 units. Is able to withstand all chemical situations." + desc = "A large beaker. Can hold up to 240 units, and is able to withstand all chemical situations." icon_state = "beakergold" materials = list(MAT_GLASS=2500, MAT_PLASTIC=3000, MAT_GOLD=1000, MAT_TITANIUM=1000) - volume = 200 + volume = 240 amount_per_transfer_from_this = 10 - possible_transfer_amounts = list(5,10,15,20,25,30,50,100,200) + possible_transfer_amounts = list(5,10,15,20,25,30,40,50,60,120,200,240) -/obj/item/reagent_containers/glass/beaker/meta/Initialize() +/obj/item/reagent_containers/glass/beaker/meta/Initialize() // why the fuck can't you just set the beaker weakness bitflags to nothing? fuck you beaker_weakness_bitflag &= ~PH_WEAK . = ..() @@ -228,7 +230,7 @@ volume = 300 amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,20,25,30,50,100,300) - container_HP = 4 + container_HP = 5 /obj/item/reagent_containers/glass/beaker/cryoxadone list_reagents = list("cryoxadone" = 30) @@ -339,6 +341,7 @@ materials = list(MAT_GLASS=0) volume = 50 amount_per_transfer_from_this = 10 + possible_transfer_amounts = list(5,10,15,20,25,30,50) container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/Initialize() @@ -355,6 +358,7 @@ list_reagents = list("water" = 100) volume = 100 amount_per_transfer_from_this = 20 + possible_transfer_amounts = list(5,10,15,20,25,30,50,100) container_HP = 1 /obj/item/reagent_containers/glass/beaker/waterbottle/large/empty diff --git a/code/modules/reagents/reagent_containers/hypovial.dm b/code/modules/reagents/reagent_containers/hypovial.dm index ba5ce48a4a..1f83e895bb 100644 --- a/code/modules/reagents/reagent_containers/hypovial.dm +++ b/code/modules/reagents/reagent_containers/hypovial.dm @@ -1,6 +1,6 @@ //hypovials used with the MkII hypospray. See hypospray.dm. -/obj/item/reagent_containers/glass/bottle/vial +/obj/item/reagent_containers/glass/bottle/vial // these have literally no fucking right to just be better beakers that you can shit out of a chemmaster name = "broken hypovial" desc = "A hypovial compatible with most hyposprays." icon_state = "hypovial" @@ -27,6 +27,8 @@ for(var/R in comes_with) reagents.add_reagent(R,comes_with[R]) update_icon() +// beaker_weakness_bitflag |= PH_WEAK // fuck you if you're using these like beakers +// beaker_weakness_bitflag |= TEMP_WEAK /obj/item/reagent_containers/glass/bottle/vial/on_reagent_change() @@ -60,11 +62,11 @@ /obj/item/reagent_containers/glass/bottle/vial/small name = "hypovial" volume = 60 - possible_transfer_amounts = list(5,10) + possible_transfer_amounts = list(1,2,5,10,20) /obj/item/reagent_containers/glass/bottle/vial/small/bluespace volume = 120 - possible_transfer_amounts = list(5,10) + possible_transfer_amounts = list(1,2,5,10,20) name = "bluespace hypovial" icon_state = "hypovialbs" unique_reskin = null @@ -74,7 +76,7 @@ desc = "A large hypovial, for deluxe hypospray models." icon_state = "hypoviallarge" volume = 120 - possible_transfer_amounts = list(5,10,15,20) + possible_transfer_amounts = list(1,2,5,10,20) unique_reskin = list("large hypovial" = "hypoviallarge", "large red hypovial" = "hypoviallarge-b", "large blue hypovial" = "hypoviallarge-d", @@ -106,7 +108,7 @@ add_overlay(filling) /obj/item/reagent_containers/glass/bottle/vial/large/bluespace - possible_transfer_amounts = list(5,10,15,20) + possible_transfer_amounts = list(1,2,5,10,20) name = "bluespace large hypovial" volume = 240 icon_state = "hypoviallargebs" diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 7701e58616..46ddb1e2ed 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) /obj/machinery/conveyor/inverted/Initialize(mapload) . = ..() if(mapload && !(dir in GLOB.diagonals)) - log_game("### MAPPING ERROR: [src] at [AREACOORD(src)] spawned without using a diagonal dir. Please replace with a normal version.") + log_mapping("[src] at [AREACOORD(src)] spawned without using a diagonal dir. Please replace with a normal version.") // Auto conveyour is always on unless unpowered diff --git a/code/modules/research/designs/biogenerator_designs.dm b/code/modules/research/designs/biogenerator_designs.dm index 05e4c667f6..2be4d106b6 100644 --- a/code/modules/research/designs/biogenerator_designs.dm +++ b/code/modules/research/designs/biogenerator_designs.dm @@ -51,6 +51,22 @@ make_reagents = list() category = list("initial","Food") +/datum/design/enzyme + name = "10u Universal Enzyme" + id = "enzyme" + build_type = BIOGENERATOR + materials = list(MAT_BIOMASS = 30) + make_reagents = list("enzyme" = 10) + category = list("initial","Food") + +/datum/design/flour_sack + name = "Flour Sack" + id = "flour_sack" + build_type = BIOGENERATOR + materials = list(MAT_BIOMASS = 150) + build_path = /obj/item/reagent_containers/food/condiment/flour + category = list("initial","Food") + /datum/design/monkey_cube name = "Monkey Cube" id = "mcube" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index e70362553c..f2ded3a57b 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -152,6 +152,16 @@ category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL +/datum/design/telescopiciv + name = "Telescopic IV Drip" + desc = "An IV drip with an advanced infusion pump that can both drain blood into and inject liquids from attached containers. Blood packs are processed at an accelerated rate. This one is telescopic, and can be picked up and put down." + id = "telescopiciv" + build_type = PROTOLATHE + materials = list(MAT_METAL = 5000, MAT_GLASS = 3500, MAT_SILVER = 1000) + build_path = /obj/item/tele_iv + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + /datum/design/holobarrier_med name = "PENLITE holobarrier projector" desc = "PENLITE holobarriers, a device that halts individuals with malicious diseases." diff --git a/code/modules/research/designs/nanite_designs.dm b/code/modules/research/designs/nanite_designs.dm index 177d7073a1..09fe1d9c9b 100644 --- a/code/modules/research/designs/nanite_designs.dm +++ b/code/modules/research/designs/nanite_designs.dm @@ -25,6 +25,20 @@ program_type = /datum/nanite_program/viral category = list("Utility Nanites") +/datum/design/nanites/research + name = "Distributed Computing" + desc = "The nanites aid the research servers by performing a portion of its calculations, increasing research point generation." + id = "research_nanites" + program_type = /datum/nanite_program/research + category = list("Utility Nanites") + +/datum/design/nanites/researchplus + name = "Neural Network" + desc = "The nanites link the host's brains together forming a neural research network, that becomes more efficient with the amount of total hosts. Can be overloaded to increase research output." + id = "researchplus_nanites" + program_type = /datum/nanite_program/researchplus + category = list("Utility Nanites") + /datum/design/nanites/monitoring name = "Monitoring" desc = "The nanites monitor the host's vitals and location, sending them to the suit sensor network." @@ -39,6 +53,13 @@ program_type = /datum/nanite_program/triggered/self_scan category = list("Utility Nanites") +/datum/design/nanites/dermal_button + name = "Dermal Button" + desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." + id = "dermal_button_nanites" + program_type = /datum/nanite_program/dermal_button + category = list("Utility Nanites") + /datum/design/nanites/stealth name = "Stealth" desc = "The nanites hide their activity and programming from superficial scans." @@ -46,6 +67,15 @@ program_type = /datum/nanite_program/stealth category = list("Utility Nanites") + +/datum/design/nanites/reduced_diagnostics + name = "Reduced Diagnostics" + desc = "Disables some high-cost diagnostics in the nanites, making them unable to communicate their program list to portable scanners. \ + Doing so saves some power, slightly increasing their replication speed." + id = "red_diag_nanites" + program_type = /datum/nanite_program/reduced_diagnostics + category = list("Utility Nanites") + /datum/design/nanites/access name = "Subdermal ID" desc = "The nanites store the host's ID access rights in a subdermal magnetic strip. Updates when triggered, copying the host's current access." diff --git a/code/modules/research/nanites/nanite_programs/utility.dm b/code/modules/research/nanites/nanite_programs/utility.dm index a269d01ac0..3db482d989 100644 --- a/code/modules/research/nanites/nanite_programs/utility.dm +++ b/code/modules/research/nanites/nanite_programs/utility.dm @@ -130,7 +130,7 @@ /datum/nanite_program/stealth name = "Stealth" - desc = "The nanites hide their activity and programming from superficial scans." + desc = "The nanites mask their activity from superficial scans, becoming undetectable by HUDs and non-specialized scanners." rogue_types = list(/datum/nanite_program/toxic) use_rate = 0.2 @@ -142,6 +142,22 @@ . = ..() nanites.stealth = FALSE +/datum/nanite_program/reduced_diagnostics + name = "Reduced Diagnostics" + desc = "Disables some high-cost diagnostics in the nanites, making them unable to communicate their program list to portable scanners. \ + Doing so saves some power, slightly increasing their replication speed." + rogue_types = list(/datum/nanite_program/toxic) + use_rate = -0.1 + +/datum/nanite_program/reduced_diagnostics/enable_passive_effect() + . = ..() + nanites.diagnostics = FALSE + +/datum/nanite_program/reduced_diagnostics/disable_passive_effect() + . = ..() + nanites.diagnostics = TRUE + + /datum/nanite_program/relay name = "Relay" desc = "The nanites receive and relay long-range nanite signals." @@ -271,3 +287,138 @@ if(fault == src) return fault.software_error() + +/datum/nanite_program/dermal_button + name = "Dermal Button" + desc = "Displays a button on the host's skin, which can be used to send a signal to the nanites." + extra_settings = list("Sent Code","Button Name","Icon","Color") + unique = FALSE + var/datum/action/innate/nanite_button/button + var/button_name = "Button" + var/icon = "power" + var/color = "green" + var/sent_code = 0 + +/datum/nanite_program/dermal_button/set_extra_setting(user, setting) + if(setting == "Sent Code") + var/new_code = input(user, "Set the sent code (1-9999):", name, null) as null|num + if(isnull(new_code)) + return + sent_code = CLAMP(round(new_code, 1), 1, 9999) + if(setting == "Button Name") + var/new_button_name = stripped_input(user, "Choose the name for the button.", "Button Name", button_name, MAX_NAME_LEN) + if(!new_button_name) + return + button_name = new_button_name + if(setting == "Icon") + var/new_icon = input("Select the icon to display on the button:", name) as null|anything in list("one","two","three","four","five","plus","minus","power") + if(!new_icon) + return + icon = new_icon + if(setting == "Color") + var/new_color = input("Select the color of the button's icon:", name) as null|anything in list("green","red","yellow","blue") + if(!new_color) + return + color = new_color + +/datum/nanite_program/dermal_button/get_extra_setting(setting) + if(setting == "Sent Code") + return sent_code + if(setting == "Button Name") + return button_name + if(setting == "Icon") + return capitalize(icon) + if(setting == "Color") + return capitalize(color) + +/datum/nanite_program/dermal_button/copy_extra_settings_to(datum/nanite_program/dermal_button/target) + target.sent_code = sent_code + target.button_name = button_name + target.icon = icon + target.color = color + +/datum/nanite_program/dermal_button/enable_passive_effect() + . = ..() + if(!button) + button = new(src, button_name, icon, color) + button.target = host_mob + button.Grant(host_mob) + +/datum/nanite_program/dermal_button/disable_passive_effect() + . = ..() + if(button) + button.Remove(host_mob) + +/datum/nanite_program/dermal_button/on_mob_remove() + . = ..() + qdel(button) + +/datum/nanite_program/dermal_button/proc/press() + if(activated) + host_mob.visible_message("[host_mob] presses a button on [host_mob.p_their()] forearm.", + "You press the nanite button on your forearm.", null, 2) + SEND_SIGNAL(host_mob, COMSIG_NANITE_SIGNAL, sent_code, "a [name] program") + +/datum/action/innate/nanite_button + name = "Button" + icon_icon = 'icons/mob/actions/actions_items.dmi' + check_flags = AB_CHECK_RESTRAINED|AB_CHECK_STUN|AB_CHECK_CONSCIOUS + button_icon_state = "power_green" + var/datum/nanite_program/dermal_button/program + +/datum/action/innate/nanite_button/New(datum/nanite_program/dermal_button/_program, _name, _icon, _color) + ..() + program = _program + name = _name + button_icon_state = "[_icon]_[_color]" + +/datum/action/innate/nanite_button/Activate() + program.press() + +/datum/nanite_program/research + name = "Distributed Computing" + desc = "The nanites aid the research servers by performing a portion of its calculations, increasing research point generation." + use_rate = 0.2 + rogue_types = list(/datum/nanite_program/toxic) + +/datum/nanite_program/research/active_effect() + if(!iscarbon(host_mob)) + return + var/points = 1 + if(!host_mob.client) //less brainpower + points *= 0.25 + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points)) + +/datum/nanite_program/researchplus + name = "Neural Network" + desc = "The nanites link the host's brains together forming a neural research network, that becomes more efficient with the amount of total hosts." + use_rate = 0.3 + rogue_types = list(/datum/nanite_program/brain_decay) + +/datum/nanite_program/researchplus/enable_passive_effect() + . = ..() + if(!iscarbon(host_mob)) + return + if(host_mob.client) + SSnanites.neural_network_count++ + else + SSnanites.neural_network_count += 0.25 + +/datum/nanite_program/researchplus/disable_passive_effect() + . = ..() + if(!iscarbon(host_mob)) + return + if(host_mob.client) + SSnanites.neural_network_count-- + else + SSnanites.neural_network_count -= 0.25 + +/datum/nanite_program/researchplus/active_effect() + if(!iscarbon(host_mob)) + return + var/mob/living/carbon/C = host_mob + var/points = round(SSnanites.neural_network_count / 12, 0.1) + if(!C.client) //less brainpower + points *= 0.25 + SSresearch.science_tech.add_point_list(list(TECHWEB_POINT_TYPE_GENERIC = points)) + diff --git a/code/modules/research/nanites/program_disks.dm b/code/modules/research/nanites/program_disks.dm index 86b7803fc9..f780f40932 100644 --- a/code/modules/research/nanites/program_disks.dm +++ b/code/modules/research/nanites/program_disks.dm @@ -130,4 +130,16 @@ program_type = /datum/nanite_program/pacifying /obj/item/disk/nanite_program/stun - program_type = /datum/nanite_program/triggered/stun \ No newline at end of file + program_type = /datum/nanite_program/triggered/stun + +/obj/item/disk/nanite_program/dermal_button + program_type = /datum/nanite_program/dermal_button + +/obj/item/disk/nanite_program/research + program_type = /datum/nanite_program/research + +/obj/item/disk/nanite_program/researchplus + program_type = /datum/nanite_program/researchplus + +/obj/item/disk/nanite_program/reduced_diagnostics + program_type = /datum/nanite_program/reduced_diagnostics \ No newline at end of file diff --git a/code/modules/research/techweb/all_nodes.dm b/code/modules/research/techweb/all_nodes.dm index 6877ba71f6..af4148d194 100644 --- a/code/modules/research/techweb/all_nodes.dm +++ b/code/modules/research/techweb/all_nodes.dm @@ -71,7 +71,7 @@ display_name = "Biological Technology" description = "What makes us tick." //the MC, silly! prereq_ids = list("base") - design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen") + design_ids = list("medicalkit", "chem_heater", "chem_master", "chem_dispenser", "sleeper", "vr_sleeper", "pandemic", "defibmount", "operating", "soda_dispenser", "beer_dispenser", "healthanalyzer", "blood_bag", "bloodbankgen", "telescopiciv") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -960,7 +960,7 @@ prereq_ids = list("datatheory","robotics") design_ids = list("nanite_disk","nanite_remote","nanite_scanner",\ "nanite_chamber","public_nanite_chamber","nanite_chamber_control","nanite_programmer","nanite_program_hub","nanite_cloud_control",\ - "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites") + "relay_nanites", "monitoring_nanites", "access_nanites", "repairing_nanites","sensor_nanite_volume", "repeater_nanites", "relay_repeater_nanites","red_diag_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -969,7 +969,7 @@ display_name = "Smart Nanite Programming" description = "Nanite programs that require nanites to perform complex actions, act independently, roam or seek targets." prereq_ids = list("nanite_base","adv_robotics") - design_ids = list("purging_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites") + design_ids = list("purging_nanites", "research_nanites", "metabolic_nanites", "stealth_nanites", "memleak_nanites","sensor_voice_nanites", "voice_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2000) export_price = 4000 @@ -978,7 +978,7 @@ display_name = "Mesh Nanite Programming" description = "Nanite programs that require static structures and membranes." prereq_ids = list("nanite_base","engineering") - design_ids = list("hardening_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites") + design_ids = list("hardening_nanites", "dermal_button_nanites", "refractive_nanites", "cryo_nanites", "conductive_nanites", "shock_nanites", "emp_nanites", "temperature_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) export_price = 5000 @@ -1015,7 +1015,7 @@ display_name = "Harmonic Nanite Programming" description = "Nanite programs that require seamless integration between nanites and biology." prereq_ids = list("nanite_bio","nanite_smart","nanite_mesh") - design_ids = list("fakedeath_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites") + design_ids = list("fakedeath_nanites","researchplus_nanites","aggressive_nanites","defib_nanites","regenerative_plus_nanites","brainheal_plus_nanites","purging_plus_nanites","adrenaline_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4000) export_price = 8000 diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm index caa2ca7adf..76897b5276 100644 --- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm +++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm @@ -108,7 +108,7 @@ if (levels.len) dest = locate(T.x, T.y, pick(levels)) - T.ChangeTurf(/turf/open/chasm) + T.ChangeTurf(/turf/open/chasm, flags = CHANGETURF_INHERIT_AIR) var/turf/open/chasm/C = T C.set_target(dest) C.drop(user) diff --git a/code/modules/spells/spell_types/conjure.dm b/code/modules/spells/spell_types/conjure.dm index 3ebded7487..38a2d5bddd 100644 --- a/code/modules/spells/spell_types/conjure.dm +++ b/code/modules/spells/spell_types/conjure.dm @@ -31,7 +31,7 @@ if(ispath(summoned_object_type, /turf)) var/turf/O = spawn_place var/N = summoned_object_type - O.ChangeTurf(N) + O.ChangeTurf(N, flags = CHANGETURF_INHERIT_AIR) else var/atom/summoned_object = new summoned_object_type(spawn_place) diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm index 8b8328abbe..d97d466e4d 100644 --- a/code/modules/spells/spell_types/devil.dm +++ b/code/modules/spells/spell_types/devil.dm @@ -234,7 +234,7 @@ dancefloor_exists = FALSE for(var/i in 1 to dancefloor_turfs.len) var/turf/T = dancefloor_turfs[i] - T.ChangeTurf(dancefloor_turfs_types[i]) + T.ChangeTurf(dancefloor_turfs_types[i], flags = CHANGETURF_INHERIT_AIR) else var/list/funky_turfs = RANGE_TURFS(1, user) for(var/turf/closed/solid in funky_turfs) @@ -248,7 +248,7 @@ var/turf/T = t dancefloor_turfs[i] = T dancefloor_turfs_types[i] = T.type - T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b) + T.ChangeTurf((i % 2 == 0) ? /turf/open/floor/light/colour_cycle/dancefloor_a : /turf/open/floor/light/colour_cycle/dancefloor_b, flags = CHANGETURF_INHERIT_AIR) i++ /datum/effect_system/smoke_spread/transparent/dancefloor_devil diff --git a/code/modules/spells/spell_types/godhand.dm b/code/modules/spells/spell_types/godhand.dm index 8108b121ae..c4a2b4aa7e 100644 --- a/code/modules/spells/spell_types/godhand.dm +++ b/code/modules/spells/spell_types/godhand.dm @@ -216,4 +216,4 @@ P.original = user P.firer = user P.fire() - return ..() \ No newline at end of file + return ..() diff --git a/code/modules/spells/spell_types/touch_attacks.dm b/code/modules/spells/spell_types/touch_attacks.dm index 794ed797ad..5f984fa7e3 100644 --- a/code/modules/spells/spell_types/touch_attacks.dm +++ b/code/modules/spells/spell_types/touch_attacks.dm @@ -78,8 +78,8 @@ hand_path = /obj/item/melee/touch_attack/nuclearfist school = "evocation" - charge_max = 200 + charge_max = 100 clothes_req = 0 - cooldown_min = 40 + cooldown_min = 20 - action_icon_state = "nuclearfist" \ No newline at end of file + action_icon_state = "nuclearfist" diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index dedff3ae04..161461d099 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -560,7 +560,7 @@ else if((findtext(message, honk_words))) cooldown = COOLDOWN_MEME addtimer(CALLBACK(GLOBAL_PROC, .proc/playsound, get_turf(user), 'sound/items/bikehorn.ogg', 300, 1), 25) - if(user.mind && user.mind.assigned_role == "Clown") + if(user.mind && HAS_TRAIT(user.mind, TRAIT_CLOWN_MENTALITY)) for(var/mob/living/carbon/C in listeners) C.slip(140 * power_multiplier) cooldown = COOLDOWN_MEME @@ -807,9 +807,8 @@ E.enthrallTally += (power_multiplier*(((length(message))/200) + 1)) //encourage players to say more than one word. else E.enthrallTally += power_multiplier*1.25 //thinking about it, I don't know how this can proc - if(L.canbearoused) - if(L.client?.prefs.lewdchem) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) + if(L.canbearoused && E.lewd) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] is so nice to listen to."), 5) E.cooldown += 1 //REWARD mixable works @@ -820,7 +819,7 @@ power_multiplier *= distancelist[get_dist(user, V)+1] if(L == user) continue - if (L.client?.prefs.lewdchem) + if (E.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[E.enthrallGender] has praised me!!"), 5) if(HAS_TRAIT(L, TRAIT_NYMPHO)) L.adjustArousalLoss(2*power_multiplier) @@ -832,7 +831,7 @@ addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "I've been praised for doing a good job!"), 5) E.resistanceTally -= power_multiplier E.enthrallTally += power_multiplier - var/descmessage = "[(L.client?.prefs.lewdchem?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" + var/descmessage = "[(E.lewd?"I feel so happy! I'm a good pet who [E.enthrallGender] loves!":"I did a good job!")]" SEND_SIGNAL(L, COMSIG_ADD_MOOD_EVENT, "enthrallpraise", /datum/mood_event/enthrallpraise, descmessage) E.cooldown += 1 @@ -841,10 +840,10 @@ for(var/V in listeners) var/mob/living/L = V var/datum/status_effect/chem/enthrall/E = L.has_status_effect(/datum/status_effect/chem/enthrall) - var/descmessage = "[(L.client?.prefs.lewdchem?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" + var/descmessage = "[(E.lewd?"I've failed [E.enthrallGender]... What a bad, bad pet!":"I did a bad job...")]" if(L == user) continue - if (L.client?.prefs.lewdchem) + if (E.lewd) if(HAS_TRAIT(L, TRAIT_MASO)) L.adjustArousalLoss(3*power_multiplier) descmessage += "And yet, it feels so good..!" //I don't really understand masco, is this the right sort of thing they like? @@ -871,7 +870,7 @@ var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") C.silent = 0 - if(C.client?.prefs.lewdchem) + if(E.lewd) addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.enthrallGender]"), 5) else addtimer(CALLBACK(C, /atom/movable/proc/say, "[E.master]"), 5) @@ -887,7 +886,7 @@ E.phase = 3 E.status = null user.emote("snap") - if(L.client?.prefs.lewdchem) + if(E.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of your [E.enthrallGender]'s fingers brings you back to your enthralled state, obedient and ready to serve.
    "), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "The snapping of [E.master]'s fingers brings you back to being under their influence."), 5) @@ -910,11 +909,11 @@ addtimer(CALLBACK(H, /atom/movable/proc/say, "I feel happy being with you."), 5) continue if(2) - speaktrigger += "[(H.client?.prefs.lewdchem?"I think I'm in love with you... ":"I find you really inspirational, ")]" //' + speaktrigger += "[(E.lewd?"I think I'm in love with you... ":"I find you really inspirational, ")]" //' if(3) - speaktrigger += "[(H.client?.prefs.lewdchem?"I'm devoted to being your pet":"I'm commited to following your cause!")]! " + speaktrigger += "[(E.lewd?"I'm devoted to being your pet":"I'm commited to following your cause!")]! " if(4) - speaktrigger += "[(H.client?.prefs.lewdchem?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!! + speaktrigger += "[(E.lewd?"You are my whole world and all of my being belongs to you, ":"I cannot think of anything else but aiding your cause, ")] "//Redflags!! //mood var/datum/component/mood/mood = H.GetComponent(/datum/component/mood) @@ -1003,7 +1002,7 @@ speaktrigger += "I feel like I'm on the brink of losing my mind, " //horny - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem) + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) switch(H.getArousalLoss()) if(40 to 60) speaktrigger += "I'm feeling a little horny, " @@ -1013,10 +1012,10 @@ speaktrigger += "I'm really, really horny, " //collar - if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && H.client?.prefs.lewdchem) + if(istype(H.wear_neck, /obj/item/clothing/neck/petcollar) && E.lewd) speaktrigger += "I love the collar you gave me, " //End - if(H.client?.prefs.lewdchem) + if(E.lewd) speaktrigger += "[E.enthrallGender]!" else speaktrigger += "[user.first_name()]!" @@ -1044,7 +1043,7 @@ REMOVE_TRAIT(C, TRAIT_MUTE, "enthrall") C.silent = 0 E.cooldown += 3 - to_chat(user, "You [(C.client?.prefs.lewdchem?"allow [C] to speak again":"encourage [C] to speak again")].") + to_chat(user, "You [(E.lewd?"allow [C] to speak again":"encourage [C] to speak again")].") //Antiresist @@ -1074,7 +1073,7 @@ for(var/mob/living/carbon/C in listeners) var/datum/status_effect/chem/enthrall/E = C.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase == 4) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You're unable to forget about [(C.client?.prefs.lewdchem?"the dominating presence of [E.enthrallGender]":"[E.master]")]!"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You're unable to forget about [(E.lewd?"the dominating presence of [E.enthrallGender]":"[E.master]")]!"), 5) continue addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You wake up, forgetting everything that just happened. You must've dozed off..? How embarassing!"), 5) C.Sleeping(50) @@ -1086,7 +1085,7 @@ if(3) E.phase = 0 E.cooldown = 0 - if(C.client?.prefs.lewdchem) + if(E.lewd) addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to yourself before being enthralled by your [E.enthrallGender], with no memory of what happened."), 5) else addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You revert to who you were before, with no memory of what happened with [E.master]."), 5) @@ -1112,7 +1111,7 @@ var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) if(E.phase > 1) - if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && H.client?.prefs.lewdchem) // probably a redundant check but for good measure + if(HAS_TRAIT(H, TRAIT_NYMPHO) && H.canbearoused && E.lewd) // probably a redundant check but for good measure addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Your [E.enthrallGender] pushes you over the limit, overwhelming your body with pleasure."), 5) H.mob_climax(forced_climax=TRUE) H.SetStun(20) @@ -1168,7 +1167,7 @@ for(var/obj/item/W in items) if(W == H.wear_suit) H.dropItemToGround(W, TRUE) - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(H.client?.prefs.lewdchem?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "Before you can even think about it, you quickly remove your clothes in response to [(E.lewd?"your [E.enthrallGender]'s command'":"[E.master]'s directive'")]."), 5) E.cooldown += 10 //WALK @@ -1206,7 +1205,7 @@ if(2 to INFINITY) L.lay_down() E.cooldown += 10 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(L.client?.prefs.lewdchem?"You eagerly lie down!":"You suddenly lie down!")]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, L, "[(E.lewd?"You eagerly lie down!":"You suddenly lie down!")]"), 5) to_chat(user, "You encourage [L] to lie down.") //KNOCKDOWN @@ -1237,7 +1236,7 @@ for (var/trigger in E.customTriggers) speaktrigger += "[trigger], " to_chat(user, "[C] whispers, \"[speaktrigger] are my triggers.\"")//So they don't trigger themselves! - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(C.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")]."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, C, "You whisper your triggers to [(E.lewd?"Your [E.enthrallGender]":"[E.master]")]."), 5) //CUSTOM TRIGGERS @@ -1249,7 +1248,7 @@ if (get_dist(user, H) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to give them a new trigger!") continue - if(!H.client?.prefs.lewdchem) + if(!E.lewd) to_chat(user, "[H] seems incapable of being implanted with triggers.") continue else @@ -1272,7 +1271,7 @@ E.customTriggers[trigger] = trigger2 log_game("FERMICHEM: [H] has been implanted by [user] with [trigger], triggering [trigger2].") E.mental_capacity -= 5 - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"your [E.enthrallGender]":"[E.master]")] whispers you a new trigger."), 5) to_chat(user, "You sucessfully set the trigger word [trigger] in [H]") else to_chat(user, "Your pet looks at you confused, it seems they don't understand that effect!") @@ -1290,7 +1289,7 @@ if (get_dist(user, H) > 1)//Requires user to be next to their pet. to_chat(user, "You need to be next to your pet to give them a new echophrase!") continue - if(!H.client?.prefs.lewdchem) + if(!E.lewd) to_chat(user, "[H] seems incapable of being implanted with an echoing phrase.") continue else @@ -1334,7 +1333,7 @@ objective = replacetext(lowertext(objective), "suicide", "self-love") message_admins("[H] has been implanted by [user] with the objective [objective].") log_game("FERMICHEM: [H] has been implanted by [user] with the objective [objective] via MKUltra.") - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"Your [E.enthrallGender]":"[E.master]")] whispers you a new objective."), 5) brainwash(H, objective) E.mental_capacity -= 200 to_chat(user, "You sucessfully give an objective to [H]") @@ -1348,7 +1347,7 @@ for(var/V in listeners) var/mob/living/carbon/human/H = V var/datum/status_effect/chem/enthrall/E = H.has_status_effect(/datum/status_effect/chem/enthrall) - if(E.phase >= 3 && H.client?.prefs.lewdchem) + if(E.phase >= 3 && E.lewd) var/instill = stripped_input(user, "Instill an emotion in [H].", MAX_MESSAGE_LEN) to_chat(H, "[instill]") to_chat(user, "You sucessfully instill a feeling in [H]") @@ -1363,7 +1362,7 @@ if(E.phase > 1) if(user.ckey == E.enthrallID && user.real_name == E.master.real_name) E.master = user - addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(H.client?.prefs.lewdchem?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) + addtimer(CALLBACK(GLOBAL_PROC, .proc/to_chat, H, "[(E.lewd?"You hear the words of your [E.enthrallGender] again!! They're back!!":"You recognise the voice of [E.master].")]"), 5) to_chat(user, "[H] looks at you with sparkling eyes, recognising you!") //I dunno how to do state objectives without them revealing they're an antag diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index a2a9c37cfd..1415604aff 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -21,7 +21,7 @@ /obj/vehicle/sealed/car/clowncar/auto_assign_occupant_flags(mob/M) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.mind && H.mind.assigned_role == "Clown") //Ensures only clowns can drive the car. (Including more at once) + if(H.mind && HAS_TRAIT(H.mind, TRAIT_CLOWN_MENTALITY)) //Ensures only clowns can drive the car. (Including more at once) add_control_flags(M, VEHICLE_CONTROL_DRIVE|VEHICLE_CONTROL_PERMISSION) return add_control_flags(M, VEHICLE_CONTROL_KIDNAPPED) diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index 626abd51ef..6144f4c57a 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -70,14 +70,22 @@ /obj/item/clothing/under/skirt/red = 3, /obj/item/clothing/under/skirt/purple = 3, /obj/item/clothing/under/sundress = 4, + /obj/item/clothing/under/sundresswhite = 4, /obj/item/clothing/under/stripeddress = 3, /obj/item/clothing/under/sailordress = 3, + /obj/item/clothing/under/sweptskirt = 3, + /obj/item/clothing/under/greendress = 3, + /obj/item/clothing/under/pinkdress = 3, /obj/item/clothing/under/redeveninggown = 3, /obj/item/clothing/under/blacktango = 3, + /obj/item/clothing/under/westernbustle = 3, + /obj/item/clothing/under/flamenco = 3, + /obj/item/clothing/under/flowerdress = 3, /obj/item/clothing/under/plaid_skirt = 3, /obj/item/clothing/under/plaid_skirt/blue = 3, /obj/item/clothing/under/plaid_skirt/purple = 3, /obj/item/clothing/under/plaid_skirt/green = 3, + /obj/item/clothing/under/croptop = 3, /obj/item/clothing/glasses/regular = 2, /obj/item/clothing/glasses/regular/jamjar = 2, /obj/item/clothing/head/sombrero = 3, diff --git a/code/modules/vending/megaseed.dm b/code/modules/vending/megaseed.dm index 5c092c3659..03241c4a86 100644 --- a/code/modules/vending/megaseed.dm +++ b/code/modules/vending/megaseed.dm @@ -14,6 +14,7 @@ /obj/item/seeds/chanter = 3, /obj/item/seeds/chili = 3, /obj/item/seeds/cocoapod = 3, + /obj/item/seeds/coconut = 3, /obj/item/seeds/coffee = 3, /obj/item/seeds/cotton = 3, /obj/item/seeds/corn = 3, diff --git a/html/changelog.html b/html/changelog.html index 8eabba83df..60412299cf 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,328 @@ -->
    +

    30 December 2019

    +

    AnturK updated:

    +
      +
    • Fixed ranged syndicate mobs stormtrooper training.
    • +
    +

    Arturlang updated:

    +
      +
    • Adds Bloodsuckers, beware.
    • +
    +

    BlueWildrose updated:

    +
      +
    • Fixed stargazers being unable to link to themselves if mindshielded or if holding psionic shielding devices (tinfoil hats) when the species is set.
    • +
    • Fixes non-roundstart slimes being unable to wag their tail.
    • +
    +

    Commandersand updated:

    +
      +
    • added two words to clown filter
    • +
    • Added new things to loadouts, check em
    • +
    +

    DeltaFire15 updated:

    +
      +
    • Clock cult kindle no longer cares about oxygen damage
    • +
    • changed mecha internals access for some special mechs.
    • +
    • no more mech maintenance access for engineers.
    • +
    • All heads of staff can now message CC
    • +
    • Removes a magicnumber
    • +
    • Rebalanced cult vs cult stun effects to debuff instead of stun
    • +
    +

    Detective-Google updated:

    +
      +
    • short hair 80's is no longer jank
    • +
    +

    Fermis updated:

    +
      +
    • tweaked how super bases/acids work but limiting them
    • +
    +

    Fikou updated:

    +
      +
    • the windup toolbox now has some more "realistic" sounds
    • +
    • the windup toolbox now rumbles again
    • +
    +

    Ghommie updated:

    +
      +
    • Fixed hulks, sleeping carp users, pacifists and people with chunky fingers being able to unrestrictly use gun and pneumatic cannon circuit assemblies.
    • +
    • Fixed gun circuit assemblies being only usable by human mobs.
    • +
    • Doubled the locomotion circuit external cooldown, thus halving the movable assemblies' movespeed.
    • +
    • Made wooden cabinet/closets... actually made of wood.
    • +
    • Wooden cabinets are now deconstructable with a screwdriver.
    • +
    • Deconstruction of large crates and other closet subtypes deconstructable with tools other than the welder is no longer instant.
    • +
    • You shouldn't be able to target objects you can't see (excluding darkness) with the ARCD and RLD
    • +
    • The admin RCD is ranged too, just like the ARCD.
    • +
    • Fixed welding, thirteen loko, welding and wraith spectacles not blinding people as expected. Thank you all whomst reported this issue in the suggestions box channel instead of the github repository's issues section, very smart!
    • +
    • Fixed on_mob eyes overlays not updating properly in certain cases.
    • +
    • Fixed deconversion from bloodshot eyes blood cult resetting your eyes' color to pitch black instead of their previous color, more or less.
    • +
    • Spinfusor nerf: Upped the casing and ammo box size by one step, removed the projectile's dismemberment value (explosions can still rip a limb or two off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents from 32 to 8, removed the casing's ability to explode when thrown.
    • +
    • Fixes bubblegum's death not unlocking the arena shuttle buyment.
    • +
    • Fixed alien tech node not being unlockable with subtypes of the accepted items.
    • +
    • Fixed reactive armor onmob overlays not updating when toggled and reactive teleport armor still using forceMove() instead of do_teleport()
    • +
    • Fixed space hermit asteroid rocks unintendedly spawning airless asteroid turf when mined, save for the perimeter.
    • +
    • Fixes reviver implant having been a crapshot ever since soft-crit was introduced years ago.
    • +
    • Added a "convalescence" time (about 15 seconds) after the user is out of unconsciousbess/crit to ensure they are properly stabilized.
    • +
    • Added a 15 minutes hardcap for accumulated revive cooldown (equivalent to 150 points of brute or burn healed) above which the implant starts cooling down regardless of user's conditions.
    • +
    • Fixed AI core displays I may have broken with my coding extravaganza.
    • +
    • Blue, Amber and Red security alert sounds should be half as loud now.
    • +
    • Buffed clown ops by removing their clumsiness and adding a new trait to be used in place of several clown role checks.
    • +
    • Clown ops too also suffer from not holding or wearing clown shoes now.
    • +
    • Fixed a few holo barriers lacking transparency.
    • +
    • Fixed character setup preview bodyparts not displaying correctly most of times.
    • +
    • Fixed character appearance preview displaying the mannequin in job attire instead of undergarments.
    • +
    • Fixed raven's shuttle computer not being of the emergency shuttle type.
    • +
    • Blood bank generators can now be anchored and unanchored now.
    • +
    • Ghost mentors can now orbit around the target instead of setting their view to theirs'.
    • +
    • Fixes a ghostchat eavesdropping exploit concerning VR.
    • +
    • Fixes VR deaths being broadcasted in deadchat.
    • +
    • Fixed a few pill bottle issues with the ChemMaster.
    • +
    • Fixes a few negative quirks not being properly removed when deleted.
    • +
    • Phobia and mute quirks are no longer cheesed by brain surgery grade healing or medicines.
    • +
    • Fixed double-flavour (and bland custom) ice creams.
    • +
    • Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'.
    • +
    • dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just like humies, ayys and monkys.
    • +
    • Stops humanoids whose skin_tone variable is set to "albino" from showing up as pale when examined should their species not use skintones anyway.
    • +
    • Removed the old (almost) unused roboticist encryption key and headset.
    • +
    • Fixed goose meat.
    • +
    • Fixed a little door assembly glass dupe exploit
    • +
    • Fixed AI holopad speech text being small and whispers that in multiple exclamation marks echo through multiple areas.
    • +
    • Removed literally atrocious polka dotted accessories. They were even more atrocious than the yellow horrible tie.
    • +
    +

    Ghommie (also porting PRs by AnturK and Arkatos) updated:

    +
      +
    • Fixed light eaters not burning out borg lamplights and flashes. fix Fixed light eater not affecting open turfs emitting lights such as light tiles and fairy grass.
    • +
    • Fixed an empty reference about light eater armblade disintegration after Heart of Darkness removal.
    • +
    +

    Ghommie, Skogol updated:

    +
      +
    • refactored altclick interaction to allow alt-click interactable objects to parent call without forcing the turf contents stat menu open.
    • +
    • Alt clicking will no longer show turf contents for items inside bags etc.
    • +
    • Alt clicking the source of your turf contents stat menu will now close said menu.
    • +
    +

    GrayRachnid updated:

    +
      +
    • fixes consistency
    • +
    +

    Hatterhat updated:

    +
      +
    • Regenerative nanites, a "chemical" used in the combat stimulant injector. Actually quite stimulating, and not bad in a pinch for a nuclear operative. Check the Combat Medic Kit!
    • +
    • The Combat Medic Kit now has an advanced health analyzer and medisprays instead of patches and a chloral syringe.
    • +
    • The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get the better injector, because nobody uses it and so nobody's bothered to update it.
    • +
    • .357 speedloaders can now be printed with the Advanced Illegal Ballistics node on the tech tree!
    • +
    • okay so i may have given the .357 an extra speedloader at the same cost but it comes in a box now
    • +
    +

    ItzGabby updated:

    +
      +
    • Fixed AltClick on polychromic collars so they actually work now.
    • +
    +

    KeRSedChaplain updated:

    +
      +
    • Extends the file "deltakalaxon.ogg" to a 38 second .ogg.
    • +
    +

    Linzolle updated:

    +
      +
    • neck slice. harm intent someone's head while they are unconscious or in a neck grab to make them bleed uncontrollably.
    • +
    • officer's sabre now properly makes the unsheating and resheating noise
    • +
    • fireman failure has a different message depending on the circumstance
    • +
    • Abductor chem dispenser, and added it to the abductor console.
    • +
    • "Superlingual matrix" to the abductor console. It's the abductor's tongue. Can be used to link it to your abductor communication channel and then implanted into a test subject.
    • +
    • Shrink ray and added it to the abductor console.
    • +
    • Shrink ray sound effect (its the fucking mega man death sound)
    • +
    • special jumpsuit for abductors
    • +
    • abductor jumpsuit, including digi version if a digitigrade person somehow manages to get their hands on it. sprites for the shrink ray and chem dispenser.
    • +
    • new glands to play with, including the all-access gland, the quantum gland, and the blood type randomiser.
    • +
    • split every gland into its own file instead of all being in one file
    • +
    • cosmic coat crafting recipe changed to coat + cosmic bedsheet
    • +
    +

    Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac updated:

    +
      +
    • Certain incompatible quirks can no longer be taken together.
    • +
    • If an admin sends a ghost back to the lobby, they can now choose a different set of quirks.
    • +
    • the quirk menu went through some minor formatting changes.
    • +
    • Podcloning now lets you keep your quirks.
    • +
    • Quirks have flavor text in medical records.
    • +
    • All quirk medical records refer to "Patient", removing a few instances of "Subject".
    • +
    • Quirks no longer apply to off-station roundstart antagonists.
    • +
    • Mood quirks are now only processed by the quirk holders
    • +
    +

    Narcissisko (ported by Hatterhat) updated:

    +
      +
    • Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547.
    • +
    +

    Nervere and subject217, Militaires, py01, nemvar updated:

    +
      +
    • The cook's CQC now only works when in the kitchen or the kitchen backroom.
    • +
    • corrected CQC help instructions
    • +
    • CQC and Sleeping Carp are properly logged.
    • +
    • CQC can passively grab targets when not on grab intent. Passive grabs do not count towards combos for CQC or Sleeping carp.
    • +
    • Martial Art and NOGUN cleanup.
    • +
    +

    PersianXerxes updated:

    +
      +
    • Removed night vision quirk
    • +
    +

    Putnam updated:

    +
      +
    • acute hepatic pharmacokinesis now works if you already have relevant genitals
    • +
    • Contamination is no longer an infinitely spreading deadly contagion causing mass panic
    • +
    • Dynamic rulesets have lower weight if a round recently featured them (except traitor).
    • +
    +

    Putnam3145 updated:

    +
      +
    • Buffed HE pipes by making them realistically radiate away heat.
    • +
    • Dynamic has a (totally unused for any relevant purpose) roundstart report now.
    • +
    • A whole bunch of dynamic data is now available for statbus
    • +
    • Dynamic from-ghost antags no longer double dip on threat refunds when the mode fails due to not enough applications.
    • +
    • whoops broke quirks
    • +
    • quirks work
    • +
    • New tab in preferences screen: "ERP preferences"
    • +
    • New opt-outs for individual effects of incubus draught, succubus milk
    • +
    • Acute hepatic pharmacokinesis has been removed, replaced with above
    • +
    • Renamed "Toggle Lewdchem" to "Toggle Lewd MKUltra", since that's what it actually means, and made it toggle the "hypno" setting (rename it again if more hypno mechanics are added).
    • +
    • Made MKUltra's lewd messages require both people involved to have hypno opted-in.
    • +
    • Buncha dynamic config tweaks
    • +
    • Ghost cafe spawns are actual ghost roles by the game's reckoning now
    • +
    • a runtime in radioactive contamination
    • +
    • Bomb armor now acts like other armor types.
    • +
    • Devastation-level explosions on armorless people no longer destroys everything in their bags.
    • +
    +

    Seris02 updated:

    +
      +
    • the clowns headset
    • +
    • distance checks
    • +
    • the sprites
    • +
    • added the runed and brass winter coats (cosmetic ratvarian/narsian)
    • +
    • how the narsian/ratvarian coats can be made
    • +
    • fixes some ghost roles from dying of stupid shit
    • +
    • pandoras attacking their owners
    • +
    • Added Rising Bass and the shifting scroll.
    • +
    • Changes the martial arts scroll in the uplink to "Sleeping Carp Scroll"
    • +
    +

    ShizCalev updated:

    +
      +
    • Fixed floodlights not turning off properly when they're underpowered.
    • +
    • Fixed emitters not changing icons properly when they're underpowered.
    • +
    +

    Sishen1542 updated:

    +
      +
    • Clicking a pack of seeds with a pen allows you to set the plant's name, description and the pack of seeds' description. Useful for differentiating genetically modified plants. These changes will persist through different generations of the plant.
    • +
    • Hydroponics trays update their name and description to reflect the plant inside them. They revert to default when emptied.
    • +
    +

    Toriate updated:

    +
      +
    • Polychromic shorts now have a digitigrade state
    • +
    +

    Trilbyspaceclone updated:

    +
      +
    • ports all the new donuts, burgars, and chicken stuff from RG
    • +
    • ports new snowcone
    • +
    • ports grill
    • +
    • ports beakfeast tag/mood lit as TG has it
    • +
    • ports all the amazing new sprites
    • +
    • ports crafting for many things like snowcones needing water
    • +
    • ports of many craftings
    • +
    • lowers fryers sound
    • +
    • ported icons for new food/grill
    • +
    • ports the deletion of some icons and images
    • +
    • ports a spell check for the snowcones
    • +
    • ports fixes for stuff I didnt know were even broken with snowcones
    • +
    • coder cat failers to push the last commit from year(s) ago
    • +
    • Updates the changlogs
    • +
    • meat hook from HUGE to bulky
    • +
    • CE hardsuit is now more rad-proof
    • +
    • Wrong icon names, missing dog fashion with telegram hat
    • +
    • New softdrink that comes in its own vender!
    • +
    • Honey now has a reaction with plants
    • +
    • Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar not 2
    • +
    • Blaster shotguns back into armory
    • +
    • Removed Lighters in thunderdomes
    • +
    • Silicons now know what a slime is saying!
    • +
    • honey now will not kill slimes. Honey slimepeople can be a thing now, go sci.
    • +
    • Added insulin into many of the borg hypo's
    • +
    +

    Useroth updated:

    +
      +
    • bamboo which can be used to build punji sticks/ blowguns available as a sugarcane mutation or in exotic seed crate
    • +
    • changed the sugar cane growth stages because fuck if I know why, but it was in the PR
    • +
    • New lavaland ruin: Pulsating tumor
    • +
    • New class of lavaland mobs, a bit weaker than megafauna but still stronger than most of what you normally see
    • +
    • Ghost cafe spawner. For letting people spawn as their own character in the ninja holding facility. It bypasses the usual check, so people who have suicided/ghosted/cryod may use it.
    • +
    • Dorms in the ninja holding facility.
    • +
    +

    Xantholne updated:

    +
      +
    • Santa Hats to Loadout and Clothesmate
    • +
    • Christmas Wintercoats to Loadout and Clothesmate
    • +
    • Christmas male and female uniforms to loadout and Clothesmate
    • +
    • Red, Green, and Traditional Santa boots to loadout and Clothesmate
    • +
    • Christmas Socks, Red candycane socks, Green candycane socks to sock selection
    • +
    +

    kappa-sama updated:

    +
      +
    • legion drops more crates now
    • +
    • .357 speedloaders in autolathes are now individual bullets instead, speedloaders are now illegal tech, costs less total metal to make 7 bullets than a previous speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to make 5 7.62mm bullets than getting a clip from the seclathe.
    • +
    • mentions that you can refill speedloaders on .357 uplink description
    • +
    • you can now strip people while aggrograbbing or higher
    • +
    • plasmafist to wizard
    • +
    • modular is gone
    • +
    • martial apprentices for the local Chinese wizard
    • +
    • broodmother baby lag
    • +
    • you can no longer get 100k credits by spending 4k roundstart
    • +
    • cooking oil in sunflowers instead of corn oil
    • +
    • throats are no longer slit happy
    • +
    +

    keronshb updated:

    +
      +
    • Adds reflector blobs to shield blob upgrades
    • +
    +

    kevinz000 updated:

    +
      +
    • Launchpads can now take number inputs for offsets rather than just buttons.
    • +
    • nanites no longer spread through air blocking objects
    • +
    • Night vision readded as a darkness dampening effect rather than darksight.
    • +
    • conveyors can only stack items on tiles to 150 now.
    • +
    • added 8 character save slots
    • +
    • Cargo shuttle now silently ignores slaughter demons/revenants instead of being blocked even while they are jaunted. A drawback is that manifested ones can't block it either, any more.
    • +
    • flashbangs process light/sound separately and uses viewers(), so xray users beware.
    • +
    • Stat() slowed down for anti-lag measures.
    • +
    • sprint/stamina huds now work again
    • +
    • Combat defibs now instant stun on disarm rather than 1 second again
    • +
    • Defibs are now always emagged when emagged with an emag rather than EMP.
    • +
    • aooc toggling now only broadcasts to antagonists
    • +
    • Antag rep proc is now easier to read and supports returning a list.
    • +
    • Clockwork marauders are now on a configured summon cooldown if being summoned on station. They also rapidly bleed health while in or next to space. And they glow brighter.
    • +
    +

    lolman360 updated:

    +
      +
    • Added ability to pick up certain simplemobs.
    • +
    +

    nemvar updated:

    +
      +
    • The brains of roundstart borgs no longer decay.
    • +
    • Refactored the visibility of reagents for mobs.
    • +
    +

    nicbn, Kevinz000, ShizCalev updated:

    +
      +
    • Fire alarm is now simpler. Touch it to activate, touch it to deactivate. When activated, it will blink inconsistently if it is emagged.
    • +
    • You can no longer spam fire alarms. Also, they're logged again.
    • +
    • Fixed fire alarms not updating icons properly after being emagged and hacked by Malf AI's.
    • +
    +

    r4d6 updated:

    +
      +
    • Added a N2O pressure tank
    • +
    • Removed a AM Shielding from the crate
    • +
    • Added Handshakes
    • +
    • Added Nose booping
    • +
    • Added submaps for the SM, Tesla and Singulo
    • +
    • Added a placeholder on Boxstation for the Engines
    • +
    • fixed Nose boops not triggering
    • +
    +

    shellspeed1 updated:

    +
      +
    • Adds Insect markings
    • +
    • Adds three new moth wings.
    • +
    +

    07 December 2019

    AffectedArc07 updated:

      @@ -546,2067 +868,6 @@ _Kathrin's Box Beautification:_
      • Added Departements Winter Coats to the loadout list.
      - -

      04 November 2019

      -

      4dplanner, MMiracles updated:

      -
        -
      • Wizard shapeshift now converts damage taken while transformed
      • -
      • transform spell transfers damage correctly instead of healing most of the time
      • -
      • 0% simplemob health maps to 0 carbon health, 100% simplemob to 100% carbon
      • -
      • transforming to a form with brute resistance no longer heals you
      • -
      • transforming back to a species with brute resistance no longer heals you
      • -
      -

      AdmiralPancakes1 updated:

      -
        -
      • Cryo cell shortcuts: alt-click toggles the doors, ctrl-click toggles the power
      • -
      -

      Alonefromhell updated:

      -
        -
      • Ported Oracle UI, a framework for self-updating and neat UI's
      • -
      • Paper now uses OUI
      • -
      • Bins now use OUI
      • -
      • fixes tootip offset
      • -
      -

      AnalWerewolf updated:

      -
        -
      • Fritz plushie
      • -
      • Donor item
      • -
      -

      Anonymous updated:

      -
        -
      • More crusader armor variants to pick from armament: Teutonic and Hospitaller.
      • -
      -

      Arturlang updated:

      -
        -
      • You can now use CTRL and ALT click on pumps and filters to toggle them on and off and max their output respectively
      • -
      • You can now use RPDs on windows and grilles.
      • -
      • The RD can now suplex a immovable rod. Good fucking luck.
      • -
      • Fixes high alert ERT suit sprites. You can see them now!
      • -
      • Traitor codewords are now highlighted for traitors.
      • -
      • You can now examine pumps filters and mixers to see if you can use CTRL and Alt click on them.
      • -
      • Fixes brain damage/trauma healing nanites so they actually work while there are only traumas.
      • -
      • Advanced toxin filtration nanites now heal slimes
      • -
      -

      Bhijn updated:

      -
        -
      • It's now possible to forcefully eject the occupants of a dogborg's sleeper by using a crowbar on them. This action is instant.
      • -
      • Resist values for dogborg sleepers have been adjusted. The baseline has been decreased from 30 seconds to 15 seconds. Medihound sleepers have a resist timer of 3 seconds. Sechound sleepers retain a resist timer of 30 seconds.
      • -
      • It now takes 10 full seconds to insert people into your sleeper. This should hopefully give people some more room to breathe and react to a dogborg attempting to sleeper someone either for no reason or in a way that violates law 2.
      • -
      • Warp whistles no longer grant permanent invulnerability and invisibility
      • -
      • You can now actually use the resist hotkey to resist out of handcuffs. Woah, revolutionary
      • -
      • the `!tgs poly` command now actually works
      • -
      • Poly now has a 0.01% chance per squawk to speak through the TGS relay.
      • -
      • The point production mode of radiation collectors has been reverted to the original behavior of using all of the stored power every process cycle instead of just 4% of it
      • -
      • Radiation collectors now display the amount of power/research points they're producing per minute rather than per process cycle, which should hopefully clear up a lot of confusion.
      • -
      • Radiation collectors also display what's happening to the gas within them, which should make it a lot more obvious as to how you get tritium.
      • -
      • Security borgs and K9s are now only available during red alert or higher.
      • -
      • Headmins or other folks with access to the server's config can choose the minimum alert level for secborgs to be chosen via the MINIMUM_SECBORG_ALERT config option. See the default game_options.txt for more info.
      • -
      • The server no longer attempts to check if the CID matches the IP of any bans, or if the IP matches any CIDs of any active bans, during client analyzation
      • -
      • Vampires can now only ventcrawl in bat form if their blood level is below the bad blood volume (224 blood total)
      • -
      • Vampires now only take 5 burn per mob life cycle while within chapel areas, down from the original 20 burn per life cycle.
      • -
      • K9 pounces have received a minor rework. It now has an effective cooldown of 2.5 seconds, can now only deal up to 120 staminaloss, deals a maximum of 80 stamloss on hit, has a spoolup of half a second, and now has telegraphing in the form of a quiet noise.
      • -
      • K9s now only have 80 health
      • -
      • Secborgs (but not k9s) now have a hybrid taser. This can be toggled via server config.
      • -
      • The disabler cooler upgrade now applies to all energy-based firearms for borgs
      • -
      • Dogborg jaws are now capable of incapacitating targets if using help intent. This deals a hard stun depending on how much staminaloss the target has, and whether or not they're resting. This behavior can be toggled via server config.
      • -
      • K9 jaws now have 15 force, up from their nerfed 10 force.
      • -
      • Borg flashes regained their ability to cause knockdown. This can be toggled via server config.
      • -
      • The WEAKEN_SECBORG config option will disable the new dogborg jaws mechanic and make secborgs spawn with a standard disabler.
      • -
      • The DISABLE_BORG_FLASH_KNOCKDOWN will disable the ability for borg flashes to knockdown.
      • -
      • Jukeboxes now have 6 audio channels available to them, up from the previous accidental 2 and previously intended 5 channels.
      • -
      • Jukeboxes now work again on clients running versions higher than 512.1459.
      • -
      • People will no longer have their ears consumed by an eldritch god if multiple jukeboxes are active and the first jukebox in the jukebox list stops playing, then tries to play again
      • -
      • Instead of the debug text for invalid jukebox behavior being printed to world, the debug text is now restricted to the runtime panel.
      • -
      -

      BurgerB updated:

      -
        -
      • Tweaked the UI of the loadout to be less cluttered due to an issue with formatting.
      • -
      -

      BurgerBB updated:

      -
        -
      • Adds the bonermeter; a device that measures arousal based statistics.
      • -
      • Added a new input to the electrostimulator that controls the strength of the shock. It accepts negative inputs which reduce arousal. Added a new output to the electrostimulator that displays the amount of arousal gained.
      • -
      • Rebalanced the electro-stimulator to be less spammy by giving it a 2.5 second enforced cooldown per circuit contraption. Increased the complexity of electro stimulator from 10 to 15.
      • -
      • Reworked the Vent Clog event to spray smoke instead of foam, also made it shoot smoke over time instead through each vent instead of all at once.
      • -
      • Increased the spawn area of the City of Cogs (Reebe). This does not affect the area in which builders can build.
      • -
      • Significantly tweaks the Wizard race transformation event to be less unreasonably troublesome.
      • -
      • Adds a new 0 cost trait that makes you immune* to Crocin and Hexacrocin
      • -
      • Tweaks how slurring works so it's more of a gradual change into slurring instead of immediate.
      • -
      • Slurring is now directly proportional to your drunkenness, with other sources of slur being added on top of it.
      • -
      • Bras are now separate from underwear, meaning you can mix and match bras if you're into that.
      • -
      • Men can wear female accessory clothing, and females can wear men accessory clothing. It's not a fetish, mom, it's PROGRESSIVE.
      • -
      • Reorganized accessories into their own files to prevent a massive 1000 line file.
      • -
      • i'm 10% sure that merging this PR will cause preference corruption sooooooooooo I just need to hear from @deathride58 or perhaps someone else on how much damage this could possibly do.
      • -
      • Tweaked penis.
      • -
      • Rebalanced penis.
      • -
      • Added the following reagents to the common list of vent clog reagents: ~~Cooking Oil~~, ~~Frost Oil~~, Sodium Chloride, Corn Oil, Uranium, Carpet, Firefighting Foam, semen, femcum, tear juice, strange reagent, ~~spraytan~~.
      • -
      • Vent Clog smoke emits the same transparent smoke as a smoke machine, including how much it transfers. Vent Clogs also do not trigger in areas deemed "Safe" in code, such as in the dorms or trusted areas where dangerous things shouldn't occur.
      • -
      • Adds additional random brain damage text
      • -
      • Adds penis enlargement pills.
      • -
      • Adds Stun Circuit and Pneumatic Cannon Integrated Circuits
      • -
      • Fixed extinguisher and smoke circuits not accepting any reagents.
      • -
      • Adds a few important clockcult tips.
      • -
      • Added Mech Sensors, a brass-created trap that activates when a mech not controlled by a cultist crosses it.
      • -
      • Added power nullifiers, an emp trap that emps everything in a 3x3 area, with the center suffering a heavy EMP.
      • -
      • Brass Skewers now deal 50 damage to mechs.
      • -
      • Ass slapping only works if you're actually behind the target. Ass slapping now respects disarm blocking. You can no longer face/ass slap someone on an intent other than help, unless they are also face/ass slapping.
      • -
      • Fixed ass and face slapping grammar.
      • -
      • Adds meh effects for ass and face slapping.
      • -
      • "Unwillingly" eating food now sends a warning message instead of a notice. Unable to stuff food down your throat sends a danger message instead of a warning message.
      • -
      • Adds clockwork reflectors, a fragile anti-laser reflection shield object that can be constructed for 10 brass sheets. Upon firing on the object in the direction where it is shielded, it ricochets the bullet off of it relative to the shooting angle.
      • -
      • Renames some windows in the build menu for consistency.
      • -
      • Clockwork Cult walls can no longer be deconstructed by RCDs when heated.
      • -
      • Adds several new toy loot to the arcade machine.
      • -
      • Rebalanced the arcade machine loot. Battlemachines now have a 0.5 second delay instead of a second delay between actions.
      • -
      • Fixed a bug that would not allow the one in a million pulse rifle to spawn.
      • -
      • Adds a new trait "Buns of Steel" that makes you immune to the effects of ass slapping, and temporarily makes the user's arm useless like a stun baton hit. It costs 0 points.
      • -
      • Ass slapping blowback from the Buns of Steel perk now deals 20 stamina damage instead of 50, and no brute damage.
      • -
      • Gamemode voting results are displayed at the end-round screen.
      • -
      • Cloning no longer gives you positive mutations, but a chance for a negative one. Cloning has a chance to "scramble" your visual DNA.
      • -
      • Chestbursters no longer give and remove your brain. They just disembowel and kill you now.
      • -
      • Fixes WarOps miscalculating players.
      • -
      • Activating the nuclear device during war-ops informs the crew of the nuke's position.
      • -
      • The alert level is displayed at the job selection screen.
      • -
      • Central Command informs you when a Meteor Storm is about to hit 5 to 10 minutes before it happens.
      • -
      -

      BurgerLUA updated:

      -
        -
      • Added a new framework for reagents. Reagents can now have a bool that determines if it can be detected by handheld medical analyzers. Currently only the changeling sting chemical does this.
      • -
      • Made changeling transformation string last between 10-15 minutes. Lowered the dna cost of changeling sting from 3 dna to 2 dna. Lowered the chemical cost from 50 to 10. Lowered the loudness from 2 to 1. Changeling sting transformation can be removed via high doses of calomel.
      • -
      • Fixed most reagents having a placeholder color.
      • -
      • Fixed autolathe wires not correctly shocking you when pulsed.
      • -
      • Rebalanced special jetpacks.
      • -
      -

      CalamaBanana updated:

      -
        -
      • Added Deer taur
      • -
      • Added Elf ears to mammals
      • -
      -

      CameronWoof updated:

      -
        -
      • Medihounds now have rollerbeds for non-vore patient transport
      • -
      • The closed O2 crate now uses the same color scheme as the open one
      • -
      • air alarms are green now instead of blue when the atmosphere is ideal
      • -
      • Hexacrocin overdose no longer causes climaxes
      • -
      • Altered the icons for inventory backplates. Sleek! Stylish! New!
      • -
      • Attaching a beaker that contains water to an IV stand no longer causes a visual glitch
      • -
      • Fluid-producing sexual organs no longer start full
      • -
      • Sexual organ fluid capacity decreased from 50 to 15
      • -
      • Sexual organ production rate decreased from 5u to 0.035u per two seconds.
      • -
      • Sexual fluid decals no longer contain reagents
      • -
      • Sexual fluids cannot by synthesized (e.g., by the Odysseus)
      • -
      -

      CdrCross updated:

      -
        -
      • Adds the ability for cloning consoles to read and write record lists to the circuit board, and provides a template for giving other machines local circuit board memory.
      • -
      -

      Cebutris updated:

      -
        -
      • Hugs of the North Star! Get them from the arcades (if you're lucky) and hug your friends at INCREDIBLE hihg speeds!
      • -
      • Tea Aspera now properly contains tea powder
      • -
      • Breasts no longer lactate by default, lactation is now a preference
      • -
      -

      Chayse updated:

      -
        -
      • Changed the Warden's compact combat shotgun to instead be a regular combat shotgun with a foldable stock and penalties for being folded.
      • -
      • Assorted space-worthy helmets can now act as masks for internals.
      • -
      • Internals code can now check any item with the ALLOWSINTERNALS flag through the GET_INTERNAL_SLOTS define. For now this only checks head and mask slots, since those are the most realistically speaking usable ones.
      • -
      • Medbay doors can now be opened by anyone from the inside without having to press the exit button.
      • -
      • Borgs now have the necessary dexterity to unbuckle people from themselves and from bucklable objects.
      • -
      • Fixes the Trek Uniform/Suit worn icons
      • -
      • AIs can now once more talk through holopads successfully
      • -
      -

      Code-Cygnet updated:

      -
        -
      • Added new things - Mind trait, alcohol reagent, chemical reagent, drink sprite and recipe.
      • -
      • added commander_and_chief sprite to drinks.dmi
      • -
      -

      Coolgat3 updated:

      -
        -
      • Changed player number checks to 20 from 24 for cult and clockcult, also made nukeops 28 required players instead of 30.
      • -
      • Changed enemy minimum age from 14 to 7
      • -
      • Added the code for the semen donut and made it craftable
      • -
      • Added the donut sprites
      • -
      • Made the sec and warden berret offer as much protection like the helmet
      • -
      • Added berets for all the heads.
      • -
      • Added sprites for the berets.
      • -
      • Coded the berets to spawn in appropiate lockers.
      • -
      • Raised the ripley's movement speed and lights range by 1, also lowered its armor to compensate.
      • -
      • Added combat gloves sprite
      • -
      • Added said sprite
      • -
      • added combat boots sprite
      • -
      -

      Coolgat3 / Avunia updated:

      -
        -
      • Made kindle put the target into stamcrit, which makes it an actually working, useful stun.
      • -
      • Added a stamina loss modifier to the vanguard spell which makes the user's stamina drain at a way slower rate. This doesn't make them immune to tasers, but it takes a few hits to actually get them to fall down.
      • -
      • Made it so that clock culties don't start with a chameleon suit. Instead they start with an engineer suit which is pretty much the same sprite and looks. If this is not perfect, then I am willing to make a slightly more brass-colored version of the engineer suit sprite and call it a ratvarian engineer jumpsuit.
      • -
      • Increased the cost of vanguard, as it is now a spell that works somewhat like adrenals, minus the move speed, making your stamina drain really slow and making you unable to get knocked onto the ground by just a single taser shot.
      • -
      • Lowered the charge time of kindle, reason being that you can usually have only one active spell on you, or two at max if you decide to run two slabs, but the fact that kindle silences people for such a small amount of time makes up for it, in my opinion.
      • -
      • Figured out that the consoles and their warp function actually work with the current code. The thing that makes them not work is when the gamemode is ran on debug mode, without the required players to actually support it. It also breaks the ark timer which is stuck on -1 seconds until activation. Whenever the gamemode starts properly, like any other gamemode, with player checks and all, everything seems to work just fine.
      • -
      -

      CydiaButt13 updated:

      -
        -
      • Lamp Plushie to loadout
      • -
      • added plushie_lamp to plush icons
      • -
      • added Lamp Plush to loadout and icons and items
      • -
      -

      EgoSumStultus updated:

      -
        -
      • Fixed blood chiller's inhand
      • -
      • FIXED SHIELF
      • -
      • fixed magpistol magazine sprites
      • -
      • Added the Femur Breaker
      • -
      • Adds male AI vox.
      • -
      -

      EmeraldSundisk updated:

      -
        -
      • Adds a gun range to Box Station
      • -
      • Provides some extra power grid connections
      • -
      • Sunglasses and Earmuffs removed from the Warden's Office - they can be found at the range instead
      • -
      • Rearranges a few objects within the prison as to accommodate the new gun range
      • -
      • Adds a mass driver to Delta Station's chapel
      • -
      • Adds a second means of entry into the chapel
      • -
      • Slightly expands the chapel to make room for the driver, slight adjustment to air systems
      • -
      • Clears a path in the station exterior for the mass driver to work properly
      • -
      • Nearby maintenance loot has been relocated to accommodate the chapel expansion, surrounding area has been "cleaned up" somewhat
      • -
      • CentCom has noticed the lack of coffins in Delta Station's chapel and provided some, but in exchange for reducing the chapel morgue's capacity.
      • -
      • Fixed a maintenance door the chaplain should have been able to open.
      • -
      • Fixes space areas outside the driver removal: CentCom Defense Analysts have ordered the maintenance hatch to the Mass Driver room be removed citing "security concerns".
      • -
      • Increases the number of plots to 9 (from 5)
      • -
      • Additional lighting placed directly outside the garden
      • -
      • Cleans up the area to reflect use. Moves the seed extractor to a more central location
      • -
      • Relocates the seed packs on botany's counter to the garden removal: Removes wooden barricades outside the garden
      • -
      • Renames "Abandoned Garden" area designation to "Maintenance Garden", but does not replace the icon in Dream Maker
      • -
      • Expands the chapel mass driver room to make it easier to use
      • -
      • Rearranges the chapel backroom so there are now six coffins and burial garments roundstart
      • -
      • Cleans up the Janitor's office
      • -
      • Readjusts the station exterior so mass-driven coffins (hopefully) have less friction
      • -
      • Adds a fan to the chapel driver
      • -
      • The Janitor missed a few spots around the newly renovated Maintenance Garden
      • -
      • Readjusts positioning of Delta's QM keycard device
      • -
      • Cleaned up a few spots I missed in #9356, particularly around the janitor's office
      • -
      • Adds some potted plants around Box Station
      • -
      • The tile mentioned in #9409 should now be radiation-free.
      • -
      -

      Fermi updated:

      -
        -
      • Fixes tiny runaway decimals in reagents system.
      • -
      • SDGF: Fixes infinite clones.
      • -
      • fixed an angery PR
      • -
      -

      Fermis updated:

      -
        -
      • Added a panda simplemob
      • -
      • fixes empathy exploit.
      • -
      • Added the secbat, a box to hold it and the ability to dispense it from the SecTech vendor.
      • -
      • Adds 3 new music tracks.
      • -
      • tweaked Neurotoxin
      • -
      • added more depth to Neurotoxin
      • -
      • fixed the inability to create Neurotoxin
      • -
      • fixes fermichem reactions for tiny volumes work
      • -
      • makes quantisation level for chemistry finer
      • -
      • re-enables femichem explosions in grenades.
      • -
      • adds nuance to the SDGF and hatmium explosions.
      • -
      • Fixes analyse function on ChemMasters to correctly display purity.
      • -
      • Fixes the custom transfer for buffer to beaker button.
      • -
      • Debug option: Generate Wikichems
      • -
      • graft synthtissue surgery, new reagent synthtissue
      • -
      • neurine fixes brain objs merge: combines fermichem's lung damage with tg's
      • -
      • on_mob_dead(), bitflags and CHECK_MULTIPLE_BITFIELDS
      • -
      • refactored fermichem vars, moved impure chems into their own reagents subtype
      • -
      • Fixes small residues of chems that won't go away!
      • -
      • tweaked beaker health and allows use of syringes/droppers on chem_heaters
      • -
      • added a sound for when beakers take temperature damage.
      • -
      • added some icons for melting beakers
      • -
      • refactored how beakers take damage
      • -
      • fixes how beakers would only take one instance of damage on pH damage
      • -
      • fixes Janitor grenades.
      • -
      • fixes reaction mechanics at low volumes
      • -
      • stops reactions constantly bubbling on the edge of reaction temperature
      • -
      • stops small amount reactions from occurring, and prevents disappearing tiny numbers
      • -
      • Reduced minimum reaction volume from 1 to 0.01
      • -
      • cleaned up Fermichem
      • -
      • Adds Jacqueline the Pumpqueen and her familiar Bartholomew for the spooky season
      • -
      • Adds a giggle
      • -
      • Adds cauldron, Jacq and Jacq o lanterns, and a costume for halloween! mapedit: adds a new landmark so Bartholomew can spawn somewhere sensible.
      • -
      • fixes food reactions and explosion runtimes,
      • -
      • fixes the too much yes problem
      • -
      • Heart, Tongue and stomach regen.
      • -
      • lung damage threshholds.
      • -
      • Graft synthtissue
      • -
      • Skeleton's burning for no reason
      • -
      • Organ freezing handling.
      • -
      • Fixes chemistry books to point to the right wiki, and keeps tg's just in case
      • -
      • Changes top right wiki button location to go to both wikis
      • -
      • fixed Jacq's fondness for the AI
      • -
      -

      Ghom updated:

      -
        -
      • minor clean up on hydroponics reagent containers.
      • -
      • fixes the perpetual lack of moisture that has affected genitalia descriptions since, like, forever.
      • -
      • implements the arousal state for mammary glands.
      • -
      -

      Ghommie updated:

      -
        -
      • Fixes many possible situations of null icons for cit races' bodyparts.
      • -
      • Removes duplicate slimepeople' sprites.
      • -
      • Purges that draw_citadel_parts().
      • -
      • Fixes ISINRANGE_EX using the wrong relational operator.
      • -
      • The kindle status effect stun duration now properly proportional to the owner's remaining health.
      • -
      • Clockwork cult's kindle now affects silicons.
      • -
      • Cyborg mounted disablers/tasers/lasers now slowly self-recharge off the cyborg user's power cell instead of draining from it directly.
      • -
      • Borg rechargers now properly recharge the borg module's energy guns.
      • -
      • Prevents a couple more special/mounted guns from being preserved on cryo
      • -
      • Halved borg energy guns self-recharge delay and increased their cell capacity by 3/4
      • -
      • Fixes chemical patches always checking the suit slot even if the targetted limb was the head.
      • -
      • Skeleton, nightmare and golem races are once again available to get chemical patches applied onto.
      • -
      • Adds two cartons of space milk to the space skellie pirates cutter's fridge.
      • -
      • Refactored implants to not be located inside mobs codewise, akin to organs.
      • -
      • Fixed gps tracking implants.
      • -
      • Fixed item not being dumped out of storage implants onto the owner's turf upon removal.
      • -
      • Fixes cult potentially stalling if the target is erased from existence without being sacced.
      • -
      • Nukes the stunprod's 3 seconds delay.
      • -
      • Fixes teleprods.
      • -
      • Stops pulls of resting mobs breaking off whenever you swap turfs with someone else because of crawling delays.
      • -
      • fixes IAA.
      • -
      • EMPs now flick off stunbatons, they can be turned back on immediately by the user anyway.
      • -
      • Stunbatons now very slowly consume charge whilst kept on, at a rate of 4/1000th of a standard batoning charge cost per tick.
      • -
      • Softened up the charge cost checks to stop the above update from practically reducing the maximum uses of a stun baton by one. Now, should the remaining charge be lower than the hit cost, the resulting stun will be be proportional to the remaining charge divided by the hitcost, within a limit under which the stun batoning just won't happen.
      • -
      • Buffs condensed capsaicin, a yet another feature previously dunked by stam combat.
      • -
      • speeds up pepper spray puffs.
      • -
      • Buffed krav maga leg sweep stun and stamina damage. On the other hand, it's now unable to be used on already lying targets.
      • -
      • fixes eyestabbing people with cutlery while being a pacifist.
      • -
      • Reduces goonchat lag from being blasted by pellets and bullets repeatedly whilst wearing armor by properly removing the armor protection texts this times.
      • -
      • also reduced the size of armor protection messages in general. they clog up the chat box.
      • -
      • Fixes stunbatons icon not properly updating on cell removal and insertion.
      • -
      • Allows lower charge cells to be used with stun batons, and thus single use crapshots batons.
      • -
      • Adds in a 7 seconds delay to the jackhammer dismantling a superheated clockwork wall.
      • -
      • escape pods emergency suits storage can now be busted open by emags or excessive damage.
      • -
      • Fixes alt click bypassing the escape pods' suits storage lock.
      • -
      • Fixes emags wasting charges on un-emaggable & co stuff.
      • -
      • Ported some radials code updates.
      • -
      • Ported the RCL wiring menu and a comfier RCD interface.
      • -
      • A milder combat stance message will show up if the user switch combat mode on while on help intent.
      • -
      • Properly rewords the extinguisher's instructions on how to empty it on the floor since it was changed to be a screwdriver action instead of Alt Click a while ago.
      • -
      • Reskinnable PDAs. A related game preference.
      • -
      • Refactoring the pda, pda painter, obj reskinning and chameleon pda a bit to support this feature.
      • -
      • more PDA sprites and ported reskins.
      • -
      • turned virtual reality into a component datum, which is then applied to spawned virtual mobs. This fixes mob transformations (such as wabbajack and monkeyizing) breaking the previously hardcoded behaviour and trapping you in VR, also enabling a more concrete virtual reality inception experience.
      • -
      • Fixes power cells being unable to be rigged. Also prevents them from starting processing on init if they don't self recharge.
      • -
      • Fixes many, little or otherwise, issues with the stunbaton status refactor.
      • -
      • The sacrificial target icon will now display onto the cult objective ui alert once again.
      • -
      • Stopping borgs from sprinting into negative cell charge.
      • -
      • The default amount of z-levels reserved specifically for space ruin generation has been increased from 1 to 2
      • -
      • Moving some tablecrafting recipes to the appropriate categories: Kitty ears and lizard cloche hats to "clothing"; Hot dogs to "Sandwichs"; Cuban carb, fish and chips and fish fingers to "Fish".
      • -
      • Fixes the not-a-sandwich recipe being M.I.A.
      • -
      • Adding in peanuts, peanut butter, peanut butter toasts and sandwiches, and the PB&J sandwich. The peanuts contain a little bit of extractable cooking oil (similarly to soy beans) and can be microwaved or dried in a drying rack to make roasted peanuts, which can be mixed in a all-in-one-grinder for peanut butter, required to make those sandwiches.
      • -
      • Buffed wizard and artificier's Magic Missile, wizard and xeno queen's Repulse and juggernaut's Gauntlet Echo.
      • -
      • Fixes flashlights being unable to be used for rudimentary eyes and mouth exams.
      • -
      • Adds in a grey jumpsuit to the loadout choices, restricted to Assistants.
      • -
      • Fixes CWC construct shells being visible as ghost role to latejoiners.
      • -
      • new sprites for the flechette gun, its magazines and the toy ray gun
      • -
      • Merges the end-of-shift and its shuttle autocall announcements into one.
      • -
      • Prevents the end-of-shift shuttle from being recalled (even if to no avail).
      • -
      • Fixes being able to teleport papers to your location with TK.
      • -
      • Fixed some monkey-code shenanigeans making items sometimes disappear from pickpocketing.
      • -
      • New sprites for the some pda cartridges.
      • -
      • The crew monitor's entry for the Quartermaster will now appear bolded, while HoP's will be of the same color of the service/unknown/other jobs.
      • -
      • emergency pods' storage will now properly work.
      • -
      • The PDA skin preference will now properly save up.
      • -
      • Changed the default PDA icon var to match the default PDA skin preference.
      • -
      • Fixing the `(pointless) badassary` category appearing between the `dangerous and conspicious` and `stealthy and inconspicious` categories.
      • -
      • Combat gloves plus now properly use the combat gloves sprite.
      • -
      • Fixes the space ninja's energy netting.
      • -
      • Adding one pAI to the wizard shuttle and ERT prep room
      • -
      • Fixes the rocket launcher being unreloadable.
      • -
      • Buffed its accuracy a bit.
      • -
      • Replaced the grenade launcher emagged minesweeper loot with the rocket launcher like it was originally supposed to be.
      • -
      • Tweaked the :b: emoji.
      • -
      • Rubber Toolboxes.
      • -
      • Porting in two bar signs: Cyber Sylph's and Meow Mix.
      • -
      • Fixing stamina damage melee weaponry being unusable by pacifists, and still damaging objects and triggering electrified grilles when thrown.
      • -
      • refactored underwears to allow custom color preferences, instead of manually colored sprites.
      • -
      • The aforementioned manually colored pieces. Some of your char preferences may have been resetted as result.
      • -
      • More underwear choices, including: Bowling shirts, long johns, a tank top, fishnets, more bee socks, bee t-shirt and bee boxers (original PR for the latter three by nemvar from /tg/station).
      • -
      • random bodies will now have random underwear again.
      • -
      • Dressers will now properly change undergarment again.
      • -
      • Toned down many species' female chest sprites to fit the smaller cups.
      • -
      • Fixed some body parts sprites inconsistencies, such as the W/E female and male chest sprites being the same in some species, and jellypeople's legs being one tile off on W/E
      • -
      • Fixing baklava pies a bit.
      • -
      • Sweaters now cover groins too.
      • -
      • Improved the zelus flask to be more viable for bottle smashing than the average barman's selection.
      • -
      • Very slight bottle smashing code clean up, stupid const vars.
      • -
      • Fixes krav maga gloves, wizard spells knockdowns.
      • -
      • Added in an alert pop up to the cult convertees, on top of the older "click here to become a blood cultist" chat message.
      • -
      • The convertee's screen will now flash red to fit in the aforementioned message's fluff.
      • -
      • Made said message less verbose.
      • -
      • Towels. Crafted with 3 sheets of cloth, they can be worn on head, suit and belt slots even without uniform, or laid flat on the floor. Sprites from Baystation and Aurora Station.
      • -
      • You can combat mode right click people while wielding rags and towels to pat out their flames (to no use for rags) or otherwise drying them out.
      • -
      • toned down the stamina costs of some of the bulkier weapons.
      • -
      • repathed hypereutactic blades to be a subtype of dual sabers. Way less copypasta.
      • -
      • Fixing CX Shredder guns not accepting standard flechette mags.
      • -
      • Fixing missing magpistol magazines icon states.
      • -
      • sort of overhauled darkmode/lightmode to /vg/station's, also reincluding the pre-existing black'n'white theme.
      • -
      • Fixed LOOC color, fixed .userlove and .love span classes being a bit too blurry on dark mode.
      • -
      • The syndicate base's bathroom is now fitted with a shower, and a special towel.
      • -
      • Fixed many issues with towels.
      • -
      • The dry people off with rags/towels action can only be done if the object is NOT moist with reagents now. Also cleans banana creaming.
      • -
      • Towels deal more damage while soaked with reagents.
      • -
      • You can now squeeze rags/towels with Alt-Click.
      • -
      • deleted an old and crappier towel sprite that got in the way.
      • -
      • Fixes Pubby's disposal conveyor belts and lack of a second lawyer spawner.
      • -
      • Cleaned up the absolute state of the arousal module.
      • -
      • refactored exhibitionism into a quirk.
      • -
      • arousal states won't persist after death.
      • -
      • Fixes testicles size adjective thing.
      • -
      • undergarments toggling now works instead of just making underwear disappear and not come back.
      • -
      • The "Always visible" genitals setting will now display them above clothes.
      • -
      • combat pushes will now properly stop targets from using firearms, and will disarm the firearm if performed a second time, and also slow down people by 15%, and won't push people on tables blocked by shutters or other dense object anymore.
      • -
      • Fixes CHECK_BITFIELD macro.
      • -
      • Fixes hypovials being unable to transfer out liquids or be refilled by large dispensers like water tanks.
      • -
      • Fixes chem-masters machineries not dispensing newly made pills inside loaded in pill bottles.
      • -
      • Stunswords now fit in the captain's sabre sheat.
      • -
      • reworked ninja's stealth mode. Increased invisibility, but engaging in combat, attacking or throwing things, bumping people will temporarily lower it.
      • -
      • Ninja shoes are even stealthier.
      • -
      • cleaned up some 2014 tier processing code horror.
      • -
      • the oxyloss fullscreen overlays now also take in consideration 1/5 of the user stamina loss.
      • -
      • When you're jogging, you will only slip on water if you have more than 20% staminaloss, for real this time.
      • -
      • Different cuffs now come with different worn overlays instead of a generic one.
      • -
      • High luminosity eyes can now be properly deactivated and won't illuminate your surroundings again until turned back on.
      • -
      • Fixes freshly cloned people starting with undershirts. Fixes random characters possibly rolling with undergarments of the opposite gender (Doesn't affect preferences' freedom of choice).
      • -
      • MRE menu 3 has cuban nachos instead of a chili now.
      • -
      • Removed the illustration overlay from MREs, looks pretty weird otherwise.
      • -
      • MRE menu 4, vegetarian.
      • -
      • fixes a few bad touchs on combat mode pushing.
      • -
      • Fixes clock cult Abscond scripture not dragging pulled mobs into Reebe. Also fixes blood cult tele runes teleporting you from the source turf to the source turf.
      • -
      • fixes clock cult mass recall.
      • -
      • Fixes underwear colors a bit.
      • -
      • Fixes Blood Cult conversion prompts
      • -
      • Removes an obnoxious temporary overlay var.
      • -
      • colorable socks can be colored again.
      • -
      • Fixed undergarments color preferences resetting each round.
      • -
      • Fixed a few dozen suits' body coverage inconsistencies. These changes shouldn't affect armor and utility vests for most.
      • -
      • Fixed clown shoes and work boots.
      • -
      • Fixed some overlay bug that happens when legcuffed and then handcuffed.
      • -
      • Slowed down police baton and tele baton speed by 75%, should be still be faster than the legacy speed (2 seconds) by 0.6 seconds. Telescopic batons' stamina cost per swing is now on par with police batons, ergo more expensive.
      • -
      • Fixed undershirts n socks colors prefs.
      • -
      • You can now alt-click to rotate machinery such as the tachyon-droppler array or emitters again.
      • -
      • Sofas can't be wielded and transformed back into plain chairs anymore.
      • -
      • Enables emojis for PDA messages.
      • -
      • Removes revenant blight's shabby toxin damage in favor of mood maluses, and a dangerous necropolis curse if not cured in time. Remember
      • -
      • Blood cult altar, forge and archives now use radial menus.
      • -
      • Fixed some machineries' UIs.
      • -
      • blood and clock cultists messages from metabolizing
      • -
      • Fixed advanced medical scanners borg upgrades.
      • -
      • Fixes certain borg upgrades being unapplicable on dogborg counterparts of the target cyborg type.
      • -
      • Fixed people being shovable hrough windows, windoors and the such.
      • -
      • You can now shove people into disposal bins.
      • -
      • refactored altdisarm(), ergo the "shoving people around" proc.
      • -
      • war ops is now lowpop friendly and doesn't require roughly 54 starting players anymore.
      • -
      • Singularity beacons now also moderately increases the odds meteor waves, while lowering their estimeed arrival countdown.
      • -
      • non-alphanumeric graffiti decals will no longer display as "letter".
      • -
      • Nerfs cyborg disabler and its internal power cell to hold 25 disabler beam shots rather than 43/44, just like a normal disabler.
      • -
      • Adds some missing species_traits for cloth, clockwork and cult golems.
      • -
      • Added towel linen bins, found in dormitory restrooms. Also enhanced the bedsheet bins found in some stations' dormitories
      • -
      • Resprited bedsheet bins in 3/4 perspective
      • -
      • Made SDGF ghost poll message less verbose, made the experimental cloner's complaint with the former, and added ghost poll ignore options for both.
      • -
      • fixing some related onmob sprites issues with the above accessory.
      • -
      • Teleprods work on non-carbons mobs now.
      • -
      • Fixed tracking implant teleport issues.
      • -
      • Increased stunbatons power cell depletion rate when left on by 50%.
      • -
      • Gorlex Marauders are pleased to announce non-slip grooves were given to their .50 sniper rifles, and thus shouldn't accidentally flop on the floor like pocket spaghettis whenever taken out of a bag anymore.
      • -
      • Silicons can now operate teleporter, medical and security records console from a distance again.
      • -
      • Fixed custom say emotes conflict with drunk memes.
      • -
      • Fixes identity transfer (envy knife, changeling transformation, making a vr avatar) not copying digitigrade legs.
      • -
      • Fixes temporary transformation sting triggering heart attacks on heartless humans.
      • -
      • Fixed mobs folded inside bluespace bodybags getting their clothing and items deleted when passing through a recycler.
      • -
      • The alien-bursting-from-your-thorax and the xeno "hud" embryo stage images will now properly delete them once the embryo egg lifecycle is complete.
      • -
      • Fixed artificier lesser magic missile.
      • -
      • Phantom thief masks will now fancy your combat mode yet again.
      • -
      • Fixed gulag teleporter stripping the user of stuff it really shouldn't (like storage implant bags).
      • -
      • fixing cydonian armor a bit.
      • -
      • Resprited wooden and critter crates.
      • -
      • Improved the Cyber Sylph' good yet cumbersome bar sign a little.
      • -
      • Cyborgs can now use camera consoles on the edge of their widescreen. These consoles are also TK friendly now.
      • -
      • Updated gang dominator sprites.
      • -
      • Miner borgs can again have installed PKA mods.
      • -
      • Fixed invisible blackberry n strawberry chocolate cake slices.
      • -
      • Nuke ops / adminbus combat mechs will no longer spawn with tracking beacons.
      • -
      • Arcade machine directional sprites.
      • -
      • lowered the arcade's random plush / other prizes ratio from 1 : 2.5 circa to 1 : 5. Dehydratated carps and the awakened plush can not be achieved this way anymore.
      • -
      • Added armrests overlays to sofas and tweaked their sprites a little.
      • -
      • Fixed dogborg sleepers. Just don't tell me what is exactly fixed, cause I don't want to find out.
      • -
      • Buffed the deep space familiar gorilla against runtimes.
      • -
      • Updated ratvarian computer sprites.
      • -
      • Fixed storage implant transplant.
      • -
      • Refactored how Jacqueen teleportation destination is selected, preventing them from teleporting on off-station holopads.
      • -
      -

      Ghommie && Kevinz000 updated:

      -
        -
      • Lichdom and necromantic stone skeletons are now of the spaceproof kind too.
      • -
      • skeletons now also like dairy products.
      • -
      • Halloween roundstart skeletons and zombies are no more spaceproof.
      • -
      • You can choose to set your species to zombie or skeleton through the pride mirror yet again, Alas they are not of the spaceproof kind either.
      • -
      -

      Ghommie (Credits to Kmc2000 for the original PR) updated:

      -
        -
      • Porting in MRE boxes from Yogstation. But be careful, eating possibly expired MREs found in maintenance comes with an unrealistically large (actually small) chance of food poisoning. Otherwise just bail out and order actually safe-to-eat MREs from cargo for 2000 credits.
      • -
      -

      Ghommie (Original PR by Dennok) updated:

      -
        -
      • Now areas_in_z get areas spawned by templates and blueprints.
      • -
      -

      Ghommie (Original PR by Dreamweaver) updated:

      -
        -
      • Nanotrasen has received word of a high-tech research facility that may contain advancements in bluespace-based research. Any crew members who become aware of its whereabouts are to report it to CentCom immediately and are restricted from sharing said info.
      • -
      • The turf reservation system now dynamically creates new z levels if the current reserved levels are full.
      • -
      -

      Ghommie (Original PR by JJRcop) updated:

      -
        -
      • Ports in more emojis, including : flushed :
      • -
      -

      Ghommie (Original PR by LaKiller8) updated:

      -
        -
      • Goonchat options should now save properly.
      • -
      -

      Ghommie (Original PR by Vile Beggar) updated:

      -
        -
      • Warden now has an added drill hat in his locker. You can change the loudness setting of it by using a screwdriver on it. Use wirecutters on it for a surprise.
      • -
      -

      Ghommie (Original PR by coiax) updated:

      -
        -
      • atom/var/container_type has been moved into datum/reagents/var/reagents_holder_flags. There should be no visible changes to effects.
      • -
      -

      Ghommie (Original PR by nemvar) updated:

      -
        -
      • Botanists can now get beeplushies (or cultivator and bucket) as an heirloom.
      • -
      • Clowns and mimes will now properly pick either a can of paint or their brand as heirloom now.
      • -
      -

      Ghommie (Original PR by tralezab) updated:

      -
        -
      • Fixes an issue with spontaneous appendicitis picking incompatible mob biotypes.
      • -
      -

      Ghommie (Original PRs by Tortellini Tony and BuffEngineering) updated:

      -
        -
      • E-cigs will continue to display their setting after being emagged.
      • -
      • Vapes now come out of the mouth. fix Fixes an E-cig initialize() runtime.
      • -
      -

      Ghommie (Original PRs by nemvar and Rowell) updated:

      -
        -
      • Added beekini bras and panties, thigh-high and knee-high bee socks.
      • -
      -

      Ghommie (by Arkatos) updated:

      -
        -
      • Fixed an issue with a Lizardwine drink crafting, where a final product would contain unwated 100u of Ethanol.
      • -
      -

      Ghommie (by Floyd / Qustinnus, Arathian) updated:

      -
        -
      • The robotocist now has robe to show his love for toasters
      • -
      -

      Ghommie (by nemvar) updated:

      -
        -
      • Dwarfs are now more robust.
      • -
      -

      Ghommie (original PR by 4dplanner) updated:

      -
        -
      • thrown objects (but not mobs) no longer hit the thrower
      • -
      • mirror shield rebound no longer depends on the original thrower's momentum
      • -
      -

      Ghommie (original PR by 81Denton, kriskog and nemvar) updated:

      -
        -
      • Sleepers now show a message if players try to unscrew the maintenance hatch while they're occupied or open. Fixed typos in sleeper/organ harvester messages.
      • -
      • Sleepers and dna scanners can now be pried open with crowbars.
      • -
      • You can open and close sleepers and dna scanners by alt-clicking them.
      • -
      • The scanner's hatch now must be closed (on top of being unoccupied), just like sleepers, before being screwdriverable. This fixes a tricky door stuck issue with the machine.
      • -
      -

      Ghommie (original PR by AffectedArc07 and Shazbot) updated:

      -
        -
      • Added 8 new sock styles
      • -
      -

      Ghommie (original PR by AffectedArc07) updated:

      -
        -
      • Religion is now a globalvar instead of being a subsystem for some reason
      • -
      -

      Ghommie (original PR by AnturK) updated:

      -
        -
      • Supermatter now melt walls if it finds itself in one.
      • -
      -

      Ghommie (original PR by Anturk) updated:

      -
        -
      • Recipe for fabled secret sauce can now be found in the deepest reaches of space.
      • -
      -

      Ghommie (original PR by Barhandar updated:

      -
        -
      • Pumpkin meteors on Halloween now replace catastrophic meteor waves, instead of ALL OF THEM.
      • -
      -

      Ghommie (original PR by CrazyClown12) updated:

      -
        -
      • The chloral hydrate inside of the sleepy pen is no longer slower acting than chloral hydrate made in chemistry.
      • -
      • The chloral hydrate inside of cookies synthesised by emagged borgs is no longer slower acting than chloral hydrate made in chemistry.
      • -
      • Slight tirizene buff.
      • -
      • Delayed chloral hydrate
      • -
      -

      Ghommie (original PR by Denton) updated:

      -
        -
      • Nanotrasen has started shipping more types of bedsheets to its stations.
      • -
      • Added in Runtime, Pirate and Gondola bedsheets. The second one can also be found in some pirate ships, while the last can be crafted from gondola hides.
      • -
      • You can no longer reveal the 'illegal tech' research node by deconstructing .357 speedloaders, riot dart boxes, syndicate cigarettes, syndicate playing cards or syndicate balloons.
      • -
      -

      Ghommie (original PR by Mickyan) updated:

      -
        -
      • Fixed being unable to smother people using the damp rag
      • -
      -

      Ghommie (original PR by MrDoomBringer) updated:

      -
        -
      • morgues have had their proton packs removed and as such no longer suck in ghosts on closing.
      • -
      -

      Ghommie (original PR by MrDoomBringer, AnturK and YPOQ) updated:

      -
        -
      • Explosions will no longer damage wizards in rod form, the supermatter monitoring radio and megafauna GPS.
      • -
      • Supplypods no longer detonate their contents.
      • -
      • Fixed silicon items (e.g. cyborg modules) being destroyed by explosion epicenters.
      • -
      -

      Ghommie (original PR by Naksu) updated:

      -
        -
      • get_area() is now a define rather than a proc.
      • -
      -

      Ghommie (original PR by Nicjh) updated:

      -
        -
      • Abductor console's select disguise option now uses a radial
      • -
      -

      Ghommie (original PR by ShizCalev) updated:

      -
        -
      • Pineapple haters/lovers will get/no longer get pineapple pizzas respectively from infinite pizza boxes.
      • -
      • As a non-human mob, hovering your cursor over an inventory slot while holding an object in your active hand shouldn't runtime now.
      • -
      -

      Ghommie (original PR by Skoglol) updated:

      -
        -
      • New helper proc for alt-click turf listing, bypasses any interaction overrides.
      • -
      • Ghosts and revenants now use the new proc.
      • -
      • Ghosts can no longer toggleopen sleepers, adjust skateboard speed or close laptops
      • -
      • Revenant can now alt-click turf to list contents.
      • -
      • Revenant now slightly less nosy, use shift click to examine.
      • -
      • Alt-clicking the same turf again no longer closes the turf listing tab.
      • -
      • Reduced ventcrawl lag greatly.
      • -
      • Mining bags will no longer drop ore into backpack.
      • -
      • Mining bags in backpack no longer interferes with other mining bags.
      • -
      • Fixes some storage size circumventions.
      • -
      • Moved machine and computer frames below objects, parts are now always on top.
      • -
      • Moved structures (chairs, closets, windows, cult altars etc etc) below objects.
      • -
      • Moves mineral doors to airlock layers
      • -
      • morgue/crematorium trays' layers shouldn't overlap bodybags' anymore.
      • -
      -

      Ghommie (original PR by SpaceManiac) updated:

      -
        -
      • Disassembling a chem dispenser for the first time will no longer always yield a fully-charged cell.
      • -
      -

      Ghommie (original PR by Swindly) updated:

      -
        -
      • Arm-mounted implants that contain more than one item use a radial menu instead of a list menu.
      • -
      -

      Ghommie (original PR by Tlaltecuhtli) updated:

      -
        -
      • Other people's clothes burning no longer spam you
      • -
      -

      Ghommie (original PR by XDTM) updated:

      -
        -
      • Reagents now stop their passive effects (for example, stun immunity) if the liver stops working while they're active.
      • -
      -

      Ghommie (original PR by YPOQ) updated:

      -
        -
      • Fixing roffle waffle, mushroom halluginogen and some invalid reagents.
      • -
      • Fixes clockwork armor not actually having armor.
      • -
      -

      Ghommie (original PR by cacogen) updated:

      -
        -
      • The font size of all text in the chat window now scales
      • -
      • High volume (megaphone/head of staff headset) is a slightly smaller
      • -
      • Admins have slightly larger OOC text
      • -
      -

      Ghommie (original PR by coiax) updated:

      -
        -
      • Randomly coloured gloves and randomly coloured glowsticks now have slightly different typepaths, but otherwise function the same.
      • -
      • The Squeak subsystem has been renamed to Minor Mapping.
      • -
      -

      Ghommie (original PR by duckay) updated:

      -
        -
      • Added better names and descriptions for blueshirt officer gear.
      • -
      • Added the above gear to the premium selection of the sectech
      • -
      -

      Ghommie (original PR by harmonyn) updated:

      -
        -
      • Resisting out of bucklecuffs takes more/less time depending on the handcuffs you used, i.e., fake handcuffs will not bucklecuff someone for ages.
      • -
      • fake handcuffs shouldn't no longer demoralize restrained criminals scums.
      • -
      -

      Ghommie (original PR by monster860) updated:

      -
        -
      • fixes advanced proccall
      • -
      -

      Ghommie (original PR by mrhugo13 on tgstation13) updated:

      -
        -
      • The Syndicate has decided to equip their Syndicate leaders operative (Aswell as their clown counterparts) with the new Combat Glove Plus! The new Combat Glove Plus does everything the old boring Combat Gloves does but with the added extra of learning Krav Maga upon wearing them, any other Syndicate operative who wants to get in on the action will have to pay 5tc.
      • -
      -

      Ghommie (original PR by nemvar) updated:

      -
        -
      • Some drinks have new icons or slightly altered icons. In particular Wizz Fizz, Bug Spray, Jack Rose, Champagne and Applejack.
      • -
      -

      Ghommie (original PR by ninjanomnom) updated:

      -
        -
      • Orbiting is a little more aggressive about staying in orbit. The wisp as a result now correctly follows you over shuttle moves.
      • -
      • Gaps between sounds in some looping sound effects should no longer happen as much under heavy server lag.
      • -
      -

      Ghommie (original PR by variableundefined) updated:

      -
        -
      • Cancel button to assault pod destination selector.
      • -
      -

      Ghommie (original PR by wesoda25) updated:

      -
        -
      • disembowelment no longer works on mobs that aren't dead or in critical condition
      • -
      -

      Ghommie (original PRs by Akrilla, Arkatos and Denton) updated:

      -
        -
      • Sprays cans have a cap on how dark you can make objects. Art is uneffected.
      • -
      • Fixed a bug where you could get cyborg spraycans via pyrite extracts.
      • -
      • Added an infinite spraycan for admins to spawn.
      • -
      -

      Ghommie (original PRs by Denton and Skoglol) updated:

      -
        -
      • Reorganized the syndicate uplinks. Items are now mostly alphabetical, some misplaced items moved to more fitting categories. Bundles, random item and TC have been moved into a new category called "Bundles and Telecrystals". Gloves of the North Star and Box of Throwing Weapons have been moved to Conspicuous and Dangerous Weapons. Combat Gloves Plus have been moved to Stealthy and Inconspicuous Weapons. Moved all implants into the Implants category.
      • -
      • Added a new category to the uplink: Grenades and Explosives.
      • -
      -

      Ghommie (original PRs by Floyd/Qustinnus, optimumtact, Denton and coiax) updated:

      -
        -
      • You can now select what your pills will look like when making pills from the Chem Master
      • -
      • Red pills can make you think.
      • -
      -

      Ghommie (original PRs by Jujumatic and PKPenguin321, respectively) updated:

      -
        -
      • Minesweeper Arcade machines. The higher the difficulty setting, the better the prizes will be.
      • -
      • Also keep your eye out for another new (and rare) arcade game!
      • -
      -

      Ghommie (original PRs by Kmc2000 and actioninja) updated:

      -
        -
      • Added darkmode! You can opt-in to this by clicking the new toggle darkmode button just beside the settings one.
      • -
      • Byond members will now have a new setting for their Antag OOC color, instead of using their OOC one. (Antag OOC still locked under admin discretion though)
      • -
      • Default black'n'white windows style.
      • -
      -

      Ghommie (original PRs by Mickyan, Anturk, ShizCalev, nemvar and Naksu) updated:

      -
        -
      • After rigorous mandatory art training for the crew, many new graffiti styles are now available
      • -
      • Cleaned up some crayon and spraycan code for futureproofing.
      • -
      • Spraypainting blast doors no longer makes them see-through.
      • -
      • Paint remover now works on blast doors and the like.
      • -
      • Most objects can now be colored using a spray can.
      • -
      • Added visible message to spraying objects and windows.
      • -
      • Colored lights now shine in different colours.
      • -
      • Removed individual buttons text in crayon/spraycan UI, speeding it up.
      • -
      • Text mode buffer is actually visible in the UI.
      • -
      • Last letter of a text mode buffer no longer rotates out to be replaced with "a", allowing the text mode to be used for individual symbols.
      • -
      -

      Ghommie (original PRs by Naksu and XDTM) updated:

      -
        -
      • Transferring quirks now properly removes the roundstart trait from the person losing the quirk.
      • -
      • Roundstart traits no longer block the removal of other sources of that trait.
      • -
      • status traits are now a datum var, the accessors are now defines rather than functions.
      • -
      -

      Ghommie (original PRs by Naksu and coiax, loser) updated:

      -
        -
      • Cleaned up saycode
      • -
      • Taking mutadone while having the communication disorder brain trauma will no longer spam your chat with messages.
      • -
      • IPCs now come with a subtype of robotic tongue without the omnilingual ability, instead of innately having robotic voice spans.
      • -
      -

      Ghommie (original PRs by Nichlas0010 and ShizCalev) updated:

      -
        -
      • AI core display screen can now be set in character preferences.
      • -
      • AI core display screen will now be restore when revived.
      • -
      • Corrected some inconsistent capitalization in the player preferences screen.
      • -
      • Readded some forgotten AI sprites.
      • -
      • Fixed Hades AI death animation not playing.
      • -
      • the AI icon-selection menu now uses a radial.
      • -
      • Added in the death icon_states for the "TechDemon" AI screen.
      • -
      -

      Ghommie (original PRs by ShizCalev and bobbahbrown) updated:

      -
        -
      • Headsets now dynamically show in their description how to speak on any channels they can use when held or worn.
      • -
      • Radio channels names and keys now use defines.
      • -
      • The head arrival announcement will now be broadcast to the supply for the quartermaster.
      • -
      -

      Ghommie (original PRs by ShizCalev) updated:

      -
        -
      • Fixed a bug that allowed you to teleport an ID in your possession to a PDA anywhere ingame.
      • -
      • Fixed an exploit allowing you to steal ID's/pens from PDA's not in your possession.
      • -
      • Fixed an exploit allowing you unlimited control of a PDA's interface even if it wasn't near you/in your possession.
      • -
      • Fixed Pride Mirror exploits.
      • -
      • Corgi collars can now be removed!
      • -
      • Updated the corgi & parrot inventory panels to use the same formatting as other mobs
      • -
      • Fixed corgi inventory panels not closing properly.
      • -
      • Fixed the parrot inventory panel not closing properly if you're not able to interact with it.
      • -
      -

      Ghommie (original PRs by ShizCalev, MrDoombringer, AnturK, bgobandit, 81Denton and actioninja) updated:

      -
        -
      • Failsafe codes for uplinks are now available for purchase.
      • -
      • Nuke Ops now have the ability to purchase a usable RPG, the PML-9, as well as a couple different types of rockets for it. you can also suicide rocket jump with them!
      • -
      • Improved Uplink item descriptions and formatting.
      • -
      -

      Ghommie (original PRs by ShizCalev, coiax and Tlaltecuhtli) updated:

      -
        -
      • Caks will no longer override the bonus reagents provided in a donut when frosting them.
      • -
      • Caks can no longer create frosted frosted jelly donuts.
      • -
      • Jelly donuts will no longer lose their vitamins when they're frosted.
      • -
      • Fixed chaos donuts potentially doubling the amount of reagents added when microwaved with something else.
      • -
      • Donuts now always contain 1 sprinkles as was stated on the wiki. Frosted donuts have a chance at adding an extra sprinkle.
      • -
      • Improved the code for ensuring that security members enjoy donuts and security-themed alcoholic drinks.
      • -
      • neurotoxin doesnt insta stun but gives you limb paralysis overtime and heart attacks if it stays in for too long and it is also alcholic
      • -
      • beepsky smash now summons imaginary beepskys that deal stamina damage instead of outright stunning
      • -
      -

      Ghommie (original PRs by Time-Green and Qustinnus) updated:

      -
        -
      • loot crates can't explode after unlocking anymore
      • -
      • jumping into loot crates no longers causes them to go boom
      • -
      • You can now deconstruct abandoned crates with a welder without making them go boom. After unlocking them, of course.
      • -
      -

      Ghommie (original PRs by Tlaltecuhtli and nicbn) updated:

      -
        -
      • alt click to eject beakers from chem masters + chem dispensers + grinders + chem heaters
      • -
      • hit chem master + chem dispenser + chem heaters with a beaker and if its loaded with another it swaps em
      • -
      • All-In-One Blender UI uses a radial menu now. You can see the contents and reagents by examining.
      • -
      -

      Ghommie (original PRs by XDTM, 4dplanner, nemvar and, yes, myself) updated:

      -
        -
      • Merged tinfoil hat kind of protection into the anti_magic component.
      • -
      • Tinfoil hats can also be warped up from excessive dampening of mindray/though control/psicotronic anomalies, or by simply being microwaved in an oven, and become useless.
      • -
      • Immortality Talisman and Paranormal Hardsuit helmets now come with tinfoil protection too (minus the paranoia and limited charges).
      • -
      • Genetics/Slime/Alien Telepathy and Slime Link are now stopped by tinfoil protection.
      • -
      -

      Ghommie (original PRs by XDTM, optimumtact, Nichlas0010 and monster860) updated:

      -
        -
      • Added Quantum Keycards, devices that can link to a quantum pad, and can be used on any other quantum pad to teleport to its linked pad. spellchecking: Renamed "Bluespace Teleportation Tech" tech node to "Bluespace Travel".
      • -
      • Moved roasting sticks from the "Bluespace Travel" to "Practical Bluespace".
      • -
      • Spraying holy water on tiles will now prevent cult-based teleportation from using them as a destination point.
      • -
      • Quantum, wormhole and magic teleportation is no longer disrupted by bags of holding.
      • -
      • You are now also blocked from teleporting IN to no-teleport areas, not just out of them.
      • -
      • Quantum teleportation now makes pretty rainbow sparks instead of the normal ones.
      • -
      • Non-bluespace teleportation (spells etc.) no longer makes sparks.
      • -
      • Fixed teleportation deleting mob spawners like golem shells and ashwalker eggs.
      • -
      -

      Ghommie (original PRs by carshalash, GranpaWalton, BebeYoshi & Hexmaniacosanna, Fire Chance, Ordonis, Krysonism and OnlineGirlfriend) updated:

      -
        -
      • Reduced booze power of Mead, Red Mead, and Irish Cream.
      • -
      • Increased booze power of Grappa.
      • -
      • Added a new premium drink to the soda machine called "Grey Bull" which gives temporary shock resistance
      • -
      • A new drink called Blank Paper was added to the bar menu, it was made by a mime and it represents a new start.
      • -
      • Adds a variety of fine alcoholic beverages for discerning patrons of the bar: Wizz Fizz, Bug Spray, Champagne, Applejack, Jack Rose, Turbo, Old Timer, Rubberneck, Duplex, Trappist Beer, Blazaam and Planet Cracker!
      • -
      • Also more nonalcoholic drinks: Cream Soda, Lemonade and Red Queen.
      • -
      • Packs of a novel artificial sweetener have been added to the kitchen vendor.
      • -
      • Bottles of trappist beer and champagne are now available in the premium seection of the booze-o-mat.
      • -
      • Juicing parsnips now yields parsnip juice.
      • -
      • Maintenance peaches.
      • -
      • Grape soda now cools you down like other sodas.
      • -
      • tweaked the Arnold Palmer recipe, it now uses lemonade.
      • -
      • Added new drink, bottle, vomit and peach can sprites.
      • -
      -

      Ghommie (original PRs by grandpawalton and Mickyan) updated:

      -
        -
      • the contents on the smartfridge icon now change depending on how many items it contains
      • -
      • opening the maintenance panel of smartfridges now correctly updates the icon
      • -
      • Screwing a disk compartmentalizer no longer makes it look like a smartfridge.
      • -
      -

      Ghommie (original PRs by nicbn and coiax) updated:

      -
        -
      • Microwave UI uses a radial menu now. You can see the contents by examining.
      • -
      • Microwaves have a single wire accessible when open, the activation wire. When cut, the microwave will no longer function, when pulsed, the microwave will turn on.
      • -
      • Stabilized dark purple extracts now cook items in your hands, rather than dropping the cooked item on the floor.
      • -
      -

      Ghommie (original PRs by ninjanomnom and nemvar) updated:

      -
        -
      • Trays now scatter their contents when used for attacks, like they are supposed to.
      • -
      -

      Ghommie (original PRs by ninjanomnom, coiax, yoyobatty) updated:

      -
        -
      • Fixed slaughter demons not getting a speed boost when exiting a pool of blood. Fixed slaughter demon giblets not being visible.
      • -
      -

      Ghommie (original PRs by subject217, AarontheIdiot, pireamaineach, Gousaid67 and SouDescolado) updated:

      -
        -
      • Removed plasmamen species speedmod in favor of a slowdown for envirosuits.
      • -
      • Nanotrasen has began deploying departementalized enviro plasmasuits to the station! plasmamens can now benefit from some of the bonuses aswell as the color pattern of their job, while allowing others to easily determine their profession!
      • -
      • Benevolent Nanotrasen makes gulag available for everyone! (Plasmamen retain their equipment and don't die.)
      • -
      • Removes code that theoretically limits plasmamen from being clowns and mimes, but actually doesn't.
      • -
      -

      Ghommie (original PRs by zeroisthebiggay, AnturK, MrDoomBringer, Cobby, ATHATH, optimumtact, GranpaWalton, Skoglol) updated:

      -
        -
      • Blob overminds, sentient diseases, etc. can no longer dump out boxes. Sorry gamers.
      • -
      • Sentient Disease now has almost all symptoms at its disposal.
      • -
      • Adding single-symptom disease abilities is super easy now.
      • -
      • Sentient Disease can now hear (not sure if this was a bug or intentional).
      • -
      • Sentient Disease is a linguist and knows all languages. Still cannot speak.
      • -
      • Gives Sentient Diseases a medical hud to observe their victims further with.
      • -
      • Fixes and moves around some on_stage_change() and Start()-related things for virus symptoms and (sentient) diseases.
      • -
      • The inorganic biology symptom should work properly now when bought by a sentient disease.
      • -
      • Oxyloss icon no-longer shows up when someone has the self respiration symptom
      • -
      • The self respiration now makes you not contract diseases through the air and not breathe in smoke
      • -
      • Sentient diseases can no longer pick two cures that react and disappear when eaten.
      • -
      • Sentient disease cures are now consistently harder, will only pick cures from tier 6 and up.
      • -
      • Disease cures should now stay the same for all infected mobs.
      • -
      • The regenerative coma symptom has a new resistance 4 threshold effect! Said threshold effect will give hosts of the symptom's virus the TRAIT_STABLECRIT trait if its threshold is met.
      • -
      • An obscure, probably never reported before bug that may or may not exist involving sentient diseases and the self-respiration symptom should be fixed now (if it even existed in the first place).
      • -
      • The cooldown time between each removal or addition of a symptom for sentient diseases has been brought down from an agonizingly long 2 minutes to a more reasonable 1 minute.
      • -
      -

      Ghommie (original pr by Dennok on tgstation) updated:

      -
        -
      • Now you don't lose your pulled thing on the z level edge.
      • -
      -

      GrayRachnid updated:

      -
        -
      • Added windoors to all the flaps on delta.
      • -
      • rebalanced k9dogborgs
      • -
      -

      Hatterhat updated:

      -
        -
      • Magnetic pistols now fit in boot pockets - jackboots, workboots, etc.
      • -
      • literally every pistol subtype fits in shoes now. go wild.
      • -
      -

      Hippie Circuit Port updated:

      -
        -
      • Added all Atmospheric Circuits
      • -
      • Added the ability to color data disks
      • -
      • Added Selection and Storage Examiner Circuits
      • -
      • Added Smoke, Extinguisher, and Beaker Connector Circuits
      • -
      • Added Inserter, Renamer, Redescriber, and Repaint Circuits
      • -
      • Added MMI Tank and pAI Connector Circuits (The possibilities are endless!)
      • -
      -

      Improving and Balancing Cyborgs updated:

      -
        -
      • Added Crew Pinpointer to Security Borg
      • -
      • Added Crew Monitor to Medical Borg
      • -
      • Added Crew Pinpointer to MediHound Borg
      • -
      • Made the Disabler_Cooler compatible with both Security Borg and K9 Borg
      • -
      • Changed the Warning Text upon selecting Security or K9 module
      • -
      -

      ItzGabby updated:

      -
        -
      • Bat Species parts for more leeway for character customization.
      • -
      • Alphabetized decor wing selection window in character creator for simplicity.
      • -
      -

      JTGSZ updated:

      -
        -
      • Added one more gang boss slot bringing total to 4 from 3
      • -
      • Fixed Gang Boss being able to be deconverted
      • -
      • Gave Qualifies_for_Rank Check back its checks in job controller.
      • -
      • Optional species based clothing restrictions
      • -
      • Gang Dominator excessive wall check tweaked to 25 open turfs
      • -
      • Gang Dominator no longer functions off-station.
      • -
      • Adds more control over species based offsets.
      • -
      • qualifies_for_rank now checks latejoin menu
      • -
      • Added Halloween Dwarves, for Halloween... Yep.
      • -
      • Can flip pipes once more.
      • -
      • barricade girder walls use PlaceOnTop instead of new
      • -
      -

      Linzolle updated:

      -
        -
      • ability to quickly max sensors
      • -
      • atmos helmet visual bug
      • -
      • supply display are now properly on the wall
      • -
      • consistency in hop and cap berets
      • -
      • slime people now enjoy eating toxic food and it will not disgust them
      • -
      • hos trenchcloak now properly has a sprite on digi characters
      • -
      • duplicate definition of hos and sec skirts
      • -
      • Krav Maga leg sweep now works properly.
      • -
      • shoes can have a different icon used for their item and mob icons
      • -
      • combat gloves plus having no mob icon
      • -
      • inhands sprite for rainbow knife
      • -
      • colour of highlight on the regular knife when held in the right hand
      • -
      • mining shuttle console can now be printed after computer consoles have been researched
      • -
      • can now carry people on your back by aggressive grabbing them while they are laying down and then dragging their sprite onto yours.
      • -
      • dragging people who are prone is now much slower, and carrying them will allow you to move faster at the cost of taking 5 seconds to lift them up onto your back.
      • -
      • pacifists can now aggressive grab (cannot table slam people though)
      • -
      • blood on your body floating a bit to your right if you're a taur
      • -
      • some suits having no icon on tauric characters
      • -
      • front facing CMO hardsuit icon for naga taurs
      • -
      • colour of medical cross on CMO hardsuit for taurs
      • -
      • taur body and jumpsuit showing through mining suits
      • -
      • all chaplain suits can hold the same items in suit storage
      • -
      • improvement to organisation for chaplain suits
      • -
      • blood halberd not going back to 17 force after unwielding
      • -
      • unnecessary 's at the end of blood rites healing
      • -
      • QoL to blood rites, examine the ritual aura to view how many blood charges are left
      • -
      • surgery cleanup
      • -
      • dissection available round-start
      • -
      • better dissection surgeries from RnD, gives more points
      • -
      • abductors can now see what glands do
      • -
      • antagonist abductors now have a surgeon trait that teaches them every surgery rather than having it just check if they're an abductor
      • -
      • muscled veins surgery
      • -
      • having one of your hands used up if you fireman carry but the person being carried dismounts any way other than you dropping them
      • -
      • Four colour variants of ankle coverings. Select them on the loadout screen.
      • -
      • ankle coverings
      • -
      • allows for shoes that don't cover your feet to be taken into account for footstep sound effects and glass shards
      • -
      • Tend Wounds surgery. Heal in the field, with better healing the more damage the patient has.
      • -
      • Reconstruction replaced by Tend Wounds
      • -
      • made Revival more accessible, more viable alternative to cloning.
      • -
      • advanced surgery tools can't perform lobectomy or coronary bypass
      • -
      • Decorative and insect wings can now be coloured individually, similar to horns.
      • -
      • people getting assigned wings if their savefile is old.
      • -
      • wings that take the hair colour. Unnecessary if you can just set the colour.
      • -
      • Cannot make horns pure black. Trying to do so will set it to a default value.
      • -
      • decorative angel wings being invisible
      • -
      • abductors now actually work
      • -
      • abductor scientist has their own greet message now
      • -
      • unable to read paper on airlocks
      • -
      • ai can see paper (still just shows stars)
      • -
      • Target head and throw a hat at someone to toss it onto their head, knocking whatever they're wearing off if they are wearing a hat. Some headgear can't be knocked off this way.
      • -
      -

      MediHound updated:

      -
        -
      • Made Cyborgs be affected by Ion Storm Law Changes like AIs
      • -
      -

      MrJWhit updated:

      -
        -
      • rebalance melee stamloss
      • -
      -

      Multicam Config updated:

      -
        -
      • removed whether or not the stuff for multicam was checking the useless var and instead now checks the CONFIG_GET flag.
      • -
      • Admins now have a verb in the Server tab to turn AI multicam on and off.
      • -
      -

      Naksu updated:

      -
        -
      • default radiation insulation is now handled by atom vars rather than a component, components can still be used.
      • -
      • squeezed a little bit more perf out of atmos
      • -
      -

      Nero1024 updated:

      -
        -
      • Bare feet will now make the correct footstep sounds.
      • -
      • Other mobs will make the correct footstep sounds.
      • -
      • Crawling/dragging sounds for downed/incapacitated mobs
      • -
      -

      Onule & Nemvar (ported by Ghommie) updated:

      -
        -
      • New Revenant icons
      • -
      -

      Original by Citinited, port by Sishen1542 updated:

      -
        -
      • You can now use an airlock electronics on a locker to add a lock, and can screwdriver an unlocked locker to remove its lock.
      • -
      • You can now remove the locks on broken or emagged lockers.
      • -
      • Removing the lock from a personal locker now wipes that locker's ID details.
      • -
      • Broken lockers have had their appearance changed.
      • -
      -

      Owai-Seek updated:

      -
        -
      • custodial cruiser cargo crate
      • -
      • removed light replacer from power designs and moved to misc designs
      • -
      • added pimpin ride to custodial locator
      • -
      • added additional items to janibelt whitelist
      • -
      • made plant DNA manipulator unwrenchable
      • -
      • reduced janitor premium supply costs
      • -
      • fixed them strawberries
      • -
      • false codpiece
      • -
      • crocin/camphor bottles
      • -
      • updated kinkmate item list
      • -
      -

      PersianXerxes updated:

      -
        -
      • Adds the clockwork_warp_allowed flag to the Captain's Office area, set to FALSE the same way it is for the chapel and armory.
      • -
      • Relocates cult catwalks outside the Reebe dressing room.
      • -
      -

      Poojawa updated:

      -
        -
      • Digitigrade legs are now able to wear shoes and look fancy, Uniforms to come.
      • -
      • Xenos are only digitigrade now, mammals and aquatics have the option.
      • -
      • Fire Alarms are visible in low light situations
      • -
      • fixed vore prefs saving inconsistently, new characters might have a previous slot's prefs tacked on.
      • -
      • fixed mammals not having the option for digilegs. Sprites are fucky until body-part related sprites are done.
      • -
      • improved vore sound responsiveness to preference choices.
      • -
      • removed morphine from Medihound sleeper chemical list
      • -
      • fixed preference setting being broken
      • -
      • Medihound sleepers are Initialized properly, and icons update correctly now on eject
      • -
      • Air alarm All clear color changed from green to blue
      • -
      • APCs are harder to destroy.
      • -
      • Added Digitigrade versions of everything appliciable in suit.dmi
      • -
      • Snowflake Icons weren't modified, and were given NO_MUTANTRACE_VARIATION
      • -
      • naga and quad Taurs literally don't freeze their ass off in space anymore.
      • -
      • Digitigrade legs will toggle on/off properly on character menue
      • -
      • The misleading "normal" has been removed from species options
      • -
      • Added sanity checks to emag usage
      • -
      • fixed vtech, but it still doesn't work because of overriding jog/sprint mechanics from combat reworks.
      • -
      • Puppy jaws properly store if you're emagged, they are also toggle-able for stealth like the tongue.
      • -
      • Digitigrade legs should properly fucking update for the last fucking time. Fucking snowflake code. refractor: Got rid of snowflake sechound cuffs, gave them normal zipties like regular secborgs.
      • -
      • dogborg sleepers actually extinguish people who are on fire, in case you don't have time to lick them out.
      • -
      • Taur suits should fix themselves properly when worn by other people.
      • -
      • Added the Yogs/Oracle ported latejoin menu
      • -
      • All markings, tails, ears, and snouts for Citadel races are color matrixed!
      • -
      • all markings are on a per-limb basis, including Digitigrade legs!
      • -
      • a bunch of tails were blessed with tail wagging sprites, Fish, Sharks, Fennecs, Wahs, raccoons, and others.
      • -
      • Tiger markings + tail added, skunk tails improved via sprites from Virgo
      • -
      • tweaked some sprites to look better, but they absolutely could use a few extra passes for quality
      • -
      • HumanScissors in the Tools folder will permit anyone to contribute matrix'd markings to the sprite sheet, however Mam_markings is very, very full. Be careful.
      • -
      • Character preview was both optimized for taurs and bad-touched for better updating. I don't know if it'll be bad, but hey its better.
      • -
      • Added Dark Medihound and Pup Dozer from Virgo
      • -
      • Clone pods no longer announce the name of the clone
      • -
      • fixed flavor text appearing when your face is hidden but you're not an Unknown
      • -
      • Tauric suits now apply an (placeholder) blood overlay, as well as their shield overlay.
      • -
      • Ashwalkers now have lungs. They cannot breath station air without suffocation effects, but are completely fine on their homeworld.
      • -
      • Carbon mobs now have a maximum tolerance to oxygen of 50kPa.
      • -
      • Deluxe synthetic lungs have a very high bonus to O2 tolerance.
      • -
      • Digitigrade legs returned to normal, since digi leg markings overlay them anyway.
      • -
      • commented out lizard mam_snout entries, because too many abominations
      • -
      • Vore Panel restored to have various interactions available again. Semi-untested but should work as advertised.
      • -
      • Vore Panel has more feedback.
      • -
      • is_wet var to bellies, toggled in the panel, will remove flesh sounding struggles and the internal loop. JSON version updated.
      • -
      • Feeding var. You will need to enable feeding to recieve any feed vore actions, but you can now feed yourself to mobs that have this set. TODO, Dogborg sleeper feeding.
      • -
      • vore mode button now required to be enabled to perform vore actions. It's the mouth icon!
      • -
      • Ash Drake vore fixed for actual reals this time
      • -
      • Mobs shouldn't spam the released contents announcement anymore on qdel or death. Only if triggered
      • -
      • Hostile mob code now properly ignores targets in bellies
      • -
      • Your belly can quietly growl if you're starving now.
      • -
      • Normal blood splattering isn't offset due to tauric mode
      • -
      • Added plasma man suit icons for taurs
      • -
      • Added bee butt for insects to have stripes
      • -
      • adjusted random spawn sprite accessories, humans won't be demi by default and lizard/mammal spawns will randomly get digitigrade legs
      • -
      • sprite adjustments for tentacles, as well as a misspelling.
      • -
      • Humans once again use ears and tail_human, as intended. This is to prevent garish randomness
      • -
      • istype for species is actually correct and usable now, it'll be a factor for monkey form expansions.
      • -
      • Hair functions are de-gendered and more easily selectable now.
      • -
      • Slimes can *wag, select markings and snouts, and yes it works.
      • -
      • Slimepeople extra parts now respect their hair_alpha in terms of being somewhat see-through. it shouldn't stand out as badly now!
      • -
      • Hunger noises are now toggled per character
      • -
      • Ashwalker den is habitable by ashwalkers again
      • -
      • Medical belts now have overlays! Now you can see if a belt is useful or just flatout empty.
      • -
      • fixed hypo MK IIs not being able to be put on medical belts
      • -
      • fixed Navy officer uniforms that failed to spawn
      • -
      • Loadout items will be forcefully added to backpacks or at your feet instead of left behind at title screen
      • -
      • hypospray kits hold 12 now, but only vials and sprays themselves
      • -
      • labcoats can carry MK II hyposprays on them now.
      • -
      • Vore Mobs are a thing now, not just ash drakes
      • -
      • Removed hunger sound stuff. never taking requests from Coolgat3 ever again. refractor: Simple Mobs use the same system regular human mobs do, itjustworks.png
      • -
      • Character Window settings unsnowflaked and normalized. I have no fucking clue how to make them work with taurs still tho, sorry.
      • -
      • added rotating background images for better clarity and contrast than just SOLID FUCKING BLACK. Images from Virgo/Polaris/Eris
      • -
      • Defib users automatically stop pulling when they attempt to perform a defib shock
      • -
      • added muzzled varients of space helmets and full masks
      • -
      • added knight_grey to taur suits, all paranormal ERT now have tauric versions enabled
      • -
      • Lava knights have digitigrade and tauric versions now
      • -
      • Added a glass version of the gas mask, because it was in the files and looked nice. does everything regular ones do except make you an unknown
      • -
      • Added custom species names! Examining people will now display their species name unless they're an Unknown or have their face hidden. like flavor text. Set it in your character window!
      • -
      • changed how health scanners print messages, wrapping it in msg for one to_chat instead of printing every line to_chat.
      • -
      • Discord bot will now report when a round ends and give the vague news ticker that a sister-station would have received for the game mode and result of the round.
      • -
      • fixed medical hardsuit overlay issue. I thought it was going to work well but fuck byond.
      • -
      • None body markings shouldn't give rgb hell, but it also should reset properly anyway. ree.
      • -
      • Sorted some sprites to better sooth my byond icon limit anxiety.
      • -
      • Box Cryopods expanded to 6 public. Permabrig cryo fixed.
      • -
      • Delta Cryopods expanded to 6 public. Permabrig cryo fixed.
      • -
      • MetaStation Crypods expanded to 6 public, relocated above sparring ring. Permabrig cryo fixed
      • -
      • PubbyStation gained one more cryopod, Permabrig's cryo fixed.
      • -
      • Omega given one more crypod as well.
      • -
      • Gulag was given a cryopod.
      • -
      • Box and Meta's cryo rooms are now a new room entirely.
      • -
      • Added erect states for all phallic bodyparts
      • -
      • YOUR DICK ACTUALLY STANDS UP NOW, YOU'RE WELCOME.
      • -
      • skintone locked genitals match the new skintone colorations.
      • -
      • added two new vaginal types and descriptions.
      • -
      • fixed borg defib runtimes
      • -
      • fixed heart attacks being nonlethal
      • -
      • Ported Oracle's cloning set up, you're now visible like cryo when being cloned, though it's a mystery until you have skin on your meat puppet existance
      • -
      • Recyclers are unable to destroy the indestructible any longer.
      • -
      • Kiara's toy sabre now actually is the correct item + icon states
      • -
      • Generic armor for taurs fixed, there isn't actually any sprites for 'em, so. Full sprites overlay over bodies, but I really can't be bothered to do all the offset fixes otherwise.
      • -
      • Large maps have had a patient room transformed into micro chemistry stations with nothing else in them. They've been labelled 'Apothecary' rooms and are accessible by doctors.
      • -
      • females now have female defined sprites
      • -
      • Slime legs have had their excess pixels adjusted
      • -
      • Mammal normal legs are more in line with human legs now
      • -
      • fixed species like abductors and golems getting the fat tiddy or pingas
      • -
      • Atmos and Station alerts should be more alerting.
      • -
      • Added visible and hidden testicles
      • -
      • Added multi-boob support. Now you can have two or three pairs of breasts.
      • -
      • fixed missing vagina and breast sprites
      • -
      • fixed prosthetic hands being invisible
      • -
      • male foxes exist again
      • -
      • female chest markings improved from being too dark in comparison to their other colors, blending better
      • -
      • Markings behave better on non-organic limbs.
      • -
      • tweaked the name of Sublter to distinguish its use
      • -
      • Gave a hint for vore posting.
      • -
      • Readded Ninja speech modifications with their mask
      • -
      • Pacifists can eat people for heal belly or noisy. Digestive modes are auto-swapped to noisy
      • -
      • Added an underwear toggle button under 'Object' tab
      • -
      • Genitals now layer under underwear. Hide these if they're too obnoxious.
      • -
      • Added digitigrade socks of all known ones anyway.
      • -
      • tweaked the Genital character creation layout to look better
      • -
      • fixed having balls/womb when you don't have the linked organ at character creation
      • -
      • fixed being able to squeeze semen directly from your balls. Probably.
      • -
      • NT Newscasters have had repeated reports of gang activity and are now looking into it.
      • -
      • NT Psykers keep mumbling about last words of someone who died. Somehow they even have a newsletter for this...
      • -
      • Gangster greeting messages are a batch message rather than 5 laggy to_chats
      • -
      • RCL now show what color is currently in use
      • -
      • Added RGB blood effects, know whose blood this is by color!
      • -
      • Added Synthetics blood, and a machine that produces it. A universal donor for medical to heal people with. Make it via medical protolathe!
      • -
      • With hearts, slimepeople shouldn't die from the effects of not having a heart.
      • -
      • Plasma vessels from xenomorphs will restore blood if you're on resin.
      • -
      • Poly's speech now echos to the chat bot.
      • -
      • Added new wings to Insects and separated fluff from old ones, they're Insect's new body markings now without being per-limb (for now).
      • -
      • Horns are now available to mammals, and they have their own color.
      • -
      • Legs are no longer a binary hack code, but actually something that can be changed. Framework for tauric adaptations.
      • -
      • Purged Modular Citadel's sprite_accessories.
      • -
      • improved the quality of a number of sprites.
      • -
      • Moths are now all insects. Avians and Aquatics are all anthromorphics. Just as planned.
      • -
      • Anthromorphs can choose their preferred gibbing meat. I guess. Snowflakes are weird.
      • -
      • Additional Gentlemen names.
      • -
      • Medical huds are now calibrated for Radioactive wavelengths.
      • -
      • Engineering equipment, blue space, and common storage containers are radiation protected
      • -
      • fixed suit storage not cleaning radiation levels of everything stuffed into them.
      • -
      • QM is able to hire/fire people to their department now.
      • -
      • cryopod UI isn't complete shit anymore
      • -
      • Cryopods purge silicon gear more efficiently now. Same with ghosts.
      • -
      • Med Sprays are now more aligned with patch mechanics
      • -
      • Chemistry is encouraged to be more varied in their healing, as well as careful in its application
      • -
      • Active NPC priority set much higher priority for the MC, with the intent on making NPC combat more interesting
      • -
      • Clarified access descriptions of some jobs
      • -
      • fixed missing deco wing states
      • -
      • fixed a few things related to vore content
      • -
      -

      Putnam3145 updated:

      -
        -
      • Bottles in PanD.E.M.I.C 2200 can now be replaced with an inhand bottle directly
      • -
      • Ejecting a bottle from the PanD.E.M.I.C 2200 puts it directly into the user's hand
      • -
      • Alt-clicking the PanD.E.M.I.C 2200 ejects the current bottle
      • -
      • neural nanites only work/drain if you have brain damage or traumas the nanites can fix
      • -
      • Pod people can no longer get fat from standing in the light
      • -
      • PanD.E.M.I.C 2200 now ejects onto itself instead of onto user if user's hands are full
      • -
      • Added configs for a bunch of Dynamic rule parameters.
      • -
      • Added defaults for all the configs (WIP).
      • -
      • Added dynamic midround/latejoin antag injection to the config.
      • -
      • Made starlight condensation not kill slime people.
      • -
      • Added not-killing-slime-people to the transmission threshold of plasma fixation and radioactive resonance.
      • -
      • Made the clone scanner lock while it's scanning.
      • -
      -

      R3dtail updated:

      -
        -
      • Added 16 saltprimaryobject items Added 4 saltsecondarysubject items
      • -
      • Added a new carpet. Red! Also added said carpet to the Premium Carpet crate from the cargo supply console. Trilby said she'd take care of the crafting recipe.
      • -
      -

      Raptorizer updated:

      -
        -
      • Doubled peach spawn rate
      • -
      • tweaked numbers/variables
      • -
      • rebalanced numbers/variables
      • -
      • removed unneeded code
      • -
      -

      Seris02 updated:

      -
        -
      • Abductor Replication Lab ruin and advanced tools
      • -
      • Added looc hotkey
      • -
      • made the autoprocess button relevant
      • -
      • changes so that spooktober starts earlier
      • -
      • fixed the dark blue lum major effect
      • -
      -

      Sirich96 and Dennok (ported by Ghommie) updated:

      -
        -
      • Added new Teleporter Station sprites
      • -
      • Added teleport station calibration animation.
      • -
      -

      Sishen1542 updated:

      -
        -
      • Pentetic Jelly, new chemical made through mixing 1:1 slime jelly and pentetic acid.
      • -
      • Anatomic panacea now gives pent jelly instead of pent acid. Medbeams now have TRUE tox healing to heal TOXINLOVER as well.
      • -
      • Changed bible heal proc, halving the healed damage and increasing brain damage 5x in exchange for a much wider array of items to protect you from it.
      • -
      • Moved around some chems from emag list into upgrades.
      • -
      • Added some fun chems to dispensers.
      • -
      • Gave dispensers old tg functionality.
      • -
      • Leather, cardboard, bronze & bone golems!
      • -
      • Bone hurting juice and interactions with plasmamen, skeletons & bone golems!
      • -
      • Ported addition of new CAS cards.
      • -
      • Ported a fix for CAS.
      • -
      • Added the ability to alter your genitalia as a slimeperson more than addition/removal.
      • -
      • fixed genitalia removal proc in alter form.
      • -
      • Ported the inability for non-station AI to interact with station z-level.
      • -
      • HoS mains can now peacefully sleep in their office.
      • -
      • Podpeople now have customization options.
      • -
      • Removed the human check for cult conversion of captain/chaplain minds.
      • -
      • Roundstart carbon jetpacks now have full_speed FALSE.
      • -
      • Adds plasteel to medical and security techfabs.
      • -
      • Added public autolathes to all maps.
      • -
      • density = 0
      • -
      • hugboxing mining loot
      • -
      • ling blade now has 40 armor pen
      • -
      • fun
      • -
      • bad stuff
      • -
      • mech bad
      • -
      • rebalances strained muscles
      • -
      • added in the assistant response team
      • -
      • fixed up access on the centcom hangar button
      • -
      • storage tweaks for belt briefcase
      • -
      • codersprite for belt briefcase
      • -
      • added pharaoh gear to chaplain vendor
      • -
      • fixed typos in pharaoh items
      • -
      • made laser minigun not shitcode and also craftable
      • -
      • added new fire sounds for the laser minigun
      • -
      • holy lasrifle, hypertool, divine lightblade, and blessed baseball bat. Four new holy weapons!
      • -
      • stamina and force tweaks for most holy weapons.
      • -
      • prayer beads no longer deconvert after a 10 second timer, now just inject holy water for delayed effect
      • -
      • cultist runes are now destroyed with a bible or a null rod
      • -
      • bo-staff now functions as a nerfed sleepy carp staff
      • -
      • fixed kevinz code to add in non-null rod child items as holy weapons
      • -
      • fixing chems for strained muscles
      • -
      • narsie no longer asks for consent
      • -
      • removed reflect from divine lightblade
      • -
      • teleporting a locker is bad
      • -
      -

      Sishen1542, original by @Tlaltecuhtli updated:

      -
        -
      • alt clicking the emitter now rotates it instead of only flipping
      • -
      -

      Sishen1542, original by @zxaber updated:

      -
        -
      • Utility mechs no longer automatically get beacons.
      • -
      • Tracking beacons no longer delete themselves when EMPing a mech, and instead have a ten-second cooldown in-between EMPs. They also now do heavy EMP damage rather than light.
      • -
      • Mechs that take EMP damage lose the use of their weapons and equipment temporarily. Movement and abilities are not effected.
      • -
      • Mechs taking EMP damage no longer roll for a random malfunction.
      • -
      -

      Sishen1542, original by Arkatos updated:

      -
        -
      • Action buttons can now be dragged onto each other to swap places
      • -
      -

      Sishen1542, original by NewSta updated:

      -
        -
      • updated the miasma canister sprites
      • -
      -

      Sishen1542, original by Skoglol updated:

      -
        -
      • Heaters/freezers now support ctrl clicking to turn on and alt clicking to min/max target temperature.
      • -
      -

      Sishen1542, original by XDTM updated:

      -
        -
      • Using the wrong surgery tool during surgery no longer attacks the patient, if on help or disarm intent.
      • -
      • Surgery steps are now shown in detail only to the surgeon and anyone standing adjacent to them; the patient and people watching from further away get a more vague/ambiguous description.
      • -
      -

      Skoglol updated:

      -
        -
      • You can now alt click storage (bags, boxes, etc) to open it.
      • -
      -

      Skully) updated:

      -
        -
      • Nudity Permit, a completely invisible uniform that still has pockets and such, to loadout options. It is more or less a direct port from the RP server.
      • -
      -

      SkullyRoberts updated:

      -
        -
      • Penis autosurgeon as rare maint loot.
      • -
      -

      TerraGS / Skoglol updated:

      -
        -
      • Adds toggleable light and blinking charge indicator to kinetic crusher
      • -
      • Kinetic crusher can now be one-hand carried. You'll still need two hand to use it.
      • -
      -

      Thalpy updated:

      -
        -
      • fixes message_admins in SDZF
      • -
      • Alkaline buffer recipe so people don't get grumpy and expanded the pH range
      • -
      • fixes buffers
      • -
      • fixes broken compiler because a var changed name
      • -
      • impure travis var anger
      • -
      • Added the ability to dispense smartdarts from the chemmaster.
      • -
      • Tweaks medolier amd chembags to allow quickpickups of smartdarts, lets the latter soak in beakers (on the floor)
      • -
      • fixed rounding errors with smartdart mixes.
      • -
      • added modified smartdartgun icon.
      • -
      • 1. Kev asked that there were no antag datums used, so that's been changed. 2. Tricks can no longer turn someone into a dullahan, instead you have to spend candies to get that. I felt it was too mean to turn people into that, I didn't realise you couldn't revert it. 3. Barth will no longer as for impossible items. 4. Barth will no longer as for the same item multiple times. 5. Barth will now accept broader things, rather than asking for something, when meaning something specific. 6. Jacq will now no longer poof off the z level. 7. Jacq will (hopefully) stop spooking the AI by teleporting into there 8. Jacq will now try to teleport to a location with someone nearby. 9. Barth will tell you where Jacq is currently when you speak to him. 10. You can trade 2 candies for a Jacq Tracq (tm) 11. Jacq should stop getting mad and cover the station in gas when killed. 12. Fixed Jacq not singing (the link died). 13. Slightly changed wording so that people will hopefully get to know her. 14. Jacq no longer disappears when you're getting to know her.
      • -
      -

      Toriate updated:

      -
        -
      • All regular crates are now 3/4ths ToriCrates iamgeadd: Unused plastic crate sprite added
      • -
      • Blood freezer crates now have unique sprites.
      • -
      • RPD now has inhands
      • -
      • New sprites for RCDs and RPDs, inhands included
      • -
      • Updated the sprites of all the regular crates
      • -
      -

      Trilbyspaceclone updated:

      -
        -
      • cakes!
      • -
      • Made some sprites! -Love them really came out well
      • -
      • new economics
      • -
      • cargo and robotics relationships
      • -
      • unbalanced something
      • -
      • fixed a maybe oversight
      • -
      • Fun
      • -
      • costs of suit voucher
      • -
      • Unblances miner vender
      • -
      • spare cheaper brute kit
      • -
      • harm from hentie
      • -
      • rebalanced goliaths stun to be less auto death
      • -
      • Armor to blob shields
      • -
      • block weaken state to 70% from 75%
      • -
      • restores the deathriplys missing armor
      • -
      • new lockable colalr
      • -
      • armor
      • -
      • missing hopes and dreams
      • -
      • orgized the weapon file to be more cat brain friendly
      • -
      • This means sprite right?
      • -
      • Many engi flags on non-engi things
      • -
      • changed some code to be organized at a glance
      • -
      • 25% < --- 50% For NPC blocking bullshit ided: Yes
      • -
      • mag gun uses cells
      • -
      • kev things their to op
      • -
      • syndicate phobia
      • -
      • other phobia's
      • -
      • laser carbine
      • -
      • makes collars only locked via key
      • -
      • charging
      • -
      • Combat inducers for COMBAT!
      • -
      • made it look nice
      • -
      • golden swag boxes
      • -
      • Crafting suitcases
      • -
      • more bountys
      • -
      • Nitryl bounty
      • -
      • better stocks
      • -
      • more evil blood fluff text
      • -
      • Added more mime names
      • -
      • replaces a sink with a autolathen
      • -
      • 2 -> 3
      • -
      • MASON SUIT!
      • -
      • adds the sec jetpack to sec hardsuit storge
      • -
      • Added a few jet packs to the space queens men
      • -
      • volume of jet packs
      • -
      • Bad Idea
      • -
      • bio mass meat
      • -
      • more box options
      • -
      • a lack of replaceable boxes
      • -
      • clothing needing a emag
      • -
      • 4 - > 5
      • -
      • 5->6
      • -
      • 4tc - > 2tc
      • -
      • mulligan costs 4 - > 3
      • -
      • Tuberculosis 12tc - > 8tc
      • -
      • 15 - >10
      • -
      • both bags have the same name
      • -
      • 5 - > 2
      • -
      • 3 -> 1
      • -
      • 2 < - 4
      • -
      • 1->2 and ultra
      • -
      • shield + crafting
      • -
      • hierophant movment and melee attack
      • -
      • More plushies
      • -
      • attack verbs and descs
      • -
      • bone satchles
      • -
      • rebalanced stunslugs
      • -
      • colored boxes, and more types
      • -
      • harm and such
      • -
      • item classes
      • -
      • resonators being so shitty
      • -
      • Game braking bug critical: bug fix
      • -
      • items to syndie surgery bags
      • -
      • SNOW CONES
      • -
      • carts buy-able cargo
      • -
      • selling/time to craft
      • -
      • crafting problems, and red stamp exsplote
      • -
      • gives paper work sprites that are nicer
      • -
      • origami
      • -
      • gang tower shield
      • -
      • costs of boots
      • -
      • organ box
      • -
      • Medical breifcaseses
      • -
      • New cargo crate for tech-slugs!
      • -
      • Ammo to each fitting crate
      • -
      • Cat-code
      • -
      • fixed a few typos - Again my bad
      • -
      • fixed airless place
      • -
      • baklava
      • -
      • makes uplink kits more usefull for the risk
      • -
      • Changes some files to be better
      • -
      • As all things are not
      • -
      • fixing cat code that dosnt work, my bad
      • -
      • Arcades stealing from noodles
      • -
      • rapier
      • -
      • speedy quirk
      • -
      • Ironic
      • -
      • A bunch of minor issues with xenobiology are no more!
      • -
      • I didn't code it right it in the first place
      • -
      • new nodes
      • -
      • points and node gear
      • -
      • stuff n things
      • -
      • gear harness and a conflict merg
      • -
      • Nudity permits
      • -
      • nothing
      • -
      • Donner item
      • -
      • Luna's Gauntlets
      • -
      • rebalanced lingy dingy powery gamey
      • -
      • melee and block harm
      • -
      • sprites*
      • -
      • holster doing holster things
      • -
      • Donor item
      • -
      • Joy, Happiness, Honk
      • -
      • small mix up in terms
      • -
      • Promiscuous Organs crate, pills to lewd crate and testicles to maints
      • -
      • Made unholy water healtoxinlover
      • -
      • Zelus Oil, brass flasks
      • -
      • Added new chairs
      • -
      • Bugtesting zone upgrades for easy bug/game testing
      • -
      • more cargo to cargo
      • -
      • More loadout gear
      • -
      • Poojawa power creep
      • -
      • Not my work not my credit
      • -
      • Emitter gun
      • -
      • suit storage nulling anti magic item protection
      • -
      • rebalanced steal goals restrictions
      • -
      • fixed a few misleading goals
      • -
      • ports a fix
      • -
      • oversight in benos
      • -
      • QM rooms not getting Key Aunths
      • -
      • new books/cooking
      • -
      • less bad wording in slime
      • -
      • strawbarries and such
      • -
      • amazing things like tea of catnip, catnip and plant
      • -
      • glue uplinks
      • -
      • RPDs to drones
      • -
      • Armor and such
      • -
      • flavor
      • -
      • maybe a runtime
      • -
      • chameloen clothing
      • -
      • tons of peach themed items
      • -
      • caje
      • -
      • New book - Unused
      • -
      • organized files
      • -
      • redid brass tools to look better*
      • -
      • /cursed from a item path
      • -
      • Almost all clothing and most weaponds can be sold for pocket change
      • -
      • Cargo costs of packets and selling
      • -
      • Lowered mat selling as well as most if not all bountys
      • -
      • Adds more files for easy finding/adding in packs
      • -
      • oops not being blacklisted
      • -
      • removes some cit-modular things
      • -
      • Missing sprites with bad ones
      • -
      • emag charge amount
      • -
      • Reebe QoL aka creep in gear
      • -
      • ???
      • -
      • HEY MADE THE REEBEEE WAY SMALLER - Making it less lagging hopefully
      • -
      • Surgerys and spays in bags
      • -
      • earthbloods stam regen
      • -
      • Red to Blue/Black crosses as questioned by Bhijn
      • -
      • clean bot not cleaning basic cleanables
      • -
      • new traitor bundle
      • -
      • trash
      • -
      • eye bleed :add: misstakes
      • -
      • Removed old things!
      • -
      • UI memes
      • -
      • Blue space blood bag
      • -
      • blood costs
      • -
      • Beebal and Honeybalm plants
      • -
      • Costs of crates and paperwork
      • -
      • Adds 2 more crates hacked only
      • -
      • Added two seed packets of cotten to ash walkers base
      • -
      -

      Tupinambis updated:

      -
        -
      • Changes large parts of the nuclear operative base, including the addition of a new barracks where the ops spawn, a personal bedroom for the leader, the rearrangement of numerous rooms, some added fluff, a slightly more roomy bar, a larger hanger, a kitchen, and various other small changes to make the base feel just a bit more alive. This was achieved by completely redoing the base from scratch so there was room to work with, as a result potential bugs could crop, please do report them.
      • -
      • The drop pod chamber was airless. This seems like an oversight, and has been filled with air.
      • -
      • Cryo Sleepers have been added to Perma on all four maps in rotation. the bathroom windoor and window have switched places to accommodate this change.
      • -
      • You can now choose the pre-exisiting "loader" sprite as an appearance for your engineering borg.
      • -
      • A vast majority of references to humans within ion laws have been replaced with crew. AI modules have received similar treatment
      • -
      • Adds a syndicate themed emergency shuttle that costs 20000 credits, and can ONLY be purchased when the communications console is emagged. This shuttle features a fully stocked medbay with self serve sleepers, plenty of room that can fit highpop, a fully featured bridge, ballistic auto turrets, and an armory, EVA prep room, and bar, all of which are only accessible by either an agent ID or through hacking. --EVA prep features 2 syndicate hardsuits and 3 syndicate softsuits. -Armory features 5 stetchkins with spare ammo, and 2 riot c-20r's. -![image](https://user-images.githubusercontent.com/42078130/48306551-0b786380-e500-11e8-821a-e59ac4eee0ea.png)
      • -
      • Lone operatives no longer spawn with a syndicate hardsuit and a bulldog. They instead spawn with a black and red EVA suit and an extra 15 TC (40 in total) ![image](https://user-images.githubusercontent.com/42078130/48308065-c44e9a80-e520-11e8-8d60-cec8ff23d61d.png)
      • -
      • The tesla engine has been replaced with a supermatter engine, and pubby engineering has been redesigned to accommodate this change.
      • -
      • The tesla engine has been completely removed along with any related components
      • -
      • RD and R&D vents are now actually connected to the air distribution.
      • -
      • New engineering hivebot. Has a bit more health but otherwise aesthetic.
      • -
      • Oldstation no longer has an excessive amounts of hivebots within it, however the bots that remain are individually a larger threat.
      • -
      • Hivebots are now more robust, with a higher melee damage output and health.
      • -
      • Remove this ruin from the blacklist or this PR is pointless.
      • -
      • the air injectors for the SM engine waste and for toxins waste should now receive power
      • -
      • Adds a mixed clothing closet to Deltastation Dorms.
      • -
      • Adds a bottle of unstable mutagen to Botany, on account of its distance from Chemistry.
      • -
      • Omegastation should no longer have any turf with missing textures, as those spots have been replaced with playing covered in a sandy turf decal.
      • -
      • Removed all living eggs from the xeno ruin because people self antag. Honk.
      • -
      • Adds a new security level between Blue and Red (Amber). The shuttle call time at this level is 8 minutes.
      • -
      • Blue security level now has a shuttle call time of 12 minutes.
      • -
      • The security level increase/decrease texts have been modified to accommodate the change.
      • -
      • Adds a code Amber sprite for the fire alarms
      • -
      • Removed the plushes from the toy crate, giving them their own.
      • -
      • Plushes are now less likely to spawn out of arcades
      • -
      • Removes a moth plush from the game.
      • -
      • added a small fire delay (3 ticks) to automatic shotguns
      • -
      • Reduced buckshot brute damage by 20%. (12.5 -> 10 brute per pellet) (75 -> 60 brute at close range)
      • -
      • Reduced rubbershot stamina damage by 40% (25 -> 15 stamina per pellet) (150 -> 90 stamina at close range)
      • -
      • Reduced beanbag stamina damage by 12.5% (80 -> 70 stamina per shot)
      • -
      • Engivend RCDs now vend upgraded RCDs
      • -
      • Beautified and stylized the cyborg HUD sprites, animated and cleaned up some of the old, modernized APC hacking and Doomsday sprites,
      • -
      • moved cyborg language select above the radio icon, instead of above the picture icon.
      • -
      -

      Twaticus & Poojawa updated:

      -
        -
      • Added new carpets from TauCetiStation!
      • -
      • More Liquid carpet chemicals, mix carpet with certain reagents to get different colors!
      • -
      • Tablets have a better means of being assembled codewise. nothing's different on player end.
      • -
      -

      UntoldTactics updated:

      -
        -
      • Rewords the click here prompt given when an attempted conversion is done on an offer rune (for blood cult)
      • -
      -

      UristMcAstronaut updated:

      -
        -
      • allows a pai to activate its holoform while in a pai connector without getting derped.
      • -
      -

      Useroth updated:

      -
        -
      • the collars are now aware of their proper overlay sprites
      • -
      • The space hotel dorms are now properly boltable with the buttons inside.
      • -
      • Makes the booze-o-mat hacked by default. Alternative to https://github.com/Citadel-Station-13/Citadel-Station-13/pull/8350.
      • -
      • After the PR which raised the ammo capacity of said magazines, due to the code, they ended up with an invalid icon state. Fixed through changing the icon state name in the icon file.
      • -
      • Taeclowndo shoes which grant the four following abilities: - Conjuring a cream pie right into their hand. Every three seconds. - Making a banana peel appear out of thin air at the tile of the clown's choice. Every ten seconds. - Mega HoNk. A touch-ranged, very small AOE ability, with effect equal to being honked by a Honkerblast on a clown mech, with the effects halved for anyone who isn't its direct target. Every ten seconds. - Bluespace Banana Pie. You don't throw this one... not right away at least. This baby can fit an entire body inside. Good for disposal of evidence. 25 second-long action, 45 second cooldown. Also produces a "[victim's name] cream pie". The body drops out of the pie if you splat it somewhere or destroy the pie. If you eat it, it will chestburst out of you a'la monkey cube. -It's a 14 TC item for traitor clowns and a 12 TC item for clown-ops.
      • -
      • The tentacle now directly puts the item in your hands, instead of toggling your throwing and tossing it at you. Tentacles suffer from ranged inaccuracies as if they were guns, I think it's enough of an inconvenience.
      • -
      • Makes the netting much less clunky. If there's only one target you can net while you press the button, it will just net that target instead of bringing up a list of mobs.
      • -
      • Energy nets now revive and fully heal capturees (even dead ones, after calculating points). If someone's got a scan and wants to get cloned, they can always kill themselves still.
      • -
      • Capture points are added on capture, rather than round-end, so it no longer matters whether your captures kill themselves in the holding facility or not.
      • -
      • Makes the nets a bit more sturdy. (previously it took mere two welder hits to break one)
      • -
      • Makes stungloves actually stun people (currently comparably with stunbatons, adjustable). Because electrocute_act(25, H) did fuck all, stunwise, and on top of that, people in insulated gloves were completely unaffected.
      • -
      • Reduced the stunglove electrocute_act value to 15 due to above. Could possibly be lowered further.
      • -
      -

      Weblure updated:

      -
        -
      • Added the relevant Beepsky animations from TG's aibots.dmi file to Cit's aibots.dmi file.
      • -
      -

      WhiteHusky updated:

      -
        -
      • Sleepers now show blood level and type.
      • -
      • Changed the styling of arousal messages to use pink-ish colors.
      • -
      • The orgasm moodlet message new-lines properly.
      • -
      • Flavor text with special characters will not get partially unescaped.
      • -
      • Canceling when setting flavor text does not clear it anymore.
      • -
      • Checking yourself shouldn't freeze the client anymore.
      • -
      -

      XDTM updated:

      -
        -
      • Added the experimental dissection surgery, which can be performed once per corpse to gain techweb points.
      • -
      • Rarer specimens are more valuable, so xenos and rare species are more efficient subjects.
      • -
      • Added two new surgery procedures, under the Experimental Surgery techweb node.
      • -
      • Ligament Hook makes it so you can attach limbs manually (like skeletons) but makes dismemberment more likely as well.
      • -
      • Ligament Reinforcement prevents dismemberment, but makes limbs easier to disable through damage.
      • -
      • Golem limbs can now be disabled, although they are still undismemberable.
      • -
      -

      YPOQ updated:

      -
        -
      • Stealth implants work again
      • -
      -

      Yakumo Chen updated:

      -
        -
      • Made stealth implant boxes flimsier
      • -
      • Autocloning now requires tier 4 parts
      • -
      • Removes autoscan
      • -
      • Scanning people now requires someone to operate the cloning computer regardless of part level.
      • -
      • removed antimagic component from holymelon
      • -
      -

      YakumoChen updated:

      -
        -
      • AEGs brought more in line with current radiation system. Try not to get EMP'd.
      • -
      • Jetpacks no longer last twice as long between air refills.
      • -
      • Reverted laser miniguns.
      • -
      • Adds beanbag slugs to the sec protolathe at round start
      • -
      • Brings shotgun ammo availability back in like between seclathe and autolathe.
      • -
      -

      Zargserg updated:

      -
        -
      • Lungs maximum toxin threshold is 0.5% of the atmosphere.
      • -
      • Permanently contaminated atmosphere does not murder crew anymore.
      • -
      -

      ZeroNetAlpha updated:

      -
        -
      • Cleans up autoylathe code and brings it back in line with the regular autolathe.
      • -
      • Fixes autoylathe interface not updating propperly.
      • -
      • Silicons are now consumable by scrub pups.
      • -
      -

      actioninja updated:

      -
        -
      • APC UI autoupdates correctly
      • -
      -

      bluespace bio bags updated:

      -
        -
      • Added bluespace bio bags and put it in the tech web, in the node applied bluespace
      • -
      • added a crappy icon for bluespace bio bags
      • -
      -

      chef updated:

      -
        -
      • Added main hallway approach to monastery
      • -
      • Added Maintenance hallway approach, with some maint loot
      • -
      • moved the docking arm for the white ship
      • -
      • changed placement of some grills and windows
      • -
      -

      coiax updated:

      -
        -
      • When the nuclear disk stays stationary long enough to trigger an increase for the lone op event chance, admins will be notified every five increments.
      • -
      -

      dapnee updated:

      -
        -
      • Plasmaglass tables, spears, tiny plasmaglass shards
      • -
      • Plasmaglass structures now drop plasmaglass shards instead of nothing
      • -
      • Trim lines!
      • -
      • You can now make plasmaglass tables again.
      • -
      -

      deathride58 updated:

      -
        -
      • When a gamemode fails pre_setup, it will now send a message in admin IRC and in ingame admin chat, instead of only being viewable in the logs.
      • -
      • Portal guns now spawn without firing pins.
      • -
      • Reduced the default/baseline nanite pool amount from 100 nanites to 25 nanites, and reduced the maximum nanite amount from 500 nanites to 125 nanites. The safety threshold was reduced from 50 nanites to 12 nanites.
      • -
      • Most of Lavaland's mobs are now on crack.
      • -
      • Blood drunk miners now move once every two ticks, rather than once every three ticks.
      • -
      • Bubblegum now has a maximum movement speed of once every three ticks. Buffed from the original value of once per 5 ticks.
      • -
      • The minimum time for the Colossus to attack again after firing a random shot is two deciseconds, Sped up from the original value of three seconds. The minimum time for the Colossus to attack again after performing a blast is now one second, with the original value being two seconds. The minimum time for it to attack again after performing its alternating shot pattern is now two seconds, original value being four seconds.
      • -
      • Ashdrakes now move once every five ticks, rather than once every ten ticks.
      • -
      • Heirophant chasers now move once every two ticks rather than three ticks by default, and the chaser cooldown has been reduced from 10 seconds to 5 seconds. The cooldown for the Heirophant's major attacks has also been sped up to 4 seconds from the original value of 6 seconds.
      • -
      • The Legion (megafauna) now moves at two ticks per second rather than three ticks. It additionally now actually moves faster while charging. The cooldown timer for it's special attacks has been reduced from 2 seconds to 1 second. Additionally, The Legion's view range has been decreased from 13 tiles to 10 tiles.
      • -
      • All megafauna now have a default view range of 4 tiles, decreased from the original of 5 tiles, and an aggro'd view range of 15 tiles, decreased from the original of 18
      • -
      • Goliaths now move once every ten ticks, sped up from the original value of 40(!!!) ticks. Additionally, their cooldown for their tentacles has been reduced from 12 seconds to 6 seconds. To compensate, their cooldown now only decreases by 5 deciseconds every time they're attacked, rather than 10 deciseconds, their melee damage has been reduced to 18 per hit from 25 per hit, and their vision range has been decreased from 5 tiles unaggroed, 9 tiles when aggroed, to 4 tiles and 7 tiles respectively. Ancient goliaths have a default attack cooldown of 8 seconds, sped up from the original value of 12 seconds.
      • -
      • Legion (the common mob) now has a cooldown of 1.5 seconds on their skull attack, sped up from the original value of 2 seconds. Additionally, their view range has been decreased from 5 tiles, 9 tiles when aggroed, to 4 tiles, 7 tiles when aggroed.
      • -
      • Stamina no longer regenerates at hyper speeds.
      • -
      • To accommodate for upstream's stamina changes, knockdown() now applies staminaloss only to the chest.
      • -
      • adjuststaminaloss() now has a new argument that allows you to specify a zone to apply staminaloss to. This defaults to the chest
      • -
      • apply_damage() is now capable of healing carbon mobs and human mobs.
      • -
      • Since the head has the same exact effects as the chest when disabled, and doesn't really make much sense to be affected by stamina, the head no longer has stamina.
      • -
      • The chest now has a stamina cap of 200 stamina due to the above.
      • -
      • Footsteps now sound mostly the same as they did before the hard sync
      • -
      • Jukeboxes now properly remove themselves from the active jukebox list when destroyed
      • -
      • Server operators and badmins can now make the server play like TG by toggling the stamina buffer on/off using the DISABLE_STAMBUFFER config option.
      • -
      • Airlock wires now work as they did prior to the hard sync
      • -
      • The thing you're currently grabbing is now taken into account when left-click disarming. Things you have grabbed now roughly have a 45% chance to be disarmed.
      • -
      • Disarm push rolls are now determined by the target's staminaloss rather than a flat number.
      • -
      • When you're in combat mode, pushing someone who isn't in combat mode is a guaranteed knockdown. Hard counter to stam regen squeezing in melee combat.
      • -
      • Failed disarm push attempts now deals light staminaloss to the target so long as both the attacker and target are standing. The total stamloss dealt to the target is random, clocking in at a very inefficient 1-5 stamloss per unsuccessful push attempt.
      • -
      • Disarm pushes now play the thudswoosh sound regardless if they're successful or not. Had it not been for copyright, I would've used L4D's melee sound.
      • -
      • Disarm push attempts are now logged
      • -
      • Autostand no longer makes you invulnerable to dropping items when being knocked down with a force greater than 80
      • -
      • You can no longer abuse an href exploit to return from the labor camp before obtaining enough points to satisfy your point goal.
      • -
      • Norko's donor item is now listed in the right category
      • -
      • The medihound sleeper now has a non-vore variant. This will be used by default. The old voracious variant will only appear if both the person being sleeper'd and the medihound have the voracious hound sleepers pref enabled. Sprites by Toriate
      • -
      • "Allow medihound sleeper" is now labelled "Voracious medihound sleepers", and is now off by default
      • -
      • AOOC no longer prints to players in the lobby
      • -
      • Human tails and human ears now save again. Humans now use mam_tail and mam_ears for their snowflake bits instead of tg's equivalent, just as they did prior to human tail and ear saving breaking
      • -
      • Disarm pushes no longer deal staminaloss to resting targets
      • -
      • You can no longer force a hard stamcritted spaceman to stand by clicking them with help intent. Get more creative if you want to torture someone that's in hard stamcrit.
      • -
      • The revolution gamemode now waits until the 20 minute mark before checking for win conditions.
      • -
      • You can no longer resist/move out of grabs while you're resting. Disarming your way out still works, though.
      • -
      • Stamina damage now has diminishing returns on people who are in hard staminacrit with the addition of a new multiplier. When you take staminaloss while in hard staminacrit, you'll be under the effects of the new multiplier, which reduces the amount of staminaloss you take from all sources of staminaloss. The diminishing returns multiplier will steadily return to 1 once you're out of staminacrit.
      • -
      • You can now scramble while resting. You can do this by dragging your spaceman onto an adjacent turf. This works even if you're in staminacrit, but the timer depends entirely on your staminaloss.
      • -
      • Fully augged cyborg people now heal stamina damage properly.
      • -
      • Job EXP is now tracked properly for all roles.
      • -
      • Nightmares and shadowpeople have had their light threshold for being considered in darkness reduced. Nightmares can no longer stand unharmed next to a light fixture during a nightshift 100% unharmed. The threshold is high enough so that APC lights on their own won't harm a nightmare, but being on the edge of a light source will.
      • -
      • The detective revolver's .38 bullets are now non-lethal again, but now require 3 shots to hard stamcrit
      • -
      • The current lethal variant of the .38 bullets can still be printed at sec protolathes.
      • -
      • You can now access ghost roles from the latejoin menu.
      • -
      • Eyeblur now scales depending on how much actual eyeblur you actually have.
      • -
      • Ebows now induce 50 drowsiness on whatever they hit.
      • -
      • Telepads have been buffed across the board. T1 parts on a launchpad still grants you a range of 15 tiles, but T4 parts now grant you a pretty large 60 tile range (up from their original 18 tile range). Briefcase launchpads were also buffed, they now have a range of 20 tiles, up from their previous laughable 8 tiles.
      • -
      • The grace period for the revolution win condition check has been reduced from 20 minutes to 10 minutes. You don't need to wait nearly as long for the round to end if no heads join in.
      • -
      • You can now select plural and neuter as your gender. They're labelled "non-binary" and "object" in the character customization menu, respectively.
      • -
      • A lot more light sources now use the same nonbinary colored lighting philosophies as flashlights and light fixtures!
      • -
      • Flashlights mounted to guns and helmets now retain the same color and power as their original light. Lavaland's caves will reflect a fluorescent blue as you shine your KA around, and sec's helmets are now capable of illuminating maint in that fancy fluorescent blue.
      • -
      • Cameras now shine a fluorescent blue when lit up by an AI
      • -
      • Glowing goo now actually glows green.
      • -
      • Candles had their power reduced from 1 to 0.8.
      • -
      • Lighters now shine a little further, and are now properly colored.
      • -
      • PDAs now shine an incandescent yellow to match their sprite.
      • -
      • Welding tools now shine an appropriate color
      • -
      • Hardhats now shine an incandescent yellow.
      • -
      • Plasmaman helmets now shine an incandescent yellow.
      • -
      • Microwaves no longer overpower literally every single light in the game, instead having a power of 0.9.
      • -
      • Borgs now have incandescent yellow lights to match their sprites
      • -
      • Bots now shine a fluorescent blue light
      • -
      • Airlock light overlays are now on the above lighting layer. This means airlock lights can actually be seen in the dark now.
      • -
      • The mob spawners list no longer leaves null entries behind when a spawner has a job description defined. The latejoin menu will no longer show ghost roles that are filled, and the spawners menu actually works again.
      • -
      • The voting system now actually tracks who voted for what. This means it's now possible to change your vote, and it's possible to see what you voted for.
      • -
      • Using help intent on someone that's in hard stamcrit will now make them heal 15 stamloss.
      • -
      • Auto fit viewport is now enabled by default for new players. One less question off the FAQ
      • -
      • The Khajiit favorite, Skooma, was added as a chemistry recipe that can be produced with cooperation between chemistry and either cargo or service. If you want to spoil the recipe for yourself, take a look at the PR for it!
      • -
      • When the shuttle leaves for centcom, a vote will be started to select the next map instead of the map being randomly chosen via biased voting methods
      • -
      • If a server operator wishes to re-enable the biased TG preference voting system, you can do so by toggling the TGSTYLE_MAPROTATION config flag on in the config.txt. Keep in mind that doing so will bring you great misfortune.
      • -
      • Cacti in lavaland now have 6u of vitfro instead of just 4u. This lessens the gap between cacti and first aid kits, the third rarest and second rarest readily available healing methods for ashwalkers, respectively.
      • -
      • the "genitals use skintone" option now appears in the character appearance menu when appropriate again.
      • -
      • Clicking your stamina bar will now show your exact stamina along with info regarding your stamina buffer
      • -
      • The bug where ghost role spawners leave null entries in glob.mob_spawners has actually been fixed
      • -
      • The Kitchen Gun (TM) is no longer invisible.
      • -
      • The majority of cult spells no longer have exclamation marks at the end of their invocations. This means they will no longer be bound to the rules of shouting. Which means sec officers will no longer be able to hear culties sacrificing the captain from the complete opposite side of the maintenance tunnel the sacrifice is happening in. However, things like EMP pulses and runeless teleportation still have the effect due to their inherent loud nature.
      • -
      • The stun blood spell now instantly causes hard stamcrit. However, to offset this, it now also only has one charge and has a higher cost.
      • -
      • The Gloves of the North Star now restore 2/3 of the stamina used up by punches when harm intent punching. With aggressive play and good stamina buffer management, this makes it entirely plausible to roughly double your stamina regeneration per mob life process tick.
      • -
      • Revs can no longer remember the name of the person who flashed them when deconverted. This brings it in-line with the other conversion antag deconversions.
      • -
      • The bug where you can sometimes get permanently stuck in stamcrit should HOPEFULLY be fixed. I'm unable to reproduce the bug myself, but let's hope.
      • -
      • The night vision trait now grants you darksight for an entire 1:1 screen, but the alpha of the lighting plane with the trait has been increased from 245 to 250 to balance it out
      • -
      • It's now actually possible to click the stamina hud button
      • -
      • The stamina hud button now displays your stamina buffer correctly
      • -
      • Bone spears now have a reach of 2 tiles.
      • -
      • You can no longer phase through solid objects via scrambling
      • -
      • The syndicate mask now works properly as intended.
      • -
      • Stamina is no longer affected by health at all.
      • -
      • You can now right-click yourself in help intent in combat mode to instantly get up from resting. This will cost stamina equal to your entire stamina buffer. Manage your stamina well, and you'll be able to shrug off a single stray golden bolt
      • -
      • The new player panel now displays your currently selected character's name
      • -
      • Flashes no longer knockdown. Instead, they deal eyeblur and have increased confusion
      • -
      • The server's tagline is now a config option. People can now stop confusing us with BR cit
      • -
      • Attack animations will now rotate your character slightly, similar to Goon.
      • -
      • Throwing items will now perform the attack animation and play a sound
      • -
      • flashlights will now make sounds when toggled on/off
      • -
      • Things in disposals will now emit sounds every single time they hit corners. This increases immersion.
      • -
      • Air alarms now actually emit the proper light color when their status is okay.
      • -
      • Backpacks and other storage items will now jiggle and squish when you interact with them, similar to the animations seen on Goon.
      • -
      • Mops no longer have a delay on their cleaning, making them an actually viable alternative to all of the janitor's other cleaning tools
      • -
      • To balance this, mops now take stamina to clean tiles. Standard mops take 5 stamina to use, while advanced mops take 2 stamina.
      • -
      • Oh and also mops make fancy new sounds and play animations when used now
      • -
      • Pump-action shotguns now take 2 stamina per pump instead of 5 stamina per pump. This also applies to bolt-action rifles, as bolt racking counts as pumping.
      • -
      • Pickpocketing items will now place them in your hands if possible
      • -
      • Combat mode is now displayed in examine text
      • -
      • Combat mode now makes a visible message when enabled if you haven't touched your combat mode button in the last ten seconds. It's done this way to avoid chat spam from those who know how to pull off stam regen squeezing.
      • -
      • All knockdown sources will now force people to be dismounted from ridden vehicles.
      • -
      • When an item is thrown, it will now be rotated and displaced.
      • -
      • Shards of glass will now be rotated when spawned.
      • -
      • Bullet casings will now be rotated when they're ejected from a gun.
      • -
      • Bottles now have random rotations and pixel offsets when smashed via throwing.
      • -
      • Picking up an item will now reset its rotation.
      • -
      • Glasses thrown onto tables by bartenders will now have their rotation reset.
      • -
      • Slime speed potions can now only increase the speed of vehicles to be on par with sprinting speed. They can no longer make a scooter roll around ten times faster than a speeding blue hedgehog.
      • -
      • Changelings will no longer recieve team objectives
      • -
      • Changelings no longer start off with hivemind communication as an innate ability. Hivemind communication now requires 1 dna point, on par with syndicate encryption keys, which are 2 TC.
      • -
      • Hivemind link now relies on hivemind communication just like the hivemind download/upload abilities.
      • -
      • It's now only possible to zoom a gun if it's in one of your hands
      • -
      • Mobs without clients no longer cause runtimes when their eyeblur updates
      • -
      • Blood tests have been added. If a changeling has a sufficient number of loud abilities, you will be able to test their blood by heating up a sample of it. However, if the changeling has a large amount of loud abilities, attempts to test their blood will have explosive results.
      • -
      • Changelings now make a very obvious noise when readapting. This is to prevent the cheese strat of simply readapting when you get caught to avoid detection.
      • -
      • The blood splatter effect that happens when you get attacked will now always make you lose blood depending on the damage you've taken. The effect now also scales with item damage, meaning tiny little papercuts will no longer be able to cause a massive blood splatter.
      • -
      • The blood reagent will now cover items and spacemen in blood when applied to objects and mobs.
      • -
      • Helmets, masks, and neck items are all now valid targets to get splattered when you get covered in blood. Groovy.
      • -
      • The temperature notification will now take into consideration both the ambient temperature and your body temperature, increasing the responsiveness of the temperature notification and making it much more realistic.
      • -
      • Shuttle transit borders are now 10 tiles wide instead of 8 tiles, hopefully repairing the immersions that get shattered by the ability to see normal space where the transit areas end.
      • -
      • Instead of transit turfs simply teleporting things to space, transit is now handled in a somewhat realistic manner. Transit turfs now act like normal space turfs, though exiting the transit area or being present in the transit area after the shuttle moves out of transit will teleport you to space and throw you in the direction the shuttle was moving in.
      • -
      • Reservation areas are now able to designate a border turf.
      • -
      • The sprint hotkey will no longer cause you to get permanently stuck sprinting if the server lags. Just tap shift again if you get stuck
      • -
      • You can now hear sounds in the real world while inside of a VR sleeper.
      • -
      • You can now make nameless characters. Nameless characters will spawn in with their name set as their job title followed by a unique five digit number. The "Name" option in the character setup menu will be replaced with a "Default designation" option for nameless characters, and the default designation will be used in place of a job title for assistants and other jobs that don't require dress codes.
      • -
      • The out-of-game round end notification is now a little more verbose. It'll now display the round type, end result of the round, and the survival rate.
      • -
      • Xenos can no longer strip items off of people to be capable of using any item in the game.
      • -
      • also, items from pockets get placed into your hands properly now
      • -
      • A mob's last words are now properly tracked and recorded on death. The first death of the round will now actually display the victim's last words on the round end screen.
      • -
      • Divine shenanigans can no longer result in someone becoming immune to staminaloss
      • -
      • Fixed body_markings in bodyparts being assigned as a list when in reality, it's a string and literally everything expects it to be a string and uses it as a string. This should mean that markings no longer have completely fucked up caches for character preview and other things.
      • -
      • Since apparently the game is literally unplayable if items are not in the exact center of a turf, the maximum pixel variance of thrown objects has been reduced by four pixels to make things a smidge more clearer for those that dont know what a turf is.
      • -
      • Bartender glasses should HOPEFULLY no longer be tilted when landing on a table. Why the fuck is after_throw called via a timer.
      • -
      • Changeling screeches now have their own unique sounds, and are much easier to recognize.
      • -
      • Most synthetic emotes are now available to humans. *ping
      • -
      • You can now merp
      • -
      • The TEG will now only produce a meaningful amount of power if the hot pipe contains gas that's actively combusting
      • -
      • Added the "add PB bypass" and "revoke PB bypass" verbs, which allow admins to let a specific ckey to bypass the panic bunker for the rest of the round
      • -
      • Jogging is no longer treated exactly the same as sprinting for water slips. When you're jogging, you will only slip on water if you have more than 20% staminaloss.
      • -
      • The atmospherics turf subsystem now has double the wait time, which should free up server processing power for other tasks.
      • -
      • The IRC now actually displays the actual survival rate
      • -
      • Bloodcult conversions are now consensual. Convertees are given a ten second timer to accept or wait out. This should drastically improve the quality of those that get converted into bloodcult.
      • -
      • All sacrifices now count as a third of a cultist for the end-game narsie summon.
      • -
      • Nameless captains will no longer proc a "Captain Captain on deck!" message. Instead, it'll be a much more boring but much more sensical "Captain on deck!" message.
      • -
      • Transit turfs on the centcom z-level now function properly again at keeping mobs within the areas defined by their boundaries.
      • -
      • The title screen is also positioned correctly again.
      • -
      • Ghost role eligibility for both event and spawner ghost roles is now affected by DNR status. If you suicide, ghost, or cryo out, you will be unable to qualify for any ghost roles
      • -
      • Cryo now applies DNR status no matter how long the round has been going on
      • -
      • Suicide is now properly admin logged as it is supposed to be. Ghosting while alive is now also logged.
      • -
      • Sparks and igniters will now actually heat areas rather than cooling them, as was intended.
      • -
      • To alleviate some potential complaints, RPDs now have a cooldown before they can create sparks, and both RPDs and emitters produce less sparks.
      • -
      • Conversion runes will now mute the victim temporarily while they're deciding whether to convert or be sacrificed.
      • -
      • Conversion runes no longer require a third cultist to sacrifice if the victim refuses conversion
      • -
      • Staminaloss targeted at the head now properly redirects to the chest.
      • -
      • Sprinting no longer takes stam when you're being pulled or when you're in zero gravity. Other sources of involuntary movement are not affected.
      • -
      • In an attempt to improve performance during highpop, mouse movements will now only call onmousemove() while a user is in combat mode
      • -
      • Ballistic projectiles are now the only projectiles capable of emitting dinks.
      • -
      • Panic bunker toggling and bypassing is now logged in admin IRC
      • -
      • OOC and LOOC now use separate toggles. You can now use LOOC while OOC is globally toggled off, and admins now have the option to toggle LOOC off separately from OOC
      • -
      • also revamped and reorganized relevant looc adminverb code
      • -
      • The endgame narsie summon rune no longer requires 24 total sacrifices, and will now properly account for cultists that surround it
      • -
      • The succumb verb is now available in the IC tab
      • -
      • Lighting now uses a linear algorithm to calculate falloff instead of an inverse-square algorithm.
      • -
      • get_hearers_in_view() now actually caches the results of view() instead of calling view() twice
      • -
      • Goonchat's JS no longer contains checks related to a completely unused message filtering function, which should improve clientside performance quite a bit
      • -
      • The storage hud now properly takes into account the viewer's view size, meaning storage items with a large amount of storage slots will properly stretch across the bottom of the screen when running in widescreen.
      • -
      • Action buttons are now able to fill the entire screen in widescreen and other weird view sizes.
      • -
      • Omegastation's job changes will no longer be included at compile time.
      • -
      • The client update portion of /mob/Login() now double-checks to make sure client.player_details exists and is of the proper type. This should hopefully fix the "cannot read null.player_details" runtimes that can spontaneously cause clients to get kicked out and forced back to the lobby.
      • -
      • You can now quickly use unequipped items on objects by simply click-dragging the item onto the object with an empty active hand. Doing so will place the item in your hand, and then use that item on the object.
      • -
      • In an attempt to improve the performance of /mob/Stat(), various time-related procs now use defines instead of being procs that call procs that call other procs that call even more procs.
      • -
      • If a living mob has vore initialized but doesnt have voreprefs initialized, then client login will force voreprefs to load.
      • -
      • Hopefully fixed paper crash 2: electric boogaloo
      • -
      • Added unomos, which is basically listmos except gas mixtures only use one single list for handling their gasses. This is a significant performance improvement that also offers a mild memory improvement under normal circumstances.
      • -
      • Locomotion circuits are now restricted to jogging speed
      • -
      • MMI circuits and pAI circuits both now have 60 complexity, up from their original 29.
      • -
      • Biogenerators now have a sane limit for production
      • -
      • Fixed a fairly huge server crash exploit
      • -
      • Shield blobs no longer become completely invulnerable to all forms of damage after reaching a """weakened""" state
      • -
      • Taken care of what appeared to have been an oversight where shield blobs don't recover their armor after becoming weakened.
      • -
      • Nerfed concatenators by limiting the amount of characters they're able to output
      • -
      • The timer for stripping an item off of a spaceman is no longer interrupted by your active held item changing. This means you no longer have to worry about filling both of your hands when you're stripping items off of someone.
      • -
      • Ported the zulie cloak and blackredgold coat donor items from RP.
      • -
      • Normal mops now only use 2 stamina to mop a tile, nerfed from their previous value of 5 stamina per tile mopped.
      • -
      • Advanced mops now only use 1 stamina to mop turfs, from their former value of 2 stam.
      • -
      • The femur breaker now uses `*scream` instead of forced speech. This means that the femur breaker will no longer spam deadchat with "AAAAAAAAAHHHHHHHHHH!!"
      • -
      • The femur breaker will now guarantee that the victim falls into crit, which will make it harder to perform torture scenes with it since the victim can just succumb.
      • -
      • Fixed another runtime in warp whistles.
      • -
      • Spamming forged packets no longer crashes the server.
      • -
      • Things that access job_preferences now explicitly access keys, which means it no longer attempts to access invalid indices and runtimes as a result.
      • -
      • The taser's electrode has been reworked. Instead of being a strong knockdown that deals a heavy amount of stamloss, it now causes a weak knockdown, applies a debilitating status effect for 5 seconds, and deals 35 stamloss on hit up to a maximum 50 total stamloss.
      • -
      • Roundstart turrets now have a nonlethal projectile that gets used when they're set to stun and the target is resting
      • -
      • Hybrid tasers now have disablers set as their default mode.
      • -
      • There is now a 1% chance for the station's announcer to be the medibot voice instead of the classic TG announcer.
      • -
      • The map config system has been expanded to allow mappers to specify the map type, announcer voice, ingame year, and how often a given map can be voted at roundend.
      • -
      • The map vote system now takes into account map playercount limits properly.
      • -
      • Examining a spaceman, and other things that use get_examine_string(), will now actually properly show when an item is blood-stained.
      • -
      • Plasmaman tongues no longer have a maxHealth of "alien", and no longer cause the organ's on_life to always runtime.
      • -
      • Shooting a simplemob no longer causes runtimes prior to the blood effect being created.
      • -
      • Removing a filter from an object that lacks filters no longer causes runtimes.
      • -
      -

      deathride58 (Original PR by actioninja) updated:

      -
        -
      • Disarm pushing (combat mode right click in disarm intent) will now actually push mobs away. Knockdowns from disarm pushing are no longer rng based on the target's staminaloss. Knockdowns from disarm pushing now only happen when you push someone into another mob, a table, or a wall. Pushes will now also temporarily stop targets from using firearms, and will disarm the firearm if performed a second time. Pushes still deal staminaloss to standing targets, and won't deal a single ounce of staminaloss to resting targets.
      • -
      • You can no longer displace mobs that are in harm intent by simply walking into them. Mobs that aren't in help intent have to be disarm pushed to actually be moved.
      • -
      -

      dtfe3 updated:

      -
        -
      • Increased music maxlines from 300 to 600
      • -
      • Made it so any oxygen tank can be used instead of only red ones.
      • -
      • Watcher wing Trophy's effect lasts 1 second instead of 0.5
      • -
      • Pink Panties
      • -
      • Twintails
      • -
      • Schoolgirl outfits for the loadout menu!
      • -
      • Now the fox ears are located in front of hair meaning they now behave much like cat ears, that being they are on-top of the hair layer.
      • -
      -

      izzyinbox updated:

      -
        -
      • adds VoG orgasm command using words "orgasm", "cum", "squirt", "climax"
      • -
      • adds VoG dab command using words "dab" and "mood"
      • -
      • Generic dog body marking sprite
      • -
      • colormatrix dog sprites
      • -
      • lowered the player age for command jobs to 1/3 of their previous setting
      • -
      • *bark emote
      • -
      -

      jtgsz updated:

      -
        -
      • ported gang mode
      • -
      -

      kappa-sama updated:

      -
        -
      • Removed racism
      • -
      • Teleporter calibration actually matters to all roundstart players
      • -
      • Slows down teleportation with the console/hub/teleporter setup if you care for your species.
      • -
      • Dedicated non-humans can now get hulk without having to become human.
      • -
      • seed
      • -
      • added obj/item/key to wallet whitelist
      • -
      • blood cult ritual daggers fit in jack/combat boots
      • -
      • voidcells can now unlock alien tech
      • -
      • rebalanced tech trees (not really)
      • -
      • hugbox (/s)
      • -
      • ashwalker spawn text now tells them "i" "c" not to leave lavaland
      • -
      • you can no longer have infinite ebows
      • -
      • kevinz forgot to nerf miasma research and cargo value after making it produce like 100x as much lmao
      • -
      -

      kevinz000 updated:

      -
        -
      • Hierophant now goes sicko mode, but hey, at least you can't be multi-hit by melee waves!
      • -
      • Racking shotguns is now more threatening.
      • -
      • Medibots no longer kill slimes when trying to heal their toxins.
      • -
      • The Syndicate started selling claymores to their agents.
      • -
      • Nerfed VTEC modules.
      • -
      • Neurotoxin no longer stuns non-carbons.
      • -
      • peacekeeper cyborgs now get a megaphone
      • -
      • Fixes storage bugs regarding reaching into things you shouldn't be able to reach into.
      • -
      • BYOND 513 preliminary support added.
      • -
      • Trashbags now only allow accessing the first 3 items. 5 for bluespace ones. experimental: Storage now allows for limiting of random access
      • -
      -

      kiwedespars updated:

      -
        -
      • regenerative materia to hallucination sting
      • -
      • mindbreaker toxin as an actual chemical to hallucination sting
      • -
      -

      lolman360 updated:

      -
        -
      • NT has authorized shipments or Cotton to Megaseed Servitors. It's time to start picking, liggers.
      • -
      • missing durathread sprites
      • -
      • Added durathread jumpskirt
      • -
      • Duraskirt sprites and rolled down jumpsuit sprites.
      • -
      • Fixes an undocumented change to the naming of Plasmamen.
      • -
      • chainsaw kind of weapons and the mecha drill and the CLAMP can now be used with 100% accuracy for surgery
      • -
      • surgery tools now work on defines
      • -
      • advanced surgerytools can now switch types instead of just being faster
      • -
      • fixes bug with new surgerytools examine
      • -
      -

      nicc updated:

      -
        -
      • Exo-suit
      • -
      • SEVA suit
      • -
      • Flags for Goliath resistance and weakness
      • -
      • suit voucher
      • -
      • temp suit sprites
      • -
      • *dab
      • -
      • teg less gay maybe
      • -
      -

      ninjanomnom and WhoneedSpacee updated:

      -
        -
      • Some rpg affixes now have special effects
      • -
      • New RPGLoot modifiers: Vampirism which heals you when you attack, Pyromantic which sets things you hit on fire. Shrapnel which causes projectiles fired from a gun to fire projectiles in a radius when they hit something. Finally, Summoning which summons mobs that sometimes aid you in combat.
      • -
      -

      original by @randolfthemeh and @twaticus, port by sishen1542 updated:

      -
        -
      • jumpskirts
      • -
      • more jumpskirts
      • -
      • jumpskirt/suit prefs
      • -
      -

      original by Bumtickley00, port by sishen1542 updated:

      -
        -
      • Suit storage units will now also remove radiation from mobs.
      • -
      -

      original by GuyonBroadway, SkowronX, and Arizon5. port by sishen1542 and kerse updated:

      -
        -
      • Clockwork cultists may now summon forth Neovgre, the ratvrarian super weapon. This powerful mech can be summoned when applications scripture has been unlocked, boasts superior offensive and defensive capabilities, however once a pilot enters he cannot leave and is doomed to die with the mech.
      • -
      • Sexy Sprite work courtesy or SkowronX from /tg/
      • -
      • brass edits by Arizon5
      • -
      • steamy laser by kerse
      • -
      -

      original by Skoglol, port by sishen1542 updated:

      -
        -
      • Added lots of new virus cures, made cure difficulty scale more consistently. Cures are now picked from a list of possible cures per resistance level, multiple diseases at the same level no longer always share a cure. Looking at you table salt.
      • -
      • Dynamic gamemode now more auto-deadmin friendly.
      • -
      -

      original by TheChosenEvilOne, port by sishen1542 updated:

      -
        -
      • Ported dynamic mode from /vg/, originally made by @DeityLink, @Kurfursten and @ShiftyRail
      • -
      -

      original by Tlaltecuhtli, port by sishen1542 updated:

      -
        -
      • rcd disk that gives rcd computer frame and machine frame designs
      • -
      • upgraded rcd in CE lockers
      • -
      • moved deconstruction to the upgrade disk, ashwalker rcd comes upgraded
      • -
      -

      original by actioninja, port by sishen1542 updated:

      -
        -
      • Medical and Security consoles now check access on worn or inhand ID instead of requiring an inserted ID
      • -
      • mining vendor now reads from ID in hand or on person instead of requiring an inserted ID
      • -
      • ORM is functional again (for real this time)
      • -
      • ORM claim points button transfers points to worn/inhand ID instead of to an inserted ID, no longer accepts insertions
      • -
      • Same for gulag consoles
      • -
      -

      original by redmoogle, port by sishen1542 updated:

      -
        -
      • Added support for 3 new gasses; Tritium, Pluoxium, and BZ
      • -
      -

      original by: WJohnston, Antur, Arcane, plapatin, sprites by cogwerks and edited by mrdoombringer. port by sishen1542 updated:

      -
        -
      • THE GOOSE IS LOOSE
      • -
      -

      r4d6 updated:

      -
        -
      • Added decoratives angel wings for Mammalians only
      • -
      • Added blindfolds to the Loadout list
      • -
      • Added Decorative Wings for Humans, Felinids, Slimepersons and Lizardpeoples.
      • -
      • Change the SEVA suit & Exo-suit's descriptions
      • -
      • Batteries are now Rad-Proof like the other stock parts
      • -
      -

      tigercat2000@Paradise updated:

      -
        -
      • fixed invalid characters breaking chat output for that message
      • -
      -

      tinfoil hat wearer updated:

      -
        -
      • Added a new alien technology disk to scientist and roboticist uplinks that allows them to research the heavily-guarded secrets of the Grays.
      • -
      • Alientech is now the only Hidden alien research. To compensate for this, alien_bio and alien_engi have had their research costs doubled and now require advanced surgery tools and experimental tools respectively to research. Their export price is also halved.
      • -
      • roboticists now have brainwashing disks AND alien technology added to their role-restricted uplink section. alien technology gives them brainwashing at a much later date, so brainwashing is the much cheaper option for instant power. makes logical sense because doctors get it as well because they do surgery, and roboticists can now either choose to brainwash people for less price but less power or emag borgs for higher prices, limited uses, but higher power.
      • -
      -

      ursamedium updated:

      -
        -
      • Gas icons changed.
      • -
    GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index f5e4fea7cb..db9c8e6d08 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -23656,3 +23656,327 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - tweak: Supply ordered looms are unanchored. Bring a wrench. r4d6: - rscadd: Added Departements Winter Coats to the loadout list. +2019-12-30: + AnturK: + - bugfix: Fixed ranged syndicate mobs stormtrooper training. + Arturlang: + - rscadd: Adds Bloodsuckers, beware. + BlueWildrose: + - bugfix: Fixed stargazers being unable to link to themselves if mindshielded or + if holding psionic shielding devices (tinfoil hats) when the species is set. + - bugfix: Fixes non-roundstart slimes being unable to wag their tail. + Commandersand: + - tweak: added two words to clown filter + - rscadd: Added new things to loadouts, check em + DeltaFire15: + - balance: Clock cult kindle no longer cares about oxygen damage + - tweak: changed mecha internals access for some special mechs. + - tweak: no more mech maintenance access for engineers. + - tweak: All heads of staff can now message CC + - code_imp: Removes a magicnumber + - balance: Rebalanced cult vs cult stun effects to debuff instead of stun + Detective-Google: + - bugfix: short hair 80's is no longer jank + Fermis: + - tweak: tweaked how super bases/acids work but limiting them + Fikou: + - tweak: the windup toolbox now has some more "realistic" sounds + - bugfix: the windup toolbox now rumbles again + Ghommie: + - bugfix: Fixed hulks, sleeping carp users, pacifists and people with chunky fingers + being able to unrestrictly use gun and pneumatic cannon circuit assemblies. + - bugfix: Fixed gun circuit assemblies being only usable by human mobs. + - balance: Doubled the locomotion circuit external cooldown, thus halving the movable + assemblies' movespeed. + - tweak: Made wooden cabinet/closets... actually made of wood. + - tweak: Wooden cabinets are now deconstructable with a screwdriver. + - tweak: Deconstruction of large crates and other closet subtypes deconstructable + with tools other than the welder is no longer instant. + - tweak: You shouldn't be able to target objects you can't see (excluding darkness) + with the ARCD and RLD + - tweak: The admin RCD is ranged too, just like the ARCD. + - bugfix: Fixed welding, thirteen loko, welding and wraith spectacles not blinding + people as expected. Thank you all whomst reported this issue in the suggestions + box channel instead of the github repository's issues section, very smart! + - bugfix: Fixed on_mob eyes overlays not updating properly in certain cases. + - bugfix: Fixed deconversion from bloodshot eyes blood cult resetting your eyes' + color to pitch black instead of their previous color, more or less. + - balance: 'Spinfusor nerf: Upped the casing and ammo box size by one step, removed + the projectile''s dismemberment value (explosions can still rip a limb or two + off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents + from 32 to 8, removed the casing''s ability to explode when thrown.' + - bugfix: Fixes bubblegum's death not unlocking the arena shuttle buyment. + - bugfix: Fixed alien tech node not being unlockable with subtypes of the accepted + items. + - bugfix: Fixed reactive armor onmob overlays not updating when toggled and reactive + teleport armor still using forceMove() instead of do_teleport() + - bugfix: Fixed space hermit asteroid rocks unintendedly spawning airless asteroid + turf when mined, save for the perimeter. + - bugfix: Fixes reviver implant having been a crapshot ever since soft-crit was + introduced years ago. + - tweak: Added a "convalescence" time (about 15 seconds) after the user is out of + unconsciousbess/crit to ensure they are properly stabilized. + - tweak: Added a 15 minutes hardcap for accumulated revive cooldown (equivalent + to 150 points of brute or burn healed) above which the implant starts cooling + down regardless of user's conditions. + - bugfix: Fixed AI core displays I may have broken with my coding extravaganza. + - soundadd: Blue, Amber and Red security alert sounds should be half as loud now. + - balance: Buffed clown ops by removing their clumsiness and adding a new trait + to be used in place of several clown role checks. + - tweak: Clown ops too also suffer from not holding or wearing clown shoes now. + - bugfix: Fixed a few holo barriers lacking transparency. + - bugfix: Fixed character setup preview bodyparts not displaying correctly most + of times. + - bugfix: Fixed character appearance preview displaying the mannequin in job attire + instead of undergarments. + - bugfix: Fixed raven's shuttle computer not being of the emergency shuttle type. + - tweak: Blood bank generators can now be anchored and unanchored now. + - admin: Ghost mentors can now orbit around the target instead of setting their + view to theirs'. + - bugfix: Fixes a ghostchat eavesdropping exploit concerning VR. + - bugfix: Fixes VR deaths being broadcasted in deadchat. + - bugfix: Fixed a few pill bottle issues with the ChemMaster. + - bugfix: Fixes a few negative quirks not being properly removed when deleted. + - tweak: Phobia and mute quirks are no longer cheesed by brain surgery grade healing + or medicines. + - bugfix: Fixed double-flavour (and bland custom) ice creams. + - bugfix: Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'. + - bugfix: dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just + like humies, ayys and monkys. + - bugfix: Stops humanoids whose skin_tone variable is set to "albino" from showing + up as pale when examined should their species not use skintones anyway. + - rscdel: Removed the old (almost) unused roboticist encryption key and headset. + - bugfix: Fixed goose meat. + - bugfix: Fixed a little door assembly glass dupe exploit + - bugfix: Fixed AI holopad speech text being small and whispers that in multiple + exclamation marks echo through multiple areas. + - rscdel: Removed literally atrocious polka dotted accessories. They were even more + atrocious than the yellow horrible tie. + Ghommie (also porting PRs by AnturK and Arkatos): + - bugfix: Fixed light eaters not burning out borg lamplights and flashes. fix Fixed + light eater not affecting open turfs emitting lights such as light tiles and + fairy grass. + - bugfix: Fixed an empty reference about light eater armblade disintegration after + Heart of Darkness removal. + Ghommie, Skogol: + - refactor: refactored altclick interaction to allow alt-click interactable objects + to parent call without forcing the turf contents stat menu open. + - tweak: Alt clicking will no longer show turf contents for items inside bags etc. + - tweak: Alt clicking the source of your turf contents stat menu will now close + said menu. + GrayRachnid: + - bugfix: fixes consistency + Hatterhat: + - rscadd: Regenerative nanites, a "chemical" used in the combat stimulant injector. + Actually quite stimulating, and not bad in a pinch for a nuclear operative. + Check the Combat Medic Kit! + - tweak: The Combat Medic Kit now has an advanced health analyzer and medisprays + instead of patches and a chloral syringe. + - balance: The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get + the better injector, because nobody uses it and so nobody's bothered to update + it. + - rscadd: .357 speedloaders can now be printed with the Advanced Illegal Ballistics + node on the tech tree! + - balance: okay so i may have given the .357 an extra speedloader at the same cost + but it comes in a box now + ItzGabby: + - bugfix: Fixed AltClick on polychromic collars so they actually work now. + KeRSedChaplain: + - soundadd: Extends the file "deltakalaxon.ogg" to a 38 second .ogg. + Linzolle: + - rscadd: neck slice. harm intent someone's head while they are unconscious or in + a neck grab to make them bleed uncontrollably. + - bugfix: officer's sabre now properly makes the unsheating and resheating noise + - bugfix: fireman failure has a different message depending on the circumstance + - rscadd: Abductor chem dispenser, and added it to the abductor console. + - rscadd: '"Superlingual matrix" to the abductor console. It''s the abductor''s + tongue. Can be used to link it to your abductor communication channel and then + implanted into a test subject.' + - rscadd: Shrink ray and added it to the abductor console. + - soundadd: Shrink ray sound effect (its the fucking mega man death sound) + - rscadd: special jumpsuit for abductors + - imageadd: abductor jumpsuit, including digi version if a digitigrade person somehow + manages to get their hands on it. sprites for the shrink ray and chem dispenser. + - rscadd: new glands to play with, including the all-access gland, the quantum gland, + and the blood type randomiser. + - code_imp: split every gland into its own file instead of all being in one file + - tweak: cosmic coat crafting recipe changed to coat + cosmic bedsheet + Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac: + - bugfix: Certain incompatible quirks can no longer be taken together. + - bugfix: If an admin sends a ghost back to the lobby, they can now choose a different + set of quirks. + - spellcheck: the quirk menu went through some minor formatting changes. + - bugfix: Podcloning now lets you keep your quirks. + - rscadd: Quirks have flavor text in medical records. + - spellcheck: All quirk medical records refer to "Patient", removing a few instances + of "Subject". + - tweak: Quirks no longer apply to off-station roundstart antagonists. + - code_imp: Mood quirks are now only processed by the quirk holders + Narcissisko (ported by Hatterhat): + - rscadd: Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, + a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547. + Nervere and subject217, Militaires, py01, nemvar: + - balance: The cook's CQC now only works when in the kitchen or the kitchen backroom. + - spellcheck: corrected CQC help instructions + - bugfix: CQC and Sleeping Carp are properly logged. + - tweak: CQC can passively grab targets when not on grab intent. Passive grabs do + not count towards combos for CQC or Sleeping carp. + - code_imp: Martial Art and NOGUN cleanup. + PersianXerxes: + - rscdel: Removed night vision quirk + Putnam: + - bugfix: acute hepatic pharmacokinesis now works if you already have relevant genitals + - balance: Contamination is no longer an infinitely spreading deadly contagion causing + mass panic + - tweak: Dynamic rulesets have lower weight if a round recently featured them (except + traitor). + Putnam3145: + - balance: Buffed HE pipes by making them realistically radiate away heat. + - bugfix: Dynamic has a (totally unused for any relevant purpose) roundstart report + now. + - admin: A whole bunch of dynamic data is now available for statbus + - bugfix: Dynamic from-ghost antags no longer double dip on threat refunds when + the mode fails due to not enough applications. + - bugfix: whoops broke quirks + - bugfix: quirks work + - rscadd: 'New tab in preferences screen: "ERP preferences"' + - rscadd: New opt-outs for individual effects of incubus draught, succubus milk + - rscdel: Acute hepatic pharmacokinesis has been removed, replaced with above + - tweak: Renamed "Toggle Lewdchem" to "Toggle Lewd MKUltra", since that's what it + actually means, and made it toggle the "hypno" setting (rename it again if more + hypno mechanics are added). + - tweak: Made MKUltra's lewd messages require both people involved to have hypno + opted-in. + - config: Buncha dynamic config tweaks + - bugfix: Ghost cafe spawns are actual ghost roles by the game's reckoning now + - bugfix: a runtime in radioactive contamination + - balance: Bomb armor now acts like other armor types. + - balance: Devastation-level explosions on armorless people no longer destroys everything + in their bags. + Seris02: + - rscadd: the clowns headset + - bugfix: distance checks + - bugfix: the sprites + - rscadd: added the runed and brass winter coats (cosmetic ratvarian/narsian) + - tweak: how the narsian/ratvarian coats can be made + - bugfix: fixes some ghost roles from dying of stupid shit + - bugfix: pandoras attacking their owners + - rscadd: Added Rising Bass and the shifting scroll. + - tweak: Changes the martial arts scroll in the uplink to "Sleeping Carp Scroll" + ShizCalev: + - bugfix: Fixed floodlights not turning off properly when they're underpowered. + - bugfix: Fixed emitters not changing icons properly when they're underpowered. + Sishen1542: + - rscadd: Clicking a pack of seeds with a pen allows you to set the plant's name, + description and the pack of seeds' description. Useful for differentiating genetically + modified plants. These changes will persist through different generations of + the plant. + - rscadd: Hydroponics trays update their name and description to reflect the plant + inside them. They revert to default when emptied. + Toriate: + - rscadd: Polychromic shorts now have a digitigrade state + Trilbyspaceclone: + - rscadd: ports all the new donuts, burgars, and chicken stuff from RG + - rscadd: ports new snowcone + - rscadd: ports grill + - rscadd: ports beakfeast tag/mood lit as TG has it + - rscadd: ports all the amazing new sprites + - tweak: ports crafting for many things like snowcones needing water + - balance: ports of many craftings + - soundadd: lowers fryers sound + - imageadd: ported icons for new food/grill + - imagedel: ports the deletion of some icons and images + - spellcheck: ports a spell check for the snowcones + - code_imp: ports fixes for stuff I didnt know were even broken with snowcones + - bugfix: coder cat failers to push the last commit from year(s) ago + - admin: Updates the changlogs + - tweak: meat hook from HUGE to bulky + - tweak: CE hardsuit is now more rad-proof + - bugfix: Wrong icon names, missing dog fashion with telegram hat + - rscadd: New softdrink that comes in its own vender! + - rscadd: Honey now has a reaction with plants + - tweak: Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar + not 2 + - rscadd: Blaster shotguns back into armory + - rscdel: Removed Lighters in thunderdomes + - rscadd: Silicons now know what a slime is saying! + - balance: honey now will not kill slimes. Honey slimepeople can be a thing now, + go sci. + - rscadd: Added insulin into many of the borg hypo's + Useroth: + - rscadd: bamboo which can be used to build punji sticks/ blowguns available as + a sugarcane mutation or in exotic seed crate + - tweak: changed the sugar cane growth stages because fuck if I know why, but it + was in the PR + - rscadd: 'New lavaland ruin: Pulsating tumor' + - rscadd: New class of lavaland mobs, a bit weaker than megafauna but still stronger + than most of what you normally see + - rscadd: Ghost cafe spawner. For letting people spawn as their own character in + the ninja holding facility. It bypasses the usual check, so people who have + suicided/ghosted/cryod may use it. + - rscadd: Dorms in the ninja holding facility. + Xantholne: + - rscadd: Santa Hats to Loadout and Clothesmate + - rscadd: Christmas Wintercoats to Loadout and Clothesmate + - rscadd: Christmas male and female uniforms to loadout and Clothesmate + - rscadd: Red, Green, and Traditional Santa boots to loadout and Clothesmate + - rscadd: Christmas Socks, Red candycane socks, Green candycane socks to sock selection + kappa-sama: + - balance: legion drops more crates now + - balance: .357 speedloaders in autolathes are now individual bullets instead, speedloaders + are now illegal tech, costs less total metal to make 7 bullets than a previous + speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to + make 5 7.62mm bullets than getting a clip from the seclathe. + - tweak: mentions that you can refill speedloaders on .357 uplink description + - bugfix: you can now strip people while aggrograbbing or higher + - rscadd: plasmafist to wizard + - code_imp: modular is gone + - rscadd: martial apprentices for the local Chinese wizard + - bugfix: broodmother baby lag + - balance: you can no longer get 100k credits by spending 4k roundstart + - balance: cooking oil in sunflowers instead of corn oil + - bugfix: throats are no longer slit happy + keronshb: + - rscadd: Adds reflector blobs to shield blob upgrades + kevinz000: + - rscadd: Launchpads can now take number inputs for offsets rather than just buttons. + - balance: nanites no longer spread through air blocking objects + - rscadd: Night vision readded as a darkness dampening effect rather than darksight. + - rscdel: conveyors can only stack items on tiles to 150 now. + - rscadd: added 8 character save slots + - rscadd: Cargo shuttle now silently ignores slaughter demons/revenants instead + of being blocked even while they are jaunted. A drawback is that manifested + ones can't block it either, any more. + - balance: flashbangs process light/sound separately and uses viewers(), so xray + users beware. + - tweak: Stat() slowed down for anti-lag measures. + - bugfix: sprint/stamina huds now work again + - balance: Combat defibs now instant stun on disarm rather than 1 second again + - balance: Defibs are now always emagged when emagged with an emag rather than EMP. + - bugfix: aooc toggling now only broadcasts to antagonists + - code_imp: Antag rep proc is now easier to read and supports returning a list. + - balance: Clockwork marauders are now on a configured summon cooldown if being + summoned on station. They also rapidly bleed health while in or next to space. + And they glow brighter. + lolman360: + - rscadd: Added ability to pick up certain simplemobs. + nemvar: + - bugfix: The brains of roundstart borgs no longer decay. + - code_imp: Refactored the visibility of reagents for mobs. + nicbn, Kevinz000, ShizCalev: + - tweak: Fire alarm is now simpler. Touch it to activate, touch it to deactivate. + When activated, it will blink inconsistently if it is emagged. + - bugfix: You can no longer spam fire alarms. Also, they're logged again. + - bugfix: Fixed fire alarms not updating icons properly after being emagged and + hacked by Malf AI's. + r4d6: + - rscadd: Added a N2O pressure tank + - rscdel: Removed a AM Shielding from the crate + - rscadd: Added Handshakes + - rscadd: Added Nose booping + - rscadd: Added submaps for the SM, Tesla and Singulo + - rscadd: Added a placeholder on Boxstation for the Engines + - bugfix: fixed Nose boops not triggering + shellspeed1: + - rscadd: Adds Insect markings + - rscadd: Adds three new moth wings. diff --git a/html/changelogs/AutoChangeLog-pr-10026.yml b/html/changelogs/AutoChangeLog-pr-10026.yml deleted file mode 100644 index 6e8062874b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10026.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - rscadd: "neck slice. harm intent someone's head while they are unconscious or in a neck grab to make them bleed uncontrollably." diff --git a/html/changelogs/AutoChangeLog-pr-10037.yml b/html/changelogs/AutoChangeLog-pr-10037.yml deleted file mode 100644 index b0f0501516..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10037.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed hulks, sleeping carp users, pacifists and people with chunky fingers being able to unrestrictly use gun and pneumatic cannon circuit assemblies." - - bugfix: "Fixed gun circuit assemblies being only usable by human mobs." - - balance: "Doubled the locomotion circuit external cooldown, thus halving the movable assemblies' movespeed." diff --git a/html/changelogs/AutoChangeLog-pr-10044.yml b/html/changelogs/AutoChangeLog-pr-10044.yml deleted file mode 100644 index 8d1782c3a8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10044.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "Made wooden cabinet/closets... actually made of wood." - - tweak: "Wooden cabinets are now deconstructable with a screwdriver." - - tweak: "Deconstruction of large crates and other closet subtypes deconstructable with tools other than the welder is no longer instant." diff --git a/html/changelogs/AutoChangeLog-pr-10050.yml b/html/changelogs/AutoChangeLog-pr-10050.yml deleted file mode 100644 index c736ded339..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10050.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "You shouldn't be able to target objects you can't see (excluding darkness) with the ARCD and RLD" - - tweak: "The admin RCD is ranged too, just like the ARCD." diff --git a/html/changelogs/AutoChangeLog-pr-10051.yml b/html/changelogs/AutoChangeLog-pr-10051.yml deleted file mode 100644 index 0d7d274891..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10051.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "legion drops more crates now" diff --git a/html/changelogs/AutoChangeLog-pr-10053.yml b/html/changelogs/AutoChangeLog-pr-10053.yml deleted file mode 100644 index 36d392d8f8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10053.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed welding, thirteen loko, welding and wraith spectacles not blinding people as expected. Thank you all whomst reported this issue in the suggestions box channel instead of the github repository's issues section, very smart!" diff --git a/html/changelogs/AutoChangeLog-pr-10054.yml b/html/changelogs/AutoChangeLog-pr-10054.yml deleted file mode 100644 index 0dc3b36618..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10054.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: ".357 speedloaders in autolathes are now individual bullets instead, speedloaders are now illegal tech, costs less total metal to make 7 bullets than a previous speedloader. 7.62mm bullets in autolathe when hacked and costs more metal to make 5 7.62mm bullets than getting a clip from the seclathe." - - tweak: "mentions that you can refill speedloaders on .357 uplink description" diff --git a/html/changelogs/AutoChangeLog-pr-10057.yml b/html/changelogs/AutoChangeLog-pr-10057.yml deleted file mode 100644 index be285bfc57..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10057.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed on_mob eyes overlays not updating properly in certain cases." - - bugfix: "Fixed deconversion from bloodshot eyes blood cult resetting your eyes' color to pitch black instead of their previous color, more or less." diff --git a/html/changelogs/AutoChangeLog-pr-10058.yml b/html/changelogs/AutoChangeLog-pr-10058.yml deleted file mode 100644 index 6f9a985765..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10058.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - balance: "Spinfusor nerf: Upped the casing and ammo box size by one step, removed the projectile's dismemberment value (explosions can still rip a limb or two off), halved the ammo box capacity, reduced the spinfusor ammo supply pack contents from 32 to 8, removed the casing's ability to explode when thrown." diff --git a/html/changelogs/AutoChangeLog-pr-10059.yml b/html/changelogs/AutoChangeLog-pr-10059.yml deleted file mode 100644 index e9f89c18a2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10059.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "lolman360" -delete-after: True -changes: - - rscadd: "Added ability to pick up certain simplemobs." diff --git a/html/changelogs/AutoChangeLog-pr-10067.yml b/html/changelogs/AutoChangeLog-pr-10067.yml deleted file mode 100644 index ac65487761..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10067.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Sishen1542" -delete-after: True -changes: - - rscadd: "Clicking a pack of seeds with a pen allows you to set the plant's name, description and the pack of seeds' description. Useful for differentiating genetically modified plants. These changes will persist through different generations of the plant." - - rscadd: "Hydroponics trays update their name and description to reflect the plant inside them. They revert to default when emptied." diff --git a/html/changelogs/AutoChangeLog-pr-10068.yml b/html/changelogs/AutoChangeLog-pr-10068.yml deleted file mode 100644 index 39b2c37c28..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10068.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Fikou" -delete-after: True -changes: - - tweak: "the windup toolbox now has some more \"realistic\" sounds" - - bugfix: "the windup toolbox now rumbles again" diff --git a/html/changelogs/AutoChangeLog-pr-10071.yml b/html/changelogs/AutoChangeLog-pr-10071.yml deleted file mode 100644 index 3632bdfa86..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10071.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixes bubblegum's death not unlocking the arena shuttle buyment." diff --git a/html/changelogs/AutoChangeLog-pr-10072.yml b/html/changelogs/AutoChangeLog-pr-10072.yml deleted file mode 100644 index 9a6f45e61e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10072.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Useroth" -delete-after: True -changes: - - rscadd: "bamboo which can be used to build punji sticks/ blowguns available as a sugarcane mutation or in exotic seed crate" - - tweak: "changed the sugar cane growth stages because fuck if I know why, but it was in the PR" diff --git a/html/changelogs/AutoChangeLog-pr-10076.yml b/html/changelogs/AutoChangeLog-pr-10076.yml deleted file mode 100644 index 0e04ceddbc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10076.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed alien tech node not being unlockable with subtypes of the accepted items." diff --git a/html/changelogs/AutoChangeLog-pr-10079.yml b/html/changelogs/AutoChangeLog-pr-10079.yml deleted file mode 100644 index a729b1bc56..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10079.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed reactive armor onmob overlays not updating when toggled and reactive teleport armor still using forceMove() instead of do_teleport()" diff --git a/html/changelogs/AutoChangeLog-pr-10082.yml b/html/changelogs/AutoChangeLog-pr-10082.yml deleted file mode 100644 index e5c669f798..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10082.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscadd: "Launchpads can now take number inputs for offsets rather than just buttons." diff --git a/html/changelogs/AutoChangeLog-pr-10083.yml b/html/changelogs/AutoChangeLog-pr-10083.yml deleted file mode 100644 index c60c3fea36..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10083.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed space hermit asteroid rocks unintendedly spawning airless asteroid turf when mined, save for the perimeter." diff --git a/html/changelogs/AutoChangeLog-pr-10085.yml b/html/changelogs/AutoChangeLog-pr-10085.yml deleted file mode 100644 index a82f052fed..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10085.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixes reviver implant having been a crapshot ever since soft-crit was introduced years ago." - - tweak: "Added a \"convalescence\" time (about 15 seconds) after the user is out of unconsciousbess/crit to ensure they are properly stabilized." - - tweak: "Added a 15 minutes hardcap for accumulated revive cooldown (equivalent to 150 points of brute or burn healed) above which the implant starts cooling down regardless of user's conditions." diff --git a/html/changelogs/AutoChangeLog-pr-10086.yml b/html/changelogs/AutoChangeLog-pr-10086.yml deleted file mode 100644 index 08dff8ee5c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10086.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed AI core displays I may have broken with my coding extravaganza." diff --git a/html/changelogs/AutoChangeLog-pr-10090.yml b/html/changelogs/AutoChangeLog-pr-10090.yml deleted file mode 100644 index 924d83b65e..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10090.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - rscadd: "Regenerative nanites, a \"chemical\" used in the combat stimulant injector. Actually quite stimulating, and not bad in a pinch for a nuclear operative. Check the Combat Medic Kit!" - - tweak: "The Combat Medic Kit now has an advanced health analyzer and medisprays instead of patches and a chloral syringe." - - balance: "The Advanced Syndicate Surgery Duffelbag or whatever it was doesn't get the better injector, because nobody uses it and so nobody's bothered to update it." diff --git a/html/changelogs/AutoChangeLog-pr-10091.yml b/html/changelogs/AutoChangeLog-pr-10091.yml deleted file mode 100644 index 8787d9bdba..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10091.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - soundadd: "Blue, Amber and Red security alert sounds should be half as loud now." diff --git a/html/changelogs/AutoChangeLog-pr-10093.yml b/html/changelogs/AutoChangeLog-pr-10093.yml deleted file mode 100644 index e692ed5d2a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10093.yml +++ /dev/null @@ -1,15 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "ports all the new donuts, burgars, and chicken stuff from RG" - - rscadd: "ports new snowcone" - - rscadd: "ports grill" - - rscadd: "ports beakfeast tag/mood lit as TG has it" - - rscadd: "ports all the amazing new sprites" - - tweak: "ports crafting for many things like snowcones needing water" - - balance: "ports of many craftings" - - soundadd: "lowers fryers sound" - - imageadd: "ported icons for new food/grill" - - imagedel: "ports the deletion of some icons and images" - - spellcheck: "ports a spell check for the snowcones" - - code_imp: "ports fixes for stuff I didnt know were even broken with snowcones" diff --git a/html/changelogs/AutoChangeLog-pr-10094.yml b/html/changelogs/AutoChangeLog-pr-10094.yml deleted file mode 100644 index ee9513489d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10094.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - bugfix: "coder cat failers to push the last commit from year(s) ago" diff --git a/html/changelogs/AutoChangeLog-pr-10096.yml b/html/changelogs/AutoChangeLog-pr-10096.yml deleted file mode 100644 index 0089c11a9d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10096.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - balance: "nanites no longer spread through air blocking objects" diff --git a/html/changelogs/AutoChangeLog-pr-10099.yml b/html/changelogs/AutoChangeLog-pr-10099.yml deleted file mode 100644 index 9ad4bfdfc2..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10099.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed a few holo barriers lacking transparency." diff --git a/html/changelogs/AutoChangeLog-pr-10108.yml b/html/changelogs/AutoChangeLog-pr-10108.yml deleted file mode 100644 index 67c6396763..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10108.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - balance: "Clock cult kindle no longer cares about oxygen damage" diff --git a/html/changelogs/AutoChangeLog-pr-10111.yml b/html/changelogs/AutoChangeLog-pr-10111.yml deleted file mode 100644 index 0a80f01eef..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10111.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - bugfix: "you can now strip people while aggrograbbing or higher" diff --git a/html/changelogs/AutoChangeLog-pr-10115.yml b/html/changelogs/AutoChangeLog-pr-10115.yml deleted file mode 100644 index f7a60e4911..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10115.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Useroth" -delete-after: True -changes: - - rscadd: "New lavaland ruin: Pulsating tumor" - - rscadd: "New class of lavaland mobs, a bit weaker than megafauna but still stronger than most of what you normally see" diff --git a/html/changelogs/AutoChangeLog-pr-10116.yml b/html/changelogs/AutoChangeLog-pr-10116.yml deleted file mode 100644 index 70c1b4590d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10116.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam" -delete-after: True -changes: - - bugfix: "acute hepatic pharmacokinesis now works if you already have relevant genitals" diff --git a/html/changelogs/AutoChangeLog-pr-10120.yml b/html/changelogs/AutoChangeLog-pr-10120.yml deleted file mode 100644 index 5777519d83..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10120.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscadd: "Night vision readded as a darkness dampening effect rather than darksight." diff --git a/html/changelogs/AutoChangeLog-pr-10122.yml b/html/changelogs/AutoChangeLog-pr-10122.yml deleted file mode 100644 index 4d503dc2be..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10122.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscdel: "conveyors can only stack items on tiles to 150 now." diff --git a/html/changelogs/AutoChangeLog-pr-10123.yml b/html/changelogs/AutoChangeLog-pr-10123.yml new file mode 100644 index 0000000000..208b17b930 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10123.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "throwing things no longer makes them randomly turned as long as you aren't on harm intent" diff --git a/html/changelogs/AutoChangeLog-pr-10126.yml b/html/changelogs/AutoChangeLog-pr-10126.yml deleted file mode 100644 index 6cf568ca70..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - balance: "Buffed HE pipes by making them realistically radiate away heat." diff --git a/html/changelogs/AutoChangeLog-pr-10130.yml b/html/changelogs/AutoChangeLog-pr-10130.yml deleted file mode 100644 index 1f6ba6ac6a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10130.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - code_imp: "modular is gone" diff --git a/html/changelogs/AutoChangeLog-pr-10137.yml b/html/changelogs/AutoChangeLog-pr-10137.yml deleted file mode 100644 index 63678d4425..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10137.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "KeRSedChaplain" -delete-after: True -changes: - - soundadd: "Extends the file \"deltakalaxon.ogg\" to a 38 second .ogg." diff --git a/html/changelogs/AutoChangeLog-pr-10140.yml b/html/changelogs/AutoChangeLog-pr-10140.yml deleted file mode 100644 index d5e33fa02d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10140.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Dynamic has a (totally unused for any relevant purpose) roundstart report now." diff --git a/html/changelogs/AutoChangeLog-pr-10141.yml b/html/changelogs/AutoChangeLog-pr-10141.yml deleted file mode 100644 index 5f0bfe2267..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10141.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - admin: "A whole bunch of dynamic data is now available for statbus" diff --git a/html/changelogs/AutoChangeLog-pr-10143.yml b/html/changelogs/AutoChangeLog-pr-10143.yml deleted file mode 100644 index 45dfe225c4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10143.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Dynamic from-ghost antags no longer double dip on threat refunds when the mode fails due to not enough applications." diff --git a/html/changelogs/AutoChangeLog-pr-10144.yml b/html/changelogs/AutoChangeLog-pr-10144.yml deleted file mode 100644 index 6b175b149b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10144.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - bugfix: "officer's sabre now properly makes the unsheating and resheating noise" diff --git a/html/changelogs/AutoChangeLog-pr-10150.yml b/html/changelogs/AutoChangeLog-pr-10150.yml deleted file mode 100644 index d2a2b79ff0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10150.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - bugfix: "Wrong icon names, missing dog fashion with telegram hat" diff --git a/html/changelogs/AutoChangeLog-pr-10153.yml b/html/changelogs/AutoChangeLog-pr-10153.yml deleted file mode 100644 index 7196583de9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10153.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - bugfix: "fireman failure has a different message depending on the circumstance" diff --git a/html/changelogs/AutoChangeLog-pr-10156.yml b/html/changelogs/AutoChangeLog-pr-10156.yml deleted file mode 100644 index ec08642b3f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10156.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed character setup preview bodyparts not displaying correctly most of times." - - bugfix: "Fixed character appearance preview displaying the mannequin in job attire instead of undergarments." diff --git a/html/changelogs/AutoChangeLog-pr-10157.yml b/html/changelogs/AutoChangeLog-pr-10157.yml deleted file mode 100644 index 6ec495b7fc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10157.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "ShizCalev" -delete-after: True -changes: - - bugfix: "Fixed floodlights not turning off properly when they're underpowered." - - bugfix: "Fixed emitters not changing icons properly when they're underpowered." diff --git a/html/changelogs/AutoChangeLog-pr-10160.yml b/html/changelogs/AutoChangeLog-pr-10160.yml deleted file mode 100644 index 2046324dc8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10160.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "nicbn, Kevinz000, ShizCalev" -delete-after: True -changes: - - tweak: "Fire alarm is now simpler. Touch it to activate, touch it to deactivate. When activated, it will blink inconsistently if it is emagged." - - bugfix: "You can no longer spam fire alarms. Also, they're logged again." - - bugfix: "Fixed fire alarms not updating icons properly after being emagged and hacked by Malf AI's." diff --git a/html/changelogs/AutoChangeLog-pr-10161.yml b/html/changelogs/AutoChangeLog-pr-10161.yml deleted file mode 100644 index 7f09609b99..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10161.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed raven's shuttle computer not being of the emergency shuttle type." diff --git a/html/changelogs/AutoChangeLog-pr-10163.yml b/html/changelogs/AutoChangeLog-pr-10163.yml deleted file mode 100644 index 2818019ad7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10163.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - tweak: "Blood bank generators can now be anchored and unanchored now." diff --git a/html/changelogs/AutoChangeLog-pr-10164.yml b/html/changelogs/AutoChangeLog-pr-10164.yml deleted file mode 100644 index 464edda73b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10164.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - rscadd: "martial apprentices for the local Chinese wizard" diff --git a/html/changelogs/AutoChangeLog-pr-10165.yml b/html/changelogs/AutoChangeLog-pr-10165.yml new file mode 100644 index 0000000000..be6f9dedf7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10165.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed missing digi versions fishnet sprites and wrong digitigrade left dir purple stockings sprite." + - imageadd: "Add digitigrade versions for boxers and the long johns." diff --git a/html/changelogs/AutoChangeLog-pr-10166.yml b/html/changelogs/AutoChangeLog-pr-10166.yml deleted file mode 100644 index ba919010af..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10166.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nemvar" -delete-after: True -changes: - - bugfix: "The brains of roundstart borgs no longer decay." diff --git a/html/changelogs/AutoChangeLog-pr-10171.yml b/html/changelogs/AutoChangeLog-pr-10171.yml deleted file mode 100644 index 0138d7a381..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10171.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "r4d6" -delete-after: True -changes: - - rscdel: "Removed a AM Shielding from the crate" diff --git a/html/changelogs/AutoChangeLog-pr-10172.yml b/html/changelogs/AutoChangeLog-pr-10172.yml deleted file mode 100644 index ce76e04d13..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10172.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "Mickyan, nemvar, RaveRadbury, AnturK, SpaceManiac" -delete-after: True -changes: - - bugfix: "Certain incompatible quirks can no longer be taken together." - - bugfix: "If an admin sends a ghost back to the lobby, they can now choose a different set of quirks." - - spellcheck: "the quirk menu went through some minor formatting changes." - - bugfix: "Podcloning now lets you keep your quirks." - - rscadd: "Quirks have flavor text in medical records." - - spellcheck: "All quirk medical records refer to \"Patient\", removing a few instances of \"Subject\"." - - tweak: "Quirks no longer apply to off-station roundstart antagonists." - - code_imp: "Mood quirks are now only processed by the quirk holders" diff --git a/html/changelogs/AutoChangeLog-pr-10180.yml b/html/changelogs/AutoChangeLog-pr-10180.yml deleted file mode 100644 index 0a22910940..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10180.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixes a ghostchat eavesdropping exploit concerning VR." - - bugfix: "Fixes VR deaths being broadcasted in deadchat." diff --git a/html/changelogs/AutoChangeLog-pr-10181.yml b/html/changelogs/AutoChangeLog-pr-10181.yml deleted file mode 100644 index bb00ab1012..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10181.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed a few pill bottle issues with the ChemMaster." diff --git a/html/changelogs/AutoChangeLog-pr-10189.yml b/html/changelogs/AutoChangeLog-pr-10189.yml new file mode 100644 index 0000000000..5889e127d2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10189.yml @@ -0,0 +1,5 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Dynamic storytellers, a new voting paradigm for dynamic" + - rscadd: "Support for approval voting and condorcet (ranked choice) voting in server votes" diff --git a/html/changelogs/AutoChangeLog-pr-10190.yml b/html/changelogs/AutoChangeLog-pr-10190.yml deleted file mode 100644 index d05ad85db3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10190.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "New softdrink that comes in its own vender!" - - rscadd: "Honey now has a reaction with plants" diff --git a/html/changelogs/AutoChangeLog-pr-10191.yml b/html/changelogs/AutoChangeLog-pr-10191.yml new file mode 100644 index 0000000000..c1366727bd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10191.yml @@ -0,0 +1,5 @@ +author: "kevinz000" +delete-after: True +changes: + - rscadd: "Custom holoforms have been added for pAIs and AIs. oh and cyborg holograms of specific modules too." + - balance: "pais are no longer indestructible-flagged while in card form. pai radios now short out if they are forcefully collapsed from damage." diff --git a/html/changelogs/AutoChangeLog-pr-10193.yml b/html/changelogs/AutoChangeLog-pr-10193.yml deleted file mode 100644 index b432eb74a3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10193.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Commandersand" -delete-after: True -changes: - - tweak: "added two words to clown filter" diff --git a/html/changelogs/AutoChangeLog-pr-10195.yml b/html/changelogs/AutoChangeLog-pr-10195.yml deleted file mode 100644 index be8ed0ce76..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10195.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixes a few negative quirks not being properly removed when deleted." - - tweak: "Phobia and mute quirks are no longer cheesed by brain surgery grade healing or medicines." diff --git a/html/changelogs/AutoChangeLog-pr-10197.yml b/html/changelogs/AutoChangeLog-pr-10197.yml deleted file mode 100644 index 05545c066c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10197.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed double-flavour (and bland custom) ice creams." diff --git a/html/changelogs/AutoChangeLog-pr-10198.yml b/html/changelogs/AutoChangeLog-pr-10198.yml deleted file mode 100644 index 3414258d84..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10198.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "AnturK" -delete-after: True -changes: - - bugfix: "Fixed ranged syndicate mobs stormtrooper training." diff --git a/html/changelogs/AutoChangeLog-pr-10203.yml b/html/changelogs/AutoChangeLog-pr-10203.yml deleted file mode 100644 index 7cb4df817b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10203.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - tweak: "changed mecha internals access for some special mechs." - - tweak: "no more mech maintenance access for engineers." diff --git a/html/changelogs/AutoChangeLog-pr-10204.yml b/html/changelogs/AutoChangeLog-pr-10204.yml deleted file mode 100644 index ad5a872bc0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10204.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "r4d6" -delete-after: True -changes: - - rscadd: "Added Handshakes" - - rscadd: "Added Nose booping" diff --git a/html/changelogs/AutoChangeLog-pr-10207.yml b/html/changelogs/AutoChangeLog-pr-10207.yml deleted file mode 100644 index c451475dfa..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10207.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed Pubbystation's wall Nanomeds being inconsistent with other stations'." diff --git a/html/changelogs/AutoChangeLog-pr-10210.yml b/html/changelogs/AutoChangeLog-pr-10210.yml deleted file mode 100644 index 39167dee25..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10210.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - rscadd: "Cargo shuttle now silently ignores slaughter demons/revenants instead of being blocked even while they are jaunted. A drawback is that manifested ones can't block it either, any more." diff --git a/html/changelogs/AutoChangeLog-pr-10214.yml b/html/changelogs/AutoChangeLog-pr-10214.yml deleted file mode 100644 index fe5df9f22c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10214.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "dextrous simplemobs can now swap action intent with 1, 2, 3, 4 now. Just like humies, ayys and monkys." diff --git a/html/changelogs/AutoChangeLog-pr-10216.yml b/html/changelogs/AutoChangeLog-pr-10216.yml deleted file mode 100644 index 69daa62448..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10216.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Nervere and subject217, Militaires, py01, nemvar" -delete-after: True -changes: - - balance: "The cook's CQC now only works when in the kitchen or the kitchen backroom." - - spellcheck: "corrected CQC help instructions" - - bugfix: "CQC and Sleeping Carp are properly logged." - - tweak: "CQC can passively grab targets when not on grab intent. Passive grabs do not count towards combos for CQC or Sleeping carp." - - code_imp: "Martial Art and NOGUN cleanup." diff --git a/html/changelogs/AutoChangeLog-pr-10217.yml b/html/changelogs/AutoChangeLog-pr-10217.yml deleted file mode 100644 index 19ddaf33ce..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10217.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam" -delete-after: True -changes: - - balance: "Contamination is no longer an infinitely spreading deadly contagion causing mass panic" diff --git a/html/changelogs/AutoChangeLog-pr-10218.yml b/html/changelogs/AutoChangeLog-pr-10218.yml deleted file mode 100644 index fb05465cbe..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10218.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "GrayRachnid" -delete-after: True -changes: - - bugfix: "fixes consistency" diff --git a/html/changelogs/AutoChangeLog-pr-10224.yml b/html/changelogs/AutoChangeLog-pr-10224.yml new file mode 100644 index 0000000000..b7d07abe5c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10224.yml @@ -0,0 +1,4 @@ +author: "Seris02" +delete-after: True +changes: + - tweak: "made it so trait blacklisting removes random positives instead of removing everything" diff --git a/html/changelogs/AutoChangeLog-pr-10225.yml b/html/changelogs/AutoChangeLog-pr-10225.yml deleted file mode 100644 index 964cc68223..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10225.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "BlueWildrose" -delete-after: True -changes: - - bugfix: "Fixed stargazers being unable to link to themselves if mindshielded or if holding psionic shielding devices (tinfoil hats) when the species is set." - - bugfix: "Fixes non-roundstart slimes being unable to wag their tail." diff --git a/html/changelogs/AutoChangeLog-pr-10227.yml b/html/changelogs/AutoChangeLog-pr-10227.yml deleted file mode 100644 index 5d9446d045..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10227.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "whoops broke quirks" diff --git a/html/changelogs/AutoChangeLog-pr-10228.yml b/html/changelogs/AutoChangeLog-pr-10228.yml deleted file mode 100644 index ccc386bbcb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10228.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "quirks work" diff --git a/html/changelogs/AutoChangeLog-pr-10232.yml b/html/changelogs/AutoChangeLog-pr-10232.yml deleted file mode 100644 index 479012a868..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10232.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - tweak: "All heads of staff can now message CC" diff --git a/html/changelogs/AutoChangeLog-pr-10235.yml b/html/changelogs/AutoChangeLog-pr-10235.yml deleted file mode 100644 index ca8e4da164..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10235.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - balance: "flashbangs process light/sound separately and uses viewers(), so xray users beware." diff --git a/html/changelogs/AutoChangeLog-pr-10237.yml b/html/changelogs/AutoChangeLog-pr-10237.yml deleted file mode 100644 index 0a3b481d8c..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10237.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Stops humanoids whose skin_tone variable is set to \"albino\" from showing up as pale when examined should their species not use skintones anyway." diff --git a/html/changelogs/AutoChangeLog-pr-10238.yml b/html/changelogs/AutoChangeLog-pr-10238.yml new file mode 100644 index 0000000000..dda40c86c9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10238.yml @@ -0,0 +1,7 @@ +author: "SpaceManiac, bobbahbrown, ShizCalev, SpaceManiac (ported by Ghommie)" +delete-after: True +changes: + - code_imp: "It is now possible to set a different most-base-turf per z-level." + - spellcheck: "Removed unlawful reference to Disney's Star Wars franchise in map logging." + - tweak: "Moved mapping related errors to their own log file." + - bugfix: "Destruction on Lavaland will no longer reveal space in rare situations." diff --git a/html/changelogs/AutoChangeLog-pr-10242.yml b/html/changelogs/AutoChangeLog-pr-10242.yml deleted file mode 100644 index 017c3f99bd..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10242.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "nemvar" -delete-after: True -changes: - - code_imp: "Refactored the visibility of reagents for mobs." diff --git a/html/changelogs/AutoChangeLog-pr-10245.yml b/html/changelogs/AutoChangeLog-pr-10245.yml deleted file mode 100644 index a618bfc76b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10245.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "r4d6" -delete-after: True -changes: - - rscadd: "Added submaps for the SM, Tesla and Singulo" - - rscadd: "Added a placeholder on Boxstation for the Engines" diff --git a/html/changelogs/AutoChangeLog-pr-10246.yml b/html/changelogs/AutoChangeLog-pr-10246.yml deleted file mode 100644 index 73b2b24ee8..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10246.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - tweak: "Stat() slowed down for anti-lag measures." diff --git a/html/changelogs/AutoChangeLog-pr-10250.yml b/html/changelogs/AutoChangeLog-pr-10250.yml deleted file mode 100644 index 8e32083f09..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10250.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Toriate" -delete-after: True -changes: - - rscadd: "Polychromic shorts now have a digitigrade state" diff --git a/html/changelogs/AutoChangeLog-pr-10254.yml b/html/changelogs/AutoChangeLog-pr-10254.yml deleted file mode 100644 index 59fefc5703..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10254.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "r4d6" -delete-after: True -changes: - - bugfix: "fixed Nose boops not triggering" diff --git a/html/changelogs/AutoChangeLog-pr-10255.yml b/html/changelogs/AutoChangeLog-pr-10255.yml new file mode 100644 index 0000000000..ebaccd0af6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10255.yml @@ -0,0 +1,4 @@ +author: "Xantholne" +delete-after: True +changes: + - bugfix: "Christmas clothes that where missing stuff should work again" diff --git a/html/changelogs/AutoChangeLog-pr-10256.yml b/html/changelogs/AutoChangeLog-pr-10256.yml new file mode 100644 index 0000000000..eb14f716cc --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10256.yml @@ -0,0 +1,4 @@ +author: "Putnam" +delete-after: True +changes: + - rscadd: "Alcohol intolerance trait, which forces vomiting on any alcohol ingestion" diff --git a/html/changelogs/AutoChangeLog-pr-10257.yml b/html/changelogs/AutoChangeLog-pr-10257.yml deleted file mode 100644 index d18807c1eb..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10257.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - code_imp: "Removes a magicnumber" diff --git a/html/changelogs/AutoChangeLog-pr-10263.yml b/html/changelogs/AutoChangeLog-pr-10263.yml deleted file mode 100644 index a8fa2b9e26..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10263.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - tweak: "Buzz fuzz now only has a 5% to give honey and will now give 1u of sugar not 2" diff --git a/html/changelogs/AutoChangeLog-pr-10264.yml b/html/changelogs/AutoChangeLog-pr-10264.yml deleted file mode 100644 index 71497e423b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10264.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - rscadd: "added the runed and brass winter coats (cosmetic ratvarian/narsian)" - - tweak: "how the narsian/ratvarian coats can be made" diff --git a/html/changelogs/AutoChangeLog-pr-10266.yml b/html/changelogs/AutoChangeLog-pr-10266.yml deleted file mode 100644 index 7fc7f11682..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10266.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "shellspeed1" -delete-after: True -changes: - - rscadd: "Adds Insect markings" - - rscadd: "Adds three new moth wings." diff --git a/html/changelogs/AutoChangeLog-pr-10268.yml b/html/changelogs/AutoChangeLog-pr-10268.yml deleted file mode 100644 index f4f4991202..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10268.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscdel: "Removed the old (almost) unused roboticist encryption key and headset." diff --git a/html/changelogs/AutoChangeLog-pr-10269.yml b/html/changelogs/AutoChangeLog-pr-10269.yml deleted file mode 100644 index f38bb346e3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10269.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed goose meat." diff --git a/html/changelogs/AutoChangeLog-pr-10270.yml b/html/changelogs/AutoChangeLog-pr-10270.yml new file mode 100644 index 0000000000..b47a249f9a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10270.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed the secret sauce recipe being randomized every round." diff --git a/html/changelogs/AutoChangeLog-pr-10274.yml b/html/changelogs/AutoChangeLog-pr-10274.yml deleted file mode 100644 index a1b448344f..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10274.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - bugfix: "broodmother baby lag" diff --git a/html/changelogs/AutoChangeLog-pr-10142.yml b/html/changelogs/AutoChangeLog-pr-10278.yml similarity index 52% rename from html/changelogs/AutoChangeLog-pr-10142.yml rename to html/changelogs/AutoChangeLog-pr-10278.yml index aba2675550..76ada12f20 100644 --- a/html/changelogs/AutoChangeLog-pr-10142.yml +++ b/html/changelogs/AutoChangeLog-pr-10278.yml @@ -1,4 +1,4 @@ author: "Trilbyspaceclone" delete-after: True changes: - - tweak: "CE hardsuit is now more rad-proof" + - bugfix: "Fermi plushie can be made once again" diff --git a/html/changelogs/AutoChangeLog-pr-10281.yml b/html/changelogs/AutoChangeLog-pr-10281.yml deleted file mode 100644 index 0d6c353703..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10281.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Hatterhat" -delete-after: True -changes: - - rscadd: ".357 speedloaders can now be printed with the Advanced Illegal Ballistics node on the tech tree!" - - balance: "okay so i may have given the .357 an extra speedloader at the same cost but it comes in a box now" diff --git a/html/changelogs/AutoChangeLog-pr-10282.yml b/html/changelogs/AutoChangeLog-pr-10282.yml deleted file mode 100644 index bf4f74c84a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10282.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - config: "Buncha dynamic config tweaks" diff --git a/html/changelogs/AutoChangeLog-pr-10283.yml b/html/changelogs/AutoChangeLog-pr-10283.yml deleted file mode 100644 index 435a0c7ca9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10283.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Detective-Google" -delete-after: True -changes: - - bugfix: "short hair 80's is no longer jank" diff --git a/html/changelogs/AutoChangeLog-pr-10289.yml b/html/changelogs/AutoChangeLog-pr-10289.yml deleted file mode 100644 index 4907620fdc..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10289.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed a little door assembly glass dupe exploit" diff --git a/html/changelogs/AutoChangeLog-pr-10296.yml b/html/changelogs/AutoChangeLog-pr-10296.yml deleted file mode 100644 index 22aa8cca14..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10296.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Useroth" -delete-after: True -changes: - - rscadd: "Ghost cafe spawner. For letting people spawn as their own character in the ninja holding facility. It bypasses the usual check, so people who have suicided/ghosted/cryod may use it." - - rscadd: "Dorms in the ninja holding facility." diff --git a/html/changelogs/AutoChangeLog-pr-10297.yml b/html/changelogs/AutoChangeLog-pr-10297.yml deleted file mode 100644 index 6eccde6be7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10297.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Narcissisko (ported by Hatterhat)" -delete-after: True -changes: - - rscadd: "Luxury Bar Capsule, at 10,000 points. Comes with no medical supplies, a bar, and a bunch of cigars. Ported from tgstation/tgstation#45547." diff --git a/html/changelogs/AutoChangeLog-pr-10298.yml b/html/changelogs/AutoChangeLog-pr-10298.yml deleted file mode 100644 index 981e1f5314..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10298.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "you can no longer get 100k credits by spending 4k roundstart" diff --git a/html/changelogs/AutoChangeLog-pr-10299.yml b/html/changelogs/AutoChangeLog-pr-10299.yml deleted file mode 100644 index ee3f0bf96b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10299.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kappa-sama" -delete-after: True -changes: - - balance: "cooking oil in sunflowers instead of corn oil" diff --git a/html/changelogs/AutoChangeLog-pr-10301.yml b/html/changelogs/AutoChangeLog-pr-10301.yml new file mode 100644 index 0000000000..2acac559e9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10301.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "range on Engi Tray scanners and Rad-Scanners" diff --git a/html/changelogs/AutoChangeLog-pr-10011.yml b/html/changelogs/AutoChangeLog-pr-10306.yml similarity index 52% rename from html/changelogs/AutoChangeLog-pr-10011.yml rename to html/changelogs/AutoChangeLog-pr-10306.yml index 70d569699f..9ab82dbda0 100644 --- a/html/changelogs/AutoChangeLog-pr-10011.yml +++ b/html/changelogs/AutoChangeLog-pr-10306.yml @@ -1,4 +1,4 @@ author: "Arturlang" delete-after: True changes: - - rscadd: "Adds Bloodsuckers, beware." + - tweak: "Vampires are no longer as tanky" diff --git a/html/changelogs/AutoChangeLog-pr-10155.yml b/html/changelogs/AutoChangeLog-pr-10309.yml similarity index 60% rename from html/changelogs/AutoChangeLog-pr-10155.yml rename to html/changelogs/AutoChangeLog-pr-10309.yml index d82ea5ed43..a59ebff156 100644 --- a/html/changelogs/AutoChangeLog-pr-10155.yml +++ b/html/changelogs/AutoChangeLog-pr-10309.yml @@ -1,4 +1,4 @@ author: "Seris02" delete-after: True changes: - - bugfix: "distance checks" + - rscadd: "disabler sechuds" diff --git a/html/changelogs/AutoChangeLog-pr-10315.yml b/html/changelogs/AutoChangeLog-pr-10315.yml deleted file mode 100644 index 8db0d90e90..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10315.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscdel: "Removed Lighters in thunderdomes" diff --git a/html/changelogs/AutoChangeLog-pr-10265.yml b/html/changelogs/AutoChangeLog-pr-10317.yml similarity index 53% rename from html/changelogs/AutoChangeLog-pr-10265.yml rename to html/changelogs/AutoChangeLog-pr-10317.yml index f42e97388d..7db50240e3 100644 --- a/html/changelogs/AutoChangeLog-pr-10265.yml +++ b/html/changelogs/AutoChangeLog-pr-10317.yml @@ -1,4 +1,4 @@ author: "Trilbyspaceclone" delete-after: True changes: - - rscadd: "Blaster shotguns back into armory" + - bugfix: "issues with mapping done my Trilby" diff --git a/html/changelogs/AutoChangeLog-pr-10318.yml b/html/changelogs/AutoChangeLog-pr-10318.yml deleted file mode 100644 index 8dc58b9922..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10318.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Trilbyspaceclone" -delete-after: True -changes: - - rscadd: "Silicons now know what a slime is saying!" diff --git a/html/changelogs/AutoChangeLog-pr-10319.yml b/html/changelogs/AutoChangeLog-pr-10319.yml new file mode 100644 index 0000000000..88235aab8e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10319.yml @@ -0,0 +1,5 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "adds coconut" + - rscadd: "adds a coconut bong" diff --git a/html/changelogs/AutoChangeLog-pr-10328.yml b/html/changelogs/AutoChangeLog-pr-10328.yml deleted file mode 100644 index 740a07ddce..0000000000 --- a/html/changelogs/AutoChangeLog-pr-10328.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - bugfix: "Ghost cafe spawns are actual ghost roles by the game's reckoning now" diff --git a/html/changelogs/AutoChangeLog-pr-10330.yml b/html/changelogs/AutoChangeLog-pr-10330.yml new file mode 100644 index 0000000000..b2a46ef605 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10330.yml @@ -0,0 +1,4 @@ +author: "keronshb" +delete-after: True +changes: + - rscadd: "Adds new features for nanites" diff --git a/html/changelogs/AutoChangeLog-pr-10333.yml b/html/changelogs/AutoChangeLog-pr-10333.yml new file mode 100644 index 0000000000..b5c11a4646 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10333.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - rscadd: "Grass now makes light beer when distilled" diff --git a/html/changelogs/AutoChangeLog-pr-10337.yml b/html/changelogs/AutoChangeLog-pr-10337.yml new file mode 100644 index 0000000000..370a8fdc04 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10337.yml @@ -0,0 +1,5 @@ +author: "Seris02" +delete-after: True +changes: + - rscadd: "Auto ooc" + - admin: "changed \"assume direct control\" from m.ckey = src.ckey to adminmob.transfer_ckey(M) so it works with auto ooc" diff --git a/html/changelogs/AutoChangeLog-pr-10231.yml b/html/changelogs/AutoChangeLog-pr-10338.yml similarity index 64% rename from html/changelogs/AutoChangeLog-pr-10231.yml rename to html/changelogs/AutoChangeLog-pr-10338.yml index 7caf65b09f..c4816a3fbe 100644 --- a/html/changelogs/AutoChangeLog-pr-10231.yml +++ b/html/changelogs/AutoChangeLog-pr-10338.yml @@ -1,4 +1,4 @@ author: "Seris02" delete-after: True changes: - - bugfix: "the sprites" + - rscadd: "marshmallow" diff --git a/html/changelogs/AutoChangeLog-pr-10128.yml b/html/changelogs/AutoChangeLog-pr-10339.yml similarity index 58% rename from html/changelogs/AutoChangeLog-pr-10128.yml rename to html/changelogs/AutoChangeLog-pr-10339.yml index 89bca26a76..c313c4bf80 100644 --- a/html/changelogs/AutoChangeLog-pr-10128.yml +++ b/html/changelogs/AutoChangeLog-pr-10339.yml @@ -1,4 +1,4 @@ author: "Seris02" delete-after: True changes: - - rscadd: "the clowns headset" + - rscadd: "telescopic IV drip" diff --git a/html/changelogs/AutoChangeLog-pr-10344.yml b/html/changelogs/AutoChangeLog-pr-10344.yml new file mode 100644 index 0000000000..e0381c6a43 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10344.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Chestbursters won't delete the host's brain somewhat anymore." diff --git a/html/changelogs/AutoChangeLog-pr-10345.yml b/html/changelogs/AutoChangeLog-pr-10345.yml new file mode 100644 index 0000000000..a95653cdda --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10345.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "allows bandoliers to hold any ammo type as long as it has a casing" diff --git a/html/changelogs/AutoChangeLog-pr-10349.yml b/html/changelogs/AutoChangeLog-pr-10349.yml new file mode 100644 index 0000000000..fad3179c6e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10349.yml @@ -0,0 +1,6 @@ +author: "KathrinBailey" +delete-after: True +changes: + - rscadd: "Empty engineering lockers for mappers." + - rscadd: "Industrial welding tools to the engineer welding locker." + - rscdel: "Removed the multitool, airlock painter, mechanical toolbox, brown sneakers, hazard vest and airlock painter from the CE's locker." diff --git a/html/changelogs/AutoChangeLog-pr-10350.yml b/html/changelogs/AutoChangeLog-pr-10350.yml new file mode 100644 index 0000000000..580f1d68cf --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10350.yml @@ -0,0 +1,7 @@ +author: "Putnam3145" +delete-after: True +changes: + - rscadd: "Ghost cafe mobs can now ghostize" + - rscadd: "Ghost cafe now has a cremator" + - rscadd: "Ghost cafe mobs are now eligible for ghost roles" + - refactor: "Ghost roles now use an element for eligibility purposes" diff --git a/html/changelogs/AutoChangeLog-pr-10356.yml b/html/changelogs/AutoChangeLog-pr-10356.yml new file mode 100644 index 0000000000..1016b559ee --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10356.yml @@ -0,0 +1,5 @@ +author: "Bhijn" +delete-after: True +changes: + - rscadd: "Added a preference to make the sprint hotkey be a toggle instead of a hold bind" + - rscadd: "Added a preference to bind the sprint hotkey to space instead of shift." diff --git a/html/changelogs/AutoChangeLog-pr-10357.yml b/html/changelogs/AutoChangeLog-pr-10357.yml new file mode 100644 index 0000000000..048baa3041 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10357.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "You can toggle some prefs properly now." diff --git a/html/changelogs/AutoChangeLog-pr-10101.yml b/html/changelogs/AutoChangeLog-pr-10358.yml similarity index 51% rename from html/changelogs/AutoChangeLog-pr-10101.yml rename to html/changelogs/AutoChangeLog-pr-10358.yml index 059c8b2d85..a578e6e336 100644 --- a/html/changelogs/AutoChangeLog-pr-10101.yml +++ b/html/changelogs/AutoChangeLog-pr-10358.yml @@ -1,4 +1,4 @@ author: "Trilbyspaceclone" delete-after: True changes: - - admin: "Updates the changlogs" + - server: "Cleans out the last years of changlogs" diff --git a/html/changelogs/AutoChangeLog-pr-10361.yml b/html/changelogs/AutoChangeLog-pr-10361.yml new file mode 100644 index 0000000000..0224bdcb49 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10361.yml @@ -0,0 +1,4 @@ +author: "CameronWoof" +delete-after: True +changes: + - rscadd: "Ghost Cafe patrons now spawn with chameleon kits. Dress up! Be fancy!" diff --git a/html/changelogs/AutoChangeLog-pr-10362.yml b/html/changelogs/AutoChangeLog-pr-10362.yml new file mode 100644 index 0000000000..f92e16302a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10362.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - bugfix: "rouge cases of #$39; in bottle/pill/patch/condiments" diff --git a/html/changelogs/AutoChangeLog-pr-10364.yml b/html/changelogs/AutoChangeLog-pr-10364.yml new file mode 100644 index 0000000000..8834c494ad --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10364.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - bugfix: "telescopic iv drips now have the proper sanity checks for deployment." diff --git a/html/changelogs/AutoChangeLog-pr-10365.yml b/html/changelogs/AutoChangeLog-pr-10365.yml new file mode 100644 index 0000000000..f7ba047fc7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10365.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - bugfix: "no ass slap is no longer the same thing as no aphro" diff --git a/html/changelogs/AutoChangeLog-pr-10366.yml b/html/changelogs/AutoChangeLog-pr-10366.yml new file mode 100644 index 0000000000..ec8d234edd --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10366.yml @@ -0,0 +1,5 @@ +author: "Hatterhat" +delete-after: True +changes: + - balance: "Beakers are generally more useful now, with slight capacity increases." + - tweak: "Transfer amounts are different now. Adjust your muscle memory to compensate." diff --git a/html/changelogs/AutoChangeLog-pr-10368.yml b/html/changelogs/AutoChangeLog-pr-10368.yml new file mode 100644 index 0000000000..e6486f2815 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10368.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - balance: "ore redemption machines actually get affected by lasers again kthx" diff --git a/html/changelogs/AutoChangeLog-pr-10369.yml b/html/changelogs/AutoChangeLog-pr-10369.yml new file mode 100644 index 0000000000..c292d948fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10369.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - tweak: "crusher trophy drop chance on mining mobs increased to 1 in 4 (from 1 in 20)" diff --git a/html/changelogs/AutoChangeLog-pr-10370.yml b/html/changelogs/AutoChangeLog-pr-10370.yml new file mode 100644 index 0000000000..6674fd2e17 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10370.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - bugfix: "Blood-drunk buff from blood-drunk eye crusher trophy is less likely to cripple its user." diff --git a/html/changelogs/AutoChangeLog-pr-10121.yml b/html/changelogs/AutoChangeLog-pr-10371.yml similarity index 52% rename from html/changelogs/AutoChangeLog-pr-10121.yml rename to html/changelogs/AutoChangeLog-pr-10371.yml index 38a91fcc01..e4322d70f1 100644 --- a/html/changelogs/AutoChangeLog-pr-10121.yml +++ b/html/changelogs/AutoChangeLog-pr-10371.yml @@ -1,4 +1,4 @@ author: "kappa-sama" delete-after: True changes: - - rscadd: "plasmafist to wizard" + - rscadd: "loot crates in cargo contraband" diff --git a/html/changelogs/AutoChangeLog-pr-10372.yml b/html/changelogs/AutoChangeLog-pr-10372.yml new file mode 100644 index 0000000000..6bb60c3d8d --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10372.yml @@ -0,0 +1,5 @@ +author: "Hatterhat" +delete-after: True +changes: + - tweak: "Forcefield projectors now fit on toolbelts." + - imageadd: "New sprites for ATMOS holofan and forcefield projectors!" diff --git a/html/changelogs/AutoChangeLog-pr-10374.yml b/html/changelogs/AutoChangeLog-pr-10374.yml new file mode 100644 index 0000000000..376f49a4d4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10374.yml @@ -0,0 +1,4 @@ +author: "Bhijn helped" +delete-after: True +changes: + - bugfix: "Fixes Dragon's Tooth Sword 50% armor penetration by making it 35%" diff --git a/html/changelogs/AutoChangeLog-pr-10378.yml b/html/changelogs/AutoChangeLog-pr-10378.yml new file mode 100644 index 0000000000..c7ab7d42c1 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10378.yml @@ -0,0 +1,4 @@ +author: "EmeraldSundisk" +delete-after: True +changes: + - rscadd: "Adds a sign outside MetaStation's custodial closet" diff --git a/html/changelogs/AutoChangeLog-pr-10379.yml b/html/changelogs/AutoChangeLog-pr-10379.yml new file mode 100644 index 0000000000..9623f815d6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10379.yml @@ -0,0 +1,4 @@ +author: "Ryll/Shaps, ported by Hatterhat" +delete-after: True +changes: + - rscadd: "Point-blanking people with shotguns actually throws them backwards!" diff --git a/html/changelogs/AutoChangeLog-pr-10380.yml b/html/changelogs/AutoChangeLog-pr-10380.yml new file mode 100644 index 0000000000..4604329137 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10380.yml @@ -0,0 +1,6 @@ +author: "Unit2E & JMoldy, ported by Hatterhat" +delete-after: True +changes: + - balance: "the powerfist now punches people away at high velocity depending on setting." + - rscadd: "the powerfist now leaks the gas it uses onto the tile you're on." + - tweak: "Adds weak punch variations for empty and near-empty punching." diff --git a/html/changelogs/AutoChangeLog-pr-10200.yml b/html/changelogs/AutoChangeLog-pr-10383.yml similarity index 53% rename from html/changelogs/AutoChangeLog-pr-10200.yml rename to html/changelogs/AutoChangeLog-pr-10383.yml index 8d4782ee98..c6787bbafe 100644 --- a/html/changelogs/AutoChangeLog-pr-10200.yml +++ b/html/changelogs/AutoChangeLog-pr-10383.yml @@ -1,4 +1,4 @@ author: "kevinz000" delete-after: True changes: - - rscadd: "added 8 character save slots" + - bugfix: "megafauna can hear again" diff --git a/html/changelogs/AutoChangeLog-pr-10388.yml b/html/changelogs/AutoChangeLog-pr-10388.yml new file mode 100644 index 0000000000..fd06a5db3f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10388.yml @@ -0,0 +1,4 @@ +author: "CameronWoof" +delete-after: True +changes: + - rscadd: "Robots can now check the crew manifest from anywhere with the \"View Crew Manifest\" verb." diff --git a/html/changelogs/AutoChangeLog-pr-10399.yml b/html/changelogs/AutoChangeLog-pr-10399.yml new file mode 100644 index 0000000000..cbdb00630c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10399.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "Cargo passive gen is now 500 down from 750." diff --git a/html/changelogs/AutoChangeLog-pr-10114.yml b/html/changelogs/AutoChangeLog-pr-10401.yml similarity index 50% rename from html/changelogs/AutoChangeLog-pr-10114.yml rename to html/changelogs/AutoChangeLog-pr-10401.yml index f413760ff9..2aa8d91244 100644 --- a/html/changelogs/AutoChangeLog-pr-10114.yml +++ b/html/changelogs/AutoChangeLog-pr-10401.yml @@ -1,4 +1,4 @@ author: "r4d6" delete-after: True changes: - - rscadd: "Added a N2O pressure tank" + - rscadd: "Added 3 SM Engine variations." diff --git a/html/changelogs/AutoChangeLog-pr-10403.yml b/html/changelogs/AutoChangeLog-pr-10403.yml new file mode 100644 index 0000000000..321789a546 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10403.yml @@ -0,0 +1,5 @@ +author: "r4d6" +delete-after: True +changes: + - rscadd: "Added a way to make opaque plastic flaps +change: Change the already existing flap recipe to show that they are see-through" diff --git a/html/changelogs/AutoChangeLog-pr-10412.yml b/html/changelogs/AutoChangeLog-pr-10412.yml new file mode 100644 index 0000000000..b838dbb680 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10412.yml @@ -0,0 +1,4 @@ +author: "Linzolle" +delete-after: True +changes: + - bugfix: "fixes matchboxes runtiming every time they spawn" diff --git a/html/changelogs/AutoChangeLog-pr-10413.yml b/html/changelogs/AutoChangeLog-pr-10413.yml new file mode 100644 index 0000000000..6d6378675b --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10413.yml @@ -0,0 +1,4 @@ +author: "nik707" +delete-after: True +changes: + - tweak: "engraving light_power from 1 to 0.3" diff --git a/html/changelogs/AutoChangeLog-pr-10427.yml b/html/changelogs/AutoChangeLog-pr-10427.yml new file mode 100644 index 0000000000..5f4fe73988 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10427.yml @@ -0,0 +1,4 @@ +author: "Hatterhat" +delete-after: True +changes: + - tweak: "tweaks some values around with beaker transfer amounts, adds a transfer value verb (altclick)" diff --git a/html/changelogs/AutoChangeLog-pr-10428.yml b/html/changelogs/AutoChangeLog-pr-10428.yml new file mode 100644 index 0000000000..2cd635d0a2 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10428.yml @@ -0,0 +1,4 @@ +author: "Putnam3145" +delete-after: True +changes: + - balance: "Devastating bombs kills bomb armor'd mobs again" diff --git a/html/changelogs/AutoChangeLog-pr-10429.yml b/html/changelogs/AutoChangeLog-pr-10429.yml new file mode 100644 index 0000000000..cc83f8abb6 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10429.yml @@ -0,0 +1,4 @@ +author: "Trilbyspaceclone" +delete-after: True +changes: + - tweak: "Adds missing but needed flags to MASON RIG" diff --git a/html/changelogs/AutoChangeLog-pr-10322.yml b/html/changelogs/AutoChangeLog-pr-10430.yml similarity index 50% rename from html/changelogs/AutoChangeLog-pr-10322.yml rename to html/changelogs/AutoChangeLog-pr-10430.yml index c03fd96a5e..4fd03a5b2b 100644 --- a/html/changelogs/AutoChangeLog-pr-10322.yml +++ b/html/changelogs/AutoChangeLog-pr-10430.yml @@ -1,4 +1,4 @@ author: "kevinz000" delete-after: True changes: - - bugfix: "sprint/stamina huds now work again" + - balance: "nuclear fist buffed." diff --git a/html/changelogs/AutoChangeLog-pr-10132.yml b/html/changelogs/AutoChangeLog-pr-10432.yml similarity index 53% rename from html/changelogs/AutoChangeLog-pr-10132.yml rename to html/changelogs/AutoChangeLog-pr-10432.yml index d8755d2b90..a0b40baa45 100644 --- a/html/changelogs/AutoChangeLog-pr-10132.yml +++ b/html/changelogs/AutoChangeLog-pr-10432.yml @@ -1,4 +1,4 @@ author: "Trilbyspaceclone" delete-after: True changes: - - tweak: "meat hook from HUGE to bulky" + - bugfix: "missing sprites with crushed cans" diff --git a/html/changelogs/AutoChangeLog-pr-10433.yml b/html/changelogs/AutoChangeLog-pr-10433.yml new file mode 100644 index 0000000000..036e74a804 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10433.yml @@ -0,0 +1,4 @@ +author: "kevinz000" +delete-after: True +changes: + - balance: "cogscarabs are now fulltile-hitbox." diff --git a/html/changelogs/AutoChangeLog-pr-10435.yml b/html/changelogs/AutoChangeLog-pr-10435.yml new file mode 100644 index 0000000000..6b684a57a5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10435.yml @@ -0,0 +1,5 @@ +author: "FantasticFwoosh, ported by Hatterhat" +delete-after: True +changes: + - rscadd: "Both reagent universal enzyme & sacks of flour are now available for their respective costs from the biogenerator." + - rscadd: "New crafting recipies for donut boxes, eggboxes & candle boxes have been added to cardboard recipes for the collective benefit of service personnel and the station." diff --git a/html/changelogs/AutoChangeLog-pr-10437.yml b/html/changelogs/AutoChangeLog-pr-10437.yml new file mode 100644 index 0000000000..ee454f47b9 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-10437.yml @@ -0,0 +1,4 @@ +author: "Ghommie" +delete-after: True +changes: + - bugfix: "Fixed roundstart mushpeople being unable to MUSH PUUUUUUUUUUUUNCH!!" diff --git a/html/changelogs/AutoChangeLog-pr-9538.yml b/html/changelogs/AutoChangeLog-pr-9538.yml deleted file mode 100644 index a036a8d24a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9538.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - balance: "Combat defibs now instant stun on disarm rather than 1 second again" - - balance: "Defibs are now always emagged when emagged with an emag rather than EMP." diff --git a/html/changelogs/AutoChangeLog-pr-9563.yml b/html/changelogs/AutoChangeLog-pr-9563.yml deleted file mode 100644 index 47fab1530d..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9563.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Fermis" -delete-after: True -changes: - - tweak: "tweaked how super bases/acids work but limiting them" diff --git a/html/changelogs/AutoChangeLog-pr-9596.yml b/html/changelogs/AutoChangeLog-pr-9596.yml deleted file mode 100644 index 3f924b85ab..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9596.yml +++ /dev/null @@ -1,11 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - rscadd: "Abductor chem dispenser, and added it to the abductor console." - - rscadd: "\"Superlingual matrix\" to the abductor console. It's the abductor's tongue. Can be used to link it to your abductor communication channel and then implanted into a test subject." - - rscadd: "Shrink ray and added it to the abductor console." - - soundadd: "Shrink ray sound effect (its the fucking mega man death sound)" - - rscadd: "special jumpsuit for abductors" - - imageadd: "abductor jumpsuit, including digi version if a digitigrade person somehow manages to get their hands on it. sprites for the shrink ray and chem dispenser." - - rscadd: "new glands to play with, including the all-access gland, the quantum gland, and the blood type randomiser." - - code_imp: "split every gland into its own file instead of all being in one file" diff --git a/html/changelogs/AutoChangeLog-pr-9629.yml b/html/changelogs/AutoChangeLog-pr-9629.yml deleted file mode 100644 index f0419e4ce9..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9629.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - bugfix: "aooc toggling now only broadcasts to antagonists" diff --git a/html/changelogs/AutoChangeLog-pr-9736.yml b/html/changelogs/AutoChangeLog-pr-9736.yml deleted file mode 100644 index 768474b8ef..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9736.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - code_imp: "Antag rep proc is now easier to read and supports returning a list." diff --git a/html/changelogs/AutoChangeLog-pr-9747.yml b/html/changelogs/AutoChangeLog-pr-9747.yml deleted file mode 100644 index 01caf36136..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9747.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - bugfix: "Fixed AI holopad speech text being small and whispers that in multiple exclamation marks echo through multiple areas." diff --git a/html/changelogs/AutoChangeLog-pr-9751.yml b/html/changelogs/AutoChangeLog-pr-9751.yml deleted file mode 100644 index a2c22468c3..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9751.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Seris02" -delete-after: True -changes: - - rscadd: "Added Rising Bass and the shifting scroll." - - tweak: "Changes the martial arts scroll in the uplink to \"Sleeping Carp Scroll\"" diff --git a/html/changelogs/AutoChangeLog-pr-9830.yml b/html/changelogs/AutoChangeLog-pr-9830.yml deleted file mode 100644 index 86fb9c439a..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9830.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "DeltaFire15" -delete-after: True -changes: - - balance: "Rebalanced cult vs cult stun effects to debuff instead of stun" diff --git a/html/changelogs/AutoChangeLog-pr-9856.yml b/html/changelogs/AutoChangeLog-pr-9856.yml new file mode 100644 index 0000000000..697c1c78f5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-9856.yml @@ -0,0 +1,5 @@ +author: "Ghommie" +delete-after: True +changes: + - rscadd: "Refactored code to allow all living mobs to use shields and not only humans." + - tweak: "Monkys will now retaliate against aliens attacking them (as if they even posed a threat to start with)." diff --git a/html/changelogs/AutoChangeLog-pr-9894.yml b/html/changelogs/AutoChangeLog-pr-9894.yml deleted file mode 100644 index 6e4b5c09d0..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9894.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "Putnam3145" -delete-after: True -changes: - - balance: "Bomb armor now acts like other armor types." - - balance: "Devastation-level explosions on armorless people no longer destroys everything in their bags." diff --git a/html/changelogs/AutoChangeLog-pr-9903.yml b/html/changelogs/AutoChangeLog-pr-9903.yml deleted file mode 100644 index 0c21b30fd6..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9903.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "PersianXerxes" -delete-after: True -changes: - - rscdel: "Removed night vision quirk" diff --git a/html/changelogs/AutoChangeLog-pr-9925.yml b/html/changelogs/AutoChangeLog-pr-9925.yml deleted file mode 100644 index 6e2f44fc7b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9925.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Linzolle" -delete-after: True -changes: - - tweak: "cosmic coat crafting recipe changed to coat + cosmic bedsheet" diff --git a/html/changelogs/AutoChangeLog-pr-9940.yml b/html/changelogs/AutoChangeLog-pr-9940.yml deleted file mode 100644 index 75563c69b4..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9940.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Putnam" -delete-after: True -changes: - - tweak: "Dynamic rulesets have lower weight if a round recently featured them (except traitor)." diff --git a/html/changelogs/AutoChangeLog-pr-9950.yml b/html/changelogs/AutoChangeLog-pr-9950.yml deleted file mode 100644 index 6d328aa131..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9950.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "kevinz000" -delete-after: True -changes: - - balance: "Clockwork marauders are now on a configured summon cooldown if being summoned on station. They also rapidly bleed health while in or next to space. And they glow brighter." diff --git a/html/changelogs/AutoChangeLog-pr-9970.yml b/html/changelogs/AutoChangeLog-pr-9970.yml deleted file mode 100644 index ebeaa326e7..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9970.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Ghommie" -delete-after: True -changes: - - rscdel: "Removed literally atrocious polka dotted accessories. They were even more atrocious than the yellow horrible tie." diff --git a/html/changelogs/AutoChangeLog-pr-9971.yml b/html/changelogs/AutoChangeLog-pr-9971.yml deleted file mode 100644 index 951b9dfc81..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9971.yml +++ /dev/null @@ -1,8 +0,0 @@ -author: "Xantholne" -delete-after: True -changes: - - rscadd: "Santa Hats to Loadout and Clothesmate" - - rscadd: "Christmas Wintercoats to Loadout and Clothesmate" - - rscadd: "Christmas male and female uniforms to loadout and Clothesmate" - - rscadd: "Red, Green, and Traditional Santa boots to loadout and Clothesmate" - - rscadd: "Christmas Socks, Red candycane socks, Green candycane socks to sock selection" diff --git a/html/changelogs/AutoChangeLog-pr-9983.yml b/html/changelogs/AutoChangeLog-pr-9983.yml deleted file mode 100644 index b8cd4f0f5b..0000000000 --- a/html/changelogs/AutoChangeLog-pr-9983.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: "Ghommie, Skogol" -delete-after: True -changes: - - refactor: "refactored altclick interaction to allow alt-click interactable objects to parent call without forcing the turf contents stat menu open." - - tweak: "Alt clicking will no longer show turf contents for items inside bags etc." - - tweak: "Alt clicking the source of your turf contents stat menu will now close said menu." diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index e13ce10347..51e9453087 100644 Binary files a/icons/effects/effects.dmi and b/icons/effects/effects.dmi differ diff --git a/icons/mob/underwear.dmi b/icons/mob/underwear.dmi index bf0df371eb..e0789a1eeb 100644 Binary files a/icons/mob/underwear.dmi and b/icons/mob/underwear.dmi differ diff --git a/icons/mob/underwear_old.dmi b/icons/mob/underwear_old.dmi deleted file mode 100644 index 5e16a473ba..0000000000 Binary files a/icons/mob/underwear_old.dmi and /dev/null differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index c5981b06a3..fb2f4ab0d6 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/mob/uniform_digi.dmi b/icons/mob/uniform_digi.dmi index b4f3e6130b..e568d70310 100644 Binary files a/icons/mob/uniform_digi.dmi and b/icons/mob/uniform_digi.dmi differ diff --git a/icons/obj/bongs.dmi b/icons/obj/bongs.dmi new file mode 100644 index 0000000000..406cce3817 Binary files /dev/null and b/icons/obj/bongs.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index 5d243f93b8..2e53bb24db 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 60753839d2..2dcd8b9a06 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index f467da6fbf..73eb12fd6a 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/food/food.dmi b/icons/obj/food/food.dmi index 6b29d599cc..a719150f11 100644 Binary files a/icons/obj/food/food.dmi and b/icons/obj/food/food.dmi differ diff --git a/icons/obj/hydroponics/growing.dmi b/icons/obj/hydroponics/growing.dmi index 469b1e1aff..712ea11a3b 100644 Binary files a/icons/obj/hydroponics/growing.dmi and b/icons/obj/hydroponics/growing.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index a57719fb3a..e746d8f43d 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/hydroponics/seeds.dmi b/icons/obj/hydroponics/seeds.dmi index 8695d03b3c..43e231cbab 100644 Binary files a/icons/obj/hydroponics/seeds.dmi and b/icons/obj/hydroponics/seeds.dmi differ diff --git a/icons/obj/iv_drip.dmi b/icons/obj/iv_drip.dmi index f530688da7..ddd22dea89 100644 Binary files a/icons/obj/iv_drip.dmi and b/icons/obj/iv_drip.dmi differ diff --git a/icons/obj/janitor.dmi b/icons/obj/janitor.dmi index 4886cb8441..cb3870dc61 100644 Binary files a/icons/obj/janitor.dmi and b/icons/obj/janitor.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index 8ede8c66ab..8fee8fcf9f 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/modular_citadel/code/datums/status_effects/chems.dm b/modular_citadel/code/datums/status_effects/chems.dm index 5d9010a7bd..8adc7c0745 100644 --- a/modular_citadel/code/datums/status_effects/chems.dm +++ b/modular_citadel/code/datums/status_effects/chems.dm @@ -209,12 +209,12 @@ //Preamble -/mob/living/verb/toggle_lewd() +/mob/living/verb/toggle_hypno() set category = "IC" - set name = "Toggle Lewdchem" - set desc = "Allows you to toggle if you'd like lewd flavour messages." - client.prefs.lewdchem = !(client.prefs.lewdchem) - to_chat(usr, "You [(client.prefs.lewdchem?"will":"no longer")] receive lewdchem messages.") + set name = "Toggle Lewd MKUltra" + set desc = "Allows you to toggle if you'd like lewd flavour messages for MKUltra." + client.prefs.cit_toggles ^= HYPNO + to_chat(usr, "You [((client.prefs.cit_toggles & HYPNO) ?"will":"no longer")] receive lewd flavour messages for MKUltra.") /datum/status_effect/chem/enthrall id = "enthrall" @@ -252,6 +252,8 @@ var/customEcho //Custom looping text in owner var/customSpan //Custom spans for looping text + var/lewd = FALSE // Set on on_apply. Will only be true if both individuals involved have opted in. + /datum/status_effect/chem/enthrall/on_apply() var/mob/living/carbon/M = owner var/datum/reagent/fermi/enthrall/E = locate(/datum/reagent/fermi/enthrall) in M.reagents.reagent_list @@ -269,10 +271,11 @@ var/mob/living/carbon/human/H = owner if(H)//Prefs if(!H.canbearoused) - H.client?.prefs.lewdchem = FALSE - var/message = "[(owner.client?.prefs.lewdchem?"I am a good pet for [enthrallGender].":"[master] is a really inspirational person!")]" + H.client?.prefs.cit_toggles &= ~HYPNO + lewd = (owner.client?.prefs.cit_toggles & HYPNO) && (master.client?.prefs.cit_toggles & HYPNO) + var/message = "[(lewd ? "I am a good pet for [enthrallGender]." : "[master] is a really inspirational person!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "enthrall", /datum/mood_event/enthrall, message) - to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") + to_chat(owner, "You feel inexplicably drawn towards [master], their words having a demonstrable effect on you. It seems the closer you are to them, the stronger the effect is. However you aren't fully swayed yet and can resist their effects by repeatedly resisting as much as you can!") log_game("FERMICHEM: MKULTRA: Status applied on [owner] ckey: [owner.key] with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthrall attempts") return ..() @@ -318,7 +321,7 @@ resistanceTally /= 2 enthrallTally = 0 SSblackbox.record_feedback("tally", "fermi_chem", 1, "Enthralled to state 2") - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "Your conciousness slips, as you sink deeper into trance and servitude.") else to_chat(owner, "Your conciousness slips, as you feel more drawn to following [master].") @@ -327,11 +330,11 @@ phase = -1 to_chat(owner, "You break free of the influence in your mind, your thoughts suddenly turning lucid!") if(DistApart < 10) - to_chat(master, "[(master.client?.prefs.lewdchem?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!
    ") + to_chat(master, "[(lewd?"Your pet":"Your thrall")] seems to have broken free of your enthrallment!") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Thralls broken free") owner.remove_status_effect(src) //If resisted in phase 1, effect is removed. if(prob(10)) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "[pick("It feels so good to listen to [master].", "You can't keep your eyes off [master].", "[master]'s voice is making you feel so sleepy.", "You feel so comfortable with [master]", "[master] is so dominant, it feels right to obey them.")].") if (2) //partially enthralled if(enthrallTally > 200) @@ -339,12 +342,12 @@ mental_capacity -= resistanceTally//leftover resistance per step is taken away from mental_capacity. enthrallTally = 0 resistanceTally /= 2 - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "Your mind gives, eagerly obeying and serving [master].") to_chat(owner, "You are now fully enthralled to [master], and eager to follow their commands. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot serve your [enthrallGender] in death. ")//If people start using this as an excuse to be violent I'll just make them all pacifists so it's not OP. else to_chat(owner, "You are unable to put up a resistance any longer, and now are under the influence of [master]. However you find that in your intoxicated state you are unable to resort to violence. Equally you are unable to commit suicide, even if ordered to, as you cannot follow [master] in death. ") - to_chat(master, "Your [(master.client?.prefs.lewdchem?"pet":"follower")] [owner] appears to have fully fallen under your sway.") + to_chat(master, "Your [(lewd?"pet":"follower")] [owner] appears to have fully fallen under your sway.") log_game("FERMICHEM: MKULTRA: Status on [owner] ckey: [owner.key] has been fully entrhalled (state 3) with a master of [master] ckey: [enthrallID].") SSblackbox.record_feedback("tally", "fermi_chem", 1, "thralls fully enthralled.") else if (resistanceTally > 200) @@ -353,20 +356,18 @@ resistanceTally = 0 resistGrowth = 0 to_chat(owner, "You manage to shake some of the effects from your addled mind, however you can still feel yourself drawn towards [master].") - if(prob(10)) - if(owner.client?.prefs.lewdchem) - to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(lewd && prob(10)) + to_chat(owner, "[pick("It feels so good to listen to [enthrallGender].", "You can't keep your eyes off [enthrallGender].", "[enthrallGender]'s voice is making you feel so sleepy.", "You feel so comfortable with [enthrallGender]", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (3)//fully entranced if ((resistanceTally >= 200 && withdrawalTick >= 150) || (HAS_TRAIT(M, TRAIT_MINDSHIELD) && (resistanceTally >= 100))) enthrallTally = 0 phase -= 1 resistanceTally = 0 resistGrowth = 0 - to_chat(owner, "The separation from [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") + to_chat(owner, "The separation from [(lewd?"your [enthrallGender]":"[master]")] sparks a small flame of resistance in yourself, as your mind slowly starts to return to normal.") REMOVE_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") - if(prob(1)) - if(owner.client?.prefs.lewdchem && !customEcho) - to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") + if(lewd && prob(1) && !customEcho) + to_chat(owner, "[pick("I belong to [enthrallGender].", "[enthrallGender] knows whats best for me.", "Obedence is pleasure.", "I exist to serve [enthrallGender].", "[enthrallGender] is so dominant, it feels right to obey them.")].") if (4) //mindbroken if (mental_capacity >= 499 && (owner.getOrganLoss(ORGAN_SLOT_BRAIN) <=0 || HAS_TRAIT(M, TRAIT_MINDSHIELD)) && !owner.reagents.has_reagent("MKUltra")) phase = 2 @@ -382,7 +383,7 @@ cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(DistApart < 10) - if(master.client?.prefs.lewdchem) + if(lewd) to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") cooldownMsg = TRUE else @@ -390,7 +391,7 @@ cooldownMsg = TRUE if(get_dist(master, owner) > 10) if(prob(10)) - to_chat(owner, "You feel [(owner.client?.prefs.lewdchem?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") + to_chat(owner, "You feel [(lewd ?"a deep NEED to return to your [enthrallGender]":"like you have to return to [master]")].") M.throw_at(get_step_towards(master,owner), 5, 1) return//If you break the mind of someone, you can't use status effects on them. @@ -423,29 +424,29 @@ if (withdrawal == TRUE)//Your minions are really REALLY needy. switch(withdrawalTick)//denial if(5)//To reduce spam - to_chat(owner, "You are unable to complete [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") + to_chat(owner, "You are unable to complete [(lewd?"your [enthrallGender]":"[master]")]'s orders without their presence, and any commands and objectives given to you prior are not in effect until you are back with them.") ADD_TRAIT(owner, TRAIT_PACIFISM, "MKUltra") //IMPORTANT if(10 to 35)//Gives wiggle room, so you're not SUPER needy if(prob(5)) - to_chat(owner, "You're starting to miss [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") + to_chat(owner, "You're starting to miss [(lewd?"your [enthrallGender]":"[master]")].") if(prob(5)) owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.1) - to_chat(owner, "[(owner.client?.prefs.lewdchem?"[enthrallGender]":"[master]")] will surely be back soon") //denial + to_chat(owner, "[(lewd?"[enthrallGender]":"[master]")] will surely be back soon") //denial if(36) - var/message = "[(owner.client?.prefs.lewdchem?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" + var/message = "[(lewd?"I feel empty when [enthrallGender]'s not around..":"I miss [master]'s presence")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing1", /datum/mood_event/enthrallmissing1, message) if(37 to 65)//barganing if(prob(10)) to_chat(owner, "They are coming back, right...?") owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5) if(prob(10)) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "I just need to be a good pet for [enthrallGender], they'll surely return if I'm a good pet.") owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1.5) if(66) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing1") - var/message = "[(owner.client?.prefs.lewdchem?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" - to_chat(owner, "You start to feel really angry about how you're not with [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")]!") + var/message = "[(lewd?"I feel so lost in this complicated world without [enthrallGender]..":"I have to return to [master]!")]" + to_chat(owner, "You start to feel really angry about how you're not with [(lewd?"your [enthrallGender]":"[master]")]!") SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing2", /datum/mood_event/enthrallmissing2, message) owner.stuttering += 50 owner.jitteriness += 250 @@ -453,15 +454,15 @@ if(prob(10)) addtimer(CALLBACK(M, /mob/verb/a_intent_change, INTENT_HARM), 2) addtimer(CALLBACK(M, /mob/proc/click_random_mob), 2) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "You are overwhelmed with anger at the lack of [enthrallGender]'s presence and suddenly lash out!") else to_chat(owner, "You are overwhelmed with anger and suddenly lash out!") if(90) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing2") - var/message = "[(owner.client?.prefs.lewdchem?"Where are you [enthrallGender]??!":"I need to find [master]!")]" + var/message = "[(lewd?"Where are you [enthrallGender]??!":"I need to find [master]!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing3", /datum/mood_event/enthrallmissing3, message) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "You need to find your [enthrallGender] at all costs, you can't hold yourself back anymore!") else to_chat(owner, "You need to find [master] at all costs, you can't hold yourself back anymore!") @@ -474,15 +475,15 @@ M.hallucination += 10 if(101) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "EnthMissing3") - var/message = "[(owner.client?.prefs.lewdchem?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" + var/message = "[(lewd?"I'm all alone, It's so hard to continute without [enthrallGender]...":"I really need to find [master]!!!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "EnthMissing4", /datum/mood_event/enthrallmissing4, message) - to_chat(owner, "You can hardly find the strength to continue without [(owner.client?.prefs.lewdchem?"your [enthrallGender]":"[master]")].") + to_chat(owner, "You can hardly find the strength to continue without [(lewd?"your [enthrallGender]":"[master]")].") M.gain_trauma_type(BRAIN_TRAUMA_SEVERE) if(102 to 140) //depression 2, revengeance if(prob(20)) owner.Stun(50) owner.emote("cry")//does this exist? - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "You're unable to hold back your tears, suddenly sobbing as the desire to see your [enthrallGender] oncemore overwhelms you.") else to_chat(owner, "You are overwheled with withdrawl from [master].") @@ -504,7 +505,7 @@ deltaResist += 5 owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) if(prob(20)) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "Maybe you'll be okay without your [enthrallGender].") else to_chat(owner, "You feel your mental functions slowly begin to return.") @@ -537,7 +538,7 @@ else if(status == "charge") owner.add_movespeed_modifier(MOVESPEED_ID_MKULTRA, update=TRUE, priority=100, multiplicative_slowdown=-2, blacklisted_movetypes=(FLYING|FLOATING)) status = "charged" - if(master.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "Your [enthrallGender]'s order fills you with a burst of speed!") else to_chat(owner, "[master]'s command fills you with a burst of speed!") @@ -560,7 +561,7 @@ //adrenals? //customEcho - if(customEcho && withdrawal == FALSE && owner.client?.prefs.lewdchem) + if(customEcho && withdrawal == FALSE && lewd) if(prob(2)) if(!customSpan) //just in case! customSpan = "notice" @@ -576,7 +577,7 @@ cooldownMsg = FALSE else if (cooldownMsg == FALSE) if(DistApart < 10) - if(master.client?.prefs.lewdchem) + if(lewd) to_chat(master, "Your pet [owner] appears to have finished internalising your last command.") else to_chat(master, "Your thrall [owner] appears to have finished internalising your last command.") @@ -609,7 +610,7 @@ /datum/status_effect/chem/enthrall/proc/owner_hear(datum/source, list/hearing_args) - if(owner.client?.prefs.lewdchem == FALSE) + if(lewd == FALSE) return if (cTriggered > 0) return @@ -638,7 +639,7 @@ //Shocking truth! else if (lowertext(customTriggers[trigger]) == "shock") - if (C.canbearoused && C.client?.prefs.lewdchem) + if (C.canbearoused && lewd) C.adjustArousalLoss(5) C.jitteriness += 100 C.stuttering += 25 @@ -648,7 +649,7 @@ //wah intensifies wah-rks else if (lowertext(customTriggers[trigger]) == "cum")//aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - if (HAS_TRAIT(C, TRAIT_NYMPHO) && C.client?.prefs.lewdchem) + if (HAS_TRAIT(C, TRAIT_NYMPHO) && lewd) if (C.getArousalLoss() > 80) C.mob_climax(forced_climax=TRUE) C.SetStun(10)//We got your stun effects in somewhere, Kev. @@ -689,20 +690,20 @@ if (status == "Sleeper" || phase == 0) return else if (phase == 4) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "Your mind is too far gone to even entertain the thought of resisting. Unless you can fix the brain damage, you won't be able to break free of your [enthrallGender]'s control.") else to_chat(owner, "Your brain is too overwhelmed with from the high volume of chemicals in your system, rendering you unable to resist, unless you can fix the brain damage.") return else if (phase == 3 && withdrawal == FALSE) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "The presence of your [enthrallGender] fully captures the horizon of your mind, removing any thoughts of resistance. If you get split up from them, then you might be able to entertain the idea of resisting.") else to_chat(owner, "You are unable to resist [master] in your current state. If you get split up from them, then you might be able to resist.") return else if (status == "Antiresist")//If ordered to not resist; resisting while ordered to not makes it last longer, and increases the rate in which you are enthralled. if (statusStrength > 0) - if(owner.client?.prefs.lewdchem) + if(lewd) to_chat(owner, "The order from your [enthrallGender] to give in is conflicting with your attempt to resist, drawing you deeper into trance! You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") else to_chat(owner, "The order from your [master] to give in is conflicting with your attempt to resist. You'll have to wait a bit before attemping again, lest your attempts become frustrated again.") @@ -742,7 +743,7 @@ deltaResist *= 1.25 if (owner.reagents.has_reagent("neurine")) deltaResist *= 1.5 - if (!HAS_TRAIT(owner, TRAIT_CROCRIN_IMMUNE) && M.canbearoused && owner.client?.prefs.lewdchem) + if (!(owner.client?.prefs.cit_toggles & NO_APHRO) && M.canbearoused && lewd) if (owner.reagents.has_reagent("anaphro")) deltaResist *= 1.5 if (owner.reagents.has_reagent("anaphro+")) diff --git a/modular_citadel/code/game/machinery/vending.dm b/modular_citadel/code/game/machinery/vending.dm index 53fe6a8f56..e75ba17801 100755 --- a/modular_citadel/code/game/machinery/vending.dm +++ b/modular_citadel/code/game/machinery/vending.dm @@ -52,6 +52,7 @@ /obj/item/clothing/mask/muzzle = 4, /obj/item/clothing/under/stripper_pink = 3, /obj/item/clothing/under/stripper_green = 3, + /obj/item/clothing/under/corset = 3, /obj/item/clothing/under/gear_harness = 10, /obj/item/dildo/custom = 5, /obj/item/electropack/shockcollar = 3, @@ -71,7 +72,8 @@ ) premium = list( /obj/item/clothing/accessory/skullcodpiece/fake = 3, - /obj/item/reagent_containers/glass/bottle/hexacrocin = 10 + /obj/item/reagent_containers/glass/bottle/hexacrocin = 10, + /obj/item/clothing/under/pants/chaps = 5 ) refill_canister = /obj/item/vending_refill/kink diff --git a/modular_citadel/code/modules/client/client_procs.dm b/modular_citadel/code/modules/client/client_procs.dm index 3b91deb6e5..f20dd08a51 100644 --- a/modular_citadel/code/modules/client/client_procs.dm +++ b/modular_citadel/code/modules/client/client_procs.dm @@ -19,6 +19,12 @@ mentor_follow(M) return TRUE + if(href_list["mentor_unfollow"]) + var/mob/living/M = locate(href_list["mentor_follow"]) + if(M && mentor_datum.following == M) + mentor_unfollow() + return TRUE + /client/proc/mentor_datum_set(admin) mentor_datum = GLOB.mentor_datums[ckey] if(!mentor_datum && check_rights_for(src, R_ADMIN,0)) // admin with no mentor datum?let's fix that diff --git a/modular_citadel/code/modules/client/loadout/uniform.dm b/modular_citadel/code/modules/client/loadout/uniform.dm index 72709069eb..64ed0d363d 100644 --- a/modular_citadel/code/modules/client/loadout/uniform.dm +++ b/modular_citadel/code/modules/client/loadout/uniform.dm @@ -103,6 +103,45 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/stripeddress +/datum/gear/sundresswhite + name = "White Sundress" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/sundresswhite + +/datum/gear/sundress + name = "Sundress" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/sundress + +/datum/gear/greendress + name = "Green Dress" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/greendress + +/datum/gear/pinkdress + name = "Pink Dress" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pinkdress +/datum/gear/flowerdress + name = "Flower Dress" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/flowerdress + +/datum/gear/sweptskirt + name = "Swept skirt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/sweptskirt + +/datum/gear/croptop + name = "Croptop" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/croptop + +/datum/gear/yoga + name = "Yoga Pants" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pants/yoga + /datum/gear/kilt name = "Kilt" category = SLOT_W_UNIFORM @@ -116,7 +155,7 @@ /datum/gear/athleticshorts name = "Athletic Shorts" category = SLOT_W_UNIFORM - path = /obj/item/clothing/under/shorts + path = /obj/item/clothing/under/shorts/red /datum/gear/bjeans name = "Black Jeans" @@ -153,6 +192,26 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/pants/track +/datum/gear/rippedjeans + name = "Ripped Jeans" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pants/jeanripped + +/datum/gear/jeanshort + name = "Jean Shorts" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pants/jeanshort + +/datum/gear/denimskirt + name = "Denim Skirt" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pants/denimskirt + +/datum/gear/yoga + name = "Yoga Pants" + category = SLOT_W_UNIFORM + path = /obj/item/clothing/under/pants/yoga + // Pantsless Sweaters /datum/gear/turtleneck @@ -362,4 +421,4 @@ category = SLOT_W_UNIFORM path = /obj/item/clothing/under/stripper_green cost = 3 - + diff --git a/modular_citadel/code/modules/client/preferences.dm b/modular_citadel/code/modules/client/preferences.dm index 29f8a113e8..eef8664fbb 100644 --- a/modular_citadel/code/modules/client/preferences.dm +++ b/modular_citadel/code/modules/client/preferences.dm @@ -15,7 +15,7 @@ var/arousable = TRUE var/widescreenpref = TRUE var/autostand = TRUE - var/lewdchem = FALSE + var/auto_ooc = FALSE //vore prefs var/toggleeatingnoise = TRUE @@ -54,6 +54,5 @@ datum/preferences/copy_to(mob/living/carbon/human/character, icon_updates = 1) character.give_genitals(TRUE) character.flavor_text = features["flavor_text"] //Let's update their flavor_text at least initially character.canbearoused = arousable - character.client?.prefs.lewdchem = lewdchem if(icon_updates) character.update_genitals() diff --git a/modular_citadel/code/modules/mentor/follow.dm b/modular_citadel/code/modules/mentor/follow.dm index 6695155ad0..5da3ce4726 100644 --- a/modular_citadel/code/modules/mentor/follow.dm +++ b/modular_citadel/code/modules/mentor/follow.dm @@ -1,16 +1,18 @@ /client/proc/mentor_follow(mob/living/M) if(!is_mentor()) return - if(isnull(M)) - return - if(!ismob(usr)) - return - mentor_datum.following = M - usr.reset_perspective(M) - verbs += /client/proc/mentor_unfollow - to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is now following [key_name(M)]") - to_chat(usr, "Click the \"Stop Following\" button in the Mentor tab to stop following [key_name(M)].") - log_mentor("[key_name(usr)] began following [key_name(M)]") + var/orbiting = TRUE + if(!isobserver(usr)) + mentor_datum.following = M + usr.reset_perspective(M) + verbs += /client/proc/mentor_unfollow + to_chat(usr, "Click the \"Stop Following\" button here or in the Mentor tab to stop following [key_name(M)].") + orbiting = FALSE + else + var/mob/dead/observer/O = usr + O.ManualFollow(M) + to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is now [orbiting ? "orbiting" : "following"] [key_name(M)][key_name(M)][orbiting ? " as a ghost" : ""].") + log_mentor("[key_name(usr)] [orbiting ? "is now orbiting" : "began following"][key_name(M)][orbiting ? " as a ghost" : ""].") /client/proc/mentor_unfollow() set category = "Mentor" @@ -21,6 +23,6 @@ return usr.reset_perspective() verbs -= /client/proc/mentor_unfollow - to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is no longer following [key_name(mentor_datum.following)]") - log_mentor("[key_name(usr)] stopped following [key_name(mentor_datum.following)]") + to_chat(GLOB.admins, "MENTOR: [key_name(usr)] is no longer following [key_name(mentor_datum.following)].") + log_mentor("[key_name(usr)] stopped following [key_name(mentor_datum.following)].") mentor_datum.following = null \ No newline at end of file diff --git a/modular_citadel/code/modules/mentor/mentorhelp.dm b/modular_citadel/code/modules/mentor/mentorhelp.dm index 87b05a3f26..eb2b8546da 100644 --- a/modular_citadel/code/modules/mentor/mentorhelp.dm +++ b/modular_citadel/code/modules/mentor/mentorhelp.dm @@ -19,7 +19,7 @@ log_mentor("MENTORHELP: [key_name_mentor(src, 0, 0, 0, 0)]: [msg]") for(var/client/X in GLOB.mentors | GLOB.admins) - X << 'sound/items/bikehorn.ogg' + SEND_SOUND(X, 'sound/items/bikehorn.ogg') to_chat(X, mentor_msg) to_chat(src, "PM to-Mentors: [msg]") diff --git a/modular_citadel/code/modules/mob/cit_emotes.dm b/modular_citadel/code/modules/mob/cit_emotes.dm index 7e7a77538a..d0ad0d3232 100644 --- a/modular_citadel/code/modules/mob/cit_emotes.dm +++ b/modular_citadel/code/modules/mob/cit_emotes.dm @@ -70,113 +70,124 @@ message = "makes a very loud noise." . = ..() -/datum/emote/sound/carbon/snap - key = "snap" - key_third_person = "snaps" - muzzle_ignore = TRUE - restraint_check = TRUE - emote_type = EMOTE_AUDIBLE - sound = 'sound/effects/snap01.ogg' - mob_type_allowed_typecache = list(/mob/living/carbon/) - - /datum/emote/living/snap key = "snap" key_third_person = "snaps" message = "snaps their fingers." emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + restraint_check = TRUE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/snap/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/snap.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/snap.ogg', 50, 1, -1) /datum/emote/living/snap2 key = "snap2" key_third_person = "snaps twice" message = "snaps twice." emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + restraint_check = TRUE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/snap2/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/snap2.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/snap2.ogg', 50, 1, -1) /datum/emote/living/snap3 key = "snap3" key_third_person = "snaps thrice" message = "snaps thrice." emote_type = EMOTE_AUDIBLE + muzzle_ignore = TRUE + restraint_check = TRUE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/snap3/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/snap3.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/snap3.ogg', 50, 1, -1) /datum/emote/living/awoo key = "awoo" key_third_person = "lets out an awoo" message = "lets out an awoo!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/awoo/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/awoo.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/awoo.ogg', 50, 1, -1) /datum/emote/living/nya key = "nya" key_third_person = "lets out a nya" message = "lets out a nya!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/nya/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/nya.ogg', 50, 1, -1) /datum/emote/living/weh key = "weh" key_third_person = "lets out a weh" message = "lets out a weh!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/weh/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/weh.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/weh.ogg', 50, 1, -1) /datum/emote/living/peep key = "peep" key_third_person = "peeps like a bird" message = "peeps like a bird!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/peep/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/peep.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/peep.ogg', 50, 1, -1) /datum/emote/living/dab key = "dab" @@ -190,41 +201,49 @@ key_third_person = "lets out a tiny squeak" message = "lets out a tiny squeak!" emote_type = EMOTE_AUDIBLE - mob_type_allowed_typecache = list(/mob/living/carbon) + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/mothsqueak/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/mothsqueak.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/mothsqueak.ogg', 50, 1, -1) /datum/emote/living/merp key = "merp" key_third_person = "merps" message = "merps!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/merp/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - playsound(user, 'modular_citadel/sound/voice/merp.ogg', 50, 1, -1) - . = ..() + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + playsound(user, 'modular_citadel/sound/voice/merp.ogg', 50, 1, -1) /datum/emote/living/bark key = "bark" key_third_person = "barks" message = "barks!" emote_type = EMOTE_AUDIBLE + muzzle_ignore = FALSE + restraint_check = FALSE + mob_type_allowed_typecache = list(/mob/living/carbon, /mob/living/silicon/pai) /datum/emote/living/bark/run_emote(mob/living/user, params) - if(ishuman(user)) - if(user.nextsoundemote >= world.time) - return - user.nextsoundemote = world.time + 7 - var/sound = pick('modular_citadel/sound/voice/bark1.ogg', 'modular_citadel/sound/voice/bark2.ogg') - playsound(user, sound, 50, 1, -1) - . = ..() \ No newline at end of file + if(!(. = ..())) + return + if(user.nextsoundemote >= world.time) + return + user.nextsoundemote = world.time + 7 + var/sound = pick('modular_citadel/sound/voice/bark1.ogg', 'modular_citadel/sound/voice/bark2.ogg') + playsound(user, sound, 50, 1, -1) diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm index a1466f58d4..98de5eed14 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/dogborg_equipment.dm @@ -424,12 +424,7 @@ SLEEPER CODE IS IN game/objects/items/devices/dogborg_sleeper.dm ! if(A) if(isliving(A)) var/mob/living/L = A - var/blocked = 0 - if(ishuman(A)) - var/mob/living/carbon/human/H = A - if(H.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) - blocked = 1 - if(!blocked) + if(!L.check_shields(0, "the [name]", src, attack_type = LEAP_ATTACK)) L.visible_message("[src] pounces on [L]!", "[src] pounces on you!") L.Knockdown(iscarbon(L) ? 60 : 45, override_stamdmg = CLAMP(pounce_stamloss, 0, pounce_stamloss_cap-L.getStaminaLoss())) // Temporary. If someone could rework how dogborg pounces work to accomodate for combat changes, that'd be nice. playsound(src, 'sound/weapons/Egloves.ogg', 50, 1) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm index 35d13b3aa6..65c652434b 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/MKUltra.dm @@ -170,6 +170,9 @@ Creating a chem with a low purity will make you permanently fall in love with so /datum/reagent/fermi/enthrall/on_mob_add(mob/living/carbon/M) . = ..() + if(M.client?.prefs.cit_toggles & NEVER_HYPNO) // Just in case people are opting out of this + holder.remove_reagent(id, 10000000) + return if(!ishuman(M))//Just to make sure screwy stuff doesn't happen. return if(!creatorID) @@ -183,7 +186,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.enthrallID = creatorID E.enthrallGender = creatorGender E.master = get_mob_by_key(creatorID) - to_chat(M, to_chat(M, "Your aldled, plastic, mind bends under the chemical influence of a new [(M.client?.prefs.lewdchem?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.")) //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. + to_chat(M, "Your addled, plastic, mind bends under the chemical influence of a new [(E.lewd?"master":"leader")]. Your highest priority is now to stay by [creatorName]'s side, following and aiding them at all costs.") //THIS SHOULD ONLY EVER APPEAR IF YOU MINDBREAK YOURSELF AND THEN GET INJECTED FROM SOMEONE ELSE. log_game("FERMICHEM: Narcissist [M] ckey: [M.key] been rebound to [creatorName], ID: [creatorID]") return if((M.ckey == creatorID) && (creatorName == M.real_name)) //same name AND same player - same instance of the player. (should work for clones?) @@ -194,7 +197,7 @@ Creating a chem with a low purity will make you permanently fall in love with so Vc.Remove(M) nVc.Insert(M) qdel(Vc) - to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.)]") + to_chat(M, "You feel your vocal chords tingle you speak in a more charasmatic and sultry tone.") else log_game("FERMICHEM: MKUltra: [creatorName], [creatorID], is enthralling [M.name], [M.ckey]") M.apply_status_effect(/datum/status_effect/chem/enthrall) @@ -230,7 +233,6 @@ Creating a chem with a low purity will make you permanently fall in love with so M.reagents.remove_reagent(id, volume) FallInLove(C, M) return - if (M.ckey == creatorID && creatorName == M.real_name)//If you yourself drink it, it supresses the vocal effects, for stealth. NEVERMIND ADD THIS LATER I CAN'T GET IT TO WORK return if(!M.client) @@ -261,7 +263,7 @@ Creating a chem with a low purity will make you permanently fall in love with so E.master = creator else E = M.has_status_effect(/datum/status_effect/chem/enthrall) - if(M.client?.prefs.lewdchem) + if(E.lewd) to_chat(M, "Your mind shatters under the volume of the mild altering chem inside of you, breaking all will and thought completely. Instead the only force driving you now is the instinctual desire to obey and follow [creatorName]. Your highest priority is now to stay by their side and protect them at all costs.") else to_chat(M, "The might volume of chemicals in your system overwhelms your mind, and you suddenly agree with what [creatorName] has been saying. Your highest priority is now to stay by their side and protect them at all costs.") @@ -288,6 +290,7 @@ Creating a chem with a low purity will make you permanently fall in love with so chemical_flags = REAGENT_DONOTSPLIT can_synth = FALSE var/mob/living/carbon/love + var/lewd = FALSE /datum/reagent/fermi/enthrallExplo/on_mob_life(mob/living/carbon/M)//Love gas, only affects while it's in your system,Gives a positive moodlet if close, gives brain damagea and a negative moodlet if not close enough. if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) @@ -303,24 +306,25 @@ Creating a chem with a low purity will make you permanently fall in love with so if(!love) return M.apply_status_effect(STATUS_EFFECT_INLOVE, love) - to_chat(M, "[(M.client?.prefs.lewdchem?"":"")][(M.client?.prefs.lewdchem?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") + lewd = (M.client?.prefs.cit_toggles & HYPNO) && (love.client?.prefs.cit_toggles & HYPNO) + to_chat(M, "[(lewd?"":"")][(lewd?"You develop a sudden crush on [love], your heart beginning to race as you look upon them with new eyes.":"You suddenly feel like making friends with [love].")] You feel strangely drawn towards them.") log_game("FERMICHEM: [M] ckey: [M.key] has temporarily bonded with [love] ckey: [love.key]") SSblackbox.record_feedback("tally", "fermi_chem", 1, "Times people have bonded") else if(get_dist(M, love) < 8) if(HAS_TRAIT(M, TRAIT_NYMPHO)) //Add this back when merged/updated. M.adjustArousalLoss(5) - var/message = "[(M.client?.prefs.lewdchem?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]" + var/message = "[(lewd?"I'm next to my crush..! Eee!":"I'm making friends with [love]!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "InLove", /datum/mood_event/InLove, message) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") else - var/message = "[(M.client?.prefs.lewdchem?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]" + var/message = "[(lewd?"I can't keep my crush off my mind, I need to see them again!":"I really want to make friends with [love]!")]" SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "MissingLove", /datum/mood_event/MissingLove, message) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") if(prob(5)) M.Stun(10) M.emote("whimper")//does this exist? - to_chat(M, "[(M.client?.prefs.lewdchem?"":"")] You're overcome with a desire to see [love].") + to_chat(M, "[(lewd?"":"")] You're overcome with a desire to see [love].") M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 0.5)//I found out why everyone was so damaged! ..() @@ -330,7 +334,7 @@ Creating a chem with a low purity will make you permanently fall in love with so M.remove_status_effect(STATUS_EFFECT_INLOVE) SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "InLove") SEND_SIGNAL(M, COMSIG_CLEAR_MOOD_EVENT, "MissingLove") - to_chat(M, "[(M.client?.prefs.lewdchem?"":"")]Your feelings for [love] suddenly vanish!") + to_chat(M, "[(lewd?"":"")]Your feelings for [love] suddenly vanish!") log_game("FERMICHEM: [M] ckey: [M.key] is no longer in temp bond") ..() @@ -338,7 +342,8 @@ Creating a chem with a low purity will make you permanently fall in love with so if(Lover.has_status_effect(STATUS_EFFECT_INLOVE)) to_chat(Lover, "You are already fully devoted to someone else!") return - to_chat(Lover, "[(Lover.client?.prefs.lewdchem?"":"")]You develop a deep and sudden bond with [Love][(Lover.client?.prefs.lewdchem?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") + var/lewd = (Lover.client?.prefs.cit_toggles & HYPNO) && (Love.client?.prefs.cit_toggles & HYPNO) + to_chat(Lover, "[(lewd?"":"")]You develop a deep and sudden bond with [Love][(lewd?", your heart beginning to race as your mind filles with thoughts about them.":".")] You are determined to keep them safe and happy, and feel drawn towards them.") if(Lover.mind) Lover.mind.store_memory("You are in love with [Love].") Lover.faction |= "[REF(Love)]" diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm index d7ff42a9eb..7e094eddda 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/astrogen.dm @@ -54,7 +54,7 @@ I'd like to point out from my calculations it'll take about 60-80 minutes to die /datum/reagent/fermi/astral/reaction_turf(turf/T, reac_volume) if(isplatingturf(T) || istype(T, /turf/open/floor/plasteel)) var/turf/open/floor/F = T - F.PlaceOnTop(/turf/open/floor/fakespace) + F.PlaceOnTop(/turf/open/floor/fakespace, flags = CHANGETURF_INHERIT_AIR) ..() /datum/reagent/fermi/astral/reaction_obj(obj/O, reac_volume) diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm index 7d358b4149..6732fb06a5 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/enlargement.dm @@ -56,8 +56,8 @@ var/mob/living/carbon/human/H = M var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) - //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused) + //If they've opted out, then route processing though liver. + if(!(H.client?.prefs.cit_toggles & BREAST_ENLARGEMENT)) var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) if(L) L.swelling += 0.05 @@ -94,9 +94,7 @@ return ..() /datum/reagent/fermi/breast_enlarger/overdose_process(mob/living/carbon/M) //Turns you into a female if male and ODing, doesn't touch nonbinary and object genders. - - //Acute hepatic pharmacokinesis. - if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused) + if(!(M.client?.prefs.cit_toggles & FORCED_FEM)) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) L.swelling+= 0.05 return ..() @@ -133,15 +131,10 @@ /datum/reagent/fermi/BEsmaller/on_mob_life(mob/living/carbon/M) var/obj/item/organ/genital/breasts/B = M.getorganslot(ORGAN_SLOT_BREASTS) - if(!B) - //Acute hepatic pharmacokinesis. - if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling-= 0.05 - return ..() - - //otherwise proceed as normal - return..() + if(!(M.client?.prefs.cit_toggles & BREAST_ENLARGEMENT) || !B) + var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) + L.swelling-= 0.05 + return ..() B.modify_size(-0.05) return ..() @@ -221,8 +214,7 @@ return ..() var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - //If they have Acute hepatic pharmacokinesis, then route processing though liver. - if(HAS_TRAIT(H, TRAIT_PHARMA) || !H.canbearoused) + if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT)) var/obj/item/organ/liver/L = H.getorganslot(ORGAN_SLOT_LIVER) if(L) L.swelling += 0.05 @@ -252,8 +244,7 @@ /datum/reagent/fermi/penis_enlarger/overdose_process(mob/living/carbon/human/M) //Turns you into a male if female and ODing, doesn't touch nonbinary and object genders. if(!istype(M)) return ..() - //Acute hepatic pharmacokinesis. - if(HAS_TRAIT(M, TRAIT_PHARMA) || !M.canbearoused) + if(!(M.client?.prefs.cit_toggles & FORCED_MASC)) var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) L.swelling+= 0.05 return..() @@ -292,11 +283,9 @@ return ..() var/mob/living/carbon/human/H = M var/obj/item/organ/genital/penis/P = H.getorganslot(ORGAN_SLOT_PENIS) - if(!P) - //Acute hepatic pharmacokinesis. - if(HAS_TRAIT(M, TRAIT_PHARMA)) - var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) - L.swelling-= 0.05 + if(!(H.client?.prefs.cit_toggles & PENIS_ENLARGEMENT) || !P) + var/obj/item/organ/liver/L = M.getorganslot(ORGAN_SLOT_LIVER) + L.swelling-= 0.05 return..() P.modify_size(-0.1) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index fcde3a8b79..5ea1fc77be 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -105,7 +105,7 @@ name = "Eigenstasium" id = "eigenstate" results = list("eigenstate" = 1) - required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "sugar" = 1) + required_reagents = list("bluespace" = 1, "stable_plasma" = 1, "caramel" = 1) mix_message = "the reaction zaps suddenly!" //FermiChem vars: OptimalTempMin = 350 // Lower area of bell curve for determining heat based rate reactions @@ -504,7 +504,7 @@ name = "secretcatchem" id = "secretcatchem" results = list("secretcatchem" = 5) - required_reagents = list("stable_plasma" = 1, "sugar" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too. + required_reagents = list("stable_plasma" = 1, "caramel" = 1, "cream" = 1, "clonexadone" = 1)//Yes this will make a kitty if you don't lucky guess. It'll eat all your reagents too. required_catalysts = list("SDGF" = 1) required_temp = 500 mix_message = "the reaction gives off a meow!" diff --git a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm index aa4c65c3bb..f6b70eb7b6 100644 --- a/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm +++ b/modular_citadel/code/modules/reagents/reagents/cit_reagents.dm @@ -100,7 +100,7 @@ color = "#FFADFF"//PINK, rgb(255, 173, 255) /datum/reagent/drug/aphrodisiac/on_mob_life(mob/living/M) - if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE)) + if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO)) if(prob(33)) M.adjustArousalLoss(2) if(prob(5)) @@ -122,7 +122,7 @@ overdose_threshold = 20 /datum/reagent/drug/aphrodisiacplus/on_mob_life(mob/living/M) - if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE)) + if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO)) if(prob(33)) M.adjustArousalLoss(6)//not quite six times as powerful, but still considerably more powerful. if(prob(5)) @@ -154,7 +154,7 @@ ..() /datum/reagent/drug/aphrodisiacplus/overdose_process(mob/living/M) - if(M && M.canbearoused && !HAS_TRAIT(M, TRAIT_CROCRIN_IMMUNE) && prob(33)) + if(M && M.canbearoused && !(M.client?.prefs.cit_toggles & NO_APHRO) && prob(33)) if(prob(5) && M.getArousalLoss() >= 100 && ishuman(M) && M.has_dna()) if(prob(5)) //Less spam to_chat(M, "Your libido is going haywire!") diff --git a/sound/effects/bonghit.ogg b/sound/effects/bonghit.ogg new file mode 100644 index 0000000000..45a0dec1b6 Binary files /dev/null and b/sound/effects/bonghit.ogg differ diff --git a/sound/weapons/klonk.ogg b/sound/weapons/klonk.ogg new file mode 100644 index 0000000000..471f3ad8b7 Binary files /dev/null and b/sound/weapons/klonk.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 5526e5eaf0..33a4251dd7 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -43,6 +43,7 @@ #include "code\__DEFINES\diseases.dm" #include "code\__DEFINES\DNA.dm" #include "code\__DEFINES\donator_groupings.dm" +#include "code\__DEFINES\dynamic.dm" #include "code\__DEFINES\events.dm" #include "code\__DEFINES\exports.dm" #include "code\__DEFINES\fantasy_affixes.dm" @@ -108,6 +109,7 @@ #include "code\__DEFINES\typeids.dm" #include "code\__DEFINES\vehicles.dm" #include "code\__DEFINES\voreconstants.dm" +#include "code\__DEFINES\vote.dm" #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" #include "code\__DEFINES\wires.dm" @@ -118,6 +120,7 @@ #include "code\__HELPERS\areas.dm" #include "code\__HELPERS\AStar.dm" #include "code\__HELPERS\cmp.dm" +#include "code\__HELPERS\custom_holoforms.dm" #include "code\__HELPERS\dates.dm" #include "code\__HELPERS\donator_groupings.dm" #include "code\__HELPERS\files.dm" @@ -467,6 +470,7 @@ #include "code\datums\elements\_element.dm" #include "code\datums\elements\cleaning.dm" #include "code\datums\elements\earhealing.dm" +#include "code\datums\elements\ghost_role_eligibility.dm" #include "code\datums\helper_datums\events.dm" #include "code\datums\helper_datums\getrev.dm" #include "code\datums\helper_datums\icon_snapshot.dm" @@ -579,6 +583,7 @@ #include "code\game\gamemodes\dynamic\dynamic_rulesets_latejoin.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_midround.dm" #include "code\game\gamemodes\dynamic\dynamic_rulesets_roundstart.dm" +#include "code\game\gamemodes\dynamic\dynamic_storytellers.dm" #include "code\game\gamemodes\extended\extended.dm" #include "code\game\gamemodes\gangs\dominator.dm" #include "code\game\gamemodes\gangs\dominator_countdown.dm" @@ -882,6 +887,7 @@ #include "code\game\objects\items\taster.dm" #include "code\game\objects\items\teleportation.dm" #include "code\game\objects\items\teleprod.dm" +#include "code\game\objects\items\telescopic_iv.dm" #include "code\game\objects\items\theft_tools.dm" #include "code\game\objects\items\toys.dm" #include "code\game\objects\items\trash.dm" @@ -1598,6 +1604,7 @@ #include "code\modules\clothing\clothing.dm" #include "code\modules\clothing\ears\_ears.dm" #include "code\modules\clothing\glasses\_glasses.dm" +#include "code\modules\clothing\glasses\disablerglasses.dm" #include "code\modules\clothing\glasses\engine_goggles.dm" #include "code\modules\clothing\glasses\hud.dm" #include "code\modules\clothing\glasses\phantomthief.dm" @@ -2106,6 +2113,7 @@ #include "code\modules\mob\living\say.dm" #include "code\modules\mob\living\status_procs.dm" #include "code\modules\mob\living\taste.dm" +#include "code\modules\mob\living\update_icons.dm" #include "code\modules\mob\living\ventcrawling.dm" #include "code\modules\mob\living\brain\brain.dm" #include "code\modules\mob\living\brain\brain_item.dm" @@ -2212,6 +2220,7 @@ #include "code\modules\mob\living\carbon\monkey\monkey_defense.dm" #include "code\modules\mob\living\carbon\monkey\punpun.dm" #include "code\modules\mob\living\carbon\monkey\update_icons.dm" +#include "code\modules\mob\living\silicon\custom_holoform.dm" #include "code\modules\mob\living\silicon\damage_procs.dm" #include "code\modules\mob\living\silicon\death.dm" #include "code\modules\mob\living\silicon\examine.dm" @@ -2243,6 +2252,7 @@ #include "code\modules\mob\living\silicon\pai\personality.dm" #include "code\modules\mob\living\silicon\pai\say.dm" #include "code\modules\mob\living\silicon\pai\software.dm" +#include "code\modules\mob\living\silicon\pai\update_icon.dm" #include "code\modules\mob\living\silicon\robot\death.dm" #include "code\modules\mob\living\silicon\robot\emote.dm" #include "code\modules\mob\living\silicon\robot\examine.dm"