diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000000..3eee43dc71 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +patreon: citadelstation diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml index 9dafbb0d6b..f36055dab0 100644 --- a/.github/workflows/ci_suite.yml +++ b/.github/workflows/ci_suite.yml @@ -88,18 +88,21 @@ jobs: mysql -u root -proot tg_ci < SQL/tgstation_schema.sql mysql -u root -proot -e 'CREATE DATABASE tg_ci_prefixed;' mysql -u root -proot tg_ci_prefixed < SQL/tgstation_schema_prefixed.sql - - name: Install rust-g + - name: Install rust dependencies run: | sudo dpkg --add-architecture i386 sudo apt update || true sudo apt install -o APT::Immediate-Configure=false libssl1.1:i386 bash tools/ci/install_rust_g.sh + - name: Install auxmos + run: | + bash tools/ci/install_auxmos.sh - name: Compile and run tests run: | bash tools/ci/install_byond.sh source $HOME/BYOND/byond/bin/byondsetup - tools/build/build - # bash tools/ci/run_server.sh + tools/build/build -DCIBUILDING + bash tools/ci/run_server.sh env: CBT_BUILD_MODE: TEST_RUN diff --git a/.gitignore b/.gitignore index dd20fecd22..91a0ef08eb 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,10 @@ #Ignore byond config folder. /cfg/**/* +#Ignore rust-g and auxmos libraries which are compiled with scripts +*.so +/tools/build/binaries/**/* + #Ignore compiled files and other files generated during compilation. *.mdme *.dmb diff --git a/Build.sh b/Build.sh new file mode 100755 index 0000000000..6fd691921e --- /dev/null +++ b/Build.sh @@ -0,0 +1,4 @@ +#!/bin/bash +cd "$(dirname "$(readlink -f "$0")")" +cd ./tools/build +sudo bash ./build.sh diff --git a/SpacemanDMM.toml b/SpacemanDMM.toml index 81aff0d557..53a293e71c 100644 --- a/SpacemanDMM.toml +++ b/SpacemanDMM.toml @@ -1,7 +1,10 @@ [langserver] dreamchecker = true -[code_standards] +[debugger] +engine = "auxtools" + +#[code_standards] disallow_relative_type_definitions = true disallow_relative_proc_definitions = true diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm new file mode 100644 index 0000000000..a4b572a2ee --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_bathhouse.dmm @@ -0,0 +1,175 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/template_noop, +/area/template_noop) +"b" = ( +/turf/closed/wall/mineral/silver, +/area/ruin/powered/bathhouse) +"c" = ( +/obj/machinery/shower{ + pixel_y = 16 + }, +/obj/structure/curtain, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"e" = ( +/obj/structure/mirror{ + pixel_y = 28 + }, +/obj/structure/sink{ + pixel_y = 20 + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"f" = ( +/obj/structure/table/greyscale, +/obj/item/bikehorn/rubberducky, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"g" = ( +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"h" = ( +/obj/item/soap, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"i" = ( +/obj/machinery/door/airlock/freezer{ + name = "bath house airlock" + }, +/turf/open/floor/plasteel/white, +/area/ruin/powered/bathhouse) +"j" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/powered/bathhouse) +"k" = ( +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"l" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/meatballspaghetti, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"m" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) +"n" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/structure/bed, +/obj/item/bedsheet, +/turf/open/floor/wood, +/area/ruin/powered/bathhouse) + +(1,1,1) = {" +b +b +b +b +b +n +a +a +"} +(2,1,1) = {" +b +c +g +g +b +j +j +j +"} +(3,1,1) = {" +b +b +g +g +i +k +k +j +"} +(4,1,1) = {" +b +c +g +g +b +l +k +j +"} +(5,1,1) = {" +b +b +g +g +b +m +o +j +"} +(6,1,1) = {" +b +c +g +g +b +j +j +j +"} +(7,1,1) = {" +b +b +g +h +b +n +n +n +"} +(8,1,1) = {" +b +e +g +g +b +n +n +n +"} +(9,1,1) = {" +b +e +g +g +i +n +n +n +"} +(10,1,1) = {" +b +f +g +g +b +n +n +a +"} +(11,1,1) = {" +b +b +b +b +b +n +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm new file mode 100644 index 0000000000..ef07fa1303 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_engioutpost.dmm @@ -0,0 +1,2063 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ab" = ( +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ad" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/closed/wall/r_wall, +/area/lavaland/surface/outdoors) +"af" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ag" = ( +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ah" = ( +/obj/effect/decal/cleanable/blood, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ai" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aj" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"al" = ( +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"am" = ( +/obj/machinery/power/emitter, +/obj/effect/turf_decal/stripes/end{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"an" = ( +/turf/closed/wall/mineral/iron, +/area/lavaland/surface/outdoors) +"ao" = ( +/obj/item/clothing/under/rank/engineering/chief_engineer, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ap" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aq" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ar" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"as" = ( +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"at" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"au" = ( +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/tracks, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"av" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aw" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ax" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"ay" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"az" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aB" = ( +/turf/closed/wall, +/area/lavaland/surface/outdoors) +"aC" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aD" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"aE" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/o2, +/area/lavaland/surface/outdoors) +"aF" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aG" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/n2, +/area/lavaland/surface/outdoors) +"aH" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/light/small{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aI" = ( +/obj/effect/turf_decal/stripes/line, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"aK" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aL" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aM" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"aN" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"aO" = ( +/turf/closed/wall/r_wall/rust, +/area/lavaland/surface/outdoors) +"aP" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aQ" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aR" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aS" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aU" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aV" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aW" = ( +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 1 + }, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aX" = ( +/obj/machinery/atmospherics/components/trinary/mixer/flipped{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aY" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"aZ" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ba" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bb" = ( +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bc" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bd" = ( +/obj/effect/decal/cleanable/blood/splatter, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bf" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/decal/cleanable/blood/gibs/core, +/obj/item/clothing/suit/space/hardsuit/engine, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bh" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bi" = ( +/obj/machinery/door/airlock/engineering{ + name = "The Singularity Engine" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bj" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bk" = ( +/obj/machinery/door/airlock/engineering{ + name = "Engine Entry"; + req_access_txt = "204" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bm" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bn" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bo" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bp" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bq" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"br" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bt" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bu" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bv" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bw" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/power/apc/unlocked{ + dir = 4; + pixel_x = 24 + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"by" = ( +/obj/item/stack/rods{ + amount = 2 + }, +/obj/item/shard/plasma, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bA" = ( +/obj/item/flashlight/flare, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bB" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bC" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"bD" = ( +/obj/effect/decal/cleanable/robot_debris, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/book/manual/wiki/engineering_singulo_tesla, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bE" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bF" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bI" = ( +/obj/item/pda/clear{ + note = "Chief's asked me to check on the machinery inside PDA. He's also worried about Build, but i'm sure Harry'll handle the construction. I just need to work on Internals. Fuck i'm hungry" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bJ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bK" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bM" = ( +/obj/machinery/atmospherics/components/trinary/filter/flipped{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bN" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bO" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 10 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bP" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bQ" = ( +/obj/effect/spawner/structure/window/plasma, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bR" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bS" = ( +/obj/structure/sign/poster/official/build{ + pixel_x = -32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bT" = ( +/obj/item/pipe_dispenser, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bU" = ( +/obj/effect/mob_spawn/human/corpse/assistant, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bV" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bX" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bY" = ( +/obj/structure/sign/poster/official/safety_internals{ + pixel_x = 32 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"bZ" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ca" = ( +/obj/item/flashlight, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cb" = ( +/obj/item/book/manual/wiki/atmospherics, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cc" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cd" = ( +/obj/machinery/atmospherics/pipe/manifold/dark/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ce" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/obj/machinery/airalarm/directional/east, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cf" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cg" = ( +/obj/item/wallframe/apc, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ch" = ( +/obj/machinery/light/broken, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ci" = ( +/obj/structure/sign/poster/official/pda_ad{ + pixel_y = -32 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ck" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible{ + dir = 5 + }, +/obj/structure/sign/poster/contraband/atmosia_independence{ + pixel_x = -32 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cl" = ( +/obj/machinery/atmospherics/pipe/manifold4w/supply/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cm" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cn" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"co" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 6 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cp" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 8 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cq" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 1 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cr" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cs" = ( +/obj/machinery/atmospherics/components/unary/thermomachine/heater{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"ct" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cv" = ( +/obj/machinery/atmospherics/pipe/manifold/green/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cw" = ( +/obj/machinery/atmospherics/pipe/manifold4w/green/visible, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cx" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cy" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 4 + }, +/obj/machinery/atmospherics/components/binary/pump, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cz" = ( +/obj/machinery/atmospherics/pipe/simple/green/visible{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cA" = ( +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cB" = ( +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 1 + }, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cC" = ( +/obj/effect/decal/cleanable/oil, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cD" = ( +/obj/effect/decal/cleanable/blood, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cE" = ( +/obj/machinery/computer/rdconsole/production, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cF" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cG" = ( +/obj/machinery/field/generator, +/obj/effect/turf_decal/stripes/line{ + dir = 6 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cH" = ( +/obj/item/construction/rcd, +/obj/structure/rack, +/obj/item/rcd_ammo, +/obj/item/rcd_ammo, +/obj/item/rcd_upgrade/frames, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cI" = ( +/obj/machinery/airalarm/directional/west, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cJ" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/visible{ + dir = 8 + }, +/obj/structure/cable, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cK" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/yellow/filled/line{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cL" = ( +/obj/effect/turf_decal/stripes/corner, +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cM" = ( +/obj/machinery/atmospherics/components/binary/pump{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cN" = ( +/obj/machinery/atmospherics/components/binary/pump, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cO" = ( +/obj/machinery/light/small, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cP" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 6 + }, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cQ" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible{ + dir = 9 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cR" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cS" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cT" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"cV" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cW" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/effect/turf_decal/trimline/yellow/filled/corner{ + dir = 4 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cY" = ( +/obj/machinery/light/small/broken, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"cZ" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"da" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"db" = ( +/obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/airless, +/area/lavaland/surface/outdoors) +"dc" = ( +/obj/machinery/power/rad_collector, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dd" = ( +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"de" = ( +/obj/machinery/autolathe, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"df" = ( +/obj/machinery/door/airlock, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dg" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dh" = ( +/obj/structure/sign/poster/contraband/grey_tide, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall, +/area/lavaland/surface/outdoors) +"di" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dj" = ( +/turf/closed/wall/rust, +/area/lavaland/surface/outdoors) +"dk" = ( +/obj/machinery/atmospherics/pipe/simple/supply/visible, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dl" = ( +/obj/machinery/atmospherics/pipe/simple/general/visible, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dm" = ( +/obj/machinery/atmospherics/pipe/simple/brown/visible, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dn" = ( +/obj/machinery/atmospherics/pipe/simple/dark/visible, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"do" = ( +/obj/machinery/power/port_gen/pacman, +/obj/effect/decal/cleanable/oil/streak, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dp" = ( +/obj/machinery/light/built, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dq" = ( +/obj/item/tank/internals/plasma, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dr" = ( +/obj/machinery/power/floodlight, +/obj/structure/cable, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"ds" = ( +/obj/structure/tank_dispenser, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"dt" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line{ + dir = 1 + }, +/obj/machinery/airalarm/directional/north, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"du" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dv" = ( +/obj/effect/turf_decal/trimline/neutral/filled/line, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dw" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/air, +/area/lavaland/surface/outdoors) +"dy" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/high_volume{ + dir = 1 + }, +/turf/open/floor/engine/vacuum, +/area/lavaland/surface/outdoors) +"dA" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/trimline/neutral/filled/line, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"dB" = ( +/obj/structure/girder, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"dC" = ( +/obj/structure/door_assembly/door_assembly_eng, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"gA" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"gD" = ( +/obj/machinery/power/emitter{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/end, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable, +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"mO" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"oi" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating/rust, +/area/lavaland/surface/outdoors) +"tY" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"CR" = ( +/obj/structure/cable{ + icon_state = "0-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"DM" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"Ee" = ( +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) +"Wr" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating/icemoon, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} +(2,1,1) = {" +aa +aa +aB +an +aB +aB +an +ab +aa +by +bQ +bQ +aO +ae +ae +ae +ae +aO +aa +"} +(3,1,1) = {" +aa +aa +aa +aj +ab +al +al +ab +ab +ab +ab +ab +ab +al +al +al +do +ae +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aj +al +al +al +al +al +al +al +al +al +al +gA +ae +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +aa +aw +aK +bc +bc +bR +bc +bc +cC +cT +ai +Ee +aO +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +al +cD +gA +al +al +aO +aa +"} +(7,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +bd +aa +aa +aa +af +cA +DM +dc +al +ae +aa +"} +(8,1,1) = {" +ab +ab +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +af +af +DM +ag +al +ae +aa +"} +(9,1,1) = {" +ab +ab +al +ap +aa +aa +aa +aa +bf +aa +aa +aa +af +af +DM +dc +dp +ae +aa +"} +(10,1,1) = {" +ab +ab +dd +ap +al +aa +aa +aa +aa +aa +bT +aa +af +ab +DM +dc +dq +ae +aa +"} +(11,1,1) = {" +ad +ai +mO +aq +ab +aa +aa +aa +aa +bA +aa +aa +af +aI +DM +dc +al +ae +aa +"} +(12,1,1) = {" +ab +ab +gA +ap +al +ab +aJ +aa +aa +aa +aa +ab +ab +cF +gA +al +al +aO +aa +"} +(13,1,1) = {" +ab +ab +am +ar +at +at +at +at +Wr +bB +bB +bB +tY +cG +gD +ai +dr +ae +aa +"} +(14,1,1) = {" +ab +ah +al +as +au +as +as +as +bg +al +al +cg +gA +al +al +al +al +ae +aa +"} +(15,1,1) = {" +ab +al +al +al +al +al +al +al +bh +bC +al +al +CR +al +al +al +ds +aO +aa +"} +(16,1,1) = {" +aO +aO +ae +ae +ae +aO +ae +aO +bi +ae +aO +ae +ae +aO +ae +aO +ae +aO +aa +"} +(17,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aL +bb +bD +aO +aa +aa +aa +aa +aa +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +oi +bj +ab +ae +aa +aa +aa +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +af +aa +aa +aB +an +dj +ae +aP +bk +aP +ae +aB +aB +dj +aB +aB +aB +aa +aa +"} +(20,1,1) = {" +af +af +ab +aa +aa +af +aC +aQ +bl +bE +bS +cf +cr +cB +cI +ab +aB +aa +aa +"} +(21,1,1) = {" +af +ab +ab +af +af +ab +ab +ab +bj +ab +bU +ch +aB +cE +ab +cY +dj +aa +aa +"} +(22,1,1) = {" +aa +aa +af +ab +ab +ab +ab +ab +bj +ab +bV +ab +aP +cH +ab +de +dj +aa +aa +"} +(23,1,1) = {" +ab +aa +af +ab +ao +ab +ab +aR +bm +ab +bH +ci +aB +aB +aP +aB +aB +ab +aa +"} +(24,1,1) = {" +aa +af +ab +al +ab +ab +ab +aS +bn +ab +bH +ab +ab +cI +cR +aB +dj +aB +aB +"} +(25,1,1) = {" +aa +af +ab +ab +ab +ab +ab +aT +bo +ab +bW +cj +cj +cj +cS +dh +dg +du +aB +"} +(26,1,1) = {" +aa +af +af +an +an +ab +ab +ab +bp +bF +bX +bF +bF +cJ +cV +df +di +dv +dB +"} +(27,1,1) = {" +aa +aa +aa +aa +an +av +aH +av +bj +bG +bY +av +av +cK +cW +aB +dt +dA +dC +"} +(28,1,1) = {" +aa +aa +aa +aa +an +an +dj +ae +bj +bH +ae +aB +dB +dB +aB +dj +aB +aB +dj +"} +(29,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bj +bI +ae +aa +aa +aa +aa +aa +aa +aa +aB +"} +(30,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bH +aO +aa +aa +aa +aa +aa +aa +aa +aB +"} +(31,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +ae +bq +bJ +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} +(32,1,1) = {" +aa +aa +aa +ae +ae +ae +ae +ae +br +bK +bZ +ck +cs +cL +aO +ae +ae +aO +aa +"} +(33,1,1) = {" +aa +aa +aa +ae +ax +aD +aM +aU +bs +bL +bZ +cl +ct +cM +cZ +dk +dw +ae +aa +"} +(34,1,1) = {" +aa +aa +aa +ae +ay +aE +aN +aV +bt +bM +ab +cm +co +cN +aN +dl +dx +ae +aa +"} +(35,1,1) = {" +aa +aa +aa +ae +ae +ae +aO +aW +bu +bN +ca +cn +cv +cO +ae +aO +aO +aO +aa +"} +(36,1,1) = {" +aa +aa +aa +ae +az +aF +aM +aX +bv +bN +cb +co +cw +cM +da +dm +dy +ae +aa +"} +(37,1,1) = {" +aa +aa +aa +ae +aA +aG +aN +aY +bw +bM +cc +cp +cx +cP +db +dn +dz +ae +aa +"} +(38,1,1) = {" +aa +aa +aa +ae +aO +aO +ae +aZ +bu +bO +cd +cd +cy +cQ +ae +aO +aO +aO +aa +"} +(39,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +ba +bx +bP +ce +cq +cz +ab +ae +aa +aa +aa +aa +"} +(40,1,1) = {" +aa +aa +aa +aa +aa +aa +ae +aO +aO +ae +ae +ae +aO +ae +aO +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm new file mode 100644 index 0000000000..ae80410427 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_hotsprings.dmm @@ -0,0 +1,161 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/closed/indestructible/sandstone, +/area/lavaland/surface/outdoors) +"c" = ( +/turf/open/water, +/area/lavaland/surface/outdoors) +"I" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"L" = ( +/obj/structure/fluff/beach_umbrella, +/turf/open/floor/plating/beach/sand, +/area/lavaland/surface/outdoors) +"U" = ( +/turf/open/floor/plating/beach/sand, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +"} +(2,1,1) = {" +I +I +I +a +a +I +a +a +I +I +I +"} +(3,1,1) = {" +I +I +a +U +U +U +U +U +a +I +I +"} +(4,1,1) = {" +I +a +U +L +c +c +c +L +U +a +I +"} +(5,1,1) = {" +I +a +U +c +c +c +c +c +U +a +I +"} +(6,1,1) = {" +I +I +U +c +c +c +c +c +U +I +I +"} +(7,1,1) = {" +I +a +U +c +c +c +c +c +U +a +I +"} +(8,1,1) = {" +I +a +U +L +c +c +c +L +U +a +I +"} +(9,1,1) = {" +I +I +a +U +U +U +U +U +a +I +I +"} +(10,1,1) = {" +I +I +I +a +a +I +a +a +I +I +I +"} +(11,1,1) = {" +I +I +I +I +I +I +I +I +I +I +I +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm new file mode 100644 index 0000000000..d1dcf9f11d --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_library.dmm @@ -0,0 +1,734 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"aa" = ( +/turf/template_noop, +/area/template_noop) +"ab" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/documents/syndicate/mining, +/obj/effect/decal/cleanable/cobweb, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ac" = ( +/turf/closed/wall/mineral/wood, +/area/ruin/unpowered/buried_library) +"ad" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"ae" = ( +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"af" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ag" = ( +/obj/item/feather, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ah" = ( +/obj/structure/bookcase/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ai" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary2, +/obj/effect/decal/cleanable/cobweb/cobweb2, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"al" = ( +/turf/closed/wall/mineral/iron, +/area/ruin/unpowered/buried_library) +"am" = ( +/obj/structure/table/wood/fancy/black, +/obj/item/book_of_babel, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"ao" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"ap" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aq" = ( +/obj/structure/bookcase/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"ar" = ( +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"as" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/ruins/oldstation/protosing, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"av" = ( +/obj/structure/bookcase/random, +/turf/open/space/basic, +/area/ruin/unpowered/buried_library) +"aw" = ( +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"ay" = ( +/obj/machinery/door/keycard/library, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"az" = ( +/obj/item/paper/crumpled/fluff/stations/lavaland/library/diary, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aA" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aC" = ( +/obj/item/feather, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aD" = ( +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aE" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aF" = ( +/obj/item/book/manual/random, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aG" = ( +/obj/structure/table/bronze, +/obj/item/stack/ore/slag, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aH" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aI" = ( +/obj/effect/mob_spawn/human/skeleton, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aJ" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aK" = ( +/obj/item/feather, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aL" = ( +/obj/effect/decal/cleanable/dirt, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aM" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/item/book/manual/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aN" = ( +/obj/structure/statue/sandstone/venus, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"aP" = ( +/obj/item/keycard/library, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"aQ" = ( +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/fluff/awaymissions/moonoutpost19/research/larva_autopsy, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aR" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aS" = ( +/obj/structure/table/wood/fancy/black, +/obj/effect/decal/cleanable/dirt, +/obj/item/paper/secretrecipe, +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aV" = ( +/obj/item/stack/sheet/mineral/wood, +/obj/structure/fluff/paper/stack, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"aW" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plasteel/cult, +/area/ruin/unpowered/buried_library) +"aX" = ( +/obj/structure/table/bronze, +/obj/item/statuebust, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"aY" = ( +/obj/structure/table_frame/wood, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"ba" = ( +/obj/structure/barricade/wooden/crude, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bg" = ( +/obj/item/paper/fluff/ruins/oldstation/protogun, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bh" = ( +/obj/effect/decal/cleanable/dirt, +/mob/living/simple_animal/pet/fox, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"bi" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bj" = ( +/obj/item/book/manual/random, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bl" = ( +/obj/item/storage/box/fountainpens, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bm" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bn" = ( +/obj/item/book/manual/random, +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bo" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bp" = ( +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bq" = ( +/obj/structure/mineral_door/wood, +/obj/structure/barricade/wooden/crude/snow, +/turf/open/floor/wood, +/area/ruin/unpowered/buried_library) +"br" = ( +/obj/structure/girder, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/ruin/unpowered/buried_library) +"bt" = ( +/obj/effect/decal/cleanable/dirt, +/turf/template_noop, +/area/template_noop) +"bu" = ( +/obj/item/stack/sheet/mineral/wood, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"bw" = ( +/turf/open/floor/wood, +/area/lavaland/surface/outdoors) +"by" = ( +/obj/item/statuebust, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) +"bz" = ( +/obj/item/flashlight/lantern/jade{ + on = 1 + }, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bA" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/plating, +/area/ruin/unpowered/buried_library) +"bB" = ( +/obj/structure/fluff/paper/stack, +/turf/open/floor/carpet/black, +/area/ruin/unpowered/buried_library) + +(1,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +ad +bt +aa +"} +(2,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +aa +aa +aa +bi +bi +bi +bi +bi +ac +ba +ac +ac +ac +ad +ad +aa +"} +(3,1,1) = {" +aa +aa +aa +aa +aa +aa +aa +bi +bi +bi +bi +bo +bi +bi +bi +bm +ae +af +ae +ac +ad +ad +aa +"} +(4,1,1) = {" +aa +aa +aa +aa +aa +aa +bi +bi +aR +bi +bi +ae +bj +aq +bi +ah +aL +ah +ao +ac +ad +aa +aa +"} +(5,1,1) = {" +aa +aa +aa +aa +aa +bi +bi +bi +aC +ae +aQ +aq +bi +aq +bg +ah +ao +ah +bi +ac +ad +ad +aa +"} +(6,1,1) = {" +aa +aa +aa +aa +ad +ac +bi +ae +bi +aM +ae +aq +bm +aq +aA +ah +ao +ah +ae +ac +ad +ad +ad +"} +(7,1,1) = {" +aa +aa +aa +aa +ad +ac +bi +bm +bi +ao +aR +ao +aA +ao +ag +ah +aR +ah +bh +ac +ad +ad +ad +"} +(8,1,1) = {" +aa +aa +aa +aa +ad +bi +bi +av +aA +bi +aG +aD +aX +bi +ao +ae +ao +ah +ae +ac +br +ad +ad +"} +(9,1,1) = {" +aa +aa +aa +aa +ad +ac +as +av +aF +aD +aD +bz +aD +bB +bi +ae +ao +ae +ao +ac +bp +bw +ad +"} +(10,1,1) = {" +aa +aa +aa +ad +ad +ac +ap +bp +bi +aD +aD +aN +bi +aw +bi +ao +af +aR +ae +bq +ae +bu +ad +"} +(11,1,1) = {" +aa +al +al +al +al +al +ae +ah +aR +aD +bi +aD +aD +by +ao +aw +ao +ae +bm +ac +ae +ad +ad +"} +(12,1,1) = {" +ad +al +ab +aI +ar +al +aR +aE +af +aD +aH +bA +aY +aD +bi +ae +bm +ah +ag +br +ac +ad +ad +"} +(13,1,1) = {" +ad +al +am +aJ +aW +ay +ae +ah +ao +ae +ao +ae +af +bp +bi +ah +bi +ah +bp +ac +ad +ad +ad +"} +(14,1,1) = {" +ad +al +aS +aW +aK +al +ae +ah +bi +ah +ao +ah +az +ah +bi +ah +bi +bn +ao +ac +ad +aa +aa +"} +(15,1,1) = {" +ad +al +al +ai +ar +al +ag +ah +aL +ah +aA +ah +ao +ah +bi +bi +bl +bi +bi +bi +ad +aa +aa +"} +(16,1,1) = {" +ad +ad +al +al +al +al +ao +ah +ao +ah +ao +aV +bi +ah +bp +bi +bm +bo +bi +br +bu +aa +aa +"} +(17,1,1) = {" +aa +ad +ad +ad +ad +ac +ae +ao +ae +aP +ae +aR +ae +bp +bi +bj +bi +ad +ad +ad +aa +aa +aa +"} +(18,1,1) = {" +aa +aa +aa +aa +ad +ac +ac +ac +ac +ac +ac +ba +ac +ac +br +ad +aa +ad +aa +aa +aa +aa +aa +"} +(19,1,1) = {" +aa +aa +aa +aa +aa +ad +ad +ad +ad +ad +ad +aa +ad +ad +aa +aa +aa +aa +aa +aa +aa +aa +aa +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm new file mode 100644 index 0000000000..d341e39c29 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_lust.dmm @@ -0,0 +1,170 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"b" = ( +/obj/structure/sign/poster/contraband/lusty_xenomorph, +/turf/closed/wall/mineral/abductor, +/area/lavaland/surface) +"c" = ( +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"d" = ( +/obj/item/reagent_containers/food/drinks/trophy/gold_cup, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"e" = ( +/obj/item/greentext{ + light_color = "#64C864"; + light_range = 1 + }, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) +"f" = ( +/obj/item/tcg_card/special/xenomaid, +/turf/open/floor/mineral/diamond, +/area/lavaland/surface) + +(1,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(2,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(3,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(4,1,1) = {" +a +a +a +b +f +c +c +b +a +a +a +"} +(5,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(6,1,1) = {" +a +a +b +c +d +e +d +c +b +a +a +"} +(7,1,1) = {" +a +a +b +c +c +d +c +c +b +a +a +"} +(8,1,1) = {" +a +a +a +b +c +c +c +b +a +a +a +"} +(9,1,1) = {" +a +a +a +a +b +b +b +a +a +a +a +"} +(10,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} +(11,1,1) = {" +a +a +a +a +a +a +a +a +a +a +a +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm new file mode 100644 index 0000000000..b4f7fec16f --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_mining_site.dmm @@ -0,0 +1,881 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"b" = ( +/turf/closed/wall/mineral/wood/nonmetal, +/area/ruin/unpowered) +"c" = ( +/obj/structure/closet/toolcloset, +/obj/item/wrench, +/obj/item/screwdriver, +/obj/item/crowbar, +/obj/item/weldingtool/largetank, +/obj/item/wirecutters, +/obj/item/radio/off, +/turf/open/floor/wood, +/area/ruin/unpowered) +"d" = ( +/turf/open/openspace/icemoon, +/area/template_noop) +"e" = ( +/obj/item/clothing/suit/hooded/explorer, +/obj/item/clothing/mask/gas/explorer, +/obj/item/clothing/gloves/color/black, +/obj/item/storage/backpack/explorer, +/obj/item/flashlight/lantern, +/obj/item/storage/bag/ore, +/obj/structure/closet, +/obj/item/clothing/shoes/jackboots, +/turf/open/floor/wood, +/area/ruin/unpowered) +"f" = ( +/turf/open/floor/wood, +/area/ruin/unpowered) +"g" = ( +/obj/structure/fireplace, +/turf/open/floor/wood, +/area/ruin/unpowered) +"h" = ( +/obj/structure/flora/ash/cacti, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"i" = ( +/turf/template_noop, +/area/template_noop) +"j" = ( +/obj/structure/sink/kitchen, +/turf/open/floor/wood, +/area/ruin/unpowered) +"k" = ( +/obj/structure/closet/crate/freezer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"l" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/wood, +/area/ruin/unpowered) +"m" = ( +/obj/structure/barricade/wooden/crude/snow, +/obj/structure/mineral_door/wood, +/turf/open/floor/wood, +/area/ruin/unpowered) +"n" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface/outdoors) +"o" = ( +/obj/item/reagent_containers/food/drinks/beer, +/turf/open/floor/wood, +/area/ruin/unpowered) +"p" = ( +/obj/machinery/light/broken{ + dir = 4 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"q" = ( +/obj/structure/table/wood, +/obj/item/pen, +/obj/machinery/light/broken{ + dir = 8 + }, +/obj/item/paper/crumpled/bloody{ + info = "help..."; + text = "" + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"r" = ( +/obj/item/chair/wood, +/obj/effect/decal/cleanable/blood/splatter, +/obj/effect/decal/cleanable/blood/drip, +/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner/guidance{ + dir = 8 + }, +/turf/open/floor/wood, +/area/ruin/unpowered) +"s" = ( +/obj/effect/decal/cleanable/trail_holder, +/turf/open/floor/wood, +/area/ruin/unpowered) + +(1,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(2,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(3,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(4,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(5,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(6,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(7,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(8,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +i +"} +(9,1,1) = {" +i +i +i +i +i +i +i +i +d +b +b +b +b +b +b +b +i +i +i +i +i +i +i +i +i +"} +(10,1,1) = {" +i +i +i +i +i +i +i +i +b +b +b +b +b +b +b +b +b +i +i +i +i +i +i +i +i +"} +(11,1,1) = {" +i +i +i +i +i +i +i +i +b +b +c +f +f +o +q +b +b +i +i +i +i +i +i +i +i +"} +(12,1,1) = {" +i +i +i +i +i +i +i +i +b +b +e +f +f +f +r +b +b +i +i +i +i +i +i +i +i +"} +(13,1,1) = {" +i +i +i +i +i +i +i +i +b +b +f +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(14,1,1) = {" +i +i +i +i +i +i +i +i +b +b +g +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(15,1,1) = {" +i +i +i +i +i +i +i +i +b +b +f +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(16,1,1) = {" +i +i +i +i +i +i +i +i +b +b +j +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(17,1,1) = {" +i +i +i +i +i +i +i +i +b +b +k +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(18,1,1) = {" +i +i +i +i +i +i +i +i +b +b +l +f +f +f +s +b +b +i +i +i +i +i +i +i +i +"} +(19,1,1) = {" +i +i +i +i +i +i +i +i +b +b +b +f +f +p +b +b +b +i +i +i +i +i +i +i +i +"} +(20,1,1) = {" +i +i +i +i +i +i +i +i +i +b +b +b +f +b +b +b +i +i +i +i +i +i +i +i +i +"} +(21,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +f +b +i +i +i +i +i +i +i +i +i +i +i +"} +(22,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +f +b +i +i +i +i +i +i +i +i +i +i +i +"} +(23,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +f +b +i +i +i +i +i +i +i +i +i +i +i +"} +(24,1,1) = {" +i +i +i +i +i +i +i +i +i +i +i +b +m +b +i +i +i +i +i +i +i +i +i +i +i +"} +(25,1,1) = {" +i +i +i +i +i +i +i +i +i +i +n +h +n +h +n +i +i +i +i +i +i +i +i +i +i +"} +(26,1,1) = {" +i +i +i +i +i +i +i +i +i +n +n +n +h +n +n +n +i +i +i +i +i +i +i +i +i +"} +(27,1,1) = {" +i +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +i +"} +(28,1,1) = {" +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +"} +(29,1,1) = {" +i +i +i +i +i +i +i +n +n +n +n +n +n +n +n +n +n +n +i +i +i +i +i +i +i +"} diff --git a/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm new file mode 100644 index 0000000000..506e689372 --- /dev/null +++ b/_maps/RandomRuins/LavaRuins/lavaland_surface_wrath.dmm @@ -0,0 +1,270 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"a" = ( +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"b" = ( +/turf/closed/mineral/volcanic/lava_land_surface, +/area/lavaland/surface/outdoors) +"e" = ( +/obj/structure/spawner/nether, +/turf/open/floor/plating/asteroid/basalt/lava_land_surface, +/area/lavaland/surface) +"q" = ( +/turf/closed/mineral/strong/wasteland, +/area/lavaland/surface/outdoors) + +(1,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} +(2,1,1) = {" +b +b +b +b +q +q +q +q +q +q +q +b +b +b +b +"} +(3,1,1) = {" +b +b +q +q +q +a +a +a +a +a +q +q +q +b +b +"} +(4,1,1) = {" +b +b +q +a +a +a +a +a +a +a +a +a +q +b +b +"} +(5,1,1) = {" +b +q +q +a +a +a +a +a +a +a +a +a +q +q +b +"} +(6,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(7,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(8,1,1) = {" +b +q +a +a +a +a +a +e +a +a +a +a +a +q +b +"} +(9,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(10,1,1) = {" +b +q +a +a +a +a +a +a +a +a +a +a +a +q +b +"} +(11,1,1) = {" +b +q +q +a +a +a +a +a +a +a +a +a +q +q +b +"} +(12,1,1) = {" +b +b +q +a +a +a +a +a +a +a +a +a +q +b +b +"} +(13,1,1) = {" +b +b +q +q +q +a +a +a +a +a +q +q +q +b +b +"} +(14,1,1) = {" +b +b +b +b +q +q +q +q +q +q +q +b +b +b +b +"} +(15,1,1) = {" +b +b +b +b +b +b +b +b +b +b +b +b +b +b +b +"} diff --git a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm index a0fc5fa8a7..347d0a093f 100644 --- a/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm +++ b/_maps/RandomRuins/SpaceRuins/shuttlerelic.dmm @@ -64,11 +64,7 @@ dir = 1; icon_state = "chairold" }, -/obj/item/crowbar/large{ - desc = "It's a big crowbar. It doesn't fit in your pockets, because it's big. It feels oddly heavy.."; - force = 20; - name = "heavy crowbar" - }, +/obj/item/crowbar/large/heavy, /turf/open/floor/oldshuttle, /area/ruin/powered) "o" = ( diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm index db2a4f6cd7..f7fa98fcf7 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_am.dmm @@ -1367,7 +1367,7 @@ JZ kK Ch Ch -MJ +Ch MJ MJ MJ diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm index 5a92d13752..504d43412f 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_sm_5x5.dmm @@ -323,6 +323,9 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/pipe/simple/green/visible, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/engine, /area/engineering/main) "fa" = ( @@ -1791,6 +1794,9 @@ /obj/structure/cable/yellow{ icon_state = "1-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/engine, /area/engineering/main) "SR" = ( diff --git a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm index a35dcedb82..308657487f 100644 --- a/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm +++ b/_maps/RandomRuins/StationRuins/Box/Engine/engine_teg.dmm @@ -289,7 +289,7 @@ name = "Supermatter Engine Room"; req_access_txt = "10" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engineering/main) "kB" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -463,14 +463,6 @@ /obj/machinery/atmospherics/pipe/heat_exchanging/junction, /turf/open/floor/engine/vacuum, /area/engineering/main) -"oS" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/engineering/glass{ - name = "Supermatter Engine Room"; - req_access_txt = "10" - }, -/turf/open/floor/engine, -/area/engineering/main) "pY" = ( /obj/machinery/atmospherics/components/unary/portables_connector{ dir = 8 @@ -884,7 +876,7 @@ name = "Supermatter Engine Room"; req_access_txt = "10" }, -/turf/open/floor/engine, +/turf/open/floor/plasteel, /area/engineering/main) "AT" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -2344,7 +2336,7 @@ YZ yf "} (17,1,1) = {" -oS +CH TN Wm ou @@ -2400,7 +2392,7 @@ YZ yf "} (19,1,1) = {" -oS +CH kd tP ou diff --git a/_maps/RandomZLevels/VR/snowdin_VR.dmm b/_maps/RandomZLevels/VR/snowdin_VR.dmm index 37466138cd..c0977f00f0 100644 --- a/_maps/RandomZLevels/VR/snowdin_VR.dmm +++ b/_maps/RandomZLevels/VR/snowdin_VR.dmm @@ -2700,15 +2700,15 @@ /area/awaymission/snowdin/outside) "gc" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gd" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "ge" = ( @@ -2718,8 +2718,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonheavy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gg" = ( @@ -3077,15 +3077,15 @@ "gU" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gW" = ( @@ -3403,8 +3403,8 @@ "hF" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "hG" = ( @@ -3669,8 +3669,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonmid, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "im" = ( @@ -3679,8 +3679,8 @@ max_mobs = 5 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "in" = ( @@ -3689,8 +3689,8 @@ name = "Caleb Reed" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "io" = ( @@ -4490,8 +4490,8 @@ name = "Jacob Ullman" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "jP" = ( @@ -5585,8 +5585,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonlite, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "lU" = ( @@ -7478,8 +7478,8 @@ "qg" = ( /obj/structure/flora/rock/pile/icy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "qh" = ( @@ -13150,7 +13150,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EF" = ( @@ -13162,7 +13162,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EG" = ( @@ -13176,7 +13176,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EH" = ( diff --git a/_maps/RandomZLevels/away_mission/TheBeach.dmm b/_maps/RandomZLevels/away_mission/TheBeach.dmm index 6877eb4b35..80a649bcc8 100644 --- a/_maps/RandomZLevels/away_mission/TheBeach.dmm +++ b/_maps/RandomZLevels/away_mission/TheBeach.dmm @@ -1001,6 +1001,20 @@ /obj/item/clothing/glasses/heat, /turf/open/floor/plating/beach/sand, /area/awaymission/beach) +"np" = ( +/obj/machinery/shower{ + dir = 8 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) +"Vi" = ( +/obj/machinery/shower{ + dir = 4 + }, +/obj/effect/turf_decal/sand, +/turf/open/floor/plasteel/white, +/area/awaymission/beach) (1,1,1) = {" aa @@ -7892,10 +7906,10 @@ ak ak ak ak -ak -ak -ak -ak +Vi +Vi +Vi +Vi ak ba ba @@ -8213,10 +8227,10 @@ ak ak ak ak -ak -ak -ak -ak +np +np +np +np ak ba ba diff --git a/_maps/RandomZLevels/away_mission/caves.dmm b/_maps/RandomZLevels/away_mission/caves.dmm index 1576c144d8..ed246ff8b5 100644 --- a/_maps/RandomZLevels/away_mission/caves.dmm +++ b/_maps/RandomZLevels/away_mission/caves.dmm @@ -17,19 +17,19 @@ /area/awaymission/caves/BMP_asteroid/level_four) "ae" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "af" = ( /obj/item/greentext, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ag" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ah" = ( @@ -41,13 +41,13 @@ /area/awaymission/caves/BMP_asteroid/level_three) "ai" = ( /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aj" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "ak" = ( @@ -56,49 +56,49 @@ "al" = ( /obj/effect/forcefield/cult, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "am" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "an" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ap" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aq" = ( /obj/item/ectoplasm, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ar" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "as" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "at" = ( /obj/structure/spawner/skeleton, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "au" = ( @@ -111,7 +111,7 @@ /obj/item/clothing/mask/gas/clown_hat, /obj/item/organ/heart/cursed, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "av" = ( @@ -120,13 +120,13 @@ name = "shock rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aw" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ax" = ( @@ -140,39 +140,39 @@ }, /obj/item/coin/antagtoken, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "az" = ( /obj/structure/constructshell, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aA" = ( /obj/structure/girder/cult, /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aB" = ( /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aC" = ( /obj/structure/bed, /obj/item/bedsheet/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aD" = ( /obj/item/stack/sheet/runed_metal, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aE" = ( @@ -183,7 +183,7 @@ /obj/item/coin/antagtoken, /obj/item/book/granter/spell/smoke, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aF" = ( @@ -194,13 +194,13 @@ name = "weak forcefield" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aG" = ( /obj/item/ectoplasm, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aH" = ( @@ -209,7 +209,7 @@ "aI" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aJ" = ( @@ -217,7 +217,7 @@ /area/awaymission/caves/BMP_asteroid/level_three) "aK" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aL" = ( @@ -225,7 +225,7 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aM" = ( @@ -234,7 +234,7 @@ id = "minedeep" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aN" = ( @@ -243,7 +243,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aO" = ( @@ -251,7 +251,7 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aP" = ( @@ -261,31 +261,31 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aQ" = ( /obj/item/stack/rods, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aR" = ( /obj/effect/forcefield/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aS" = ( /obj/structure/girder/cult, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aT" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aU" = ( @@ -298,7 +298,7 @@ pixel_x = 32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aV" = ( @@ -312,7 +312,7 @@ "aW" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aX" = ( @@ -321,7 +321,7 @@ id_target = "minedeepup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "aY" = ( @@ -330,7 +330,7 @@ name = "flame rune" }, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "aZ" = ( @@ -339,7 +339,7 @@ name = "flame rune" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "ba" = ( @@ -350,60 +350,60 @@ name = "blood-red sabre" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bb" = ( /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bc" = ( /obj/structure/spider/stickyweb, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "be" = ( /obj/structure/spawner/mining/goliath, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bf" = ( /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bg" = ( /mob/living/simple_animal/hostile/poison/giant_spider/nurse, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bh" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bm" = ( /obj/machinery/gateway/away, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bo" = ( /obj/structure/trap/chill, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "br" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bs" = ( @@ -412,53 +412,53 @@ name = "shock rune" }, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bt" = ( /obj/structure/spider/stickyweb, /mob/living/simple_animal/hostile/poison/giant_spider/hunter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bu" = ( /obj/structure/spider/cocoon, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bv" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bw" = ( /obj/effect/decal/cleanable/blood, /obj/structure/spawner/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bx" = ( /obj/item/organ/brain/alien, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "by" = ( /mob/living/simple_animal/hostile/poison/giant_spider/nurse, /obj/item/nullrod/hammmer, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bz" = ( /obj/effect/decal/remains/human, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bA" = ( @@ -466,31 +466,31 @@ /obj/effect/decal/cleanable/blood, /obj/item/immortality_talisman, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bB" = ( /obj/item/clothing/head/collectable/wizard, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bC" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bD" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bE" = ( /obj/structure/destructible/cult/pylon, /obj/effect/decal/cleanable/blood, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bF" = ( @@ -500,7 +500,7 @@ name = "rusty ladder" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_three) "bG" = ( @@ -508,7 +508,7 @@ name = "suspicious .357 revovler" }, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bH" = ( @@ -516,19 +516,19 @@ /obj/item/clothing/under/misc/patriotsuit, /obj/structure/trap/chill, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bI" = ( /obj/item/bedsheet/patriot, /obj/structure/trap/chill, /turf/open/floor/plating/asteroid/basalt/lava{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_four) "bJ" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bK" = ( @@ -564,7 +564,7 @@ dir = 4 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bQ" = ( @@ -576,12 +576,12 @@ "bS" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bT" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bU" = ( @@ -590,12 +590,12 @@ id_target = "minedeepup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bV" = ( /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "bW" = ( @@ -603,20 +603,20 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bX" = ( /obj/structure/table, /obj/item/paper/crumpled/awaymissions/caves/unsafe_area, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bY" = ( /mob/living/simple_animal/hostile/skeleton, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "bZ" = ( @@ -625,13 +625,13 @@ name = "Cave Bat" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ca" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cb" = ( @@ -647,13 +647,13 @@ throwforce = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cc" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cd" = ( @@ -662,7 +662,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ce" = ( @@ -671,12 +671,12 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cf" = ( /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cg" = ( @@ -688,13 +688,13 @@ "ci" = ( /obj/item/shard, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cj" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ck" = ( @@ -702,13 +702,13 @@ pixel_y = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cl" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cm" = ( @@ -716,7 +716,7 @@ /area/awaymission/caves/BMP_asteroid/level_two) "cn" = ( /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "co" = ( @@ -726,30 +726,30 @@ /obj/structure/filingcabinet, /obj/item/paper/fluff/awaymissions/caves/omega, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cp" = ( /obj/structure/table, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cq" = ( /obj/structure/flora/rock, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cr" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cs" = ( /obj/item/shard, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "ct" = ( @@ -757,48 +757,48 @@ /obj/item/stack/rods, /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cu" = ( /obj/effect/decal/cleanable/blood/gibs, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cv" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cw" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cx" = ( /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cy" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cz" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cA" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cB" = ( @@ -807,7 +807,7 @@ }, /obj/effect/decal/cleanable/blood/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cC" = ( @@ -815,13 +815,13 @@ /obj/item/restraints/handcuffs/cable, /obj/item/restraints/handcuffs/cable, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cD" = ( /obj/effect/decal/remains/human, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cE" = ( @@ -831,13 +831,13 @@ }, /obj/item/stack/rods, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cF" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cG" = ( @@ -845,13 +845,13 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "cH" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cK" = ( @@ -864,7 +864,7 @@ "cL" = ( /obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cM" = ( @@ -872,14 +872,14 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cN" = ( /obj/machinery/door/window/eastleft, /obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cO" = ( @@ -888,13 +888,13 @@ }, /obj/machinery/door/window/eastleft, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cP" = ( /obj/machinery/door/airlock/external, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cQ" = ( @@ -907,13 +907,13 @@ throwforce = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cR" = ( /obj/effect/landmark/awaystart, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cS" = ( @@ -923,7 +923,7 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cT" = ( @@ -934,7 +934,7 @@ icon_state = "right" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cU" = ( @@ -943,13 +943,13 @@ name = "Cave Bat" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "cV" = ( /obj/effect/decal/cleanable/blood/gibs/xeno, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cW" = ( @@ -957,20 +957,20 @@ dir = 4 }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cX" = ( /obj/structure/table, /obj/item/gun/energy/temperature, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cY" = ( /obj/structure/glowshroom/single, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "cZ" = ( @@ -979,13 +979,13 @@ pixel_x = 32 }, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "da" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "db" = ( @@ -993,7 +993,7 @@ /obj/machinery/cell_charger, /obj/item/stock_parts/cell/crap, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dc" = ( @@ -1006,19 +1006,19 @@ pixel_x = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "dd" = ( /obj/structure/closet/emcloset, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "de" = ( /obj/machinery/light, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "df" = ( @@ -1026,7 +1026,7 @@ name = "weapon equipment" }, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/research) "dg" = ( @@ -1035,7 +1035,7 @@ id_target = "mineintroup" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "dh" = ( @@ -1241,7 +1241,7 @@ name = "Mining cart" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "dW" = ( @@ -1273,31 +1273,31 @@ dir = 8 }, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ec" = ( /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ed" = ( /obj/structure/bed, /obj/effect/landmark/awaystart, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ee" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ef" = ( /obj/effect/decal/cleanable/ash, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "eg" = ( @@ -1329,24 +1329,24 @@ "em" = ( /obj/structure/closet/secure_closet/personal, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "en" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eo" = ( /obj/item/stack/rods, /turf/open/floor/wood{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "ep" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eq" = ( @@ -1370,13 +1370,13 @@ "et" = ( /obj/effect/decal/cleanable/shreds, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/northblock) "eu" = ( /obj/item/stack/rods, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "ev" = ( @@ -1507,7 +1507,7 @@ "eQ" = ( /obj/machinery/mineral/mint, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "eR" = ( @@ -1566,7 +1566,7 @@ "fb" = ( /obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fc" = ( @@ -1577,19 +1577,19 @@ /obj/item/kitchen/knife/combat/survival, /obj/item/kitchen/knife/combat/survival, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fd" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fe" = ( /obj/effect/decal/cleanable/blood/gibs/old, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ff" = ( @@ -1597,13 +1597,13 @@ dir = 4 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fg" = ( /obj/structure/ore_box, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fh" = ( @@ -1619,13 +1619,13 @@ name = "spooky skeleton remains" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fl" = ( /obj/effect/decal/remains/human, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fm" = ( @@ -1641,13 +1641,13 @@ /obj/item/kitchen/knife/combat/survival, /obj/item/kitchen/knife/combat/survival, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fo" = ( /mob/living/simple_animal/hostile/asteroid/fugu, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fp" = ( @@ -1660,7 +1660,7 @@ dir = 8 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fq" = ( @@ -1697,7 +1697,7 @@ "fv" = ( /obj/structure/glowshroom/single, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fw" = ( @@ -1713,18 +1713,18 @@ id_target = "mineintrodown" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fy" = ( /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fz" = ( /obj/structure/barricade/wooden, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fA" = ( @@ -1750,13 +1750,13 @@ "fE" = ( /obj/machinery/light/small, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fF" = ( /obj/item/slimepotion/fireproof, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fG" = ( @@ -1775,7 +1775,7 @@ pixel_x = -32 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fJ" = ( @@ -1807,13 +1807,13 @@ dir = 4 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fP" = ( /obj/structure/grille, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fQ" = ( @@ -1826,7 +1826,7 @@ /obj/structure/grille, /obj/structure/barricade/wooden, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fS" = ( @@ -1850,7 +1850,7 @@ "fW" = ( /obj/structure/girder, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "fX" = ( @@ -1869,7 +1869,7 @@ amount = 15 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "fY" = ( @@ -1883,7 +1883,7 @@ id = "mineintro" }, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gb" = ( @@ -1893,7 +1893,7 @@ "gc" = ( /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gd" = ( @@ -1902,7 +1902,7 @@ name = "wilson" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "ge" = ( @@ -1910,7 +1910,7 @@ dir = 1 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gf" = ( @@ -1922,20 +1922,20 @@ /obj/structure/table/reinforced, /obj/item/storage/box/donkpockets, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gh" = ( /obj/structure/table/reinforced, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gi" = ( /obj/structure/table/reinforced, /obj/item/stack/rods, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gj" = ( @@ -1961,19 +1961,19 @@ "gn" = ( /obj/item/grown/log, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "go" = ( /obj/structure/chair/stool, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gp" = ( /obj/structure/table_frame, /turf/open/floor/plating{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gq" = ( @@ -1988,7 +1988,7 @@ "gs" = ( /obj/item/assembly/igniter, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid/level_two) "gt" = ( @@ -2029,13 +2029,13 @@ dir = 1 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gB" = ( /obj/machinery/mech_bay_recharge_port, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gC" = ( @@ -2045,7 +2045,7 @@ "gD" = ( /obj/structure/spawner/mining/hivelord, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gE" = ( @@ -2053,7 +2053,7 @@ dir = 4 }, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gF" = ( @@ -2061,7 +2061,7 @@ /obj/item/storage/toolbox/mechanical, /obj/item/clothing/glasses/material, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gG" = ( @@ -2077,12 +2077,12 @@ "gI" = ( /obj/structure/chair/stool, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gJ" = ( /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gK" = ( @@ -2100,25 +2100,25 @@ "gN" = ( /obj/structure/holohoop, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gO" = ( /obj/structure/closet/emcloset, /turf/open/floor/plasteel{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gP" = ( /obj/item/toy/beach_ball/holoball, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gQ" = ( /obj/structure/spawner/mining/basilisk, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gR" = ( @@ -2129,13 +2129,13 @@ amount = 12 }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gS" = ( /obj/structure/girder, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gT" = ( @@ -2149,7 +2149,7 @@ dir = 1 }, /turf/open/floor/plasteel/dark{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gV" = ( @@ -2158,7 +2158,7 @@ name = "rusted mine" }, /turf/open/floor/plating/asteroid/basalt{ - initial_gas_mix = "n2=23;o2=14" + initial_gas_mix = "n2=23;o2=14;TEMP=2.7" }, /area/awaymission/caves/BMP_asteroid) "gX" = ( diff --git a/_maps/RandomZLevels/away_mission/moonoutpost19.dmm b/_maps/RandomZLevels/away_mission/moonoutpost19.dmm index c3630055e9..177a7af984 100644 --- a/_maps/RandomZLevels/away_mission/moonoutpost19.dmm +++ b/_maps/RandomZLevels/away_mission/moonoutpost19.dmm @@ -862,7 +862,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "bY" = ( @@ -889,7 +889,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ca" = ( @@ -897,7 +897,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cb" = ( @@ -910,7 +910,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cc" = ( @@ -924,7 +924,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cd" = ( @@ -938,7 +938,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ce" = ( @@ -952,7 +952,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cf" = ( @@ -966,7 +966,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cg" = ( @@ -979,7 +979,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ch" = ( @@ -997,7 +997,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ci" = ( @@ -1075,7 +1075,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cp" = ( @@ -1092,7 +1092,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cr" = ( @@ -1122,7 +1122,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "ct" = ( @@ -1145,7 +1145,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cv" = ( @@ -1159,7 +1159,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cw" = ( @@ -1234,7 +1234,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cD" = ( @@ -1251,7 +1251,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cF" = ( @@ -1263,7 +1263,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cG" = ( @@ -1288,7 +1288,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cI" = ( @@ -1300,7 +1300,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cJ" = ( @@ -1311,7 +1311,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cK" = ( @@ -1330,7 +1330,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cL" = ( @@ -1345,7 +1345,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cM" = ( @@ -1400,7 +1400,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cR" = ( @@ -1409,7 +1409,7 @@ heat_capacity = 1e+006; icon_state = "damaged4"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cS" = ( @@ -1432,7 +1432,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cT" = ( @@ -1468,7 +1468,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cW" = ( @@ -1477,7 +1477,7 @@ heat_capacity = 1e+006; icon_state = "damaged2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cX" = ( @@ -1486,7 +1486,7 @@ heat_capacity = 1e+006; icon_state = "damaged3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cY" = ( @@ -1503,7 +1503,7 @@ dir = 1; heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "cZ" = ( @@ -1569,7 +1569,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "df" = ( @@ -1591,7 +1591,7 @@ dir = 1; heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dh" = ( @@ -1643,7 +1643,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dm" = ( @@ -1654,7 +1654,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dn" = ( @@ -1664,7 +1664,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "do" = ( @@ -1673,7 +1673,7 @@ heat_capacity = 1e+006; icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dp" = ( @@ -1687,7 +1687,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dq" = ( @@ -1784,7 +1784,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dx" = ( @@ -1806,7 +1806,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dz" = ( @@ -1835,7 +1835,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dC" = ( @@ -1843,7 +1843,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dD" = ( @@ -1855,7 +1855,7 @@ /turf/open/floor/plating{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dE" = ( @@ -1919,7 +1919,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/syndicate) "dJ" = ( @@ -4853,7 +4853,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "jB" = ( @@ -5105,7 +5105,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kd" = ( @@ -5117,7 +5117,7 @@ heat_capacity = 1e+006; icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ke" = ( @@ -5129,7 +5129,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kf" = ( @@ -5143,7 +5143,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kg" = ( @@ -5155,7 +5155,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kh" = ( @@ -5166,7 +5166,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ki" = ( @@ -5178,7 +5178,7 @@ heat_capacity = 1e+006; icon_state = "damaged3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kj" = ( @@ -5365,7 +5365,7 @@ heat_capacity = 1e+006; icon_state = "damaged2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kC" = ( @@ -5384,7 +5384,7 @@ heat_capacity = 1e+006; icon_state = "damaged4"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kE" = ( @@ -5392,7 +5392,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kF" = ( @@ -5401,7 +5401,7 @@ heat_capacity = 1e+006; icon_state = "damaged5"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kG" = ( @@ -5410,7 +5410,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kH" = ( @@ -5508,7 +5508,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "kR" = ( @@ -5697,7 +5697,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ll" = ( @@ -5709,7 +5709,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lm" = ( @@ -5819,7 +5819,7 @@ "lv" = ( /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lw" = ( @@ -5830,7 +5830,7 @@ }, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lx" = ( @@ -5842,7 +5842,7 @@ /obj/item/clothing/under/suit/waiter, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lA" = ( @@ -5858,7 +5858,7 @@ }, /turf/open/floor/plating{ initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lE" = ( @@ -5901,7 +5901,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lJ" = ( @@ -5911,7 +5911,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "lK" = ( @@ -5985,7 +5985,7 @@ /obj/item/gun/ballistic/shotgun/sc_pump, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "lW" = ( @@ -6057,7 +6057,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mi" = ( @@ -6107,7 +6107,7 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mn" = ( @@ -6123,7 +6123,7 @@ /obj/item/reagent_containers/food/snacks/meat/slab/monkey, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mo" = ( @@ -6139,7 +6139,7 @@ /obj/item/storage/fancy/egg_box, /turf/open/floor/plasteel/showroomfloor{ heat_capacity = 1e+006; - temperature = 273.15 + initial_temperature = 273.15 }, /area/awaymission/moonoutpost19/arrivals) "mp" = ( @@ -6204,7 +6204,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "my" = ( @@ -6368,7 +6368,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mQ" = ( @@ -6382,7 +6382,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "mR" = ( @@ -6459,7 +6459,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "na" = ( @@ -6515,7 +6515,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nj" = ( @@ -6528,7 +6528,7 @@ heat_capacity = 1e+006; icon_state = "damaged2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nk" = ( @@ -6587,7 +6587,7 @@ heat_capacity = 1e+006; icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nr" = ( @@ -6620,7 +6620,7 @@ /turf/open/floor/plasteel/cafeteria{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nx" = ( @@ -6644,7 +6644,7 @@ /turf/open/floor/plasteel/cafeteria{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "ny" = ( @@ -6657,7 +6657,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nz" = ( @@ -6710,7 +6710,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nE" = ( @@ -6723,7 +6723,7 @@ heat_capacity = 1e+006; icon_state = "platingdmg3"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nF" = ( @@ -6736,7 +6736,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nG" = ( @@ -6749,7 +6749,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nH" = ( @@ -6811,7 +6811,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nN" = ( @@ -6822,7 +6822,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nO" = ( @@ -6866,7 +6866,7 @@ heat_capacity = 1e+006; icon_state = "damaged1"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nT" = ( @@ -6906,7 +6906,7 @@ heat_capacity = 1e+006; icon_state = "floorscorched2"; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nY" = ( @@ -6918,7 +6918,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "nZ" = ( @@ -6947,7 +6947,7 @@ /turf/open/floor/plasteel{ heat_capacity = 1e+006; initial_gas_mix = "co2=48.7;n2=13.2;o2=32.4;TEMP=251"; - temperature = 251 + initial_temperature = 251 }, /area/awaymission/moonoutpost19/arrivals) "oc" = ( diff --git a/_maps/RandomZLevels/away_mission/snowdin.dmm b/_maps/RandomZLevels/away_mission/snowdin.dmm index 6fb71baa4c..aa4dd61154 100644 --- a/_maps/RandomZLevels/away_mission/snowdin.dmm +++ b/_maps/RandomZLevels/away_mission/snowdin.dmm @@ -2667,15 +2667,15 @@ /area/awaymission/snowdin/outside) "gc" = ( /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gd" = ( /obj/effect/spawner/lootdrop/crate_spawner, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "ge" = ( @@ -2685,8 +2685,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonheavy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gg" = ( @@ -3043,15 +3043,15 @@ "gU" = ( /obj/effect/decal/remains/human, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gV" = ( /obj/effect/decal/cleanable/blood/old, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "gW" = ( @@ -3350,8 +3350,8 @@ "hF" = ( /obj/structure/destructible/cult/pylon, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "hG" = ( @@ -3611,8 +3611,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonmid, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "im" = ( @@ -3621,8 +3621,8 @@ max_mobs = 5 }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "in" = ( @@ -3631,8 +3631,8 @@ name = "Caleb Reed" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "io" = ( @@ -4448,8 +4448,8 @@ name = "Jacob Ullman" }, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "jP" = ( @@ -5573,8 +5573,8 @@ /obj/structure/closet/crate/wooden, /obj/effect/spawner/lootdrop/snowdin/dungeonlite, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "lU" = ( @@ -7472,8 +7472,8 @@ "qg" = ( /obj/structure/flora/rock/pile/icy, /turf/open/floor/engine/cult{ - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120"; - temperature = 120 + initial_gas_mix = "n2=82;plasma=24;TEMP=120"; + initial_temperature = 120 }, /area/awaymission/snowdin/cave/cavern) "qh" = ( @@ -13145,7 +13145,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EG" = ( @@ -13159,7 +13159,7 @@ /turf/open/floor/mineral/plastitanium{ initial_gas_mix = "o2=22;n2=82;TEMP=180"; planetary_atmos = 1; - temperature = 180 + initial_temperature = 180 }, /area/awaymission/snowdin/cave) "EH" = ( diff --git a/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm b/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm index 7ef6fc25b1..de2105e9d4 100644 --- a/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm +++ b/_maps/RandomZLevels/away_mission/undergroundoutpost45.dmm @@ -816,7 +816,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 351.9 + initial_temperature = 351.9 }, /area/awaymission/undergroundoutpost45/caves) "bX" = ( @@ -824,7 +824,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 351.9 + initial_temperature = 351.9 }, /area/awaymission/undergroundoutpost45/caves) "bY" = ( @@ -2264,7 +2264,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "eK" = ( @@ -2635,7 +2635,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/central) "fo" = ( @@ -2871,7 +2871,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/central) "fK" = ( @@ -3050,7 +3050,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "gg" = ( @@ -3198,7 +3198,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "gC" = ( @@ -3412,7 +3412,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "he" = ( @@ -3423,7 +3423,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "hf" = ( @@ -3455,7 +3455,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "hi" = ( @@ -4790,7 +4790,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/gateway) "jM" = ( @@ -4824,7 +4824,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "jR" = ( @@ -6607,7 +6607,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/gateway) "mJ" = ( @@ -8357,7 +8357,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "pv" = ( @@ -8368,7 +8368,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "pw" = ( @@ -8380,7 +8380,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/engineering) "px" = ( @@ -8671,7 +8671,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qb" = ( @@ -8903,7 +8903,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qA" = ( @@ -8914,7 +8914,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qB" = ( @@ -8925,7 +8925,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "qC" = ( @@ -11107,7 +11107,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/crew_quarters) "uc" = ( @@ -11753,7 +11753,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "vm" = ( @@ -11979,7 +11979,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/research) "vI" = ( @@ -12265,7 +12265,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/mining) "wk" = ( @@ -13484,7 +13484,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/mining) "yh" = ( @@ -13493,7 +13493,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yi" = ( @@ -13502,7 +13502,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yj" = ( @@ -13513,7 +13513,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yk" = ( @@ -13523,7 +13523,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yl" = ( @@ -13534,7 +13534,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "ym" = ( @@ -13544,7 +13544,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yn" = ( @@ -13553,7 +13553,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yo" = ( @@ -13563,7 +13563,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yp" = ( @@ -13573,7 +13573,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yq" = ( @@ -13582,7 +13582,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yr" = ( @@ -13591,7 +13591,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yt" = ( @@ -13601,7 +13601,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yu" = ( @@ -13611,7 +13611,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yw" = ( @@ -13621,7 +13621,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yz" = ( @@ -13630,7 +13630,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yA" = ( @@ -13640,7 +13640,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yB" = ( @@ -13649,7 +13649,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yC" = ( @@ -13659,7 +13659,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yD" = ( @@ -13670,7 +13670,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "yH" = ( @@ -13681,7 +13681,7 @@ heat_capacity = 1e+006; initial_gas_mix = "co2=173.4;n2=135.1;plasma=229.8;TEMP=351.9"; name = "Cave Floor"; - temperature = 363.9 + initial_temperature = 363.9 }, /area/awaymission/undergroundoutpost45/caves) "KE" = ( diff --git a/_maps/map_files/BoxStation/BoxStation.dmm b/_maps/map_files/BoxStation/BoxStation.dmm index aacedbca82..cf15bd05e1 100644 --- a/_maps/map_files/BoxStation/BoxStation.dmm +++ b/_maps/map_files/BoxStation/BoxStation.dmm @@ -6158,19 +6158,18 @@ /turf/open/floor/plasteel, /area/security/brig) "alu" = ( -/obj/machinery/nuclearbomb/selfdestruct, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/door/window{ + name = "Gateway Chamber"; + req_access_txt = "62" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ 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/command/nuke_storage) +/area/command/gateway) "alv" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/door/poddoor/preopen{ @@ -6691,20 +6690,6 @@ "amC" = ( /turf/open/floor/plating, /area/maintenance/port/fore) -"amD" = ( -/obj/item/trash/sosjerky, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"amE" = ( -/obj/item/electronics/airalarm, -/obj/item/circuitboard/machine/seed_extractor, -/obj/structure/table, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 4; - name = "4maintenance loot spawner" - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "amF" = ( /obj/machinery/atmospherics/components/unary/tank/air, /turf/open/floor/plating, @@ -6978,37 +6963,12 @@ }, /turf/open/floor/plating, /area/maintenance/solars/port/fore) -"anj" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) "ank" = ( /obj/machinery/door/airlock/maintenance/abandoned{ req_access_txt = "12" }, /turf/open/floor/plating, /area/maintenance/port/fore) -"anl" = ( -/obj/structure/bed, -/obj/effect/landmark/xeno_spawn, -/obj/item/bedsheet, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"anm" = ( -/obj/machinery/computer/slot_machine{ - balance = 15; - money = 500 - }, -/obj/item/coin/iron, -/obj/item/coin/diamond, -/obj/item/coin/diamond, -/obj/item/coin/diamond, -/turf/open/floor/plating, -/area/maintenance/port/fore) "ann" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -10470,8 +10430,8 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/turf/closed/wall, -/area/maintenance/fore) +/turf/open/floor/plating, +/area/maintenance/port/fore) "awb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -11031,21 +10991,15 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "axp" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/turf/open/floor/plating, -/area/maintenance/port/fore) -"axq" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, -/area/maintenance/fore) +/area/maintenance/port/fore) "axr" = ( /obj/structure/cable{ icon_state = "4-8" @@ -11056,6 +11010,9 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/fore) "axt" = ( @@ -11071,19 +11028,15 @@ /turf/open/floor/plating, /area/maintenance/fore) "axu" = ( -/obj/structure/disposalpipe/segment{ - dir = 6 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/structure/cable{ - icon_state = "2-4" +/obj/structure/disposalpipe/segment{ + dir = 4 }, /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/fore) "axw" = ( @@ -11423,33 +11376,38 @@ /turf/open/floor/plating, /area/maintenance/port/fore) "ayz" = ( -/turf/closed/wall/r_wall, -/area/maintenance/port/fore) -"ayA" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/disposalpipe/segment{ + dir = 4 }, /turf/open/floor/plating, /area/maintenance/fore) -"ayD" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/maintenance/fore) -"ayE" = ( -/turf/closed/wall/r_wall, -/area/maintenance/fore) "ayG" = ( -/turf/closed/wall/r_wall, -/area/command/gateway) -"ayH" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/fore) +"ayH" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/maintenance/fore) "ayI" = ( @@ -11810,35 +11768,31 @@ /obj/item/ectoplasm, /turf/open/floor/wood, /area/maintenance/port/fore) -"azH" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/service/theater) -"azI" = ( -/obj/structure/table/wood, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/item/instrument/eguitar, -/turf/open/floor/wood, -/area/service/theater) "azK" = ( -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) -"azN" = ( -/obj/machinery/light{ +/obj/structure/disposalpipe/segment{ dir = 4 }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"azN" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "azO" = ( /obj/structure/cable{ icon_state = "1-4" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, @@ -12287,38 +12241,6 @@ /obj/item/pen/fourcolor, /turf/open/floor/plasteel, /area/commons/dorms) -"aBa" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) -"aBb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) -"aBc" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) -"aBe" = ( -/turf/open/floor/plasteel/dark, -/area/command/gateway) -"aBf" = ( -/obj/effect/turf_decal/bot_white, -/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/command/gateway) -"aBg" = ( -/obj/machinery/gateway/centerstation, -/turf/open/floor/plasteel/dark, -/area/command/gateway) "aBh" = ( /obj/machinery/camera{ c_tag = "EVA Maintenance"; @@ -12327,9 +12249,6 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-8" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -12337,16 +12256,6 @@ /turf/open/floor/plating, /area/maintenance/fore) "aBi" = ( -/obj/machinery/power/apc{ - areastring = "/area/command/gateway"; - dir = 8; - name = "Gateway APC"; - pixel_x = -25; - pixel_y = -1 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 }, @@ -12468,13 +12377,6 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics/garden) -"aBx" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aBy" = ( /obj/machinery/door/airlock{ desc = "A small bathroom with a sink, toilet and shower."; @@ -12483,12 +12385,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aBz" = ( -/obj/machinery/shower{ - dir = 4 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aBA" = ( /obj/structure/cable{ icon_state = "4-8" @@ -12602,42 +12498,33 @@ /turf/closed/wall, /area/commons/storage/primary) "aBR" = ( -/turf/closed/wall/r_wall, -/area/commons/storage/primary) -"aBT" = ( -/obj/machinery/computer/bank_machine, -/obj/effect/turf_decal/bot_white, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 +/turf/closed/wall, +/area/commons/storage/primary) +"aBW" = ( +/obj/structure/cable{ + icon_state = "4-8" }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) -"aBU" = ( -/obj/machinery/atmospherics/pipe/manifold4w/supply, -/turf/open/floor/wood, -/area/service/theater) -"aBV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/area/command/gateway) +"aBX" = ( +/obj/machinery/power/apc{ + areastring = "/area/ai_monitored/command/nuke_storage"; + dir = 1; + name = "Vault APC"; + pixel_y = 23 }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "0-2" }, -/turf/open/floor/wood, -/area/service/theater) -"aBW" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) +"aBZ" = ( /obj/structure/filingcabinet, /obj/item/folder/documents, /obj/effect/turf_decal/bot_white, @@ -12653,51 +12540,6 @@ }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) -"aBX" = ( -/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 - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) -"aBY" = ( -/obj/effect/turf_decal/bot_white/right, -/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/command/gateway) -"aBZ" = ( -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/effect/turf_decal/bot_white, -/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/command/gateway) "aCa" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -12743,12 +12585,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/command/storage/eva) -"aCh" = ( -/obj/machinery/vending/autodrobe, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater) "aCi" = ( /obj/structure/cable, /obj/effect/spawner/structure/window/reinforced, @@ -12799,7 +12635,16 @@ /turf/open/floor/plasteel/white/corner, /area/hallway/secondary/entry) "aCr" = ( -/turf/closed/wall, +/obj/structure/closet/crate{ + name = "instrument crate" + }, +/obj/item/instrument/eguitar, +/obj/item/instrument/violin, +/obj/item/instrument/trumpet, +/obj/item/instrument/guitar, +/obj/item/instrument/trombone, +/obj/item/instrument/piano_synth, +/turf/open/floor/wood, /area/service/theater) "aCs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -13147,14 +12992,28 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aDi" = ( -/obj/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/command/gateway) +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) "aDj" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/nuclearbomb/selfdestruct, +/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/command/gateway) +/area/ai_monitored/command/nuke_storage) "aDk" = ( /obj/structure/table, /obj/item/assembly/igniter{ @@ -13220,17 +13079,37 @@ /obj/machinery/vending/tool, /turf/open/floor/plasteel, /area/commons/storage/primary) -"aDr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) "aDs" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/bot_white/right, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"aDt" = ( +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"aDv" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/disposalpipe/sorting/mail/flip{ + dir = 1; + sortType = 18 + }, +/turf/open/floor/plating, +/area/maintenance/fore) +"aDx" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/effect/turf_decal/bot_white/left, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -13241,49 +13120,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, /turf/open/floor/plasteel/dark, /area/ai_monitored/command/nuke_storage) -"aDt" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) -"aDv" = ( -/obj/structure/window/reinforced, -/obj/structure/chair/stool, -/turf/open/floor/wood, -/area/service/theater) -"aDw" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) -"aDx" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/window{ - name = "Gateway Chamber"; - req_access_txt = "62" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) -"aDy" = ( -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/command/gateway) "aDz" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -13412,25 +13254,6 @@ "aDM" = ( /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aDN" = ( -/obj/machinery/camera{ - c_tag = "Bathrooms"; - dir = 1 - }, -/obj/structure/urinal{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) -"aDP" = ( -/obj/machinery/shower{ - dir = 8; - pixel_y = -4 - }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/landmark/start/assistant, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "aDQ" = ( /obj/machinery/door/airlock{ desc = "A small bathroom with a sink, toilet and shower."; @@ -13440,36 +13263,6 @@ /obj/machinery/door/firedoor, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aDR" = ( -/obj/machinery/light/small{ - dir = 1 - }, -/turf/open/floor/wood, -/area/service/bar) -"aDT" = ( -/obj/item/soap, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light/small{ - dir = 1; - light_color = "#ffc1c1" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) -"aDU" = ( -/obj/machinery/shower{ - dir = 4 - }, -/obj/item/radio/intercom{ - pixel_y = 25 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) -"aDY" = ( -/obj/structure/window{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aDZ" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13497,12 +13290,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aEc" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aEd" = ( /obj/structure/cable{ icon_state = "4-8" @@ -13709,50 +13496,13 @@ /turf/open/floor/plasteel, /area/service/hydroponics/garden) "aEM" = ( -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) -"aEN" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/structure/closet/crate/goldcrate, -/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/command/nuke_storage) -"aEO" = ( /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) -"aEP" = ( -/obj/effect/turf_decal/bot_white/left, -/obj/structure/closet/crate/silvercrate, -/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/command/nuke_storage) -"aEQ" = ( -/obj/machinery/computer/gateway_control, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/command/gateway) -"aER" = ( +"aEN" = ( /obj/machinery/camera{ c_tag = "Gateway"; dir = 4 @@ -13765,7 +13515,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/command/gateway) -"aES" = ( +"aEO" = ( /obj/structure/table, /obj/item/radio/off{ pixel_y = 6 @@ -13781,14 +13531,7 @@ /obj/item/radio/off, /turf/open/floor/plasteel, /area/command/gateway) -"aET" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/command/gateway) -"aEU" = ( +"aEP" = ( /obj/structure/table, /obj/machinery/recharger, /obj/structure/sign/warning/biohazard{ @@ -13796,6 +13539,31 @@ }, /turf/open/floor/plasteel, /area/command/gateway) +"aEQ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) +"aER" = ( +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) +"aET" = ( +/obj/effect/turf_decal/bot_white/left, +/obj/structure/closet/crate/silvercrate, +/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/command/nuke_storage) "aEV" = ( /obj/structure/reagent_dispensers/watertank, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -13869,20 +13637,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/commons/dorms) -"aFk" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) -"aFl" = ( -/obj/structure/festivus{ - anchored = 1; - desc = "A pole for dancing."; - name = "pole" - }, -/turf/open/floor/wood, -/area/service/bar) "aFm" = ( /obj/structure/disposalpipe/segment{ dir = 6 @@ -14142,26 +13896,46 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aFV" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/bot_white/right, +/obj/machinery/ore_silo, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/meter, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/fore) +/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/command/nuke_storage) "aFW" = ( -/obj/structure/chair/stool, -/turf/open/floor/plasteel, -/area/command/gateway) -"aFX" = ( -/obj/item/radio/intercom{ - name = "Station Intercom (General)"; - pixel_x = -30 +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/camera/motion{ + c_tag = "Vault"; + dir = 1; + network = list("vault") + }, +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/command/gateway) +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) +"aFX" = ( +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) "aFY" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -14180,56 +13954,35 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aGa" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) -"aGb" = ( -/obj/effect/turf_decal/bot_white/right, -/obj/machinery/ore_silo, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/structure/chair/stool, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ +/turf/open/floor/plasteel, +/area/command/gateway) +"aGb" = ( +/obj/item/radio/intercom{ + name = "Station Intercom (General)"; + pixel_x = -30 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/turf/open/floor/plasteel, +/area/command/gateway) "aGc" = ( -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/machinery/camera/motion{ - c_tag = "Vault"; - dir = 1; - network = list("vault") - }, -/obj/machinery/light, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/turf/open/floor/plasteel, +/area/command/gateway) "aGd" = ( /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) -"aGf" = ( -/obj/machinery/firealarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, /turf/open/floor/plasteel, /area/command/gateway) @@ -14318,24 +14071,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/command/storage/eva) -"aGr" = ( -/obj/structure/chair/stool, -/obj/effect/landmark/start/clown, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - 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/service/theater) "aGs" = ( /obj/machinery/suit_storage_unit/rd, /turf/open/floor/plasteel/cafeteria, @@ -14352,50 +14087,12 @@ /obj/effect/turf_decal/tile/blue, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"aGv" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/theater) -"aGw" = ( -/obj/machinery/light/small{ - dir = 4 - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "aGx" = ( /obj/item/radio/intercom{ pixel_x = -25 }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet) -"aGy" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) -"aGz" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/obj/structure/disposalpipe/segment{ - dir = 5 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aGA" = ( /obj/structure/cable{ icon_state = "2-4" @@ -14437,26 +14134,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aGD" = ( -/obj/structure/table/wood, -/obj/structure/mirror{ - pixel_x = -28 - }, -/obj/item/flashlight/lamp/bananalamp{ - pixel_y = 3 - }, -/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/service/theater) "aGE" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -14708,14 +14385,10 @@ /turf/open/floor/wood/wood_large, /area/service/chapel/office) "aHh" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/command/gateway) +/obj/structure/sign/warning/securearea, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/command/nuke_storage) "aHi" = ( /obj/machinery/door/morgue{ name = "Confession Booth (Chaplain)"; @@ -14724,17 +14397,29 @@ /turf/open/floor/plasteel/dark, /area/service/chapel/office) "aHj" = ( -/obj/machinery/light_switch{ - pixel_x = -20 - }, +/obj/effect/mapping_helpers/airlock/locked, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/manifold/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, -/area/command/gateway) +/obj/machinery/door/airlock/vault{ + name = "Vault Door"; + req_access_txt = "53" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) "aHk" = ( /obj/effect/decal/cleanable/cobweb/cobweb2, /obj/structure/table/wood, @@ -14787,12 +14472,6 @@ dir = 4 }, /area/hallway/secondary/entry) -"aHv" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/command/gateway) "aHw" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -14875,19 +14554,14 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aHF" = ( -/obj/structure/sign/warning/securearea, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) -"aHG" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "aHH" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/public/glass{ @@ -14901,47 +14575,37 @@ /turf/open/floor/plasteel, /area/commons/dorms) "aHI" = ( -/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, +/obj/structure/chair/stool, +/turf/open/floor/wood, /area/service/theater) "aHJ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, -/area/command/gateway) +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/maintenance/fore) "aHK" = ( -/obj/structure/closet/secure_closet/freezer/cream_pie, -/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, +/turf/open/floor/wood, /area/service/theater) "aHL" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 24 +/obj/machinery/computer/bank_machine, +/obj/effect/turf_decal/bot_white, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/closet/l3closet/scientist, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/command/gateway) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) "aHM" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 @@ -15043,12 +14707,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aHZ" = ( -/obj/machinery/light/small{ - dir = 8 - }, -/turf/open/floor/wood, -/area/service/bar) "aIa" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -15056,12 +14714,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/fore) -"aIb" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/open/floor/plating, -/area/maintenance/starboard/fore) "aIc" = ( /obj/machinery/power/apc{ areastring = "/area/service/bar"; @@ -15431,15 +15083,13 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aIV" = ( -/obj/machinery/button/door{ - id = "stationawaygate"; - name = "Gateway Access Shutter Control"; - pixel_x = -1; - pixel_y = -24; - req_access_txt = "31" +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "0-2" }, -/turf/open/floor/plasteel, -/area/command/gateway) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/command/nuke_storage) "aIW" = ( /obj/structure/table, /obj/item/crowbar, @@ -15468,9 +15118,8 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/command/gateway) +/area/ai_monitored/command/nuke_storage) "aJb" = ( /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, @@ -15481,10 +15130,15 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aJe" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" }, -/turf/open/floor/wood, /area/service/theater) "aJf" = ( /obj/machinery/camera{ @@ -15507,19 +15161,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) -"aJh" = ( -/turf/open/floor/plasteel, -/area/command/gateway) "aJi" = ( +/obj/machinery/light_switch{ + pixel_y = 28 + }, /obj/machinery/light{ - dir = 4 + dir = 1 }, -/obj/structure/closet/secure_closet/exile, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/command/gateway) +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) "aJj" = ( /obj/structure/table, /obj/item/stack/sheet/glass/fifty, @@ -15546,13 +15196,6 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/command/storage/eva) -"aJk" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Bar Back Room" - }, -/turf/open/floor/plasteel/dark, -/area/service/bar) "aJl" = ( /obj/structure/tank_dispenser/oxygen, /obj/machinery/light{ @@ -15898,26 +15541,33 @@ /turf/open/floor/plasteel, /area/commons/storage/primary) "aKc" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock/command{ - name = "Gateway Access"; - req_access_txt = "62" - }, /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/command/gateway) -"aKd" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "stationawaygate"; - name = "Gateway Access Shutters" +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, -/area/command/gateway) +/area/ai_monitored/command/nuke_storage) +"aKd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port) "aKe" = ( /obj/structure/chair/wood/normal{ dir = 4 @@ -15993,59 +15643,28 @@ }, /turf/open/floor/wood, /area/service/bar) -"aKr" = ( -/obj/machinery/vending/snack/orange, -/obj/machinery/light{ - dir = 1 - }, -/obj/structure/sign/poster/contraband/donut_corp{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/service/bar) "aKs" = ( /obj/structure/disposalpipe/segment, /obj/effect/spawner/structure/window, /turf/open/floor/plating, /area/commons/storage/primary) -"aKu" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel/dark, -/area/service/theater) "aKw" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/door/firedoor, -/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/door/airlock/public/glass{ - name = "Central Access" - }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/dark, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, /area/service/theater) "aKy" = ( -/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "1-2" + icon_state = "4-8" }, -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" +/obj/structure/cable{ + icon_state = "0-4" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/maintenance/fore) +/area/hallway/primary/port) "aKz" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 @@ -16053,17 +15672,15 @@ /turf/open/floor/wood, /area/service/bar) "aKA" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/poddoor/shutters{ - id = "stationawaygate"; - name = "Gateway Access Shutters" +/obj/structure/cable{ + icon_state = "0-8" }, -/turf/open/floor/plasteel, -/area/command/gateway) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port) "aKB" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall/r_wall, -/area/command/gateway) +/turf/closed/wall, +/area/hallway/primary/port) "aKC" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -16109,13 +15726,6 @@ /obj/structure/closet/secure_closet/hydroponics, /turf/open/floor/plasteel, /area/service/hydroponics) -"aKJ" = ( -/obj/machinery/vending/cola/black, -/obj/structure/sign/poster/contraband/starkist{ - pixel_y = 32 - }, -/turf/open/floor/wood, -/area/service/bar) "aKL" = ( /obj/machinery/airalarm{ pixel_y = 24 @@ -16142,19 +15752,6 @@ }, /turf/open/floor/wood, /area/service/bar) -"aKN" = ( -/obj/structure/table/wood/fancy, -/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 - }, -/turf/open/floor/wood, -/area/service/bar) "aKO" = ( /obj/machinery/disposal/bin, /obj/structure/disposalpipe/trunk{ @@ -16329,8 +15926,8 @@ /area/hallway/primary/port) "aLl" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plasteel, /area/hallway/primary/port) @@ -16338,19 +15935,12 @@ /obj/machinery/light{ dir = 1 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 +/obj/machinery/door/firedoor, +/obj/machinery/camera{ + c_tag = "Port Hallway 2" }, /turf/open/floor/plasteel, /area/hallway/primary/port) -"aLn" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "aLo" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -16361,14 +15951,15 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 }, /turf/open/floor/plasteel, /area/hallway/primary/port) "aLq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -16487,27 +16078,17 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aLL" = ( -/obj/machinery/camera{ - c_tag = "Port Hallway 2" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) "aLM" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel, -/area/hallway/primary/port) -"aLN" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/area/commons/storage/primary) "aLO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -16518,14 +16099,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aLP" = ( -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/wood, +/area/service/theater) "aLQ" = ( /obj/machinery/camera{ c_tag = "Central Hallway North-East" @@ -16552,12 +16134,11 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aLT" = ( -/obj/machinery/door/firedoor, -/obj/effect/turf_decal/stripes/corner{ +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/turf/open/floor/wood, +/area/service/theater) "aLU" = ( /obj/machinery/airalarm{ dir = 4; @@ -16706,9 +16287,6 @@ }, /turf/open/floor/wood, /area/service/bar) -"aMr" = ( -/turf/open/floor/wood, -/area/service/theater) "aMs" = ( /obj/structure/disposalpipe/segment{ dir = 5 @@ -16843,20 +16421,11 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/carpet, /area/hallway/secondary/entry) -"aMQ" = ( -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) "aMR" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "aMS" = ( @@ -16870,31 +16439,36 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aMU" = ( -/obj/structure/disposalpipe/segment, -/obj/structure/cable{ - icon_state = "1-2" +/obj/effect/turf_decal/bot_white/right, +/obj/structure/closet/crate/goldcrate, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) "aMV" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "aMX" = ( /turf/open/floor/wood/wood_large, /area/service/chapel/office) "aMY" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, /turf/open/floor/plasteel, /area/hallway/primary/port) "aMZ" = ( @@ -17151,9 +16725,6 @@ /obj/structure/cable{ icon_state = "2-4" }, -/obj/structure/cable{ - icon_state = "1-2" - }, /obj/structure/disposalpipe/segment{ dir = 4 }, @@ -17282,17 +16853,9 @@ /turf/open/floor/plasteel, /area/hallway/secondary/entry) "aOi" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/circuit, +/area/ai_monitored/command/nuke_storage) "aOj" = ( /obj/structure/table/wood, /obj/item/storage/fancy/cigarettes{ @@ -17363,25 +16926,14 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aOs" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel, -/area/hallway/primary/port) -"aOt" = ( +/obj/structure/disposalpipe/segment, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/machinery/light, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/machinery/meter, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) "aOv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -17392,35 +16944,28 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aOw" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/structure/disposalpipe/segment{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/plasteel, -/area/hallway/primary/port) +/obj/machinery/light, +/obj/effect/turf_decal/tile/neutral, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/ai_monitored/command/nuke_storage) "aOx" = ( /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 1 - }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) "aOy" = ( /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /obj/structure/cable{ icon_state = "1-8" }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel, /area/hallway/primary/port) "aOz" = ( @@ -17506,9 +17051,25 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aOH" = ( -/obj/structure/window/reinforced, -/turf/open/floor/wood, -/area/service/theater) +/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/command/nuke_storage) "aOI" = ( /obj/structure/kitchenspike, /turf/open/floor/plasteel/showroomfloor, @@ -19528,12 +19089,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aUn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUo" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -19541,63 +19096,12 @@ }, /turf/open/floor/plasteel, /area/commons/locker) -"aUp" = ( -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/window{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) -"aUs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUt" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/commons/locker) -"aUu" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/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/commons/locker) "aUv" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -19766,12 +19270,6 @@ /obj/item/flashlight/lamp/green, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aUX" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aUY" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20374,16 +19872,6 @@ /obj/item/clothing/head/beret/black, /turf/open/floor/plasteel, /area/commons/locker) -"aWo" = ( -/obj/machinery/camera{ - c_tag = "Locker Room West"; - dir = 1 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aWp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -20926,13 +20414,6 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) -"aXp" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aXq" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21247,13 +20728,6 @@ }, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aYe" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aYf" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -21713,17 +21187,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/wood, /area/commons/vacant_room/office) -"aZo" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "aZp" = ( /obj/structure/rack, /obj/item/electronics/apc, @@ -21791,28 +21254,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet/locker) -"aZw" = ( -/obj/effect/landmark/blobstart, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) -"aZx" = ( -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 8 - }, -/obj/structure/window, -/obj/structure/window{ - dir = 8 - }, -/obj/effect/turf_decal/tile/yellow{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "aZy" = ( /obj/machinery/camera{ c_tag = "Conference Room" @@ -22140,14 +21581,6 @@ }, /turf/open/floor/wood, /area/service/library) -"baw" = ( -/obj/machinery/camera{ - c_tag = "Locker Room Toilets"; - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bax" = ( /obj/structure/chair/comfy/black{ dir = 4 @@ -22278,10 +21711,6 @@ }, /turf/open/floor/plating, /area/maintenance/port) -"baO" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "baP" = ( /obj/structure/table/wood, /obj/item/storage/fancy/donut_box, @@ -22461,13 +21890,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) -"bbq" = ( -/obj/machinery/light{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bbs" = ( /obj/structure/window/reinforced{ dir = 8 @@ -22831,9 +22253,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"bct" = ( -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "bcu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/door/airlock/maintenance{ @@ -23314,13 +22733,6 @@ }, /turf/open/floor/carpet, /area/command/meeting_room) -"bdJ" = ( -/obj/machinery/door/airlock{ - id_tag = "LockerShitter3"; - name = "Unit 3" - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "bdK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -23328,18 +22740,6 @@ /obj/machinery/holopad/secure, /turf/open/floor/carpet, /area/command/meeting_room) -"bdL" = ( -/obj/machinery/light, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/bedsheetbin/color, -/obj/structure/table, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) "bdN" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -24000,24 +23400,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating, /area/maintenance/port) -"bfr" = ( -/obj/structure/noticeboard{ - dir = 8; - pixel_x = 27 - }, -/obj/machinery/light{ - dir = 4 - }, -/turf/open/floor/wood, -/area/command/meeting_room) -"bfs" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bft" = ( /obj/machinery/status_display/ai, +/obj/structure/cable{ + icon_state = "4-8" + }, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) "bfu" = ( @@ -24026,13 +23413,6 @@ }, /turf/closed/wall/r_wall, /area/ai_monitored/turret_protected/ai_upload) -"bfv" = ( -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) -"bfw" = ( -/obj/machinery/status_display/evac, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bfx" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 8 @@ -24055,12 +23435,6 @@ }, /turf/open/floor/wood, /area/command/heads_quarters/captain) -"bfz" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/turf/closed/wall/r_wall, -/area/ai_monitored/turret_protected/ai_upload) "bfA" = ( /obj/structure/table/wood, /obj/item/hand_tele, @@ -24355,13 +23729,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/port) -"bgr" = ( -/obj/machinery/door/airlock{ - id_tag = "LockerShitter4"; - name = "Unit 4" - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "bgt" = ( /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, @@ -24496,11 +23863,10 @@ /turf/open/floor/wood, /area/command/meeting_room) "bgM" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/meeting_room) +/obj/structure/sign/warning/securearea, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/closed/wall/r_wall, +/area/ai_monitored/command/nuke_storage) "bgN" = ( /turf/open/floor/plasteel/dark, /area/engineering/gravity_generator) @@ -24518,52 +23884,6 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"bgS" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgT" = ( -/obj/machinery/computer/communications{ - dir = 8 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) -"bgU" = ( -/obj/structure/chair/comfy/brown{ - dir = 4 - }, -/obj/effect/landmark/start/captain, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/wood, -/area/command/heads_quarters/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/command/heads_quarters/captain) -"bgW" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/structure/cable{ - icon_state = "2-8" - }, -/obj/machinery/holopad/secure, -/turf/open/floor/wood, -/area/command/heads_quarters/captain) "bgX" = ( /obj/structure/table/wood, /obj/machinery/airalarm{ @@ -25719,26 +25039,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "bjy" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ +/obj/structure/window/reinforced, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 8 }, -/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/machinery/airalarm{ - dir = 8; - pixel_x = 24 - }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/area/command/gateway) "bjz" = ( /turf/closed/wall/r_wall, /area/maintenance/central) @@ -28679,32 +27985,39 @@ /turf/open/floor/plasteel, /area/command/heads_quarters/hop) "bqD" = ( -/obj/machinery/vending/coffee, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"bqE" = ( /obj/structure/cable{ icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"bqF" = ( -/obj/machinery/vending/cigarette/beach, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"bqG" = ( -/obj/structure/reagent_dispensers/water_cooler, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" + dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/turf/open/floor/plasteel, +/area/command/gateway) +"bqE" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/command/gateway) +"bqF" = ( +/obj/machinery/button/door{ + id = "stationawaygate"; + name = "Gateway Access Shutter Control"; + pixel_x = -1; + pixel_y = -24; + req_access_txt = "31" + }, +/turf/open/floor/plasteel, +/area/command/gateway) +"bqG" = ( +/obj/machinery/light{ + dir = 4 + }, +/obj/structure/closet/secure_closet/exile, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "bqH" = ( /turf/closed/wall/r_wall, /area/command/teleporter) @@ -29300,26 +28613,20 @@ /turf/open/floor/plasteel, /area/command/heads_quarters/hop) "bsa" = ( -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) -"bsb" = ( -/obj/structure/table, -/obj/item/hand_labeler, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/obj/machinery/door/firedoor, +/obj/machinery/door/airlock/command{ + name = "Gateway Access"; + req_access_txt = "62" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/command/gateway) "bsc" = ( /turf/open/floor/plasteel, /area/engineering/gravity_generator) -"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/command/teleporter) @@ -30488,7 +29795,7 @@ /obj/machinery/keycard_auth{ pixel_x = -24 }, -/obj/machinery/computer/cargo{ +/obj/machinery/computer/cargo/request{ dir = 4 }, /obj/effect/turf_decal/tile/blue{ @@ -30515,10 +29822,6 @@ /obj/item/hand_labeler, /turf/open/floor/plasteel, /area/command/heads_quarters/hop) -"buQ" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "buT" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -30988,9 +30291,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/structure/cable{ icon_state = "1-2" }, @@ -31028,20 +30328,16 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bwb" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/structure/chair/stool{ + pixel_y = 8 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 +/turf/open/floor/carpet{ + icon_state = "carpetsymbol" }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/area/service/theater) "bwc" = ( /obj/structure/disposalpipe/segment, /obj/structure/cable{ @@ -31093,9 +30389,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /turf/open/floor/plasteel, /area/hallway/primary/central) "bwi" = ( @@ -31346,7 +30639,7 @@ /turf/open/floor/plasteel, /area/cargo/qm) "bwT" = ( -/obj/machinery/door/airlock/mining/glass{ +/obj/machinery/door/airlock/command{ name = "Quartermaster"; req_access_txt = "41" }, @@ -31611,7 +30904,7 @@ /turf/open/floor/plasteel, /area/security/checkpoint/science) "bxw" = ( -/obj/machinery/door/airlock/mining/glass{ +/obj/machinery/door/airlock/command{ name = "Quartermaster"; req_access_txt = "41" }, @@ -32307,14 +31600,12 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "byS" = ( -/obj/structure/disposalpipe/segment{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/hallway/primary/central) +/turf/open/floor/wood, +/area/service/theater) "byT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -33931,16 +33222,6 @@ }, /turf/open/floor/plasteel, /area/service/janitor) -"bCx" = ( -/obj/structure/cable{ - icon_state = "1-8" - }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/command/gateway) "bCy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, @@ -37810,7 +37091,7 @@ dir = 8 }, /turf/open/floor/plating{ - initial_gas_mix = "o2=0.01;n2=0.01"; + initial_gas_mix = "o2=0.01;n2=0.01;TEMP=2.7"; luminosity = 2 }, /area/science/test_area) @@ -39522,19 +38803,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/circuit) -"bPM" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/effect/turf_decal/stripes/line, -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel, -/area/science/circuit) "bPN" = ( /turf/closed/wall, /area/science/misc_lab) @@ -40720,13 +39988,6 @@ }, /turf/open/floor/engine, /area/science/misc_lab) -"bTo" = ( -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/turf/open/floor/plasteel/white, -/area/science/circuit) "bTp" = ( /obj/structure/table/reinforced, /obj/item/stack/sheet/glass/fifty, @@ -42255,10 +41516,6 @@ "bXs" = ( /turf/open/floor/plasteel/white, /area/science/circuit) -"bXt" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, -/area/science/circuit) "bXv" = ( /obj/item/stack/rods, /turf/open/space, @@ -45330,10 +44587,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/misc_lab) -"cfv" = ( -/obj/structure/plasticflaps/opaque, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "cfw" = ( /turf/closed/wall/r_wall, /area/maintenance/solars/port/aft) @@ -46248,6 +45501,9 @@ /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) "chP" = ( @@ -47990,6 +47246,14 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"cmP" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#e8eaff" + }, +/obj/machinery/vending/snack/random, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "cmU" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/miner/nitrogen, @@ -51072,11 +50336,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/processing) -"cxW" = ( -/obj/structure/lattice, -/obj/structure/lattice/catwalk, -/turf/open/space, -/area/space/nearstation) "cxY" = ( /obj/machinery/camera{ c_tag = "Arrivals Escape Pod 1"; @@ -51733,16 +50992,6 @@ /obj/effect/landmark/event_spawn, /turf/open/floor/plating, /area/service/hydroponics) -"cBh" = ( -/obj/effect/landmark/event_spawn, -/obj/effect/turf_decal/tile/blue{ - dir = 4 - }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) "cBi" = ( /obj/effect/landmark/event_spawn, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -51776,16 +51025,6 @@ /obj/machinery/light, /turf/open/floor/plasteel, /area/hallway/primary/starboard) -"cBn" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "cBo" = ( /obj/effect/landmark/event_spawn, /turf/open/floor/wood, @@ -52246,30 +51485,12 @@ /obj/structure/closet/boxinggloves, /turf/open/floor/plasteel, /area/commons/fitness) -"cFG" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 1 - }, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 - }, -/obj/structure/mirror{ - pixel_x = 28 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "cGf" = ( /obj/structure/sign/poster/contraband/random{ pixel_y = 32 }, /turf/open/floor/plating, /area/maintenance/port/fore) -"cGz" = ( -/obj/structure/table/wood, -/obj/item/instrument/violin, -/turf/open/floor/wood, -/area/service/theater) "cHf" = ( /obj/structure/cable{ icon_state = "4-8" @@ -52606,9 +51827,9 @@ /turf/closed/wall, /area/service/lawoffice) "cJW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) +/obj/machinery/computer/gateway_control, +/turf/open/floor/plasteel, +/area/command/gateway) "cKC" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -52832,10 +52053,6 @@ "cPb" = ( /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) -"cPn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet) "cPA" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 4 @@ -52890,11 +52107,9 @@ /turf/open/floor/plating, /area/service/abandoned_gambling_den) "cQT" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 8; - light_color = "#e8eaff" - }, +/obj/structure/table, +/obj/item/hand_labeler, +/obj/item/folder/blue, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "cSA" = ( @@ -53237,12 +52452,6 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) -"cTT" = ( -/obj/structure/cable{ - icon_state = "1-4" - }, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) "cTX" = ( /obj/structure/cable{ icon_state = "0-2" @@ -53265,12 +52474,25 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) -"cUx" = ( +"cUb" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/turf/open/floor/plasteel/dark, -/area/command/meeting_room) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/grille/broken, +/obj/effect/decal/cleanable/blood/old, +/obj/item/kirbyplants/random, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"cUx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/ai_monitored/command/nuke_storage) "cVb" = ( /turf/closed/wall, /area/hallway/secondary/service) @@ -53356,13 +52578,20 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"ddI" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +"ddl" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plating, -/area/maintenance/port/fore) +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) +"ddI" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Central Access" + }, +/obj/machinery/door/firedoor, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/service/theater) "ddM" = ( /obj/structure/sign/poster/official/the_owl{ pixel_x = 32 @@ -53451,9 +52680,13 @@ /turf/open/floor/plating, /area/security/range) "dml" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "stationawaygate"; + name = "Gateway Access Shutters" + }, +/turf/open/floor/plasteel, +/area/command/gateway) "dmX" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -53477,17 +52710,12 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) -"dsC" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ +"dsi" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/service/theater) +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "dsJ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table/glass, @@ -53496,20 +52724,19 @@ }, /turf/open/floor/wood/wood_large, /area/service/chapel/main) -"dtx" = ( -/obj/structure/cable{ - icon_state = "1-2" +"dvb" = ( +/obj/structure/table, +/obj/item/trash/tray, +/obj/item/trash/boritos, +/obj/item/trash/can, +/obj/item/reagent_containers/food/drinks/sillycup{ + pixel_x = 8; + pixel_y = 10 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/turf/open/floor/plating{ + icon_state = "panelscorched" }, -/obj/structure/mirror{ - pixel_x = 25 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) +/area/commons/arcade) "dvc" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -53526,6 +52753,19 @@ /obj/machinery/gear_painter, /turf/open/floor/wood, /area/maintenance/bar) +"dyC" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "dyE" = ( /obj/structure/cable{ icon_state = "0-4" @@ -53559,12 +52799,6 @@ }, /turf/open/floor/carpet, /area/commons/cryopod) -"dzQ" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "dAe" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible{ dir = 1 @@ -53572,20 +52806,6 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) -"dBm" = ( -/obj/machinery/light/floor, -/obj/structure/table, -/obj/item/clothing/glasses/sunglasses/reagent, -/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ - pixel_x = -5; - pixel_y = 13 - }, -/obj/item/storage/fancy/cigarettes/cigpack_uplift{ - pixel_x = 10; - pixel_y = 7 - }, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "dCr" = ( /obj/structure/pool/Rboard, /turf/open/floor/plasteel/yellowsiding{ @@ -53606,10 +52826,6 @@ }, /turf/open/floor/plasteel, /area/security/range) -"dEh" = ( -/obj/machinery/jukebox/disco/indestructible, -/turf/open/floor/light/colour_cycle/dancefloor_b, -/area/maintenance/starboard/aft) "dEX" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/requests_console{ @@ -53623,10 +52839,17 @@ "dFX" = ( /turf/closed/wall, /area/commons/fitness/pool) -"dHp" = ( -/mob/living/simple_animal/bot/secbot/grievous/toy, -/turf/open/floor/light/colour_cycle/dancefloor_a, -/area/maintenance/starboard/aft) +"dGa" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/commons/arcade) "dIu" = ( /obj/structure/chair/sofa{ dir = 8 @@ -53714,6 +52937,14 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"dYl" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/command/gateway) "dYZ" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -53789,7 +53020,7 @@ /turf/open/floor/plasteel, /area/service/bar) "eih" = ( -/obj/structure/chair{ +/obj/effect/turf_decal/stripes/corner{ dir = 4 }, /turf/open/floor/plasteel/dark, @@ -53813,6 +53044,18 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"eky" = ( +/obj/structure/table/wood, +/obj/item/reagent_containers/food/snacks/baguette, +/obj/structure/mirror{ + pixel_y = 32 + }, +/obj/item/toy/crayon/spraycan/mimecan, +/obj/item/toy/dummy, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "elh" = ( /obj/structure/chair/comfy/black{ dir = 8 @@ -53937,6 +53180,12 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"exX" = ( +/obj/machinery/door/airlock{ + name = "Shower Room" + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "eyq" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/on, /turf/open/floor/plating, @@ -53967,6 +53216,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"eAe" = ( +/obj/structure/dresser, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "eAG" = ( /obj/item/clothing/under/misc/pj/blue, /obj/item/clothing/shoes/sneakers/white, @@ -54033,17 +53288,6 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"eEe" = ( -/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" - }, -/turf/open/floor/wood, -/area/service/theater) "eFx" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -54063,6 +53307,19 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"eFH" = ( +/obj/structure/cable{ + icon_state = "2-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "eFW" = ( /obj/effect/spawner/structure/window/shuttle, /turf/open/floor/plating/airless, @@ -54088,6 +53345,12 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) +"eOu" = ( +/obj/structure/table/wood, +/obj/item/book/manual/wiki/security_space_law, +/obj/item/coin/plasma, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "eQb" = ( /turf/open/floor/carpet, /area/commons/dorms) @@ -54104,6 +53367,23 @@ /obj/structure/closet/secure_closet/personal/cabinet, /turf/open/floor/carpet, /area/commons/dorms) +"eTA" = ( +/obj/structure/table/wood/fancy, +/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/structure/sign/poster/contraband/eat{ + pixel_y = 32; + poster_item_desc = "This poster promotes obesity, it also promotes giving the Chef a reason to keep their job." + }, +/turf/open/floor/wood, +/area/service/bar) "eUy" = ( /obj/machinery/door/airlock{ name = "Starboard Emergency Storage" @@ -54117,6 +53397,10 @@ }, /turf/open/space, /area/space/nearstation) +"eUX" = ( +/obj/machinery/jukebox/disco, +/turf/open/floor/light/colour_cycle/dancefloor_b, +/area/maintenance/starboard/aft) "eVC" = ( /obj/effect/spawner/structure/window, /obj/machinery/door/firedoor, @@ -54178,9 +53462,16 @@ }, /area/maintenance/port/fore) "fcn" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) +/obj/structure/disposalpipe/segment, +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/fore) "fcG" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -54207,27 +53498,11 @@ }, /turf/open/floor/wood, /area/service/bar) -"fgG" = ( -/obj/structure/table/wood, -/obj/machinery/requests_console{ - department = "Theatre"; - name = "theatre RC"; - pixel_x = -32 - }, -/obj/item/reagent_containers/food/snacks/baguette, -/obj/item/toy/dummy, -/obj/item/lipstick/random{ - pixel_x = 2; - pixel_y = 2 - }, -/obj/item/lipstick/random{ - pixel_x = -2; - pixel_y = -2 - }, -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater) +"fgl" = ( +/obj/structure/closet/crate/bin, +/obj/item/coin/silver, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "fhu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54238,6 +53513,13 @@ /obj/item/clothing/mask/gas/owl_mask, /turf/open/floor/plating, /area/maintenance/port/fore) +"fiv" = ( +/obj/effect/spawner/lootdrop/cigars_cases, +/obj/structure/table, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/commons/arcade) "fiy" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -54255,6 +53537,12 @@ /obj/structure/lattice, /turf/open/space, /area/space/nearstation) +"fkh" = ( +/mob/living/simple_animal/bot/secbot/grievous/toy{ + name = "Rave Bot 9001" + }, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "fkW" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -54280,6 +53568,10 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) +"flG" = ( +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "flP" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -54294,18 +53586,6 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) -"fne" = ( -/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/service/theater) "fnC" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -54319,6 +53599,25 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"fnE" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/service/theater) "foT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54419,9 +53718,8 @@ /turf/open/floor/wood/wood_large, /area/service/chapel/main) "fty" = ( -/obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/orange/visible, -/obj/structure/lattice, +/obj/structure/lattice/catwalk, /turf/open/space, /area/space/nearstation) "ftE" = ( @@ -54440,6 +53738,30 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/medical/storage) +"fvU" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/table/wood, +/obj/item/flashlight/lamp/bananalamp{ + pixel_y = 3 + }, +/obj/machinery/light{ + dir = 1 + }, +/obj/machinery/requests_console{ + department = "Theatre"; + name = "theatre RC"; + pixel_y = 32 + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "fvY" = ( /obj/machinery/computer/cryopod{ pixel_y = 26 @@ -54519,6 +53841,25 @@ }, /turf/open/floor/plating, /area/service/abandoned_gambling_den) +"fBW" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/table, +/obj/machinery/button/door{ + id = "commissaryshutters"; + name = "Commissary Shutters Control"; + pixel_x = 24; + pixel_y = 6; + req_access_txt = null + }, +/obj/item/paper_bin{ + pixel_x = -6; + pixel_y = 4 + }, +/obj/item/pen, +/turf/open/floor/plasteel, +/area/commons/locker) "fCx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -54530,6 +53871,44 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"fCJ" = ( +/obj/structure/sign/poster/contraband/missing_gloves{ + pixel_x = -32 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) +"fDn" = ( +/obj/structure/table, +/obj/item/trash/chips{ + pixel_x = -4; + pixel_y = 1 + }, +/obj/item/reagent_containers/food/drinks/beer/light{ + pixel_x = 7 + }, +/obj/item/cigbutt{ + pixel_x = 10; + pixel_y = 17 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) +"fFl" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/red{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/commons/locker) "fFA" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -54572,11 +53951,6 @@ /obj/effect/turf_decal/tile/red, /turf/open/floor/plasteel, /area/security/processing) -"fKl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/landmark/event_spawn, -/turf/open/floor/plasteel, -/area/science/circuit) "fKC" = ( /obj/structure/chair/office/dark{ dir = 1 @@ -54604,9 +53978,8 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "fOA" = ( -/obj/machinery/door/airlock{ - name = "Theatre Backstage"; - req_access_txt = "46" +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, /turf/open/floor/wood, /area/service/theater) @@ -54619,6 +53992,12 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) +"fOK" = ( +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "fPi" = ( /obj/effect/decal/cleanable/oil{ icon_state = "floor6" @@ -54626,6 +54005,24 @@ /obj/machinery/atmospherics/pipe/manifold/yellow/visible, /turf/open/floor/plasteel, /area/engineering/atmos) +"fPM" = ( +/obj/structure/reagent_dispensers/water_cooler, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"fRe" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/structure/bedsheetbin/color, +/obj/structure/table, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "fSO" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible, /obj/machinery/atmospherics/pipe/simple/orange/visible{ @@ -54643,13 +54040,19 @@ /turf/open/floor/plasteel/white, /area/medical/medbay/central) "fTC" = ( -/obj/structure/filingcabinet, -/obj/machinery/light{ - dir = 4; - light_color = "#e8eaff" +/obj/structure/table, +/obj/item/paper_bin{ + pixel_y = 6 }, +/obj/item/pen/fountain, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"fWi" = ( +/obj/structure/sign/poster/contraband/robust_softdrinks{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/service/bar) "fZm" = ( /obj/structure/chair/sofa/left, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -54657,6 +54060,12 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"fZR" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/commons/storage/primary) "gav" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -54722,6 +54131,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"gcx" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/opossum{ + name = "garbage" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "gcF" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54766,6 +54184,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/commons/fitness) +"giy" = ( +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "giT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54789,16 +54210,30 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"got" = ( +/obj/structure/closet, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/obj/item/poster/random_contraband, +/turf/open/floor/plasteel, +/area/commons/locker) "gpD" = ( -/obj/machinery/light_switch{ - pixel_y = 28 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/light{ +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "grc" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -54831,12 +54266,6 @@ "gvX" = ( /turf/open/floor/plasteel/yellowsiding, /area/commons/fitness/pool) -"gwd" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/science/circuit) "gxc" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -54862,6 +54291,9 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/brig) +"gyQ" = ( +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "gzf" = ( /obj/structure/window/reinforced/tinted{ dir = 8 @@ -54900,6 +54332,9 @@ /obj/effect/landmark/carpspawn, /turf/open/space/basic, /area/space) +"gDO" = ( +/turf/open/floor/plasteel/dark, +/area/command/gateway) "gDP" = ( /obj/machinery/firealarm{ dir = 8; @@ -54918,6 +54353,27 @@ /obj/effect/decal/cleanable/dirt, /turf/open/floor/wood, /area/maintenance/starboard/aft) +"gER" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) +"gFs" = ( +/obj/effect/landmark/start/assistant, +/obj/structure/chair{ + dir = 1 + }, +/obj/structure/sign/poster/contraband/lusty_xenomorph{ + pixel_x = 32 + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/fore) "gGK" = ( /turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) @@ -54956,6 +54412,20 @@ /obj/structure/bedsheetbin/towel, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"gLw" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/landmark/start/clown, +/turf/open/floor/plasteel, +/area/service/theater) "gLz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -54992,17 +54462,6 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"gNC" = ( -/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/command/meeting_room) "gNE" = ( /obj/structure/cable{ icon_state = "0-8" @@ -55014,6 +54473,21 @@ }, /turf/open/floor/plating, /area/security/brig) +"gOF" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/mob/living/simple_animal/bot/mulebot{ + beacon_freq = 1400; + home_destination = "QM #1"; + name = "Massive Load"; + suffix = "#1" + }, +/obj/structure/sign/poster/official/high_class_martini{ + pixel_x = -32 + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "gOZ" = ( /obj/machinery/door/airlock/maintenance{ req_access_txt = "12" @@ -55026,29 +54500,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"gQX" = ( -/obj/machinery/button/door{ - id = "LockerShitter4"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 14; - pixel_y = 38; - specialfunctions = 4 - }, -/obj/structure/toilet/secret/low_loot{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/structure/mirror{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "gRV" = ( /turf/open/floor/wood{ icon_state = "wood-broken6" @@ -55061,15 +54512,19 @@ /turf/open/floor/carpet, /area/service/library) "gTx" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/effect/turf_decal/bot_white/left, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, -/obj/machinery/light, /turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/area/command/gateway) "gUu" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -55103,6 +54558,13 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"gZB" = ( +/obj/item/clothing/mask/cigarette{ + pixel_x = -6; + pixel_y = 14 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "gZG" = ( /obj/structure/cable{ icon_state = "4-8" @@ -55145,9 +54607,6 @@ icon_state = "platingdmg1" }, /area/maintenance/starboard/aft) -"hcb" = ( -/turf/open/floor/carpet, -/area/service/theater) "hcA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55194,6 +54653,13 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"hlS" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "hlT" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock"; @@ -55229,6 +54695,29 @@ }, /turf/open/floor/plating, /area/security/range) +"hoL" = ( +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/effect/turf_decal/bot_white, +/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/cable{ + icon_state = "2-4" + }, +/obj/structure/cable{ + icon_state = "2-8" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "hrF" = ( /obj/structure/lattice/catwalk, /obj/structure/cable{ @@ -55253,6 +54742,14 @@ /obj/item/kirbyplants/random, /turf/open/floor/plating, /area/maintenance/port/fore) +"hty" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/command/gateway) "hxn" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible, @@ -55316,6 +54813,12 @@ /obj/item/pen, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"hNm" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "12" + }, +/turf/open/floor/plating, +/area/commons/locker) "hOv" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -55325,13 +54828,6 @@ /obj/item/reagent_containers/food/snacks/burger/plain, /turf/open/floor/wood, /area/service/bar) -"hPs" = ( -/obj/machinery/airalarm{ - dir = 8; - pixel_x = 23 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/locker) "hPP" = ( /obj/structure/disposalpipe/segment{ dir = 4 @@ -55341,6 +54837,15 @@ }, /turf/closed/wall, /area/cargo/warehouse) +"hQX" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable, +/turf/open/floor/plating, +/area/command/gateway) "hQY" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 6 @@ -55399,11 +54904,6 @@ /obj/effect/spawner/structure/window/hollow/reinforced/directional, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"hUJ" = ( -/obj/structure/reagent_dispensers/beerkeg, -/obj/machinery/light/floor, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "hWd" = ( /obj/effect/turf_decal/tile/blue, /obj/effect/turf_decal/tile/blue{ @@ -55450,6 +54950,17 @@ "ihR" = ( /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"ihS" = ( +/obj/effect/landmark/event_spawn, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "iiW" = ( /turf/open/floor/wood, /area/maintenance/bar) @@ -55472,9 +54983,7 @@ /turf/open/floor/plasteel/cafeteria, /area/service/kitchen) "ikk" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/wood, /area/service/theater) "ikm" = ( @@ -55528,13 +55037,10 @@ /turf/open/floor/plating, /area/maintenance/fore) "inR" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, +/turf/closed/wall, /area/service/theater) "iou" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -55551,6 +55057,10 @@ /obj/item/beacon, /turf/open/floor/plasteel, /area/engineering/atmos) +"iss" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/closed/wall/r_wall, +/area/command/gateway) "itD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -55558,12 +55068,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/brig) -"itG" = ( -/obj/structure/table/reinforced, -/obj/item/paper_bin, -/obj/item/pen, -/turf/open/floor/plasteel/white, -/area/science/circuit) "itK" = ( /obj/structure/table, /obj/effect/spawner/lootdrop/maintenance{ @@ -55607,11 +55111,6 @@ /obj/structure/table/optable, /turf/open/floor/plasteel/white, /area/medical/surgery) -"ixd" = ( -/obj/structure/table, -/obj/item/reagent_containers/food/drinks/beer, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "iyG" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/light/small{ @@ -55737,6 +55236,12 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"iQg" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "iRj" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -55751,15 +55256,6 @@ /obj/item/storage/backpack/duffelbag/med/surgery, /turf/open/floor/plasteel/white/side, /area/medical/surgery) -"iTq" = ( -/obj/structure/chair/stool{ - pixel_y = 8 - }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/service/theater) "iTU" = ( /obj/structure/musician/piano{ icon_state = "piano" @@ -55827,6 +55323,12 @@ /obj/item/storage/firstaid/regular, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"iZd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/command/gateway) "jaF" = ( /obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/tank/air{ @@ -55892,6 +55394,24 @@ }, /turf/open/space, /area/space) +"jdu" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/machinery/light/floor, +/obj/item/clothing/glasses/sunglasses/reagent, +/obj/item/reagent_containers/food/drinks/drinkingglass/shotglass{ + pixel_x = -5; + pixel_y = 12 + }, +/obj/item/storage/fancy/cigarettes/cigpack_uplift{ + pixel_x = 8; + pixel_y = 8 + }, +/obj/structure/sign/poster/contraband/borg_fancy_2{ + pixel_y = -32 + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "jdE" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 1 @@ -55923,6 +55443,13 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"jfZ" = ( +/obj/machinery/computer/communications{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "jgm" = ( /obj/structure/disposalpipe/segment{ dir = 10 @@ -55972,6 +55499,12 @@ /obj/machinery/rnd/production/techfab/department/cargo, /turf/open/floor/plasteel, /area/cargo/office) +"jmL" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "jmV" = ( /obj/structure/table/wood/fancy, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -55982,6 +55515,15 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) +"jnV" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "jon" = ( /obj/machinery/atmospherics/components/binary/valve/digital{ name = "gas to sauna" @@ -55996,6 +55538,23 @@ icon_state = "wood-broken7" }, /area/maintenance/bar) +"jqD" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/item/cigbutt{ + pixel_x = -12; + pixel_y = 22 + }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 16 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "jrE" = ( /obj/item/beacon, /turf/open/floor/plasteel/white, @@ -56107,18 +55666,18 @@ /obj/machinery/atmospherics/pipe/manifold4w/general/visible, /turf/open/floor/plasteel, /area/engineering/atmos) -"jCq" = ( -/obj/structure/disposalpipe/segment{ - dir = 5 - }, +"jBZ" = ( /obj/structure/cable{ - icon_state = "1-4" + icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 }, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) +/obj/effect/landmark/start/mime, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "jDr" = ( /obj/machinery/door/poddoor/preopen{ id = "atmos"; @@ -56149,6 +55708,10 @@ dir = 1 }, /area/commons/fitness) +"jFd" = ( +/obj/effect/spawner/structure/window, +/turf/open/floor/plating, +/area/maintenance/port/fore) "jFB" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -56293,12 +55856,33 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"jNr" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/item/cigbutt{ + pixel_x = -15; + pixel_y = 16 + }, +/turf/open/floor/plating/rust, +/area/maintenance/port/fore) "jRw" = ( /obj/machinery/computer/arcade/minesweeper{ dir = 4 }, /turf/open/floor/plasteel, /area/security/prison) +"jSD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "jSO" = ( /obj/machinery/light{ dir = 4 @@ -56448,6 +56032,13 @@ }, /turf/open/floor/plating, /area/security/prison) +"kgB" = ( +/obj/machinery/vending/snack/orange, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/service/bar) "khb" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 @@ -56473,6 +56064,22 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) +"kic" = ( +/obj/structure/table, +/obj/item/circuitboard/machine/paystand{ + pixel_x = 5; + pixel_y = -5 + }, +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 3; + name = "3maintenance loot spawner" + }, +/turf/open/floor/plasteel, +/area/commons/locker) "kil" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 @@ -56498,6 +56105,13 @@ }, /turf/open/floor/plating, /area/hallway/secondary/entry) +"kkK" = ( +/obj/machinery/vending/autodrobe, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "klN" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -56563,10 +56177,6 @@ /obj/machinery/gear_painter, /turf/open/floor/plasteel, /area/commons/fitness) -"kqI" = ( -/obj/structure/window, -/turf/open/floor/wood, -/area/service/bar) "ktP" = ( /obj/machinery/power/smes{ charge = 5e+006 @@ -56595,6 +56205,19 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"kuw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/obj/structure/cable, +/obj/machinery/power/apc{ + areastring = "/area/commons/arcade"; + dir = 8; + name = "Arcade Room"; + pixel_x = -25 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "kuA" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /obj/item/radio/intercom{ @@ -56606,10 +56229,6 @@ /obj/item/trash/candy, /turf/open/floor/plating, /area/maintenance/port/fore) -"kvl" = ( -/obj/structure/grille, -/turf/closed/wall/r_wall, -/area/space/nearstation) "kvL" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56648,6 +56267,15 @@ /obj/effect/landmark/xeno_spawn, /turf/open/floor/wood, /area/maintenance/bar) +"kzn" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-2" + }, +/obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/command/gateway) "kzT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall/r_wall, @@ -56687,25 +56315,22 @@ /turf/open/floor/plating, /area/security/range) "kCo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +/obj/machinery/door/airlock{ + name = "Theatre Backstage"; + req_access_txt = "46" }, -/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, +/turf/open/floor/wood, /area/service/theater) "kEm" = ( /mob/living/simple_animal/opossum/poppy, /turf/open/floor/plating, /area/maintenance/port/aft) +"kEJ" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/wood, +/area/service/bar) "kEY" = ( /obj/effect/landmark/stationroom/box/engine, /turf/open/space/basic, @@ -56795,6 +56420,14 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"kPi" = ( +/obj/effect/decal/cleanable/dirt, +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "kPj" = ( /obj/structure/cable{ icon_state = "1-2" @@ -56842,14 +56475,14 @@ /turf/open/floor/plasteel, /area/cargo/miningdock) "kTj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/machinery/door/airlock/maintenance/abandoned{ req_access_txt = "12" }, /obj/structure/barricade/wooden, /obj/structure/girder, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plating, /area/maintenance/fore) "kUC" = ( @@ -56915,6 +56548,12 @@ /obj/machinery/space_heater, /turf/open/floor/plating, /area/commons/storage/emergency/starboard) +"lcx" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/command/gateway) "leE" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56930,6 +56569,16 @@ /obj/effect/decal/cleanable/blood/gibs/human/body, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) +"lfu" = ( +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/obj/structure/urinal{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "lfV" = ( /obj/structure/cable{ icon_state = "4-8" @@ -56987,6 +56636,26 @@ /obj/item/clothing/under/rank/civilian/lawyer/red, /turf/open/floor/plasteel, /area/commons/locker) +"ljV" = ( +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/obj/structure/closet/l3closet/scientist, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel, +/area/command/gateway) +"lkT" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/structure/grille, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "lnk" = ( /obj/item/radio/intercom{ pixel_y = 25 @@ -57001,17 +56670,32 @@ icon_state = "wood-broken6" }, /area/maintenance/bar) -"lqO" = ( +"lpQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/disposalpipe/sorting/mail/flip{ - dir = 1; - sortType = 18 + icon_state = "0-2" }, +/obj/structure/cable, /turf/open/floor/plating, -/area/maintenance/fore) +/area/command/gateway) +"lqO" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/effect/turf_decal/bot_white/right, +/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/command/nuke_storage) "lre" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/table/wood/poker, @@ -57024,6 +56708,25 @@ /obj/machinery/vending/kink, /turf/open/floor/plasteel, /area/commons/fitness) +"lsS" = ( +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) +"ltv" = ( +/mob/living/simple_animal/bot/cleanbot{ + name = "Honest Work" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "ltK" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -57134,11 +56837,15 @@ /turf/closed/wall, /area/maintenance/disposal/incinerator) "lLf" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, /turf/closed/wall/r_wall, -/area/maintenance/fore) +/area/ai_monitored/command/nuke_storage) +"lLA" = ( +/obj/machinery/computer/slot_machine{ + balance = 15; + money = 500 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "lMg" = ( /obj/effect/turf_decal/stripes/line{ dir = 9 @@ -57164,12 +56871,32 @@ }, /turf/open/floor/plasteel, /area/security/processing) +"lOr" = ( +/obj/structure/table, +/obj/machinery/light/floor, +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -6 + }, +/obj/item/reagent_containers/blood/oilblood{ + pixel_x = 7 + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "lPr" = ( /obj/item/kirbyplants{ icon_state = "applebush" }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"lPG" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light/small{ + dir = 4 + }, +/obj/item/soap, +/obj/effect/landmark/xeno_spawn, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "lQG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -57185,11 +56912,12 @@ /turf/open/floor/plasteel, /area/security/range) "lSa" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +/obj/structure/cable{ + icon_state = "0-4" }, -/turf/open/floor/carpet, -/area/service/theater) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port) "lUP" = ( /obj/structure/sink{ dir = 8; @@ -57204,11 +56932,39 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on, /turf/open/floor/carpet, /area/commons/dorms) +"lVy" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"lWD" = ( +/obj/effect/decal/cleanable/vomit/old, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "lXy" = ( /obj/machinery/light, /obj/item/light/tube/broken, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"lZa" = ( +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/door/window/westright{ + name = "Red Corner" + }, +/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/commons/locker) "lZl" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance, @@ -57249,6 +57005,20 @@ }, /turf/open/floor/wood/wood_diagonal, /area/maintenance/port/fore) +"mau" = ( +/obj/machinery/power/apc{ + areastring = "/area/service/theater"; + dir = 8; + name = "Theatre APC"; + pixel_x = -25 + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/turf/open/floor/plasteel/white/side{ + dir = 4 + }, +/area/service/theater) "maT" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, @@ -57272,6 +57042,16 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating, /area/security/range) +"mcE" = ( +/obj/machinery/vending/cigarette, +/obj/effect/decal/cleanable/cobweb{ + icon_state = "cobweb2" + }, +/obj/structure/sign/poster/contraband/fun_police{ + pixel_x = 32 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "meb" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/bed, @@ -57301,13 +57081,6 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) -"mkO" = ( -/obj/machinery/door/airlock{ - name = "Shower Room" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel/dark, -/area/commons/toilet) "mkU" = ( /obj/machinery/door/airlock/external{ name = "Labor Camp Shuttle Airlock" @@ -57332,6 +57105,13 @@ }, /turf/open/floor/plasteel, /area/ai_monitored/security/armory) +"mmx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "mnC" = ( /obj/structure/target_stake, /obj/item/target/syndicate, @@ -57405,6 +57185,17 @@ dir = 1 }, /area/hallway/secondary/entry) +"mqH" = ( +/obj/structure/table/reinforced, +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutters"; + name = "Vacant Commissary Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "mqZ" = ( /obj/item/reagent_containers/glass/beaker, /turf/open/floor/plating, @@ -57417,13 +57208,13 @@ /obj/structure/sign/departments/holy, /turf/closed/wall, /area/service/chapel/main) -"mug" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 8 +"muv" = ( +/obj/item/radio/intercom{ + pixel_y = 25 }, -/mob/living/simple_animal/bot/mulebot, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "mvt" = ( /obj/machinery/airalarm{ dir = 1; @@ -57431,6 +57222,16 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mwj" = ( +/obj/structure/noticeboard{ + dir = 8; + pixel_x = 27 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/command/meeting_room) "mwS" = ( /turf/open/floor/plating{ icon_state = "platingdmg3" @@ -57446,10 +57247,10 @@ /turf/open/floor/plating, /area/security/office) "myh" = ( -/obj/structure/musician/piano, -/obj/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/turf/closed/wall, /area/service/theater) "mzv" = ( /obj/machinery/door/morgue{ @@ -57458,13 +57259,20 @@ /turf/open/floor/wood/wood_large, /area/service/chapel/main) "mzB" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/door/window, -/obj/structure/cable{ - icon_state = "1-2" +/obj/machinery/disposal/bin, +/obj/structure/disposalpipe/trunk{ + dir = 4 }, /turf/open/floor/wood, /area/service/theater) +"mzT" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/vending/coffee, +/obj/machinery/light/small{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/port/fore) "mAH" = ( /obj/machinery/atmospherics/components/unary/tank/air{ dir = 8 @@ -57555,13 +57363,6 @@ /obj/item/electronics/airlock, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"mJG" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/service/theater) "mLS" = ( /obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating{ @@ -57688,12 +57489,22 @@ /turf/open/space, /area/space/station_ruins) "nbr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable{ + icon_state = "4-8" }, -/obj/structure/reagent_dispensers/watertank, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, -/area/maintenance/port/fore) +/area/hallway/primary/port) "nbT" = ( /obj/structure/cable{ icon_state = "0-8" @@ -57718,24 +57529,45 @@ }, /turf/open/floor/plasteel/dark, /area/security/brig) +"ncg" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower{ + dir = 1 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "ndq" = ( /turf/open/floor/plating, /area/service/abandoned_gambling_den) "nez" = ( -/obj/structure/table/wood, -/obj/item/instrument/piano_synth, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/structure/cable{ + icon_state = "0-8" + }, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/hallway/primary/port) "nfm" = ( /obj/machinery/vending/autodrobe, /turf/open/floor/wood, /area/maintenance/bar) "ngs" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) "ngU" = ( /obj/structure/rack, /obj/item/storage/firstaid, @@ -57745,10 +57577,11 @@ /turf/open/floor/plating, /area/maintenance/fore) "ngV" = ( -/obj/structure/table/wood, -/obj/item/instrument/guitar, -/turf/open/floor/wood, -/area/service/theater) +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "nhY" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance{ @@ -57876,6 +57709,19 @@ "nyi" = ( /turf/closed/wall, /area/medical/paramedic) +"nyn" = ( +/obj/structure/disposalpipe/segment{ + dir = 5 + }, +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nzB" = ( /obj/machinery/hydroponics/soil{ pixel_y = 8 @@ -57896,6 +57742,20 @@ }, /turf/closed/wall, /area/maintenance/port/fore) +"nDd" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/light, +/obj/structure/disposalpipe/segment{ + dir = 9 + }, +/obj/structure/cable{ + icon_state = "1-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "nEj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/sign/warning/vacuum/external{ @@ -57931,6 +57791,11 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"nGR" = ( +/obj/effect/decal/cleanable/cobweb, +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "nJP" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 5 @@ -57972,6 +57837,16 @@ }, /turf/open/floor/plasteel, /area/commons/locker) +"nNF" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/wood, +/area/service/bar) +"nPr" = ( +/obj/item/broken_bottle, +/turf/open/floor/plating, +/area/maintenance/port/fore) "nQi" = ( /obj/machinery/recharge_station, /turf/open/floor/plating, @@ -58018,31 +57893,24 @@ }, /turf/open/floor/plasteel, /area/service/hydroponics) +"nVz" = ( +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "nXg" = ( /obj/structure/girder, /obj/structure/grille, /turf/open/floor/plating, /area/maintenance/port/fore) "nYe" = ( -/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/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/item/gun/ballistic/revolver/nagant, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/turf/open/floor/plasteel, +/area/command/gateway) "nYK" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/table/wood/poker, @@ -58209,6 +58077,15 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"omE" = ( +/obj/machinery/door/firedoor, +/obj/machinery/door/poddoor/shutters{ + id = "stationawaygate"; + name = "Gateway Access Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/command/gateway) "omX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -58219,29 +58096,6 @@ /obj/machinery/holopad, /turf/open/floor/plasteel, /area/security/prison) -"omY" = ( -/obj/machinery/button/door{ - id = "LockerShitter3"; - name = "Door Bolt Control"; - normaldoorcontrol = 1; - pixel_x = 14; - pixel_y = 38; - specialfunctions = 4 - }, -/obj/structure/toilet/secret/low_loot{ - dir = 4 - }, -/obj/machinery/light/small{ - dir = 8 - }, -/obj/structure/sink{ - pixel_y = 25 - }, -/obj/structure/mirror{ - pixel_y = 32 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet/locker) "oqj" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -58263,6 +58117,10 @@ }, /turf/open/floor/plasteel, /area/engineering/gravity_generator) +"otC" = ( +/obj/machinery/status_display/evac, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "ouf" = ( /obj/effect/turf_decal/trimline/blue/filled/corner{ dir = 4 @@ -58271,11 +58129,7 @@ /turf/open/floor/plasteel/dark, /area/medical/paramedic) "ouQ" = ( -/obj/structure/table, -/obj/item/paper_bin{ - pixel_y = 6 - }, -/obj/item/pen/fountain, +/obj/machinery/vending/cigarette/beach, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "ovv" = ( @@ -58291,6 +58145,28 @@ /obj/item/gun/energy/laser/practice, /turf/open/floor/plasteel, /area/security/range) +"owa" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) +"owx" = ( +/obj/machinery/light, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "oxm" = ( /obj/structure/flora/ausbushes/fullgrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -58319,12 +58195,6 @@ }, /turf/open/floor/plasteel, /area/commons/locker) -"oyz" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/theater) "oyN" = ( /obj/effect/turf_decal/stripes/line, /turf/open/floor/plating/airless, @@ -58339,12 +58209,6 @@ }, /turf/open/floor/plating, /area/maintenance/fore/secondary) -"oAb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/bar) "oAB" = ( /obj/structure/fireplace{ pixel_y = -6 @@ -58371,6 +58235,12 @@ /obj/machinery/gulag_teleporter, /turf/open/floor/plasteel, /area/security/prison) +"oDD" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/service/bar) "oDN" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -58386,15 +58256,13 @@ /obj/effect/spawner/lootdrop/keg, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"oGv" = ( +/obj/structure/extinguisher_cabinet, +/turf/closed/wall/r_wall, +/area/hallway/primary/central) "oHB" = ( /turf/open/floor/plasteel/dark, /area/commons/dorms) -"oHU" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel, -/area/science/circuit) "oIJ" = ( /obj/structure/chair/comfy/brown{ dir = 8 @@ -58437,9 +58305,7 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "oNz" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "oQP" = ( @@ -58463,17 +58329,21 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel, /area/security/range) +"oTH" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/shower, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet) "oTW" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/machinery/light{ + dir = 1 }, -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" - }, -/area/service/theater) +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "oUh" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -58496,11 +58366,6 @@ }, /turf/closed/wall/r_wall, /area/engineering/atmos) -"oYQ" = ( -/obj/structure/chair/stool, -/mob/living/simple_animal/bot/medbot, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "oZl" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/closet/wardrobe/pjs, @@ -58521,11 +58386,11 @@ /obj/effect/landmark/blobstart, /turf/open/floor/plating, /area/maintenance/aft) -"pcK" = ( -/mob/living/simple_animal/bot/cleanbot{ - name = "C.L.E.A.N." +"pcz" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 }, -/turf/open/floor/light/colour_cycle/dancefloor_a, +/turf/open/floor/carpet/royalblue, /area/maintenance/starboard/aft) "pcQ" = ( /obj/effect/turf_decal/tile/neutral{ @@ -58562,6 +58427,13 @@ }, /turf/open/floor/plating, /area/security/range) +"pgZ" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "pjg" = ( /obj/structure/table/wood, /obj/effect/spawner/lootdrop/maintenance, @@ -58601,15 +58473,6 @@ /obj/effect/decal/cleanable/blood/gibs/core, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) -"plC" = ( -/obj/machinery/door/airlock/maintenance{ - req_access_txt = "12" - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/wood, -/area/service/bar) "plS" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 1"; @@ -58630,6 +58493,22 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"pnc" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/blue{ + 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/commons/locker) "poc" = ( /obj/effect/turf_decal/stripes/line{ dir = 5 @@ -58681,26 +58560,32 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"psk" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/command/meeting_room) "pst" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/effect/mapping_helpers/airlock/locked, -/obj/machinery/door/airlock/vault{ - name = "Vault Door"; - req_access_txt = "53" - }, +/obj/machinery/gateway/centerstation, /turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/area/command/gateway) +"pub" = ( +/obj/machinery/light_switch{ + pixel_x = -20 + }, +/obj/structure/cable{ + icon_state = "2-4" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/obj/machinery/power/apc{ + areastring = "/area/command/gateway"; + dir = 8; + name = "Gateway APC"; + pixel_x = -25; + pixel_y = -1 + }, +/obj/structure/cable{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel, +/area/command/gateway) "puh" = ( /obj/effect/turf_decal/tile/red, /obj/effect/turf_decal/tile/red{ @@ -58723,12 +58608,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) -"pzk" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) "pzG" = ( /obj/item/radio/intercom{ name = "Station Intercom (General)"; @@ -58745,6 +58624,12 @@ }, /turf/open/floor/plating, /area/maintenance/disposal/incinerator) +"pzP" = ( +/obj/structure/sign/poster/contraband/punch_shit{ + pixel_y = 32 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pAK" = ( /obj/machinery/door/window/brigdoor/security/cell{ id = "Cell 3"; @@ -58779,6 +58664,13 @@ }, /turf/open/floor/plating, /area/engineering/atmos) +"pCE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/science/circuit) "pDe" = ( /obj/machinery/door/window/southright{ name = "Target Storage" @@ -58829,6 +58721,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/central) +"pHt" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/chair{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "pHO" = ( /obj/effect/turf_decal/tile/blue, /obj/structure/sign/poster/contraband/fun_police{ @@ -58836,17 +58737,6 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/fore) -"pIf" = ( -/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/service/theater) "pJR" = ( /obj/structure/disposalpipe/segment, /obj/structure/chair/comfy/brown{ @@ -58865,13 +58755,19 @@ /turf/open/floor/plating, /area/maintenance/disposal) "pMQ" = ( -/obj/structure/window/reinforced, -/obj/machinery/disposal/bin, -/obj/structure/disposalpipe/trunk{ - dir = 4 +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"pNS" = ( +/obj/effect/decal/cleanable/dirt{ + desc = "A thin layer of dust coating the floor."; + name = "dust" + }, +/turf/open/floor/plasteel, +/area/commons/locker) "pPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -58907,9 +58803,6 @@ /turf/open/floor/plasteel, /area/security/brig) "pQN" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) "pRj" = ( @@ -58977,6 +58870,11 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"qae" = ( +/obj/effect/decal/cleanable/vomit, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/fore) "qaY" = ( /obj/structure/table/reinforced, /obj/effect/turf_decal/tile/bar, @@ -58986,15 +58884,6 @@ /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/service/bar) -"qcm" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 9 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/command/heads_quarters/captain) "qeb" = ( /obj/structure/cable{ icon_state = "0-8" @@ -59063,6 +58952,15 @@ }, /turf/open/floor/plating, /area/maintenance/port/fore) +"qki" = ( +/obj/machinery/door/airlock{ + name = "Unisex Restrooms" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "qkn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/light{ @@ -59083,6 +58981,12 @@ }, /turf/closed/wall, /area/maintenance/port/fore) +"qlV" = ( +/obj/item/mop{ + name = "Ain't Much" + }, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "qlY" = ( /obj/item/kirbyplants/random, /turf/open/floor/plating{ @@ -59098,15 +59002,19 @@ /obj/machinery/door/firedoor, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) -"qqs" = ( -/obj/structure/mirror{ - pixel_y = 32 +"qoT" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 }, -/obj/structure/sink{ - pixel_y = 25 +/obj/effect/turf_decal/stripes/line, +/obj/structure/disposalpipe/segment{ + dir = 4 }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) +/obj/structure/cable{ + icon_state = "1-8" + }, +/turf/open/floor/plasteel, +/area/science/circuit) "qtw" = ( /obj/machinery/door/airlock/external{ dir = 2; @@ -59150,15 +59058,36 @@ }, /turf/open/floor/plasteel, /area/commons/dorms) -"qyj" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/supplymain/hidden, -/turf/open/floor/plasteel/dark, -/area/maintenance/fore) +"qAu" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/obj/structure/rack, +/obj/item/storage/toolbox/emergency, +/obj/machinery/light/small, +/turf/open/floor/plasteel, +/area/commons/locker) "qBi" = ( -/obj/structure/lattice, -/turf/closed/wall/r_wall, -/area/command/heads_quarters/captain) +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/primary/port) +"qCw" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/light/small/broken{ + dir = 8 + }, +/obj/item/glasswork/glass_base/glasses_frame_1{ + pixel_x = -6; + pixel_y = 13 + }, +/turf/open/floor/plating{ + icon_state = "platingdmg3" + }, +/area/commons/arcade) "qCR" = ( /obj/structure/musician/piano, /obj/effect/decal/cleanable/cobweb, @@ -59263,11 +59192,11 @@ }, /area/commons/fitness) "qOB" = ( -/obj/structure/cable{ - icon_state = "4-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 }, -/turf/open/floor/plasteel/dark, -/area/command/heads_quarters/captain) +/turf/open/floor/plasteel, +/area/hallway/primary/port) "qSf" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable{ @@ -59278,6 +59207,18 @@ }, /turf/open/floor/plasteel/dark, /area/medical/morgue) +"qSo" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "qSF" = ( /obj/item/seeds/bee_balm/honey_balm, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -59286,9 +59227,6 @@ /turf/open/floor/plating, /area/maintenance/starboard/aft) "qTG" = ( -/obj/machinery/light{ - dir = 8 - }, /turf/open/floor/carpet, /area/service/theater) "qTV" = ( @@ -59348,6 +59286,19 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"rbH" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/structure/window{ + dir = 1 + }, +/obj/machinery/washing_machine, +/turf/open/floor/plasteel/cafeteria, +/area/commons/locker) "rcD" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59425,10 +59376,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/security/processing) -"rjQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/wood, -/area/service/theater) "rmN" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -59496,26 +59443,6 @@ }, /turf/open/floor/wood, /area/service/bar) -"rqW" = ( -/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/service/theater"; - dir = 8; - name = "Theatre APC"; - pixel_x = -25 - }, -/obj/structure/cable{ - icon_state = "0-4" - }, -/turf/open/floor/plasteel, -/area/service/theater) "rrM" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 @@ -59586,6 +59513,25 @@ }, /turf/open/floor/plasteel, /area/security/prison) +"rwj" = ( +/obj/machinery/light/small{ + dir = 1 + }, +/obj/structure/closet/crate/bin, +/turf/open/floor/plating{ + icon_state = "platingdmg2" + }, +/area/maintenance/port/fore) +"rxD" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/obj/machinery/camera{ + c_tag = "Locker Room Toilets"; + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "rxF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table/glass, @@ -59641,6 +59587,24 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"rDh" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/sign/poster/contraband/clown{ + pixel_y = -32 + }, +/obj/structure/closet/crate/wooden/toy, +/obj/item/toy/crayon/spraycan/lubecan, +/turf/open/floor/plasteel, +/area/service/theater) "rGo" = ( /obj/machinery/light/small{ dir = 1 @@ -59675,6 +59639,18 @@ }, /turf/open/floor/plating, /area/construction) +"rML" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "rMN" = ( /obj/structure/bed, /obj/item/tank/internals/anesthetic, @@ -59700,11 +59676,6 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/ai_monitored/command/storage/eva) -"rPU" = ( -/turf/open/floor/plasteel/white/side{ - dir = 4 - }, -/area/service/theater) "rQJ" = ( /obj/machinery/light/small{ dir = 8 @@ -59733,21 +59704,9 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"rTu" = ( -/obj/structure/cable{ - icon_state = "4-8" - }, -/obj/machinery/door/airlock/command{ - name = "Command Access To Vault"; - req_access = "19" - }, -/turf/open/floor/plasteel/dark, -/area/command/meeting_room) "rTD" = ( -/obj/machinery/vending/snack/random, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel/dark, -/area/hallway/primary/central) +/turf/open/floor/plasteel, +/area/command/gateway) "rUe" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -59814,6 +59773,11 @@ /obj/effect/spawner/lootdrop/maintenance, /turf/open/floor/plating, /area/maintenance/port/fore) +"rZE" = ( +/obj/structure/table, +/obj/item/flashlight/lamp, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "rZQ" = ( /obj/docking_port/stationary{ dir = 8; @@ -59899,6 +59863,16 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper, /turf/open/floor/plating, /area/maintenance/department/medical/morgue) +"smN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/machinery/camera{ + c_tag = "Locker Room West"; + dir = 1 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "smP" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -59921,16 +59895,6 @@ /obj/item/clothing/shoes/sneakers/white, /turf/open/floor/plating, /area/maintenance/fore) -"sqp" = ( -/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/command/heads_quarters/captain) "srk" = ( /turf/open/floor/light/colour_cycle/dancefloor_a, /area/maintenance/starboard/aft) @@ -59968,6 +59932,14 @@ /obj/item/toy/poolnoodle/yellow, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"suN" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/landmark/event_spawn, +/obj/structure/cable{ + icon_state = "2-4" + }, +/turf/open/floor/plasteel, +/area/science/circuit) "sxs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/table, @@ -59982,18 +59954,12 @@ /turf/open/floor/plasteel, /area/hallway/secondary/service) "syJ" = ( -/obj/machinery/light{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/turf/open/floor/carpet, -/area/service/theater) -"szG" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "sAk" = ( /obj/structure/cable{ icon_state = "1-8" @@ -60122,25 +60088,6 @@ /obj/structure/grille/broken, /turf/open/floor/plating, /area/maintenance/aft) -"sLa" = ( -/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/commons/locker) "sLj" = ( /obj/structure/chair/comfy/brown{ dir = 4 @@ -60163,13 +60110,11 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/aft) -"sNK" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/service/theater) +"sMI" = ( +/obj/structure/table, +/obj/item/storage/secure/briefcase, +/turf/open/floor/plasteel, +/area/commons/locker) "sOs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -60222,6 +60167,24 @@ /obj/structure/chair/office/light, /turf/open/floor/plasteel/white, /area/science/circuit) +"sUx" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/spawner/structure/window/reinforced, +/obj/structure/cable{ + icon_state = "0-4" + }, +/obj/structure/cable, +/turf/open/floor/plating, +/area/command/gateway) +"sVt" = ( +/obj/item/storage/secure/safe{ + pixel_y = 32 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "sVD" = ( /obj/structure/table/wood/poker, /obj/item/storage/box/matches{ @@ -60260,17 +60223,46 @@ /obj/effect/turf_decal/vg_decals/atmos/mix, /turf/open/floor/engine/vacuum, /area/engineering/atmos) -"sYR" = ( -/obj/machinery/door/airlock{ - name = "Unisex Restrooms" +"sYv" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 8 }, -/obj/machinery/door/firedoor, -/turf/open/floor/plasteel/dark, -/area/service/bar) +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/effect/turf_decal/tile/red, +/obj/structure/closet/secure_closet/freezer/cream_pie, +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/service/theater) "tal" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall, /area/hallway/secondary/service) +"tcU" = ( +/obj/machinery/door/airlock/maintenance{ + req_access_txt = "46" + }, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/fore) +"teS" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/opossum{ + name = "trash" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "tgH" = ( /obj/structure/filingcabinet/employment, /turf/open/floor/wood, @@ -60331,6 +60323,12 @@ }, /turf/open/floor/plating, /area/security/range) +"tnL" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "tqg" = ( /obj/machinery/cryopod{ dir = 4 @@ -60358,6 +60356,14 @@ }, /turf/open/floor/plasteel, /area/security/courtroom) +"trT" = ( +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "tsq" = ( /obj/structure/cable/white{ icon_state = "0-4" @@ -60406,15 +60412,29 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/medical/medbay/central) -"tyX" = ( +"tyE" = ( /obj/structure/cable{ - icon_state = "4-8" + icon_state = "1-2" }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/disposalpipe/segment, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) +"tyX" = ( +/obj/effect/turf_decal/bot_white, +/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/command/nuke_storage) +/area/command/gateway) "tzQ" = ( /obj/machinery/shower{ dir = 4 @@ -60422,6 +60442,11 @@ /obj/item/soap, /turf/open/floor/mineral/titanium/blue, /area/commons/dorms) +"tAy" = ( +/obj/effect/decal/cleanable/oil/slippery, +/obj/structure/reagent_dispensers/beerkeg, +/turf/open/floor/light/colour_cycle/dancefloor_a, +/area/maintenance/starboard/aft) "tAC" = ( /obj/structure/closet/athletic_mixed, /obj/item/toy/poolnoodle/red, @@ -60521,26 +60546,8 @@ /turf/open/floor/plasteel/dark, /area/medical/paramedic) "tJi" = ( -/obj/machinery/airalarm{ - dir = 4; - pixel_x = -22 - }, -/obj/structure/closet/crate/wooden/toy, -/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 - }, -/obj/structure/sign/poster/contraband/clown{ - pixel_y = -32 - }, -/obj/item/megaphone/clown, -/turf/open/floor/plasteel, +/obj/structure/musician/piano, +/turf/open/floor/wood, /area/service/theater) "tJK" = ( /obj/machinery/door/airlock/engineering{ @@ -60652,6 +60659,14 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"tVB" = ( +/obj/effect/landmark/blobstart, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "tVE" = ( /obj/item/chair/wood{ dir = 4 @@ -60662,9 +60677,7 @@ }, /area/maintenance/port/fore) "tWj" = ( -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 4 - }, +/obj/structure/window/reinforced, /turf/open/floor/wood, /area/service/theater) "tXs" = ( @@ -60681,6 +60694,18 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"tZa" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/open/floor/plating, +/area/maintenance/starboard/fore) "tZe" = ( /obj/effect/turf_decal/bot, /obj/structure/sign/poster/official/pda_ad{ @@ -60688,6 +60713,9 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/central) +"tZp" = ( +/turf/closed/wall, +/area/commons/arcade) "tZu" = ( /obj/machinery/light/small{ dir = 8 @@ -60706,25 +60734,6 @@ }, /turf/open/floor/wood, /area/maintenance/bar) -"ubj" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/obj/machinery/door/window/westright{ - name = "Red Corner" - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/commons/locker) "ucq" = ( /obj/structure/sign/poster/contraband/red_rum{ pixel_y = 32 @@ -60775,12 +60784,10 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "ugq" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, -/obj/structure/girder, -/obj/structure/grille, -/turf/open/floor/plating, +/turf/closed/wall, /area/maintenance/port/fore) "ugu" = ( /obj/effect/turf_decal/stripes/line, @@ -60836,6 +60843,14 @@ }, /turf/open/floor/wood, /area/service/bar) +"unQ" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/item/papercutter, +/obj/structure/table, +/turf/open/floor/carpet, +/area/command/heads_quarters/hop) "unR" = ( /turf/open/floor/plasteel/yellowsiding{ dir = 8 @@ -60911,6 +60926,10 @@ /obj/structure/chair/stool/bar, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"uwQ" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall/r_wall, +/area/command/gateway) "uxY" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable{ @@ -60988,6 +61007,15 @@ }, /turf/open/floor/plasteel/white, /area/medical/medbay/lobby) +"uCn" = ( +/obj/structure/table/reinforced, +/obj/item/paper_bin, +/obj/item/pen, +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/plasteel/white, +/area/science/circuit) "uCo" = ( /obj/structure/chair{ dir = 1 @@ -61101,42 +61129,24 @@ /turf/open/floor/plasteel, /area/commons/dorms) "uJx" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/carpet, +/obj/machinery/door/window, +/turf/open/floor/wood, /area/service/theater) -"uNu" = ( -/obj/structure/disposalpipe/segment{ +"uOd" = ( +/turf/open/floor/plasteel/white/side{ dir = 4 }, -/obj/effect/turf_decal/stripes/line, +/area/service/theater) +"uOJ" = ( /obj/structure/cable{ icon_state = "1-8" }, -/turf/open/floor/plasteel, -/area/science/circuit) -"uOJ" = ( -/obj/effect/mapping_helpers/airlock/locked, -/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{ +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 8 }, -/obj/machinery/door/airlock/vault{ - name = "Vault Door"; - req_access_txt = "53" - }, -/turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/obj/effect/landmark/event_spawn, +/turf/open/floor/plasteel, +/area/command/gateway) "uQR" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 4; @@ -61144,31 +61154,31 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"uQS" = ( -/obj/machinery/light/small, -/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ - dir = 1 - }, -/turf/open/floor/mineral/titanium/blue, -/area/commons/toilet) "uRd" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, /turf/closed/wall/r_wall, /area/engineering/gravity_generator) -"uRn" = ( -/obj/structure/chair/stool, -/mob/living/simple_animal/opossum, -/turf/open/floor/carpet/royalblue, -/area/maintenance/starboard/aft) "uRS" = ( -/obj/structure/chair/stool{ - pixel_y = 8 +/obj/structure/disposalpipe/segment, +/obj/structure/cable{ + icon_state = "1-2" }, -/turf/open/floor/carpet{ - icon_state = "carpetsymbol" +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 }, +/turf/open/floor/plating, +/area/maintenance/fore) +"uSc" = ( +/obj/machinery/light{ + dir = 4; + light_color = "#c1caff" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, /area/service/theater) "uSC" = ( /obj/machinery/pool/drain, @@ -61181,12 +61191,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/security/brig) -"uUi" = ( -/obj/effect/decal/cleanable/vomit, +"uTL" = ( /obj/effect/decal/cleanable/dirt, -/obj/effect/spawner/lootdrop/maintenance, -/turf/open/floor/plating, -/area/maintenance/fore) +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "uUP" = ( /obj/structure/cable/white, /obj/structure/cable/white{ @@ -61209,6 +61220,12 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/aft) +"uWq" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "uXt" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/structure/cable{ @@ -61216,6 +61233,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"uZM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/ai_monitored/turret_protected/ai_upload) "vae" = ( /obj/effect/turf_decal/stripes/line{ dir = 4 @@ -61264,6 +61287,14 @@ }, /turf/open/floor/plating, /area/security/range) +"vde" = ( +/obj/structure/chair/comfy/brown{ + dir = 4 + }, +/obj/effect/landmark/start/captain, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) "vdo" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple, /obj/structure/lattice, @@ -61307,23 +61338,13 @@ }, /turf/open/floor/plating, /area/maintenance/fore) -"vhb" = ( -/obj/effect/turf_decal/tile/blue{ +"viF" = ( +/obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/tile/blue{ - dir = 8 - }, -/obj/structure/window{ - dir = 1 - }, -/turf/open/floor/plasteel/cafeteria, -/area/commons/locker) -"viF" = ( -/obj/structure/table/wood, -/obj/item/instrument/trumpet, -/turf/open/floor/wood, -/area/service/theater) +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/hallway/primary/port) "vjm" = ( /obj/structure/table/wood, /obj/item/reagent_containers/rag, @@ -61365,6 +61386,19 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"voT" = ( +/obj/machinery/camera{ + c_tag = "Bathrooms"; + dir = 1 + }, +/obj/structure/sink{ + pixel_y = 25 + }, +/obj/structure/mirror{ + pixel_y = 32 + }, +/turf/open/floor/mineral/titanium/blue, +/area/commons/toilet) "voW" = ( /obj/structure/pool/Lboard, /turf/open/pool, @@ -61485,6 +61519,17 @@ }, /turf/open/floor/plating, /area/security/brig) +"vyP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/sink{ + dir = 4; + pixel_x = 11 + }, +/obj/structure/mirror{ + pixel_x = 28 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/locker) "vzp" = ( /obj/structure/table/reinforced, /obj/machinery/firealarm{ @@ -61509,22 +61554,19 @@ }, /turf/open/floor/plasteel, /area/commons/fitness/pool) -"vBa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/obj/structure/cable{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/dark, -/area/command/meeting_room) "vCb" = ( /obj/machinery/rnd/production/techfab/department/service, /turf/open/floor/plasteel, /area/hallway/secondary/service) "vCn" = ( -/obj/structure/chair{ - dir = 8 +/obj/structure/cable{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) @@ -61695,10 +61737,11 @@ /turf/open/space/basic, /area/space/nearstation) "vOU" = ( -/obj/structure/sign/warning/securearea, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/closed/wall/r_wall, -/area/ai_monitored/command/nuke_storage) +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "vOV" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -61811,6 +61854,15 @@ /obj/structure/girder, /turf/open/floor/plating/airless, /area/space/nearstation) +"wfC" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/mob/living/simple_animal/bot/medbot{ + name = "Doctor Love" + }, +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) "wfR" = ( /obj/item/electropack/shockcollar, /obj/item/assembly/signaler, @@ -61903,9 +61955,8 @@ /turf/open/floor/plating, /area/construction/mining/aux_base) "wql" = ( -/obj/structure/extinguisher_cabinet, /turf/closed/wall/r_wall, -/area/hallway/primary/central) +/area/command/gateway) "wqF" = ( /obj/structure/cable{ icon_state = "4-8" @@ -61943,6 +61994,26 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/service) +"wrX" = ( +/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/structure/window, +/obj/structure/window{ + dir = 8 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) "wuO" = ( /obj/effect/spawner/lootdrop/maintenance{ lootcount = 2; @@ -61966,6 +62037,30 @@ /obj/item/stack/sheet/metal/ten, /turf/open/floor/plasteel/white, /area/science/circuit) +"wwG" = ( +/obj/effect/decal/cleanable/dirt, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/obj/structure/chair{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/commons/locker) +"wxf" = ( +/obj/structure/cable{ + icon_state = "1-2" + }, +/obj/machinery/holopad/secure, +/turf/open/floor/wood, +/area/command/heads_quarters/captain) +"wxk" = ( +/obj/item/reagent_containers/food/drinks/beer{ + pixel_x = -15 + }, +/obj/machinery/computer/arcade, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "wxT" = ( /obj/structure/chair/sofa/left, /obj/structure/window{ @@ -61986,12 +62081,28 @@ }, /turf/closed/wall, /area/hallway/secondary/service) +"wCQ" = ( +/obj/machinery/light/small{ + brightness = 3; + dir = 8 + }, +/obj/effect/decal/cleanable/dirt, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "wHk" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, /turf/open/floor/plasteel, /area/commons/fitness/pool) +"wHm" = ( +/obj/structure/window/reinforced, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/wood, +/area/service/theater) "wHz" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 @@ -62002,6 +62113,11 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/fore) +"wII" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/door/airlock/maintenance, +/turf/open/floor/wood, +/area/service/bar) "wJA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -62056,11 +62172,7 @@ /turf/open/floor/plasteel, /area/engineering/gravity_generator) "wUr" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/carpet, +/turf/closed/wall, /area/service/theater) "wUY" = ( /obj/structure/table, @@ -62115,15 +62227,19 @@ }, /turf/open/floor/plasteel, /area/security/prison) -"wZI" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 +"wYn" = ( +/obj/structure/plasticflaps/opaque, +/obj/structure/sign/poster/contraband/free_drone{ + pixel_y = 32 }, -/obj/structure/cable{ - icon_state = "4-8" +/turf/open/floor/carpet/royalblue, +/area/maintenance/starboard/aft) +"wZI" = ( +/obj/machinery/light{ + dir = 1 }, /turf/open/floor/plasteel/dark, -/area/command/heads_quarters/captain) +/area/command/gateway) "xal" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -62272,18 +62388,17 @@ }, /turf/open/floor/plasteel, /area/commons/fitness) -"xmo" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ +"xlX" = ( +/obj/structure/table/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/structure/cable{ - icon_state = "1-8" +/obj/machinery/door/poddoor/shutters{ + id = "commissaryshutters"; + name = "Vacant Commissary Shutters" }, -/obj/structure/cable{ - icon_state = "1-2" - }, -/turf/open/floor/wood, -/area/service/theater) +/turf/open/floor/plasteel, +/area/commons/locker) "xmS" = ( /obj/structure/chair/comfy/beige{ dir = 8 @@ -62331,7 +62446,7 @@ dir = 4 }, /obj/structure/cable{ - icon_state = "2-4" + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/fore) @@ -62341,6 +62456,15 @@ }, /turf/open/floor/plasteel, /area/maintenance/disposal/incinerator) +"xwB" = ( +/obj/structure/chair/stool{ + pixel_y = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "xxi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -62348,11 +62472,23 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/structure/disposalpipe/segment{ + dir = 6 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/fore) "xxp" = ( /turf/open/floor/plating, /area/security/range) +"xzd" = ( +/obj/effect/spawner/lootdrop/maintenance, +/obj/structure/closet, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "xzv" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -62403,24 +62539,22 @@ /turf/open/floor/plasteel, /area/commons/locker) "xEB" = ( -/obj/machinery/power/apc{ - areastring = "/area/ai_monitored/command/nuke_storage"; - dir = 1; - name = "Vault APC"; - pixel_y = 23 - }, -/obj/structure/cable{ - icon_state = "0-2" - }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/light{ +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral{ dir = 1 }, -/obj/structure/cable{ - icon_state = "2-8" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/turf/open/floor/circuit, -/area/ai_monitored/command/nuke_storage) +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "xEE" = ( /obj/item/radio/intercom{ pixel_y = 25 @@ -62521,14 +62655,6 @@ /obj/effect/spawner/lootdrop/bedsheet, /turf/open/floor/wood, /area/commons/dorms) -"xPY" = ( -/obj/structure/table/wood, -/obj/machinery/light{ - dir = 4 - }, -/obj/item/instrument/trombone, -/turf/open/floor/wood, -/area/service/theater) "xRa" = ( /obj/item/kirbyplants{ icon_state = "plant-20" @@ -62578,20 +62704,19 @@ /turf/open/space, /area/space/station_ruins) "xUL" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/effect/turf_decal/bot_white/right, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 }, -/obj/structure/cable{ - icon_state = "4-8" +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 }, -/obj/machinery/light, -/obj/machinery/camera/motion{ - c_tag = "Vault"; - dir = 1; - network = list("vault") +/obj/effect/turf_decal/tile/neutral{ + dir = 8 }, /turf/open/floor/plasteel/dark, -/area/ai_monitored/command/nuke_storage) +/area/command/gateway) "xUX" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -62631,6 +62756,15 @@ /obj/machinery/vending/clothing, /turf/open/floor/plasteel, /area/commons/fitness) +"xYf" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/hallway/primary/central) "xZD" = ( /obj/structure/closet/lasertag/red, /obj/item/clothing/under/misc/pj/red, @@ -62682,12 +62816,6 @@ }, /turf/open/floor/mineral/titanium/blue, /area/commons/toilet/locker) -"ycu" = ( -/obj/structure/cable{ - icon_state = "2-4" - }, -/turf/open/floor/plasteel, -/area/science/circuit) "ycY" = ( /obj/effect/turf_decal/tile/red{ dir = 1 @@ -62719,6 +62847,10 @@ /obj/machinery/status_display/evac, /turf/closed/wall, /area/hallway/primary/central) +"yfX" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/carpet/arcade, +/area/commons/arcade) "ygb" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 4 @@ -62732,8 +62864,14 @@ /turf/closed/wall/r_wall, /area/security/brig) "yhz" = ( -/obj/structure/table, -/obj/item/folder/blue, +/obj/machinery/vending/coffee, +/obj/machinery/light{ + dir = 8; + light_color = "#e8eaff" + }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel/dark, /area/hallway/primary/central) @@ -79051,10 +79189,10 @@ aQM aTv aUT aPz -aXQ -aXQ -aXQ -aXQ +aPA +hNm +aPA +aPA aXQ aXQ aXQ @@ -79308,14 +79446,14 @@ aPA aPA aPA aPA +got +pNS +sMI +kic aXQ aZt aXQ ycd -aXQ -omY -aXQ -gQX bhQ bjj bkF @@ -79564,15 +79702,15 @@ aQO aSh aTw aUU -aWn +aPA +aPA +sVt +pNS +qAu aXQ aZv aXQ bbL -aXQ -bdJ -aXQ -bgr bhQ bjj bkF @@ -79820,16 +79958,16 @@ aPA aQN aQN aQN -aUn -aTy +aQN +aWn +aPA +uTL +wwG +fBW aWy -aYe -bbq -aZw +mmx +tVB wTk -bct -bct -bct bhQ bjk bkE @@ -80077,16 +80215,16 @@ aPA aQS aQN aSV -aUo -aUX -aXp -baO -aZo -baw -cFG -hPs -cBn -bct +aYU +smN +aPA +mqH +xlX +aPA +aXQ +ddl +vyP +rxD bhQ bjk bkF @@ -80305,8 +80443,8 @@ aaa aaa alU alU -ank alU +ank alU aoW amC @@ -80334,14 +80472,14 @@ aPA aQP aQN aTB +aQN +aWq +aQN +aWq aUt -aWo -aXQ -aXQ -aXQ -aXQ -aXQ +aQN aXQ +qki aXQ aXQ bhQ @@ -80561,9 +80699,9 @@ aaa aaa aaa alU -anj -amD -amC +lLA +mzT +aKY alU arG amC @@ -80591,14 +80729,14 @@ aPA aQR aQN aQN -aUt +aQN aWq aQN +aWq +aUt aQN -aQN -aQN -vhb -bbO +fRe +qSo aPA bgt bhS @@ -80818,8 +80956,8 @@ aaf aaf aaf alU -amC -arK +jNr +gZB amC ank amC @@ -80848,14 +80986,14 @@ aPC aQN aQN aTz -aUp -ubj aXr -aZx -aQN -aQN -cBh -bdL +lZa +fFl +wrX +aUo +aYU +ihS +owx aPA bgt bhR @@ -81075,9 +81213,9 @@ aaa aaa aaa alU -anl -amE -amC +enJ +enJ +arL alU qjo alU @@ -81105,13 +81243,13 @@ aPD aQT aQN aTC -aUs +dyC aUY aXv aYS +aUt aQN -aQN -vhb +rbH bbO aPA aSg @@ -81332,8 +81470,8 @@ aaa aaa aaa alU -alU -alU +rwj +nPr amC alU alU @@ -81362,11 +81500,11 @@ aPA pqs aQN aTC -aUs +dyC mTG aXt ijG -aQN +aUt aQN aPA aPA @@ -81588,10 +81726,10 @@ aaa aaa aaa aaa -alU -anm -alU -amC +jFd +fDn +gFs +aKY alU xFM alU @@ -81619,11 +81757,11 @@ aPE aQV aQN aTC -aUu +aXv gxc aXt ijG -aQN +aUt aQN aZB aPA @@ -81864,7 +82002,7 @@ ayy aAO aBN aDe -aDe +fZR aFT aDe aIU @@ -81876,11 +82014,11 @@ aPA aiB aQN nLw -sLa +pnc oyl aXw qfk -aQN +aUt aQN aZA aPA @@ -82121,7 +82259,7 @@ aoX atJ aBQ aDq -aDo +aLM aFZ aHE aJc @@ -82133,11 +82271,11 @@ aPA aQX aQN aSi -aUv +aTy aWp aTy aTy -aTy +aUv aTy bbs bcw @@ -82372,20 +82510,20 @@ kiW alU amC ntt -nbr -ayz -ayz -ayz -aBR -aBR -aBR -aBR -aBR -aBR +nBI +alU +alU +alU +aBQ +aBQ aBR +aBQ +aBQ +aBQ +aBQ aLm -aLE -aOl +aLF +viF aPA vJu aQN @@ -82629,20 +82767,20 @@ cPb lZN amC jIW -ddI -alU -fgG -rqW -aGD +nBI +eky +mau +eAe +wUr tJi -aCr -hcb +aLP +tWj qTG -hcb -aKu -aLM -aLF -aOs +bwb +aKw +aLE +aLE +aOl aPG aPG aPG @@ -82887,17 +83025,17 @@ alU amC ntt ugq -alU -rPU -fne -aGr +kkK +jBZ +uOd +wUr aHI fOA tWj -oyz -hcb -aKu -aLL +qTG +bwb +aKw +aLE bDe aOl aPF @@ -83143,19 +83281,19 @@ qGw alU aFJ ntt -aAY -alU -aCh -pIf +nBI +wUr +fvU +gER kCo aHK -aCr +aHK uJx ikk -hcb -aKu -aLN -aLE +byS +ddI +aPO +qOB aOl aPH aRa @@ -83399,20 +83537,20 @@ lzk alU alU alU -atO +awa axp -aue -azH -eEe -aGv +tcU +fnE +gLw +wUr aCr -aCr -uJx -ikk -hcb -aKu -aLN +aLT +tWj +qTG +aJe +aKw aLE +aMS aOl aPF aQZ @@ -83655,20 +83793,20 @@ gQr xbi wje rQJ -uUi +arP avZ xtP -ayA -sNK -xmo -aBV +wUr +sYv +rDh +wUr mzB -mJG -szG -aHG +uSc +wHm +qTG aJe aKw -aLP +aLE aMR aNU aPJ @@ -83913,20 +84051,20 @@ inw gzY rtC izg -awa -axq -qyj -azI -rjQ -aBU +avZ +xtP +wUr +wUr +wUr +wUr myh inR wUr -iTq -hcb -aKu -aLN -aMQ +wUr +inR +wUr +aLE +aMY aNT aPI aRb @@ -84172,19 +84310,19 @@ aqR aqR kTj xxi -ayD -cGz -aMr +ngs +ngs +ngs ngs aDv uRS -uJx -dsC -hcb -aKu -aLN -aMS -aOt +aOs +ngs +uRS +fcn +trT +jSD +nDd aPK aPK aPK @@ -84428,20 +84566,20 @@ pjg sqg inq avZ -xxi -ayD -viF -aMr -aMr -aOH -uRS -lSa -oTW -hcb -aKu -aLN +ayz +arP +arP +arP +arP +arP +arP +arP +arP +arP +arP +aLE aMS -aOi +aOv lPr aPK aSl @@ -84685,20 +84823,20 @@ arP arP arP avZ -xxi -ayD -nez +ayz +arP +ktS +gXs +ktS +ktS +gXs +ktS +gXs +gXs +aKB ngV -xPY -pMQ -hcb -hcb -syJ -hcb -aKu -aLN aMS -aOi +aOv aLE aRc aSm @@ -84936,26 +85074,26 @@ anO aaa aaa arP -aqR +qae aqR arP asQ aqR awb axr -ayE -ayE -ayE -ayE +arP +gXs lLf -ayE -ayE -ayE -ayE -ayE +lLf +lLf +lLf +lLf +lLf +ktS +lSa aLl aMT -aOi +aOv aPL aPK aSm @@ -85198,21 +85336,21 @@ dPq arP asP cya -awa +avZ axu ayH -ayH -ayH -ayH +ktS +lLf +aHL lqO -ayH -aFV -ayH -ayH -aKy -aLn aMU -aOw +aFV +lLf +ktS +aKy +aLq +aMS +aOv aPN aPK aSn @@ -85456,19 +85594,19 @@ arP arP arP avZ -axt +azK ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG -aLm -aMS +ktS +lLf +aJi +aLL +aOi +aOw +bgM +cUx +nbr +oTW +aMT aOv aPM aPQ @@ -85713,11 +85851,11 @@ ngU kUC arP awc -axt -ayG azK -aBe -aBe +ayG +ktS +lLf +aER aDj aER aFX @@ -85970,19 +86108,19 @@ gzY gzY esK awb -axt +azK ayG -aBY -aBf +ktS +lLf aBX aDi aEQ aFW aHh aIV -ayG -aLN -aMS +nez +pMQ +syJ aOx aPc aRe @@ -86068,7 +86206,7 @@ bgO jBA btG aaa -kvl +iDo ctv iDo aaa @@ -86227,16 +86365,16 @@ iPX nnp arP awb -axt -ayG -aBf -aBg +azN +aHJ +ktS +lLf aBZ aDx aET -aET -bCx -aHJ +aOH +lLf +ktS aKd aLq aMY @@ -86485,17 +86623,17 @@ arP arP vgJ hSl -ayG -aBX -aBf -aBY -aDw -aES -aJh -aHv -aJh +arP +gXs +lLf +lLf +lLf +lLf +lLf +lLf +ktS aKA -aLN +qBi aMS aOz exP @@ -86742,17 +86880,17 @@ sfs aqR awb axt -ayG -azN -aBe -aBe -aDy -aEU -aGf -aHL -aJi +arP +ktS +gXs +ktS +ktS +gXs +ktS +gXs +gXs aKB -aLT +aLF aNp aOC aPQ @@ -86999,16 +87137,16 @@ aqR aqR awb axt -ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG -ayG +arP +arP +arP +arP +arP +arP +arP +arP +arP +arP aHP aNc aOB @@ -89346,7 +89484,7 @@ bmo bnR bpe bqB -bqq +unQ btD buO bwk @@ -89852,7 +89990,7 @@ bde kvL bcd bcd -gNC +bcd bcd bcd bcd @@ -90108,8 +90246,8 @@ bbh bcc bdd cVs -bfr -bgM +mwj +bbX bif aZM aZM @@ -90365,18 +90503,18 @@ bbk bbk bfu bbk -bfs -rTu +jmL +aZM aZM aZM -aaf -aaf ktS -aaf +gXs ktS -aaf ktS -aaf +gXs +ktS +ktS +gXs ktS fxV aXf @@ -90623,14 +90761,14 @@ bce bdf beb aYv -cUx -fcn -aaf -aaf ktS ktS -aaf -fxV +ktS +ktS +gXs +ktS +ktS +gXs fxV fxV fxV @@ -90880,15 +91018,15 @@ aZR bbm bec bfu -vBa -aBa -aBa -aBa -aBa -aBa -aBa -fxV -bsb +hty +lpQ +sUx +iZd +wql +wql +wql +wql +wql yhz ouQ cQT @@ -91137,20 +91275,20 @@ aZR aZR aZR bft -psk -aBa -aBT +wZI +gDO +aBW aDs aEN aGb -aBa +pub bqD bsa vCn -dzQ -bsa +pQN +pHt nbT -byS +aXf aJq wTf bCs @@ -91393,19 +91531,19 @@ bbm bbm bdh bee -bfv +nVz xUL -aBb +tyX gpD -aDr +aDt cJW aGa aHF bqF -buQ -buQ -pzk -buQ +wql +rML +pQN +uWq bxI bwa bAg @@ -91650,19 +91788,19 @@ cBj bcf bdg bed -bfv +nVz tyX pst -cTT +hoL alu aEM aGd uOJ bqE -bqE -bqE -bqE -bqE +omE +eFH +pgZ +jnV knx bvW bAf @@ -91907,9 +92045,9 @@ bbm bbm bdh bef -bfv +nVz gTx -aBc +tyX xEB aDt aEO @@ -91917,9 +92055,9 @@ aGc vOU rTD dml -dml +xYf oNz -dml +tnL bxK bwh bAh @@ -92164,21 +92302,21 @@ aZR aZR aZR aZR -bfw +otC wZI -aBa +gDO aBW bjy aEP nYe -aBa +ljV bqG -bsa +uwQ eih pQN -bsa +owa nbT -bwb +aNs aJq bBr bCv @@ -92422,17 +92560,17 @@ aZR bbm beh bfx -qcm -aBa -aBa -aBa -aBa -aBa -aBa +dYl +kzn +hQX +iss +iss +lcx wql -bsg -yhz -ouQ +wql +wql +cmP +fPM fTC nbT aJq @@ -92679,17 +92817,17 @@ bcg aZU beg aYB -qOB -qBi -aaf -aaf ktS ktS -aaf -fxV -fxV +ktS +ktS +gXs +ktS +ktS +gXs fxV fxV +oGv fxV fxV aJq @@ -92935,18 +93073,18 @@ bbp bbp bfx bbp -bfz -sqp +uZM +aZV aZV aZV -aaf -aaf ktS -aaf +gXs ktS -aaf ktS -aaf +gXs +ktS +ktS +gXs ktS fxV aJq @@ -93193,7 +93331,7 @@ bch bdi bbw bfy -bgS +bbw bik aZV aZV @@ -93450,7 +93588,7 @@ bdk mRQ bek bfB -bgU +vde bdk bjF blc @@ -93707,7 +93845,7 @@ bej bdj bej bfA -bgT +jfZ bil bej blb @@ -93964,7 +94102,7 @@ baQ wcB bcQ bfC -bgV +eOu bim bjG aZV @@ -94221,7 +94359,7 @@ baP asD bcP cBo -bgS +bbw bbw bbw aZV @@ -94478,7 +94616,7 @@ bcm bcm bem bfD -bgW +wxf bfD bjI aZV @@ -95485,7 +95623,7 @@ aAi uIO aCn xBk -dtx +hlS aGm aHV aDM @@ -95742,10 +95880,10 @@ kmw xrN aAh aAh +exX aAh aAh -aAh -aDN +voT aAh aMo aNC @@ -95998,9 +96136,9 @@ aze awr flE aAh -aDU -aBz -aBz +muv +gyQ +fOK aAh dTI ujv @@ -96255,11 +96393,11 @@ awr azX aAZ aCe -aDT -cPn -cPn -mkO -uQS +oTH +lPG +ncg +aCe +lfu aAh aJC aJC @@ -96512,12 +96650,12 @@ awr avG aBA aAh -aDP -aBx -aBx aAh -qqs -sYR +aAh +aAh +aAh +aJC +aJC aMq adq aQb @@ -96769,13 +96907,13 @@ lgX qvf wqF aAh -aAh -aAh -aAh -aAh -aAh -aAh -aKR +nGR +qCw +fCJ +fiv +aJC +fWi +hIL aKR fxe aPY @@ -97025,14 +97163,14 @@ axT axW aAl cHf +tZp +wxk +xwB +lWD +dvb aJC -aDR -aFl -kqI -aHZ -aJC -aKJ -hIL +nNF +aKR aKR wxT moD @@ -97282,14 +97420,14 @@ axS azk aAk tvi -aJC -aDY -aDY -kqI -aKR -aJk -aKR -aKR +tZp +flG +jqD +giy +yfX +wII +aMu +kEJ aKR aKR aKR @@ -97377,7 +97515,7 @@ aaa aaa aaa aaa -jAD +fIs aaa aaa aaa @@ -97539,14 +97677,14 @@ awr awr aAn rqk +tZp +mcE +dsi +fgl +rZE aJC -aEc -aFk -aGw -aKR -aJC -aKr -aKR +kgB +oDD aKR sLj sLj @@ -97796,14 +97934,14 @@ awr awr aAn jGW -aJC -aJC -plC -oAb -aJC +tZp +tZp +dGa +tZp +tZp aJC aKq -aKR +oDD aNF hOv oax @@ -98056,11 +98194,11 @@ uxY aBC aCt aEA -aGz -aIb +lsS +kuw aJC -aKN -aKR +eTA +oDD aKR aOJ oIJ @@ -98313,11 +98451,11 @@ vyp aBB aBB aBB -aGy +tZa aIa cNE aKM -aMu +feG aMu feG tif @@ -98639,7 +98777,7 @@ cCS bMK bMK bMK -gXs +gJi aaa aaa aaa @@ -99153,7 +99291,7 @@ bMK bMK bMK bMK -aaf +aag aoV aoV aoV @@ -103180,7 +103318,7 @@ aaf aaf aaf aaf -cxW +aag alO anf anf @@ -111476,7 +111614,7 @@ mRe olr bPL cVK -bTo +uCn eaI cbZ bSl @@ -111986,11 +112124,11 @@ cbe bTp vCt bVs -fKl -bXt -bPM +suN +pCE +qoT bZh -itG +bXs cbe wvX bSl @@ -112240,14 +112378,14 @@ bEC bSl dMZ bXs +vPE bXs -bXs -gwd -ycu -oHU -uNu -bXs -bXs +bVt +dfh +jSO +jgm +oUh +vPE bXs bXs bSl @@ -112497,14 +112635,14 @@ cOe bSl bUq flc -vPE -bXs -bVt -dfh -jSO -jgm -oUh -vPE +bSl +bSl +bSl +bSl +bSl +bSl +bSl +bSl jrE saK bSl @@ -112750,17 +112888,17 @@ bKb cNX cNZ cNZ -jCq -bSl -bSl -bSl -bSl -bSl -bSl +nyn bSl bSl bSl bSl +kPi +cOe +cae +oMT +wCQ +xzd bSl bSl bSl @@ -113006,22 +113144,22 @@ bGL bKd cNY bMC -cOb +lVy jHt bPO kob bSm bTr -bTr -bTr -bTr -bTr -bTr +tyE +lkT +cUb +lkT +tyE bTr bTr cbg bTr -bTr +tyE bTr nGt cbg @@ -113539,13 +113677,13 @@ ccW cNW clt cNW -cfv +wYn cNW -mug -hUJ -ixd +gOF +gGK +lOr cNW -ktS +gXs aaf aaf aaf @@ -113794,13 +113932,13 @@ cNW wly ccV noa -clu -cNW -xgs +iQg +ccU +pcz srk +tAy srk -srk -oYQ +wfC cNW aaa aaf @@ -114055,11 +114193,11 @@ ceT cNW gGK chH -dEh +eUX srk gGK cNW -ktS +gXs aaf aaf aaf @@ -114310,11 +114448,11 @@ cNW cNW cPH cNW -gGK -pcK +xgs +qlV srk -dHp -uRn +fkh +gcx cNW aaa aaf @@ -114568,10 +114706,10 @@ cNW ceU cNW cgy +ltv gGK -gGK -uRn -dBm +teS +jdu cNW aaa aaf @@ -114805,7 +114943,7 @@ gXs aaf aaa cNW -bPP +pzP tsq pkS olh @@ -114830,7 +114968,7 @@ cNW cNW cNW cNW -ktS +gXs aaf aaf aaf diff --git a/_maps/map_files/Deltastation/DeltaStation2.dmm b/_maps/map_files/Deltastation/DeltaStation2.dmm index 2c871a90bd..2108c61d32 100644 --- a/_maps/map_files/Deltastation/DeltaStation2.dmm +++ b/_maps/map_files/Deltastation/DeltaStation2.dmm @@ -13710,7 +13710,7 @@ /turf/open/floor/plating{ initial_gas_mix = "o2=0.01;n2=0.01"; luminosity = 2; - temperature = 2.7 + initial_temperature = 2.7 }, /area/security/prison) "ban" = ( @@ -14373,7 +14373,7 @@ /turf/open/floor/plating{ initial_gas_mix = "o2=0.01;n2=0.01"; luminosity = 2; - temperature = 2.7 + initial_temperature = 2.7 }, /area/security/prison) "bdo" = ( @@ -111598,7 +111598,7 @@ icon_state = "4-8" }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ +/obj/machinery/door/airlock/command{ name = "Quartermaster's Quarters"; req_access_txt = "41" }, @@ -127746,7 +127746,7 @@ icon_state = "4-8" }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining{ +/obj/machinery/door/airlock/command{ name = "Quartermaster's Office"; req_access_txt = "41" }, diff --git a/_maps/map_files/MetaStation/MetaStation.dmm b/_maps/map_files/MetaStation/MetaStation.dmm index 6f6872b11a..57a4831073 100644 --- a/_maps/map_files/MetaStation/MetaStation.dmm +++ b/_maps/map_files/MetaStation/MetaStation.dmm @@ -36739,14 +36739,12 @@ dir = 1 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "cAJ" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/cable/yellow{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/manifold4w/supplymain/hidden, /turf/open/floor/plasteel, /area/science/mixing) "cAK" = ( @@ -36755,7 +36753,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "cAL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -37139,7 +37137,7 @@ dir = 8 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "cBE" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/yellow{ @@ -37149,7 +37147,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "cBF" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 4 @@ -37158,7 +37156,7 @@ pixel_x = 32 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "cBG" = ( /obj/machinery/door/airlock/research{ name = "Toxins Launch Room"; @@ -37556,6 +37554,9 @@ /obj/machinery/light{ dir = 8 }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "cCE" = ( @@ -44861,6 +44862,13 @@ /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ dir = 1 }, +/obj/machinery/door/window/northleft{ + base_state = "right"; + dir = 8; + icon_state = "right"; + name = "Containment Pen #6"; + req_access_txt = "55" + }, /turf/open/floor/plasteel, /area/science/xenobiology) "cTg" = ( @@ -54488,7 +54496,7 @@ "gLC" = ( /obj/structure/reagent_dispensers/water_cooler, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "gLD" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -56555,7 +56563,7 @@ dir = 4 }, /obj/machinery/door/firedoor, -/obj/machinery/door/airlock/mining/glass{ +/obj/machinery/door/airlock/command{ name = "Quartermaster"; req_access_txt = "41" }, @@ -70541,11 +70549,11 @@ /turf/open/floor/grass, /area/service/hydroponics/garden) "qqg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "qqK" = ( /obj/structure/cable/yellow{ icon_state = "1-2" @@ -78260,7 +78268,7 @@ dir = 4 }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "vhM" = ( /obj/machinery/teleport/hub, /turf/open/floor/plating, @@ -81101,7 +81109,7 @@ }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "wRz" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -82275,8 +82283,12 @@ /area/service/library) "xAp" = ( /obj/structure/chair/comfy, +/obj/machinery/airalarm{ + dir = 4; + pixel_x = -22 + }, /turf/open/floor/plasteel, -/area/science/misc_lab) +/area/science/mixing) "xAs" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/grunge{ @@ -82576,6 +82588,16 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/commons/dorms) +"xHe" = ( +/obj/structure/cable/yellow{ + icon_state = "1-2" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "xHm" = ( /obj/machinery/holopad, /obj/structure/cable/yellow{ @@ -118567,7 +118589,7 @@ cJa cJa gHh wRy -wRy +xHe wRy cBE cAJ diff --git a/_maps/map_files/OmegaStation/OmegaStation.dmm b/_maps/map_files/OmegaStation/OmegaStation.dmm index 385df5e097..92f9ff0c53 100644 --- a/_maps/map_files/OmegaStation/OmegaStation.dmm +++ b/_maps/map_files/OmegaStation/OmegaStation.dmm @@ -1648,19 +1648,12 @@ /turf/open/floor/plating, /area/maintenance/starboard) "acx" = ( -/obj/effect/decal/cleanable/blood/old, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 }, -/obj/effect/landmark/xeno_spawn, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/turf_decal/delivery, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "acy" = ( /obj/machinery/door/airlock/external{ name = "External Airlock"; @@ -5386,12 +5379,14 @@ /turf/open/floor/plating/asteroid, /area/security/prison) "aiw" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/item/stack/cable_coil/white, /obj/item/stack/cable_coil/white, /obj/item/stack/sheet/glass, /obj/item/stack/sheet/glass, /obj/item/circuitboard/machine/microwave, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -5797,9 +5792,6 @@ /turf/open/floor/plating, /area/security/brig) "ajd" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, @@ -5810,6 +5802,7 @@ /obj/effect/turf_decal/tile/red{ dir = 1 }, +/obj/structure/closet/crate/bin, /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "aje" = ( @@ -6468,12 +6461,10 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/chair, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6489,6 +6480,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/chair, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -6504,6 +6496,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/cable/white{ + icon_state = "2-8" + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -7138,26 +7133,17 @@ "ald" = ( /obj/structure/sign/nanotrasen, /turf/closed/wall, -/area/commons/toilet/restrooms) +/area/service/lawoffice) "ale" = ( -/obj/machinery/door/firedoor, -/obj/machinery/door/airlock{ - name = "Primary Restroom" - }, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "alf" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/commons/toilet/restrooms) +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "alg" = ( /turf/closed/wall/r_wall, /area/command/teleporter) @@ -7614,35 +7600,29 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "alT" = ( -/obj/structure/table, -/obj/item/storage/firstaid/regular, /obj/structure/extinguisher_cabinet{ pixel_x = -26 }, +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, /obj/machinery/newscaster{ pixel_y = 32 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "alU" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/delivery, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "alV" = ( -/obj/structure/urinal{ - pixel_y = 28 - }, /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/window/reinforced/spawner/east, +/obj/structure/chair, +/turf/open/floor/wood, +/area/service/lawoffice) "alW" = ( /obj/structure/urinal{ pixel_y = 28 @@ -7650,12 +7630,9 @@ /turf/open/floor/plasteel/freezer, /area/commons/toilet/restrooms) "alX" = ( -/obj/structure/closet/crate/bin, -/obj/machinery/light_switch{ - pixel_y = 24 - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/machinery/vending/wardrobe/law_wardrobe, +/turf/open/floor/wood, +/area/service/lawoffice) "alY" = ( /obj/machinery/shieldwallgen, /obj/machinery/button/door{ @@ -8143,50 +8120,31 @@ /turf/open/floor/plasteel, /area/security/brig) "amO" = ( -/obj/structure/mirror{ - pixel_x = -26 - }, -/obj/structure/sink{ - dir = 8; - pixel_x = -12 - }, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "amP" = ( -/obj/machinery/firealarm{ - dir = 1; - pixel_y = -26 - }, -/obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, +/turf/open/floor/wood, +/area/service/lawoffice) +"amQ" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/east, +/obj/structure/window/reinforced/spawner, +/obj/item/clipboard, +/obj/item/folder/red, +/turf/open/floor/wood, +/area/service/lawoffice) +"amR" = ( /obj/structure/cable/white{ icon_state = "1-4" }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) -"amQ" = ( -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) -"amR" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, -/obj/machinery/light/small, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "amS" = ( /obj/machinery/camera{ - c_tag = "Locker Room Toilets"; + c_tag = "Law Office"; dir = 8 }, /obj/machinery/power/apc{ @@ -8198,8 +8156,11 @@ /obj/structure/cable/white{ icon_state = "0-8" }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/rack, +/obj/item/storage/briefcase, +/obj/item/storage/briefcase, +/turf/open/floor/wood, +/area/service/lawoffice) "amT" = ( /obj/structure/table/reinforced, /obj/item/stack/cable_coil/white, @@ -8665,15 +8626,15 @@ /turf/open/floor/plasteel, /area/hallway/primary/port/fore) "anJ" = ( -/obj/machinery/door/airlock{ - name = "Toilet Unit" +/obj/structure/chair{ + dir = 4 }, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/firealarm{ + dir = 4; + pixel_x = -24 }, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "anK" = ( /obj/structure/closet/secure_closet/engineering_chief, /obj/effect/turf_decal/tile/neutral{ @@ -9242,40 +9203,30 @@ /turf/open/floor/plasteel, /area/hallway/primary/port) "aoC" = ( -/obj/effect/decal/cleanable/vomit/old, -/obj/structure/toilet{ - dir = 8 +/obj/structure/chair{ + dir = 4 }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, -/obj/machinery/light/small, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "aoD" = ( -/obj/structure/toilet{ - dir = 8 - }, -/obj/machinery/newscaster{ - pixel_x = -32 - }, /obj/machinery/light/small, -/obj/effect/landmark/blobstart, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/west, +/obj/item/folder/blue, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "aoE" = ( -/obj/structure/toilet{ - dir = 8 +/obj/machinery/airalarm{ + dir = 1; + pixel_y = -22 }, -/obj/machinery/newscaster{ - pixel_x = -32 +/obj/structure/filingcabinet/employment, +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 }, -/obj/machinery/light/small, -/obj/effect/landmark/start/assistant, -/obj/effect/turf_decal/bot, -/turf/open/floor/plasteel/freezer, -/area/commons/toilet/restrooms) +/turf/open/floor/wood, +/area/service/lawoffice) "aoF" = ( /obj/structure/table/reinforced, /obj/item/stock_parts/cell/high, @@ -9379,7 +9330,6 @@ /turf/open/floor/plasteel, /area/service/bar/atrium) "aoO" = ( -/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -9392,12 +9342,12 @@ /obj/effect/turf_decal/tile/neutral{ dir = 1 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoP" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -9414,22 +9364,18 @@ /turf/open/floor/plasteel, /area/service/bar/atrium) "aoQ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoR" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/atmospherics/components/unary/vent_pump/on, /obj/structure/cable/white{ icon_state = "4-8" @@ -9438,6 +9384,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/service/bar/atrium) "aoS" = ( @@ -9445,9 +9394,6 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -9457,26 +9403,18 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) -"aoT" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, +/turf/open/floor/plating, /area/maintenance/starboard/central) "aoU" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, /obj/structure/cable/white{ icon_state = "2-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "aoV" = ( @@ -10266,27 +10204,18 @@ /turf/closed/wall, /area/maintenance/starboard/central) "apZ" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /turf/open/floor/plating, /area/maintenance/starboard/central) "aqa" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "panelscorched" }, /area/maintenance/starboard/central) "aqb" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/effect/turf_decal/stripes/line{ dir = 10 }, @@ -10936,19 +10865,14 @@ /turf/open/floor/plating, /area/service/bar/atrium) "arg" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating{ icon_state = "platingdmg3" }, /area/maintenance/starboard/central) -"arh" = ( -/obj/structure/girder, -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plating, -/area/maintenance/starboard/central) "ari" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/extinguisher_cabinet{ @@ -11758,19 +11682,21 @@ /turf/open/floor/plasteel/dark, /area/service/bar/atrium) "ask" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "asl" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 - }, /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/maintenance/starboard/central) "asm" = ( @@ -12453,24 +12379,6 @@ /obj/effect/spawner/structure/window/reinforced/tinted, /turf/open/floor/plating, /area/security/detectives_office) -"atl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 5 - }, -/turf/closed/wall, -/area/service/bar/atrium) -"atm" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/bar/atrium) -"atn" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 - }, -/turf/closed/wall, -/area/service/bar/atrium) "ato" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -12487,8 +12395,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "atq" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -13161,10 +13068,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"aum" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/service/bar/atrium) "aun" = ( /obj/effect/landmark/blobstart, /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13196,8 +13099,7 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "auq" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible, @@ -13816,9 +13718,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -13829,13 +13728,10 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/service/bar/atrium) -"avr" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, -/turf/closed/wall, +/turf/open/floor/plasteel/dark, /area/service/bar/atrium) "avs" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, @@ -13865,23 +13761,23 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "avv" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/line{ - dir = 9 +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) -"avw" = ( -/obj/machinery/shieldgen, -/obj/effect/turf_decal/stripes/line{ - dir = 5 +/obj/structure/mirror{ + pixel_x = -26 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "avx" = ( /obj/machinery/atmospherics/pipe/simple/yellow/visible, /obj/machinery/computer/atmos_control/tank/oxygen_tank{ @@ -14552,7 +14448,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -14594,11 +14489,9 @@ }, /area/hallway/primary/starboard/fore) "awz" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/landmark/start/assistant, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "awA" = ( /turf/open/floor/engine/o2, /area/engineering/atmos) @@ -14970,21 +14863,37 @@ /turf/open/floor/plating, /area/maintenance/starboard/central) "axf" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 10 +/obj/structure/table, +/obj/effect/turf_decal/bot, +/obj/structure/bedsheetbin/towel, +/obj/structure/sign/poster/official/cleanliness{ + pixel_y = -32 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/newscaster{ + pixel_x = -32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/obj/machinery/firealarm{ + dir = 1; + pixel_x = -26; + pixel_y = -26 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "axg" = ( -/obj/structure/rack, -/obj/effect/spawner/lootdrop/maintenance, -/obj/effect/turf_decal/stripes/line{ - dir = 6 +/obj/machinery/light/small, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 }, -/obj/item/wrench, -/obj/item/wirecutters, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/effect/turf_decal/bot, +/obj/machinery/light_switch{ + pixel_x = 8; + pixel_y = -24 + }, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "axh" = ( /obj/structure/closet, /obj/effect/spawner/lootdrop/maintenance{ @@ -16011,7 +15920,6 @@ /area/maintenance/starboard/central) "ayT" = ( /obj/structure/girder, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/starboard/central) "ayU" = ( @@ -17273,16 +17181,6 @@ icon_state = "platingdmg3" }, /area/maintenance/starboard/central) -"aAW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating, -/area/maintenance/starboard/central) "aAX" = ( /obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /obj/structure/cable/white{ @@ -17951,10 +17849,6 @@ "aCe" = ( /turf/closed/wall, /area/service/kitchen) -"aCf" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/service/kitchen) "aCg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -19079,32 +18973,13 @@ /area/service/kitchen) "aDU" = ( /obj/effect/landmark/start/cook, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 }, /turf/open/floor/plasteel/white, /area/service/kitchen) -"aDV" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 1 - }, -/obj/effect/turf_decal/tile/red, -/obj/effect/turf_decal/tile/red{ - dir = 4 - }, -/obj/effect/turf_decal/tile/red{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/service/kitchen) "aDW" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/white, /area/service/kitchen) "aDX" = ( @@ -19112,9 +18987,6 @@ name = "Station Intercom"; pixel_x = 28 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/red{ dir = 1 }, @@ -19127,12 +18999,6 @@ }, /turf/open/floor/plasteel, /area/service/kitchen) -"aDY" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/kitchen) "aDZ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -19934,7 +19800,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -22470,15 +22335,13 @@ /turf/open/floor/plasteel/freezer, /area/service/kitchen) "aIT" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 8 - }, /obj/structure/cable/white{ icon_state = "1-2" }, /obj/structure/cable/white{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/freezer, /area/service/kitchen) "aIU" = ( @@ -22487,9 +22350,6 @@ name = "sink"; pixel_y = 28 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "2-8" }, @@ -22503,16 +22363,10 @@ /obj/machinery/light{ dir = 1 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/service/kitchen) "aIW" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/reagent_dispensers/cooking_oil, /obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, @@ -23665,6 +23519,7 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/green/line, /turf/open/floor/plating, /area/maintenance/port/aft) "aKK" = ( @@ -24055,9 +23910,6 @@ dir = 8; pixel_x = 24 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -24066,17 +23918,8 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"aLh" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall, -/area/service/kitchen) "aLi" = ( /obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -24088,32 +23931,12 @@ /obj/structure/extinguisher_cabinet{ pixel_y = -32 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/turf_decal/delivery, /obj/effect/turf_decal/stripes/line{ dir = 1 }, /turf/open/floor/plasteel, /area/service/kitchen) -"aLk" = ( -/obj/structure/kitchenspike, -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 - }, -/obj/effect/turf_decal/bot, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/plasteel, -/area/service/kitchen) -"aLl" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, -/turf/closed/wall/rust, -/area/service/kitchen) "aLm" = ( /obj/structure/extinguisher_cabinet{ pixel_x = -24 @@ -24872,23 +24695,16 @@ /turf/closed/wall, /area/maintenance/port/aft) "aME" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 }, -/obj/structure/reagent_dispensers/fueltank, -/turf/open/floor/plasteel, -/area/maintenance/port/aft) -"aMF" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 1 +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/turf/open/floor/plating{ + icon_state = "platingdmg2" }, -/obj/structure/closet/crate, -/obj/item/stack/ore/silver, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/stack/ore/iron, -/obj/item/pickaxe/emergency, -/turf/open/floor/plasteel, /area/maintenance/port/aft) "aMG" = ( /obj/structure/girder, @@ -25297,6 +25113,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/machinery/power/apc{ + areastring = "/area/service/hydroponics"; + name = "Hydroponics APC"; + pixel_y = -26 + }, /turf/open/floor/plasteel, /area/service/hydroponics) "aNr" = ( @@ -25405,18 +25226,6 @@ }, /turf/open/floor/plating, /area/maintenance/starboard/central) -"aNC" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg2" - }, -/area/maintenance/starboard/central) "aND" = ( /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 1 @@ -25891,13 +25700,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/structure/rack, +/obj/machinery/shieldgen, /turf/open/floor/plasteel, /area/maintenance/port/aft) -"aOt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall, -/area/maintenance/starboard/central) "aOu" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -26081,6 +25886,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 6 }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aOJ" = ( @@ -26731,20 +26539,6 @@ /obj/structure/disposalpipe/segment, /turf/closed/wall, /area/medical/morgue) -"aPC" = ( -/obj/machinery/computer/security/telescreen/entertainment, -/obj/structure/bodycontainer/morgue{ - dir = 2 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel/dark, -/area/medical/morgue) "aPD" = ( /obj/machinery/light, /obj/structure/noticeboard{ @@ -27261,8 +27055,10 @@ /turf/open/floor/plasteel, /area/hallway/primary/central) "aQw" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /obj/effect/turf_decal/tile/purple, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) "aQx" = ( @@ -27680,6 +27476,7 @@ /turf/open/floor/plating, /area/command/heads_quarters/cmo) "aRm" = ( +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aRn" = ( @@ -28156,6 +27953,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, +/obj/machinery/light/small{ + dir = 8 + }, +/obj/machinery/shieldgen, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aSg" = ( @@ -29580,6 +29381,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/effect/turf_decal/trimline/green/line, /turf/open/floor/plating, /area/maintenance/port/aft) "aUM" = ( @@ -29602,6 +29404,10 @@ /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aUO" = ( @@ -29710,6 +29516,10 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVa" = ( @@ -29720,6 +29530,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVb" = ( @@ -29759,6 +29573,10 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -29777,6 +29595,10 @@ dir = 1 }, /obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVe" = ( @@ -29787,6 +29609,10 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVf" = ( @@ -29803,6 +29629,10 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVg" = ( @@ -30084,6 +29914,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 10 }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 9; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVJ" = ( @@ -30093,6 +29927,10 @@ /obj/structure/cable/white{ icon_state = "2-4" }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVK" = ( @@ -30116,6 +29954,10 @@ /obj/structure/cable/white{ icon_state = "1-8" }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aVN" = ( @@ -30171,7 +30013,6 @@ /turf/open/floor/plasteel, /area/maintenance/port/aft) "aVS" = ( -/obj/structure/bookcase/random/fiction, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30182,6 +30023,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, /area/service/library) "aVT" = ( @@ -30191,7 +30033,6 @@ /turf/open/floor/plasteel/dark, /area/service/library) "aVU" = ( -/obj/structure/bookcase/random/adult, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30202,10 +30043,11 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/structure/bookcase/random/reference, /turf/open/floor/plasteel/dark, /area/service/library) "aVV" = ( -/obj/structure/bookcase/random/adult, +/obj/structure/bookcase/random/religion, /turf/open/floor/plasteel/dark, /area/service/library) "aVW" = ( @@ -30564,6 +30406,10 @@ pixel_x = -32 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/trimline/green/line{ + dir = 8; + icon_state = "trimline" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aWx" = ( @@ -30914,6 +30760,10 @@ /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/effect/turf_decal/trimline/green/corner{ + dir = 1; + icon_state = "trimline_corner" + }, /turf/open/floor/plating, /area/maintenance/port/aft) "aXe" = ( @@ -30929,11 +30779,12 @@ /turf/closed/wall, /area/service/library) "aXg" = ( -/obj/structure/bookcase/random/nonfiction, +/obj/structure/sign/painting{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/service/library) "aXh" = ( -/obj/structure/bookcase/random/nonfiction, /obj/machinery/light, /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -30962,7 +30813,6 @@ /turf/open/floor/plating, /area/maintenance/port/aft) "aXj" = ( -/obj/structure/bookcase/random/reference, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, @@ -30973,10 +30823,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/service/library) -"aXk" = ( -/obj/structure/bookcase/random/reference, +/obj/structure/sign/painting{ + pixel_y = -32 + }, /turf/open/floor/plasteel/dark, /area/service/library) "aXl" = ( @@ -31337,10 +31186,12 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aXO" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aXP" = ( @@ -31843,6 +31694,7 @@ "aYC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/effect/landmark/event_spawn, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYD" = ( @@ -31866,11 +31718,13 @@ /area/medical/virology) "aYF" = ( /obj/structure/chair/comfy/black, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYG" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/chair/comfy/black, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aYH" = ( @@ -32087,6 +31941,7 @@ dir = 1 }, /obj/structure/window/reinforced/spawner/north, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aYY" = ( @@ -32198,6 +32053,7 @@ dir = 1 }, /obj/effect/landmark/xeno_spawn, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZo" = ( @@ -32208,6 +32064,7 @@ /obj/machinery/door/window/northright{ name = "Theatre Stage" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZp" = ( @@ -32215,6 +32072,7 @@ /obj/effect/turf_decal/tile/bar{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZq" = ( @@ -32228,6 +32086,7 @@ name = "Maintenance Hatch"; req_access_txt = "12" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZr" = ( @@ -32238,6 +32097,7 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel, /area/maintenance/port/aft) "aZs" = ( @@ -32248,6 +32108,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZt" = ( @@ -32260,6 +32121,7 @@ /obj/structure/table/wood, /obj/item/clothing/suit/syndicatefake, /obj/item/clothing/head/syndicatefake, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZu" = ( @@ -32297,7 +32159,8 @@ /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, -/obj/structure/bookcase{ +/obj/structure/bookcase/random/adult{ + desc = "Oh whoa, what's this?"; name = "Forbidden Knowledge" }, /turf/open/floor/wood, @@ -32320,6 +32183,7 @@ pixel_y = -3 }, /obj/item/lipstick/random, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZy" = ( @@ -32334,6 +32198,7 @@ /obj/item/clothing/head/helmet/justice/escape{ name = "justice helmet" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZz" = ( @@ -32344,6 +32209,7 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plasteel/dark, /area/maintenance/port/aft) "aZA" = ( @@ -32387,6 +32253,7 @@ /obj/structure/sign/poster/random{ pixel_x = 32 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/wood, /area/maintenance/port/aft) "aZD" = ( @@ -33440,15 +33307,6 @@ }, /turf/open/floor/plating, /area/maintenance/port/aft) -"bbe" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating/airless, -/area/maintenance/port/aft) "bbf" = ( /obj/machinery/power/smes, /obj/structure/cable/white{ @@ -34363,7 +34221,16 @@ /obj/structure/closet/l3closet/scientist{ pixel_x = -2 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bcF" = ( /obj/structure/sign/warning/securearea, @@ -35296,7 +35163,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/effect/turf_decal/tile/blue, +/obj/effect/turf_decal/tile/green, /turf/open/floor/plasteel/white, /area/medical/medbay/zone3) "bdV" = ( @@ -35304,8 +35171,8 @@ /obj/structure/cable/white{ icon_state = "1-2" }, -/obj/effect/turf_decal/tile/blue, -/obj/effect/turf_decal/tile/blue{ +/obj/effect/turf_decal/tile/green, +/obj/effect/turf_decal/tile/green{ dir = 8 }, /turf/open/floor/plasteel/white, @@ -35619,7 +35486,11 @@ }, /obj/effect/turf_decal/stripes/line, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bev" = ( /obj/structure/table/plasmaglass, @@ -35709,7 +35580,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, /area/science/mixing) "beB" = ( /obj/structure/cable/white{ @@ -35993,7 +35868,11 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/dark, /area/science/mixing) "beW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -36038,7 +35917,11 @@ /obj/machinery/portable_atmospherics/scrubber, /obj/item/storage/firstaid/toxin, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bfc" = ( /obj/structure/cable/white{ @@ -36193,7 +36076,10 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ dir = 8 }, /turf/open/floor/plasteel, @@ -36208,12 +36094,22 @@ /obj/machinery/atmospherics/pipe/manifold/supply/hidden{ dir = 4 }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating, /area/maintenance/starboard/aft) "bfs" = ( /obj/machinery/vending/wardrobe/science_wardrobe, /obj/machinery/light, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 1 + }, +/obj/effect/turf_decal/tile/neutral{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "bft" = ( /obj/structure/closet/secure_closet/RD, @@ -36980,74 +36876,24 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/sand, +/obj/effect/turf_decal/sand, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "bgv" = ( -/obj/machinery/biogenerator, -/obj/item/wrench, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, /obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgw" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/machinery/airalarm{ - pixel_y = 24 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgx" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/tomato, -/obj/item/seeds/tea, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgy" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgz" = ( -/obj/machinery/seed_extractor, -/obj/item/reagent_containers/glass/bucket, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bgA" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/poppy, -/obj/item/reagent_containers/food/snacks/grown/cherries, -/obj/item/shovel/spade, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral, -/obj/effect/turf_decal/tile/neutral{ - dir = 8 - }, +/obj/structure/bedsheetbin/towel, +/obj/structure/table/wood/poker, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "bgB" = ( @@ -37399,32 +37245,26 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bhj" = ( +/obj/effect/turf_decal/sand/plating, /obj/structure/sink{ dir = 8; pixel_x = -12; pixel_y = 2 }, -/obj/structure/sign/warning/nosmoking{ +/obj/structure/sign/poster/ripped{ pixel_x = -32 }, /turf/open/floor/plating, /area/maintenance/starboard/aft) -"bhk" = ( -/turf/open/floor/plating, -/area/maintenance/starboard) "bhm" = ( -/obj/effect/landmark/xeno_spawn, -/turf/open/floor/plating, +/turf/open/floor/plasteel/yellowsiding, /area/maintenance/starboard/aft) "bhn" = ( -/obj/structure/sink{ - dir = 4; - pixel_x = 11 +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 8; + icon_state = "yellowcornersiding" }, -/obj/structure/sign/departments/botany{ - pixel_x = 32 - }, -/turf/open/floor/plating, /area/maintenance/starboard/aft) "bho" = ( /obj/machinery/door/airlock/silver{ @@ -37794,77 +37634,11 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) -"bhT" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/harebell, -/obj/item/reagent_containers/food/snacks/grown/watermelon, -/obj/item/cultivator, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhU" = ( -/obj/item/kirbyplants{ - icon_state = "plant-21"; - pixel_x = -3; - pixel_y = 3 - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhV" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/wheat, -/obj/item/reagent_containers/glass/bottle/nutrient/ez, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhW" = ( -/obj/machinery/light/small, -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "bhX" = ( -/obj/machinery/hydroponics/soil, -/obj/item/reagent_containers/food/snacks/grown/tea, -/obj/item/hatchet, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 +/obj/machinery/pool/filter{ + pixel_y = 16 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) -"bhY" = ( -/obj/machinery/hydroponics/soil, -/obj/item/seeds/tower, -/obj/item/reagent_containers/glass/bottle/nutrient/rh, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/turf/open/pool, /area/maintenance/starboard/aft) "bhZ" = ( /obj/machinery/light_switch{ @@ -39571,21 +39345,27 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit) +"boD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/closed/wall, +/area/commons/toilet/restrooms) "boE" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "bpj" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/machinery/camera{ c_tag = "Toxins Launch Room Access"; dir = 4 }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) "bpn" = ( @@ -39607,6 +39387,9 @@ /obj/machinery/meter/atmos, /turf/open/floor/plasteel, /area/engineering/atmos) +"bsq" = ( +/turf/closed/mineral/random/labormineral, +/area/maintenance/starboard/aft) "bsv" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ @@ -40547,6 +40330,7 @@ /obj/structure/cable/white{ icon_state = "0-8" }, +/obj/effect/decal/cleanable/dirt/dust, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -40621,14 +40405,21 @@ }, /area/engineering/atmos) "bOJ" = ( -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/machinery/atmospherics/components/unary/thermomachine/heater{ dir = 8 }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/mixing) +"bRf" = ( +/obj/structure/sign/warning/securearea, +/turf/closed/wall, +/area/command/gateway) +"bVs" = ( +/obj/structure/girder, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/maintenance/port/aft) "bYE" = ( /obj/structure/sign/warning/fire, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -40648,6 +40439,13 @@ dir = 1 }, /area/engineering/atmos) +"caJ" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/turf/open/floor/plating, +/area/maintenance/starboard) "ccy" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40767,6 +40565,10 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"cGA" = ( +/obj/machinery/pool/controller, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "cRz" = ( /obj/machinery/button/door{ id = "supplybridge"; @@ -40791,6 +40593,18 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) +"cUd" = ( +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/machinery/power/apc/highcap/ten_k{ + areastring = "/area/command/gateway"; + dir = 1; + name = "Gateway APC"; + pixel_y = 23 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "cWv" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /turf/closed/wall/r_wall, @@ -40832,7 +40646,7 @@ "dfK" = ( /obj/machinery/portable_atmospherics/canister/toxins, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "dfP" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -40896,6 +40710,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"dvB" = ( +/obj/structure/sink/puddle, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "dFV" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -40924,6 +40742,20 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"dMx" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel, +/area/command/gateway) +"dQg" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/hallway/secondary/exit) "dQC" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -40941,6 +40773,12 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"dSq" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 4; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) "dXv" = ( /obj/item/transfer_valve{ pixel_x = -5 @@ -40956,7 +40794,7 @@ receive_ore_updates = 1 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "dYC" = ( /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ @@ -40982,6 +40820,11 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ekG" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/starboard/aft) "emA" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -40990,6 +40833,11 @@ icon_state = "4-8" }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/structure/cable/white{ + icon_state = "2-8" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "eva" = ( @@ -41106,9 +40954,20 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) -"eGm" = ( -/turf/closed/wall/r_wall, -/area/science/storage) +"eOg" = ( +/obj/structure/closet/crate{ + icon_state = "crateopen" + }, +/obj/effect/spawner/lootdrop/maintenance{ + lootcount = 2; + name = "2maintenance loot spawner" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/item/storage/box, +/turf/open/floor/plasteel, +/area/maintenance/starboard) "eOs" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -41210,6 +41069,11 @@ /obj/machinery/status_display/ai, /turf/closed/wall, /area/commons/lounge) +"fgZ" = ( +/obj/structure/girder/reinforced, +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating/airless, +/area/asteroid/nearstation) "fjs" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -41243,6 +41107,12 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"fmq" = ( +/obj/structure/table/wood, +/obj/structure/window/reinforced/spawner/west, +/obj/item/flashlight/lamp/green, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "fnp" = ( /obj/machinery/air_sensor/atmos/nitrous_tank, /turf/open/floor/engine/n2o, @@ -41252,10 +41122,19 @@ /obj/item/wrench, /turf/open/space, /area/space/nearstation) -"foz" = ( -/obj/machinery/atmospherics/components/unary/portables_connector/visible, -/turf/open/floor/plasteel, -/area/science/mixing) +"foP" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/maintenance/starboard/aft) +"fpH" = ( +/obj/item/seeds/harebell, +/turf/open/space/basic, +/area/space) "fsl" = ( /obj/docking_port/stationary{ dir = 2; @@ -41279,6 +41158,15 @@ }, /turf/open/floor/engine, /area/maintenance/disposal/incinerator) +"fuR" = ( +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 10 + }, +/turf/open/floor/plasteel, +/area/science/mixing) "fvd" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -41349,6 +41237,22 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"fNN" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tea, +/obj/machinery/light/small, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) +"fRe" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg3" + }, +/area/asteroid/nearstation) +"fWh" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) "fWz" = ( /obj/machinery/door/airlock/external{ name = "External Docking Port"; @@ -41406,6 +41310,11 @@ }, /turf/open/floor/plasteel/dark, /area/command/bridge) +"ghr" = ( +/obj/structure/reagent_dispensers/fueltank, +/obj/effect/turf_decal/stripes/line, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gii" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -41469,6 +41378,22 @@ }, /turf/open/floor/plating, /area/science/mixing) +"gIT" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "gLD" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 8 @@ -41489,8 +41414,13 @@ /obj/structure/cable/white{ icon_state = "2-8" }, -/obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/obj/structure/sign/departments/restroom{ + pixel_x = 32 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/white/corner, /area/hallway/primary/starboard/fore) "gNH" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -41512,6 +41442,18 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"gRe" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/command/gateway) +"gSu" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 8; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) "gSv" = ( /obj/structure/cable{ icon_state = "4-8" @@ -41549,6 +41491,15 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"gWt" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/obj/machinery/light/broken{ + dir = 1; + icon_state = "tube-broken" + }, +/turf/open/floor/carpet/green/airless, +/area/maintenance/starboard/aft) "gZk" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 10 @@ -41568,11 +41519,13 @@ /turf/closed/mineral/random/labormineral, /area/science/test_area) "hiR" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 - }, -/turf/open/floor/plating, +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner, /area/maintenance/starboard/aft) +"hkI" = ( +/obj/machinery/gateway/centerstation, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "hpr" = ( /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3.2-AtriumSW"; @@ -41603,6 +41556,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/closed/wall, /area/maintenance/starboard/aft) +"hsR" = ( +/obj/machinery/door/airlock/shuttle/glass, +/obj/machinery/door/firedoor/closed, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "hsV" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -41624,12 +41582,12 @@ pixel_x = 24 }, /obj/structure/cable/white, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "hDi" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/machinery/navbeacon{ codes_txt = "patrol;next_patrol=3.4-AtriumNE"; location = "3.3-AtriumSE" @@ -41646,6 +41604,27 @@ }, /turf/open/floor/plasteel, /area/service/bar/atrium) +"hGN" = ( +/obj/machinery/light, +/obj/structure/closet/secure_closet/exile, +/obj/effect/turf_decal/stripes/line{ + dir = 9 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"hIu" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "hNO" = ( /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ dir = 5 @@ -41694,6 +41673,21 @@ /obj/structure/sign/warning/vacuum, /turf/closed/wall, /area/cargo/storage) +"hSE" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/trimline/green/line{ + dir = 1; + icon_state = "trimline" + }, +/turf/open/floor/plating{ + icon_state = "panelscorched" + }, +/area/maintenance/port/aft) "hTn" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/door/airlock/research/glass{ @@ -41731,6 +41725,15 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engineering/atmos) +"hYy" = ( +/obj/structure/lattice, +/turf/open/floor/plating/asteroid, +/area/maintenance/starboard/aft) +"hZH" = ( +/turf/open/floor/plating/airless{ + icon_state = "platingdmg2" + }, +/area/asteroid/nearstation) "iaa" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/navbeacon{ @@ -41784,18 +41787,24 @@ /turf/closed/wall, /area/science/mixing) "iiW" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 4 - }, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "iqC" = ( /obj/machinery/air_sensor/atmos/carbon_tank, /turf/open/floor/engine/co2, /area/engineering/atmos) +"isT" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) "ixk" = ( /obj/machinery/atmospherics/pipe/simple/green/visible, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -41809,6 +41818,9 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"iGT" = ( +/turf/closed/wall, +/area/service/lawoffice) "iIj" = ( /obj/machinery/atmospherics/components/trinary/mixer/airmix/flipped{ dir = 4 @@ -41863,14 +41875,43 @@ /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/space/nearstation) +"iSq" = ( +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/starboard/aft) +"iSy" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/item/toy/poolnoodle/red, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "iUq" = ( /obj/machinery/status_display, /turf/closed/wall, /area/service/library) +"iUJ" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "iUO" = ( /obj/machinery/atmospherics/components/binary/dp_vent_pump/high_volume/incinerator_toxmix, /turf/open/floor/engine, /area/science/mixing) +"iVs" = ( +/obj/machinery/computer/gateway_control{ + dir = 4; + icon_state = "computer" + }, +/obj/effect/turf_decal/delivery, +/obj/machinery/camera{ + c_tag = "Gateway"; + dir = 4 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "iVw" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -41892,6 +41933,11 @@ /obj/machinery/atmospherics/pipe/simple/supply/visible, /turf/open/floor/plasteel, /area/engineering/atmos) +"iYt" = ( +/obj/structure/chair/office/dark, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "iZQ" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/carbon_input, /turf/open/floor/engine/co2, @@ -41946,6 +41992,18 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/science/xenobiology) +"jeI" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 1; + icon_state = "yellowsiding" + }, +/area/maintenance/starboard/aft) +"jkc" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken7" + }, +/area/asteroid/nearstation) "jkl" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 @@ -41953,6 +42011,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/engineering/atmos) +"jlZ" = ( +/obj/structure/closet/crate, +/obj/item/stack/ore/silver, +/obj/item/stack/ore/iron, +/obj/item/stack/ore/iron, +/obj/item/pickaxe/emergency, +/obj/effect/turf_decal/stripes/line, +/obj/machinery/light/small{ + dir = 1 + }, +/turf/open/floor/plasteel, +/area/maintenance/port/aft) "jnK" = ( /obj/machinery/light_switch{ pixel_y = 24 @@ -41990,6 +42060,10 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/starboard) +"jrd" = ( +/obj/machinery/pool/drain, +/turf/open/pool, +/area/maintenance/starboard/aft) "jsD" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/research/glass/incinerator/toxmix_exterior, @@ -42009,6 +42083,10 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"juY" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "jwi" = ( /obj/structure/sign/directions/engineering{ dir = 8; @@ -42031,6 +42109,17 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"jBh" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating{ + icon_state = "platingdmg1" + }, +/area/maintenance/port/aft) "jBG" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -42093,12 +42182,13 @@ pixel_y = 5 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, /area/science/mixing) "jIu" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/dark/visible, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "jLF" = ( /obj/effect/turf_decal/stripes/line{ @@ -42109,12 +42199,47 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"jMP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) +"jOJ" = ( +/obj/effect/turf_decal/bot_white, +/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/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "jRe" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, /turf/closed/wall/r_wall, /area/science/mixing) +"jXc" = ( +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper{ + dir = 1 + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "jXX" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /obj/effect/turf_decal/stripes/line{ @@ -42141,12 +42266,26 @@ }, /turf/open/floor/plasteel/cafeteria, /area/engineering/atmos) +"kbe" = ( +/obj/machinery/firealarm{ + dir = 8; + pixel_x = 24 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "kcN" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/junction{ dir = 4 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"kdd" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "kit" = ( /obj/machinery/portable_atmospherics/canister/toxins, /obj/machinery/light/small{ @@ -42181,10 +42320,13 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) -"kuK" = ( -/obj/effect/spawner/structure/window/reinforced, -/turf/open/floor/plasteel, -/area/science/mixing) +"krX" = ( +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 4; + icon_state = "yellowcornersiding" + }, +/area/maintenance/starboard/aft) "kwF" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -42207,6 +42349,18 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"kyS" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"kAD" = ( +/obj/structure/table/wood, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "kCG" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 @@ -42241,6 +42395,10 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"kIL" = ( +/obj/structure/grille/broken, +/turf/open/floor/plating/airless, +/area/asteroid/nearstation) "kKd" = ( /obj/machinery/door/firedoor, /obj/machinery/door/airlock/external{ @@ -42258,6 +42416,10 @@ }, /turf/open/floor/plasteel, /area/cargo/miningdock) +"kKr" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless, +/area/asteroid/nearstation) "kPi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -42268,11 +42430,19 @@ /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/science/mixing) +"kQz" = ( +/turf/open/floor/plasteel, +/area/command/gateway) "kRV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/effect/turf_decal/sand/plating, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "2-8" }, /turf/open/floor/plating, /area/maintenance/starboard/aft) @@ -42283,19 +42453,39 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) -"leU" = ( -/turf/closed/wall/r_wall/rust, -/area/science/storage) +"kUu" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"lcW" = ( +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "lmq" = ( /obj/machinery/portable_atmospherics/canister/nitrous_oxide, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "low" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 4 }, /turf/closed/wall/r_wall, /area/science/mixing) +"loB" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/light_switch{ + pixel_x = 32; + pixel_y = 24 + }, +/obj/effect/landmark/start/lawyer, +/turf/open/floor/wood, +/area/service/lawoffice) +"loX" = ( +/obj/structure/table/wood, +/obj/item/storage/fancy/cigarettes/cigars/havana, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "lqz" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible, /obj/effect/decal/cleanable/dirt, @@ -42307,6 +42497,10 @@ dir = 1 }, /area/engineering/atmos) +"lqJ" = ( +/obj/effect/spawner/structure/window/reinforced, +/turf/open/floor/plating, +/area/service/lawoffice) "lrg" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -42486,6 +42680,23 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"mia" = ( +/obj/effect/turf_decal/bot_white, +/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/light{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "mkF" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/visible{ dir = 4 @@ -42512,6 +42723,9 @@ }, /turf/open/floor/engine/vacuum, /area/maintenance/disposal/incinerator) +"msl" = ( +/turf/closed/wall/rust, +/area/command/gateway) "msG" = ( /obj/effect/spawner/structure/window, /turf/open/floor/plating, @@ -42530,6 +42744,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/mixing) +"myQ" = ( +/turf/closed/wall/mineral/titanium, +/area/maintenance/starboard/aft) "mDx" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -42598,13 +42815,35 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"mZm" = ( +/obj/effect/turf_decal/tile/red{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/white/corner{ + dir = 1 + }, +/area/hallway/secondary/exit) "nbT" = ( /obj/machinery/atmospherics/components/binary/pump/on{ dir = 1; name = "Space Loop Out" }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) +"ncG" = ( +/obj/structure/rack, +/obj/effect/spawner/lootdrop/maintenance, +/obj/item/wrench, +/obj/item/wirecutters, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/maintenance/starboard) "ndg" = ( /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, @@ -42612,11 +42851,14 @@ "nfS" = ( /obj/machinery/portable_atmospherics/canister/carbon_dioxide, /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "ngY" = ( /obj/machinery/atmospherics/components/binary/valve{ dir = 1 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "nhU" = ( @@ -42625,6 +42867,20 @@ }, /turf/closed/wall/r_wall, /area/maintenance/disposal/incinerator) +"nio" = ( +/obj/structure/pool/ladder{ + dir = 1; + icon_state = "ladder"; + pixel_y = -24 + }, +/turf/open/pool, +/area/maintenance/starboard/aft) +"nqr" = ( +/obj/item/kirbyplants{ + icon_state = "plant-22" + }, +/turf/open/space/basic, +/area/space) "nty" = ( /obj/machinery/button/massdriver{ id = "toxinsdriver"; @@ -42636,10 +42892,21 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"nvk" = ( +/obj/structure/table/wood, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "nwY" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, /area/hallway/primary/starboard/fore) +"nBu" = ( +/obj/structure/chair/stool/bar, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "nFG" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 8 @@ -42647,6 +42914,10 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"nIf" = ( +/obj/effect/turf_decal/sand/plating, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "nKi" = ( /obj/machinery/door/airlock/maintenance_hatch{ name = "Maintenance Hatch"; @@ -42682,7 +42953,11 @@ network = list("ss13","rd") }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) "nTg" = ( /obj/item/assembly/timer{ @@ -42692,7 +42967,7 @@ /obj/item/assembly/timer, /obj/structure/table/reinforced, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "nTi" = ( /obj/structure/sign/warning/biohazard, @@ -42715,6 +42990,12 @@ /obj/machinery/atmospherics/pipe/simple/yellow/visible, /turf/closed/wall/r_wall, /area/engineering/atmos) +"ogx" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood{ + icon_state = "wood-broken" + }, +/area/asteroid/nearstation) "ogL" = ( /obj/structure/sign/warning/vacuum/external{ pixel_y = -32 @@ -42738,6 +43019,9 @@ dir = 1 }, /area/engineering/atmos) +"omB" = ( +/turf/closed/wall, +/area/asteroid/nearstation) "ooX" = ( /obj/machinery/smartfridge/organ/preloaded{ pixel_y = 2 @@ -42812,6 +43096,10 @@ /area/maintenance/disposal/incinerator) "oys" = ( /obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/obj/machinery/light/small{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "oyD" = ( @@ -42841,6 +43129,13 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"oIA" = ( +/obj/machinery/light/floor, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 1; + icon_state = "yellowcornersiding" + }, +/area/maintenance/starboard/aft) "oIG" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, @@ -42855,7 +43150,7 @@ "oKp" = ( /obj/structure/chair/stool, /obj/effect/landmark/start/scientist, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "oKz" = ( /obj/structure/cable/white{ @@ -42891,12 +43186,36 @@ /obj/effect/turf_decal/tile/neutral, /turf/open/floor/plasteel, /area/hallway/primary/starboard) +"oXj" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/machinery/door/window/westright, +/obj/effect/decal/cleanable/egg_smudge, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "oXz" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, /turf/open/floor/plasteel, /area/science/mixing) +"par" = ( +/obj/structure/cable/white{ + icon_state = "1-8" + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/plasteel, +/area/command/gateway) "pbT" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 10 @@ -42917,14 +43236,41 @@ /obj/machinery/atmospherics/components/unary/vent_pump/siphon/atmos/mix_output, /turf/open/floor/engine/vacuum, /area/engineering/atmos) +"pcD" = ( +/obj/effect/turf_decal/bot_white, +/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/command/gateway) "pdX" = ( /obj/machinery/portable_atmospherics/canister, /obj/item/radio/intercom{ pixel_y = 25 }, /obj/effect/turf_decal/stripes/line, -/turf/open/floor/plasteel, +/obj/effect/turf_decal/tile/neutral, +/obj/effect/turf_decal/tile/neutral{ + dir = 8 + }, +/turf/open/floor/plasteel/dark, /area/science/mixing) +"pix" = ( +/turf/open/floor/wood{ + icon_state = "wood-broken7" + }, +/area/maintenance/starboard/aft) +"pjh" = ( +/obj/machinery/vending/boozeomat/pubby_maint, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pjU" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/yellow/hidden{ @@ -42956,6 +43302,13 @@ }, /turf/open/floor/plasteel, /area/science/xenobiology) +"pmx" = ( +/obj/effect/turf_decal/sand/plating, +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/turf/open/floor/plating, +/area/maintenance/starboard/aft) "pmK" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 8 @@ -43004,6 +43357,10 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"puc" = ( +/obj/structure/bed, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "pvX" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/atmospherics/pipe/simple/orange/visible, @@ -43033,10 +43390,9 @@ }, /obj/item/analyzer, /obj/machinery/atmospherics/pipe/simple/supply/hidden, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/white, /area/science/mixing) "pEt" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/power/apc{ areastring = "/area/hallway/primary/starboard/fore"; dir = 8; @@ -43050,6 +43406,9 @@ /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 8 + }, /turf/open/floor/plasteel{ heat_capacity = 1e+006 }, @@ -43092,8 +43451,28 @@ /obj/machinery/atmospherics/components/binary/valve{ dir = 8 }, +/obj/effect/turf_decal/stripes/line, /turf/open/floor/plasteel, /area/science/mixing) +"pML" = ( +/obj/machinery/shower{ + dir = 1 + }, +/obj/structure/curtain, +/obj/structure/window/spawner/north, +/obj/structure/sign/poster/official/no_erp{ + pixel_x = 32 + }, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) +"pMQ" = ( +/obj/structure/cable/white{ + icon_state = "1-4" + }, +/obj/item/reagent_containers/glass/bottle/nutrient/rh, +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/port/aft) "pNE" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/cyan/hidden{ @@ -43106,6 +43485,12 @@ /obj/structure/grille, /turf/open/space/basic, /area/space/nearstation) +"qab" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken5" + }, +/area/asteroid/nearstation) "qcg" = ( /obj/structure/window/reinforced{ dir = 4 @@ -43125,6 +43510,12 @@ /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, /turf/open/floor/plasteel, /area/science/mixing) "qdt" = ( @@ -43148,6 +43539,28 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/hallway/primary/fore) +"qeO" = ( +/obj/machinery/door/airlock/command{ + name = "Gateway"; + req_access_txt = "62" + }, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/command/gateway) +"qgg" = ( +/obj/machinery/seed_extractor, +/obj/structure/cable/white{ + icon_state = "0-8" + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plating/asteroid/airless, +/area/maintenance/port/aft) "qgC" = ( /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/incinerator_input{ dir = 4 @@ -43162,9 +43575,14 @@ /obj/effect/turf_decal/stripes/corner, /turf/open/floor/plasteel, /area/science/mixing) +"qjS" = ( +/obj/structure/table/reinforced, +/obj/machinery/light, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "qnA" = ( /turf/open/floor/plating, -/area/science/storage) +/area/science/mixing) "qoT" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 1; @@ -43206,6 +43624,13 @@ /obj/effect/turf_decal/bot, /turf/open/floor/plasteel, /area/engineering/atmos) +"qFj" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "qFw" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -43230,6 +43655,11 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"qHx" = ( +/obj/machinery/portable_atmospherics/canister/oxygen, +/obj/effect/turf_decal/bot, +/turf/open/floor/plasteel, +/area/science/mixing) "qIp" = ( /obj/effect/turf_decal/stripes/line{ dir = 1 @@ -43249,6 +43679,13 @@ /obj/machinery/meter, /turf/open/floor/plasteel, /area/engineering/atmos) +"qRz" = ( +/obj/machinery/newscaster{ + pixel_x = 32 + }, +/obj/machinery/photocopier, +/turf/open/floor/wood, +/area/service/lawoffice) "qTa" = ( /obj/machinery/atmospherics/pipe/simple/orange/visible{ dir = 4 @@ -43258,6 +43695,13 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"qUQ" = ( +/obj/structure/table/reinforced, +/obj/item/reagent_containers/food/drinks/shaker, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "qUW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 5 @@ -43271,6 +43715,27 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"ria" = ( +/obj/effect/turf_decal/bot_white/right, +/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/command/gateway) +"rih" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel/white/corner, +/area/hallway/primary/starboard/fore) "rjQ" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, @@ -43287,6 +43752,15 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"rmZ" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) +"rwH" = ( +/turf/closed/wall/mineral/titanium, +/area/asteroid/nearstation) "rzn" = ( /obj/machinery/status_display, /turf/closed/wall, @@ -43346,6 +43820,13 @@ /obj/machinery/atmospherics/components/unary/outlet_injector/atmos/mix_input, /turf/open/floor/engine/vacuum, /area/engineering/atmos) +"rVP" = ( +/obj/machinery/airalarm{ + pixel_y = 23 + }, +/obj/item/extinguisher, +/turf/open/floor/plasteel, +/area/command/gateway) "sak" = ( /obj/effect/landmark/event_spawn, /obj/effect/turf_decal/tile/blue{ @@ -43366,24 +43847,46 @@ /mob/living/simple_animal/opossum, /turf/open/floor/plating, /area/maintenance/starboard) +"sdk" = ( +/obj/structure/table/wood, +/obj/item/lighter, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "sdL" = ( -/obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, /obj/effect/turf_decal/tile/neutral, /obj/effect/turf_decal/tile/neutral{ dir = 8 }, +/obj/effect/turf_decal/delivery, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "sdX" = ( /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"sjr" = ( +/obj/item/reagent_containers/food/snacks/grown/wheat, +/turf/open/space/basic, +/area/space) +"slf" = ( +/obj/machinery/door/poddoor/shutters{ + id = "stationawaygate"; + name = "Gateway Access Shutters" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/command/gateway) "soC" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/cable/white{ icon_state = "4-8" }, @@ -43514,8 +44017,16 @@ /turf/closed/wall/rust, /area/cargo/miningdock) "syS" = ( -/turf/closed/wall/rust, -/area/commons/toilet/restrooms) +/obj/structure/table/wood, +/obj/item/paper_bin, +/obj/item/pen/fountain, +/obj/machinery/requests_console{ + department = "Law office"; + name = "Lawyer RC"; + pixel_y = -30 + }, +/turf/open/floor/carpet/green/airless, +/area/service/lawoffice) "syT" = ( /turf/closed/wall/r_wall/rust, /area/ai_monitored/command/storage/eva) @@ -43531,18 +44042,9 @@ "sAA" = ( /turf/closed/wall/rust, /area/service/bar/atrium) -"sAX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, -/obj/structure/cable/white{ - icon_state = "4-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sAY" = ( +/obj/structure/easel, +/obj/machinery/atmospherics/components/unary/vent_pump/on, /turf/open/floor/plating{ icon_state = "panelscorched" }, @@ -43553,12 +44055,6 @@ }, /turf/closed/wall/rust, /area/service/theater) -"sBw" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/closed/wall/rust, -/area/service/bar/atrium) "sBx" = ( /obj/effect/landmark/xeno_spawn, /obj/machinery/atmospherics/components/unary/vent_pump/on{ @@ -43588,10 +44084,6 @@ }, /turf/open/floor/plasteel, /area/maintenance/starboard) -"sBW" = ( -/obj/structure/sign/warning/vacuum, -/turf/closed/wall/rust, -/area/maintenance/starboard) "sCr" = ( /obj/structure/cable/white{ icon_state = "1-2" @@ -43601,30 +44093,6 @@ icon_state = "platingdmg2" }, /area/maintenance/port/central) -"sCt" = ( -/obj/structure/easel, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) -"sCQ" = ( -/obj/structure/closet/crate{ - icon_state = "crateopen" - }, -/obj/effect/spawner/lootdrop/maintenance{ - lootcount = 2; - name = "2maintenance loot spawner" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/sign/poster/contraband/random{ - pixel_x = 32 - }, -/obj/item/storage/box, -/turf/open/floor/plasteel, -/area/maintenance/starboard) "sDl" = ( /turf/closed/wall/rust, /area/commons/dorms) @@ -43649,10 +44117,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/rust, /area/service/theater) -"sDM" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/turf/closed/wall/rust, -/area/service/bar/atrium) "sDP" = ( /turf/closed/wall/rust, /area/hallway/secondary/exit) @@ -43666,19 +44130,20 @@ }, /turf/open/floor/plating, /area/maintenance/starboard) -"sEm" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +"sEn" = ( /obj/structure/cable/white{ icon_state = "1-8" }, -/turf/open/floor/plating, -/area/maintenance/starboard) -"sEn" = ( -/obj/machinery/atmospherics/components/unary/vent_pump/on{ - dir = 8 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/structure/cable/white{ + icon_state = "4-8" }, /turf/open/floor/plating, /area/maintenance/starboard) +"sEq" = ( +/obj/item/reagent_containers/glass/bottle/nutrient/ez, +/turf/open/floor/plating/asteroid/airless, +/area/asteroid/nearstation) "sEG" = ( /obj/effect/spawner/structure/window/reinforced, /turf/open/floor/plating, @@ -43744,9 +44209,13 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "sEQ" = ( -/obj/structure/sign/warning/securearea, -/turf/closed/wall, -/area/maintenance/starboard) +/obj/structure/rack, +/obj/item/radio, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) "sFn" = ( /obj/effect/turf_decal/bot, /obj/effect/turf_decal/stripes/line{ @@ -43901,43 +44370,23 @@ /turf/open/floor/plasteel/dark, /area/maintenance/starboard) "sFX" = ( -/obj/structure/table, /obj/machinery/light/small{ dir = 8 }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/suit/hazardvest{ - desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; - name = "emergency lifejacket" - }, -/obj/item/clothing/mask/breath, -/obj/item/clothing/mask/breath, -/obj/effect/turf_decal/stripes/line, -/obj/effect/turf_decal/tile/neutral{ +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, +/turf/open/floor/plasteel, /area/hallway/secondary/exit) "sFY" = ( -/obj/structure/table, -/obj/effect/turf_decal/stripes/line, -/obj/item/crowbar, -/obj/item/crowbar, -/obj/item/tank/internals/emergency_oxygen, -/obj/item/tank/internals/emergency_oxygen, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ +/obj/effect/turf_decal/tile/blue{ dir = 4 }, -/turf/open/floor/plasteel/dark, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/turf/open/floor/plasteel, /area/hallway/secondary/exit) "sGy" = ( /obj/machinery/door/firedoor, @@ -43983,6 +44432,7 @@ /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white/corner{ dir = 1 }, @@ -44044,10 +44494,12 @@ /turf/open/floor/plating, /area/maintenance/starboard) "sHf" = ( -/obj/machinery/firealarm{ - dir = 4; - pixel_x = -24 - }, +/obj/structure/table, +/obj/item/crowbar, +/obj/item/crowbar, +/obj/item/tank/internals/emergency_oxygen, +/obj/item/tank/internals/emergency_oxygen, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sHz" = ( @@ -44130,7 +44582,7 @@ /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 10 }, -/turf/open/floor/plasteel, +/turf/open/floor/plating, /area/science/mixing) "sIu" = ( /turf/closed/wall/r_wall/rust, @@ -44186,15 +44638,13 @@ /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sIy" = ( -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/structure/cable/white{ icon_state = "4-8" }, /obj/effect/turf_decal/tile/red{ dir = 8 }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel, /area/hallway/secondary/exit) "sIB" = ( @@ -44226,15 +44676,6 @@ "sIK" = ( /turf/closed/wall/rust, /area/service/janitor) -"sIL" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden, -/obj/structure/cable/white{ - icon_state = "1-2" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sIN" = ( /obj/structure/sign/warning/securearea, /turf/closed/wall/rust, @@ -44249,6 +44690,17 @@ /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit) "sIR" = ( +/obj/structure/table, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/suit/hazardvest{ + desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks."; + name = "emergency lifejacket" + }, +/obj/item/clothing/mask/breath, +/obj/item/clothing/mask/breath, /obj/structure/cable/white{ icon_state = "1-2" }, @@ -44390,17 +44842,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/bar/atrium) -"sJo" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, -/obj/structure/cable/white{ - icon_state = "2-8" - }, -/turf/open/floor/plating{ - icon_state = "platingdmg1" - }, -/area/maintenance/starboard/central) "sJq" = ( /obj/structure/sign/directions/engineering{ desc = "A sign that shows there are doors here. There are doors everywhere!"; @@ -44591,19 +45032,6 @@ "sLf" = ( /turf/closed/wall/rust, /area/service/chapel/main) -"sLg" = ( -/obj/item/kirbyplants{ - icon_state = "plant-22" - }, -/obj/effect/turf_decal/delivery, -/obj/effect/turf_decal/tile/neutral{ - dir = 1 - }, -/obj/effect/turf_decal/tile/neutral{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/maintenance/starboard/aft) "sLm" = ( /turf/closed/wall/rust, /area/hallway/secondary/entry) @@ -46028,18 +46456,18 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/machinery/door/airlock/maintenance_hatch{ - name = "Maintenance Hatch"; - req_access_txt = "12" - }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/turf/open/floor/plasteel, -/area/maintenance/starboard) +/obj/machinery/door/airlock{ + name = "Primary Restroom" + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "sOL" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -46159,9 +46587,6 @@ icon_state = "panelscorched" }, /area/maintenance/starboard/aft) -"sPY" = ( -/turf/open/floor/plating, -/area/maintenance/starboard/aft) "sSy" = ( /obj/structure/window/reinforced{ dir = 4 @@ -46169,9 +46594,24 @@ /obj/structure/flora/ausbushes/ppflowers, /turf/open/floor/grass, /area/hallway/secondary/entry) +"sTH" = ( +/obj/machinery/hydroponics/soil, +/obj/item/seeds/tower, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "sVt" = ( /turf/closed/wall/r_wall, /area/science/mixing) +"sYi" = ( +/obj/structure/table/reinforced, +/turf/open/floor/wood{ + icon_state = "wood-broken5" + }, +/area/maintenance/starboard/aft) +"sZH" = ( +/obj/item/reagent_containers/glass/bucket, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "tac" = ( /obj/structure/grille, /obj/machinery/meter, @@ -46188,6 +46628,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"tfP" = ( +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/wood/airless{ + icon_state = "wood-broken" + }, +/area/asteroid/nearstation) "tgm" = ( /obj/machinery/atmospherics/components/binary/pump{ dir = 8; @@ -46207,6 +46653,24 @@ "tin" = ( /turf/open/floor/engine/vacuum, /area/science/mixing) +"tjk" = ( +/obj/effect/decal/cleanable/dirt/dust, +/obj/effect/decal/cleanable/dirt/dust, +/turf/open/floor/carpet/green/airless, +/area/asteroid/nearstation) +"tkH" = ( +/obj/machinery/door/airlock/public/glass{ + name = "Courtroom" + }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, +/obj/machinery/door/firedoor, +/turf/open/floor/plasteel, +/area/service/lawoffice) "ttp" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden, /obj/structure/cable/white{ @@ -46235,6 +46699,16 @@ dir = 1 }, /area/engineering/atmos) +"twy" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks{ + dir = 1; + icon_state = "soda_dispenser" + }, +/turf/open/floor/wood{ + icon_state = "wood-broken6" + }, +/area/maintenance/starboard/aft) "tFk" = ( /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 @@ -46374,9 +46848,7 @@ /obj/machinery/atmospherics/components/unary/thermomachine/freezer{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 1 - }, +/obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/science/mixing) "ujg" = ( @@ -46400,6 +46872,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "uqY" = ( @@ -46411,6 +46889,12 @@ heat_capacity = 1e+006 }, /area/hallway/primary/starboard) +"uqZ" = ( +/obj/structure/table/wood, +/turf/open/floor/wood{ + icon_state = "wood-broken2" + }, +/area/maintenance/starboard/aft) "uuj" = ( /obj/machinery/plantgenes{ pixel_y = 6 @@ -46505,12 +46989,21 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/gravity_generator) +"uCY" = ( +/turf/open/pool, +/area/maintenance/starboard/aft) "uDp" = ( /obj/machinery/atmospherics/pipe/simple/dark/visible{ dir = 5 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"uDz" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) "uEu" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ dir = 6 @@ -46525,6 +47018,35 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port) +"uIq" = ( +/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 + }, +/turf/open/floor/plasteel/dark, +/area/command/gateway) +"uMi" = ( +/obj/machinery/door/airlock/security{ + name = "Law Office"; + req_access_txt = "38" + }, +/obj/machinery/door/firedoor, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/stripes/line, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/turf/open/floor/plasteel, +/area/service/lawoffice) "uSs" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -46646,6 +47168,17 @@ }, /turf/open/floor/plasteel/dark, /area/engineering/atmos) +"vmV" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white, +/turf/open/floor/wood{ + icon_state = "wood-broken4" + }, +/area/maintenance/starboard/aft) +"vna" = ( +/obj/item/wrench, +/turf/open/space/basic, +/area/space) "voi" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -46741,6 +47274,18 @@ }, /turf/open/floor/engine/vacuum, /area/science/mixing) +"vDy" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "2-4" + }, +/turf/open/floor/plating, +/area/maintenance/port/aft) "vGQ" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 @@ -46748,6 +47293,10 @@ /obj/structure/cable/white{ icon_state = "1-2" }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "vJk" = ( @@ -46792,6 +47341,10 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"vTk" = ( +/obj/item/hatchet, +/turf/open/space/basic, +/area/space) "vVA" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -46837,18 +47390,23 @@ /obj/machinery/light/small{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "wbV" = ( /obj/effect/turf_decal/delivery, -/obj/machinery/hydroponics/soil, /obj/effect/turf_decal/tile/neutral{ dir = 1 }, /obj/effect/turf_decal/tile/neutral{ dir = 4 }, +/obj/effect/turf_decal/weather, +/obj/effect/turf_decal/weather, +/obj/structure/closet/athletic_mixed, /turf/open/floor/plasteel/dark, /area/maintenance/starboard/aft) "wdt" = ( @@ -46867,6 +47425,12 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/primary/aft) +"wkn" = ( +/obj/machinery/hydroponics/soil, +/obj/item/shovel/spade, +/obj/item/cultivator, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "wkG" = ( /obj/structure/lattice/catwalk, /turf/open/floor/plating/airless, @@ -46890,17 +47454,36 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"wtA" = ( +/obj/structure/fluff/broken_flooring{ + dir = 8; + icon_state = "plating" + }, +/obj/structure/lattice, +/turf/open/space/basic, +/area/space/nearstation) "wvy" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible, /obj/machinery/meter, /turf/open/floor/plasteel, /area/science/mixing) +"wvA" = ( +/obj/machinery/biogenerator, +/obj/structure/cable/white{ + icon_state = "0-4" + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) "wwT" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 5 }, /turf/open/floor/plasteel, /area/science/mixing) +"wDb" = ( +/obj/structure/lattice, +/turf/open/space/basic, +/area/space) "wOe" = ( /obj/machinery/door/firedoor/heavy, /obj/machinery/door/airlock/research{ @@ -46910,6 +47493,12 @@ /obj/structure/cable/white{ icon_state = "4-8" }, +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/effect/turf_decal/stripes/line{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/mixing) "wPr" = ( @@ -46922,7 +47511,8 @@ pixel_y = 9 }, /obj/structure/table/reinforced, -/turf/open/floor/plasteel, +/obj/structure/window/reinforced/spawner/west, +/turf/open/floor/plasteel/white, /area/science/mixing) "wRY" = ( /obj/machinery/atmospherics/pipe/heat_exchanging/simple{ @@ -46977,10 +47567,13 @@ /turf/open/floor/plasteel/dark, /area/engineering/atmos) "xdr" = ( -/obj/structure/barricade/wooden, +/obj/effect/turf_decal/sand/plating, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 5 }, +/obj/structure/cable/white{ + icon_state = "1-2" + }, /turf/open/floor/plating, /area/maintenance/starboard/aft) "xej" = ( @@ -47004,6 +47597,16 @@ }, /turf/open/floor/plasteel, /area/science/mixing) +"xpX" = ( +/obj/structure/toilet{ + dir = 8 + }, +/obj/structure/window/spawner/north, +/obj/machinery/door/window/westright, +/obj/effect/turf_decal/bot, +/obj/effect/landmark/blobstart, +/turf/open/floor/plasteel/freezer, +/area/commons/toilet/restrooms) "xrf" = ( /obj/machinery/light{ dir = 8 @@ -47143,12 +47746,46 @@ /obj/structure/grille, /turf/closed/wall/r_wall, /area/engineering/atmos) +"xMv" = ( +/obj/structure/lattice, +/obj/structure/fluff/broken_flooring{ + dir = 8; + icon_state = "plating" + }, +/turf/open/space/basic, +/area/space/nearstation) +"xMZ" = ( +/turf/closed/wall, +/area/command/gateway) "xPz" = ( /obj/machinery/atmospherics/pipe/simple/general/visible{ dir = 9 }, /turf/open/floor/plating/asteroid/airless, /area/asteroid/nearstation) +"xTs" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/machinery/power/apc{ + areastring = "/area/commons/toilet/restrooms"; + dir = 8; + name = "Restrooms APC"; + pixel_x = -25; + pixel_y = 3 + }, +/obj/structure/cable/white{ + icon_state = "0-2" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"xWb" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plasteel, +/area/command/gateway) "xZO" = ( /obj/effect/mapping_helpers/airlock/locked, /obj/machinery/door/airlock/public/glass{ @@ -47190,6 +47827,7 @@ /obj/structure/cable/white{ icon_state = "2-8" }, +/obj/effect/turf_decal/tile/purple, /turf/open/floor/plasteel, /area/science/mixing) "yeE" = ( @@ -47233,6 +47871,36 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/port/aft) +"ygB" = ( +/obj/machinery/door/airlock/maintenance_hatch{ + name = "Maintenance Hatch"; + req_access_txt = "12" + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating, +/area/maintenance/starboard) +"ygE" = ( +/obj/structure/cable/white{ + icon_state = "1-2" + }, +/obj/effect/turf_decal/tile/red{ + dir = 1 + }, +/obj/effect/turf_decal/tile/red, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel, +/area/service/bar/atrium) "yhg" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 @@ -47242,6 +47910,24 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"yin" = ( +/obj/structure/cable/white{ + icon_state = "4-8" + }, +/turf/open/floor/plating/asteroid, +/area/maintenance/port/aft) +"ykL" = ( +/obj/structure/chair/stool/bar, +/turf/open/floor/wood, +/area/maintenance/starboard/aft) +"ylr" = ( +/obj/machinery/door/airlock/external{ + name = "External Airlock"; + req_access_txt = "13" + }, +/obj/effect/mapping_helpers/airlock/cyclelink_helper, +/turf/open/floor/plating, +/area/maintenance/port/aft) "ymj" = ( /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 @@ -77720,11 +78406,11 @@ aUR aVL aUR aUQ -bvo +bvg aLs bbd aKm -aac +aKm aad aac aad @@ -77977,15 +78663,15 @@ aUS aUU aWz aVL -bvo +bvg aqo -bbe +aVh +bbb aKm aad aad aad aad -aad aac aac aaa @@ -78234,14 +78920,14 @@ aUR aUU aWz aUQ -bvg -aKm +aqo +aqo +aqo bbd aKm -aKm -aad -aad -aad +wvA +bVs +wkn aad aad aad @@ -78491,16 +79177,16 @@ aUS aUU aWz aVL -bvg -aLv -bbd +ylr +aSG +jXc aME -aKm -aad -aad -aad -aad -aad +aLv +yin +dvB +sZH +sTH +bVs aad aad aad @@ -78748,14 +79434,14 @@ aUT aUU aUU aUQ -bvg -aKm +aqo +aqo +aqo bbd -aMF aKm -aac -aac -aad +qgg +pMQ +fNN aKm aKm aKm @@ -79007,12 +79693,12 @@ aWz aVL bvg aKm -bbd -aMG -aKm -aKm +ghr +jBh aKm aKm +gIT +aLv aKm aOs aSf @@ -79262,13 +79948,13 @@ aUR aUU aWz aUQ -bvo +bvg aKm -baq -bbb +jlZ +vDy aOI -aPQ -aPQ +qFj +kdd aPQ aPQ aPQ @@ -82865,7 +83551,7 @@ bdW aOl aOQ aCy -aPC +aPE aQh aRb aKJ @@ -83373,7 +84059,7 @@ aBn aDf aVV aVQ -aXk +aXg ajG aOZ bey @@ -84106,10 +84792,10 @@ aqy ajf ake ald -oyD -syS -oyD -oyD +iGT +tkH +iGT +lqJ apI apI arP @@ -84362,7 +85048,7 @@ aid aqw ajg akf -oyD +iGT alT amO anJ @@ -84411,7 +85097,7 @@ aSh aSh aSh aSh -atE +hIu bfA bfu bgF @@ -84622,8 +85308,8 @@ akg ale alU amP -oyD -oyD +aoC +aoC sAc aqU arR @@ -84668,7 +85354,7 @@ bcd bcU bdQ aSh -atE +hIu bfA bfV bgG @@ -84879,7 +85565,7 @@ akh alf alV amQ -anJ +fmq aoD apI aqV @@ -85133,10 +85819,10 @@ ahG aix ajj aki -oyD -alW +uMi +loB amR -oyD +iYt syS apI aqW @@ -85182,7 +85868,7 @@ bcf bcW bfF ooX -avB +hSE bfA bfX bgI @@ -85390,10 +86076,10 @@ swC abw ajk akj -oyD +iGT alX amS -anJ +qRz aoE apI aqX @@ -85439,7 +86125,7 @@ bcg bcX bdS aSh -avB +hSE bfy bfY bgJ @@ -85696,7 +86382,7 @@ aUn aWb bdT aSh -atE +hIu bfA bfZ bgK @@ -88757,7 +89443,7 @@ aGN aHS asf aJW -aJW +ygE aMu aNy aOn @@ -89014,7 +89700,7 @@ aGO aHT gPY dQC -avi +asg axP ard aOo @@ -89271,7 +89957,7 @@ aGP aud ash ayK -ayK +ash aAQ aNz aOp @@ -89764,7 +90450,7 @@ aml and tKM aoS -apY +ayP ara asj atj @@ -90020,7 +90706,7 @@ alt amm amm tKM -aoT +asl apZ ara ara @@ -90042,7 +90728,7 @@ aCe aCe aCe aJY -aLh +aCe aAT ayP sJA @@ -90281,7 +90967,7 @@ aoU aqa arg ask -atl +ara aug avl awq @@ -90299,7 +90985,7 @@ aGR aCe aIR aJZ -aLh +aCe aso ayP ayP @@ -90536,9 +91222,9 @@ aae anQ aoV aqb -arh +ayT asl -atm +ara abb abJ awr @@ -90556,8 +91242,8 @@ aGS aHV aIS aKa -aLh -sJo +aCe +aMx aNA ayP aPr @@ -90795,7 +91481,7 @@ syT alu alu asp -atm +ara aui avn aws @@ -90813,7 +91499,7 @@ aGT aHW aIT aKb -aLh +aCe aCe aso ayP @@ -91052,7 +91738,7 @@ aoW aqc syT bxC -atm +ara auj avo awt @@ -91063,7 +91749,7 @@ azN asp aCe aCY -aDV +aFU aFc aFU aGU @@ -91309,7 +91995,7 @@ anV aqd alu aso -atm +ara auk avp awu @@ -91566,7 +92252,7 @@ aoX aqe alu asp -sBw +ara aul avq awv @@ -91584,10 +92270,10 @@ aGW sIC aIW aKe -aLk -aCf -aNC -aOt +aLi +aCe +asp +ayP soC aQw aRs @@ -91822,26 +92508,26 @@ anX ani aqf alu -sAX -atn -aum -avr +asp +ara +ara +ara aww -aum -sDM +ara +ara ayT aiw -aAW -aCf -aCf -aDY +asp +aCe +aCe +aCe aFf -aCf -aCf -aCf -aDY +aCe +aCe +aCe +aCe aFf -aLl +aCe aCe aND aOu @@ -92096,7 +92782,7 @@ aFg axe avs axe -sIL +axe aKf ato axe @@ -92856,7 +93542,7 @@ aup avu atp gMe -arj +rih arj sEJ aBa @@ -93109,11 +93795,11 @@ nwY sOF sOG atq -aRz -aRz +oyD +oyD sOK -aRz -aRz +boD +oyD bli azU aBb @@ -93366,11 +94052,11 @@ aqj aRz asr bfp -aRz +oyD avv acx axf -aRz +oyD aRz sEK sJN @@ -93623,11 +94309,11 @@ aqk aRz ass aTR -sJN -avw +oyD +alW awz axg -aRz +oyD sEl sEL aXb @@ -93880,11 +94566,11 @@ aql aRz ast bfo -aRz -aRz -aRz -sJN -aRz +oyD +oXj +xpX +pML +oyD bfp aSD aRz @@ -93926,20 +94612,20 @@ sdL bhj wbV sOM -aad -aad -aad +bsq +iSq +bsq bfP bfP bjc bfP bfP -aad -aad -aad -aad -aad -aad +myQ +rwH +fgZ +aac +aac +aac aaa aaa aaa @@ -94136,13 +94822,13 @@ ape aqm sJN sAY -acw -aXJ -aSC -aXJ -bai -aXb -sEm +caJ +oyD +oyD +oyD +oyD +oyD +sGY aRz sFn sFR @@ -94180,22 +94866,22 @@ beQ emA xdr bgu -sPY -bhT -sOM -aad +pmx +myQ +aRy +aRy +aRy +aRy +aRy +hYy +nIf +nIf +lcW +myQ +ogx bvg +aKo aac -aad -aac -aac -aac -aad -aad -aac -aac -aac -aad aaa aaa aaa @@ -94393,12 +95079,12 @@ apf aqn aRz abO -bfp -aSD -sCt -sCQ -sDq -aSD +acw +aXJ +aXJ +xTs +aXJ +aXJ sEn sEN sFo @@ -94438,20 +95124,20 @@ bfr hso bgv kRV -bhU -aRy -bvg -aac -aaa -aaa -aaa -aaa -aac -aad -aad -aad -aad -aac +vmV +kUu +iSy +kUu +kUu +kUu +jMP +lcW +fWh +lcW +hsR +kKr +tfP +kKr aac aaa aaa @@ -94652,11 +95338,11 @@ aRz abN acy aRz -sJN -aRz -aRz -aRz +ncG +eOg +sDq aRz +bfp aRz sFp sFT @@ -94693,23 +95379,23 @@ aRy aRy aRy mgV -bgw +myQ hiR -bhV -aRy -bvg -aaa -aaa -aaa -aaa -aaa -aaa -aac -aad -aad -aac -aac -aaa +dSq +dSq +dSq +dSq +krX +ekG +nBu +nvk +lcW +twy +myQ +tjk +tjk +tjk +sdX aaa aaa aaa @@ -94908,13 +95594,13 @@ aqp aRz bvh sBx +xMZ +xMZ +xMZ +bRf +xMZ +ygB aRz -aad -aad -aah -aad -aad -aSD sFq sFU aRz @@ -94950,23 +95636,23 @@ bes bes bes mgV -bgx +aRy bhm -bhW -sON -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +uCY +uCY +uCY +uCY +jeI +lcW +foP +uqZ +lcW +qUQ +myQ +tjk +tjk +tjk +sdX aaa aaa aaa @@ -95165,14 +95851,14 @@ amD amC amC sBy -sBW -aad -aac -bvg -aad -aad -sJN -aRz +xMZ +ria +pcD +uIq +iVs +iUJ +xMZ +xMZ aRz aSD sHd @@ -95207,22 +95893,22 @@ bet bet bet lMu -bgy -sPY -bhX aRy -bvg -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bhm +bhX +jrd +uCY +nio +jeI +juY +kyS +kAD +pix +qjS +myQ +gWt +tjk +tjk aaa aaa aaa @@ -95422,15 +96108,15 @@ aqq ark amC sOJ -bvg -aac -aac -aae -aac -aad -aRz +xMZ +mia +hkI +jOJ +gRe +par +hGN +xMZ aXK -bhk sGA sHe aRz @@ -95464,22 +96150,22 @@ vCu tin tin vxf -bgz -sPY -sLg aRy -bvg -aac -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa -aaa +bhm +uCY +uCY +uCY +uCY +jeI +lcW +rmZ +sdk +lcW +sYi +myQ +tjk +tjk +wtA aaa aaa aaa @@ -95679,15 +96365,15 @@ aqr arl amC bvg -aac -aac -aaa -aae -aac -aac +xMZ +uIq +pcD +ria +kQz +xWb sEQ +bRf aRz -sJN atq aRz aRz @@ -95721,27 +96407,27 @@ fDZ hNT bkf lMu -bgA +myQ bhn -bhY -sON -aad -aac -aac +gSu +gSu +gSu +gSu +oIA +lcW +ykL +loX +lcW +pjh +myQ +tjk +hZH +aaa aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -95936,19 +96622,19 @@ aqs arm syD aac -aaa -aaa -aaa -aae -aaa -aac -bvg -sFs +xMZ +xMZ +xMZ +xMZ +xMZ +cUd +dMx +slf sFX sGC sHf -sHB -blM +mZm +dQg sIy blZ sHB @@ -95979,26 +96665,26 @@ jsD low lMu sON -sOM -sOM -sOM -aad -aad -aad -aad +myQ +cGA +puc +puc +puc +lcW +lcW +lcW +lcW +isT +lcW +hsR +jkc +fRe +aaa +aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96197,10 +96883,10 @@ aaa aaa aaa aae -aae -bvg -bvg -sFs +xMZ +rVP +kbe +qeO sFY sGD bsS @@ -96236,26 +96922,26 @@ iUO svX eWo aad -aad -aad -aad -aad -aad -aad -aac -aac -aac +omB +myQ +aRy +aRy +aRy +aRy +aRy +lcW +lcW +uDz +lcW +myQ +kKr +qab +sdX +aaa +aaa +aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96454,10 +97140,10 @@ aaf aaf aae aae -axW -sDP -azb -axW +xMZ +msl +xMZ +xMZ axW axW azb @@ -96495,24 +97181,24 @@ jRe aad aad aad +sEq +aac aad aad -aad -aad -aad -aad -aad +aRy +myQ +aRy +myQ +aRy +myQ +rwH +rwH +kIL +xMv +aaa +aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -96756,20 +97442,20 @@ aad aad aad aad -aad +omB aad aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa uXD jFP jFP @@ -97018,15 +97704,15 @@ aac aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +wDb +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -97274,16 +97960,16 @@ aad aaa aaa aaa +wDb +aaa +sjr +aaa +aaa +aaa +vna +aaa +aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -97528,19 +98214,19 @@ aad aad aad aaa +vTk +aaa +aaa +aaa +aaa +aaa +aaa +fpH +aaa aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -97767,19 +98453,29 @@ bdK bew ajP ajP -eGm +sVt meo uiT bfq bpj +qHx +qHx +qHx oys -oys -oys -oys -fjN +fuR iio aad aaa +sdX +aaa +aaa +aaa +aaa +aaa +wDb +aaa +aaa +nqr aaa aaa aaa @@ -97788,16 +98484,6 @@ aaa aaa aaa aaa -aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -98034,9 +98720,18 @@ hVE hVE hVE pMh -kuK +tPn aac aaa +sdX +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa aaa aaa aaa @@ -98046,15 +98741,6 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP jFP jFP jFP @@ -98279,14 +98965,14 @@ aaa aaa aad aad -leU +meo dfK qnA ucd vZb iiW bOJ -foz +mhf nbT ngY oXz @@ -98303,15 +98989,15 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -98536,7 +99222,7 @@ aaa aaa aac aad -eGm +sVt lmq nfS sVt @@ -98560,15 +99246,15 @@ aaa aaa aaa aaa -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP -jFP +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa +aaa jFP jFP jFP @@ -98793,9 +99479,9 @@ aaa aaa aac aad -eGm -eGm -eGm +sVt +sVt +sVt sVt gLD lFm diff --git a/_maps/map_files/PubbyStation/PubbyStation.dmm b/_maps/map_files/PubbyStation/PubbyStation.dmm index 2c13790db7..536d5f4aa3 100644 --- a/_maps/map_files/PubbyStation/PubbyStation.dmm +++ b/_maps/map_files/PubbyStation/PubbyStation.dmm @@ -4,8 +4,8 @@ /area/space) "aab" = ( /obj/effect/landmark/start/cyborg, -/mob/living/simple_animal/bot/secbot/pingsky, /obj/machinery/holopad/secure, +/mob/living/simple_animal/bot/secbot/pingsky, /turf/open/floor/plasteel/dark, /area/ai_monitored/turret_protected/aisat_interior) "aac" = ( @@ -9531,6 +9531,9 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/structure/mirror{ + pixel_y = 30 + }, /turf/open/floor/plasteel/freezer, /area/command/heads_quarters/captain) "avJ" = ( @@ -16873,10 +16876,10 @@ dir = 4 }, /obj/effect/landmark/start/assistant, +/obj/machinery/light/small, /turf/open/floor/plasteel/freezer, /area/commons/toilet/auxiliary) "aNd" = ( -/obj/machinery/light/small, /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 1 }, @@ -23298,7 +23301,7 @@ /turf/open/floor/plating, /area/cargo/qm) "bbG" = ( -/obj/machinery/door/airlock/mining/glass{ +/obj/machinery/door/airlock/command{ name = "Quartermaster"; req_access_txt = "41" }, @@ -24652,12 +24655,6 @@ }, /turf/open/space, /area/solars/starboard) -"beW" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 5 - }, -/turf/open/floor/plasteel, -/area/engineering/atmos) "beY" = ( /obj/machinery/camera{ c_tag = "Arrivals Central"; @@ -28881,6 +28878,7 @@ dir = 1 }, /obj/structure/disposalpipe/trunk, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bpt" = ( @@ -29492,6 +29490,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/white, /area/science/xenobiology) "bqF" = ( @@ -29515,6 +29514,7 @@ icon_state = "0-4" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bqH" = ( @@ -29545,6 +29545,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bqJ" = ( @@ -29557,6 +29558,7 @@ icon_state = "0-4" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bqK" = ( @@ -29587,6 +29589,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bqO" = ( @@ -29612,7 +29615,9 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "bqT" = ( /obj/structure/flora/grass/jungle/b, @@ -30149,23 +30154,16 @@ /obj/effect/turf_decal/stripes/line{ dir = 1 }, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, -/obj/structure/sign/departments/xenobio{ - pixel_x = 32 - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, -/turf/open/floor/plasteel/white, -/area/science/xenobiology) -"brV" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 + dir = 9 }, -/turf/closed/wall/r_wall, +/turf/open/floor/plasteel/white, /area/science/xenobiology) "brW" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -30180,13 +30178,15 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "brX" = ( -/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 5 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bsa" = ( @@ -30200,6 +30200,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 6 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bsb" = ( @@ -30231,6 +30232,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bsd" = ( @@ -30262,6 +30264,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bsf" = ( @@ -30272,15 +30275,15 @@ /obj/structure/sign/departments/xenobio{ pixel_y = 32 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bsl" = ( @@ -30301,7 +30304,9 @@ }, /obj/machinery/atmospherics/pipe/simple/cyan/hidden, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "bsn" = ( /obj/structure/girder, @@ -30828,7 +30833,7 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ - dir = 1 + dir = 8 }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) @@ -30857,15 +30862,13 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold4w/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "btA" = ( @@ -30968,7 +30971,9 @@ dir = 8 }, /obj/effect/turf_decal/tile/neutral, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding{ + dir = 8 + }, /area/hallway/secondary/entry) "btO" = ( /obj/structure/cable{ @@ -31421,6 +31426,9 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/structure/sign/departments/xenobio{ + pixel_x = 32 + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "buL" = ( @@ -31442,8 +31450,8 @@ /obj/structure/cable{ icon_state = "4-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 10 +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) @@ -31469,6 +31477,7 @@ /obj/structure/cable{ icon_state = "4-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "buQ" = ( @@ -32058,14 +32067,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, -/turf/open/floor/plasteel/dark, -/area/science/xenobiology) -"bwh" = ( -/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, -/obj/effect/turf_decal/tile/purple, -/obj/effect/turf_decal/tile/purple{ - dir = 8 - }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "bwm" = ( @@ -32757,6 +32759,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 5 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bxN" = ( @@ -32789,6 +32792,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bxP" = ( @@ -32825,6 +32829,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "bxS" = ( @@ -32857,6 +32862,9 @@ /obj/effect/turf_decal/stripes/line{ dir = 9 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 6 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "bxY" = ( @@ -33483,6 +33491,7 @@ icon_state = "0-4" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bzl" = ( @@ -33512,6 +33521,7 @@ icon_state = "0-8" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bzn" = ( @@ -33524,6 +33534,7 @@ icon_state = "0-4" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bzp" = ( @@ -33536,6 +33547,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bzq" = ( @@ -33548,6 +33560,7 @@ icon_state = "0-4" }, /obj/structure/disposalpipe/segment, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bzr" = ( @@ -33577,8 +33590,15 @@ icon_state = "0-8" }, /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) +"bzv" = ( +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 4 + }, +/turf/open/floor/plating/airless, +/area/tcommsat/computer) "bzy" = ( /obj/structure/grille, /turf/open/space, @@ -34131,6 +34151,7 @@ /obj/structure/disposalpipe/trunk{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "bAI" = ( @@ -34458,7 +34479,7 @@ dir = 8 }, /obj/structure/cable{ - icon_state = "4-8" + icon_state = "0-4" }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/rd) @@ -40371,8 +40392,8 @@ icon_state = "1-2" }, /obj/machinery/atmospherics/components/binary/pump/on{ - dir = 8; - name = "Unfiltered to Mix" + dir = 4; + name = "Ports to Mix" }, /turf/open/floor/plasteel, /area/engineering/atmos) @@ -40654,6 +40675,7 @@ /obj/machinery/light/small{ dir = 1 }, +/obj/machinery/space_heater, /turf/open/floor/plating{ icon_state = "platingdmg3" }, @@ -41095,6 +41117,12 @@ }, /turf/open/floor/plasteel, /area/engineering/atmos) +"bPa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 10 + }, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "bPd" = ( /obj/machinery/atmospherics/pipe/manifold/yellow/visible{ dir = 8 @@ -41406,6 +41434,9 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 10 + }, /turf/open/floor/plasteel, /area/engineering/atmos) "bPW" = ( @@ -42108,7 +42139,9 @@ /turf/open/floor/plasteel, /area/engineering/atmos) "bRw" = ( -/obj/machinery/atmospherics/pipe/simple/general/visible, +/obj/machinery/atmospherics/pipe/simple/general/visible{ + dir = 5 + }, /turf/open/floor/plasteel, /area/engineering/atmos) "bRx" = ( @@ -43902,13 +43935,6 @@ /obj/effect/turf_decal/tile/yellow, /turf/open/floor/plasteel, /area/engineering/atmos) -"bVh" = ( -/obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ - dir = 8 - }, -/turf/open/floor/plating, -/area/engineering/atmos) "bVi" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/green/visible{ @@ -44900,7 +44926,7 @@ /obj/machinery/atmospherics/pipe/simple/green/visible{ dir = 4 }, -/obj/machinery/atmospherics/pipe/layer_manifold, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, /turf/open/floor/plasteel, /area/engineering/atmos) "bXx" = ( @@ -45422,15 +45448,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 8 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 8 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYS" = ( @@ -45443,15 +45469,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYT" = ( @@ -45467,15 +45493,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/structure/cable{ icon_state = "1-2" }, @@ -45495,15 +45521,15 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYV" = ( @@ -45514,6 +45540,12 @@ dir = 4 }, /obj/machinery/atmospherics/pipe/manifold/supply/hidden, +/obj/effect/turf_decal/tile/yellow{ + dir = 1 + }, +/obj/effect/turf_decal/tile/yellow{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ dir = 1 }, @@ -45526,15 +45558,15 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/line{ + dir = 1 + }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -45553,15 +45585,15 @@ /obj/machinery/firealarm{ pixel_y = 29 }, -/obj/effect/turf_decal/stripes/corner{ - dir = 4 - }, /obj/effect/turf_decal/tile/yellow{ dir = 1 }, /obj/effect/turf_decal/tile/yellow{ dir = 4 }, +/obj/effect/turf_decal/stripes/corner{ + dir = 4 + }, /turf/open/floor/plasteel, /area/engineering/main) "bYY" = ( @@ -46687,6 +46719,12 @@ /obj/item/gps/engineering, /turf/open/floor/plating, /area/engineering/main) +"ccU" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "ccW" = ( /obj/item/clothing/suit/hazardvest, /obj/item/clothing/suit/hazardvest, @@ -47179,12 +47217,12 @@ "ceT" = ( /obj/effect/turf_decal/stripes/line, /obj/structure/closet/emcloset, -/turf/open/floor/plating, -/area/engineering/main) -"ceU" = ( /obj/machinery/atmospherics/components/unary/vent_pump/on{ dir = 4 }, +/turf/open/floor/plating, +/area/engineering/main) +"ceU" = ( /obj/machinery/computer/security/telescreen{ desc = "Used for watching telecomms."; layer = 4; @@ -47192,6 +47230,9 @@ network = list("tcomms"); pixel_y = 28 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/engineering/main) "ceV" = ( @@ -47238,6 +47279,10 @@ dir = 4; light_color = "#e8eaff" }, +/obj/machinery/airalarm{ + dir = 8; + pixel_x = 22 + }, /turf/open/floor/plasteel/dark, /area/engineering/main) "cfk" = ( @@ -48798,6 +48843,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/tcommsat/computer) "clR" = ( @@ -48845,8 +48891,8 @@ /turf/open/floor/plating, /area/tcommsat/computer) "clX" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 6 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /turf/open/floor/plasteel, /area/tcommsat/computer) @@ -50657,15 +50703,6 @@ }, /turf/open/floor/plasteel/dark, /area/service/chapel/office) -"csu" = ( -/obj/structure/disposalpipe/segment{ - dir = 4 - }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, -/turf/open/floor/plasteel/dark, -/area/science/xenobiology) "csv" = ( /obj/machinery/light/small{ dir = 8 @@ -52853,6 +52890,7 @@ /area/engineering/main) "cBT" = ( /obj/effect/spawner/structure/window/plasma/reinforced, +/obj/machinery/atmospherics/pipe/simple/orange/visible, /turf/open/floor/plating/airless, /area/maintenance/disposal/incinerator) "cBU" = ( @@ -53045,6 +53083,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 8 }, +/obj/item/wrench, /turf/open/floor/plasteel/white, /area/science/xenobiology) "cSJ" = ( @@ -53104,6 +53143,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/lab) +"cXP" = ( +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "cXW" = ( /obj/structure/grille, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, @@ -53122,6 +53167,14 @@ /obj/machinery/power/rad_collector/anchored, /turf/open/floor/engine, /area/engineering/supermatter) +"daQ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/flora/ausbushes/reedbush{ + pixel_x = 3; + pixel_y = 3 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "daY" = ( /obj/structure/disposalpipe/segment, /turf/open/floor/plating, @@ -53143,14 +53196,7 @@ /turf/open/floor/plating, /area/maintenance/department/security/brig) "deJ" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/obj/structure/table, -/obj/item/gps/mining{ - gpstag = "MINE_PUB" - }, -/turf/open/floor/plasteel, +/turf/open/floor/plasteel/yellowsiding/corner, /area/hallway/secondary/entry) "dgg" = ( /obj/structure/disposalpipe/segment{ @@ -53179,6 +53225,7 @@ /obj/structure/disposalpipe/segment{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "dgI" = ( @@ -53399,6 +53446,7 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "dye" = ( @@ -53429,10 +53477,6 @@ }, /area/maintenance/department/engine) "dEy" = ( -/obj/machinery/airalarm{ - dir = 1; - pixel_y = -22 - }, /obj/structure/reflector/double/anchored{ dir = 9 }, @@ -53441,6 +53485,19 @@ "dFJ" = ( /turf/open/floor/engine, /area/engineering/supermatter) +"dHo" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "dHr" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/visible, /obj/machinery/button/door{ @@ -53476,9 +53533,7 @@ /area/medical/chemistry) "dJk" = ( /obj/effect/spawner/structure/window/reinforced, -/obj/machinery/atmospherics/pipe/simple/cyan/visible{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/layer_manifold, /turf/open/floor/plating, /area/engineering/atmos) "dJm" = ( @@ -53786,9 +53841,6 @@ "eAZ" = ( /obj/structure/lattice, /obj/machinery/atmospherics/pipe/simple/green/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, /turf/open/space, /area/space/nearstation) "eCw" = ( @@ -53855,6 +53907,11 @@ /obj/effect/turf_decal/tile/green{ dir = 1 }, +/obj/structure/sink{ + dir = 8; + pixel_x = -12; + pixel_y = 2 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "eLt" = ( @@ -53961,6 +54018,12 @@ }, /turf/open/floor/plasteel/dark, /area/science/explab) +"eUB" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "eVy" = ( /obj/effect/turf_decal/arrows{ dir = 8 @@ -53968,6 +54031,7 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/engineering/main) "eWi" = ( @@ -53976,6 +54040,12 @@ }, /turf/open/floor/plating, /area/engineering/main) +"eWP" = ( +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "eXo" = ( /obj/structure/disposalpipe/segment, /obj/machinery/atmospherics/pipe/simple/general/visible{ @@ -54045,6 +54115,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"ffr" = ( +/obj/effect/turf_decal/tile/purple, +/obj/effect/turf_decal/tile/purple{ + dir = 8 + }, +/obj/machinery/atmospherics/pipe/manifold4w/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "ffJ" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -54347,6 +54425,12 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"fLz" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 5 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "fLG" = ( /obj/effect/decal/remains/xeno, /turf/open/floor/plating, @@ -54375,6 +54459,13 @@ "fRs" = ( /turf/closed/wall, /area/command/heads_quarters/rd) +"fRT" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space/nearstation) "fTY" = ( /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 @@ -54452,6 +54543,16 @@ }, /turf/open/floor/plasteel/white, /area/science/xenobiology) +"geN" = ( +/obj/machinery/igniter{ + id = "xenoigniter"; + luminosity = 2 + }, +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "geU" = ( /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/structure/disposalpipe/segment{ @@ -54815,12 +54916,13 @@ icon_state = "1-8" }, /obj/structure/disposalpipe/segment, -/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ - dir = 8 - }, /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "gIG" = ( @@ -54830,6 +54932,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "gKz" = ( @@ -54969,7 +55075,7 @@ "hbl" = ( /obj/machinery/door/poddoor/incinerator_atmos_main, /turf/open/floor/engine/vacuum, -/area/space) +/area/maintenance/disposal/incinerator) "heC" = ( /obj/machinery/power/apc/highcap/five_k{ dir = 8; @@ -54982,7 +55088,6 @@ }, /area/maintenance/department/science) "hfZ" = ( -/obj/structure/reagent_dispensers/watertank, /obj/machinery/requests_console{ department = "Science"; departmentType = 2; @@ -54990,6 +55095,10 @@ pixel_x = 32; receive_ore_updates = 1 }, +/obj/machinery/atmospherics/components/unary/portables_connector/visible{ + dir = 1 + }, +/obj/machinery/portable_atmospherics/canister/air, /turf/open/floor/plasteel, /area/science/xenobiology) "hgD" = ( @@ -55113,6 +55222,7 @@ /obj/structure/cable{ icon_state = "0-8" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/engine, /area/science/xenobiology) "hwd" = ( @@ -55192,15 +55302,6 @@ /obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/construction/mining/aux_base) -"hEi" = ( -/obj/structure/cable{ - icon_state = "1-2" - }, -/obj/machinery/atmospherics/pipe/simple/general/visible{ - dir = 10 - }, -/turf/open/floor/plasteel, -/area/engineering/atmos) "hEX" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 6 @@ -55261,6 +55362,10 @@ /obj/machinery/power/rad_collector/anchored, /turf/open/floor/engine, /area/engineering/supermatter) +"hKX" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/department/security/brig) "hMx" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible, /turf/open/floor/plating{ @@ -55379,9 +55484,7 @@ /obj/structure/cable{ icon_state = "1-2" }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 10 - }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "hVx" = ( @@ -55481,6 +55584,7 @@ /obj/effect/turf_decal/stripes/line{ dir = 10 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "ihj" = ( @@ -55628,6 +55732,9 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ivO" = ( @@ -55883,8 +55990,8 @@ }, /area/maintenance/department/science) "iWV" = ( -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 5 +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 8 }, /turf/open/floor/plating, /area/maintenance/department/cargo) @@ -55976,6 +56083,10 @@ }, /turf/open/floor/wood, /area/service/lawoffice) +"jkv" = ( +/obj/machinery/atmospherics/components/binary/pump, +/turf/closed/wall/r_wall, +/area/tcommsat/computer) "jrG" = ( /obj/effect/turf_decal/stripes/corner{ dir = 1 @@ -56053,6 +56164,10 @@ }, /turf/open/floor/plasteel/dark, /area/command/heads_quarters/hos) +"jvO" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible, +/turf/closed/wall/r_wall, +/area/maintenance/disposal/incinerator) "jwe" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -56075,6 +56190,7 @@ /obj/effect/turf_decal/tile/blue{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "jxK" = ( @@ -56155,6 +56271,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"jEZ" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/yellowsiding, +/area/hallway/secondary/entry) "jFw" = ( /obj/effect/spawner/lootdrop/maintenance, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -56434,6 +56554,15 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"kuS" = ( +/obj/effect/turf_decal/stripes/line{ + dir = 8 + }, +/obj/machinery/computer/shuttle/mining/common{ + dir = 4 + }, +/turf/open/floor/plasteel, +/area/hallway/secondary/entry) "kvj" = ( /obj/effect/turf_decal/tile/neutral{ dir = 1 @@ -56742,6 +56871,19 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel/dark, /area/engineering/main) +"kUE" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "kWG" = ( /obj/machinery/atmospherics/pipe/manifold/general/visible{ dir = 4 @@ -56955,6 +57097,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"lCN" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on, +/turf/open/floor/engine, +/area/science/xenobiology) "lEn" = ( /obj/structure/window/reinforced{ dir = 1 @@ -57139,6 +57285,12 @@ /obj/item/clothing/head/beret, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"lXt" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 6 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "lXJ" = ( /obj/machinery/atmospherics/components/unary/portables_connector/visible{ dir = 4 @@ -57268,12 +57420,16 @@ /turf/closed/wall/r_wall, /area/engineering/main) "mlr" = ( -/obj/structure/lattice, /obj/structure/disposalpipe/junction{ dir = 4 }, -/turf/open/space/basic, -/area/space/nearstation) +/obj/machinery/atmospherics/components/unary/outlet_injector/on{ + dir = 1; + frequency = 1441; + id = "inc_in" + }, +/turf/open/floor/plating, +/area/science/xenobiology) "mmv" = ( /obj/machinery/door/airlock/engineering{ name = "Engineering Supplies"; @@ -57369,6 +57525,9 @@ /obj/machinery/atmospherics/components/unary/vent_scrubber/on{ dir = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "mvm" = ( @@ -57517,6 +57676,9 @@ }, /turf/open/space/basic, /area/space/nearstation) +"mJR" = ( +/turf/open/water/decorative, +/area/hallway/secondary/entry) "mKc" = ( /obj/structure/bookcase/random/nonfiction, /turf/open/floor/plasteel/dark, @@ -57576,6 +57738,7 @@ /turf/open/floor/plasteel/dark, /area/science/xenobiology) "mVM" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "mXq" = ( @@ -57594,6 +57757,9 @@ /obj/structure/disposalpipe/trunk{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/engine, /area/science/xenobiology) "naS" = ( @@ -57603,7 +57769,7 @@ "nbu" = ( /obj/structure/sign/warning/fire, /turf/closed/wall/r_wall, -/area/space) +/area/maintenance/disposal/incinerator) "ncm" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -57632,6 +57798,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/engine) +"nfc" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) "nfi" = ( /obj/structure/sign/directions/evac{ dir = 1; @@ -57965,6 +58135,12 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) +"nNp" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 9 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "nNJ" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -57984,15 +58160,15 @@ /obj/effect/turf_decal/stripes/line{ dir = 4 }, -/obj/machinery/atmospherics/pipe/simple/supply/hidden{ - dir = 4 - }, /obj/effect/turf_decal/tile/blue{ dir = 1 }, /obj/effect/turf_decal/tile/blue{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden{ + dir = 1 + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "nPA" = ( @@ -58098,6 +58274,7 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "ofN" = ( @@ -58193,6 +58370,23 @@ /obj/structure/window/reinforced, /turf/open/floor/plasteel, /area/science/xenobiology) +"osC" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) +"osY" = ( +/obj/structure/flora/ausbushes/reedbush{ + pixel_x = -2; + pixel_y = 13 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "ous" = ( /obj/effect/turf_decal/stripes/line, /obj/machinery/button/door{ @@ -58278,7 +58472,6 @@ /turf/open/floor/plating, /area/maintenance/department/engine) "oBb" = ( -/obj/structure/sign/warning/biohazard, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -58424,6 +58617,10 @@ /obj/effect/turf_decal/tile/green{ dir = 8 }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 3; + name = "Waste to Space" + }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "oPx" = ( @@ -58473,6 +58670,7 @@ id = "xenobio4"; name = "containment blast door" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/engine, /area/science/xenobiology) "oSL" = ( @@ -58485,9 +58683,7 @@ /obj/structure/cable{ icon_state = "2-8" }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 9 - }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "oTl" = ( @@ -58669,6 +58865,8 @@ dir = 4; network = list("ss13","rd") }, +/obj/item/reagent_containers/glass/beaker, +/obj/item/reagent_containers/dropper, /turf/open/floor/plasteel, /area/science/xenobiology) "pgH" = ( @@ -58704,6 +58902,7 @@ /obj/structure/cable{ icon_state = "1-2" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "pkM" = ( @@ -58716,6 +58915,12 @@ /obj/structure/musician/piano, /turf/open/floor/plasteel/dark, /area/maintenance/department/crew_quarters/dorms) +"pmf" = ( +/obj/machinery/atmospherics/pipe/simple/orange/visible{ + dir = 4 + }, +/turf/open/space/basic, +/area/space) "pmB" = ( /obj/machinery/atmospherics/pipe/simple/cyan/visible{ dir = 4 @@ -58736,9 +58941,8 @@ /area/science/xenobiology) "poP" = ( /obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/cyan/visible, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 +/obj/machinery/atmospherics/pipe/manifold/cyan/visible{ + dir = 8 }, /turf/open/space, /area/space/nearstation) @@ -58937,17 +59141,12 @@ /turf/open/floor/plating, /area/engineering/main) "pMG" = ( -/obj/structure/sink{ - dir = 8; - pixel_x = -12; - pixel_y = 2 +/obj/effect/turf_decal/tile/green{ + dir = 8 }, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, -/obj/effect/turf_decal/tile/green{ - dir = 8 - }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "pNy" = ( @@ -59016,6 +59215,9 @@ id = "misclab"; name = "test chamber blast door" }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "pWF" = ( @@ -59145,6 +59347,7 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plasteel, /area/science/xenobiology) "qdj" = ( @@ -59253,6 +59456,12 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/open/floor/plating, /area/maintenance/department/engine) +"qAk" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on{ + dir = 8 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "qAx" = ( /obj/structure/disposalpipe/trunk{ dir = 1 @@ -59269,6 +59478,11 @@ /obj/item/clothing/head/ushanka, /turf/open/floor/plating, /area/maintenance/department/engine) +"qCu" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible, +/turf/open/space, +/area/space/nearstation) "qDJ" = ( /obj/structure/table/reinforced, /obj/item/integrated_circuit_printer, @@ -59304,6 +59518,12 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"qFw" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/hallway/secondary/entry) "qGu" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 @@ -59463,11 +59683,33 @@ }, /turf/open/floor/plasteel, /area/hallway/secondary/exit/departure_lounge) +"qUD" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/structure/flora/ausbushes/sparsegrass, +/obj/structure/flora/rock/pile/largejungle{ + pixel_x = -50; + pixel_y = -50 + }, +/obj/structure/flora/ausbushes/sparsegrass{ + pixel_x = -60; + pixel_y = -60 + }, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "qVk" = ( /obj/machinery/door/poddoor/incinerator_atmos_aux, /obj/structure/lattice/catwalk, /turf/open/space/basic, /area/maintenance/disposal/incinerator) +"qVn" = ( +/obj/effect/turf_decal/tile/blue{ + dir = 1 + }, +/obj/effect/turf_decal/tile/blue{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "qVP" = ( /obj/machinery/door/firedoor, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ @@ -59564,6 +59806,13 @@ }, /turf/open/floor/plasteel/white, /area/medical/treatment_center) +"rbe" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "rdB" = ( /obj/machinery/atmospherics/pipe/manifold/cyan/hidden{ dir = 1 @@ -59676,6 +59925,7 @@ /area/space/nearstation) "roc" = ( /obj/structure/cable, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "ros" = ( @@ -59806,6 +60056,13 @@ icon_state = "platingdmg3" }, /area/maintenance/department/science) +"rGY" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 8 + }, +/area/hallway/secondary/entry) "rHA" = ( /turf/open/floor/plasteel, /area/construction/mining/aux_base) @@ -59862,6 +60119,12 @@ /obj/item/ammo_casing/shotgun/improvised, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"rMB" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ + dir = 4 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "rMV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ @@ -59982,6 +60245,13 @@ }, /turf/open/floor/plasteel/dark, /area/hallway/secondary/exit/departure_lounge) +"sgt" = ( +/obj/structure/lattice, +/obj/machinery/atmospherics/pipe/simple/cyan/visible{ + dir = 9 + }, +/turf/open/space, +/area/space/nearstation) "shH" = ( /turf/closed/wall/r_wall, /area/space/nearstation) @@ -60172,7 +60442,9 @@ dir = 8 }, /obj/structure/table, -/obj/item/flashlight, +/obj/item/gps/mining{ + gpstag = "MINE_PUB" + }, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "sJp" = ( @@ -60196,6 +60468,13 @@ }, /turf/open/floor/plasteel, /area/engineering/main) +"sNk" = ( +/obj/structure/disposalpipe/segment{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "sNz" = ( /obj/structure/cable{ icon_state = "1-2" @@ -60209,6 +60488,9 @@ }, /turf/open/floor/plating, /area/security/execution/transfer) +"sPh" = ( +/turf/open/floor/plasteel/yellowsiding, +/area/hallway/secondary/entry) "sQt" = ( /obj/machinery/door/airlock/external{ name = "Supply Dock Airlock"; @@ -60353,15 +60635,13 @@ /turf/open/floor/plasteel/white, /area/science/explab) "tdB" = ( -/obj/structure/table, -/obj/item/reagent_containers/glass/beaker, -/obj/item/reagent_containers/dropper, /obj/effect/turf_decal/tile/purple{ dir = 1 }, /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/structure/reagent_dispensers/watertank, /turf/open/floor/plasteel/white, /area/science/xenobiology) "tdL" = ( @@ -60373,6 +60653,7 @@ icon_state = "0-2"; pixel_y = 1 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "tfx" = ( @@ -60527,6 +60808,7 @@ /obj/structure/cable{ icon_state = "2-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "tuy" = ( @@ -60540,6 +60822,18 @@ }, /turf/open/floor/engine, /area/science/xenobiology) +"tuR" = ( +/obj/effect/turf_decal/tile/purple{ + dir = 1 + }, +/obj/effect/turf_decal/tile/purple{ + dir = 4 + }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "tvj" = ( /obj/structure/festivus{ anchored = 1; @@ -60580,6 +60874,10 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"tzj" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/plasteel/white, +/area/science/xenobiology) "tzH" = ( /obj/machinery/door/poddoor/shutters/preopen{ id = "research_shutters_2"; @@ -60597,6 +60895,10 @@ /obj/item/pen, /turf/open/floor/plasteel/dark, /area/science/explab) +"tCJ" = ( +/obj/machinery/space_heater, +/turf/open/floor/plating, +/area/maintenance/department/crew_quarters/bar) "tCP" = ( /obj/docking_port/stationary/public_mining_dock, /turf/open/floor/plating, @@ -60632,6 +60934,12 @@ }, /turf/open/floor/plasteel, /area/science/lab) +"tJW" = ( +/obj/machinery/atmospherics/components/binary/pump/on{ + name = "Air Out" + }, +/turf/open/floor/plating, +/area/maintenance/department/cargo) "tLP" = ( /obj/machinery/status_display/supply, /turf/closed/wall, @@ -60671,6 +60979,12 @@ }, /turf/open/floor/plasteel, /area/security/brig) +"tUO" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 10 + }, +/turf/closed/wall/r_wall, +/area/science/xenobiology) "tXn" = ( /obj/structure/sink{ dir = 4; @@ -60686,6 +61000,10 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/components/binary/pump/on{ + dir = 1; + name = "Air to Distro" + }, /turf/open/floor/plasteel/white, /area/science/xenobiology) "uaC" = ( @@ -60720,14 +61038,6 @@ /obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /turf/closed/wall/r_wall, /area/science/mixing) -"udl" = ( -/obj/structure/lattice, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, -/obj/machinery/atmospherics/pipe/simple/orange/visible{ - dir = 4 - }, -/turf/open/space, -/area/space/nearstation) "uek" = ( /obj/structure/rack, /obj/effect/spawner/lootdrop/maintenance{ @@ -60766,6 +61076,7 @@ /turf/open/floor/plasteel, /area/engineering/main) "ufa" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 4 }, @@ -60832,9 +61143,6 @@ /area/engineering/main) "ume" = ( /obj/machinery/door/firedoor, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /obj/effect/mapping_helpers/airlock/cyclelink_helper{ dir = 8 }, @@ -60844,6 +61152,15 @@ }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) +"uof" = ( +/obj/structure/cable{ + icon_state = "4-8" + }, +/obj/machinery/atmospherics/pipe/manifold/scrubbers/hidden{ + dir = 1 + }, +/turf/open/floor/plasteel/dark, +/area/science/xenobiology) "uoj" = ( /obj/machinery/atmospherics/pipe/simple/supply/hidden{ dir = 9 @@ -60867,6 +61184,15 @@ /obj/structure/lattice, /turf/open/space/basic, /area/space/nearstation) +"upz" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 4 + }, +/area/hallway/secondary/entry) +"upX" = ( +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "uqJ" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable, @@ -60931,6 +61257,9 @@ id = "misclab"; name = "test chamber blast door" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plating, /area/science/xenobiology) "uvq" = ( @@ -60966,6 +61295,10 @@ }, /turf/open/floor/plasteel, /area/hallway/primary/aft) +"uyJ" = ( +/obj/machinery/atmospherics/components/unary/vent_scrubber/on, +/turf/open/floor/engine, +/area/science/xenobiology) "uzh" = ( /obj/effect/decal/cleanable/dirt, /obj/machinery/door/airlock/engineering/glass/critical{ @@ -60989,6 +61322,12 @@ }, /turf/open/floor/plasteel, /area/tcommsat/computer) +"uzB" = ( +/obj/machinery/atmospherics/components/unary/vent_pump/on{ + dir = 1 + }, +/turf/open/floor/engine, +/area/science/xenobiology) "uAU" = ( /obj/structure/table/wood, /obj/item/folder/blue, @@ -61021,6 +61360,7 @@ /obj/structure/cable{ icon_state = "1-4" }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden, /turf/open/floor/plating/airless, /area/space/nearstation) "uIn" = ( @@ -61050,6 +61390,10 @@ dir = 1 }, /area/hallway/secondary/exit/departure_lounge) +"uLP" = ( +/obj/machinery/atmospherics/pipe/simple/supply/hidden, +/turf/open/floor/engine, +/area/science/xenobiology) "uMe" = ( /obj/structure/cable{ icon_state = "0-2"; @@ -61088,12 +61432,6 @@ }, /turf/open/floor/engine, /area/engineering/main) -"uST" = ( -/obj/machinery/atmospherics/components/binary/pump{ - name = "Mix to Ports" - }, -/turf/open/floor/plasteel, -/area/engineering/atmos) "uUQ" = ( /obj/machinery/door/airlock/maintenance{ name = "Engineering Maintenance"; @@ -61146,6 +61484,11 @@ }, /turf/open/floor/plating, /area/maintenance/solars/starboard) +"uXL" = ( +/turf/open/floor/plasteel/yellowsiding{ + dir = 1 + }, +/area/hallway/secondary/entry) "uZb" = ( /obj/structure/lattice, /obj/structure/window/reinforced{ @@ -61464,6 +61807,11 @@ }, /turf/open/floor/plating, /area/maintenance/department/science) +"vIa" = ( +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 4 + }, +/area/hallway/secondary/entry) "vIc" = ( /obj/structure/cable{ icon_state = "2-4" @@ -61487,9 +61835,6 @@ /obj/structure/disposalpipe/segment{ dir = 6 }, -/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden{ - dir = 4 - }, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "vOw" = ( @@ -61661,6 +62006,13 @@ }, /turf/open/floor/engine, /area/engineering/main) +"whP" = ( +/obj/machinery/atmospherics/pipe/simple/cyan/hidden, +/obj/effect/turf_decal/tile/neutral, +/turf/open/floor/plasteel/yellowsiding/corner{ + dir = 1 + }, +/area/hallway/secondary/entry) "wig" = ( /obj/machinery/vending/cigarette, /turf/open/floor/plating{ @@ -61693,15 +62045,14 @@ /turf/open/floor/plasteel, /area/engineering/main) "wjQ" = ( -/obj/machinery/computer/shuttle/mining/common{ - dir = 4 - }, /obj/machinery/light{ dir = 8 }, /obj/effect/turf_decal/stripes/line{ dir = 8 }, +/obj/structure/table, +/obj/item/flashlight, /turf/open/floor/plasteel, /area/hallway/secondary/entry) "wkZ" = ( @@ -61991,6 +62342,14 @@ }, /turf/open/floor/plating, /area/maintenance/department/security/brig) +"wSX" = ( +/obj/structure/flora/junglebush/large{ + pixel_x = -15; + pixel_y = -4 + }, +/obj/structure/flora/rock/pile, +/turf/open/water/decorative, +/area/hallway/secondary/entry) "wTD" = ( /obj/structure/table/wood, /obj/item/folder/red, @@ -62042,6 +62401,9 @@ /obj/structure/disposalpipe/trunk{ dir = 4 }, +/obj/machinery/atmospherics/pipe/simple/supply/hidden{ + dir = 4 + }, /turf/open/floor/plasteel, /area/science/xenobiology) "wYu" = ( @@ -62195,6 +62557,7 @@ /obj/effect/turf_decal/tile/purple{ dir = 4 }, +/obj/machinery/atmospherics/pipe/manifold/supply/hidden, /turf/open/floor/plasteel/dark, /area/science/xenobiology) "xlg" = ( @@ -62326,6 +62689,11 @@ }, /turf/open/floor/engine, /area/engineering/main) +"xAy" = ( +/obj/effect/spawner/structure/window/reinforced, +/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden, +/turf/open/floor/plating, +/area/science/xenobiology) "xCV" = ( /obj/effect/spawner/structure/window/reinforced, /obj/structure/cable{ @@ -79869,7 +80237,7 @@ aiu xuv aoe ajD -ajD +hKX aiu apB aiu @@ -82994,10 +83362,10 @@ bdV bnp baK pEH -deJ +pEH sIK wjQ -pEH +kuS bbR aZx aaa @@ -83250,11 +83618,11 @@ aZx jzz bnp baK -baK -baK -baK -baK -baK +deJ +upz +upz +upz +vIa baK aZx aaa @@ -83507,11 +83875,11 @@ bbR bbR bnp baK -baK -baK -baK -baK -baK +sPh +osY +mJR +mJR +uXL baK aZx aZx @@ -83764,11 +84132,11 @@ baK baK bnq baM -baK -baK -baK -baK -baK +sPh +mJR +wSX +mJR +uXL baK bxY bzz @@ -84021,11 +84389,11 @@ bbT bbT bnr bop -bbT -bbT -bbT -bbT -bbT +jEZ +qUD +upX +daQ +qFw bbT bxZ bzA @@ -84278,11 +84646,11 @@ bkT bfY bns bfY -bfY +rGY bqS bsm btN -bfY +whP bfY bya bzB @@ -90677,7 +91045,7 @@ aKT aLH aNf aKT -aLL +tCJ aQO aRO aSH @@ -90746,10 +91114,10 @@ gnq bXk ceU eVy -bXk -bXk -bXk -bXk +ulY +ulY +ulY +ulY tue pjH pjH @@ -90774,9 +91142,9 @@ tfw pjH pjH uHG -clw -clw -clw +cme +cme +jkv clQ clX rsZ @@ -91544,7 +91912,7 @@ fon fon aht aht -ouv +bzv clw clw clw @@ -96904,15 +97272,15 @@ bJN bJN bJN bJN +bXk +bXk +bXk +bXk +bXk +bXk frj pYh pYh -pYh -pYh -pYh -pYh -pYh -pYh hUw nqu nsJ @@ -97161,13 +97529,13 @@ bUp bWI bXr bKQ -udl +acN bZK abI abI abI abI -aaa +pmf aaa aaa uaO @@ -97418,13 +97786,13 @@ bMf bWJ bXs bJN -cui -bJP -bJP -bJP -bJP -bJP abI +bJP +bJP +bJP +bJP +bJP +cui abI aht pBJ @@ -97681,7 +98049,7 @@ caz cbs cbs bJP -aaa +pmf aaa aaa uaO @@ -97932,13 +98300,13 @@ bMf bMf bXu bLW -cui +abI bMi caA cbt ccm bJP -aaa +pmf aaa aaa pBJ @@ -98188,14 +98556,14 @@ bMf bMf bWM bXv -bVh +bWc poP bZL caB cbs cbs bJP -aaa +pmf aaa aaa aht @@ -98446,13 +98814,13 @@ hjk pmB bXw dJk -cui +sgt bJP bJP bJP bJP bJP -aaa +pmf aaa aaa aht @@ -98709,7 +99077,7 @@ caC cbu cbu bJP -aht +fRT aht fon fon @@ -98960,13 +99328,13 @@ bVZ bOX bXx bVi -cui +abI bMi caD cbv ccn bJP -aaa +pmf aaa fon shH @@ -99217,13 +99585,13 @@ bVY bUs bVg bVm -poP +qCu bZL caE cbu cbu bJP -aht +fRT aht fon fon @@ -99428,7 +99796,7 @@ aPY bau aLf aFi -aFi +aMA beI beI bgD @@ -99474,13 +99842,13 @@ bVZ bOX kas bNm -cui +abI bJP bJP bJP bJP bJP -aaa +pmf aaa aaa aaa @@ -99731,13 +100099,13 @@ bVZ bWO bXA bQO -poP +qCu bZM caF cbw cby bJP -aaa +pmf aaa aaa fon @@ -99988,13 +100356,13 @@ bVZ bMf bXB bNm -cui +abI bMi caG cbx cco bJP -aht +fRT aht aht fon @@ -100233,7 +100601,7 @@ bOr bPU kWG bRw -beW +bMf bMf bMf bMf @@ -100245,13 +100613,13 @@ bVY bWP bXy bQO -poP +qCu bZN caH cby cby bJP -aaa +pmf aaa aaa fon @@ -100489,9 +100857,9 @@ bKV bOX eEd bQL -uST pEM bMf +bMf qQu qQu bSU @@ -100502,13 +100870,13 @@ bTR bUt bXC bYs -bVW -bYw -bYw +jvO +jvO +jvO cBT -bYw -bYw -bYw +jvO +jvO +bVW aht aht fon @@ -100747,7 +101115,7 @@ bMg bNj bOp bPV -hEi +sGJ sGJ bUw bUw @@ -106121,8 +106489,8 @@ oTl vzP vzP iWV -aFi -bpq +tJW +rxa bnj brT bxF @@ -106375,14 +106743,14 @@ eCw aUC aUC qHI -aKq +bpq aEj wAI vzP vzP bqA brU -bxF +bPa buK dqw spz @@ -106638,7 +107006,7 @@ bkF bkF bkF bkF -brV +bkF ume bkF bkF @@ -106883,7 +107251,7 @@ aaa aEl aTx aFi -aFi +aMA aEj bhz lEn @@ -106895,7 +107263,7 @@ lWH wfs pfP bqC -brW +qVn vMx ofN gdL @@ -107153,7 +107521,7 @@ hEX brO bzg brX -csu +buI xzp ugC gdJ @@ -107407,9 +107775,9 @@ bnd tdB bpn thW -bpn +tzj bqE -brW +kUE btu xpr ihk @@ -108433,17 +108801,17 @@ aKq gfi bkF blX -blX +uyJ bpr oSc bsa -btw -buI -bwe +dHo +sNk +ffr bxM bzk bAH -blX +eUB blX bkF kgR @@ -108947,8 +109315,8 @@ gfi aFi bkF bni -blX -blX +lCN +uLP hvW igE btx @@ -108956,8 +109324,8 @@ dxc bwf bxO bzm -blX -blX +uLP +uzB blX bkF hTl @@ -109461,17 +109829,17 @@ gfi ybX bkF blX -blX +uyJ bpr bqG bsa -btw +dHo buM -bwh +ffr bxM bzn bAH -blX +eUB blX bkF qIO @@ -109975,8 +110343,8 @@ gfi ybX bkF bni -blX -blX +lCN +uLP bqI bsc btx @@ -109984,8 +110352,8 @@ buO bwf bxR bzp -blX -blX +uLP +uzB blX bkF aaA @@ -110489,17 +110857,17 @@ gfi bfM bkF blX -blX +uyJ bpr bqJ bsa gIG -buN -bwe +osC +ffr bxM bzq bAH -blX +eUB blX bkF wfc @@ -110750,7 +111118,7 @@ blX blX bqK bsd -gIG +tuR buN bwe bxS @@ -111003,8 +111371,8 @@ ntj fNv bkF blX -blX -blX +lCN +uLP bqL bse xjT @@ -111012,8 +111380,8 @@ btE buW bxT bzs -blX -blX +uLP +uzB blX bkF ueV @@ -111264,10 +111632,10 @@ bkF bkF bkF bkF -bkF +tUO qdi -bkF -bkF +cXP +nNp bkF bkF bkF @@ -112550,11 +112918,11 @@ bnd kRK cPy dir -mTS +uof ufa oNE oep -bnd +xAy mlr sEB jEX @@ -112808,7 +113176,7 @@ qcD xxw lhA lFh -ufa +ccU taA qcH bnd @@ -113835,7 +114203,7 @@ bkF bkF bkF pbR -blX +rMB naq bkF bkF @@ -114090,11 +114458,11 @@ aed aht bkF blX -blX -blX -blX -blX -blX +lXt +nfc +eWP +rbe +fLz blX bkF aht @@ -114347,11 +114715,11 @@ aby aaa xKc blX -blX +qAk iPj tfP -iPj -blX +geN +qAk blX xKc aaa diff --git a/_maps/templates/shelter_5.dmm b/_maps/templates/shelter_5.dmm new file mode 100644 index 0000000000..643f744fb9 --- /dev/null +++ b/_maps/templates/shelter_5.dmm @@ -0,0 +1,480 @@ +//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE +"cc" = ( +/obj/machinery/vending/boozeomat, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"dH" = ( +/obj/structure/chair/sofa/corp, +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"fp" = ( +/obj/machinery/smartfridge, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/survivalpod/nonpowered) +"fC" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"fM" = ( +/obj/structure/table/survival_pod, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/reagent_containers/glass/beaker/large, +/obj/item/storage/bag/plants/portaseeder, +/obj/item/shovel/spade, +/obj/item/cultivator, +/obj/item/reagent_containers/spray/weedspray, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"fN" = ( +/obj/structure/table/reinforced, +/obj/item/kitchen/knife, +/obj/item/kitchen/rollingpin, +/obj/machinery/reagentgrinder, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"gr" = ( +/obj/machinery/vending/wallmed, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/survivalpod/nonpowered) +"hr" = ( +/obj/structure/table/reinforced, +/obj/machinery/chem_dispenser/drinks/beer, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"iu" = ( +/obj/structure/curtain, +/obj/machinery/poweredfans, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"iD" = ( +/obj/item/gps/computer, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"iY" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/nanotrasen, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"lO" = ( +/obj/machinery/poweredfans, +/obj/machinery/door/airlock/survival_pod/glass, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"lW" = ( +/obj/structure/chair/sofa/corp{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"mC" = ( +/obj/structure/chair/sofa/corp{ + dir = 8 + }, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"mN" = ( +/obj/machinery/power/rtg/advanced/fullupgrade, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"oo" = ( +/obj/machinery/vending/dinnerware, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"pg" = ( +/obj/machinery/shower{ + dir = 8 + }, +/turf/open/floor/noslip, +/area/survivalpod/nonpowered) +"pF" = ( +/obj/machinery/modular_computer/console/preset/civilian{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"qE" = ( +/obj/machinery/washing_machine, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"rL" = ( +/obj/structure/mirror, +/turf/closed/wall/mineral/titanium/survival/pod, +/area/survivalpod/nonpowered) +"rM" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"rZ" = ( +/obj/structure/sink{ + pixel_y = 18 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"sN" = ( +/obj/machinery/light{ + dir = 8 + }, +/obj/structure/sink/kitchen{ + dir = 4; + pixel_x = -10 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"td" = ( +/obj/machinery/hydroponics/constructable/automagic, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"um" = ( +/obj/structure/table/wood/fancy/monochrome, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"uR" = ( +/obj/machinery/light, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"vU" = ( +/obj/machinery/sleeper/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"wv" = ( +/obj/structure/table/reinforced, +/obj/machinery/microwave, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"wI" = ( +/obj/item/storage/fancy/candle_box, +/obj/structure/table/wood/fancy/blackred, +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"xC" = ( +/obj/machinery/light{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"zW" = ( +/obj/machinery/vending/hydroseeds, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"BI" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Cj" = ( +/obj/structure/chair/sofa/corp/right{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"EV" = ( +/obj/structure/bed/pod, +/obj/item/bedsheet/nanotrasen, +/obj/item/toy/plush/mothplushie, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Fo" = ( +/obj/machinery/smartfridge/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Fw" = ( +/obj/structure/chair/sofa/corp{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"FE" = ( +/obj/machinery/light{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"FZ" = ( +/turf/closed/wall/mineral/titanium/survival/pod, +/area/survivalpod/nonpowered) +"JL" = ( +/obj/machinery/door/window/survival_pod{ + dir = 8 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Lv" = ( +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Ng" = ( +/obj/structure/chair/wood/normal, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Qr" = ( +/obj/effect/spawner/structure/window/hollow/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Ro" = ( +/obj/structure/chair/comfy/black{ + dir = 4 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Ry" = ( +/obj/structure/chair/sofa/corp/left, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Tc" = ( +/obj/machinery/light{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"TQ" = ( +/obj/structure/fans, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Ub" = ( +/obj/structure/chair/sofa/corp/corner{ + dir = 1 + }, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Vp" = ( +/obj/structure/table/reinforced, +/obj/machinery/dish_drive, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Vv" = ( +/obj/machinery/biogenerator, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Ws" = ( +/obj/structure/dresser, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Xh" = ( +/obj/machinery/door/airlock/survival_pod/glass, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Xr" = ( +/obj/machinery/door/airlock/survival_pod, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"Xy" = ( +/obj/machinery/light, +/obj/machinery/power/apc/auto_name/south, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) +"YH" = ( +/obj/structure/table/survival_pod, +/obj/item/shovel, +/obj/item/pickaxe, +/obj/item/storage/toolbox/electrical, +/obj/item/clothing/gloves/color/yellow, +/turf/open/floor/pod/dark, +/area/survivalpod/nonpowered) + +(1,1,1) = {" +FZ +FZ +FZ +FZ +FZ +FZ +FZ +FZ +Qr +Qr +Qr +Qr +FZ +"} +(2,1,1) = {" +FZ +pg +FE +FZ +EV +Ws +iY +FZ +BI +Fw +Fw +Ub +Qr +"} +(3,1,1) = {" +FZ +FZ +iu +FZ +Tc +Lv +uR +FZ +dH +um +um +lW +Qr +"} +(4,1,1) = {" +FZ +qE +JL +FZ +Lv +Lv +Ro +FZ +Ry +um +um +lW +Qr +"} +(5,1,1) = {" +rL +rZ +xC +Xh +Lv +Lv +pF +FZ +Lv +Cj +mC +rM +Qr +"} +(6,1,1) = {" +FZ +FZ +FZ +FZ +FZ +Xh +FZ +FZ +Xh +FZ +FZ +FZ +FZ +"} +(7,1,1) = {" +FZ +wv +sN +Lv +Xh +Lv +Lv +xC +Lv +FE +Lv +Lv +lO +"} +(8,1,1) = {" +FZ +fN +Lv +oo +FZ +FZ +Xh +FZ +FZ +FZ +FZ +Xr +FZ +"} +(9,1,1) = {" +FZ +fC +Lv +cc +FZ +fM +Lv +td +FZ +TQ +vU +Lv +FZ +"} +(10,1,1) = {" +FZ +hr +Lv +Vp +FZ +zW +Lv +td +gr +YH +Lv +Xy +FZ +"} +(11,1,1) = {" +FZ +Lv +Lv +Lv +fp +Lv +Lv +td +FZ +Fo +Lv +Lv +FZ +"} +(12,1,1) = {" +FZ +Ng +wI +Ng +Vv +Lv +xC +td +FZ +iD +Lv +mN +FZ +"} +(13,1,1) = {" +FZ +Qr +FZ +Qr +FZ +FZ +FZ +FZ +FZ +FZ +FZ +FZ +FZ +"} diff --git a/auxmos.dll b/auxmos.dll new file mode 100644 index 0000000000..54fb0c6c98 Binary files /dev/null and b/auxmos.dll differ diff --git a/auxmos.pdb b/auxmos.pdb new file mode 100644 index 0000000000..031e66d103 Binary files /dev/null and b/auxmos.pdb differ diff --git a/byond-extools.dll b/byond-extools.dll deleted file mode 100644 index c404bf1be5..0000000000 Binary files a/byond-extools.dll and /dev/null differ diff --git a/byond-extools.pdb b/byond-extools.pdb deleted file mode 100644 index f89dc06441..0000000000 Binary files a/byond-extools.pdb and /dev/null differ diff --git a/code/__DEFINES/_auxtools.dm b/code/__DEFINES/_auxtools.dm new file mode 100644 index 0000000000..ab07becbd9 --- /dev/null +++ b/code/__DEFINES/_auxtools.dm @@ -0,0 +1,9 @@ +#define AUXMOS (world.system_type == MS_WINDOWS ? "auxmos.dll" : __detect_auxmos()) + +/proc/__detect_auxmos() + if (fexists("./libauxmos.so")) + return "./libauxmos.so" + else if (fexists("[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so")) + return "[world.GetConfig("env", "HOME")]/.byond/bin/libauxmos.so" + else + CRASH("Could not find libauxmos.so") diff --git a/code/__DEFINES/_extools.dm b/code/__DEFINES/_extools.dm deleted file mode 100644 index e01e09a3d3..0000000000 --- a/code/__DEFINES/_extools.dm +++ /dev/null @@ -1,38 +0,0 @@ -// _extools_api.dm - DM API for extools extension library -// (blatently stolen from rust_g) -// -// To configure, create a `extools.config.dm` and set what you care about from -// the following options: -// -// #define EXTOOLS "path/to/extools" -// Override the .dll/.so detection logic with a fixed path or with detection -// logic of your own. - -#ifndef EXTOOLS -// Default automatic EXTOOLS detection. -// On Windows, looks in the standard places for `byond-extools.dll`. -// On Linux, looks in the standard places for`libbyond-extools.so`. - -/* This comment bypasses grep checks */ /var/__extools - -/proc/__detect_extools() - if (world.system_type == UNIX) - if (fexists("./libbyond-extools.so")) - // No need for LD_LIBRARY_PATH badness. - return __extools = "./libbyond-extools.so" - else - // It's not in the current directory, so try others - return __extools = "libbyond-extools.so" - else - return __extools = "byond-extools.dll" - -#define EXTOOLS (__extools || __detect_extools()) -#endif - -#ifndef UNIT_TESTS // use default logging as extools is broken on travis -#define EXTOOLS_LOGGING // rust_g is used as a fallback if this is undefined -#endif - -/proc/extools_log_write() - -/proc/extools_finalize_logging() diff --git a/code/__DEFINES/_tick.dm b/code/__DEFINES/_tick.dm index fc6147c430..f4a8fbb9e5 100644 --- a/code/__DEFINES/_tick.dm +++ b/code/__DEFINES/_tick.dm @@ -1,7 +1,11 @@ /// Percentage of tick to leave for master controller to run #define MAPTICK_MC_MIN_RESERVE 70 /// internal_tick_usage is updated every tick by extools -#define MAPTICK_LAST_INTERNAL_TICK_USAGE ((GLOB.internal_tick_usage / world.tick_lag) * 100) +#if DM_VERSION > 513 +#define MAPTICK_LAST_INTERNAL_TICK_USAGE world.map_cpu +#else +#define MAPTICK_LAST_INTERNAL_TICK_USAGE 50 +#endif /// Tick limit while running normally #define TICK_BYOND_RESERVE 2 #define TICK_LIMIT_RUNNING (max(100 - TICK_BYOND_RESERVE - MAPTICK_LAST_INTERNAL_TICK_USAGE, MAPTICK_MC_MIN_RESERVE)) @@ -19,6 +23,9 @@ /// Returns true if tick_usage is above the limit #define TICK_CHECK ( TICK_USAGE > Master.current_ticklimit ) + +#define TICK_REMAINING_MS ((Master.current_ticklimit - TICK_USAGE) * world.tick_lag) + /// runs stoplag if tick_usage is above the limit #define CHECK_TICK ( TICK_CHECK ? stoplag() : 0 ) diff --git a/code/__DEFINES/atmospherics.dm b/code/__DEFINES/atmospherics.dm index d22d144acd..67d16e6687 100644 --- a/code/__DEFINES/atmospherics.dm +++ b/code/__DEFINES/atmospherics.dm @@ -1,12 +1,3 @@ -//LISTMOS -//indices of values in gas lists. -#define META_GAS_SPECIFIC_HEAT 1 -#define META_GAS_NAME 2 -#define META_GAS_MOLES_VISIBLE 3 -#define META_GAS_OVERLAY 4 -#define META_GAS_DANGER 5 -#define META_GAS_ID 6 -#define META_GAS_FUSION_POWER 7 //ATMOS //stuff you should probably leave well alone! #define R_IDEAL_GAS_EQUATION 8.31 //kPa*L/(K*mol) @@ -257,6 +248,35 @@ #define PIPING_DEFAULT_LAYER_ONLY (1<<2) //can only exist at PIPING_LAYER_DEFAULT #define PIPING_CARDINAL_AUTONORMALIZE (1<<3) //north/south east/west doesn't matter, auto normalize on build. +// Gas defines because i hate typepaths +#define GAS_O2 "o2" +#define GAS_N2 "n2" +#define GAS_CO2 "co2" +#define GAS_PLASMA "plasma" +#define GAS_H2O "water_vapor" +#define GAS_HYPERNOB "nob" +#define GAS_NITROUS "n2o" +#define GAS_NITRYL "no2" +#define GAS_TRITIUM "tritium" +#define GAS_BZ "bz" +#define GAS_STIMULUM "stim" +#define GAS_PLUOXIUM "pluox" +#define GAS_MIASMA "miasma" +#define GAS_METHANE "methane" +#define GAS_METHYL_BROMIDE "methyl_bromide" + +#define GAS_FLAG_DANGEROUS (1<<0) +#define GAS_FLAG_BREATH_PROC (1<<1) + +//SUPERMATTER DEFINES +#define HEAT_PENALTY "heat penalties" +#define TRANSMIT_MODIFIER "transmit" +#define RADIOACTIVITY_MODIFIER "radioactivity" +#define HEAT_RESISTANCE "heat resistance" +#define POWERLOSS_INHIBITION "powerloss inhibition" +#define ALL_SUPERMATTER_GASES "gases we care about" +#define POWER_MIX "gas powermix" + //HELPERS #define PIPING_LAYER_SHIFT(T, PipingLayer) \ if(T.dir & (NORTH|SOUTH)) { \ @@ -284,17 +304,6 @@ GLOBAL_LIST_INIT(atmos_adjacent_savings, list(0,0)) //If you're doing spreading things related to atmos, DO NOT USE CANATMOSPASS, IT IS NOT CHEAP. use this instead, the info is cached after all. it's tweaked just a bit to allow for circular checks #define TURFS_CAN_SHARE(T1, T2) (LAZYACCESS(T2.atmos_adjacent_turfs, T1) || LAZYLEN(T1.atmos_adjacent_turfs & T2.atmos_adjacent_turfs)) -GLOBAL_VAR(atmos_extools_initialized) // this must be an uninitialized (null) one or init_monstermos will be called twice because reasons -#define ATMOS_EXTOOLS_CHECK if(!GLOB.atmos_extools_initialized){\ - GLOB.atmos_extools_initialized=TRUE;\ - if(fexists(EXTOOLS)){\ - var/result = call(EXTOOLS,"init_monstermos")();\ - if(result != "ok") {CRASH(result);}\ - } else {\ - CRASH("[EXTOOLS] does not exist!");\ - }\ -} - //Unomos - So for whatever reason, garbage collection actually drastically decreases the cost of atmos later in the round. Turning this into a define yields massively improved performance. #define GAS_GARBAGE_COLLECT(GASGASGAS)\ var/list/CACHE_GAS = GASGASGAS;\ diff --git a/code/__DEFINES/citadel_defines.dm b/code/__DEFINES/citadel_defines.dm index 541b50e9bd..04eeb515c9 100644 --- a/code/__DEFINES/citadel_defines.dm +++ b/code/__DEFINES/citadel_defines.dm @@ -101,6 +101,7 @@ #define NO_AUTO_WAG (1<<12) #define GENITAL_EXAMINE (1<<13) #define VORE_EXAMINE (1<<14) +#define TRASH_FORCEFEED (1<<15) #define TOGGLES_CITADEL 0 //belly sound pref things diff --git a/code/__DEFINES/colors.dm b/code/__DEFINES/colors.dm index 9f45d8da79..db78144689 100644 --- a/code/__DEFINES/colors.dm +++ b/code/__DEFINES/colors.dm @@ -24,6 +24,7 @@ #define COLOR_BEIGE "#CEB689" #define COLOR_BLUE_GRAY "#75A2BB" #define COLOR_BROWN "#BA9F6D" +#define COLOR_SOFT_RED "#FA8282" #define COLOR_DARK_BROWN "#997C4F" #define COLOR_DARK_ORANGE "#C3630C" #define COLOR_GREEN_GRAY "#99BB76" diff --git a/code/__DEFINES/combat/block.dm b/code/__DEFINES/combat/block.dm index bc85947d71..9be4aaa2bf 100644 --- a/code/__DEFINES/combat/block.dm +++ b/code/__DEFINES/combat/block.dm @@ -63,6 +63,8 @@ #define BLOCK_RETURN_MITIGATION_PERCENT "partial_mitigation" /// Used internally by run_parry proc, use on an on_active_parry() proc to override parrying efficiency. #define BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY "override_parry_efficiency" +/// Used internally by run_parry proc, use on an on_active_parry() proc to prevent counterattacks +#define BLOCK_RETURN_FORCE_NO_PARRY_COUNTERATTACK "no_parry_counterattack" /// Always set to 100 by run_block() if BLOCK_SUCCESS is in return value. Otherwise, defaults to mitigation percent if not set. Used by projectile/proc/on_hit(). #define BLOCK_RETURN_PROJECTILE_BLOCK_PERCENTAGE "projectile_block_percentage" diff --git a/code/__DEFINES/construction.dm b/code/__DEFINES/construction.dm index d3caedac22..f4b0fe1593 100644 --- a/code/__DEFINES/construction.dm +++ b/code/__DEFINES/construction.dm @@ -81,7 +81,6 @@ #define CAT_AMMO "Ammunition" #define CAT_PARTS "Weapon Parts" #define CAT_ROBOT "Robots" -#define CAT_MISC "Misc" #define CAT_MISCELLANEOUS "Miscellaneous" #define CAT_TOOL "Tools & Storage" #define CAT_FURNITURE "Furniture" diff --git a/code/__DEFINES/dcs/flags.dm b/code/__DEFINES/dcs/flags.dm index 719a795824..3a6877eeb3 100644 --- a/code/__DEFINES/dcs/flags.dm +++ b/code/__DEFINES/dcs/flags.dm @@ -83,3 +83,19 @@ #define COMBAT_MODE_ACTIVE (1<<1) /// combat mode is not active #define COMBAT_MODE_INACTIVE (1<<2) + +// Update flags for [/atom/proc/update_appearance] +/// Update the atom's name +#define UPDATE_NAME (1<<0) +/// Update the atom's desc +#define UPDATE_DESC (1<<1) +/// Update the atom's icon state +#define UPDATE_ICON_STATE (1<<2) +/// Update the atom's overlays +#define UPDATE_OVERLAYS (1<<3) +/// Update the atom's greyscaling +#define UPDATE_GREYSCALE (1<<4) +/// Update the atom's smoothing. (More accurately, queue it for an update) +#define UPDATE_SMOOTHING (1<<5) +/// Update the atom's icon +#define UPDATE_ICON (UPDATE_ICON_STATE|UPDATE_OVERLAYS) diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index e8ab7899db..3ab70126e3 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -74,11 +74,30 @@ #define EXAMINE_POSITION_BEFORE (1<<1) //End positions #define COMPONENT_EXNAME_CHANGED (1<<0) -#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" //from base of atom/update_icon(): () - #define COMSIG_ATOM_NO_UPDATE_ICON_STATE 1 - #define COMSIG_ATOM_NO_UPDATE_OVERLAYS 2 -#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" //from base of atom/update_overlays(): (list/new_overlays) -#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" //from base of atom/update_icon(): (signalOut, did_anything) +///from base of [/atom/proc/update_appearance]: (updates) +#define COMSIG_ATOM_UPDATE_APPEARANCE "atom_update_appearance" + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its name. + #define COMSIG_ATOM_NO_UPDATE_NAME UPDATE_NAME + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its desc. + #define COMSIG_ATOM_NO_UPDATE_DESC UPDATE_DESC + /// If returned from [COMSIG_ATOM_UPDATE_APPEARANCE] it prevents the atom from updating its icon. + #define COMSIG_ATOM_NO_UPDATE_ICON UPDATE_ICON +///from base of [/atom/proc/update_name]: (updates) +#define COMSIG_ATOM_UPDATE_NAME "atom_update_name" +///from base of [/atom/proc/update_desc]: (updates) +#define COMSIG_ATOM_UPDATE_DESC "atom_update_desc" +///from base of [/atom/update_icon]: () +#define COMSIG_ATOM_UPDATE_ICON "atom_update_icon" + /// If returned from [COMSIG_ATOM_UPDATE_ICON] it prevents the atom from updating its icon state. + #define COMSIG_ATOM_NO_UPDATE_ICON_STATE UPDATE_ICON_STATE + /// If returned from [COMSIG_ATOM_UPDATE_ICON] it prevents the atom from updating its overlays. + #define COMSIG_ATOM_NO_UPDATE_OVERLAYS UPDATE_OVERLAYS +///from base of [atom/update_icon_state]: () +#define COMSIG_ATOM_UPDATE_ICON_STATE "atom_update_icon_state" +///from base of [/atom/update_overlays]: (list/new_overlays) +#define COMSIG_ATOM_UPDATE_OVERLAYS "atom_update_overlays" +///from base of [/atom/update_icon]: (signalOut, did_anything) +#define COMSIG_ATOM_UPDATED_ICON "atom_updated_icon" #define COMSIG_ATOM_ENTERED "atom_entered" //from base of atom/Entered(): (atom/movable/entering, /atom) #define COMSIG_ATOM_EXIT "atom_exit" //from base of atom/Exit(): (/atom/movable/exiting, /atom/newloc) #define COMPONENT_ATOM_BLOCK_EXIT 1 @@ -112,8 +131,6 @@ ///from obj/machinery/bsa/full/proc/fire(): () #define COMSIG_ATOM_BSA_BEAM "atom_bsa_beam_pass" #define COMSIG_ATOM_BLOCKS_BSA_BEAM (1<<0) -///from base of atom/set_light(): (l_range, l_power, l_color) -#define COMSIG_ATOM_SET_LIGHT "atom_set_light" ///from base of atom/setDir(): (old_dir, new_dir). Called before the direction changes. #define COMSIG_ATOM_DIR_CHANGE "atom_dir_change" ///from base of atom/handle_atom_del(): (atom/deleted) @@ -278,6 +295,32 @@ ///from base of mob/AltClickOn(): (atom/A) #define COMSIG_MOB_ALTCLICKON "mob_altclickon" +// Lighting: +///from base of [atom/proc/set_light]: (l_range, l_power, l_color, l_on) +#define COMSIG_ATOM_SET_LIGHT "atom_set_light" + /// Blocks [/atom/proc/set_light], [/atom/proc/set_light_power], [/atom/proc/set_light_range], [/atom/proc/set_light_color], [/atom/proc/set_light_on], and [/atom/proc/set_light_flags]. + #define COMPONENT_BLOCK_LIGHT_UPDATE (1<<0) +///Called right before the atom changes the value of light_power to a different one, from base [atom/proc/set_light_power]: (new_power) +#define COMSIG_ATOM_SET_LIGHT_POWER "atom_set_light_power" +///Called right after the atom changes the value of light_power to a different one, from base of [/atom/proc/set_light_power]: (old_power) +#define COMSIG_ATOM_UPDATE_LIGHT_POWER "atom_update_light_power" +///Called right before the atom changes the value of light_range to a different one, from base [atom/proc/set_light_range]: (new_range) +#define COMSIG_ATOM_SET_LIGHT_RANGE "atom_set_light_range" +///Called right after the atom changes the value of light_range to a different one, from base of [/atom/proc/set_light_range]: (old_range) +#define COMSIG_ATOM_UPDATE_LIGHT_RANGE "atom_update_light_range" +///Called right before the atom changes the value of light_color to a different one, from base [atom/proc/set_light_color]: (new_color) +#define COMSIG_ATOM_SET_LIGHT_COLOR "atom_set_light_color" +///Called right after the atom changes the value of light_color to a different one, from base of [/atom/proc/set_light_color]: (old_color) +#define COMSIG_ATOM_UPDATE_LIGHT_COLOR "atom_update_light_color" +///Called right before the atom changes the value of light_on to a different one, from base [atom/proc/set_light_on]: (new_value) +#define COMSIG_ATOM_SET_LIGHT_ON "atom_set_light_on" +///Called right after the atom changes the value of light_on to a different one, from base of [/atom/proc/set_light_on]: (old_value) +#define COMSIG_ATOM_UPDATE_LIGHT_ON "atom_update_light_on" +///Called right before the atom changes the value of light_flags to a different one, from base [atom/proc/set_light_flags]: (new_flags) +#define COMSIG_ATOM_SET_LIGHT_FLAGS "atom_set_light_flags" +///Called right after the atom changes the value of light_flags to a different one, from base of [/atom/proc/set_light_flags]: (old_flags) +#define COMSIG_ATOM_UPDATE_LIGHT_FLAGS "atom_update_light_flags" + // /client signals #define COMSIG_MOB_CLIENT_LOGIN "mob_client_login" //sent when a mob/login() finishes: (client) #define COMSIG_MOB_CLIENT_LOGOUT "mob_client_logout" //sent when a mob/logout() starts: (client) @@ -361,6 +404,12 @@ // /machinery signals #define COMSIG_MACHINE_EJECT_OCCUPANT "eject_occupant" //from base of obj/machinery/dropContents() (occupant) +///from base power_change() when power is lost +#define COMSIG_MACHINERY_POWER_LOST "machinery_power_lost" +///from base power_change() when power is restored +#define COMSIG_MACHINERY_POWER_RESTORED "machinery_power_restored" +///from /obj/machinery/obj_break(damage_flag): (damage_flag) +#define COMSIG_MACHINERY_BROKEN "machinery_broken" // /obj/item signals #define COMSIG_ITEM_ATTACK "item_attack" //from base of obj/item/attack(): (/mob/living/target, /mob/living/user) @@ -570,3 +619,6 @@ // twitch plays /// Returns direction: (wipe_votes) #define COMSIG_TWITCH_PLAYS_MOVEMENT_DATA "twitch_plays_movement_data" + +// /datum/component/identification signals +#define COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK "id_knowledge_check" // (mob/user) - returns a value from ID_COMPONENT_KNOWLEDGE_NONE to ID_COMPONENT_KNOWLEDGE_FULL diff --git a/code/__DEFINES/inventory.dm b/code/__DEFINES/inventory.dm index 649e0a029b..7b727fcc5a 100644 --- a/code/__DEFINES/inventory.dm +++ b/code/__DEFINES/inventory.dm @@ -159,6 +159,18 @@ #define TINT_DARKENED 2 //Threshold of tint level to apply weld mask overlay #define TINT_BLIND 3 //Threshold of tint level to obscure vision fully +// defines for AFK theft +/// How many messages you can remember while logged out before you stop remembering new ones +#define AFK_THEFT_MAX_MESSAGES 10 +/// If someone logs back in and there are entries older than this, just tell them they can't remember who it was or when +#define AFK_THEFT_FORGET_DETAILS_TIME 5 MINUTES +/// The index of the entry in 'afk_thefts' with the person's visible name at the time +#define AFK_THEFT_NAME 1 +/// The index of the entry in 'afk_thefts' with the text +#define AFK_THEFT_MESSAGE 2 +/// The index of the entry in 'afk_thefts' with the time it happened +#define AFK_THEFT_TIME 3 + //Allowed equipment lists for security vests and hardsuits. GLOBAL_LIST_INIT(advanced_hardsuit_allowed, typecacheof(list( diff --git a/code/__DEFINES/is_helpers.dm b/code/__DEFINES/is_helpers.dm index 69c112d684..9538cf91fa 100644 --- a/code/__DEFINES/is_helpers.dm +++ b/code/__DEFINES/is_helpers.dm @@ -254,6 +254,9 @@ GLOBAL_LIST_INIT(glass_sheet_types, typecacheof(list( #define isshuttleturf(T) (length(T.baseturfs) && (/turf/baseturf_skipover/shuttle in T.baseturfs)) #define isProbablyWallMounted(O) (O.pixel_x > 20 || O.pixel_x < -20 || O.pixel_y > 20 || O.pixel_y < -20) + +#define isfinite(n) (isnum(n) && n == n) + #define isbook(O) (is_type_in_typecache(O, GLOB.book_types)) GLOBAL_LIST_INIT(book_types, typecacheof(list( diff --git a/code/__DEFINES/layers_planes.dm b/code/__DEFINES/layers_planes.dm index 37584d892d..ea7b1b2e0a 100644 --- a/code/__DEFINES/layers_planes.dm +++ b/code/__DEFINES/layers_planes.dm @@ -124,16 +124,20 @@ #define EMISSIVE_PLANE 13 #define EMISSIVE_LAYER 13 -#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" #define EMISSIVE_UNBLOCKABLE_PLANE 14 #define EMISSIVE_UNBLOCKABLE_LAYER 14 +#define EMISSIVE_LAYER_UNBLOCKABLE 14 #define EMISSIVE_UNBLOCKABLE_RENDER_TARGET "*EMISSIVE_UNBLOCKABLE_PLANE" +#define EMISSIVE_RENDER_TARGET "*EMISSIVE_PLANE" #define LIGHTING_PLANE 15 #define LIGHTING_LAYER 15 #define LIGHTING_RENDER_TARGET "LIGHT_PLANE" +#define O_LIGHTING_VISUAL_PLANE 110 +#define O_LIGHTING_VISUAL_RENDER_TARGET "O_LIGHT_VISUAL_PLANE" + #define RAD_TEXT_LAYER 15.1 #define ABOVE_LIGHTING_PLANE 16 diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index 3fba27ba52..95d91da14a 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -84,11 +84,24 @@ #define FLASH_LIGHT_POWER 3 #define FLASH_LIGHT_RANGE 3.8 +// Emissive blocking. /// Uses vis_overlays to leverage caching so that very few new items need to be made for the overlay. For anything that doesn't change outline or opaque area much or at all. #define EMISSIVE_BLOCK_GENERIC 1 /// Uses a dedicated render_target object to copy the entire appearance in real time to the blocking layer. For things that can change in appearance a lot from the base state, like humans. #define EMISSIVE_BLOCK_UNIQUE 2 +/// The color matrix applied to all emissive overlays. Should be solely dependent on alpha and not have RGB overlap with [EM_BLOCK_COLOR]. +#define EMISSIVE_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 1,1,1,0) +/// A globaly cached version of [EMISSIVE_COLOR] for quick access. +GLOBAL_LIST_INIT(emissive_color, EMISSIVE_COLOR) +/// The color matrix applied to all emissive blockers. Should be solely dependent on alpha and not have RGB overlap with [EMISSIVE_COLOR]. +#define EM_BLOCK_COLOR list(0,0,0,0, 0,0,0,0, 0,0,0,0, 0,0,0,1, 0,0,0,0) +/// A globaly cached version of [EM_BLOCK_COLOR] for quick access. +GLOBAL_LIST_INIT(em_block_color, EM_BLOCK_COLOR) +/// The color matrix used to mask out emissive blockers on the emissive plane. Alpha should default to zero, be solely dependent on the RGB value of [EMISSIVE_COLOR], and be independant of the RGB value of [EM_BLOCK_COLOR]. +#define EM_MASK_MATRIX list(0,0,0,1/3, 0,0,0,1/3, 0,0,0,1/3, 0,0,0,0, 1,1,1,0) +/// A globaly cached version of [EM_MASK_MATRIX] for quick access. +GLOBAL_LIST_INIT(em_mask_matrix, EM_MASK_MATRIX) /// Returns the red part of a #RRGGBB hex sequence as number #define GETREDPART(hexa) hex2num(copytext(hexa, 2, 4)) diff --git a/code/__DEFINES/loadout.dm b/code/__DEFINES/loadout.dm index c900a33d06..f9b4c36c9c 100644 --- a/code/__DEFINES/loadout.dm +++ b/code/__DEFINES/loadout.dm @@ -59,7 +59,7 @@ #define LOADOUT_CATEGORY_UNLOCKABLE "Unlockable" //how many prosthetics can we have -#define MAXIMUM_LOADOUT_PROSTHETICS 2 +#define MAXIMUM_LOADOUT_PROSTHETICS 4 //what limbs can be amputated or be prosthetic #define LOADOUT_ALLOWED_LIMB_TARGETS list(BODY_ZONE_L_ARM,BODY_ZONE_R_ARM,BODY_ZONE_L_LEG,BODY_ZONE_R_LEG) diff --git a/code/__DEFINES/maths.dm b/code/__DEFINES/maths.dm index 4c9c195def..f56cd76a71 100644 --- a/code/__DEFINES/maths.dm +++ b/code/__DEFINES/maths.dm @@ -4,6 +4,8 @@ #define NUM_E 2.71828183 +#define SQRT_2 1.414214 + #define PI 3.1416 #define INFINITY 1e31 //closer then enough @@ -212,12 +214,17 @@ /// Like DT_PROB_RATE but easier to use, simply put `if(DT_PROB(10, 5))` #define DT_PROB(prob_per_second_percent, delta_time) (prob(100*DT_PROB_RATE((prob_per_second_percent)/100, (delta_time)))) // ) - +/// Taxicab distance--gets you the **actual** time it takes to get from one turf to another due to how we calculate diagonal movement #define MANHATTAN_DISTANCE(a, b) (abs(a.x - b.x) + abs(a.y - b.y)) +// ) +/// A function that exponentially approaches a maximum value of L +/// k is the rate at which is approaches L, x_0 is the point where the function = 0 #define LOGISTIC_FUNCTION(L,k,x,x_0) (L/(1+(NUM_E**(-k*(x-x_0))))) - +// ) /// Make sure something is a boolean TRUE/FALSE 1/0 value, since things like bitfield & bitflag doesn't always give 1s and 0s. #define FORCE_BOOLEAN(x) ((x)? TRUE : FALSE) - +// ) +/// Gives the number of pixels in an orthogonal line of tiles. #define TILES_TO_PIXELS(tiles) (tiles * PIXELS) +// ) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index 86fdd23d0b..14382eb09c 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -9,6 +9,9 @@ #define TEXT_EAST "[EAST]" #define TEXT_WEST "[WEST]" +/// yeah yeah i'm a lazy asshole who can't debug yeah yeah +#define DEBUG_LINE message_admins("DEBUG: [__FILE__] [__LINE__] executing!") + /// world.icon_size #define PIXELS 32 diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index cf8fef386b..850a2b0f39 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -343,3 +343,7 @@ ///Define for spawning megafauna instead of a mob for cave gen #define SPAWN_MEGAFAUNA "bluh bluh huge boss" + +// / Breathing types. Lungs can access either by these or by a string, which will be considered a gas ID. +#define BREATH_OXY /datum/breathing_class/oxygen +#define BREATH_PLASMA /datum/breathing_class/plasma diff --git a/code/__DEFINES/power.dm b/code/__DEFINES/power.dm index 78d942d78b..8cd3e7d525 100644 --- a/code/__DEFINES/power.dm +++ b/code/__DEFINES/power.dm @@ -1,3 +1,8 @@ #define SOLAR_TRACK_OFF 0 #define SOLAR_TRACK_TIMED 1 #define SOLAR_TRACK_AUTO 2 + +///conversion ratio from joules to watts +#define WATTS / 0.002 +///conversion ratio from watts to joules +#define JOULES * 0.002 diff --git a/code/__DEFINES/sound.dm b/code/__DEFINES/sound.dm index 1098a07b39..72543970ba 100644 --- a/code/__DEFINES/sound.dm +++ b/code/__DEFINES/sound.dm @@ -25,7 +25,11 @@ ///Percentage of sound's range where no falloff is applied #define SOUND_DEFAULT_FALLOFF_DISTANCE 1 //For a normal sound this would be 1 tile of no falloff ///The default exponent of sound falloff -#define SOUND_FALLOFF_EXPONENT 6 +#define SOUND_FALLOFF_EXPONENT 7.5 +/// Default distance multiplier for sounds +#define SOUND_DEFAULT_DISTANCE_MULTIPLIER 2.5 +/// Default range at which sound distance multiplier applies +#define SOUND_DEFAULT_MULTIPLIER_EFFECT_RANGE 7 //THIS SHOULD ALWAYS BE THE LOWEST ONE! //KEEP IT UPDATED diff --git a/code/__DEFINES/spaceman_dmm.dm b/code/__DEFINES/spaceman_dmm.dm index 087fa5e6e6..f15d6a175f 100644 --- a/code/__DEFINES/spaceman_dmm.dm +++ b/code/__DEFINES/spaceman_dmm.dm @@ -28,6 +28,5 @@ #define VAR_PROTECTED var #endif -/world/proc/enable_debugger() - if (fexists(EXTOOLS)) - call(EXTOOLS, "debug_initialize")() +/proc/enable_debugging() + CRASH("Auxtools not found") diff --git a/code/__DEFINES/spans.dm b/code/__DEFINES/spans.dm new file mode 100644 index 0000000000..45eae3ce76 --- /dev/null +++ b/code/__DEFINES/spans.dm @@ -0,0 +1,114 @@ +// Sorted alphabetically +#define span_abductor(str) ("" + str + "") +#define span_admin(str) ("" + str + "") +#define span_adminhelp(str) ("" + str + "") +#define span_adminnotice(str) ("" + str + "") +#define span_adminobserverooc(str) ("" + str + "") +#define span_adminooc(str) ("" + str + "") +#define span_adminsay(str) ("" + str + "") +#define span_aiprivradio(str) ("" + str + "") +#define span_alert(str) ("" + str + "") +#define span_alertalien(str) ("" + str + "") +#define span_alertsyndie(str) ("" + str + "") +#define span_alertwarning(str) ("" + str + "") +#define span_alien(str) ("" + str + "") +#define span_announce(str) ("" + str + "") +#define span_big(str) ("" + str + "") +#define span_bigicon(str) ("" + str + "") +#define span_binarysay(str) ("" + str + "") +#define span_blue(str) ("" + str + "") +#define span_blueteamradio(str) ("" + str + "") +#define span_bold(str) ("" + str + "") +#define span_boldannounce(str) ("" + str + "") +#define span_boldnotice(str) ("" + str + "") +#define span_boldwarning(str) ("" + str + "") +#define span_centcomradio(str) ("" + str + "") +#define span_changeling(str) ("" + str + "") +#define span_clown(str) ("" + str + "") +#define span_colossus(str) ("" + str + "") +#define span_command_headset(str) ("" + str + "") +#define span_comradio(str) ("" + str + "") +#define span_cult(str) ("" + str + "") +#define span_cultbold(str) ("" + str + "") +#define span_cultboldtalic(str) ("" + str + "") +#define span_cultitalic(str) ("" + str + "") +#define span_cultlarge(str) ("" + str + "") +#define span_danger(str) ("" + str + "") +#define span_deadsay(str) ("" + str + "") +#define span_deconversion_message(str) ("" + str + "") +#define span_drone(str) ("" + str + "") +#define span_engradio(str) ("" + str + "") +#define span_extremelybig(str) ("" + str + "") +#define span_ghostalert(str) ("" + str + "") +#define span_green(str) ("" + str + "") +#define span_greenannounce(str) ("" + str + "") +#define span_greenteamradio(str) ("" + str + "") +#define span_greentext(str) ("" + str + "") +#define span_hear(str) ("" + str + "") +#define span_hidden(str) ("") +#define span_hierophant(str) ("" + str + "") +#define span_hierophant_warning(str) ("" + str + "") +#define span_highlight(str) ("" + str + "") +#define span_his_grace(str) ("" + str + "") +#define span_holoparasite(str) ("" + str + "") +#define span_hypnophrase(str) ("" + str + "") +#define span_icon(str) ("" + str + "") +#define span_info(str) ("" + str + "") +#define span_interface(str) ("" + str + "") +#define span_looc(str) ("" + str + "") +#define span_medal(str) ("" + str + "") +#define span_medradio(str) ("" + str + "") +#define span_memo(str) ("" + str + "") +#define span_memoedit(str) ("" + str + "") +#define span_mind_control(str) ("" + str + "") +#define span_minorannounce(str) ("" + str + "") +#define span_monkey(str) ("" + str + "") +#define span_monkeyhive(str) ("" + str + "") +#define span_monkeylead(str) ("" + str + "") +#define span_name(str) ("" + str + "") +#define span_narsie(str) ("" + str + "") +#define span_narsiesmall(str) ("" + str + "") +#define span_nicegreen(str) ("" + str + "") +#define span_notice(str) ("" + str + "") +#define span_noticealien(str) ("" + str + "") +#define span_ooc(str) ("" + str + "") +#define span_papyrus(str) ("" + str + "") +#define span_phobia(str) ("" + str + "") +#define span_prefix(str) ("" + str + "") +#define span_purple(str) ("" + str + "") +#define span_radio(str) ("" + str + "") +#define span_reallybig(str) ("" + str + "") +#define span_red(str) ("" + str + "") +#define span_redteamradio(str) ("" + str + "") +#define span_redtext(str) ("" + str + "") +#define span_resonate(str) ("" + str + "") +#define span_revenbignotice(str) ("" + str + "") +#define span_revenboldnotice(str) ("" + str + "") +#define span_revendanger(str) ("" + str + "") +#define span_revenminor(str) ("" + str + "") +#define span_revennotice(str) ("" + str + "") +#define span_revenwarning(str) ("" + str + "") +#define span_robot(str) ("" + str + "") +#define span_rose(str) ("" + str + "") +#define span_sans(str) ("" + str + "") +#define span_sciradio(str) ("" + str + "") +#define span_secradio(str) ("" + str + "") +#define span_servradio(str) ("" + str + "") +#define span_singing(str) ("" + str + "") +#define span_slime(str) ("" + str + "") +#define span_small(str) ("" + str + "") +#define span_smallnotice(str) ("" + str + "") +#define span_smallnoticeital(str) ("" + str + "") +#define span_spider(str) ("" + str + "") +#define span_suicide(str) ("" + str + "") +#define span_suppradio(str) ("" + str + "") +#define span_swarmer(str) ("" + str + "") +#define span_syndradio(str) ("" + str + "") +#define span_tape_recorder(str) ("" + str + "") +#define span_tinynotice(str) ("" + str + "") +#define span_tinynoticeital(str) ("" + str + "") +#define span_unconscious(str) ("" + str + "") +#define span_userdanger(str) ("" + str + "") +#define span_warning(str) ("" + str + "") +#define span_yell(str) ("" + str + "") +#define span_yellowteamradio(str) ("" + str + "") diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index a047020999..5c6c8b143c 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -105,8 +105,6 @@ #define STATUS_EFFECT_FAKE_VIRUS /datum/status_effect/fake_virus //gives you fluff messages for cough, sneeze, headache, etc but without an actual virus -#define STATUS_EFFECT_NO_COMBAT_MODE /datum/status_effect/no_combat_mode //Wont allow combat mode and will disable it - #define STATUS_EFFECT_STASIS /datum/status_effect/grouped/stasis //Halts biological functions like bleeding, chemical processing, blood regeneration, walking, etc #define STATUS_EFFECT_MESMERIZE /datum/status_effect/mesmerize //Just reskinned no_combat_mode diff --git a/code/__DEFINES/subsystems.dm b/code/__DEFINES/subsystems.dm index 2c8001b086..30899c0ca2 100644 --- a/code/__DEFINES/subsystems.dm +++ b/code/__DEFINES/subsystems.dm @@ -185,6 +185,7 @@ #define FIRE_PRIORITY_CHAT 400 #define FIRE_PRIORITY_RUNECHAT 410 #define FIRE_PRIORITY_OVERLAYS 500 +#define FIRE_PRIORITY_CALLBACKS 600 // #define FIRE_PRIORITY_EXPLOSIONS 666 #define FIRE_PRIORITY_TIMER 700 #define FIRE_PRIORITY_INPUT 1000 // This must always always be the max highest priority. Player input must never be lost. @@ -199,7 +200,27 @@ #define RUNLEVELS_DEFAULT (RUNLEVEL_SETUP | RUNLEVEL_GAME | RUNLEVEL_POSTGAME) +// SSair run section +#define SSAIR_PIPENETS 1 +#define SSAIR_ATMOSMACHINERY 2 +#define SSAIR_EXCITEDGROUPS 3 +#define SSAIR_HIGHPRESSURE 4 +#define SSAIR_HOTSPOTS 5 +#define SSAIR_TURF_CONDUCTION 6 +#define SSAIR_REBUILD_PIPENETS 7 +#define SSAIR_EQUALIZE 8 +#define SSAIR_ACTIVETURFS 9 +#define SSAIR_TURF_POST_PROCESS 10 +#define SSAIR_FINALIZE_TURFS 11 +#define SSAIR_ATMOSMACHINERY_AIR 12 +#define SSAIR_DEFERRED_AIRS 13 +// Subsystem delta times or tickrates, in seconds. I.e, how many seconds in between each process() call for objects being processed by that subsystem. +// Only use these defines if you want to access some other objects processing delta_time, otherwise use the delta_time that is sent as a parameter to process() +#define SSFLUIDS_DT (SSfluids.wait/10) +#define SSMACHINES_DT (SSmachines.wait/10) +#define SSMOBS_DT (SSmobs.wait/10) +#define SSOBJ_DT (SSobj.wait/10) //! ## Overlays subsystem @@ -228,14 +249,3 @@ * * flags flags for this timer, see: code\__DEFINES\subsystems.dm */ #define addtimer(args...) _addtimer(args, file = __FILE__, line = __LINE__) - -// SSair run section -#define SSAIR_PIPENETS 1 -#define SSAIR_ATMOSMACHINERY 2 -#define SSAIR_EXCITEDGROUPS 3 -#define SSAIR_HIGHPRESSURE 4 -#define SSAIR_HOTSPOTS 5 -#define SSAIR_SUPERCONDUCTIVITY 6 -#define SSAIR_REBUILD_PIPENETS 7 -#define SSAIR_EQUALIZE 8 -#define SSAIR_ACTIVETURFS 9 diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 3082856ccf..eb9bdccc22 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -221,6 +221,7 @@ #define TRAIT_LIVING_NO_DENSITY "living_no_density" /// forces us to not render our overlays #define TRAIT_HUMAN_NO_RENDER "human_no_render" +#define TRAIT_TRASHCAN "trashcan" // mobility flag traits // IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it) diff --git a/code/__DEFINES/voreconstants.dm b/code/__DEFINES/voreconstants.dm index d2eb034813..372c5b776c 100644 --- a/code/__DEFINES/voreconstants.dm +++ b/code/__DEFINES/voreconstants.dm @@ -8,17 +8,22 @@ #define DM_UNABSORB "Un-absorb" #define DIGESTABLE (1<<0) -#define SHOW_VORE_PREFS (1<<1) -#define DEVOURABLE (1<<2) -#define FEEDING (1<<3) -#define NO_VORE (1<<4) -#define OPEN_PANEL (1<<5) -#define ABSORBED (1<<6) -#define VORE_INIT (1<<7) -#define VOREPREF_INIT (1<<8) -#define LICKABLE (1<<9) +#define DEVOURABLE (1<<1) +#define FEEDING (1<<2) +#define NO_VORE (1<<3) +#define ABSORBED (1<<4) +#define VORE_INIT (1<<5) +#define VOREPREF_INIT (1<<6) +#define LICKABLE (1<<7) +/// Can be smelled? +#define SMELLABLE (1<<8) +/// Can get absorbed? +#define ABSORBABLE (1<<9) +/// Can get simplemob vored? +#define MOBVORE (1<<10) -#define MAX_VORE_FLAG (1<<10)-1 // change this whenever you add a vore flag, must be largest vore flag*2-1 +/// Change this whenever you add a vore flag, must be largest vore flag*2-1 +#define MAX_VORE_FLAG (1<<11)-1 #define isbelly(A) istype(A, /obj/belly) diff --git a/code/__HELPERS/_extools_api.dm b/code/__HELPERS/_extools_api.dm new file mode 100644 index 0000000000..7bff3f06c0 --- /dev/null +++ b/code/__HELPERS/_extools_api.dm @@ -0,0 +1,30 @@ +//#define EXTOOLS_LOGGING // rust_g is used as a fallback if this is undefined + +/proc/extools_log_write() + +/proc/extools_finalize_logging() + +/proc/auxtools_stack_trace(msg) + CRASH(msg) + +GLOBAL_LIST_EMPTY(auxtools_initialized) + +#define AUXTOOLS_CHECK(LIB)\ + if (!GLOB.auxtools_initialized[LIB]) {\ + if (fexists(LIB)) {\ + var/string = call(LIB,"auxtools_init")();\ + if(findtext(string, "SUCCESS")) {\ + GLOB.auxtools_initialized[LIB] = TRUE;\ + } else {\ + CRASH(string);\ + }\ + } else {\ + CRASH("No file named [LIB] found!")\ + }\ + }\ + +#define AUXTOOLS_SHUTDOWN(LIB)\ + if (GLOB.auxtools_initialized[LIB] && fexists(LIB)){\ + call(LIB,"auxtools_shutdown")();\ + GLOB.auxtools_initialized[LIB] = FALSE;\ + }\ diff --git a/code/__HELPERS/_lists.dm b/code/__HELPERS/_lists.dm index 7e2abebcf9..2d0601d839 100644 --- a/code/__HELPERS/_lists.dm +++ b/code/__HELPERS/_lists.dm @@ -19,6 +19,8 @@ #define LAZYACCESS(L, I) (L ? (isnum(I) ? (I > 0 && I <= length(L) ? L[I] : null) : L[I]) : null) #define LAZYSET(L, K, V) if(!L) { L = list(); } L[K] = V; #define LAZYLEN(L) length(L) +//Sets a list to null +#define LAZYNULL(L) L = null #define LAZYCLEARLIST(L) if(L) L.Cut() #define SANITIZE_LIST(L) ( islist(L) ? L : list() ) #define reverseList(L) reverseRange(L.Copy()) diff --git a/code/__HELPERS/do_after.dm b/code/__HELPERS/do_after.dm index c65cd80394..3ec1aa9b08 100644 --- a/code/__HELPERS/do_after.dm +++ b/code/__HELPERS/do_after.dm @@ -1,23 +1,24 @@ /** - * Higher overhead "advanced" version of do_after. - * @params - * - atom/user is the atom doing the action or the "physical" user - * - delay is time in deciseconds - * - atom/target is the atom the action is being done to, defaults to user - * - do_after_flags see __DEFINES/flags/do_after.dm for details. - * - datum/callback/extra_checks - Every time this ticks, extra_checks() is invoked with (user, delay, target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool). - * Stage can be DO_AFTER_STARTING, DO_AFTER_PROGRESSING, DO_AFTER_FINISHING - * If it returns DO_AFTER_STOP, this breaks. - * If it returns nothing, all other checks are done. - * If it returns DO_AFTER_PROCEED, all other checks are ignored. - * - required_mobility_flags is checked with CHECK_ALL_MOBILITY. Will immediately fail if the user isn't a mob. - * - requried_combat_flags is checked with CHECK_MULTIPLE_BITFIELDS. Will immediately fail if the user isn't a mob. - * - mob/living/mob_redirect - advanced option: If this is specified, movement and mobility/combat flag checks will use this instead of user. Progressbars will also go to this. - * - obj/item/tool - The tool we're using. See do_after flags for details. - */ -#define INVOKE_CALLBACK cb_return = extra_checks?.Invoke(user, delay, target, world.time - starttime, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool) + * Higher overhead "advanced" version of do_after. + * @params + * - atom/user is the atom doing the action or the "physical" user + * - delay is time in deciseconds + * - atom/target is the atom the action is being done to, defaults to user + * - do_after_flags see __DEFINES/flags/do_after.dm for details. + * - datum/callback/extra_checks - Every time this ticks, extra_checks() is invoked with (user, delay, target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in). + * Stage can be DO_AFTER_STARTING, DO_AFTER_PROGRESSING, DO_AFTER_FINISHING + * If it returns DO_AFTER_STOP, this breaks. + * If it returns nothing, all other checks are done. + * If it returns DO_AFTER_PROCEED, all other checks are ignored. + * passed_in is a list[PROGRESS_MULTIPLIER], for modification. + * - required_mobility_flags is checked with CHECK_ALL_MOBILITY. Will immediately fail if the user isn't a mob. + * - requried_combat_flags is checked with CHECK_MULTIPLE_BITFIELDS. Will immediately fail if the user isn't a mob. + * - mob/living/mob_redirect - advanced option: If this is specified, movement and mobility/combat flag checks will use this instead of user. Progressbars will also go to this. + * - obj/item/tool - The tool we're using. See do_after flags for details. + */ +#define INVOKE_CALLBACK cb_return = extra_checks?.Invoke(user, delay, target, timeleft, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, passed_in) #define CHECK_FLAG_FAILURE ((required_mobility_flags || required_combat_flags) && (!living_user || (required_mobility_flags && !CHECK_ALL_MOBILITY(living_user, required_mobility_flags)) || (required_combat_flags && !CHECK_MULTIPLE_BITFIELDS(living_user.combat_flags, required_combat_flags)))) -#define TIMELEFT (world.time - starttime) +#define TIMELEFT (timeleft) /proc/do_after_advanced(atom/user, delay, atom/target, do_after_flags, datum/callback/extra_checks, required_mobility_flags, required_combat_flags, mob/living/mob_redirect, obj/item/tool) // CHECK AND SET VARIABLES if(!user) @@ -40,8 +41,7 @@ return FALSE if(!(do_after_flags & DO_AFTER_NO_COEFFICIENT) && living_user) delay *= living_user.cached_multiplicative_actions_slowdown - var/starttime = world.time - var/endtime = world.time + delay + var/timeleft = delay var/obj/item/initially_held_item = mob_redirect?.get_active_held_item() var/atom/movable/AM_user = ismovable(user) && user var/drifting = AM_user?.Process_Spacemove(NONE) && AM_user.inertia_dir @@ -51,6 +51,7 @@ var/dy = initial_dy // DO OUR STARTING CHECKS var/cb_return + var/list/passed_in = list(1) INVOKE_CALLBACK if(cb_return == DO_AFTER_STOP) return FALSE @@ -70,13 +71,17 @@ var/locchanged var/ctu var/ctt - while(world.time < endtime) + var/tick_time = world.time + while(timeleft > 0) stoplag(1) + var/timepassed = world.time - tick_time + tick_time = world.time progbar?.update(TIMELEFT) if(QDELETED(user) || QDELETED(target) || (user.loc == null) || (target.loc == null)) . = FALSE break INVOKE_CALLBACK + timeleft -= timepassed * passed_in[1] if(cb_return == DO_AFTER_STOP) . = FALSE break diff --git a/code/__HELPERS/game.dm b/code/__HELPERS/game.dm index b9f180ac4a..e55faab1be 100644 --- a/code/__HELPERS/game.dm +++ b/code/__HELPERS/game.dm @@ -270,6 +270,20 @@ SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing, .) processing += A.contents +/proc/get_hearers_in_range(R, atom/source) + var/turf/T = get_turf(source) + . = list() + if(!T) + return + var/list/processing = range(R, source) + var/i = 0 + while(i < length(processing)) + var/atom/A = processing[++i] + if(A.flags_1 & HEAR_1) + . += A + SEND_SIGNAL(A, COMSIG_ATOM_HEARER_IN_VIEW, processing, .) + processing += A.contents + //viewers() but with a signal, for blacklisting. /proc/fov_viewers(depth = world.view, atom/center) if(!center) @@ -381,7 +395,7 @@ /proc/ScreenText(obj/O, maptext="", screen_loc="CENTER-7,CENTER-7", maptext_height=480, maptext_width=480) if(!isobj(O)) - O = new /obj/screen/text() + O = new /atom/movable/screen/text() O.maptext = maptext O.maptext_height = maptext_height O.maptext_width = maptext_width diff --git a/code/__HELPERS/lighting.dm b/code/__HELPERS/lighting.dm new file mode 100644 index 0000000000..685958b015 --- /dev/null +++ b/code/__HELPERS/lighting.dm @@ -0,0 +1,5 @@ +/// Produces a mutable appearance glued to the [EMISSIVE_PLANE] dyed to be the [EMISSIVE_COLOR]. +/proc/emissive_appearance(icon, icon_state = "", layer = FLOAT_LAYER, alpha = 255, appearance_flags = NONE) + var/mutable_appearance/appearance = mutable_appearance(icon, icon_state, layer, EMISSIVE_PLANE, alpha, appearance_flags) + appearance.color = GLOB.emissive_color + return appearance diff --git a/code/__HELPERS/unsorted.dm b/code/__HELPERS/unsorted.dm index 12430df500..9fee97bbb1 100644 --- a/code/__HELPERS/unsorted.dm +++ b/code/__HELPERS/unsorted.dm @@ -163,6 +163,7 @@ Turf and target are separate in case you want to teleport some distance from a t //Generalised helper proc for letting mobs rename themselves. Used to be clname() and ainame() /mob/proc/apply_pref_name(role, client/C) + set waitfor = FALSE if(!C) C = client var/oldname = real_name diff --git a/code/__HELPERS/yelling.dm b/code/__HELPERS/yelling.dm new file mode 100644 index 0000000000..4383a245d4 --- /dev/null +++ b/code/__HELPERS/yelling.dm @@ -0,0 +1,150 @@ +/datum/yelling_wavefill + var/stop = FALSE + var/list/atom/collected + +/datum/yelling_wavefill/Destroy(force, ...) + stop = TRUE + collected = null // don't cut it, something else is probably using it now! + return ..() + +/datum/yelling_wavefill/proc/run_wavefill(atom/source, dist = 50) + collected = list() + do_run(source, dist) + // to_chat(world, "DEBUG: collected [english_list(collected)]") + +// blatantly copied from wave explosion code +// check explosion2.dm for what this does and how it works. +/datum/yelling_wavefill/proc/do_run(atom/source, dist) + source = get_turf(source) + var/list/edges = list() + edges[source] = (NORTH|SOUTH|EAST|WEST) + collected += typecache_filter_list(source.contents, GLOB.typecache_living) + var/list/powers = list() + powers[source] = dist + var/list/processed = list() + var/turf/T + var/turf/expanding + var/power + var/dir + var/returned +#define RUN_YELL(_T, _P, _D) \ + returned = max(_P - max(_T.get_yelling_resistance(_P), 0) - 1, 0); \ + processed[_T] = returned; + // _T.maptext = "[returned]"; + + var/list/turf/edges_next + var/list/turf/powers_next + var/list/turf/powers_returned + var/list/turf/diagonals + var/list/turf/diagonal_powers + var/list/turf/diagonal_powers_max + var/safety = 1000 + +#define CALCULATE_DIAGONAL_POWER(existing, adding, maximum) min(maximum, existing + adding) +#define CALCULATE_DIAGONAL_CROSS_POWER(existing, adding) max(existing, adding) +#define CARDINAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + expanding = get_step(T,ndir); \ + if(expanding && (isnull(processed[expanding]) || (processed[expanding] < (power - 3)))) { \ + powers_next[expanding] = max(powers_next[expanding], returned); \ + edges_next[expanding] = (cdir | edges_next[expanding]); \ + }; \ + }; + +#define DIAGONAL_SUBSTEP(ndir, cdir, edir) \ + expanding = get_step(T,ndir); \ + if(expanding && (isnull(processed[expanding]) || (processed[expanding] < (power - 3)))) { \ + if(!edges_next[expanding]) { \ + diagonal_powers_max[expanding] = max(diagonal_powers_max[expanding], returned, powers[T]); \ + diagonal_powers[expanding] = CALCULATE_DIAGONAL_POWER(diagonal_powers[expanding], returned, diagonal_powers_max[expanding]); \ + diagonals[expanding] = (cdir | diagonals[expanding]); \ + }; \ + else { \ + powers_next[expanding] = CALCULATE_DIAGONAL_CROSS_POWER(powers_next[expanding], returned); \ + }; \ + }; + +#define DIAGONAL_MARK(ndir, cdir, edir) \ + if(edir & cdir) { \ + DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ + DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); \ + }; + + while(edges.len) + edges_next = list() + powers_next = list() + powers_returned = list() + diagonals = list() + diagonal_powers = list() + diagonal_powers_max = list() + // to_chat(world, "DEBUG: cycle start edges [english_list_assoc(edges)]") + + // process cardinals + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + RUN_YELL(T, power, dir) + powers_returned[T] = returned + if(returned >= 1) + collected |= typecache_filter_list(T.contents, GLOB.typecache_living) + else + continue + + CARDINAL_MARK(NORTH, NORTH, dir) + CARDINAL_MARK(SOUTH, SOUTH, dir) + CARDINAL_MARK(EAST, EAST, dir) + CARDINAL_MARK(WEST, WEST, dir) + + // to_chat(world, "DEBUG: cycle mid edges_next [english_list_assoc(edges_next)]") + + // Sweep after cardinals for diagonals + for(var/i in edges) + T = i + power = powers[T] + dir = edges[T] + returned = powers_returned[T] + DIAGONAL_MARK(NORTH, NORTH, dir) + DIAGONAL_MARK(SOUTH, SOUTH, dir) + DIAGONAL_MARK(EAST, EAST, dir) + DIAGONAL_MARK(WEST, WEST, dir) + + // to_chat(world, "DEBUG: cycle mid diagonals [english_list_assoc(diagonals)]") + + // Process diagonals: + for(var/i in diagonals) + T = i + power = diagonal_powers[T] + dir = diagonals[T] + RUN_YELL(T, power, dir) + if(returned >= 1) + collected |= typecache_filter_list(T.contents, GLOB.typecache_living) + else + continue + CARDINAL_MARK(NORTH, NORTH, dir) + CARDINAL_MARK(SOUTH, SOUTH, dir) + CARDINAL_MARK(EAST, EAST, dir) + CARDINAL_MARK(WEST, WEST, dir) + + // to_chat(world, "DEBUG: cycle end edges_next [english_list_assoc(edges_next)]") + + // flush lists + edges = edges_next + powers = powers_next + + // sleep(2.5) + if(!--safety) + CRASH("Yelling ran out of safety.") + +#undef RUN_YELL +#undef DIAGONAL_SUBSTEP +#undef CALCULATE_DIAGONAL_POWER +#undef CALCULATE_DIAGONAL_CROSS_POWER +#undef DIAGONAL_MARK +#undef CARDINAL_MARK + +/proc/yelling_wavefill(atom/source, dist = 50) + var/datum/yelling_wavefill/Y = new + Y.run_wavefill(source, dist) + . = Y.collected + qdel(Y) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index b41b7356a8..daa4f5879d 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -112,6 +112,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/storage/box/marshmallow = 2, /obj/item/clothing/gloves/tackler/offbrand = 1, /obj/item/stack/sticky_tape = 1, + /obj/effect/spawner/lootdrop/grille_or_trash = 15, "" = 3 )) diff --git a/code/_onclick/ai.dm b/code/_onclick/ai.dm index f153b5965c..c7834dc5ef 100644 --- a/code/_onclick/ai.dm +++ b/code/_onclick/ai.dm @@ -25,7 +25,7 @@ if(multicam_on) var/turf/T = get_turf(A) if(T) - for(var/obj/screen/movable/pic_in_pic/ai/P in T.vis_locs) + for(var/atom/movable/screen/movable/pic_in_pic/ai/P in T.vis_locs) if(P.ai == src) P.Click(params) break diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm index 935fbce301..9321427387 100644 --- a/code/_onclick/click.dm +++ b/code/_onclick/click.dm @@ -288,6 +288,9 @@ return /atom/proc/ShiftClick(mob/user) + attempt_examinate(user) + +/atom/proc/attempt_examinate(mob/user) var/flags = SEND_SIGNAL(src, COMSIG_CLICK_SHIFT, user) | SEND_SIGNAL(user, COMSIG_MOB_CLICKED_SHIFT_ON, src) if(!(flags & COMPONENT_DENY_EXAMINATE) && user.client && (user.client.eye == user || user.client.eye == user.loc || flags & COMPONENT_ALLOW_EXAMINATE)) user.examinate(src) @@ -426,14 +429,14 @@ setDir(WEST, ismousemovement) //debug -/obj/screen/proc/scale_to(x1,y1) +/atom/movable/screen/proc/scale_to(x1,y1) if(!y1) y1 = x1 var/matrix/M = new M.Scale(x1,y1) transform = M -/obj/screen/click_catcher +/atom/movable/screen/click_catcher icon = 'icons/mob/screen_gen.dmi' icon_state = "catcher" plane = CLICKCATCHER_PLANE @@ -443,7 +446,7 @@ #define MAX_SAFE_BYOND_ICON_SCALE_TILES (MAX_SAFE_BYOND_ICON_SCALE_PX / world.icon_size) #define MAX_SAFE_BYOND_ICON_SCALE_PX (33 * 32) //Not using world.icon_size on purpose. -/obj/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) +/atom/movable/screen/click_catcher/proc/UpdateGreed(view_size_x = 15, view_size_y = 15) var/icon/newicon = icon('icons/mob/screen_gen.dmi', "catcher") var/ox = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_x) var/oy = min(MAX_SAFE_BYOND_ICON_SCALE_TILES, view_size_y) @@ -458,7 +461,7 @@ M.Scale(px/sx, py/sy) transform = M -/obj/screen/click_catcher/Click(location, control, params) +/atom/movable/screen/click_catcher/Click(location, control, params) var/list/modifiers = params2list(params) if(modifiers["middle"] && iscarbon(usr)) var/mob/living/carbon/C = usr diff --git a/code/_onclick/drag_drop.dm b/code/_onclick/drag_drop.dm index 8e2e0c3fb5..ae853a4e1a 100644 --- a/code/_onclick/drag_drop.dm +++ b/code/_onclick/drag_drop.dm @@ -80,10 +80,10 @@ /atom/proc/IsAutoclickable() . = 1 -/obj/screen/IsAutoclickable() +/atom/movable/screen/IsAutoclickable() . = 0 -/obj/screen/click_catcher/IsAutoclickable() +/atom/movable/screen/click_catcher/IsAutoclickable() . = 1 //Please don't roast me too hard @@ -94,6 +94,10 @@ mouseControlObject = control if(mob) SEND_SIGNAL(mob, COMSIG_MOB_CLIENT_MOUSEMOVE, object, location, control, params) + // god forgive me for i have sinned - used for autoparry. currently at 5 objects. + moused_over_objects[object] = world.time + if(moused_over_objects.len > 7) + moused_over_objects.Cut(1, 2) ..() /client/MouseDrag(src_object,atom/over_object,src_location,over_location,src_control,over_control,params) @@ -115,7 +119,6 @@ if(active_mousedown_item) active_mousedown_item.onMouseDrag(src_object, over_object, src_location, over_location, params, mob) - /obj/item/proc/onMouseDrag(src_object, over_object, src_location, over_location, params, mob) return diff --git a/code/_onclick/hud/action_button.dm b/code/_onclick/hud/action_button.dm index 8a66374029..791cf336ac 100644 --- a/code/_onclick/hud/action_button.dm +++ b/code/_onclick/hud/action_button.dm @@ -1,6 +1,6 @@ #define ACTION_BUTTON_DEFAULT_BACKGROUND "default" -/obj/screen/movable/action_button +/atom/movable/screen/movable/action_button var/datum/action/linked_action var/actiontooltipstyle = "" screen_loc = null @@ -11,7 +11,7 @@ var/id var/ordered = TRUE //If the button gets placed into the default bar -/obj/screen/movable/action_button/proc/can_use(mob/user) +/atom/movable/screen/movable/action_button/proc/can_use(mob/user) if (linked_action) return linked_action.owner == user else if (isobserver(user)) @@ -20,14 +20,14 @@ else return TRUE -/obj/screen/movable/action_button/MouseDrop(over_object) +/atom/movable/screen/movable/action_button/MouseDrop(over_object) if(!can_use(usr)) return - if((istype(over_object, /obj/screen/movable/action_button) && !istype(over_object, /obj/screen/movable/action_button/hide_toggle))) + if((istype(over_object, /atom/movable/screen/movable/action_button) && !istype(over_object, /atom/movable/screen/movable/action_button/hide_toggle))) if(locked) to_chat(usr, "Action button \"[name]\" is locked, unlock it first.") return - var/obj/screen/movable/action_button/B = over_object + var/atom/movable/screen/movable/action_button/B = over_object var/list/actions = usr.actions actions.Swap(actions.Find(src.linked_action), actions.Find(B.linked_action)) moved = FALSE @@ -38,7 +38,7 @@ else return ..() -/obj/screen/movable/action_button/Click(location,control,params) +/atom/movable/screen/movable/action_button/Click(location,control,params) if (!can_use(usr)) return @@ -60,7 +60,7 @@ return TRUE //Hide/Show Action Buttons ... Button -/obj/screen/movable/action_button/hide_toggle +/atom/movable/screen/movable/action_button/hide_toggle name = "Hide Buttons" desc = "Shift-click any button to reset its position, and Control-click it to lock it in place. Alt-click this button to reset all buttons to their default positions." icon = 'icons/mob/actions.dmi' @@ -72,7 +72,7 @@ var/mutable_appearance/hide_appearance var/mutable_appearance/show_appearance -/obj/screen/movable/action_button/hide_toggle/Initialize() +/atom/movable/screen/movable/action_button/hide_toggle/Initialize() . = ..() var/static/list/icon_cache = list() @@ -86,7 +86,7 @@ if(!show_appearance) show_appearance = icon_cache[cache_key] = mutable_appearance(hide_icon, show_state) -/obj/screen/movable/action_button/hide_toggle/Click(location,control,params) +/atom/movable/screen/movable/action_button/hide_toggle/Click(location,control,params) if (!can_use(usr)) return @@ -107,7 +107,7 @@ if(modifiers["alt"]) for(var/V in usr.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(B.id && usr.client) usr.client.prefs.action_buttons_screen_locs["[B.name]_[B.id]"] = null @@ -129,10 +129,10 @@ update_icon() usr.update_action_buttons() -/obj/screen/movable/action_button/hide_toggle/AltClick(mob/user) +/atom/movable/screen/movable/action_button/hide_toggle/AltClick(mob/user) for(var/V in user.actions) var/datum/action/A = V - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button B.moved = FALSE if(moved) moved = FALSE @@ -141,7 +141,7 @@ return TRUE -/obj/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) +/atom/movable/screen/movable/action_button/hide_toggle/proc/InitialiseIcon(datum/hud/owner_hud) var/settings = owner_hud.get_action_buttons_icons() icon = settings["bg_icon"] icon_state = settings["bg_state"] @@ -150,7 +150,7 @@ show_state = settings["toggle_show"] update_icon() -/obj/screen/movable/action_button/hide_toggle/update_overlays() +/atom/movable/screen/movable/action_button/hide_toggle/update_overlays() . = ..() if(hidden) . += show_appearance @@ -158,12 +158,12 @@ . += hide_appearance -/obj/screen/movable/action_button/MouseEntered(location,control,params) +/atom/movable/screen/movable/action_button/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = actiontooltipstyle) -/obj/screen/movable/action_button/MouseExited() +/atom/movable/screen/movable/action_button/MouseExited() closeToolTip(usr) /datum/hud/proc/get_action_buttons_icons() @@ -203,7 +203,7 @@ else for(var/datum/action/A in actions) A.UpdateButtonIcon() - var/obj/screen/movable/action_button/B = A.button + var/atom/movable/screen/movable/action_button/B = A.button if(B.ordered) button_number++ if(B.moved) @@ -235,7 +235,7 @@ return "WEST[coord_col]:[coord_col_offset],NORTH[coord_row]:-6" -/datum/hud/proc/SetButtonCoords(obj/screen/button,number, supportedcolumns) +/datum/hud/proc/SetButtonCoords(atom/movable/screen/button,number, supportedcolumns) var/row = round((number-1)/supportedcolumns) var/col = ((number - 1)%(supportedcolumns)) + 1 var/x_offset = 32*(col-1) + 4 + 2*col diff --git a/code/_onclick/hud/ai.dm b/code/_onclick/hud/ai.dm index 93c3b63d1e..17b5a9ed61 100644 --- a/code/_onclick/hud/ai.dm +++ b/code/_onclick/hud/ai.dm @@ -1,136 +1,136 @@ -/obj/screen/ai +/atom/movable/screen/ai icon = 'icons/mob/screen_ai.dmi' -/obj/screen/ai/Click() +/atom/movable/screen/ai/Click() if(isobserver(usr) || usr.incapacitated()) return TRUE -/obj/screen/ai/aicore +/atom/movable/screen/ai/aicore name = "AI core" icon_state = "ai_core" -/obj/screen/ai/aicore/Click() +/atom/movable/screen/ai/aicore/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.view_core() -/obj/screen/ai/camera_list +/atom/movable/screen/ai/camera_list name = "Show Camera List" icon_state = "camera" -/obj/screen/ai/camera_list/Click() +/atom/movable/screen/ai/camera_list/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.show_camera_list() -/obj/screen/ai/camera_track +/atom/movable/screen/ai/camera_track name = "Track With Camera" icon_state = "track" -/obj/screen/ai/camera_track/Click() +/atom/movable/screen/ai/camera_track/Click() if(..()) return var/mob/living/silicon/ai/AI = usr var/target_name = input(AI, "Choose who you want to track", "Tracking") as null|anything in AI.trackable_mobs() AI.ai_camera_track(target_name) -/obj/screen/ai/camera_light +/atom/movable/screen/ai/camera_light name = "Toggle Camera Light" icon_state = "camera_light" -/obj/screen/ai/camera_light/Click() +/atom/movable/screen/ai/camera_light/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_camera_light() -/obj/screen/ai/crew_monitor +/atom/movable/screen/ai/crew_monitor name = "Crew Monitoring Console" icon_state = "crew_monitor" -/obj/screen/ai/crew_monitor/Click() +/atom/movable/screen/ai/crew_monitor/Click() if(..()) return var/mob/living/silicon/ai/AI = usr GLOB.crewmonitor.show(AI,AI) -/obj/screen/ai/crew_manifest +/atom/movable/screen/ai/crew_manifest name = "Crew Manifest" icon_state = "manifest" -/obj/screen/ai/crew_manifest/Click() +/atom/movable/screen/ai/crew_manifest/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_roster() -/obj/screen/ai/alerts +/atom/movable/screen/ai/alerts name = "Show Alerts" icon_state = "alerts" -/obj/screen/ai/alerts/Click() +/atom/movable/screen/ai/alerts/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_alerts() -/obj/screen/ai/announcement +/atom/movable/screen/ai/announcement name = "Make Vox Announcement" icon_state = "announcement" -/obj/screen/ai/announcement/Click() +/atom/movable/screen/ai/announcement/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.announcement() -/obj/screen/ai/call_shuttle +/atom/movable/screen/ai/call_shuttle name = "Call Emergency Shuttle" icon_state = "call_shuttle" -/obj/screen/ai/call_shuttle/Click() +/atom/movable/screen/ai/call_shuttle/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.ai_call_shuttle() -/obj/screen/ai/state_laws +/atom/movable/screen/ai/state_laws name = "State Laws" icon_state = "state_laws" -/obj/screen/ai/state_laws/Click() +/atom/movable/screen/ai/state_laws/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.checklaws() -/obj/screen/ai/pda_msg_send +/atom/movable/screen/ai/pda_msg_send name = "PDA - Send Message" icon_state = "pda_send" -/obj/screen/ai/pda_msg_send/Click() +/atom/movable/screen/ai/pda_msg_send/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_send_pdamesg(usr) -/obj/screen/ai/pda_msg_show +/atom/movable/screen/ai/pda_msg_show name = "PDA - Show Message Log" icon_state = "pda_receive" -/obj/screen/ai/pda_msg_show/Click() +/atom/movable/screen/ai/pda_msg_show/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.cmd_show_message_log(usr) -/obj/screen/ai/image_take +/atom/movable/screen/ai/image_take name = "Take Image" icon_state = "take_picture" -/obj/screen/ai/image_take/Click() +/atom/movable/screen/ai/image_take/Click() if(..()) return if(isAI(usr)) @@ -140,11 +140,11 @@ var/mob/living/silicon/robot/R = usr R.aicamera.toggle_camera_mode(usr) -/obj/screen/ai/image_view +/atom/movable/screen/ai/image_view name = "View Images" icon_state = "view_images" -/obj/screen/ai/image_view/Click() +/atom/movable/screen/ai/image_view/Click() if(..()) return if(isAI(usr)) @@ -154,31 +154,31 @@ var/mob/living/silicon/robot/R = usr R.aicamera.viewpictures(usr) -/obj/screen/ai/sensors +/atom/movable/screen/ai/sensors name = "Sensor Augmentation" icon_state = "ai_sensor" -/obj/screen/ai/sensors/Click() +/atom/movable/screen/ai/sensors/Click() if(..()) return var/mob/living/silicon/S = usr S.toggle_sensors() -/obj/screen/ai/multicam +/atom/movable/screen/ai/multicam name = "Multicamera Mode" icon_state = "multicam" -/obj/screen/ai/multicam/Click() +/atom/movable/screen/ai/multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr AI.toggle_multicam() -/obj/screen/ai/add_multicam +/atom/movable/screen/ai/add_multicam name = "New Camera" icon_state = "new_cam" -/obj/screen/ai/add_multicam/Click() +/atom/movable/screen/ai/add_multicam/Click() if(..()) return var/mob/living/silicon/ai/AI = usr @@ -190,112 +190,112 @@ /datum/hud/ai/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using // Language menu - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu using.hud = src static_inventory += using //AI core - using = new /obj/screen/ai/aicore() + using = new /atom/movable/screen/ai/aicore() using.screen_loc = ui_ai_core using.hud = src static_inventory += using //Camera list - using = new /obj/screen/ai/camera_list() + using = new /atom/movable/screen/ai/camera_list() using.screen_loc = ui_ai_camera_list using.hud = src static_inventory += using //Track - using = new /obj/screen/ai/camera_track() + using = new /atom/movable/screen/ai/camera_track() using.screen_loc = ui_ai_track_with_camera using.hud = src static_inventory += using //Camera light - using = new /obj/screen/ai/camera_light() + using = new /atom/movable/screen/ai/camera_light() using.screen_loc = ui_ai_camera_light using.hud = src static_inventory += using //Crew Monitoring - using = new /obj/screen/ai/crew_monitor() + using = new /atom/movable/screen/ai/crew_monitor() using.screen_loc = ui_ai_crew_monitor using.hud = src static_inventory += using //Crew Manifest - using = new /obj/screen/ai/crew_manifest() + using = new /atom/movable/screen/ai/crew_manifest() using.screen_loc = ui_ai_crew_manifest using.hud = src static_inventory += using //Alerts - using = new /obj/screen/ai/alerts() + using = new /atom/movable/screen/ai/alerts() using.screen_loc = ui_ai_alerts using.hud = src static_inventory += using //Announcement - using = new /obj/screen/ai/announcement() + using = new /atom/movable/screen/ai/announcement() using.screen_loc = ui_ai_announcement using.hud = src static_inventory += using //Shuttle - using = new /obj/screen/ai/call_shuttle() + using = new /atom/movable/screen/ai/call_shuttle() using.screen_loc = ui_ai_shuttle using.hud = src static_inventory += using //Laws - using = new /obj/screen/ai/state_laws() + using = new /atom/movable/screen/ai/state_laws() using.screen_loc = ui_ai_state_laws using.hud = src static_inventory += using //PDA message - using = new /obj/screen/ai/pda_msg_send() + using = new /atom/movable/screen/ai/pda_msg_send() using.screen_loc = ui_ai_pda_send using.hud = src static_inventory += using //PDA log - using = new /obj/screen/ai/pda_msg_show() + using = new /atom/movable/screen/ai/pda_msg_show() using.screen_loc = ui_ai_pda_log using.hud = src static_inventory += using //Take image - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_ai_take_picture using.hud = src static_inventory += using //View images - using = new /obj/screen/ai/image_view() + using = new /atom/movable/screen/ai/image_view() using.screen_loc = ui_ai_view_images using.hud = src static_inventory += using //Medical/Security sensors - using = new /obj/screen/ai/sensors() + using = new /atom/movable/screen/ai/sensors() using.screen_loc = ui_ai_sensor using.hud = src static_inventory += using //Multicamera mode - using = new /obj/screen/ai/multicam() + using = new /atom/movable/screen/ai/multicam() using.screen_loc = ui_ai_multicam using.hud = src static_inventory += using //Add multicamera camera - using = new /obj/screen/ai/add_multicam() + using = new /atom/movable/screen/ai/add_multicam() using.screen_loc = ui_ai_add_multicam using.hud = src static_inventory += using diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 81d8593d4e..ed4c91dd9b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -18,7 +18,7 @@ if(!category || QDELETED(src)) return - var/obj/screen/alert/thealert + var/atom/movable/screen/alert/thealert if(alerts[category]) thealert = alerts[category] if(thealert.override_alerts) @@ -69,13 +69,13 @@ thealert.timeout = world.time + thealert.timeout - world.tick_lag return thealert -/mob/proc/alert_timeout(obj/screen/alert/alert, category) +/mob/proc/alert_timeout(atom/movable/screen/alert/alert, category) if(alert.timeout && alerts[category] == alert && world.time >= alert.timeout) clear_alert(category) // Proc to clear an existing alert. /mob/proc/clear_alert(category, clear_override = FALSE) - var/obj/screen/alert/alert = alerts[category] + var/atom/movable/screen/alert/alert = alerts[category] if(!alert) return 0 if(alert.override_alerts && !clear_override) @@ -87,7 +87,7 @@ client.screen -= alert qdel(alert) -/obj/screen/alert +/atom/movable/screen/alert icon = 'icons/mob/screen_alert.dmi' icon_state = "default" name = "Alert" @@ -100,72 +100,72 @@ var/mob/mob_viewer //the mob viewing this alert -/obj/screen/alert/MouseEntered(location,control,params) +/atom/movable/screen/alert/MouseEntered(location,control,params) if(!QDELETED(src)) openToolTip(usr,src,params,title = name,content = desc,theme = alerttooltipstyle) -/obj/screen/alert/MouseExited() +/atom/movable/screen/alert/MouseExited() closeToolTip(usr) //Gas alerts -/obj/screen/alert/not_enough_oxy +/atom/movable/screen/alert/not_enough_oxy name = "Choking (No O2)" desc = "You're not getting enough oxygen. Find some good air before you pass out! The box in your backpack has an oxygen tank and breath mask in it." icon_state = "not_enough_oxy" -/obj/screen/alert/too_much_oxy +/atom/movable/screen/alert/too_much_oxy name = "Choking (O2)" desc = "There's too much oxygen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_oxy" -/obj/screen/alert/not_enough_nitro +/atom/movable/screen/alert/not_enough_nitro name = "Choking (No N2)" desc = "You're not getting enough nitrogen. Find some good air before you pass out!" icon_state = "not_enough_nitro" -/obj/screen/alert/too_much_nitro +/atom/movable/screen/alert/too_much_nitro name = "Choking (N2)" desc = "There's too much nitrogen in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_nitro" -/obj/screen/alert/not_enough_co2 +/atom/movable/screen/alert/not_enough_co2 name = "Choking (No CO2)" desc = "You're not getting enough carbon dioxide. Find some good air before you pass out!" icon_state = "not_enough_co2" -/obj/screen/alert/too_much_co2 +/atom/movable/screen/alert/too_much_co2 name = "Choking (CO2)" desc = "There's too much carbon dioxide in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_co2" -/obj/screen/alert/not_enough_tox +/atom/movable/screen/alert/not_enough_tox name = "Choking (No Plasma)" desc = "You're not getting enough plasma. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/too_much_tox +/atom/movable/screen/alert/too_much_tox name = "Choking (Plasma)" desc = "There's highly flammable, toxic plasma in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" -/obj/screen/alert/not_enough_ch4 +/atom/movable/screen/alert/not_enough_ch4 name = "Choking (No CH4)" desc = "You're not getting enough methane. Find some good air before you pass out!" icon_state = "not_enough_ch4" -/obj/screen/alert/too_much_ch4 +/atom/movable/screen/alert/too_much_ch4 name = "Choking (CH4)" desc = "There's too much methane in the air, and you're breathing it in! Find some good air before you pass out!" icon_state = "too_much_ch4" -/obj/screen/alert/not_enough_ch3br +/atom/movable/screen/alert/not_enough_ch3br name = "Choking (No CH3Br)" desc = "You're not getting enough methyl bromide. Find some good air before you pass out!" icon_state = "not_enough_tox" -/obj/screen/alert/too_much_ch3br +/atom/movable/screen/alert/too_much_ch3br name = "Choking (CH3Br)" desc = "There's highly toxic methyl bromide in the air and you're breathing it in. Find some fresh air. The box in your backpack has an oxygen tank and gas mask in it." icon_state = "too_much_tox" @@ -173,109 +173,109 @@ //End gas alerts -/obj/screen/alert/fat +/atom/movable/screen/alert/fat name = "Fat" desc = "You ate too much food, lardass. Run around the station and lose some weight." icon_state = "fat" -/obj/screen/alert/hungry +/atom/movable/screen/alert/hungry name = "Hungry" desc = "Some food would be good right about now." icon_state = "hungry" -/obj/screen/alert/starving +/atom/movable/screen/alert/starving name = "Starving" desc = "You're severely malnourished. The hunger pains make moving around a chore." icon_state = "starving" -/obj/screen/alert/gross +/atom/movable/screen/alert/gross name = "Grossed out." desc = "That was kind of gross..." icon_state = "gross" -/obj/screen/alert/verygross +/atom/movable/screen/alert/verygross name = "Very grossed out." desc = "You're not feeling very well..." icon_state = "gross2" -/obj/screen/alert/disgusted +/atom/movable/screen/alert/disgusted name = "DISGUSTED" desc = "ABSOLUTELY DISGUSTIN'" icon_state = "gross3" -/obj/screen/alert/hot +/atom/movable/screen/alert/hot name = "Too Hot" desc = "The air around you is pretty toasty! Consider putting on some insulating clothing, or moving to a cooler area." icon_state = "hot" -/obj/screen/alert/cold +/atom/movable/screen/alert/cold name = "Too Cold" desc = "The air around you is pretty cold! Consider wearing a coat, or moving to a warmer area." icon_state = "cold" -/obj/screen/alert/sweat +/atom/movable/screen/alert/sweat name = "Sweating" desc = "You're sweating! Get somewhere cooler and take off any insulating clothing like a fire suit." icon_state = "sweat" -/obj/screen/alert/shiver +/atom/movable/screen/alert/shiver name = "Shivering" desc = "You're shivering! Get somewhere warmer and take off any insulating clothing like a space suit." -/obj/screen/alert/lowpressure +/atom/movable/screen/alert/lowpressure name = "Low Pressure" desc = "The air around you is hazardously thin. A space suit would protect you." icon_state = "lowpressure" -/obj/screen/alert/highpressure +/atom/movable/screen/alert/highpressure name = "High Pressure" desc = "The air around you is hazardously thick. A fire suit would protect you." icon_state = "highpressure" -/obj/screen/alert/blind +/atom/movable/screen/alert/blind name = "Blind" desc = "You can't see! This may be caused by a genetic defect, eye trauma, being unconscious, \ or something covering your eyes." icon_state = "blind" -/obj/screen/alert/high +/atom/movable/screen/alert/high name = "High" desc = "Whoa man, you're tripping balls! Careful you don't get addicted... if you aren't already." icon_state = "high" -/obj/screen/alert/mind_control +/atom/movable/screen/alert/mind_control name = "Mind Control" desc = "Your mind has been hijacked! Click to view the mind control command." icon_state = "mind_control" var/command -/obj/screen/alert/mind_control/Click() +/atom/movable/screen/alert/mind_control/Click() var/mob/living/L = usr to_chat(L, "[command]") -/obj/screen/alert/hypnosis +/atom/movable/screen/alert/hypnosis name = "Hypnosis" desc = "Something's hypnotizing you, but you're not really sure about what." icon_state = "hypnosis" var/phrase -/obj/screen/alert/drunk //Not implemented +/atom/movable/screen/alert/drunk //Not implemented name = "Drunk" desc = "All that alcohol you've been drinking is impairing your speech, motor skills, and mental cognition. Make sure to act like it." icon_state = "drunk" -/obj/screen/alert/embeddedobject +/atom/movable/screen/alert/embeddedobject name = "Embedded Object" desc = "Something got lodged into your flesh and is causing major bleeding. It might fall out with time, but surgery is the safest way. \ If you're feeling frisky, examine yourself and click the underlined item to pull the object out." icon_state = "embeddedobject" -/obj/screen/alert/embeddedobject/Click() +/atom/movable/screen/alert/embeddedobject/Click() if(isliving(usr)) var/mob/living/carbon/M = usr return M.help_shake_act(M) -/obj/screen/alert/weightless +/atom/movable/screen/alert/weightless name = "Weightless" desc = "Gravity has ceased affecting you, and you're floating around aimlessly. You'll need something large and heavy, like a \ wall or lattice, to push yourself off if you want to move. A jetpack would enable free range of motion. A pair of \ @@ -283,22 +283,22 @@ magboots would let you walk around normally on the floor. Barring those, you can or shoot a gun to move around via Newton's 3rd Law of Motion." icon_state = "weightless" -/obj/screen/alert/highgravity +/atom/movable/screen/alert/highgravity name = "High Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed." icon_state = "paralysis" -/obj/screen/alert/veryhighgravity +/atom/movable/screen/alert/veryhighgravity name = "Crushing Gravity" desc = "You're getting crushed by high gravity, picking up items and movement will be slowed. You'll also accumulate brute damage!" icon_state = "paralysis" -/obj/screen/alert/fire +/atom/movable/screen/alert/fire name = "On Fire" desc = "You're on fire. Stop, drop and roll to put the fire out or move to a vacuum area." icon_state = "fire" -/obj/screen/alert/fire/Click() +/atom/movable/screen/alert/fire/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return @@ -306,7 +306,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." if(CHECK_MOBILITY(L, MOBILITY_MOVE)) return L.resist_fire() //I just want to start a flame in your hearrrrrrtttttt. -/obj/screen/alert/give // information set when the give alert is made +/atom/movable/screen/alert/give // information set when the give alert is made icon_state = "default" var/mob/living/carbon/giver var/obj/item/receiving @@ -321,7 +321,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." * * giver - The person giving the alert and item * * receiving - The item being given by the giver */ -/obj/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) +/atom/movable/screen/alert/give/proc/setup(mob/living/carbon/taker, mob/living/carbon/giver, obj/item/receiving) name = "[giver] is offering [receiving]" desc = "[giver] is offering [receiving]. Click this alert to take it." icon_state = "template" @@ -331,31 +331,31 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." src.giver = giver RegisterSignal(taker, COMSIG_MOVABLE_MOVED, .proc/removeAlert) -/obj/screen/alert/give/proc/removeAlert() +/atom/movable/screen/alert/give/proc/removeAlert() to_chat(usr, "You moved out of range of [giver]!") usr.clear_alert("[giver]") -/obj/screen/alert/give/Click(location, control, params) +/atom/movable/screen/alert/give/Click(location, control, params) . = ..() var/mob/living/carbon/C = usr C.take(giver, receiving) //ALIENS -/obj/screen/alert/alien_tox +/atom/movable/screen/alert/alien_tox name = "Plasma" desc = "There's flammable plasma in the air. If it lights up, you'll be toast." icon_state = "alien_tox" alerttooltipstyle = "alien" -/obj/screen/alert/alien_fire +/atom/movable/screen/alert/alien_fire // This alert is temporarily gonna be thrown for all hot air but one day it will be used for literally being on fire name = "Too Hot" desc = "It's too hot! Flee to space or at least away from the flames. Standing on weeds will heal you." icon_state = "alien_fire" alerttooltipstyle = "alien" -/obj/screen/alert/alien_vulnerable +/atom/movable/screen/alert/alien_vulnerable name = "Severed Matriarchy" desc = "Your queen has been killed, you will suffer movement penalties and loss of hivemind. A new queen cannot be made until you recover." icon_state = "alien_noqueen" @@ -363,7 +363,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //BLOBS -/obj/screen/alert/nofactory +/atom/movable/screen/alert/nofactory name = "No Factory" desc = "You have no factory, and are slowly dying!" icon_state = "blobbernaut_nofactory" @@ -371,7 +371,7 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // BLOODCULT -/obj/screen/alert/bloodsense +/atom/movable/screen/alert/bloodsense name = "Blood Sense" desc = "Allows you to sense blood that is manipulated by dark magicks." icon_state = "cult_sense" @@ -380,17 +380,17 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." var/angle = 0 var/mob/living/simple_animal/hostile/construct/Cviewer = null -/obj/screen/alert/bloodsense/Initialize() +/atom/movable/screen/alert/bloodsense/Initialize() . = ..() narnar = new('icons/mob/screen_alert.dmi', "mini_nar") START_PROCESSING(SSprocessing, src) -/obj/screen/alert/bloodsense/Destroy() +/atom/movable/screen/alert/bloodsense/Destroy() Cviewer = null STOP_PROCESSING(SSprocessing, src) return ..() -/obj/screen/alert/bloodsense/process() +/atom/movable/screen/alert/bloodsense/process() var/atom/blood_target if(!mob_viewer.mind) @@ -480,15 +480,15 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." // CLOCKCULT -/obj/screen/alert/clockwork +/atom/movable/screen/alert/clockwork alerttooltipstyle = "clockcult" -/obj/screen/alert/clockwork/infodump +/atom/movable/screen/alert/clockwork/infodump name = "Global Records" desc = "You shouldn't be seeing this description, because it should be dynamically generated." icon_state = "clockinfo" -/obj/screen/alert/clockwork/infodump/MouseEntered(location,control,params) +/atom/movable/screen/alert/clockwork/infodump/MouseEntered(location,control,params) if(GLOB.ratvar_awakens) desc = "CHETR
NYY
HAGEHUGF-NAQ-UBABE
RATVAR.
" else @@ -520,19 +520,19 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //GUARDIANS -/obj/screen/alert/cancharge +/atom/movable/screen/alert/cancharge name = "Charge Ready" desc = "You are ready to charge at a location!" icon_state = "guardian_charge" alerttooltipstyle = "parasite" -/obj/screen/alert/canstealth +/atom/movable/screen/alert/canstealth name = "Stealth Ready" desc = "You are ready to enter stealth!" icon_state = "guardian_canstealth" alerttooltipstyle = "parasite" -/obj/screen/alert/instealth +/atom/movable/screen/alert/instealth name = "In Stealth" desc = "You are in stealth and your next attack will do bonus damage!" icon_state = "guardian_instealth" @@ -540,52 +540,52 @@ or shoot a gun to move around via Newton's 3rd Law of Motion." //SILICONS -/obj/screen/alert/nocell +/atom/movable/screen/alert/nocell name = "Missing Power Cell" desc = "Unit has no power cell. No modules available until a power cell is reinstalled. Robotics may provide assistance." icon_state = "nocell" -/obj/screen/alert/emptycell +/atom/movable/screen/alert/emptycell name = "Out of Power" desc = "Unit's power cell has no charge remaining. No modules available until power cell is recharged. \ Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "emptycell" -/obj/screen/alert/lowcell +/atom/movable/screen/alert/lowcell name = "Low Charge" desc = "Unit's power cell is running low. Recharging stations are available in robotics, the dormitory bathrooms, and the AI satellite." icon_state = "lowcell" -/obj/screen/alert/etherealcharge +/atom/movable/screen/alert/etherealcharge name = "Low Blood Charge" desc = "Your blood's electric charge is running low, find a source of charge for your blood. Use a recharging station found in robotics or the dormitory bathrooms, or eat some Ethereal-friendly food." icon_state = "etherealcharge" -/obj/screen/alert/ethereal_overcharge +/atom/movable/screen/alert/ethereal_overcharge name = "Blood Overcharge" desc = "Your blood's electric charge is becoming dangerously high, find an outlet for your energy. Use Grab Intent on an APC to channel your energy into it." icon_state = "ethereal_overcharge" //Need to cover all use cases - emag, illegal upgrade module, malf AI hack, traitor cyborg -/obj/screen/alert/hacked +/atom/movable/screen/alert/hacked name = "Hacked" desc = "Hazardous non-standard equipment detected. Please ensure any usage of this equipment is in line with unit's laws, if any." icon_state = "hacked" -/obj/screen/alert/locked +/atom/movable/screen/alert/locked name = "Locked Down" desc = "Unit has been remotely locked down. Usage of a Robotics Control Console like the one in the Research Director's \ office by your AI master or any qualified human may resolve this matter. Robotics may provide further assistance if necessary." icon_state = "locked" -/obj/screen/alert/newlaw +/atom/movable/screen/alert/newlaw name = "Law Update" desc = "Laws have potentially been uploaded to or removed from this unit. Please be aware of any changes \ so as to remain in compliance with the most up-to-date laws." icon_state = "newlaw" timeout = 300 -/obj/screen/alert/hackingapc +/atom/movable/screen/alert/hackingapc name = "Hacking APC" desc = "An Area Power Controller is being hacked. When the process is \ complete, you will have exclusive control of it, and you will gain \ @@ -594,7 +594,7 @@ so as to remain in compliance with the most up-to-date laws." timeout = 600 var/atom/target = null -/obj/screen/alert/hackingapc/Click() +/atom/movable/screen/alert/hackingapc/Click() if(!usr || !usr.client) return if(!target) @@ -606,7 +606,7 @@ so as to remain in compliance with the most up-to-date laws." //MECHS -/obj/screen/alert/low_mech_integrity +/atom/movable/screen/alert/low_mech_integrity name = "Mech Damaged" desc = "Mech integrity is low." icon_state = "low_mech_integrity" @@ -614,19 +614,19 @@ so as to remain in compliance with the most up-to-date laws." //GHOSTS //TODO: expand this system to replace the pollCandidates/CheckAntagonist/"choose quickly"/etc Yes/No messages -/obj/screen/alert/notify_cloning +/atom/movable/screen/alert/notify_cloning name = "Revival" desc = "Someone is trying to revive you. Re-enter your corpse if you want to be revived!" icon_state = "template" timeout = 300 -/obj/screen/alert/notify_cloning/Click() +/atom/movable/screen/alert/notify_cloning/Click() if(!usr || !usr.client) return var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/alert/notify_action +/atom/movable/screen/alert/notify_action name = "Body created" desc = "A body was created. You can enter it." icon_state = "template" @@ -634,7 +634,7 @@ so as to remain in compliance with the most up-to-date laws." var/atom/target = null var/action = NOTIFY_JUMP -/obj/screen/alert/notify_action/Click() +/atom/movable/screen/alert/notify_action/Click() if(!usr || !usr.client) return if(!target) @@ -654,44 +654,44 @@ so as to remain in compliance with the most up-to-date laws." //OBJECT-BASED -/obj/screen/alert/restrained/buckled +/atom/movable/screen/alert/restrained/buckled name = "Buckled" desc = "You've been buckled to something. Click the alert to unbuckle unless you're handcuffed." icon_state = "buckled" -/obj/screen/alert/restrained/handcuffed +/atom/movable/screen/alert/restrained/handcuffed name = "Handcuffed" desc = "You're handcuffed and can't act. If anyone drags you, you won't be able to move. Click the alert to free yourself." -/obj/screen/alert/restrained/legcuffed +/atom/movable/screen/alert/restrained/legcuffed name = "Legcuffed" desc = "You're legcuffed, which slows you down considerably. Click the alert to free yourself." -/obj/screen/alert/restrained/Click() +/atom/movable/screen/alert/restrained/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return L.MarkResistTime() return L.resist_restraints() -/obj/screen/alert/restrained/buckled/Click() +/atom/movable/screen/alert/restrained/buckled/Click() var/mob/living/L = usr if(!istype(L) || !L.can_resist()) return L.MarkResistTime() return L.resist_buckle() -/obj/screen/alert/shoes/untied +/atom/movable/screen/alert/shoes/untied name = "Untied Shoes" desc = "Your shoes are untied! Click the alert or your shoes to tie them." icon_state = "shoealert" -/obj/screen/alert/shoes/knotted +/atom/movable/screen/alert/shoes/knotted name = "Knotted Shoes" desc = "Someone tied your shoelaces together! Click the alert or your shoes to undo the knot." icon_state = "shoealert" -/obj/screen/alert/shoes/Click() +/atom/movable/screen/alert/shoes/Click() var/mob/living/carbon/C = usr if(!istype(C) || !C.can_resist() || C != mob_viewer || !C.shoes) return @@ -708,7 +708,7 @@ so as to remain in compliance with the most up-to-date laws." mymob.client.screen -= alerts[alerts[i]] return 1 for(var/i = 1, i <= alerts.len, i++) - var/obj/screen/alert/alert = alerts[alerts[i]] + var/atom/movable/screen/alert/alert = alerts[alerts[i]] if(alert.icon_state == "template") alert.icon = ui_style switch(i) @@ -728,7 +728,7 @@ so as to remain in compliance with the most up-to-date laws." mymob.client.screen |= alert return 1 -/obj/screen/alert/Click(location, control, params) +/atom/movable/screen/alert/Click(location, control, params) if(!usr || !usr.client) return var/paramslist = params2list(params) @@ -738,7 +738,7 @@ so as to remain in compliance with the most up-to-date laws." if(master) return usr.client.Click(master, location, control, params) -/obj/screen/alert/Destroy() +/atom/movable/screen/alert/Destroy() . = ..() severity = 0 master = null diff --git a/code/_onclick/hud/alien.dm b/code/_onclick/hud/alien.dm index 94585cbd52..bf7969a6ba 100644 --- a/code/_onclick/hud/alien.dm +++ b/code/_onclick/hud/alien.dm @@ -1,23 +1,23 @@ -/obj/screen/alien +/atom/movable/screen/alien icon = 'icons/mob/screen_alien.dmi' -/obj/screen/alien/leap +/atom/movable/screen/alien/leap name = "toggle leap" icon_state = "leap_off" -/obj/screen/alien/leap/Click() +/atom/movable/screen/alien/leap/Click() if(isalienhunter(usr)) var/mob/living/carbon/alien/humanoid/hunter/AH = usr AH.toggle_leap() -/obj/screen/alien/plasma_display +/atom/movable/screen/alien/plasma_display icon = 'icons/mob/screen_gen.dmi' icon_state = "power_display2" name = "plasma stored" screen_loc = ui_alienplasmadisplay -/obj/screen/alien/alien_queen_finder +/atom/movable/screen/alien/alien_queen_finder icon = 'icons/mob/screen_alien.dmi' icon_state = "queen_finder" name = "queen sense" @@ -30,7 +30,7 @@ /datum/hud/alien/New(mob/living/carbon/alien/humanoid/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using //equippable shit @@ -39,55 +39,55 @@ //begin buttons - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - action_intent = new /obj/screen/act_intent/alien() + action_intent = new /atom/movable/screen/act_intent/alien() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent if(isalienhunter(mymob)) var/mob/living/carbon/alien/humanoid/hunter/H = mymob - H.leap_icon = new /obj/screen/alien/leap() + H.leap_icon = new /atom/movable/screen/alien/leap() H.leap_icon.screen_loc = ui_alien_storage_r static_inventory += H.leap_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src hotkeybuttons += using - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -96,25 +96,25 @@ //begin indicators - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_plasma_display = new /obj/screen/alien/plasma_display() + alien_plasma_display = new /atom/movable/screen/alien/plasma_display() alien_plasma_display.hud = src infodisplay += alien_plasma_display if(!isalienqueen(mymob)) - alien_queen_finder = new /obj/screen/alien/alien_queen_finder + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder alien_queen_finder.hud = src infodisplay += alien_queen_finder - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/alien_larva.dm b/code/_onclick/hud/alien_larva.dm index 0f3c6ccf17..17d3ad35e4 100644 --- a/code/_onclick/hud/alien_larva.dm +++ b/code/_onclick/hud/alien_larva.dm @@ -3,34 +3,34 @@ /datum/hud/larva/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - action_intent = new /obj/screen/act_intent/alien() + action_intent = new /atom/movable/screen/act_intent/alien() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - healths = new /obj/screen/healths/alien() + healths = new /atom/movable/screen/healths/alien() healths.hud = src infodisplay += healths - alien_queen_finder = new /obj/screen/alien/alien_queen_finder() + alien_queen_finder = new /atom/movable/screen/alien/alien_queen_finder() alien_queen_finder.hud = src infodisplay += alien_queen_finder - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_alien.dmi' pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist hotkeybuttons += pull_icon - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_alien_language_menu using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel/alien() + zone_select = new /atom/movable/screen/zone_sel/alien() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select diff --git a/code/_onclick/hud/blob_overmind.dm b/code/_onclick/hud/blob_overmind.dm index b9118da5f1..f4d6ffc919 100644 --- a/code/_onclick/hud/blob_overmind.dm +++ b/code/_onclick/hud/blob_overmind.dm @@ -1,39 +1,39 @@ -/obj/screen/blob +/atom/movable/screen/blob icon = 'icons/mob/blob.dmi' -/obj/screen/blob/MouseEntered(location,control,params) +/atom/movable/screen/blob/MouseEntered(location,control,params) openToolTip(usr,src,params,title = name,content = desc, theme = "blob") -/obj/screen/blob/MouseExited() +/atom/movable/screen/blob/MouseExited() closeToolTip(usr) -/obj/screen/blob/BlobHelp +/atom/movable/screen/blob/BlobHelp icon_state = "ui_help" name = "Blob Help" desc = "Help on playing blob!" -/obj/screen/blob/BlobHelp/Click() +/atom/movable/screen/blob/BlobHelp/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.blob_help() -/obj/screen/blob/JumpToNode +/atom/movable/screen/blob/JumpToNode icon_state = "ui_tonode" name = "Jump to Node" desc = "Moves your camera to a selected blob node." -/obj/screen/blob/JumpToNode/Click() +/atom/movable/screen/blob/JumpToNode/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.jump_to_node() -/obj/screen/blob/JumpToCore +/atom/movable/screen/blob/JumpToCore icon_state = "ui_tocore" name = "Jump to Core" desc = "Moves your camera to your blob core." -/obj/screen/blob/JumpToCore/MouseEntered(location,control,params) +/atom/movable/screen/blob/JumpToCore/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(!B.placed) @@ -44,59 +44,59 @@ desc = initial(desc) ..() -/obj/screen/blob/JumpToCore/Click() +/atom/movable/screen/blob/JumpToCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr if(!B.placed) B.place_blob_core(0) B.transport_core() -/obj/screen/blob/Blobbernaut +/atom/movable/screen/blob/Blobbernaut icon_state = "ui_blobbernaut" name = "Produce Blobbernaut (40)" desc = "Produces a strong, smart blobbernaut from a factory blob for 40 resources.
The factory blob used will become fragile and unable to produce spores." -/obj/screen/blob/Blobbernaut/Click() +/atom/movable/screen/blob/Blobbernaut/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_blobbernaut() -/obj/screen/blob/ResourceBlob +/atom/movable/screen/blob/ResourceBlob icon_state = "ui_resource" name = "Produce Resource Blob (40)" desc = "Produces a resource blob for 40 resources.
Resource blobs will give you resources every few seconds." -/obj/screen/blob/ResourceBlob/Click() +/atom/movable/screen/blob/ResourceBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_resource() -/obj/screen/blob/NodeBlob +/atom/movable/screen/blob/NodeBlob icon_state = "ui_node" name = "Produce Node Blob (50)" desc = "Produces a node blob for 50 resources.
Node blobs will expand and activate nearby resource and factory blobs." -/obj/screen/blob/NodeBlob/Click() +/atom/movable/screen/blob/NodeBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_node() -/obj/screen/blob/FactoryBlob +/atom/movable/screen/blob/FactoryBlob icon_state = "ui_factory" name = "Produce Factory Blob (60)" desc = "Produces a factory blob for 60 resources.
Factory blobs will produce spores every few seconds." -/obj/screen/blob/FactoryBlob/Click() +/atom/movable/screen/blob/FactoryBlob/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.create_factory() -/obj/screen/blob/ReadaptStrain +/atom/movable/screen/blob/ReadaptStrain icon_state = "ui_chemswap" name = "Readapt Strain (40)" desc = "Allows you to choose a new strain from 4 random choices for 40 resources." -/obj/screen/blob/ReadaptStrain/MouseEntered(location,control,params) +/atom/movable/screen/blob/ReadaptStrain/MouseEntered(location,control,params) if(hud && hud.mymob && isovermind(hud.mymob)) var/mob/camera/blob/B = hud.mymob if(B.free_strain_rerolls) @@ -107,26 +107,26 @@ desc = initial(desc) ..() -/obj/screen/blob/ReadaptStrain/Click() +/atom/movable/screen/blob/ReadaptStrain/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.strain_reroll() -/obj/screen/blob/RelocateCore +/atom/movable/screen/blob/RelocateCore icon_state = "ui_swap" name = "Relocate Core (80)" desc = "Swaps a node and your core for 80 resources." -/obj/screen/blob/RelocateCore/Click() +/atom/movable/screen/blob/RelocateCore/Click() if(isovermind(usr)) var/mob/camera/blob/B = usr B.relocate_core() /datum/hud/blob_overmind/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - blobpwrdisplay = new /obj/screen() + blobpwrdisplay = new /atom/movable/screen() blobpwrdisplay.name = "blob power" blobpwrdisplay.icon_state = "block" blobpwrdisplay.screen_loc = ui_health @@ -136,51 +136,51 @@ blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob() + healths = new /atom/movable/screen/healths/blob() healths.hud = src infodisplay += healths - using = new /obj/screen/blob/BlobHelp() + using = new /atom/movable/screen/blob/BlobHelp() using.screen_loc = "WEST:6,NORTH:-3" using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToNode() + using = new /atom/movable/screen/blob/JumpToNode() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/blob/JumpToCore() + using = new /atom/movable/screen/blob/JumpToCore() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/blob/Blobbernaut() + using = new /atom/movable/screen/blob/Blobbernaut() using.screen_loc = ui_belt using.hud = src static_inventory += using - using = new /obj/screen/blob/ResourceBlob() + using = new /atom/movable/screen/blob/ResourceBlob() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/blob/NodeBlob() + using = new /atom/movable/screen/blob/NodeBlob() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/blob/FactoryBlob() + using = new /atom/movable/screen/blob/FactoryBlob() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/blob/ReadaptStrain() + using = new /atom/movable/screen/blob/ReadaptStrain() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/blob/RelocateCore() + using = new /atom/movable/screen/blob/RelocateCore() using.screen_loc = ui_storage2 using.hud = src static_inventory += using diff --git a/code/_onclick/hud/blobbernauthud.dm b/code/_onclick/hud/blobbernauthud.dm index ed45d5b1f6..430e8e81e7 100644 --- a/code/_onclick/hud/blobbernauthud.dm +++ b/code/_onclick/hud/blobbernauthud.dm @@ -2,10 +2,10 @@ /datum/hud/blobbernaut/New(mob/owner) ..() - blobpwrdisplay = new /obj/screen/healths/blob/naut/core() + blobpwrdisplay = new /atom/movable/screen/healths/blob/naut/core() blobpwrdisplay.hud = src infodisplay += blobpwrdisplay - healths = new /obj/screen/healths/blob/naut() + healths = new /atom/movable/screen/healths/blob/naut() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/clockwork_marauder.dm b/code/_onclick/hud/clockwork_marauder.dm index b1b24cc58b..de9cb65c75 100644 --- a/code/_onclick/hud/clockwork_marauder.dm +++ b/code/_onclick/hud/clockwork_marauder.dm @@ -1,20 +1,20 @@ /datum/hud/marauder - var/obj/screen/hosthealth - var/obj/screen/blockchance - var/obj/screen/counterchance + var/atom/movable/screen/hosthealth + var/atom/movable/screen/blockchance + var/atom/movable/screen/counterchance /datum/hud/marauder/New(mob/living/simple_animal/hostile/clockwork/guardian/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - healths = new /obj/screen/healths/clock() + healths = new /atom/movable/screen/healths/clock() infodisplay += healths - hosthealth = new /obj/screen/healths/clock() + hosthealth = new /atom/movable/screen/healths/clock() hosthealth.screen_loc = ui_internal infodisplay += hosthealth - using = new /obj/screen/marauder/emerge() + using = new /atom/movable/screen/marauder/emerge() using.screen_loc = ui_zonesel static_inventory += using @@ -28,15 +28,15 @@ if(client && !hud_used) hud_used = new /datum/hud/marauder(src, ui_style2icon(client.prefs.UI_style)) -/obj/screen/marauder +/atom/movable/screen/marauder icon = 'icons/mob/clockwork_mobs.dmi' -/obj/screen/marauder/emerge +/atom/movable/screen/marauder/emerge icon_state = "clockguard_emerge" name = "Emerge/Return" desc = "Emerge or Return." -/obj/screen/marauder/emerge/Click() +/atom/movable/screen/marauder/emerge/Click() if(istype(usr, /mob/living/simple_animal/hostile/clockwork/guardian)) var/mob/living/simple_animal/hostile/clockwork/guardian/G = usr if(G.is_in_host()) diff --git a/code/_onclick/hud/constructs.dm b/code/_onclick/hud/constructs.dm index 06e657d136..31f1060f17 100644 --- a/code/_onclick/hud/constructs.dm +++ b/code/_onclick/hud/constructs.dm @@ -3,13 +3,13 @@ /datum/hud/constructs/New(mob/owner) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_construct_pull static_inventory += pull_icon - healths = new /obj/screen/healths/construct() + healths = new /atom/movable/screen/healths/construct() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/credits.dm b/code/_onclick/hud/credits.dm index 31ea453d4a..974f158323 100644 --- a/code/_onclick/hud/credits.dm +++ b/code/_onclick/hud/credits.dm @@ -18,7 +18,7 @@ for(var/I in credit_order_for_this_round) if(!credits) return - _credits += new /obj/screen/credit(null, I, src, credits_icon) + _credits += new /atom/movable/screen/credit(null, I, src, credits_icon) sleep(CREDIT_SPAWN_SPEED) sleep(CREDIT_ROLL_SPEED - CREDIT_SPAWN_SPEED) remove_verb(src, /client/proc/ClearCredits) @@ -31,7 +31,7 @@ QDEL_LIST(credits) credits = null -/obj/screen/credit +/atom/movable/screen/credit mouse_opacity = MOUSE_OPACITY_TRANSPARENT alpha = 0 screen_loc = "12,1" @@ -39,7 +39,7 @@ var/client/parent var/matrix/target -/obj/screen/credit/Initialize(mapload, credited, client/P, icon/I) +/atom/movable/screen/credit/Initialize(mapload, credited, client/P, icon/I) . = ..() icon = I parent = P @@ -57,7 +57,7 @@ QDEL_IN(src, CREDIT_ROLL_SPEED) P.screen += src -/obj/screen/credit/Destroy() +/atom/movable/screen/credit/Destroy() var/client/P = parent P.screen -= src icon = null @@ -65,5 +65,5 @@ parent = null return ..() -/obj/screen/credit/proc/FadeOut() +/atom/movable/screen/credit/proc/FadeOut() animate(src, alpha = 0, transform = target, time = CREDIT_EASE_DURATION) diff --git a/code/_onclick/hud/devil.dm b/code/_onclick/hud/devil.dm index fd2146424c..574f5dd1fd 100644 --- a/code/_onclick/hud/devil.dm +++ b/code/_onclick/hud/devil.dm @@ -4,15 +4,15 @@ /datum/hud/devil/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -21,7 +21,7 @@ build_hand_slots() - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_1_m" @@ -31,7 +31,7 @@ using.hud = src static_inventory += using - using = new /obj/screen/inventory() + using = new /atom/movable/screen/inventory() using.name = "hand" using.icon = ui_style using.icon_state = "swap_2" @@ -41,15 +41,15 @@ using.hud = src static_inventory += using - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay diff --git a/code/_onclick/hud/drones.dm b/code/_onclick/hud/drones.dm index bcdfa084d3..849936d4ed 100644 --- a/code/_onclick/hud/drones.dm +++ b/code/_onclick/hud/drones.dm @@ -1,8 +1,8 @@ /datum/hud/dextrous/drone/New(mob/owner) ..() - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -11,7 +11,7 @@ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head/mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -20,7 +20,7 @@ inv_box.slot_id = SLOT_HEAD static_inventory += inv_box - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/fullscreen.dm b/code/_onclick/hud/fullscreen.dm index 076c949f8e..a7247ccf09 100644 --- a/code/_onclick/hud/fullscreen.dm +++ b/code/_onclick/hud/fullscreen.dm @@ -1,5 +1,5 @@ /mob/proc/overlay_fullscreen(category, type, severity) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if (!screen || screen.type != type) // needs to be recreated clear_fullscreen(category, FALSE) @@ -17,7 +17,7 @@ return screen /mob/proc/clear_fullscreen(category, animated = 10) - var/obj/screen/fullscreen/screen = screens[category] + var/atom/movable/screen/fullscreen/screen = screens[category] if(!screen) return @@ -31,7 +31,7 @@ client.screen -= screen qdel(screen) -/mob/proc/clear_fullscreen_after_animate(obj/screen/fullscreen/screen) +/mob/proc/clear_fullscreen_after_animate(atom/movable/screen/fullscreen/screen) if(client) client.screen -= screen qdel(screen) @@ -47,7 +47,7 @@ /mob/proc/reload_fullscreen() if(client) - var/obj/screen/fullscreen/screen + var/atom/movable/screen/fullscreen/screen for(var/category in screens) screen = screens[category] if(screen.should_show_to(src)) @@ -56,7 +56,7 @@ else client.screen -= screen -/obj/screen/fullscreen +/atom/movable/screen/fullscreen icon = 'icons/mob/screen_full.dmi' icon_state = "default" screen_loc = "CENTER-7,CENTER-7" @@ -67,89 +67,89 @@ var/severity = 0 var/show_when_dead = FALSE -/obj/screen/fullscreen/proc/update_for_view(client_view) +/atom/movable/screen/fullscreen/proc/update_for_view(client_view) if (screen_loc == "CENTER-7,CENTER-7" && view != client_view) var/list/actualview = getviewsize(client_view) view = client_view transform = matrix(actualview[1]/FULLSCREEN_OVERLAY_RESOLUTION_X, 0, 0, 0, actualview[2]/FULLSCREEN_OVERLAY_RESOLUTION_Y, 0) -/obj/screen/fullscreen/proc/should_show_to(mob/mymob) +/atom/movable/screen/fullscreen/proc/should_show_to(mob/mymob) if(!show_when_dead && mymob.stat == DEAD) return FALSE return TRUE -/obj/screen/fullscreen/Destroy() +/atom/movable/screen/fullscreen/Destroy() severity = 0 . = ..() -/obj/screen/fullscreen/brute +/atom/movable/screen/fullscreen/brute icon_state = "brutedamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/oxy +/atom/movable/screen/fullscreen/oxy icon_state = "oxydamageoverlay" layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit +/atom/movable/screen/fullscreen/crit icon_state = "passage" layer = CRIT_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/crit/vision +/atom/movable/screen/fullscreen/crit/vision icon_state = "oxydamageoverlay" layer = BLIND_LAYER -/obj/screen/fullscreen/blind +/atom/movable/screen/fullscreen/blind icon_state = "blackimageoverlay" layer = BLIND_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/curse +/atom/movable/screen/fullscreen/curse icon_state = "curse" layer = CURSE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/fullscreen/impaired +/atom/movable/screen/fullscreen/impaired icon_state = "impairedoverlay" -/obj/screen/fullscreen/blurry +/atom/movable/screen/fullscreen/blurry icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "blurry" -/obj/screen/fullscreen/flash +/atom/movable/screen/fullscreen/flash icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" -/obj/screen/fullscreen/flash/static +/atom/movable/screen/fullscreen/flash/static icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "noise" -/obj/screen/fullscreen/high +/atom/movable/screen/fullscreen/high icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "druggy" -/obj/screen/fullscreen/color_vision +/atom/movable/screen/fullscreen/color_vision icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" alpha = 80 -/obj/screen/fullscreen/color_vision/green +/atom/movable/screen/fullscreen/color_vision/green color = "#00ff00" -/obj/screen/fullscreen/color_vision/red +/atom/movable/screen/fullscreen/color_vision/red color = "#ff0000" -/obj/screen/fullscreen/color_vision/blue +/atom/movable/screen/fullscreen/color_vision/blue color = "#0000ff" -/obj/screen/fullscreen/cinematic_backdrop +/atom/movable/screen/fullscreen/cinematic_backdrop icon = 'icons/mob/screen_gen.dmi' screen_loc = "WEST,SOUTH to EAST,NORTH" icon_state = "flash" @@ -158,7 +158,7 @@ color = "#000000" show_when_dead = TRUE -/obj/screen/fullscreen/lighting_backdrop +/atom/movable/screen/fullscreen/lighting_backdrop icon = 'icons/mob/screen_gen.dmi' icon_state = "flash" transform = matrix(200, 0, 0, 0, 200, 0) @@ -167,18 +167,18 @@ show_when_dead = TRUE //Provides darkness to the back of the lighting plane -/obj/screen/fullscreen/lighting_backdrop/lit +/atom/movable/screen/fullscreen/lighting_backdrop/lit invisibility = INVISIBILITY_LIGHTING layer = BACKGROUND_LAYER+21 color = "#000" show_when_dead = TRUE //Provides whiteness in case you don't see lights so everything is still visible -/obj/screen/fullscreen/lighting_backdrop/unlit +/atom/movable/screen/fullscreen/lighting_backdrop/unlit layer = BACKGROUND_LAYER+20 show_when_dead = TRUE -/obj/screen/fullscreen/see_through_darkness +/atom/movable/screen/fullscreen/see_through_darkness icon_state = "nightvision" plane = LIGHTING_PLANE layer = LIGHTING_LAYER diff --git a/code/_onclick/hud/generic_dextrous.dm b/code/_onclick/hud/generic_dextrous.dm index e9f325fb10..88407bb04c 100644 --- a/code/_onclick/hud/generic_dextrous.dm +++ b/code/_onclick/hud/generic_dextrous.dm @@ -1,15 +1,15 @@ //Used for normal mobs that have hands. /datum/hud/dextrous/New(mob/living/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drone_drop using.hud = src static_inventory += using - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() @@ -18,14 +18,14 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) @@ -35,29 +35,29 @@ if(mymob.possible_a_intents) if(mymob.possible_a_intents.len == 4) // All possible intents - full intent selector - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented else - action_intent = new /obj/screen/act_intent + action_intent = new /atom/movable/screen/act_intent action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style using.hud = src static_inventory += using mymob.client.screen = list() - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/ghost.dm b/code/_onclick/hud/ghost.dm index 0cdac111b0..b9514bff46 100644 --- a/code/_onclick/hud/ghost.dm +++ b/code/_onclick/hud/ghost.dm @@ -1,79 +1,79 @@ -/obj/screen/ghost +/atom/movable/screen/ghost icon = 'icons/mob/screen_ghost.dmi' -/obj/screen/ghost/MouseEntered() +/atom/movable/screen/ghost/MouseEntered() flick(icon_state + "_anim", src) -/obj/screen/ghost/jumptomob +/atom/movable/screen/ghost/jumptomob name = "Jump to mob" icon_state = "jumptomob" -/obj/screen/ghost/jumptomob/Click() +/atom/movable/screen/ghost/jumptomob/Click() var/mob/dead/observer/G = usr G.jumptomob() -/obj/screen/ghost/orbit +/atom/movable/screen/ghost/orbit name = "Orbit" icon_state = "orbit" -/obj/screen/ghost/orbit/Click() +/atom/movable/screen/ghost/orbit/Click() var/mob/dead/observer/G = usr G.follow() -/obj/screen/ghost/reenter_corpse +/atom/movable/screen/ghost/reenter_corpse name = "Reenter corpse" icon_state = "reenter_corpse" -/obj/screen/ghost/reenter_corpse/Click() +/atom/movable/screen/ghost/reenter_corpse/Click() var/mob/dead/observer/G = usr G.reenter_corpse() -/obj/screen/ghost/teleport +/atom/movable/screen/ghost/teleport name = "Teleport" icon_state = "teleport" -/obj/screen/ghost/teleport/Click() +/atom/movable/screen/ghost/teleport/Click() var/mob/dead/observer/G = usr G.dead_tele() -/obj/screen/ghost/spawners +/atom/movable/screen/ghost/spawners name = "Ghost role spawners" icon_state = "spawners" -/obj/screen/ghost/spawners/Click() +/atom/movable/screen/ghost/spawners/Click() var/mob/dead/observer/G = usr G.open_spawners_menu() /datum/hud/ghost/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/ghost/jumptomob() + using = new /atom/movable/screen/ghost/jumptomob() using.screen_loc = ui_ghost_jumptomob using.hud = src static_inventory += using - using = new /obj/screen/ghost/orbit() + using = new /atom/movable/screen/ghost/orbit() using.screen_loc = ui_ghost_orbit using.hud = src static_inventory += using - using = new /obj/screen/ghost/reenter_corpse() + using = new /atom/movable/screen/ghost/reenter_corpse() using.screen_loc = ui_ghost_reenter_corpse using.hud = src static_inventory += using - using = new /obj/screen/ghost/teleport() + using = new /atom/movable/screen/ghost/teleport() using.screen_loc = ui_ghost_teleport using.hud = src static_inventory += using - using = new /obj/screen/ghost/spawners() + using = new /atom/movable/screen/ghost/spawners() using.screen_loc = ui_ghost_spawners using.hud = src static_inventory += using - using = new /obj/screen/language_menu + using = new /atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using diff --git a/code/_onclick/hud/guardian.dm b/code/_onclick/hud/guardian.dm index 35b40ee5db..7f360b48dc 100644 --- a/code/_onclick/hud/guardian.dm +++ b/code/_onclick/hud/guardian.dm @@ -1,18 +1,18 @@ /datum/hud/guardian/New(mob/living/simple_animal/hostile/guardian/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() healths.hud = src infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using @@ -22,23 +22,23 @@ using.hud = src static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_back using.hud = src static_inventory += using /datum/hud/dextrous/guardian/New(mob/living/simple_animal/hostile/guardian/owner) //for a dextrous guardian ..() - var/obj/screen/using + var/atom/movable/screen/using if(istype(owner, /mob/living/simple_animal/hostile/guardian/dextrous)) - var/obj/screen/inventory/inv_box + var/atom/movable/screen/inventory/inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "internal storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -46,24 +46,24 @@ inv_box.slot_id = SLOT_GENERC_DEXTROUS_STORAGE static_inventory += inv_box - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_sstore1 static_inventory += using else - using = new /obj/screen/guardian/Communicate() + using = new /atom/movable/screen/guardian/Communicate() using.screen_loc = ui_id static_inventory += using - healths = new /obj/screen/healths/guardian() + healths = new /atom/movable/screen/healths/guardian() infodisplay += healths - using = new /obj/screen/guardian/Manifest() + using = new /atom/movable/screen/guardian/Manifest() using.screen_loc = ui_belt static_inventory += using - using = new /obj/screen/guardian/Recall() + using = new /atom/movable/screen/guardian/Recall() using.screen_loc = ui_back static_inventory += using @@ -71,7 +71,7 @@ using.screen_loc = ui_storage2 static_inventory += using - using = new /obj/screen/guardian/ToggleLight() + using = new /atom/movable/screen/guardian/ToggleLight() using.screen_loc = ui_inventory static_inventory += using @@ -91,65 +91,65 @@ ..() -/obj/screen/guardian +/atom/movable/screen/guardian icon = 'icons/mob/guardian.dmi' -/obj/screen/guardian/Manifest +/atom/movable/screen/guardian/Manifest icon_state = "manifest" name = "Manifest" desc = "Spring forth into battle!" -/obj/screen/guardian/Manifest/Click() +/atom/movable/screen/guardian/Manifest/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Manifest() -/obj/screen/guardian/Recall +/atom/movable/screen/guardian/Recall icon_state = "recall" name = "Recall" desc = "Return to your user." -/obj/screen/guardian/Recall/Click() +/atom/movable/screen/guardian/Recall/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Recall() -/obj/screen/guardian/ToggleMode +/atom/movable/screen/guardian/ToggleMode icon_state = "toggle" name = "Toggle Mode" desc = "Switch between ability modes." -/obj/screen/guardian/ToggleMode/Click() +/atom/movable/screen/guardian/ToggleMode/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleMode() -/obj/screen/guardian/ToggleMode/Inactive +/atom/movable/screen/guardian/ToggleMode/Inactive icon_state = "notoggle" //greyed out so it doesn't look like it'll work -/obj/screen/guardian/ToggleMode/Assassin +/atom/movable/screen/guardian/ToggleMode/Assassin icon_state = "stealth" name = "Toggle Stealth" desc = "Enter or exit stealth." -/obj/screen/guardian/Communicate +/atom/movable/screen/guardian/Communicate icon_state = "communicate" name = "Communicate" desc = "Communicate telepathically with your user." -/obj/screen/guardian/Communicate/Click() +/atom/movable/screen/guardian/Communicate/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.Communicate() -/obj/screen/guardian/ToggleLight +/atom/movable/screen/guardian/ToggleLight icon_state = "light" name = "Toggle Light" desc = "Glow like star dust." -/obj/screen/guardian/ToggleLight/Click() +/atom/movable/screen/guardian/ToggleLight/Click() if(isguardian(usr)) var/mob/living/simple_animal/hostile/guardian/G = usr G.ToggleLight() diff --git a/code/_onclick/hud/hud.dm b/code/_onclick/hud/hud.dm index 57335a966e..36a3cd1f1a 100644 --- a/code/_onclick/hud/hud.dm +++ b/code/_onclick/hud/hud.dm @@ -25,38 +25,38 @@ GLOBAL_LIST_INIT(available_ui_styles, list( var/inventory_shown = FALSE //Equipped item inventory var/hotkey_ui_hidden = FALSE //This is to hide the buttons that can be used via hotkeys. (hotkeybuttons list of buttons) - var/obj/screen/ling/chems/lingchemdisplay - var/obj/screen/ling/sting/lingstingdisplay + var/atom/movable/screen/ling/chems/lingchemdisplay + var/atom/movable/screen/ling/sting/lingstingdisplay - var/obj/screen/blobpwrdisplay + var/atom/movable/screen/blobpwrdisplay - var/obj/screen/alien_plasma_display - var/obj/screen/alien_queen_finder + var/atom/movable/screen/alien_plasma_display + var/atom/movable/screen/alien_queen_finder - var/obj/screen/devil/soul_counter/devilsouldisplay + var/atom/movable/screen/devil/soul_counter/devilsouldisplay - var/obj/screen/action_intent - var/obj/screen/zone_select - var/obj/screen/pull_icon - var/obj/screen/rest_icon - var/obj/screen/throw_icon - var/obj/screen/module_store_icon + var/atom/movable/screen/action_intent + var/atom/movable/screen/zone_select + var/atom/movable/screen/pull_icon + var/atom/movable/screen/rest_icon + var/atom/movable/screen/throw_icon + var/atom/movable/screen/module_store_icon var/list/static_inventory = list() //the screen objects which are static var/list/toggleable_inventory = list() //the screen objects which can be hidden - var/list/obj/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys + var/list/atom/movable/screen/hotkeybuttons = list() //the buttons that can be used via hotkeys var/list/infodisplay = list() //the screen objects that display mob info (health, alien plasma, etc...) var/list/screenoverlays = list() //the screen objects used as whole screen overlays (flash, damageoverlay, etc...) - var/list/inv_slots[SLOTS_AMT] // /obj/screen/inventory objects, ordered by their slot ID. - var/list/hand_slots // /obj/screen/inventory/hand objects, assoc list of "[held_index]" = object - var/list/obj/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object + var/list/inv_slots[SLOTS_AMT] // /atom/movable/screen/inventory objects, ordered by their slot ID. + var/list/hand_slots // /atom/movable/screen/inventory/hand objects, assoc list of "[held_index]" = object + var/list/atom/movable/screen/plane_master/plane_masters = list() // see "appearance_flags" in the ref, assoc list of "[plane]" = object - var/obj/screen/movable/action_button/hide_toggle/hide_actions_toggle + var/atom/movable/screen/movable/action_button/hide_toggle/hide_actions_toggle var/action_buttons_hidden = FALSE - var/obj/screen/healths - var/obj/screen/healthdoll - var/obj/screen/internals + var/atom/movable/screen/healths + var/atom/movable/screen/healthdoll + var/atom/movable/screen/internals // subtypes can override this to force a specific UI style var/ui_style @@ -75,8 +75,8 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_slots = list() - for(var/mytype in subtypesof(/obj/screen/plane_master)) - var/obj/screen/plane_master/instance = new mytype() + for(var/mytype in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/plane_master/instance = new mytype() plane_masters["[instance.plane]"] = instance instance.backdrop(mymob) @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( //These ones are a part of 'static_inventory', 'toggleable_inventory' or 'hotkeybuttons' but we want them to stay for(var/h in hand_slots) - var/obj/screen/hand = hand_slots[h] + var/atom/movable/screen/hand = hand_slots[h] if(hand) screenmob.client.screen += hand if(action_intent) @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(available_ui_styles, list( /datum/hud/proc/plane_masters_update() // Plane masters are always shown to OUR mob, never to observers for(var/thing in plane_masters) - var/obj/screen/plane_master/PM = plane_masters[thing] + var/atom/movable/screen/plane_master/PM = plane_masters[thing] PM.backdrop(mymob) mymob.client.screen += PM @@ -261,13 +261,13 @@ GLOBAL_LIST_INIT(available_ui_styles, list( //9/10 this is only called once per mob and only for 2 hands /datum/hud/proc/build_hand_slots() for(var/h in hand_slots) - var/obj/screen/inventory/hand/H = hand_slots[h] + var/atom/movable/screen/inventory/hand/H = hand_slots[h] if(H) static_inventory -= H hand_slots = list() - var/obj/screen/inventory/hand/hand_box + var/atom/movable/screen/inventory/hand/hand_box for(var/i in 1 to mymob.held_items.len) - hand_box = new /obj/screen/inventory/hand() + hand_box = new /atom/movable/screen/inventory/hand() hand_box.name = mymob.get_held_index_name(i) hand_box.icon = ui_style hand_box.icon_state = "hand_[mymob.held_index_to_dir(i)]" @@ -279,10 +279,10 @@ GLOBAL_LIST_INIT(available_ui_styles, list( hand_box.update_icon() var/i = 1 - for(var/obj/screen/swap_hand/SH in static_inventory) + for(var/atom/movable/screen/swap_hand/SH in static_inventory) SH.screen_loc = ui_swaphand_position(mymob,!(i % 2) ? 2: 1) i++ - for(var/obj/screen/human/equip/E in static_inventory) + for(var/atom/movable/screen/human/equip/E in static_inventory) E.screen_loc = ui_equip_position(mymob) if(ismob(mymob) && mymob.hud_used == src) diff --git a/code/_onclick/hud/human.dm b/code/_onclick/hud/human.dm index 841a3e8303..e4a9dc24e8 100644 --- a/code/_onclick/hud/human.dm +++ b/code/_onclick/hud/human.dm @@ -1,11 +1,11 @@ -/obj/screen/human +/atom/movable/screen/human icon = 'icons/mob/screen_midnight.dmi' -/obj/screen/human/toggle +/atom/movable/screen/human/toggle name = "toggle" icon_state = "toggle" -/obj/screen/human/toggle/Click() +/atom/movable/screen/human/toggle/Click() var/mob/targetmob = usr @@ -23,26 +23,26 @@ targetmob.hud_used.hidden_inventory_update(usr) -/obj/screen/human/equip +/atom/movable/screen/human/equip name = "equip" icon_state = "act_equip" -/obj/screen/human/equip/Click() +/atom/movable/screen/human/equip/Click() if(ismecha(usr.loc)) // stops inventory actions in a mech return 1 var/mob/living/carbon/human/H = usr H.quick_equip() -/obj/screen/devil +/atom/movable/screen/devil invisibility = INVISIBILITY_ABSTRACT -/obj/screen/devil/soul_counter +/atom/movable/screen/devil/soul_counter icon = 'icons/mob/screen_gen.dmi' name = "souls owned" icon_state = "Devil-6" screen_loc = ui_devilsouldisplay -/obj/screen/devil/soul_counter/proc/update_counter(souls = 0) +/atom/movable/screen/devil/soul_counter/proc/update_counter(souls = 0) invisibility = 0 maptext = "
[souls]
" switch(souls) @@ -59,53 +59,53 @@ else icon_state = "Devil-6" -/obj/screen/devil/soul_counter/proc/clear() +/atom/movable/screen/devil/soul_counter/proc/clear() invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling +/atom/movable/screen/ling invisibility = INVISIBILITY_ABSTRACT -/obj/screen/ling/sting +/atom/movable/screen/ling/sting name = "current sting" screen_loc = ui_lingstingdisplay -/obj/screen/ling/sting/Click() +/atom/movable/screen/ling/sting/Click() if(isobserver(usr)) return var/mob/living/carbon/U = usr U.unset_sting() -/obj/screen/ling/chems +/atom/movable/screen/ling/chems name = "chemical storage" icon_state = "power_display" screen_loc = ui_lingchemdisplay /datum/hud/human/New(mob/living/carbon/human/owner) ..() - owner.overlay_fullscreen("see_through_darkness", /obj/screen/fullscreen/see_through_darkness) + owner.overlay_fullscreen("see_through_darkness", /atom/movable/screen/fullscreen/see_through_darkness) var/widescreenlayout = FALSE //CIT CHANGE - adds support for different hud layouts depending on widescreen pref if(owner.client && owner.client.prefs && owner.client.prefs.widescreenpref) //CIT CHANGE - ditto widescreenlayout = TRUE // CIT CHANGE - ditto - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style if(!widescreenlayout) // CIT CHANGE using.screen_loc = ui_boxlang // CIT CHANGE using.hud = src static_inventory += using - using = new /obj/screen/area_creator + using = new /atom/movable/screen/area_creator using.icon = ui_style if(!widescreenlayout) // CIT CHANGE using.screen_loc = ui_boxarea // CIT CHANGE using.hud = src static_inventory += using - using = new /obj/screen/voretoggle() //We fancy Vore now + using = new /atom/movable/screen/voretoggle() //We fancy Vore now using.icon = tg_ui_icon_to_cit_ui(ui_style) using.screen_loc = ui_voremode if(!widescreenlayout) @@ -113,7 +113,7 @@ using.hud = src static_inventory += using - action_intent = new /obj/screen/act_intent/segmented + action_intent = new /atom/movable/screen/act_intent/segmented action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent @@ -132,13 +132,13 @@ resistdelay.screen_loc = ui_resistdelay static_inventory += resistdelay - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "i_clothing" inv_box.icon = ui_style inv_box.slot_id = SLOT_W_UNIFORM @@ -146,7 +146,7 @@ inv_box.screen_loc = ui_iclothing toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "o_clothing" inv_box.icon = ui_style inv_box.slot_id = SLOT_WEAR_SUIT @@ -156,21 +156,21 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1" using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "id" inv_box.icon = ui_style inv_box.icon_state = "id" @@ -178,7 +178,7 @@ inv_box.slot_id = SLOT_WEAR_ID static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -186,7 +186,7 @@ inv_box.slot_id = SLOT_WEAR_MASK toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" @@ -194,7 +194,7 @@ inv_box.slot_id = SLOT_NECK toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" @@ -202,7 +202,7 @@ inv_box.slot_id = SLOT_BACK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage1" inv_box.icon = ui_style inv_box.icon_state = "pocket" @@ -210,7 +210,7 @@ inv_box.slot_id = SLOT_L_STORE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "storage2" inv_box.icon = ui_style inv_box.icon_state = "pocket" @@ -218,7 +218,7 @@ inv_box.slot_id = SLOT_R_STORE static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "suit storage" inv_box.icon = ui_style inv_box.icon_state = "suit_storage" @@ -226,32 +226,32 @@ inv_box.slot_id = SLOT_S_STORE static_inventory += inv_box - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_overridden_resist // CIT CHANGE - changes this to overridden resist using.hud = src hotkeybuttons += using - using = new /obj/screen/rest() + using = new /atom/movable/screen/rest() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src static_inventory += using //END OF CIT CHANGES - using = new /obj/screen/human/toggle() + using = new /atom/movable/screen/human/toggle() using.icon = ui_style using.screen_loc = ui_inventory using.hud = src static_inventory += using - using = new /obj/screen/human/equip() + using = new /atom/movable/screen/human/equip() using.icon = ui_style using.screen_loc = ui_equip_position(mymob) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "gloves" inv_box.icon = ui_style inv_box.icon_state = "gloves" @@ -259,7 +259,7 @@ inv_box.slot_id = SLOT_GLOVES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "eyes" inv_box.icon = ui_style inv_box.icon_state = "glasses" @@ -267,7 +267,7 @@ inv_box.slot_id = SLOT_GLASSES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "ears" inv_box.icon = ui_style inv_box.icon_state = "ears" @@ -275,7 +275,7 @@ inv_box.slot_id = SLOT_EARS toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" @@ -283,7 +283,7 @@ inv_box.slot_id = SLOT_HEAD toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "shoes" inv_box.icon = ui_style inv_box.icon_state = "shoes" @@ -291,7 +291,7 @@ inv_box.slot_id = SLOT_SHOES toggleable_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "belt" inv_box.icon = ui_style inv_box.icon_state = "belt" @@ -300,72 +300,72 @@ inv_box.slot_id = SLOT_BELT static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - staminas = new /obj/screen/staminas() + staminas = new /atom/movable/screen/staminas() staminas.hud = src infodisplay += staminas if(!CONFIG_GET(flag/disable_stambuffer)) - staminabuffer = new /obj/screen/staminabuffer() + staminabuffer = new /atom/movable/screen/staminabuffer() staminabuffer.hud = src infodisplay += staminabuffer //END OF CIT CHANGES - healthdoll = new /obj/screen/healthdoll() + healthdoll = new /atom/movable/screen/healthdoll() healthdoll.hud = src infodisplay += healthdoll - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_pull_resist static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - devilsouldisplay = new /obj/screen/devil/soul_counter + devilsouldisplay = new /atom/movable/screen/devil/soul_counter devilsouldisplay.hud = src infodisplay += devilsouldisplay - blood_display = new /obj/screen/bloodsucker/blood_counter // Blood Volume + blood_display = new /atom/movable/screen/bloodsucker/blood_counter // Blood Volume blood_display.hud = src infodisplay += blood_display - vamprank_display = new /obj/screen/bloodsucker/rank_counter // Bloodsucker Rank + vamprank_display = new /atom/movable/screen/bloodsucker/rank_counter // Bloodsucker Rank vamprank_display.hud = src infodisplay += vamprank_display - sunlight_display = new /obj/screen/bloodsucker/sunlight_counter // Sunlight + sunlight_display = new /atom/movable/screen/bloodsucker/sunlight_counter // Sunlight sunlight_display.hud = src infodisplay += sunlight_display - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() static_inventory += zone_select - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv @@ -374,12 +374,12 @@ update_locked_slots() /datum/hud/human/proc/assert_move_intent_ui(mob/living/carbon/human/owner = mymob, on_new = FALSE) - var/obj/screen/using + var/atom/movable/screen/using // delete old ones - var/list/obj/screen/victims = list() - victims += locate(/obj/screen/mov_intent) in static_inventory - victims += locate(/obj/screen/sprintbutton) in static_inventory - victims += locate(/obj/screen/sprint_buffer) in static_inventory + var/list/atom/movable/screen/victims = list() + victims += locate(/atom/movable/screen/mov_intent) in static_inventory + victims += locate(/atom/movable/screen/sprintbutton) in static_inventory + victims += locate(/atom/movable/screen/sprint_buffer) in static_inventory if(victims) static_inventory -= victims if(mymob?.client) @@ -388,7 +388,7 @@ // make new ones // walk/run - using = new /obj/screen/mov_intent + using = new /atom/movable/screen/mov_intent using.icon = tg_ui_icon_to_cit_ui(ui_style) // CIT CHANGE - overrides mov intent icon using.screen_loc = ui_movi using.hud = src @@ -401,7 +401,7 @@ return // sprint button - using = new /obj/screen/sprintbutton + using = new /atom/movable/screen/sprintbutton using.icon = tg_ui_icon_to_cit_ui(ui_style) using.icon_state = ((owner.combat_flags & COMBAT_FLAG_SPRINT_ACTIVE) ? "act_sprint_on" : "act_sprint") using.screen_loc = ui_movi @@ -411,7 +411,7 @@ owner?.client?.screen += using // same as above but buffer. - sprint_buffer = new /obj/screen/sprint_buffer + sprint_buffer = new /atom/movable/screen/sprint_buffer sprint_buffer.screen_loc = ui_sprintbufferloc sprint_buffer.hud = src static_inventory += sprint_buffer @@ -425,7 +425,7 @@ if(!istype(H) || !H.dna.species) return var/datum/species/S = H.dna.species - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) if(inv.slot_id in S.no_equip) inv.alpha = 128 diff --git a/code/_onclick/hud/lavaland_elite.dm b/code/_onclick/hud/lavaland_elite.dm index a36d9a0f36..f3ca5fec32 100644 --- a/code/_onclick/hud/lavaland_elite.dm +++ b/code/_onclick/hud/lavaland_elite.dm @@ -4,13 +4,13 @@ /datum/hud/lavaland_elite/New(mob/living/simple_animal/hostile/asteroid/elite) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.hud = src pull_icon.update_icon() pull_icon.screen_loc = ui_living_pull static_inventory += pull_icon - healths = new /obj/screen/healths/lavaland_elite() + healths = new /atom/movable/screen/healths/lavaland_elite() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/map_popups.dm b/code/_onclick/hud/map_popups.dm index 2ecfe80ab5..7c40f654ff 100644 --- a/code/_onclick/hud/map_popups.dm +++ b/code/_onclick/hud/map_popups.dm @@ -2,7 +2,7 @@ * A screen object, which acts as a container for turfs and other things * you want to show on the map, which you usually attach to "vis_contents". */ -/obj/screen/map_view +/atom/movable/screen/map_view // Map view has to be on the lowest plane to enable proper lighting layer = GAME_PLANE plane = GAME_PLANE @@ -12,7 +12,7 @@ * It is also implicitly used to allocate a rectangle on the map, which will * be used for auto-scaling the map. */ -/obj/screen/background +/atom/movable/screen/background name = "background" icon = 'icons/mob/map_backgrounds.dmi' icon_state = "clear" @@ -25,7 +25,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/set_position(x, y, px = 0, py = 0) +/atom/movable/screen/proc/set_position(x, y, px = 0, py = 0) if(assigned_map) screen_loc = "[assigned_map]:[x]:[px],[y]:[py]" else @@ -36,7 +36,7 @@ * * If applicable, "assigned_map" has to be assigned before this proc call. */ -/obj/screen/proc/fill_rect(x1, y1, x2, y2) +/atom/movable/screen/proc/fill_rect(x1, y1, x2, y2) if(assigned_map) screen_loc = "[assigned_map]:[x1],[y1] to [x2],[y2]" else @@ -46,7 +46,7 @@ * Registers screen obj with the client, which makes it visible on the * assigned map, and becomes a part of the assigned map's lifecycle. */ -/client/proc/register_map_obj(obj/screen/screen_obj) +/client/proc/register_map_obj(atom/movable/screen/screen_obj) if(!screen_obj.assigned_map) CRASH("Can't register [screen_obj] without 'assigned_map' property.") if(!screen_maps[screen_obj.assigned_map]) @@ -68,7 +68,7 @@ /client/proc/clear_map(map_name) if(!map_name || !(map_name in screen_maps)) return FALSE - for(var/obj/screen/screen_obj in screen_maps[map_name]) + for(var/atom/movable/screen/screen_obj in screen_maps[map_name]) screen_maps[map_name] -= screen_obj if(screen_obj.del_on_map_removal) qdel(screen_obj) @@ -122,7 +122,7 @@ var/y_value = world.icon_size * tilesize * height var/map_name = create_popup(popup_name, x_value, y_value) - var/obj/screen/background/background = new + var/atom/movable/screen/background/background = new background.assigned_map = map_name background.fill_rect(1, 1, width, height) if(bg_icon) diff --git a/code/_onclick/hud/monkey.dm b/code/_onclick/hud/monkey.dm index d665330aac..376db7bf96 100644 --- a/code/_onclick/hud/monkey.dm +++ b/code/_onclick/hud/monkey.dm @@ -1,28 +1,28 @@ /datum/hud/monkey/New(mob/living/carbon/monkey/owner) ..() - var/obj/screen/using - var/obj/screen/inventory/inv_box + var/atom/movable/screen/using + var/atom/movable/screen/inventory/inv_box - action_intent = new /obj/screen/act_intent() + action_intent = new /atom/movable/screen/act_intent() action_intent.icon = ui_style action_intent.icon_state = mymob.a_intent action_intent.screen_loc = ui_acti action_intent.hud = src static_inventory += action_intent - using = new /obj/screen/mov_intent() + using = new /atom/movable/screen/mov_intent() using.icon = ui_style using.icon_state = (mymob.m_intent == MOVE_INTENT_RUN ? "running" : "walking") using.screen_loc = ui_movi using.hud = src static_inventory += using - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.icon = ui_style using.hud = src static_inventory += using - using = new /obj/screen/drop() + using = new /atom/movable/screen/drop() using.icon = ui_style using.screen_loc = ui_drop_throw using.hud = src @@ -30,21 +30,21 @@ build_hand_slots() - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_1_m" //extra wide! using.screen_loc = ui_swaphand_position(owner,1) using.hud = src static_inventory += using - using = new /obj/screen/swap_hand() + using = new /atom/movable/screen/swap_hand() using.icon = ui_style using.icon_state = "swap_2" using.screen_loc = ui_swaphand_position(owner,2) using.hud = src static_inventory += using - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "mask" inv_box.icon = ui_style inv_box.icon_state = "mask" @@ -53,7 +53,7 @@ inv_box.slot_id = SLOT_WEAR_MASK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "neck" inv_box.icon = ui_style inv_box.icon_state = "neck" @@ -62,7 +62,7 @@ inv_box.slot_id = SLOT_NECK static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "head" inv_box.icon = ui_style inv_box.icon_state = "head" @@ -71,7 +71,7 @@ inv_box.slot_id = SLOT_HEAD static_inventory += inv_box - inv_box = new /obj/screen/inventory() + inv_box = new /atom/movable/screen/inventory() inv_box.name = "back" inv_box.icon = ui_style inv_box.icon_state = "back" @@ -79,37 +79,37 @@ inv_box.slot_id = SLOT_BACK static_inventory += inv_box - throw_icon = new /obj/screen/throw_catch() + throw_icon = new /atom/movable/screen/throw_catch() throw_icon.icon = ui_style throw_icon.screen_loc = ui_drop_throw throw_icon.hud = src hotkeybuttons += throw_icon - internals = new /obj/screen/internals() + internals = new /atom/movable/screen/internals() internals.hud = src infodisplay += internals - healths = new /obj/screen/healths() + healths = new /atom/movable/screen/healths() healths.hud = src infodisplay += healths - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.screen_loc = ui_pull_resist pull_icon.hud = src pull_icon.update_icon() static_inventory += pull_icon - lingchemdisplay = new /obj/screen/ling/chems() + lingchemdisplay = new /atom/movable/screen/ling/chems() lingchemdisplay.hud = src infodisplay += lingchemdisplay - lingstingdisplay = new /obj/screen/ling/sting() + lingstingdisplay = new /atom/movable/screen/ling/sting() lingstingdisplay.hud = src infodisplay += lingstingdisplay - zone_select = new /obj/screen/zone_sel() + zone_select = new /atom/movable/screen/zone_sel() zone_select.icon = ui_style zone_select.hud = src zone_select.update_icon() @@ -117,13 +117,13 @@ mymob.client.screen = list() - using = new /obj/screen/resist() + using = new /atom/movable/screen/resist() using.icon = ui_style using.screen_loc = ui_pull_resist using.hud = src hotkeybuttons += using - for(var/obj/screen/inventory/inv in (static_inventory + toggleable_inventory)) + for(var/atom/movable/screen/inventory/inv in (static_inventory + toggleable_inventory)) if(inv.slot_id) inv.hud = src inv_slots[inv.slot_id] = inv diff --git a/code/_onclick/hud/movable_screen_objects.dm b/code/_onclick/hud/movable_screen_objects.dm index ae11613885..eeb56d67f5 100644 --- a/code/_onclick/hud/movable_screen_objects.dm +++ b/code/_onclick/hud/movable_screen_objects.dm @@ -8,7 +8,7 @@ //Movable Screen Object //Not tied to the grid, places it's center where the cursor is -/obj/screen/movable +/atom/movable/screen/movable var/snap2grid = FALSE var/moved = FALSE var/locked = FALSE @@ -18,11 +18,11 @@ //Snap Screen Object //Tied to the grid, snaps to the nearest turf -/obj/screen/movable/snap +/atom/movable/screen/movable/snap snap2grid = TRUE -/obj/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/movable/MouseDrop(over_object, src_location, over_location, src_control, over_control, params) if(locked) //no! I am locked! begone! return var/list/PM = params2list(params) @@ -56,7 +56,7 @@ set category = "Debug" set name = "Spawn Movable UI Object" - var/obj/screen/movable/M = new() + var/atom/movable/screen/movable/M = new() M.name = "Movable UI Object" M.icon_state = "block" M.maptext = "Movable" @@ -75,7 +75,7 @@ set category = "Debug" set name = "Spawn Snap UI Object" - var/obj/screen/movable/snap/S = new() + var/atom/movable/screen/movable/snap/S = new() S.name = "Snap UI Object" S.icon_state = "block" S.maptext = "Snap" diff --git a/code/_onclick/hud/parallax.dm b/code/_onclick/hud/parallax.dm index 5d48f430d7..a98fec03c4 100755 --- a/code/_onclick/hud/parallax.dm +++ b/code/_onclick/hud/parallax.dm @@ -7,12 +7,12 @@ if(!length(C.parallax_layers_cached)) C.parallax_layers_cached = list() - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_1(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_2(null, C.view) - C.parallax_layers_cached += new /obj/screen/parallax_layer/planet(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_1(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_2(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/planet(null, C.view) if(SSparallax.random_layer) C.parallax_layers_cached += new SSparallax.random_layer - C.parallax_layers_cached += new /obj/screen/parallax_layer/layer_3(null, C.view) + C.parallax_layers_cached += new /atom/movable/screen/parallax_layer/layer_3(null, C.view) C.parallax_layers = C.parallax_layers_cached.Copy() @@ -20,9 +20,9 @@ C.parallax_layers.len = C.parallax_layers_max C.screen |= (C.parallax_layers) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = list( 0, 0, 0, 0, @@ -37,9 +37,9 @@ var/mob/screenmob = viewmob || mymob var/client/C = screenmob.client C.screen -= (C.parallax_layers_cached) - var/obj/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] + var/atom/movable/screen/plane_master/PM = screenmob.hud_used.plane_masters["[PLANE_SPACE]"] if(screenmob != mymob) - C.screen -= locate(/obj/screen/plane_master/parallax_white) in C.screen + C.screen -= locate(/atom/movable/screen/plane_master/parallax_white) in C.screen C.screen += PM PM.color = initial(PM.color) C.parallax_layers = null @@ -90,7 +90,7 @@ if(new_parallax_movedir == FALSE) var/animate_time = 0 for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.icon_state = initial(L.icon_state) L.update_o(C.view) var/T = PARALLAX_LOOP_TIME / L.speed @@ -113,7 +113,7 @@ var/shortesttimer if(!skip_windups) for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing var/T = PARALLAX_LOOP_TIME / L.speed if (isnull(shortesttimer)) @@ -141,7 +141,7 @@ return C.parallax_animate_timer = FALSE for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing if (!new_parallax_movedir) animate(L) continue @@ -188,7 +188,7 @@ C.last_parallax_shift = world.time for(var/thing in C.parallax_layers) - var/obj/screen/parallax_layer/L = thing + var/atom/movable/screen/parallax_layer/L = thing L.update_status(mymob) if (L.view_sized != C.view) L.update_o(C.view) @@ -233,7 +233,7 @@ var/area/areaobj = get_area(client.eye) hud_used.set_parallax_movedir(areaobj.parallax_movedir, TRUE) -/obj/screen/parallax_layer +/atom/movable/screen/parallax_layer icon = 'icons/effects/parallax.dmi' var/speed = 1 var/offset_x = 0 @@ -246,13 +246,13 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/parallax_layer/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/Initialize(mapload, view) . = ..() if (!view) view = world.view update_o(view) -/obj/screen/parallax_layer/proc/update_o(view) +/atom/movable/screen/parallax_layer/proc/update_o(view) if (!view) view = world.view @@ -271,52 +271,52 @@ add_overlay(new_overlays) view_sized = view -/obj/screen/parallax_layer/proc/update_status(mob/M) +/atom/movable/screen/parallax_layer/proc/update_status(mob/M) return -/obj/screen/parallax_layer/layer_1 +/atom/movable/screen/parallax_layer/layer_1 icon_state = "layer1" speed = 0.6 layer = 1 -/obj/screen/parallax_layer/layer_2 +/atom/movable/screen/parallax_layer/layer_2 icon_state = "layer2" speed = 1 layer = 2 -/obj/screen/parallax_layer/layer_3 +/atom/movable/screen/parallax_layer/layer_3 icon_state = "layer3" speed = 1.4 layer = 3 -/obj/screen/parallax_layer/random +/atom/movable/screen/parallax_layer/random blend_mode = BLEND_OVERLAY speed = 3 layer = 3 -/obj/screen/parallax_layer/random/space_gas +/atom/movable/screen/parallax_layer/random/space_gas icon_state = "space_gas" -/obj/screen/parallax_layer/random/space_gas/Initialize(mapload, view) +/atom/movable/screen/parallax_layer/random/space_gas/Initialize(mapload, view) . = ..() src.add_atom_colour(SSparallax.random_parallax_color, ADMIN_COLOUR_PRIORITY) -/obj/screen/parallax_layer/random/asteroids +/atom/movable/screen/parallax_layer/random/asteroids icon_state = "asteroids" -/obj/screen/parallax_layer/planet +/atom/movable/screen/parallax_layer/planet icon_state = "planet" blend_mode = BLEND_OVERLAY absolute = TRUE //Status of seperation speed = 3 layer = 30 -/obj/screen/parallax_layer/planet/update_status(mob/M) +/atom/movable/screen/parallax_layer/planet/update_status(mob/M) var/client/C = M.client var/turf/posobj = get_turf(C.eye) if(!posobj) return invisibility = is_station_level(posobj.z) ? 0 : INVISIBILITY_ABSTRACT -/obj/screen/parallax_layer/planet/update_o() +/atom/movable/screen/parallax_layer/planet/update_o() return //Shit won't move diff --git a/code/_onclick/hud/picture_in_picture.dm b/code/_onclick/hud/picture_in_picture.dm index 5e474331f6..6cf1bfd6a6 100644 --- a/code/_onclick/hud/picture_in_picture.dm +++ b/code/_onclick/hud/picture_in_picture.dm @@ -1,4 +1,4 @@ -/obj/screen/movable/pic_in_pic +/atom/movable/screen/movable/pic_in_pic name = "Picture-in-picture" screen_loc = "CENTER" plane = FLOOR_PLANE @@ -7,18 +7,18 @@ var/height = 0 var/list/shown_to = list() var/list/viewing_turfs = list() - var/obj/screen/component_button/button_x - var/obj/screen/component_button/button_expand - var/obj/screen/component_button/button_shrink + var/atom/movable/screen/component_button/button_x + var/atom/movable/screen/component_button/button_expand + var/atom/movable/screen/component_button/button_shrink var/mutable_appearance/standard_background var/const/max_dimensions = 10 -/obj/screen/movable/pic_in_pic/Initialize() +/atom/movable/screen/movable/pic_in_pic/Initialize() . = ..() make_backgrounds() -/obj/screen/movable/pic_in_pic/Destroy() +/atom/movable/screen/movable/pic_in_pic/Destroy() for(var/C in shown_to) unshow_to(C) QDEL_NULL(button_x) @@ -26,7 +26,7 @@ QDEL_NULL(button_expand) return ..() -/obj/screen/movable/pic_in_pic/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/movable/pic_in_pic/component_click(atom/movable/screen/component_button/component, params) if(component == button_x) qdel(src) else if(component == button_expand) @@ -34,13 +34,13 @@ else if(component == button_shrink) set_view_size(width-1, height-1) -/obj/screen/movable/pic_in_pic/proc/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/proc/make_backgrounds() standard_background = new /mutable_appearance() standard_background.icon = 'icons/misc/pic_in_pic.dmi' standard_background.icon_state = "background" standard_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/proc/add_buttons() +/atom/movable/screen/movable/pic_in_pic/proc/add_buttons() var/static/mutable_appearance/move_tab if(!move_tab) move_tab = new /mutable_appearance() @@ -55,7 +55,7 @@ add_overlay(move_tab) if(!button_x) - button_x = new /obj/screen/component_button(null, src) + button_x = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "close" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -68,7 +68,7 @@ vis_contents += button_x if(!button_expand) - button_expand = new /obj/screen/component_button(null, src) + button_expand = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "expand" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -81,7 +81,7 @@ vis_contents += button_expand if(!button_shrink) - button_shrink = new /obj/screen/component_button(null, src) + button_shrink = new /atom/movable/screen/component_button(null, src) var/mutable_appearance/MA = new /mutable_appearance() MA.name = "shrink" MA.icon = 'icons/misc/pic_in_pic.dmi' @@ -93,7 +93,7 @@ button_shrink.transform = M vis_contents += button_shrink -/obj/screen/movable/pic_in_pic/proc/add_background() +/atom/movable/screen/movable/pic_in_pic/proc/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -101,7 +101,7 @@ standard_background.transform = M add_overlay(standard_background) -/obj/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_size(width, height, do_refresh = TRUE) width = clamp(width, 0, max_dimensions) height = clamp(height, 0, max_dimensions) src.width = width @@ -115,19 +115,19 @@ if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/proc/set_view_center(atom/target, do_refresh = TRUE) center = target if(do_refresh) refresh_view() -/obj/screen/movable/pic_in_pic/proc/refresh_view() +/atom/movable/screen/movable/pic_in_pic/proc/refresh_view() vis_contents -= viewing_turfs if(!width || !height) return viewing_turfs = get_visible_turfs() vis_contents += viewing_turfs -/obj/screen/movable/pic_in_pic/proc/get_visible_turfs() +/atom/movable/screen/movable/pic_in_pic/proc/get_visible_turfs() var/turf/T = get_turf(center) if(!T) return list() @@ -135,12 +135,12 @@ var/turf/upperright = locate(min(world.maxx, lowerleft.x + width - 1), min(world.maxy, lowerleft.y + height - 1), lowerleft.z) return block(lowerleft, upperright) -/obj/screen/movable/pic_in_pic/proc/show_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/show_to(client/C) if(C) shown_to[C] = 1 C.screen += src -/obj/screen/movable/pic_in_pic/proc/unshow_to(client/C) +/atom/movable/screen/movable/pic_in_pic/proc/unshow_to(client/C) if(C) shown_to -= C C.screen -= src diff --git a/code/_onclick/hud/plane_master.dm b/code/_onclick/hud/plane_master.dm index 4c736c9a2b..bb6a9cd925 100644 --- a/code/_onclick/hud/plane_master.dm +++ b/code/_onclick/hud/plane_master.dm @@ -1,4 +1,4 @@ -/obj/screen/plane_master +/atom/movable/screen/plane_master screen_loc = "CENTER" icon_state = "blank" appearance_flags = PLANE_MASTER|NO_CLIENT_COLOR @@ -6,25 +6,25 @@ var/show_alpha = 255 var/hide_alpha = 0 -/obj/screen/plane_master/proc/Show(override) +/atom/movable/screen/plane_master/proc/Show(override) alpha = override || show_alpha -/obj/screen/plane_master/proc/Hide(override) +/atom/movable/screen/plane_master/proc/Hide(override) alpha = override || hide_alpha //Why do plane masters need a backdrop sometimes? Read https://secure.byond.com/forum/?post=2141928 //Trust me, you need one. Period. If you don't think you do, you're doing something extremely wrong. -/obj/screen/plane_master/proc/backdrop(mob/mymob) +/atom/movable/screen/plane_master/proc/backdrop(mob/mymob) ///Things rendered on "openspace"; holes in multi-z -/obj/screen/plane_master/openspace +/atom/movable/screen/plane_master/openspace name = "open space plane master" plane = OPENSPACE_BACKDROP_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_MULTIPLY alpha = 255 -/obj/screen/plane_master/openspace/Initialize() +/atom/movable/screen/plane_master/openspace/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) @@ -32,163 +32,143 @@ filters += filter(type = "drop_shadow", color = "#04080FAA", size = -15) filters += filter(type = "drop_shadow", color = "#04080FAA", size = -20) -/obj/screen/plane_master/proc/outline(_size, _color) +/atom/movable/screen/plane_master/proc/outline(_size, _color) filters += filter(type = "outline", size = _size, color = _color) -/obj/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") +/atom/movable/screen/plane_master/proc/shadow(_size, _offset = 0, _x = 0, _y = 0, _color = "#04080FAA") filters += filter(type = "drop_shadow", x = _x, y = _y, color = _color, size = _size, offset = _offset) ///Contains just the floor -/obj/screen/plane_master/floor +/atom/movable/screen/plane_master/floor name = "floor plane master" plane = FLOOR_PLANE appearance_flags = PLANE_MASTER blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/wall +/atom/movable/screen/plane_master/wall name = "wall plane master" plane = WALL_PLANE appearance_flags = PLANE_MASTER -/obj/screen/plane_master/wall/backdrop(mob/mymob) +/atom/movable/screen/plane_master/wall/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) else remove_filter("ambient_occlusion") -/obj/screen/plane_master/above_wall +/atom/movable/screen/plane_master/above_wall name = "above wall plane master" plane = ABOVE_WALL_PLANE appearance_flags = PLANE_MASTER -/obj/screen/plane_master/above_wall/Initialize() +/atom/movable/screen/plane_master/above_wall/Initialize() . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) -/obj/screen/plane_master/above_wall/backdrop(mob/mymob) +/atom/movable/screen/plane_master/above_wall/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(3, "#04080F64")) else remove_filter("ambient_occlusion") ///Contains most things in the game world -/obj/screen/plane_master/game_world +/atom/movable/screen/plane_master/game_world name = "game world plane master" plane = GAME_PLANE appearance_flags = PLANE_MASTER //should use client color blend_mode = BLEND_OVERLAY -/obj/screen/plane_master/game_world/Initialize() +/atom/movable/screen/plane_master/game_world/Initialize() . = ..() add_filter("vision_cone", 100, list(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE)) -/obj/screen/plane_master/game_world/backdrop(mob/mymob) +/atom/movable/screen/plane_master/game_world/backdrop(mob/mymob) if(mymob?.client?.prefs.ambientocclusion) add_filter("ambient_occlusion", 0, AMBIENT_OCCLUSION(4, "#04080FAA")) else remove_filter("ambient_occlusion") ///Contains all shadow cone masks, whose image overrides are displayed only to their respective owners. -/obj/screen/plane_master/field_of_vision +/atom/movable/screen/plane_master/field_of_vision name = "field of vision mask plane master" plane = FIELD_OF_VISION_PLANE render_target = FIELD_OF_VISION_RENDER_TARGET mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/field_of_vision/Initialize() +/atom/movable/screen/plane_master/field_of_vision/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) ///Used to display the owner and its adjacent surroundings through the FoV plane mask. -/obj/screen/plane_master/field_of_vision_blocker +/atom/movable/screen/plane_master/field_of_vision_blocker name = "field of vision blocker plane master" plane = FIELD_OF_VISION_BLOCKER_PLANE render_target = FIELD_OF_VISION_BLOCKER_RENDER_TARGET mouse_opacity = MOUSE_OPACITY_TRANSPARENT ///Stores the visible portion of the FoV shadow cone. -/obj/screen/plane_master/field_of_vision_visual +/atom/movable/screen/plane_master/field_of_vision_visual name = "field of vision visual plane master" plane = FIELD_OF_VISION_VISUAL_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/field_of_vision_visual/Initialize() +/atom/movable/screen/plane_master/field_of_vision_visual/Initialize() . = ..() filters += filter(type="alpha", render_source=FIELD_OF_VISION_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) ///Contains all lighting objects -/obj/screen/plane_master/lighting +/atom/movable/screen/plane_master/lighting name = "lighting plane master" plane = LIGHTING_PLANE blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/lighting/backdrop(mob/mymob) - mymob.overlay_fullscreen("lighting_backdrop_lit", /obj/screen/fullscreen/lighting_backdrop/lit) - mymob.overlay_fullscreen("lighting_backdrop_unlit", /obj/screen/fullscreen/lighting_backdrop/unlit) +/atom/movable/screen/plane_master/lighting/backdrop(mob/mymob) + mymob.overlay_fullscreen("lighting_backdrop_lit", /atom/movable/screen/fullscreen/lighting_backdrop/lit) + mymob.overlay_fullscreen("lighting_backdrop_unlit", /atom/movable/screen/fullscreen/lighting_backdrop/unlit) -/obj/screen/plane_master/lighting/Initialize() +/*! + * This system works by exploiting BYONDs color matrix filter to use layers to handle emissive blockers. + * + * Emissive overlays are pasted with an atom color that converts them to be entirely some specific color. + * Emissive blockers are pasted with an atom color that converts them to be entirely some different color. + * Emissive overlays and emissive blockers are put onto the same plane. + * The layers for the emissive overlays and emissive blockers cause them to mask eachother similar to normal BYOND objects. + * A color matrix filter is applied to the emissive plane to mask out anything that isn't whatever the emissive color is. + * This is then used to alpha mask the lighting plane. + */ + +/atom/movable/screen/plane_master/lighting/Initialize() . = ..() - filters += filter(type="alpha", render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE) - filters += filter(type="alpha", render_source = EMISSIVE_UNBLOCKABLE_RENDER_TARGET, flags = MASK_INVERSE) + add_filter("emissives", 1, alpha_mask_filter(render_source = EMISSIVE_RENDER_TARGET, flags = MASK_INVERSE)) + add_filter("object_lighting", 2, alpha_mask_filter(render_source = O_LIGHTING_VISUAL_RENDER_TARGET, flags = MASK_INVERSE)) + /** - * Things placed on this mask the lighting plane. Doesn't render directly. - * - * Gets masked by blocking plane. Use for things that you want blocked by - * mobs, items, etc. - */ -/obj/screen/plane_master/emissive + * Handles emissive overlays and emissive blockers. + */ +/atom/movable/screen/plane_master/emissive name = "emissive plane master" plane = EMISSIVE_PLANE mouse_opacity = MOUSE_OPACITY_TRANSPARENT render_target = EMISSIVE_RENDER_TARGET -/obj/screen/plane_master/emissive/Initialize() +/atom/movable/screen/plane_master/emissive/Initialize() . = ..() - filters += filter(type="alpha", render_source=EMISSIVE_BLOCKER_RENDER_TARGET, flags=MASK_INVERSE) - filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) - -/** - * Things placed on this always mask the lighting plane. Doesn't render directly. - * - * Always masks the light plane, isn't blocked by anything (except Field of Vision). Use for on mob glows, - * magic stuff, etc. - */ - -/obj/screen/plane_master/emissive_unblockable - name = "unblockable emissive plane master" - plane = EMISSIVE_UNBLOCKABLE_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_UNBLOCKABLE_RENDER_TARGET - -/obj/screen/plane_master/emissive_unblockable/Initialize() - . = ..() - filters += filter(type="alpha", render_source=FIELD_OF_VISION_RENDER_TARGET, flags=MASK_INVERSE) - -/** - * Things placed on this layer mask the emissive layer. Doesn't render directly - * - * You really shouldn't be directly using this, use atom helpers instead - */ -/obj/screen/plane_master/emissive_blocker - name = "emissive blocker plane master" - plane = EMISSIVE_BLOCKER_PLANE - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - render_target = EMISSIVE_BLOCKER_RENDER_TARGET + add_filter("em_block_masking", 1, color_matrix_filter(GLOB.em_mask_matrix)) ///Contains space parallax -/obj/screen/plane_master/parallax +/atom/movable/screen/plane_master/parallax name = "parallax plane master" plane = PLANE_SPACE_PARALLAX blend_mode = BLEND_MULTIPLY mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/plane_master/parallax_white +/atom/movable/screen/plane_master/parallax_white name = "parallax whitifier plane master" plane = PLANE_SPACE -/obj/screen/plane_master/camera_static +/atom/movable/screen/plane_master/camera_static name = "camera static plane master" plane = CAMERA_STATIC_PLANE appearance_flags = PLANE_MASTER @@ -196,7 +176,7 @@ //Reserved to chat messages, so they are still displayed above the field of vision masking. -/obj/screen/plane_master/chat_messages +/atom/movable/screen/plane_master/chat_messages name = "runechat plane master" plane = CHAT_PLANE appearance_flags = PLANE_MASTER diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 7d22b70cbc..3cce288e67 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -3,49 +3,49 @@ GLOBAL_LIST_EMPTY(radial_menus) -/obj/screen/radial +/atom/movable/screen/radial icon = 'icons/mob/radial.dmi' layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE var/datum/radial_menu/parent -/obj/screen/radial/slice +/atom/movable/screen/radial/slice icon_state = "radial_slice" var/choice var/next_page = FALSE -/obj/screen/radial/slice/MouseEntered(location, control, params) +/atom/movable/screen/radial/slice/MouseEntered(location, control, params) . = ..() icon_state = "radial_slice_focus" if(tooltips) openToolTip(usr, src, params, title = name) -/obj/screen/radial/slice/MouseExited(location, control, params) +/atom/movable/screen/radial/slice/MouseExited(location, control, params) . = ..() icon_state = "radial_slice" if(tooltips) closeToolTip(usr) -/obj/screen/radial/slice/Click(location, control, params) +/atom/movable/screen/radial/slice/Click(location, control, params) if(usr.client == parent.current_user) if(next_page) parent.next_page() else parent.element_chosen(choice,usr) -/obj/screen/radial/center +/atom/movable/screen/radial/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/center/MouseExited(location, control, params) +/atom/movable/screen/radial/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" -/obj/screen/radial/center/Click(location, control, params) +/atom/movable/screen/radial/center/Click(location, control, params) if(usr.client == parent.current_user) parent.finished = TRUE @@ -57,8 +57,8 @@ GLOBAL_LIST_EMPTY(radial_menus) var/selected_choice - var/list/obj/screen/elements = list() - var/obj/screen/radial/center/close_button + var/list/atom/movable/screen/elements = list() + var/atom/movable/screen/radial/center/close_button var/client/current_user var/atom/anchor var/image/menu_holder @@ -120,7 +120,7 @@ GLOBAL_LIST_EMPTY(radial_menus) if(elements.len < max_elements) var/elements_to_add = max_elements - elements.len for(var/i in 1 to elements_to_add) //Create all elements - var/obj/screen/radial/slice/new_element = new /obj/screen/radial/slice + var/atom/movable/screen/radial/slice/new_element = new /atom/movable/screen/radial/slice new_element.tooltips = use_tooltips new_element.parent = src elements += new_element @@ -152,14 +152,14 @@ GLOBAL_LIST_EMPTY(radial_menus) var/list/page_choices = page_data[current_page] var/angle_per_element = round(zone / page_choices.len) for(var/i in 1 to elements.len) - var/obj/screen/radial/E = elements[i] + var/atom/movable/screen/radial/E = elements[i] var/angle = WRAP(starting_angle + (i - 1) * angle_per_element,0,360) if(i > page_choices.len) HideElement(E) else SetElement(E,page_choices[i],angle,anim = anim,anim_order = i) -/datum/radial_menu/proc/HideElement(obj/screen/radial/slice/E) +/datum/radial_menu/proc/HideElement(atom/movable/screen/radial/slice/E) E.cut_overlays() E.alpha = 0 E.name = "None" @@ -168,7 +168,7 @@ GLOBAL_LIST_EMPTY(radial_menus) E.choice = null E.next_page = FALSE -/datum/radial_menu/proc/SetElement(obj/screen/radial/slice/E,choice_id,angle,anim,anim_order) +/datum/radial_menu/proc/SetElement(atom/movable/screen/radial/slice/E,choice_id,angle,anim,anim_order) //Position var/py = round(cos(angle) * radius) + py_shift var/px = round(sin(angle) * radius) diff --git a/code/_onclick/hud/radial_persistent.dm b/code/_onclick/hud/radial_persistent.dm index 0b5e8dc356..e7f7c664ad 100644 --- a/code/_onclick/hud/radial_persistent.dm +++ b/code/_onclick/hud/radial_persistent.dm @@ -2,19 +2,19 @@ A derivative of radial menu which persists onscreen until closed and invokes a callback each time an element is clicked */ -/obj/screen/radial/persistent/center +/atom/movable/screen/radial/persistent/center name = "Close Menu" icon_state = "radial_center" -/obj/screen/radial/persistent/center/Click(location, control, params) +/atom/movable/screen/radial/persistent/center/Click(location, control, params) if(usr.client == parent.current_user) parent.element_chosen(null,usr) -/obj/screen/radial/persistent/center/MouseEntered(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseEntered(location, control, params) . = ..() icon_state = "radial_center_focus" -/obj/screen/radial/persistent/center/MouseExited(location, control, params) +/atom/movable/screen/radial/persistent/center/MouseExited(location, control, params) . = ..() icon_state = "radial_center" @@ -25,7 +25,7 @@ var/datum/callback/select_proc_callback /datum/radial_menu/persistent/New() - close_button = new /obj/screen/radial/persistent/center + close_button = new /atom/movable/screen/radial/persistent/center close_button.parent = src diff --git a/code/_onclick/hud/revenanthud.dm b/code/_onclick/hud/revenanthud.dm index 9369313941..708b1d4915 100644 --- a/code/_onclick/hud/revenanthud.dm +++ b/code/_onclick/hud/revenanthud.dm @@ -2,6 +2,6 @@ /datum/hud/revenant/New(mob/owner) ..() - healths = new /obj/screen/healths/revenant() + healths = new /atom/movable/screen/healths/revenant() healths.hud = src infodisplay += healths diff --git a/code/_onclick/hud/robot.dm b/code/_onclick/hud/robot.dm index 33a9cec80c..03ad1b1821 100644 --- a/code/_onclick/hud/robot.dm +++ b/code/_onclick/hud/robot.dm @@ -1,15 +1,15 @@ -/obj/screen/robot +/atom/movable/screen/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/robot/module +/atom/movable/screen/robot/module name = "cyborg module" icon_state = "nomod" -/obj/screen/robot/Click() +/atom/movable/screen/robot/Click() if(isobserver(usr)) return 1 -/obj/screen/robot/module/Click() +/atom/movable/screen/robot/module/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -18,51 +18,51 @@ return 1 R.pick_module() -/obj/screen/robot/module1 +/atom/movable/screen/robot/module1 name = "module1" icon_state = "inv1" -/obj/screen/robot/module1/Click() +/atom/movable/screen/robot/module1/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(1) -/obj/screen/robot/module2 +/atom/movable/screen/robot/module2 name = "module2" icon_state = "inv2" -/obj/screen/robot/module2/Click() +/atom/movable/screen/robot/module2/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(2) -/obj/screen/robot/module3 +/atom/movable/screen/robot/module3 name = "module3" icon_state = "inv3" -/obj/screen/robot/module3/Click() +/atom/movable/screen/robot/module3/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_module(3) -/obj/screen/robot/radio +/atom/movable/screen/robot/radio name = "radio" icon_state = "radio" -/obj/screen/robot/radio/Click() +/atom/movable/screen/robot/radio/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.radio.interact(R) -/obj/screen/robot/store +/atom/movable/screen/robot/store name = "store" icon_state = "store" -/obj/screen/robot/store/Click() +/atom/movable/screen/robot/store/Click() if(..()) return var/mob/living/silicon/robot/R = usr @@ -75,35 +75,35 @@ ..() // i, Robit var/mob/living/silicon/robot/robit = mymob - var/obj/screen/using + var/atom/movable/screen/using - using = new/obj/screen/language_menu + using = new/atom/movable/screen/language_menu using.screen_loc = ui_borg_language_menu static_inventory += using //Radio - using = new /obj/screen/robot/radio() + using = new /atom/movable/screen/robot/radio() using.screen_loc = ui_borg_radio using.hud = src static_inventory += using //Module select if(!robit.inv1) - robit.inv1 = new /obj/screen/robot/module1() + robit.inv1 = new /atom/movable/screen/robot/module1() robit.inv1.screen_loc = ui_inv1 robit.inv1.hud = src static_inventory += robit.inv1 if(!robit.inv2) - robit.inv2 = new /obj/screen/robot/module2() + robit.inv2 = new /atom/movable/screen/robot/module2() robit.inv2.screen_loc = ui_inv2 robit.inv2.hud = src static_inventory += robit.inv2 if(!robit.inv3) - robit.inv3 = new /obj/screen/robot/module3() + robit.inv3 = new /atom/movable/screen/robot/module3() robit.inv3.screen_loc = ui_inv3 robit.inv3.hud = src @@ -111,73 +111,73 @@ //End of module select - using = new /obj/screen/robot/lamp() + using = new /atom/movable/screen/robot/lamp() using.screen_loc = ui_borg_lamp using.hud = src static_inventory += using robit.lampButton = using - var/obj/screen/robot/lamp/lampscreen = using + var/atom/movable/screen/robot/lamp/lampscreen = using lampscreen.robot = robit //Photography stuff - using = new /obj/screen/ai/image_take() + using = new /atom/movable/screen/ai/image_take() using.screen_loc = ui_borg_camera using.hud = src static_inventory += using //Sec/Med HUDs - using = new /obj/screen/robot/sensors() + using = new /atom/movable/screen/robot/sensors() using.screen_loc = ui_borg_sensor using.hud = src static_inventory += using //Borg Integrated Tablet - using = new /obj/screen/robot/modPC() + using = new /atom/movable/screen/robot/modPC() using.screen_loc = ui_borg_tablet using.hud = src static_inventory += using robit.interfaceButton = using if(robit.modularInterface) using.vis_contents += robit.modularInterface - var/obj/screen/robot/modPC/tabletbutton = using + var/atom/movable/screen/robot/modPC/tabletbutton = using tabletbutton.robot = robit //Alerts - using = new /obj/screen/robot/alerts() + using = new /atom/movable/screen/robot/alerts() using.screen_loc = ui_borg_alerts using.hud = src static_inventory += using //Thrusters - using = new /obj/screen/robot/thrusters() + using = new /atom/movable/screen/robot/thrusters() using.screen_loc = ui_borg_thrusters using.hud = src static_inventory += using robit.thruster_button = using //Intent - action_intent = new /obj/screen/act_intent/robot() + action_intent = new /atom/movable/screen/act_intent/robot() action_intent.icon_state = mymob.a_intent action_intent.hud = src static_inventory += action_intent //Health - healths = new /obj/screen/healths/robot() + healths = new /atom/movable/screen/healths/robot() healths.hud = src infodisplay += healths //Installed Module - robit.hands = new /obj/screen/robot/module() + robit.hands = new /atom/movable/screen/robot/module() robit.hands.screen_loc = ui_borg_module robit.hands.hud = src static_inventory += robit.hands //Store - module_store_icon = new /obj/screen/robot/store() + module_store_icon = new /atom/movable/screen/robot/store() module_store_icon.screen_loc = ui_borg_store module_store_icon.hud = src - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = 'icons/mob/screen_cyborg.dmi' pull_icon.screen_loc = ui_borg_pull pull_icon.hud = src @@ -185,7 +185,7 @@ hotkeybuttons += pull_icon - zone_select = new /obj/screen/zone_sel/robot() + zone_select = new /atom/movable/screen/zone_sel/robot() zone_select.hud = src zone_select.update_icon() static_inventory += zone_select @@ -283,61 +283,61 @@ for(var/obj/item/I in R.held_items) screenmob.client.screen -= I -/obj/screen/robot/lamp +/atom/movable/screen/robot/lamp name = "headlamp" icon_state = "lamp_off" var/mob/living/silicon/robot/robot -/obj/screen/robot/lamp/Click() +/atom/movable/screen/robot/lamp/Click() . = ..() if(.) return robot?.toggle_headlamp() update_icon() -/obj/screen/robot/lamp/update_icon() +/atom/movable/screen/robot/lamp/update_icon() if(robot?.lamp_enabled) icon_state = "lamp_on" else icon_state = "lamp_off" -/obj/screen/robot/alerts +/atom/movable/screen/robot/alerts name = "Alert Panel" icon = 'icons/mob/screen_ai.dmi' icon_state = "alerts" -/obj/screen/robot/alerts/Click() +/atom/movable/screen/robot/alerts/Click() . = ..() if(.) return var/mob/living/silicon/robot/borgo = usr borgo.robot_alerts() -/obj/screen/robot/thrusters +/atom/movable/screen/robot/thrusters name = "ion thrusters" icon_state = "ionpulse0" -/obj/screen/robot/thrusters/Click() +/atom/movable/screen/robot/thrusters/Click() if(..()) return var/mob/living/silicon/robot/R = usr R.toggle_ionpulse() -/obj/screen/robot/sensors +/atom/movable/screen/robot/sensors name = "Sensor Augmentation" icon_state = "cyborg_sensor" -/obj/screen/robot/sensors/Click() +/atom/movable/screen/robot/sensors/Click() if(..()) return var/mob/living/silicon/S = usr S.toggle_sensors() -/obj/screen/robot/modPC +/atom/movable/screen/robot/modPC name = "Modular Interface" icon_state = "template" var/mob/living/silicon/robot/robot -/obj/screen/robot/modPC/Click() +/atom/movable/screen/robot/modPC/Click() . = ..() if(.) return diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index b27abad841..bfbdce41fd 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -6,12 +6,11 @@ They are used with the client/screen list and the screen_loc var. For more information, see the byond documentation on the screen_loc and screen vars. */ -/obj/screen +/atom/movable/screen name = "" icon = 'icons/mob/screen_gen.dmi' layer = HUD_LAYER plane = HUD_PLANE - resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF animate_movement = SLIDE_STEPS speech_span = SPAN_ROBOT vis_flags = VIS_INHERIT_PLANE @@ -34,24 +33,21 @@ */ var/del_on_map_removal = TRUE -/obj/screen/take_damage() - return - -/obj/screen/Destroy() +/atom/movable/screen/Destroy() master = null hud = null return ..() -/obj/screen/examine(mob/user) +/atom/movable/screen/examine(mob/user) return list() -/obj/screen/orbit() +/atom/movable/screen/orbit() return -/obj/screen/proc/component_click(obj/screen/component_button/component, params) +/atom/movable/screen/proc/component_click(atom/movable/screen/component_button/component, params) return -/obj/screen/text +/atom/movable/screen/text icon = null icon_state = null mouse_opacity = MOUSE_OPACITY_TRANSPARENT @@ -59,12 +55,12 @@ maptext_height = 480 maptext_width = 480 -/obj/screen/swap_hand +/atom/movable/screen/swap_hand layer = HUD_LAYER plane = HUD_PLANE name = "swap hand" -/obj/screen/swap_hand/Click() +/atom/movable/screen/swap_hand/Click() // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click // if(world.time <= usr.next_move) @@ -78,19 +74,19 @@ M.swap_hand() return 1 -/obj/screen/craft +/atom/movable/screen/craft name = "crafting menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "craft" screen_loc = ui_crafting -/obj/screen/area_creator +/atom/movable/screen/area_creator name = "create new area" icon = 'icons/mob/screen_midnight.dmi' icon_state = "area_edit" screen_loc = ui_building -/obj/screen/area_creator/Click() +/atom/movable/screen/area_creator/Click() if(usr.incapacitated() || (isobserver(usr) && !IsAdminGhost(usr))) return TRUE var/area/A = get_area(usr) @@ -99,18 +95,18 @@ return TRUE create_area(usr) -/obj/screen/language_menu +/atom/movable/screen/language_menu name = "language menu" icon = 'icons/mob/screen_midnight.dmi' icon_state = "talk_wheel" screen_loc = ui_language_menu -/obj/screen/language_menu/Click() +/atom/movable/screen/language_menu/Click() var/mob/M = usr var/datum/language_holder/H = M.get_language_holder() H.open_language_menu(usr) -/obj/screen/inventory +/atom/movable/screen/inventory /// The identifier for the slot. It has nothing to do with ID cards. var/slot_id /// Icon when empty. For now used only by humans. @@ -122,7 +118,7 @@ layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/inventory/Click(location, control, params) +/atom/movable/screen/inventory/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click // if(world.time <= usr.next_move) @@ -142,16 +138,16 @@ usr.update_inv_hands() return TRUE -/obj/screen/inventory/MouseEntered() +/atom/movable/screen/inventory/MouseEntered() ..() add_overlays() -/obj/screen/inventory/MouseExited() +/atom/movable/screen/inventory/MouseExited() ..() cut_overlay(object_overlays) object_overlays.Cut() -/obj/screen/inventory/update_icon_state() +/atom/movable/screen/inventory/update_icon_state() if(!icon_empty) icon_empty = icon_state @@ -161,7 +157,7 @@ else icon_state = icon_empty -/obj/screen/inventory/proc/add_overlays() +/atom/movable/screen/inventory/proc/add_overlays() var/mob/user = hud?.mymob if(!user || !slot_id) @@ -184,12 +180,12 @@ // object_overlay = item_overlay add_overlay(object_overlays) -/obj/screen/inventory/hand +/atom/movable/screen/inventory/hand var/mutable_appearance/handcuff_overlay var/static/mutable_appearance/blocked_overlay = mutable_appearance('icons/mob/screen_gen.dmi', "blocked") var/held_index = 0 -/obj/screen/inventory/hand/update_overlays() +/atom/movable/screen/inventory/hand/update_overlays() . = ..() if(!handcuff_overlay) @@ -212,7 +208,7 @@ . += "hand_active" -/obj/screen/inventory/hand/Click(location, control, params) +/atom/movable/screen/inventory/hand/Click(location, control, params) // At this point in client Click() code we have passed the 1/10 sec check and little else // We don't even know if it's a middle click var/mob/user = hud?.mymob @@ -234,26 +230,26 @@ return TRUE -/obj/screen/drop +/atom/movable/screen/drop name = "drop" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_drop" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/drop/Click() +/atom/movable/screen/drop/Click() if(usr.stat == CONSCIOUS) usr.dropItemToGround(usr.get_active_held_item()) -/obj/screen/act_intent +/atom/movable/screen/act_intent name = "intent" icon_state = "help" screen_loc = ui_acti -/obj/screen/act_intent/Click(location, control, params) +/atom/movable/screen/act_intent/Click(location, control, params) usr.a_intent_change(INTENT_HOTKEY_RIGHT) -/obj/screen/act_intent/segmented/Click(location, control, params) +/atom/movable/screen/act_intent/segmented/Click(location, control, params) if(usr.client.prefs.toggles & INTENT_STYLE) var/_x = text2num(params2list(params)["icon-x"]) var/_y = text2num(params2list(params)["icon-y"]) @@ -272,20 +268,20 @@ else return ..() -/obj/screen/act_intent/alien +/atom/movable/screen/act_intent/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_movi -/obj/screen/act_intent/robot +/atom/movable/screen/act_intent/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_intents -/obj/screen/internals +/atom/movable/screen/internals name = "toggle internals" icon_state = "internal0" screen_loc = ui_internal -/obj/screen/internals/Click() +/atom/movable/screen/internals/Click() if(!iscarbon(usr)) return var/mob/living/carbon/C = usr @@ -346,71 +342,71 @@ return C.update_action_buttons_icon() -/obj/screen/mov_intent +/atom/movable/screen/mov_intent name = "run/walk toggle" icon = 'icons/mob/screen_midnight.dmi' icon_state = "running" -/obj/screen/mov_intent/Initialize(mapload) +/atom/movable/screen/mov_intent/Initialize(mapload) . = ..() update_icon() -/obj/screen/mov_intent/Click() +/atom/movable/screen/mov_intent/Click() toggle(usr) -/obj/screen/mov_intent/update_icon_state() +/atom/movable/screen/mov_intent/update_icon_state() switch(hud?.mymob?.m_intent) if(MOVE_INTENT_WALK) icon_state = CONFIG_GET(flag/sprint_enabled)? "walking" : "walking_nosprint" if(MOVE_INTENT_RUN) icon_state = CONFIG_GET(flag/sprint_enabled)? "running" : "running_nosprint" -/obj/screen/mov_intent/proc/toggle(mob/user) +/atom/movable/screen/mov_intent/proc/toggle(mob/user) if(isobserver(user)) return user.toggle_move_intent(user) -/obj/screen/pull +/atom/movable/screen/pull name = "stop pulling" icon = 'icons/mob/screen_midnight.dmi' icon_state = "pull" -/obj/screen/pull/Click() +/atom/movable/screen/pull/Click() if(isobserver(usr)) return usr.stop_pulling() -/obj/screen/pull/update_icon_state() +/atom/movable/screen/pull/update_icon_state() if(hud?.mymob?.pulling) icon_state = "pull" else icon_state = "pull0" -/obj/screen/resist +/atom/movable/screen/resist name = "resist" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_resist" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/resist/Click() +/atom/movable/screen/resist/Click() if(isliving(usr)) var/mob/living/L = usr L.resist() -/obj/screen/rest +/atom/movable/screen/rest name = "rest" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_rest" layer = HUD_LAYER plane = HUD_PLANE -/obj/screen/rest/Click() +/atom/movable/screen/rest/Click() if(isliving(usr)) var/mob/living/L = usr L.lay_down() -/obj/screen/rest/update_icon_state() +/atom/movable/screen/rest/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return @@ -419,17 +415,17 @@ else icon_state = "act_rest0" -/obj/screen/throw_catch +/atom/movable/screen/throw_catch name = "throw/catch" icon = 'icons/mob/screen_midnight.dmi' icon_state = "act_throw_off" -/obj/screen/throw_catch/Click() +/atom/movable/screen/throw_catch/Click() if(iscarbon(usr)) var/mob/living/carbon/C = usr C.toggle_throw_mode() -/obj/screen/zone_sel +/atom/movable/screen/zone_sel name = "damage zone" icon_state = "zone_sel" screen_loc = ui_zonesel @@ -437,7 +433,7 @@ var/static/list/hover_overlays_cache = list() var/hovering -/obj/screen/zone_sel/Click(location, control,params) +/atom/movable/screen/zone_sel/Click(location, control,params) if(isobserver(usr)) return @@ -450,10 +446,10 @@ return set_selected_zone(choice, usr) -/obj/screen/zone_sel/MouseEntered(location, control, params) +/atom/movable/screen/zone_sel/MouseEntered(location, control, params) MouseMove(location, control, params) -/obj/screen/zone_sel/MouseMove(location, control, params) +/atom/movable/screen/zone_sel/MouseMove(location, control, params) if(isobserver(usr)) return @@ -482,12 +478,12 @@ layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE -/obj/screen/zone_sel/MouseExited(location, control, params) +/atom/movable/screen/zone_sel/MouseExited(location, control, params) if(!isobserver(usr) && hovering) vis_contents -= hover_overlays_cache[hovering] hovering = null -/obj/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) +/atom/movable/screen/zone_sel/proc/get_zone_at(icon_x, icon_y) switch(icon_y) if(1 to 9) //Legs switch(icon_x) @@ -525,7 +521,7 @@ return BODY_ZONE_PRECISE_EYES return BODY_ZONE_HEAD -/obj/screen/zone_sel/proc/set_selected_zone(choice, mob/user) +/atom/movable/screen/zone_sel/proc/set_selected_zone(choice, mob/user) if(user != hud?.mymob) return @@ -535,21 +531,21 @@ return TRUE -/obj/screen/zone_sel/update_overlays() +/atom/movable/screen/zone_sel/update_overlays() . = ..() if(!hud?.mymob) return . += mutable_appearance(overlay_icon, "[hud.mymob.zone_selected]") -/obj/screen/zone_sel/alien +/atom/movable/screen/zone_sel/alien icon = 'icons/mob/screen_alien.dmi' overlay_icon = 'icons/mob/screen_alien.dmi' -/obj/screen/zone_sel/robot +/atom/movable/screen/zone_sel/robot icon = 'icons/mob/screen_cyborg.dmi' -/obj/screen/flash +/atom/movable/screen/flash name = "flash" icon_state = "blank" blend_mode = BLEND_ADD @@ -557,7 +553,7 @@ layer = FLASH_LAYER plane = FULLSCREEN_PLANE -/obj/screen/damageoverlay +/atom/movable/screen/damageoverlay icon = 'icons/mob/screen_full.dmi' icon_state = "oxydamageoverlay0" name = "dmg" @@ -567,87 +563,87 @@ layer = UI_DAMAGE_LAYER plane = FULLSCREEN_PLANE -/obj/screen/healths +/atom/movable/screen/healths name = "health" icon_state = "health0" screen_loc = ui_health -/obj/screen/healths/alien +/atom/movable/screen/healths/alien icon = 'icons/mob/screen_alien.dmi' screen_loc = ui_alien_health -/obj/screen/healths/robot +/atom/movable/screen/healths/robot icon = 'icons/mob/screen_cyborg.dmi' screen_loc = ui_borg_health -/obj/screen/healths/blob +/atom/movable/screen/healths/blob name = "blob health" icon_state = "block" screen_loc = ui_internal mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/blob/naut +/atom/movable/screen/healths/blob/naut name = "health" icon = 'icons/mob/blob.dmi' icon_state = "nauthealth" -/obj/screen/healths/blob/naut/core +/atom/movable/screen/healths/blob/naut/core name = "overmind health" screen_loc = ui_health icon_state = "corehealth" -/obj/screen/healths/guardian +/atom/movable/screen/healths/guardian name = "summoner health" icon = 'icons/mob/guardian.dmi' icon_state = "base" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock +/atom/movable/screen/healths/clock icon = 'icons/mob/actions.dmi' icon_state = "bg_clock" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/clock/gear +/atom/movable/screen/healths/clock/gear icon = 'icons/mob/clockwork_mobs.dmi' icon_state = "bg_gear" screen_loc = ui_internal -/obj/screen/healths/revenant +/atom/movable/screen/healths/revenant name = "essence" icon = 'icons/mob/actions.dmi' icon_state = "bg_revenant" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/construct +/atom/movable/screen/healths/construct icon = 'icons/mob/screen_construct.dmi' icon_state = "artificer_health0" screen_loc = ui_construct_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healths/lavaland_elite +/atom/movable/screen/healths/lavaland_elite icon = 'icons/mob/screen_elite.dmi' icon_state = "elite_health0" screen_loc = ui_health mouse_opacity = MOUSE_OPACITY_TRANSPARENT -/obj/screen/healthdoll +/atom/movable/screen/healthdoll name = "health doll" screen_loc = ui_healthdoll -/obj/screen/healthdoll/living +/atom/movable/screen/healthdoll/living icon_state = "fullhealth0" screen_loc = ui_living_healthdoll var/filtered = FALSE //so we don't repeatedly create the mask of the mob every update -/obj/screen/mood +/atom/movable/screen/mood name = "mood" icon_state = "mood5" screen_loc = ui_mood -/obj/screen/splash +/atom/movable/screen/splash icon = 'icons/blank_title.png' icon_state = "" screen_loc = "1,1" @@ -655,7 +651,7 @@ plane = SPLASHSCREEN_PLANE var/client/holder -/obj/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy +/atom/movable/screen/splash/New(client/C, visible, use_previous_title) //TODO: Make this use INITIALIZE_IMMEDIATE, except its not easy . = ..() holder = C @@ -674,7 +670,7 @@ holder.screen += src -/obj/screen/splash/proc/Fade(out, qdel_after = TRUE) +/atom/movable/screen/splash/proc/Fade(out, qdel_after = TRUE) if(QDELETED(src)) return if(out) @@ -685,20 +681,20 @@ if(qdel_after) QDEL_IN(src, 30) -/obj/screen/splash/Destroy() +/atom/movable/screen/splash/Destroy() if(holder) holder.screen -= src holder = null return ..() -/obj/screen/component_button - var/obj/screen/parent +/atom/movable/screen/component_button + var/atom/movable/screen/parent -/obj/screen/component_button/Initialize(mapload, obj/screen/parent) +/atom/movable/screen/component_button/Initialize(mapload, atom/movable/screen/parent) . = ..() src.parent = parent -/obj/screen/component_button/Click(params) +/atom/movable/screen/component_button/Click(params) if(parent) parent.component_click(src, params) diff --git a/code/_onclick/hud/screen_objects/clickdelay.dm b/code/_onclick/hud/screen_objects/clickdelay.dm index e0ad039cdf..c62f051c1a 100644 --- a/code/_onclick/hud/screen_objects/clickdelay.dm +++ b/code/_onclick/hud/screen_objects/clickdelay.dm @@ -1,37 +1,37 @@ -/obj/screen/action_bar +/atom/movable/screen/action_bar -/obj/screen/action_bar/Destroy() +/atom/movable/screen/action_bar/Destroy() STOP_PROCESSING(SShuds, src) return ..() -/obj/screen/action_bar/proc/mark_dirty() +/atom/movable/screen/action_bar/proc/mark_dirty() var/mob/living/L = hud?.mymob if(L?.client && update_to_mob(L)) START_PROCESSING(SShuds, src) -/obj/screen/action_bar/process() +/atom/movable/screen/action_bar/process() var/mob/living/L = hud?.mymob if(!L?.client || !update_to_mob(L)) return PROCESS_KILL -/obj/screen/action_bar/proc/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/proc/update_to_mob(mob/living/L) return FALSE -/datum/hud/var/obj/screen/action_bar/clickdelay/clickdelay +/datum/hud/var/atom/movable/screen/action_bar/clickdelay/clickdelay -/obj/screen/action_bar/clickdelay +/atom/movable/screen/action_bar/clickdelay name = "click delay" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" layer = 20 // under hand buttons -/obj/screen/action_bar/clickdelay/Initialize() +/atom/movable/screen/action_bar/clickdelay/Initialize() . = ..() var/matrix/M = new M.Scale(2, 1) transform = M -/obj/screen/action_bar/clickdelay/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/clickdelay/update_to_mob(mob/living/L) var/estimated = L.EstimatedNextActionTime() var/diff = estimated - L.last_action var/left = estimated - world.time @@ -41,14 +41,14 @@ icon_state = "prog_bar_[round(clamp(((diff - left)/diff) * 100, 0, 100), 5)]" return TRUE -/datum/hud/var/obj/screen/action_bar/resistdelay/resistdelay +/datum/hud/var/atom/movable/screen/action_bar/resistdelay/resistdelay -/obj/screen/action_bar/resistdelay +/atom/movable/screen/action_bar/resistdelay name = "resist delay" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" -/obj/screen/action_bar/resistdelay/update_to_mob(mob/living/L) +/atom/movable/screen/action_bar/resistdelay/update_to_mob(mob/living/L) var/diff = L.next_resist - L.last_resist var/left = L.next_resist - world.time if(left < 0 || diff < 0) diff --git a/code/_onclick/hud/screen_objects/sprint.dm b/code/_onclick/hud/screen_objects/sprint.dm index 326bb81745..f8760ddd85 100644 --- a/code/_onclick/hud/screen_objects/sprint.dm +++ b/code/_onclick/hud/screen_objects/sprint.dm @@ -1,19 +1,19 @@ -/obj/screen/mov_intent +/atom/movable/screen/mov_intent icon = 'modular_citadel/icons/ui/screen_midnight.dmi' -/obj/screen/sprintbutton +/atom/movable/screen/sprintbutton name = "toggle sprint" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "act_sprint" layer = ABOVE_HUD_LAYER - 0.1 var/mutable_appearance/flashy -/obj/screen/sprintbutton/Click() +/atom/movable/screen/sprintbutton/Click() if(ishuman(usr)) var/mob/living/carbon/human/H = usr H.default_toggle_sprint() -/obj/screen/sprintbutton/update_icon_state() +/atom/movable/screen/sprintbutton/update_icon_state() var/mob/living/user = hud?.mymob if(!istype(user)) return @@ -24,7 +24,7 @@ else icon_state = "act_sprint" -/obj/screen/sprintbutton/update_overlays() +/atom/movable/screen/sprintbutton/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!istype(user) || !user.client) @@ -38,20 +38,20 @@ . += flashy //Sprint buffer onscreen code. -/datum/hud/var/obj/screen/sprint_buffer/sprint_buffer +/datum/hud/var/atom/movable/screen/sprint_buffer/sprint_buffer -/obj/screen/sprint_buffer +/atom/movable/screen/sprint_buffer name = "sprint buffer" icon = 'icons/effects/progessbar.dmi' icon_state = "prog_bar_100" -/obj/screen/sprint_buffer/Click() +/atom/movable/screen/sprint_buffer/Click() if(isliving(usr)) var/mob/living/L = usr to_chat(L, "Your sprint buffer's maximum capacity is [L.sprint_buffer_max]. It is currently at [L.sprint_buffer], regenerating at [L.sprint_buffer_regen_ds * 10] per second. \ Sprinting while this is empty will incur a [L.sprint_stamina_cost] stamina cost per tile.") -/obj/screen/sprint_buffer/proc/update_to_mob(mob/living/L) +/atom/movable/screen/sprint_buffer/proc/update_to_mob(mob/living/L) var/amount = 0 if(L.sprint_buffer_max > 0) amount = round(clamp((L.sprint_buffer / L.sprint_buffer_max) * 100, 0, 100), 5) diff --git a/code/_onclick/hud/screen_objects/stamina.dm b/code/_onclick/hud/screen_objects/stamina.dm index 98a387d32d..b4c4807ec8 100644 --- a/code/_onclick/hud/screen_objects/stamina.dm +++ b/code/_onclick/hud/screen_objects/stamina.dm @@ -1,21 +1,21 @@ -/datum/hud/var/obj/screen/staminas/staminas -/datum/hud/var/obj/screen/staminabuffer/staminabuffer +/datum/hud/var/atom/movable/screen/staminas/staminas +/datum/hud/var/atom/movable/screen/staminabuffer/staminabuffer -/obj/screen/staminas +/atom/movable/screen/staminas icon = 'modular_citadel/icons/ui/screen_gen.dmi' name = "stamina" icon_state = "stamina0" screen_loc = ui_stamina mouse_opacity = 1 -/obj/screen/staminas/Click(location,control,params) +/atom/movable/screen/staminas/Click(location,control,params) if(isliving(usr)) var/mob/living/L = usr CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) to_chat(L, "You have [L.getStaminaLoss()] stamina loss.
\
Your stamina buffer is [round((L.stamina_buffer / buffer_max) * 100, 0.1)]% full.
") -/obj/screen/staminas/update_icon_state() +/atom/movable/screen/staminas/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!user) return @@ -26,21 +26,21 @@ else icon_state = "stamina[clamp(FLOOR(user.getStaminaLoss() /20, 1), 0, 6)]" -/obj/screen/staminas/update_overlays() +/atom/movable/screen/staminas/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!user) return var/percent = user.getStaminaLoss() / STAMINA_CRIT if((user.stat == DEAD) || (user.combat_flags & COMBAT_FLAG_HARD_STAMCRIT) || (user.hal_screwyhud in 1 to 2)) - . += list("stamina_alert3") + . += list("stamina_alert3") else if(percent >= 0.85) . += list("stamina_alert2") else if(percent >= 0.7) . += list("stamina_alert1") //stam buffer -/obj/screen/staminabuffer +/atom/movable/screen/staminabuffer icon = 'modular_citadel/icons/ui/screen_gen.dmi' name = "stamina buffer" icon_state = "stambuffer0" @@ -48,19 +48,19 @@ layer = ABOVE_HUD_LAYER + 0.1 mouse_opacity = 0 -/obj/screen/staminabuffer/proc/mark_dirty() +/atom/movable/screen/staminabuffer/proc/mark_dirty() if(update_to_mob()) START_PROCESSING(SShuds, src) -/obj/screen/staminabuffer/process() +/atom/movable/screen/staminabuffer/process() if(!update_to_mob()) return PROCESS_KILL -/obj/screen/staminabuffer/Destroy() +/atom/movable/screen/staminabuffer/Destroy() STOP_PROCESSING(SShuds, src) return ..() -/obj/screen/staminabuffer/proc/update_to_mob() +/atom/movable/screen/staminabuffer/proc/update_to_mob() var/mob/living/carbon/user = hud?.mymob user.UpdateStaminaBuffer(FALSE) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/buffer_max, buffer_max) diff --git a/code/_onclick/hud/screen_objects/storage.dm b/code/_onclick/hud/screen_objects/storage.dm index 1ce1df24c6..55156d9b0d 100644 --- a/code/_onclick/hud/screen_objects/storage.dm +++ b/code/_onclick/hud/screen_objects/storage.dm @@ -1,12 +1,12 @@ -/obj/screen/storage +/atom/movable/screen/storage name = "storage" var/insertion_click = FALSE -/obj/screen/storage/Initialize(mapload, new_master) +/atom/movable/screen/storage/Initialize(mapload, new_master) . = ..() master = new_master -/obj/screen/storage/Click(location, control, params) +/atom/movable/screen/storage/Click(location, control, params) if(!insertion_click) return ..() if(hud?.mymob && (hud.mymob != usr)) @@ -18,7 +18,7 @@ master.attackby(null, I, usr, params) return TRUE -/obj/screen/storage/boxes +/atom/movable/screen/storage/boxes name = "storage" icon_state = "block" screen_loc = "7,7 to 10,8" @@ -26,83 +26,83 @@ plane = HUD_PLANE insertion_click = TRUE -/obj/screen/storage/close +/atom/movable/screen/storage/close name = "close" layer = ABOVE_HUD_LAYER plane = ABOVE_HUD_PLANE icon_state = "backpack_close" -/obj/screen/storage/close/Click() +/atom/movable/screen/storage/close/Click() var/datum/component/storage/S = master S.close(usr) return TRUE -/obj/screen/storage/left +/atom/movable/screen/storage/left icon_state = "storage_start" insertion_click = TRUE -/obj/screen/storage/right +/atom/movable/screen/storage/right icon_state = "storage_end" insertion_click = TRUE -/obj/screen/storage/continuous +/atom/movable/screen/storage/continuous icon_state = "storage_continue" insertion_click = TRUE -/obj/screen/storage/volumetric_box +/atom/movable/screen/storage/volumetric_box icon_state = "stored_continue" layer = VOLUMETRIC_STORAGE_BOX_LAYER plane = VOLUMETRIC_STORAGE_BOX_PLANE var/obj/item/our_item -/obj/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item) +/atom/movable/screen/storage/volumetric_box/Initialize(mapload, new_master, obj/item/our_item) src.our_item = our_item RegisterSignal(our_item, COMSIG_ITEM_MOUSE_ENTER, .proc/on_item_mouse_enter) RegisterSignal(our_item, COMSIG_ITEM_MOUSE_EXIT, .proc/on_item_mouse_exit) return ..() -/obj/screen/storage/volumetric_box/Destroy() +/atom/movable/screen/storage/volumetric_box/Destroy() makeItemInactive() our_item = null return ..() -/obj/screen/storage/volumetric_box/Click(location, control, params) +/atom/movable/screen/storage/volumetric_box/Click(location, control, params) return our_item.Click(location, control, params) -/obj/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/storage/volumetric_box/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) return our_item.MouseDrop(over, src_location, over_location, src_control, over_control, params) -/obj/screen/storage/volumetric_box/MouseExited(location, control, params) +/atom/movable/screen/storage/volumetric_box/MouseExited(location, control, params) makeItemInactive() -/obj/screen/storage/volumetric_box/MouseEntered(location, control, params) +/atom/movable/screen/storage/volumetric_box/MouseEntered(location, control, params) makeItemActive() -/obj/screen/storage/volumetric_box/proc/on_item_mouse_enter() +/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_enter() makeItemActive() -/obj/screen/storage/volumetric_box/proc/on_item_mouse_exit() +/atom/movable/screen/storage/volumetric_box/proc/on_item_mouse_exit() makeItemInactive() -/obj/screen/storage/volumetric_box/proc/makeItemInactive() +/atom/movable/screen/storage/volumetric_box/proc/makeItemInactive() return -/obj/screen/storage/volumetric_box/proc/makeItemActive() +/atom/movable/screen/storage/volumetric_box/proc/makeItemActive() return -/obj/screen/storage/volumetric_box/center +/atom/movable/screen/storage/volumetric_box/center icon_state = "stored_continue" - var/obj/screen/storage/volumetric_edge/stored_left/left - var/obj/screen/storage/volumetric_edge/stored_right/right - var/obj/screen/storage/item_holder/holder + var/atom/movable/screen/storage/volumetric_edge/stored_left/left + var/atom/movable/screen/storage/volumetric_edge/stored_right/right + var/atom/movable/screen/storage/item_holder/holder var/pixel_size -/obj/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) +/atom/movable/screen/storage/volumetric_box/center/Initialize(mapload, new_master, our_item) left = new(null, src, our_item) right = new(null, src, our_item) return ..() -/obj/screen/storage/volumetric_box/center/Destroy() +/atom/movable/screen/storage/volumetric_box/center/Destroy() QDEL_NULL(left) QDEL_NULL(right) vis_contents.Cut() @@ -110,13 +110,13 @@ QDEL_NULL(holder) return ..() -/obj/screen/storage/volumetric_box/center/proc/on_screen_objects() +/atom/movable/screen/storage/volumetric_box/center/proc/on_screen_objects() return list(src) /** * Sets the size of this box screen object and regenerates its left/right borders. This includes the actual border's size! */ -/obj/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) +/atom/movable/screen/storage/volumetric_box/center/proc/set_pixel_size(pixels) if(pixel_size == pixels) return pixel_size = pixels @@ -139,59 +139,59 @@ add_overlay(left) add_overlay(right) -/obj/screen/storage/volumetric_box/center/makeItemInactive() +/atom/movable/screen/storage/volumetric_box/center/makeItemInactive() if(!holder) return holder.layer = VOLUMETRIC_STORAGE_ITEM_LAYER holder.plane = VOLUMETRIC_STORAGE_ITEM_PLANE -/obj/screen/storage/volumetric_box/center/makeItemActive() +/atom/movable/screen/storage/volumetric_box/center/makeItemActive() if(!holder) return holder.our_item.layer = VOLUMETRIC_STORAGE_ACTIVE_ITEM_LAYER //make sure we display infront of the others! holder.our_item.plane = VOLUMETRIC_STORAGE_ACTIVE_ITEM_PLANE -/obj/screen/storage/volumetric_edge +/atom/movable/screen/storage/volumetric_edge layer = VOLUMETRIC_STORAGE_BOX_LAYER plane = VOLUMETRIC_STORAGE_BOX_PLANE -/obj/screen/storage/volumetric_edge/Initialize(mapload, master, our_item) +/atom/movable/screen/storage/volumetric_edge/Initialize(mapload, master, our_item) src.master = master return ..() -/obj/screen/storage/volumetric_edge/Click(location, control, params) +/atom/movable/screen/storage/volumetric_edge/Click(location, control, params) return master.Click(location, control, params) -/obj/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) +/atom/movable/screen/storage/volumetric_edge/MouseDrop(atom/over, src_location, over_location, src_control, over_control, params) return master.MouseDrop(over, src_location, over_location, src_control, over_control, params) -/obj/screen/storage/volumetric_edge/MouseExited(location, control, params) +/atom/movable/screen/storage/volumetric_edge/MouseExited(location, control, params) return master.MouseExited(location, control, params) -/obj/screen/storage/volumetric_edge/MouseEntered(location, control, params) +/atom/movable/screen/storage/volumetric_edge/MouseEntered(location, control, params) return master.MouseEntered(location, control, params) -/obj/screen/storage/volumetric_edge/stored_left +/atom/movable/screen/storage/volumetric_edge/stored_left icon_state = "stored_start" appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM // Yes I know RESET_TRANSFORM is in APPEARANCE_UI but we're hard-asserting this incase someone changes it. -/obj/screen/storage/volumetric_edge/stored_right +/atom/movable/screen/storage/volumetric_edge/stored_right icon_state = "stored_end" appearance_flags = APPEARANCE_UI | KEEP_APART | RESET_TRANSFORM -/obj/screen/storage/item_holder +/atom/movable/screen/storage/item_holder var/obj/item/our_item vis_flags = NONE -/obj/screen/storage/item_holder/Initialize(mapload, new_master, obj/item/I) +/atom/movable/screen/storage/item_holder/Initialize(mapload, new_master, obj/item/I) . = ..() our_item = I vis_contents += I -/obj/screen/storage/item_holder/Destroy() +/atom/movable/screen/storage/item_holder/Destroy() vis_contents.Cut() our_item = null return ..() -/obj/screen/storage/item_holder/Click(location, control, params) +/atom/movable/screen/storage/item_holder/Click(location, control, params) return our_item.Click(location, control, params) diff --git a/code/_onclick/hud/screen_objects/vore.dm b/code/_onclick/hud/screen_objects/vore.dm index 017f7f3485..91aa8f318c 100644 --- a/code/_onclick/hud/screen_objects/vore.dm +++ b/code/_onclick/hud/screen_objects/vore.dm @@ -1,9 +1,9 @@ -/obj/screen/voretoggle +/atom/movable/screen/voretoggle name = "toggle vore mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "nom_off" -/obj/screen/voretoggle/Click() +/atom/movable/screen/voretoggle/Click() if(usr != hud.mymob) return var/mob/living/carbon/C = usr @@ -12,7 +12,7 @@ return C.toggle_vore_mode() -/obj/screen/voretoggle/update_icon_state() +/atom/movable/screen/voretoggle/update_icon_state() var/mob/living/carbon/user = hud?.mymob if(!istype(user)) return diff --git a/code/_onclick/hud/simple_animal.dm b/code/_onclick/hud/simple_animal.dm index ef46c0d66e..2f7902c965 100644 --- a/code/_onclick/hud/simple_animal.dm +++ b/code/_onclick/hud/simple_animal.dm @@ -2,7 +2,7 @@ ui_style = 'icons/mob/screen_gen.dmi' /datum/hud/living/simple_animal/New(mob/living/owner) ..() - pull_icon = new /obj/screen/pull() + pull_icon = new /atom/movable/screen/pull() pull_icon.icon = ui_style pull_icon.update_icon() pull_icon.screen_loc = ui_living_pull @@ -10,6 +10,6 @@ static_inventory += pull_icon //mob health doll! assumes whatever sprite the mob is - healthdoll = new /obj/screen/healthdoll/living() + healthdoll = new /atom/movable/screen/healthdoll/living() healthdoll.hud = src infodisplay += healthdoll diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm index 80cc01c3b3..6aba23fab5 100644 --- a/code/_onclick/hud/swarmer.dm +++ b/code/_onclick/hud/swarmer.dm @@ -1,98 +1,98 @@ -/obj/screen/swarmer +/atom/movable/screen/swarmer icon = 'icons/mob/swarmer.dmi' -/obj/screen/swarmer/FabricateTrap +/atom/movable/screen/swarmer/FabricateTrap icon_state = "ui_trap" name = "Create trap (Costs 5 Resources)" desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" -/obj/screen/swarmer/FabricateTrap/Click() +/atom/movable/screen/swarmer/FabricateTrap/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateTrap() -/obj/screen/swarmer/Barricade +/atom/movable/screen/swarmer/Barricade icon_state = "ui_barricade" name = "Create barricade (Costs 5 Resources)" desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" -/obj/screen/swarmer/Barricade/Click() +/atom/movable/screen/swarmer/Barricade/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateBarricade() -/obj/screen/swarmer/Replicate +/atom/movable/screen/swarmer/Replicate icon_state = "ui_replicate" name = "Replicate (Costs 50 Resources)" desc = "Creates another of our kind." -/obj/screen/swarmer/Replicate/Click() +/atom/movable/screen/swarmer/Replicate/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.CreateSwarmer() -/obj/screen/swarmer/RepairSelf +/atom/movable/screen/swarmer/RepairSelf icon_state = "ui_self_repair" name = "Repair self" desc = "Repairs damage to our body." -/obj/screen/swarmer/RepairSelf/Click() +/atom/movable/screen/swarmer/RepairSelf/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.RepairSelf() -/obj/screen/swarmer/ToggleLight +/atom/movable/screen/swarmer/ToggleLight icon_state = "ui_light" name = "Toggle light" desc = "Toggles our inbuilt light on or off." -/obj/screen/swarmer/ToggleLight/Click() +/atom/movable/screen/swarmer/ToggleLight/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ToggleLight() -/obj/screen/swarmer/ContactSwarmers +/atom/movable/screen/swarmer/ContactSwarmers icon_state = "ui_contact_swarmers" name = "Contact swarmers" desc = "Sends a message to all other swarmers, should they exist." -/obj/screen/swarmer/ContactSwarmers/Click() +/atom/movable/screen/swarmer/ContactSwarmers/Click() if(isswarmer(usr)) var/mob/living/simple_animal/hostile/swarmer/S = usr S.ContactSwarmers() /datum/hud/swarmer/New(mob/owner) ..() - var/obj/screen/using + var/atom/movable/screen/using - using = new /obj/screen/swarmer/FabricateTrap() + using = new /atom/movable/screen/swarmer/FabricateTrap() using.screen_loc = ui_hand_position(2) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Barricade() + using = new /atom/movable/screen/swarmer/Barricade() using.screen_loc = ui_hand_position(1) using.hud = src static_inventory += using - using = new /obj/screen/swarmer/Replicate() + using = new /atom/movable/screen/swarmer/Replicate() using.screen_loc = ui_zonesel using.hud = src static_inventory += using - using = new /obj/screen/swarmer/RepairSelf() + using = new /atom/movable/screen/swarmer/RepairSelf() using.screen_loc = ui_storage1 using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ToggleLight() + using = new /atom/movable/screen/swarmer/ToggleLight() using.screen_loc = ui_back using.hud = src static_inventory += using - using = new /obj/screen/swarmer/ContactSwarmers() + using = new /atom/movable/screen/swarmer/ContactSwarmers() using.screen_loc = ui_inventory using.hud = src static_inventory += using diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index faf911e55b..1618e351ec 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -257,7 +257,7 @@ if(!isnull(stagger_force)) return stagger_force /// totally not an untested, arbitrary equation. - return clamp((1.5 + (w_class/5)) * ((force_override || force) / 1.5), 0, 10 SECONDS) + return clamp((1.5 + (w_class/5)) * ((force_override || force) / 1.5), 0, 10 SECONDS) * CONFIG_GET(number/melee_stagger_factor) /obj/item/proc/do_stagger_action(mob/living/target, mob/living/user, force_override) if(!CHECK_BITFIELD(target.status_flags, CANSTAGGER)) diff --git a/code/controllers/configuration/entries/admin.dm b/code/controllers/configuration/entries/admin.dm new file mode 100644 index 0000000000..3b5b437742 --- /dev/null +++ b/code/controllers/configuration/entries/admin.dm @@ -0,0 +1,64 @@ +/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/protect_legacy_admins //Stops any admins loaded by the legacy system from having their rank edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/protect_legacy_ranks //Stops any ranks loaded by the legacy system from having their flags edited by the permissions panel + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/mentors_mobname_only + +/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/forbid_singulo_possession + +/datum/config_entry/flag/see_own_notes //Can players see their own admin notes + +/datum/config_entry/number/note_fresh_days + config_entry_value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/number/note_stale_days + config_entry_value = null + min_val = 0 + integer = FALSE + +/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/announce_admin_logout + +/datum/config_entry/flag/announce_admin_login + +/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API + +/datum/config_entry/flag/autoadmin // if autoadmin is enabled + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/string/autoadmin_rank // the rank for autoadmins + config_entry_value = "Game Master" + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour + +/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set + +/datum/config_entry/flag/guest_jobban + +/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. + protection = CONFIG_ENTRY_LOCKED + +/datum/config_entry/flag/guest_ban + +/datum/config_entry/flag/automute_on //enables automuting/spam prevention + +/datum/config_entry/flag/debug_admin_hrefs diff --git a/code/controllers/configuration/entries/alert.dm b/code/controllers/configuration/entries/alert.dm new file mode 100644 index 0000000000..6177c602db --- /dev/null +++ b/code/controllers/configuration/entries/alert.dm @@ -0,0 +1,26 @@ +/datum/config_entry/string/alert_green + config_entry_value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." + +/datum/config_entry/string/alert_blue_upto + config_entry_value = "The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted." + +/datum/config_entry/string/alert_blue_downto + config_entry_value = "Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted." + +/datum/config_entry/string/alert_amber_upto + config_entry_value = "There are significant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised." + +/datum/config_entry/string/alert_amber_downto + config_entry_value = "The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored." + +/datum/config_entry/string/alert_red_upto + config_entry_value = "There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted." + +/datum/config_entry/string/alert_red_downto + config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force." + +/datum/config_entry/string/alert_delta + config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." + +/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. + config_entry_value = 3 diff --git a/code/controllers/configuration/entries/antag_rep.dm b/code/controllers/configuration/entries/antag_rep.dm new file mode 100644 index 0000000000..c34eef4159 --- /dev/null +++ b/code/controllers/configuration/entries/antag_rep.dm @@ -0,0 +1,17 @@ +/datum/config_entry/flag/use_antag_rep // see game_options.txt for details + +/datum/config_entry/number/antag_rep_maximum + config_entry_value = 200 + min_val = 0 + +/datum/config_entry/number/default_antag_tickets + config_entry_value = 100 + min_val = 0 + +/datum/config_entry/number/max_tickets_per_roll + config_entry_value = 100 + min_val = 0 + +/datum/config_entry/keyed_list/antag_rep + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/connections.dm b/code/controllers/configuration/entries/connections.dm new file mode 100644 index 0000000000..acdf588e5a --- /dev/null +++ b/code/controllers/configuration/entries/connections.dm @@ -0,0 +1,106 @@ +/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting + +/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker + +/datum/config_entry/string/panic_bunker_message + config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players." + +/datum/config_entry/string/panic_server_name + +/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) + return str_val != "\[Put the name here\]" && ..() + +/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players + +/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) + return str_val != "byond://address:port" && ..() + +/datum/config_entry/number/max_bunker_days + config_entry_value = 7 + min_val = 1 + +/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player + min_val = -1 + +/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account + min_val = 0 + +/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? + config_entry_value = TRUE + +/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? + +/datum/config_entry/flag/check_randomizer + +/datum/config_entry/string/ipintel_email + +/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) + return str_val != "ch@nge.me" && ..() + +/datum/config_entry/number/ipintel_rating_bad + config_entry_value = 1 + integer = FALSE + min_val = 0 + max_val = 1 + +/datum/config_entry/number/ipintel_save_good + config_entry_value = 12 + min_val = 0 + +/datum/config_entry/number/ipintel_save_bad + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/string/ipintel_domain + config_entry_value = "check.getipintel.net" + +/datum/config_entry/flag/aggressive_changelog + +/datum/config_entry/flag/allow_webclient + +/datum/config_entry/flag/webclient_only_byond_members + +/datum/config_entry/number/client_warn_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/number/client_warn_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/string/client_warn_message + config_entry_value = "Your version of byond may have issues or be blocked from accessing this server in the future." + +/datum/config_entry/flag/client_warn_popup + +/datum/config_entry/number/client_error_version + config_entry_value = null + min_val = 500 + +/datum/config_entry/string/client_error_message + config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." + +/datum/config_entry/number/client_error_build + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/soft_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/hard_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/extreme_popcap + config_entry_value = null + min_val = 0 + +/datum/config_entry/string/soft_popcap_message + config_entry_value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." + +/datum/config_entry/string/hard_popcap_message + config_entry_value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." + +/datum/config_entry/string/extreme_popcap_message + config_entry_value = "The server is currently serving a high number of users, find alternative servers." diff --git a/code/controllers/configuration/entries/debris.dm b/code/controllers/configuration/entries/debris.dm new file mode 100644 index 0000000000..1cc2c2d7b7 --- /dev/null +++ b/code/controllers/configuration/entries/debris.dm @@ -0,0 +1,16 @@ +/// Amount of dirtyness tiles need to spawn dirt. +/datum/config_entry/number/turf_dirt_threshold + config_entry_value = 100 + min_val = 1 + integer = TRUE + +/// Alpha dirt starts at +/datum/config_entry/number/dirt_alpha_starting + config_entry_value = 127 + max_val = 255 + min_val = 0 + integer = TRUE + +/// Dirtyness multiplier for making turfs dirty +/datum/config_entry/number/turf_dirty_multiplier + config_entry_value = 1 diff --git a/code/controllers/configuration/entries/fetish_content.dm b/code/controllers/configuration/entries/fetish_content.dm new file mode 100644 index 0000000000..1de796a11d --- /dev/null +++ b/code/controllers/configuration/entries/fetish_content.dm @@ -0,0 +1,45 @@ +/datum/config_entry/keyed_list/breasts_cups_prefs + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + config_entry_value = list("a", "b", "c", "d", "e") //keep these lowercase + +/datum/config_entry/number/penis_min_inches_prefs + config_entry_value = 1 + min_val = 0 + +/datum/config_entry/number/penis_max_inches_prefs + config_entry_value = 20 + min_val = 0 + +/datum/config_entry/keyed_list/safe_visibility_toggles + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. + +//Body size configs, the feature will be disabled if both min and max have the same value. +/datum/config_entry/number/body_size_min + config_entry_value = 0.9 + min_val = 0.1 //to avoid issues with zeros and negative values. + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +/datum/config_entry/number/body_size_max + config_entry_value = 1.25 + min_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//Penalties given to characters with a body size smaller than this value, +//to compensate for their smaller hitbox. +//To disable, just make sure the value is lower than 'body_size_min' +/datum/config_entry/number/threshold_body_size_penalty + config_entry_value = RESIZE_DEFAULT_SIZE + min_val = 0 + max_val = RESIZE_DEFAULT_SIZE + integer = FALSE + +//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. +//doesn't apply to floating or crawling mobs +/datum/config_entry/number/body_size_slowdown_multiplier + config_entry_value = 0 + min_val = 0 + integer = FALSE diff --git a/code/controllers/configuration/entries/game_options.dm b/code/controllers/configuration/entries/game_options.dm deleted file mode 100644 index 76a5f5060c..0000000000 --- a/code/controllers/configuration/entries/game_options.dm +++ /dev/null @@ -1,610 +0,0 @@ -/datum/config_entry/number_list/repeated_mode_adjust - -/datum/config_entry/keyed_list/probability - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/probability/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/chaos_level - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/max_pop - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/max_pop/ValidateListEntry(key_name) - return key_name in config.modes - -/datum/config_entry/keyed_list/min_pop - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/continuous // which roundtypes continue if all antagonists die - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/continuous/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/midround_antag // which roundtypes use the midround antagonist system - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/force_antag_count - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/force_antag_count/ValidateListEntry(key_name, key_value) - return key_name in config.modes - -/datum/config_entry/keyed_list/policy - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_TEXT - -/datum/config_entry/number/damage_multiplier - config_entry_value = 1 - integer = FALSE - -/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. - min_val = 0 - -/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. - -/datum/config_entry/flag/assistants_have_maint_access - -/datum/config_entry/flag/security_has_maint_access - -/datum/config_entry/flag/everyone_has_maint_access - -/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts - -/datum/config_entry/flag/force_random_names - -/datum/config_entry/flag/humans_need_surnames - -/datum/config_entry/flag/allow_ai // allow ai job - -/datum/config_entry/flag/allow_ai_multicam //whether the AI can use their multicam - -/datum/config_entry/flag/disable_human_mood - -/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down? - -/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules - -/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. - -/datum/config_entry/flag/disable_peaceborg - -/datum/config_entry/flag/economy //money money money money money money money money money money money money - -/datum/config_entry/number/minimum_secborg_alert //Minimum alert level for secborgs to be chosen. - config_entry_value = 3 - -/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors - config_entry_value = 6 - min_val = 1 - -/datum/config_entry/number/brother_scaling_coeff //how many players per brother team - config_entry_value = 25 - min_val = 1 - -/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings - config_entry_value = 6 - min_val = 1 - -/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult - config_entry_value = 6 - integer = FALSE - min_val = 1 - -/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions - config_entry_value = 8 - min_val = 1 - -/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team - config_entry_value = 15 - min_val = 1 - -/datum/config_entry/number/traitor_objectives_amount - config_entry_value = 2 - min_val = 0 - -/datum/config_entry/number/brother_objectives_amount - config_entry_value = 2 - min_val = 0 - -/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors - -/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other - -/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other - -/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff - -/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling - -/datum/config_entry/flag/use_antag_rep // see game_options.txt for details - -/datum/config_entry/number/antag_rep_maximum - config_entry_value = 200 - min_val = 0 - -/datum/config_entry/number/default_antag_tickets - config_entry_value = 100 - min_val = 0 - -/datum/config_entry/number/max_tickets_per_roll - config_entry_value = 100 - min_val = 0 - -/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) - config_entry_value = 60 - min_val = 0 - -/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist - config_entry_value = 0.7 - integer = FALSE - min_val = 0 - max_val = 1 - -/datum/config_entry/number/suicide_reenter_round_timer - config_entry_value = 30 - min_val = 0 - -/datum/config_entry/number/roundstart_suicide_time_limit - config_entry_value = 30 - min_val = 0 - -/datum/config_entry/number/shuttle_refuel_delay - config_entry_value = 12000 - min_val = 0 - -/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen - -/datum/config_entry/keyed_list/roundstart_races //races you can play as from the get go. - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game - -/datum/config_entry/flag/no_summon_guns //No - -/datum/config_entry/flag/no_summon_magic //Fun - -/datum/config_entry/flag/no_summon_events //Allowed - -/datum/config_entry/flag/no_summon_traumas //! - -/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. - -/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station - config_entry_value = 55 - min_val = 30 - -/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join - -/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join - -/datum/config_entry/string/alert_green - config_entry_value = "All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced." - -/datum/config_entry/string/alert_blue_upto - config_entry_value = "The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted." - -/datum/config_entry/string/alert_blue_downto - config_entry_value = "Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted." - -/datum/config_entry/string/alert_amber_upto - config_entry_value = "There are significant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised." - -/datum/config_entry/string/alert_amber_downto - config_entry_value = "The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored." - -/datum/config_entry/string/alert_red_upto - config_entry_value = "There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted." - -/datum/config_entry/string/alert_red_downto - config_entry_value = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force." - -/datum/config_entry/string/alert_delta - config_entry_value = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill." - -/datum/config_entry/flag/revival_pod_plants - -/datum/config_entry/flag/revival_cloning - -/datum/config_entry/number/revival_brain_life - config_entry_value = -1 - min_val = -1 - -/datum/config_entry/flag/ooc_during_round - -/datum/config_entry/flag/emojis - -/datum/config_entry/keyed_list/multiplicative_movespeed - key_mode = KEY_MODE_TYPE - value_mode = VALUE_MODE_NUM - abstract_type = /datum/config_entry/keyed_list/multiplicative_movespeed - -/datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() - . = ..() - if(.) - update_config_movespeed_type_lookup(TRUE) - -/datum/config_entry/keyed_list/multiplicative_movespeed/vv_edit_var(var_name, var_value) - . = ..() - if(. && (var_name == NAMEOF(src, config_entry_value))) - update_config_movespeed_type_lookup(TRUE) - -/datum/config_entry/keyed_list/multiplicative_movespeed/normal - name = "multiplicative_movespeed" - config_entry_value = list( //DEFAULTS - /mob/living/simple_animal = 1, - /mob/living/silicon/pai = 1, - /mob/living/carbon/alien/humanoid/sentinel = 0.25, - /mob/living/carbon/alien/humanoid/drone = 0.5, - /mob/living/carbon/alien/humanoid/royal/praetorian = 1, - /mob/living/carbon/alien/humanoid/royal/queen = 3 - ) - -/datum/config_entry/keyed_list/multiplicative_movespeed/floating - name = "multiplicative_movespeed_floating" - config_entry_value = list( - /mob/living = 0, - /mob/living/carbon/alien/humanoid = 0, - /mob/living/carbon/alien/humanoid/royal/praetorian = 0, - /mob/living/carbon/alien/humanoid/royal/queen = 2 - ) - -/datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. - abstract_type = /datum/config_entry/number/movedelay - integer = FALSE - -/datum/config_entry/number/movedelay/ValidateAndSet() - . = ..() - if(.) - update_mob_config_movespeeds() - -/datum/config_entry/number/movedelay/vv_edit_var(var_name, var_value) - . = ..() - if(. && (var_name == NAMEOF(src, config_entry_value))) - update_mob_config_movespeeds() - -/datum/config_entry/number/movedelay/run_delay - -/datum/config_entry/number/movedelay/run_delay/ValidateAndSet() - . = ..() - var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run) - M.sync() - -/datum/config_entry/number/movedelay/walk_delay - -/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet() - . = ..() - var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) - M.sync() - -/datum/config_entry/flag/sprint_enabled - config_entry_value = TRUE - -/datum/config_entry/flag/sprint_enabled/ValidateAndSet(str_val) - . = ..() - for(var/datum/hud/human/H) - H.assert_move_intent_ui() - if(!config_entry_value) // disabled - for(var/mob/living/L in world) - L.disable_intentional_sprint_mode() - -/datum/config_entry/number/movedelay/sprint_speed_increase - config_entry_value = 1 - -/datum/config_entry/number/movedelay/sprint_max_tiles_increase - config_entry_value = 5 - -/datum/config_entry/number/movedelay/sprint_absolute_max_tiles - config_entry_value = 13 - -/datum/config_entry/number/movedelay/sprint_buffer_max - config_entry_value = 24 - -/datum/config_entry/number/movedelay/sprint_stamina_cost - config_entry_value = 1.4 - -/datum/config_entry/number/movedelay/sprint_buffer_regen_per_ds - config_entry_value = 0.4 - -/////////////////////////////////////////////////Outdated move delay -/datum/config_entry/number/outdated_movedelay - deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed/normal - abstract_type = /datum/config_entry/number/outdated_movedelay - - var/movedelay_type - -/datum/config_entry/number/outdated_movedelay/DeprecationUpdate(value) - return "[movedelay_type] [value]" - -/datum/config_entry/number/outdated_movedelay/human_delay - movedelay_type = /mob/living/carbon/human -/datum/config_entry/number/outdated_movedelay/robot_delay - movedelay_type = /mob/living/silicon/robot -/datum/config_entry/number/outdated_movedelay/monkey_delay - movedelay_type = /mob/living/carbon/monkey -/datum/config_entry/number/outdated_movedelay/alien_delay - movedelay_type = /mob/living/carbon/alien -/datum/config_entry/number/outdated_movedelay/slime_delay - movedelay_type = /mob/living/simple_animal/slime -/datum/config_entry/number/outdated_movedelay/animal_delay - movedelay_type = /mob/living/simple_animal -///////////////////////////////////////////////// - -/datum/config_entry/flag/roundstart_away //Will random away mission be loaded. - -/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded? - -/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. - config_entry_value = 18000 - min_val = 0 - -/datum/config_entry/flag/ghost_interaction - -/datum/config_entry/flag/silent_ai -/datum/config_entry/flag/silent_borg - -/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff - -/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. - config_entry_value = 0 - min_val = 0 - max_val = 3 - -/datum/config_entry/number/silicon_max_law_amount - config_entry_value = 12 - min_val = 0 - -/datum/config_entry/keyed_list/random_laws - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - -/datum/config_entry/keyed_list/law_weight - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - splitter = "," - -/datum/config_entry/number/overflow_cap - config_entry_value = -1 - min_val = -1 - -/datum/config_entry/string/overflow_job - config_entry_value = "Assistant" - -/datum/config_entry/flag/starlight -/datum/config_entry/flag/grey_assistants - -/datum/config_entry/number/lavaland_budget - config_entry_value = 60 - min_val = 0 - -/datum/config_entry/number/space_budget - config_entry_value = 16 - min_val = 0 - -/datum/config_entry/number/icemoon_budget - config_entry_value = 90 - integer = FALSE - min_val = 0 - -/datum/config_entry/number/station_space_budget - config_entry_value = 10 - min_val = 0 - -/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set - -/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts - config_entry_value = 1 - min_val = 0 - integer = FALSE - -/datum/config_entry/number/events_min_players_mul - config_entry_value = 1 - min_val = 0 - integer = FALSE - -/datum/config_entry/number/mice_roundstart - config_entry_value = 10 - min_val = 0 - -/datum/config_entry/number/bombcap - config_entry_value = 14 - min_val = 4 - -/datum/config_entry/number/bombcap/ValidateAndSet(str_val) - . = ..() - if(.) - GLOB.MAX_EX_DEVESTATION_RANGE = round(config_entry_value / 4) - GLOB.MAX_EX_HEAVY_RANGE = round(config_entry_value / 2) - GLOB.MAX_EX_LIGHT_RANGE = config_entry_value - GLOB.MAX_EX_FLASH_RANGE = config_entry_value - GLOB.MAX_EX_FLAME_RANGE = config_entry_value - -/datum/config_entry/number/emergency_shuttle_autocall_threshold - min_val = 0 - max_val = 1 - integer = FALSE - -/datum/config_entry/flag/ic_printing - -/datum/config_entry/flag/roundstart_traits - -/datum/config_entry/flag/enable_night_shifts - -/datum/config_entry/number/night_shift_public_areas_only - config_entry_value = NIGHTSHIFT_AREA_PUBLIC - -/datum/config_entry/flag/nightshift_toggle_requires_auth - config_entry_value = FALSE - -/datum/config_entry/flag/nightshift_toggle_public_requires_auth - config_entry_value = TRUE - -/datum/config_entry/flag/randomize_shift_time - -/datum/config_entry/flag/shift_time_realtime - -/datum/config_entry/keyed_list/antag_rep - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/job_threat - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/keyed_list/antag_threat - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - -/datum/config_entry/number/monkeycap - config_entry_value = 64 - min_val = 0 - -/datum/config_entry/number/ratcap - config_entry_value = 64 - min_val = 0 - -/datum/config_entry/flag/disable_stambuffer - -/datum/config_entry/keyed_list/box_random_engine - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_NUM - lowercase = FALSE - splitter = "," - -/datum/config_entry/flag/pai_custom_holoforms - -/datum/config_entry/number/marauder_delay_non_reebe - config_entry_value = 1800 - min_val = 0 - -/datum/config_entry/flag/allow_clockwork_marauder_on_station - config_entry_value = TRUE - -/datum/config_entry/flag/modetier_voting - -/datum/config_entry/flag/must_be_readied_to_vote_gamemode - -/datum/config_entry/number/dropped_modes - config_entry_value = 3 - -/datum/config_entry/flag/suicide_allowed - -/datum/config_entry/keyed_list/breasts_cups_prefs - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - config_entry_value = list("a", "b", "c", "d", "e") //keep these lowercase - -/datum/config_entry/number/penis_min_inches_prefs - config_entry_value = 1 - min_val = 0 - -/datum/config_entry/number/penis_max_inches_prefs - config_entry_value = 20 - min_val = 0 - -/datum/config_entry/keyed_list/safe_visibility_toggles - key_mode = KEY_MODE_TEXT - value_mode = VALUE_MODE_FLAG - config_entry_value = list(GEN_VISIBLE_NO_CLOTHES, GEN_VISIBLE_NO_UNDIES, GEN_VISIBLE_NEVER) //refer to cit_helpers for all toggles. - -//Body size configs, the feature will be disabled if both min and max have the same value. -/datum/config_entry/number/body_size_min - config_entry_value = 0.9 - min_val = 0.1 //to avoid issues with zeros and negative values. - max_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -/datum/config_entry/number/body_size_max - config_entry_value = 1.25 - min_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -//Penalties given to characters with a body size smaller than this value, -//to compensate for their smaller hitbox. -//To disable, just make sure the value is lower than 'body_size_min' -/datum/config_entry/number/threshold_body_size_penalty - config_entry_value = RESIZE_DEFAULT_SIZE - min_val = 0 - max_val = RESIZE_DEFAULT_SIZE - integer = FALSE - -//multiplicative slowdown multiplier. See 'dna.update_body_size' for the operation. -//doesn't apply to floating or crawling mobs -/datum/config_entry/number/body_size_slowdown_multiplier - config_entry_value = 0 - min_val = 0 - integer = FALSE - -//Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. -/datum/config_entry/flag/allow_custom_skintones - -///Initial loadout points -/datum/config_entry/number/initial_gear_points - config_entry_value = 10 - -/** - * Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. - * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. - */ -/datum/config_entry/flag/use_field_of_vision - -//Shuttle size limiter -/datum/config_entry/number/max_shuttle_count - config_entry_value = 6 - -/datum/config_entry/number/max_shuttle_size - config_entry_value = 500 - -//wound config stuff (increases the max injury roll, making injuries more likely) -/datum/config_entry/number/wound_exponent - config_entry_value = WOUND_DAMAGE_EXPONENT - min_val = 0 - integer = FALSE - -//adds a set amount to any injury rolls on a limb using get_damage() multiplied by this number -/datum/config_entry/number/wound_damage_multiplier - config_entry_value = 0.333 - min_val = 0 - integer = FALSE - -/// Amount of dirtyness tiles need to spawn dirt. -/datum/config_entry/number/turf_dirt_threshold - config_entry_value = 100 - min_val = 1 - integer = TRUE - -/// Alpha dirt starts at -/datum/config_entry/number/dirt_alpha_starting - config_entry_value = 127 - max_val = 255 - min_val = 0 - integer = TRUE - -/// Dirtyness multiplier for making turfs dirty -/datum/config_entry/number/turf_dirty_multiplier - config_entry_value = 1 - -/datum/config_entry/flag/weigh_by_recent_chaos - -/datum/config_entry/number/chaos_exponent - config_entry_value = 1 diff --git a/code/controllers/configuration/entries/gamemodes.dm b/code/controllers/configuration/entries/gamemodes.dm new file mode 100644 index 0000000000..f11c6dd5f5 --- /dev/null +++ b/code/controllers/configuration/entries/gamemodes.dm @@ -0,0 +1,94 @@ +/datum/config_entry/number_list/repeated_mode_adjust + +/datum/config_entry/flag/weigh_by_recent_chaos + +/datum/config_entry/number/chaos_exponent + config_entry_value = 1 + +/datum/config_entry/keyed_list/probability + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/probability/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/chaos_level + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/chaos_level/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/max_pop + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/max_pop/ValidateListEntry(key_name) + return key_name in config.modes + +/datum/config_entry/keyed_list/min_pop + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/min_pop/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/continuous // which roundtypes continue if all antagonists die + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/continuous/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/midround_antag // which roundtypes use the midround antagonist system + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/midround_antag/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/keyed_list/force_antag_count + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/force_antag_count/ValidateListEntry(key_name, key_value) + return key_name in config.modes + +/datum/config_entry/number/traitor_scaling_coeff //how much does the amount of players get divided by to determine traitors + config_entry_value = 6 + min_val = 1 + +/datum/config_entry/number/brother_scaling_coeff //how many players per brother team + config_entry_value = 25 + min_val = 1 + +/datum/config_entry/number/changeling_scaling_coeff //how much does the amount of players get divided by to determine changelings + config_entry_value = 6 + min_val = 1 + +/datum/config_entry/number/ecult_scaling_coeff //how much does the amount of players get divided by to determine e_cult + config_entry_value = 6 + integer = FALSE + min_val = 1 + +/datum/config_entry/number/security_scaling_coeff //how much does the amount of players get divided by to determine open security officer positions + config_entry_value = 8 + min_val = 1 + +/datum/config_entry/number/abductor_scaling_coeff //how many players per abductor team + config_entry_value = 15 + min_val = 1 + +/datum/config_entry/number/traitor_objectives_amount + config_entry_value = 2 + min_val = 0 + +/datum/config_entry/number/brother_objectives_amount + config_entry_value = 2 + min_val = 0 + +/datum/config_entry/flag/protect_roles_from_antagonist //If security and such can be traitor/cult/other + +/datum/config_entry/flag/protect_assistant_from_antagonist //If assistants can be traitor/cult/other + +/datum/config_entry/flag/allow_latejoin_antagonists // If late-joining players can be traitor/changeling diff --git a/code/controllers/configuration/entries/general.dm b/code/controllers/configuration/entries/general.dm index 63da60d7b5..8ecd7c0c60 100644 --- a/code/controllers/configuration/entries/general.dm +++ b/code/controllers/configuration/entries/general.dm @@ -1,21 +1,3 @@ -/datum/config_entry/flag/auto_profile // Automatically start profiler on server start - -/datum/config_entry/flag/autoadmin // if autoadmin is enabled - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/autoadmin_rank // the rank for autoadmins - config_entry_value = "Game Master" - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/servername // server name (the name of the game window) - -/datum/config_entry/string/servertagline - config_entry_value = "We forgot to set the server's tagline in config.txt" - -/datum/config_entry/string/serversqlname // short form server name used for the DB - -/datum/config_entry/string/stationname // station name (the name of the station in-game) - /datum/config_entry/number/lobby_countdown // In between round countdown. config_entry_value = 120 min_val = 0 @@ -24,164 +6,11 @@ config_entry_value = 25 min_val = 0 -/datum/config_entry/flag/hub // if the game appears on the hub or not - -/datum/config_entry/flag/allow_admin_ooccolor // Allows admins with relevant permissions to have their own ooc colour - -/datum/config_entry/flag/allow_vote_restart // allow votes to restart - -/datum/config_entry/flag/allow_vote_mode // allow votes to change mode - -/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) - config_entry_value = 6000 - min_val = 0 - -/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) - config_entry_value = 600 - min_val = 0 - -/// Length of time before the first autotransfer vote is called (deciseconds, default 2 hours) -/// Set to 0 to disable the subsystem altogether. -/datum/config_entry/number/vote_autotransfer_initial - config_entry_value = 72000 - min_val = 0 - -///length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes) -/datum/config_entry/number/vote_autotransfer_interval - config_entry_value = 18000 - min_val = 0 - -/// maximum extensions until the round autoends. -/// Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. -/// Set to -1 to disable the maximum extensions cap. -/datum/config_entry/number/vote_autotransfer_maximum - config_entry_value = 4 - min_val = -1 - -/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart - -/datum/config_entry/flag/no_dead_vote // dead people can't vote /datum/config_entry/flag/allow_metadata // Metadata is supported. -/datum/config_entry/flag/popup_admin_pm // adminPMs to non-admins show in a pop-up 'reply' window when set - -/datum/config_entry/number/fps - config_entry_value = 20 - min_val = 1 - max_val = 100 //byond will start crapping out at 50, so this is just ridic - var/sync_validate = FALSE - -/datum/config_entry/number/fps/ValidateAndSet(str_val) - . = ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] - if(!TL.sync_validate) - TL.ValidateAndSet(10 / config_entry_value) - sync_validate = FALSE - -/datum/config_entry/number/ticklag - integer = FALSE - var/sync_validate = FALSE - -/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps - var/datum/config_entry/CE = /datum/config_entry/number/fps - config_entry_value = 10 / initial(CE.config_entry_value) - ..() - -/datum/config_entry/number/ticklag/ValidateAndSet(str_val) - . = text2num(str_val) > 0 && ..() - if(.) - sync_validate = TRUE - var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] - if(!FPS.sync_validate) - FPS.ValidateAndSet(10 / config_entry_value) - sync_validate = FALSE - /datum/config_entry/flag/allow_holidays -/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling - config_entry_value = TICK_LIMIT_MC_INIT_DEFAULT - min_val = 0 //oranges warned us - integer = FALSE - -/datum/config_entry/flag/admin_legacy_system //Defines whether the server uses the legacy admin system with admins.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/protect_legacy_admins //Stops any admins loaded by the legacy system from having their rank edited by the permissions panel - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/protect_legacy_ranks //Stops any ranks loaded by the legacy system from having their flags edited by the permissions panel - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/enable_localhost_rank //Gives the !localhost! rank to any client connecting from 127.0.0.1 or ::1 - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/load_legacy_ranks_only //Loads admin ranks only from legacy admin_ranks.txt, while enabled ranks are mirrored to the database - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/mentors_mobname_only - -/datum/config_entry/flag/mentor_legacy_system //Defines whether the server uses the legacy mentor system with mentors.txt or the SQL system - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/string/hostedby - -/datum/config_entry/flag/guest_jobban - -/datum/config_entry/flag/usewhitelist - -/datum/config_entry/flag/ban_legacy_system //Defines whether the server uses the legacy banning system with the files in /data or the SQL system. - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database - -/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. - -/datum/config_entry/flag/use_exp_tracking - -/datum/config_entry/flag/use_exp_restrictions_heads - -/datum/config_entry/number/use_exp_restrictions_heads_hours - config_entry_value = 0 - min_val = 0 - -/datum/config_entry/flag/use_exp_restrictions_heads_department - -/datum/config_entry/flag/use_exp_restrictions_other - -/datum/config_entry/flag/use_exp_restrictions_admin_bypass - -/datum/config_entry/string/server - -/datum/config_entry/string/banappeals - -/datum/config_entry/string/wikiurl - config_entry_value = "https://katlin.dog/citadel-wiki" - -/datum/config_entry/string/wikiurltg - config_entry_value = "http://www.tgstation13.org/wiki" - -/datum/config_entry/string/forumurl - config_entry_value = "http://tgstation13.org/phpBB/index.php" - -/datum/config_entry/string/rulesurl - config_entry_value = "http://www.tgstation13.org/wiki/Rules" - -/datum/config_entry/string/githuburl - config_entry_value = "https://www.github.com/tgstation/-tg-station" - -/datum/config_entry/string/roundstatsurl - -/datum/config_entry/string/gamelogurl - -/datum/config_entry/number/githubrepoid - config_entry_value = null - min_val = 0 - -/datum/config_entry/flag/guest_ban - /datum/config_entry/number/id_console_jobslot_delay config_entry_value = 30 min_val = 0 @@ -208,181 +37,8 @@ /datum/config_entry/flag/load_jobs_from_txt -/datum/config_entry/flag/forbid_singulo_possession - -/datum/config_entry/flag/automute_on //enables automuting/spam prevention - -/datum/config_entry/string/panic_server_name - -/datum/config_entry/string/panic_server_name/ValidateAndSet(str_val) - return str_val != "\[Put the name here\]" && ..() - -/datum/config_entry/string/panic_server_address //Reconnect a player this linked server if this server isn't accepting new players - -/datum/config_entry/string/panic_server_address/ValidateAndSet(str_val) - return str_val != "byond://address:port" && ..() - -/datum/config_entry/string/invoke_youtubedl - protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN - /datum/config_entry/flag/show_irc_name -/datum/config_entry/flag/see_own_notes //Can players see their own admin notes - -/datum/config_entry/number/note_fresh_days - config_entry_value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/number/note_stale_days - config_entry_value = null - min_val = 0 - integer = FALSE - -/datum/config_entry/flag/maprotation - -/datum/config_entry/flag/tgstyle_maprotation - -/datum/config_entry/string/map_vote_type - config_entry_value = APPROVAL_VOTING - -/datum/config_entry/number/maprotatechancedelta - config_entry_value = 0.75 - min_val = 0 - max_val = 1 - integer = FALSE - -/datum/config_entry/number/soft_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/hard_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/extreme_popcap - config_entry_value = null - min_val = 0 - -/datum/config_entry/string/soft_popcap_message - config_entry_value = "Be warned that the server is currently serving a high number of users, consider using alternative game servers." - -/datum/config_entry/string/hard_popcap_message - config_entry_value = "The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers." - -/datum/config_entry/string/extreme_popcap_message - config_entry_value = "The server is currently serving a high number of users, find alternative servers." - -/datum/config_entry/flag/panic_bunker // prevents people the server hasn't seen before from connecting - -/datum/config_entry/number/panic_bunker_living // living time in minutes that a player needs to pass the panic bunker - -/datum/config_entry/string/panic_bunker_message - config_entry_value = "Sorry but the server is currently not accepting connections from never before seen players." - -/datum/config_entry/number/notify_new_player_age // how long do we notify admins of a new player - min_val = -1 - -/datum/config_entry/number/notify_new_player_account_age // how long do we notify admins of a new byond account - min_val = 0 - -/datum/config_entry/flag/age_verification //are we using the automated age verification which asks users if they're 18+? - config_entry_value = TRUE - -/datum/config_entry/flag/irc_first_connection_alert // do we notify the irc channel when somebody is connecting for the first time? - -/datum/config_entry/flag/check_randomizer - -/datum/config_entry/string/ipintel_email - -/datum/config_entry/string/ipintel_email/ValidateAndSet(str_val) - return str_val != "ch@nge.me" && ..() - -/datum/config_entry/number/ipintel_rating_bad - config_entry_value = 1 - integer = FALSE - min_val = 0 - max_val = 1 - -/datum/config_entry/number/ipintel_save_good - config_entry_value = 12 - min_val = 0 - -/datum/config_entry/number/ipintel_save_bad - config_entry_value = 1 - min_val = 0 - -/datum/config_entry/string/ipintel_domain - config_entry_value = "check.getipintel.net" - -/datum/config_entry/flag/aggressive_changelog - -/datum/config_entry/flag/autoconvert_notes //if all connecting player's notes should attempt to be converted to the database - protection = CONFIG_ENTRY_LOCKED - -/datum/config_entry/flag/allow_webclient - -/datum/config_entry/flag/webclient_only_byond_members - -/datum/config_entry/flag/announce_admin_logout - -/datum/config_entry/flag/announce_admin_login - -/datum/config_entry/flag/allow_map_voting - -/datum/config_entry/number/client_warn_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/number/client_warn_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/string/client_warn_message - config_entry_value = "Your version of byond may have issues or be blocked from accessing this server in the future." - -/datum/config_entry/flag/client_warn_popup - -/datum/config_entry/number/client_error_version - config_entry_value = null - min_val = 500 - -/datum/config_entry/string/client_error_message - config_entry_value = "Your version of byond is too old, may have issues, and is blocked from accessing this server." - -/datum/config_entry/number/client_error_build - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/minute_topic_limit - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/second_topic_limit - config_entry_value = null - min_val = 0 - -/datum/config_entry/number/minute_click_limit - config_entry_value = 400 - min_val = 0 - -/datum/config_entry/number/second_click_limit - config_entry_value = 15 - min_val = 0 - -/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error - config_entry_value = 600 - min_val = 0 - -/datum/config_entry/number/error_limit // How many occurrences before the next will silence them - config_entry_value = 50 - -/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for - config_entry_value = 6000 - -/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error - config_entry_value = 50 - /datum/config_entry/flag/irc_announce_new_game deprecated_by = /datum/config_entry/string/chat_announce_new_game @@ -390,54 +46,290 @@ return "" //default broadcast /datum/config_entry/string/chat_announce_new_game + config_entry_value = null -/datum/config_entry/flag/debug_admin_hrefs - -/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate - integer = FALSE - config_entry_value = 1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate - integer = FALSE - config_entry_value = 1.1 - -/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount - config_entry_value = 65 - -/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount - config_entry_value = 60 - -/datum/config_entry/number/mc_tick_rate - abstract_type = /datum/config_entry/number/mc_tick_rate - -/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) - . = ..() - if (.) - Master.UpdateTickRate() - -/datum/config_entry/flag/resume_after_initializations - -/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) - . = ..() - if(. && Master.current_runlevel) - world.sleep_offline = !config_entry_value - -/datum/config_entry/number/rounds_until_hard_restart - config_entry_value = -1 - min_val = 0 - /datum/config_entry/string/default_view config_entry_value = "15x15" /datum/config_entry/string/default_view_square config_entry_value = "15x15" -/datum/config_entry/number/max_bunker_days - config_entry_value = 7 - min_val = 1 /datum/config_entry/flag/minimaps_enabled config_entry_value = TRUE -/datum/config_entry/string/centcom_ban_db // URL for the CentCom Galactic Ban DB API + + +/datum/config_entry/number/damage_multiplier + config_entry_value = 1 + integer = FALSE + +/datum/config_entry/number/minimal_access_threshold //If the number of players is larger than this threshold, minimal access will be turned on. + min_val = 0 + +/datum/config_entry/flag/jobs_have_minimal_access //determines whether jobs use minimal access or expanded access. + +/datum/config_entry/flag/assistants_have_maint_access + +/datum/config_entry/flag/security_has_maint_access + +/datum/config_entry/flag/everyone_has_maint_access + +/datum/config_entry/flag/sec_start_brig //makes sec start in brig instead of dept sec posts + +/datum/config_entry/flag/force_random_names + +/datum/config_entry/flag/humans_need_surnames + +/datum/config_entry/flag/allow_ai // allow ai job + +/datum/config_entry/flag/allow_ai_multicam //whether the AI can use their multicam + +/datum/config_entry/flag/disable_human_mood + +/datum/config_entry/flag/disable_borg_flash_knockdown //Should borg flashes be capable of knocking humanoid entities down? + +/datum/config_entry/flag/weaken_secborg //Brings secborgs and k9s back in-line with the other borg modules + +/datum/config_entry/flag/disable_secborg // disallow secborg module to be chosen. + +/datum/config_entry/flag/disable_peaceborg + +/datum/config_entry/flag/economy //money money money money money money money money money money money money + +/datum/config_entry/flag/reactionary_explosions //If we use reactionary explosions, explosions that react to walls and doors + +/datum/config_entry/flag/enforce_human_authority //If non-human species are barred from joining as a head of staff + +/datum/config_entry/number/midround_antag_time_check // How late (in minutes you want the midround antag system to stay on, setting this to 0 will disable the system) + config_entry_value = 60 + min_val = 0 + +/datum/config_entry/number/midround_antag_life_check // A ratio of how many people need to be alive in order for the round not to immediately end in midround antagonist + config_entry_value = 0.7 + integer = FALSE + min_val = 0 + max_val = 1 + +/datum/config_entry/number/suicide_reenter_round_timer + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/roundstart_suicide_time_limit + config_entry_value = 30 + min_val = 0 + +/datum/config_entry/number/shuttle_refuel_delay + config_entry_value = 12000 + min_val = 0 + +/datum/config_entry/flag/show_game_type_odds //if set this allows players to see the odds of each roundtype on the get revision screen + +/datum/config_entry/keyed_list/roundstart_races //races you can play as from the get go. + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/flag/join_with_mutant_humans //players can pick mutant bodyparts for humans before joining the game + +/datum/config_entry/flag/no_summon_guns //No + +/datum/config_entry/flag/no_summon_magic //Fun + +/datum/config_entry/flag/no_summon_events //Allowed + +/datum/config_entry/flag/no_summon_traumas //! + +/datum/config_entry/flag/no_intercept_report //Whether or not to send a communications intercept report roundstart. This may be overridden by gamemodes. + +/datum/config_entry/number/arrivals_shuttle_dock_window //Time from when a player late joins on the arrivals shuttle to when the shuttle docks on the station + config_entry_value = 55 + min_val = 30 + +/datum/config_entry/flag/arrivals_shuttle_require_undocked //Require the arrivals shuttle to be undocked before latejoiners can join + +/datum/config_entry/flag/arrivals_shuttle_require_safe_latejoin //Require the arrivals shuttle to be operational in order for latejoiners to join + + +/datum/config_entry/flag/revival_pod_plants + +/datum/config_entry/flag/revival_cloning + +/datum/config_entry/number/revival_brain_life + config_entry_value = -1 + min_val = -1 + +/datum/config_entry/flag/ooc_during_round + +/datum/config_entry/flag/emojis + +/datum/config_entry/flag/roundstart_away //Will random away mission be loaded. + +/datum/config_entry/flag/roundstart_vr //Will virtual reality missions be loaded? + +/datum/config_entry/number/gateway_delay //How long the gateway takes before it activates. Default is half an hour. Only matters if roundstart_away is enabled. + config_entry_value = 18000 + min_val = 0 + +/datum/config_entry/flag/ghost_interaction + +/datum/config_entry/flag/silent_ai +/datum/config_entry/flag/silent_borg + +/datum/config_entry/flag/sandbox_autoclose // close the sandbox panel after spawning an item, potentially reducing griff + +/datum/config_entry/number/default_laws //Controls what laws the AI spawns with. + config_entry_value = 0 + min_val = 0 + max_val = 3 + +/datum/config_entry/number/silicon_max_law_amount + config_entry_value = 12 + min_val = 0 + +/datum/config_entry/keyed_list/random_laws + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_FLAG + +/datum/config_entry/keyed_list/law_weight + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + splitter = "," + +/datum/config_entry/number/overflow_cap + config_entry_value = -1 + min_val = -1 + +/datum/config_entry/string/overflow_job + config_entry_value = "Assistant" + +/datum/config_entry/flag/starlight +/datum/config_entry/flag/grey_assistants + +/datum/config_entry/number/lavaland_budget + config_entry_value = 60 + min_val = 0 + +/datum/config_entry/number/space_budget + config_entry_value = 16 + min_val = 0 + +/datum/config_entry/number/icemoon_budget + config_entry_value = 90 + integer = FALSE + min_val = 0 + +/datum/config_entry/number/station_space_budget + config_entry_value = 10 + min_val = 0 + +/datum/config_entry/flag/allow_random_events // Enables random events mid-round when set + +/datum/config_entry/number/events_min_time_mul // Multipliers for random events minimal starting time and minimal players amounts + config_entry_value = 1 + min_val = 0 + integer = FALSE + +/datum/config_entry/number/events_min_players_mul + config_entry_value = 1 + min_val = 0 + integer = FALSE + +/datum/config_entry/number/mice_roundstart + config_entry_value = 10 + min_val = 0 + +/datum/config_entry/number/bombcap + config_entry_value = 14 + min_val = 4 + +/datum/config_entry/number/bombcap/ValidateAndSet(str_val) + . = ..() + if(.) + GLOB.MAX_EX_DEVESTATION_RANGE = round(config_entry_value / 4) + GLOB.MAX_EX_HEAVY_RANGE = round(config_entry_value / 2) + GLOB.MAX_EX_LIGHT_RANGE = config_entry_value + GLOB.MAX_EX_FLASH_RANGE = config_entry_value + GLOB.MAX_EX_FLAME_RANGE = config_entry_value + +/datum/config_entry/number/emergency_shuttle_autocall_threshold + min_val = 0 + max_val = 1 + integer = FALSE + +/datum/config_entry/flag/ic_printing + +/datum/config_entry/flag/roundstart_traits + +/datum/config_entry/flag/enable_night_shifts + +/datum/config_entry/number/night_shift_public_areas_only + config_entry_value = NIGHTSHIFT_AREA_PUBLIC + +/datum/config_entry/flag/nightshift_toggle_requires_auth + config_entry_value = FALSE + +/datum/config_entry/flag/nightshift_toggle_public_requires_auth + config_entry_value = TRUE + +/datum/config_entry/flag/randomize_shift_time + +/datum/config_entry/flag/shift_time_realtime + +/datum/config_entry/number/monkeycap + config_entry_value = 64 + min_val = 0 + +/datum/config_entry/number/ratcap + config_entry_value = 64 + min_val = 0 + +/datum/config_entry/keyed_list/box_random_engine + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + lowercase = FALSE + splitter = "," + +/datum/config_entry/flag/pai_custom_holoforms + +/datum/config_entry/number/marauder_delay_non_reebe + config_entry_value = 1800 + min_val = 0 + +/datum/config_entry/flag/allow_clockwork_marauder_on_station + config_entry_value = TRUE + +/datum/config_entry/flag/suicide_allowed + + +//Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. +/datum/config_entry/flag/allow_custom_skintones + +///Initial loadout points +/datum/config_entry/number/initial_gear_points + config_entry_value = 10 + +/** + * Enables the FoV component, which hides objects and mobs behind the parent from their sight, unless they turn around, duh. + * Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. + */ +/datum/config_entry/flag/use_field_of_vision + +//Shuttle size limiter +/datum/config_entry/number/max_shuttle_count + config_entry_value = 6 + +/datum/config_entry/number/max_shuttle_size + config_entry_value = 500 + +//wound config stuff (increases the max injury roll, making injuries more likely) +/datum/config_entry/number/wound_exponent + config_entry_value = WOUND_DAMAGE_EXPONENT + min_val = 0 + integer = FALSE + +//adds a set amount to any injury rolls on a limb using get_damage() multiplied by this number +/datum/config_entry/number/wound_damage_multiplier + config_entry_value = 0.333 + min_val = 0 + integer = FALSE diff --git a/code/controllers/configuration/entries/jexp.dm b/code/controllers/configuration/entries/jexp.dm new file mode 100644 index 0000000000..3d9754b4a6 --- /dev/null +++ b/code/controllers/configuration/entries/jexp.dm @@ -0,0 +1,17 @@ +/datum/config_entry/flag/use_age_restriction_for_jobs //Do jobs use account age restrictions? --requires database + +/datum/config_entry/flag/use_account_age_for_jobs //Uses the time they made the account for the job restriction stuff. New player joining alerts should be unaffected. + +/datum/config_entry/flag/use_exp_tracking + +/datum/config_entry/flag/use_exp_restrictions_heads + +/datum/config_entry/number/use_exp_restrictions_heads_hours + config_entry_value = 0 + min_val = 0 + +/datum/config_entry/flag/use_exp_restrictions_heads_department + +/datum/config_entry/flag/use_exp_restrictions_other + +/datum/config_entry/flag/use_exp_restrictions_admin_bypass diff --git a/code/controllers/configuration/entries/logging.dm b/code/controllers/configuration/entries/logging.dm index 1cb47d6ab7..25ca145939 100644 --- a/code/controllers/configuration/entries/logging.dm +++ b/code/controllers/configuration/entries/logging.dm @@ -9,6 +9,7 @@ /datum/config_entry/flag/log_admin // log admin actions protection = CONFIG_ENTRY_LOCKED + config_entry_value = TRUE /datum/config_entry/flag/log_prayer // log prayers config_entry_value = TRUE @@ -68,3 +69,16 @@ /// forces log_href for tgui /datum/config_entry/flag/emergency_tgui_logging config_entry_value = FALSE + +/datum/config_entry/number/error_cooldown // The "cooldown" time for each occurrence of a unique error + config_entry_value = 600 + min_val = 0 + +/datum/config_entry/number/error_limit // How many occurrences before the next will silence them + config_entry_value = 50 + +/datum/config_entry/number/error_silence_time // How long a unique error will be silenced for + config_entry_value = 6000 + +/datum/config_entry/number/error_msg_delay // How long to wait between messaging admins about occurrences of a unique error + config_entry_value = 50 diff --git a/code/controllers/configuration/entries/movespeed.dm b/code/controllers/configuration/entries/movespeed.dm new file mode 100644 index 0000000000..b1c3818cd3 --- /dev/null +++ b/code/controllers/configuration/entries/movespeed.dm @@ -0,0 +1,124 @@ +/datum/config_entry/keyed_list/multiplicative_movespeed + key_mode = KEY_MODE_TYPE + value_mode = VALUE_MODE_NUM + abstract_type = /datum/config_entry/keyed_list/multiplicative_movespeed + +/datum/config_entry/keyed_list/multiplicative_movespeed/ValidateAndSet() + . = ..() + if(.) + update_config_movespeed_type_lookup(TRUE) + +/datum/config_entry/keyed_list/multiplicative_movespeed/vv_edit_var(var_name, var_value) + . = ..() + if(. && (var_name == NAMEOF(src, config_entry_value))) + update_config_movespeed_type_lookup(TRUE) + +/datum/config_entry/keyed_list/multiplicative_movespeed/normal + name = "multiplicative_movespeed" + config_entry_value = list( //DEFAULTS + /mob/living/simple_animal = 1, + /mob/living/silicon/pai = 1, + /mob/living/carbon/alien/humanoid/sentinel = 0.25, + /mob/living/carbon/alien/humanoid/drone = 0.5, + /mob/living/carbon/alien/humanoid/royal/praetorian = 1, + /mob/living/carbon/alien/humanoid/royal/queen = 3 + ) + +/datum/config_entry/keyed_list/multiplicative_movespeed/floating + name = "multiplicative_movespeed_floating" + config_entry_value = list( + /mob/living = 0, + /mob/living/carbon/alien/humanoid = 0, + /mob/living/carbon/alien/humanoid/royal/praetorian = 0, + /mob/living/carbon/alien/humanoid/royal/queen = 2 + ) + +/datum/config_entry/number/movedelay //Used for modifying movement speed for mobs. + abstract_type = /datum/config_entry/number/movedelay + integer = FALSE + +/datum/config_entry/number/movedelay/ValidateAndSet() + . = ..() + if(.) + update_mob_config_movespeeds() + +/datum/config_entry/number/movedelay/vv_edit_var(var_name, var_value) + . = ..() + if(. && (var_name == NAMEOF(src, config_entry_value))) + update_mob_config_movespeeds() + +/datum/config_entry/number/movedelay/run_delay + +/datum/config_entry/number/movedelay/run_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/run) + M.sync() + +/datum/config_entry/number/movedelay/walk_delay + +/datum/config_entry/number/movedelay/walk_delay/ValidateAndSet() + . = ..() + var/datum/movespeed_modifier/config_walk_run/M = get_cached_movespeed_modifier(/datum/movespeed_modifier/config_walk_run/walk) + M.sync() + +/datum/config_entry/flag/sprint_enabled + config_entry_value = TRUE + +/datum/config_entry/flag/sprint_enabled/ValidateAndSet(str_val) + . = ..() + for(var/datum/hud/human/H) + H.assert_move_intent_ui() + if(!config_entry_value) // disabled + for(var/mob/living/L in world) + L.disable_intentional_sprint_mode() + +/datum/config_entry/number/sprintless_stagger_slowdown + config_entry_value = 0 + +/datum/config_entry/number/sprintless_off_balance_slowdown + config_entry_value = 0.85 + +/datum/config_entry/number/melee_stagger_factor + config_entry_value = 1 + +/datum/config_entry/number/movedelay/sprint_speed_increase + config_entry_value = 1 + +/datum/config_entry/number/movedelay/sprint_max_tiles_increase + config_entry_value = 5 + +/datum/config_entry/number/movedelay/sprint_absolute_max_tiles + config_entry_value = 13 + +/datum/config_entry/number/movedelay/sprint_buffer_max + config_entry_value = 24 + +/datum/config_entry/number/movedelay/sprint_stamina_cost + config_entry_value = 1.4 + +/datum/config_entry/number/movedelay/sprint_buffer_regen_per_ds + config_entry_value = 0.4 + +/////////////////////////////////////////////////Outdated move delay +/datum/config_entry/number/outdated_movedelay + deprecated_by = /datum/config_entry/keyed_list/multiplicative_movespeed/normal + abstract_type = /datum/config_entry/number/outdated_movedelay + + var/movedelay_type + +/datum/config_entry/number/outdated_movedelay/DeprecationUpdate(value) + return "[movedelay_type] [value]" + +/datum/config_entry/number/outdated_movedelay/human_delay + movedelay_type = /mob/living/carbon/human +/datum/config_entry/number/outdated_movedelay/robot_delay + movedelay_type = /mob/living/silicon/robot +/datum/config_entry/number/outdated_movedelay/monkey_delay + movedelay_type = /mob/living/carbon/monkey +/datum/config_entry/number/outdated_movedelay/alien_delay + movedelay_type = /mob/living/carbon/alien +/datum/config_entry/number/outdated_movedelay/slime_delay + movedelay_type = /mob/living/simple_animal/slime +/datum/config_entry/number/outdated_movedelay/animal_delay + movedelay_type = /mob/living/simple_animal +///////////////////////////////////////////////// diff --git a/code/controllers/configuration/entries/policy.dm b/code/controllers/configuration/entries/policy.dm index de611e1813..ea8973a4ce 100644 --- a/code/controllers/configuration/entries/policy.dm +++ b/code/controllers/configuration/entries/policy.dm @@ -3,9 +3,9 @@ config_entry_value = 300 integer = TRUE -/datum/config_entry/keyed_list/policyconfig +/datum/config_entry/keyed_list/policy key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_TEXT -/datum/config_entry/keyed_list/policyconfig/preprocess_key(key) +/datum/config_entry/keyed_list/policy/preprocess_key(key) return uppertext(..()) diff --git a/code/controllers/configuration/entries/fail2topic.dm b/code/controllers/configuration/entries/security.dm similarity index 62% rename from code/controllers/configuration/entries/fail2topic.dm rename to code/controllers/configuration/entries/security.dm index 7ed09b378a..3a49c97d70 100644 --- a/code/controllers/configuration/entries/fail2topic.dm +++ b/code/controllers/configuration/entries/security.dm @@ -9,7 +9,6 @@ protection = CONFIG_ENTRY_LOCKED //affects physical server configuration, no touchies!! /datum/config_entry/flag/fail2topic_enabled - config_entry_value = TRUE /datum/config_entry/number/topic_max_size config_entry_value = 8192 @@ -17,3 +16,19 @@ /datum/config_entry/keyed_list/topic_rate_limit_whitelist key_mode = KEY_MODE_TEXT value_mode = VALUE_MODE_FLAG + +/datum/config_entry/number/minute_topic_limit + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/second_topic_limit + config_entry_value = null + min_val = 0 + +/datum/config_entry/number/minute_click_limit + config_entry_value = 400 + min_val = 0 + +/datum/config_entry/number/second_click_limit + config_entry_value = 15 + min_val = 0 diff --git a/code/controllers/configuration/entries/server.dm b/code/controllers/configuration/entries/server.dm new file mode 100644 index 0000000000..1acf8a11ca --- /dev/null +++ b/code/controllers/configuration/entries/server.dm @@ -0,0 +1,90 @@ +/datum/config_entry/flag/auto_profile // Automatically start profiler on server start + +/datum/config_entry/string/servername // server name (the name of the game window) + +/datum/config_entry/string/servertagline + config_entry_value = "We forgot to set the server's tagline in config.txt" + +/datum/config_entry/string/serversqlname // short form server name used for the DB + +/datum/config_entry/string/stationname // station name (the name of the station in-game) + +/datum/config_entry/number/fps + config_entry_value = 20 + min_val = 1 + max_val = 100 //byond will start crapping out at 50, so this is just ridic + var/sync_validate = FALSE + +/datum/config_entry/number/fps/ValidateAndSet(str_val) + . = ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/ticklag/TL = config.entries_by_type[/datum/config_entry/number/ticklag] + if(!TL.sync_validate) + TL.ValidateAndSet(10 / config_entry_value) + sync_validate = FALSE + +/datum/config_entry/number/ticklag + integer = FALSE + var/sync_validate = FALSE + +/datum/config_entry/number/ticklag/New() //ticklag weirdly just mirrors fps + var/datum/config_entry/CE = /datum/config_entry/number/fps + config_entry_value = 10 / initial(CE.config_entry_value) + ..() + +/datum/config_entry/number/ticklag/ValidateAndSet(str_val) + . = text2num(str_val) > 0 && ..() + if(.) + sync_validate = TRUE + var/datum/config_entry/number/fps/FPS = config.entries_by_type[/datum/config_entry/number/fps] + if(!FPS.sync_validate) + FPS.ValidateAndSet(10 / config_entry_value) + sync_validate = FALSE + +/datum/config_entry/number/tick_limit_mc_init //SSinitialization throttling + config_entry_value = TICK_LIMIT_MC_INIT_DEFAULT + min_val = 0 //oranges warned us + integer = FALSE + +/datum/config_entry/flag/usewhitelist + +/datum/config_entry/string/hostedby + +/datum/config_entry/flag/hub // if the game appears on the hub or not + +/datum/config_entry/string/invoke_youtubedl + protection = CONFIG_ENTRY_LOCKED | CONFIG_ENTRY_HIDDEN + +/datum/config_entry/number/mc_tick_rate/base_mc_tick_rate + integer = FALSE + config_entry_value = 1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_tick_rate + integer = FALSE + config_entry_value = 1.1 + +/datum/config_entry/number/mc_tick_rate/high_pop_mc_mode_amount + config_entry_value = 65 + +/datum/config_entry/number/mc_tick_rate/disable_high_pop_mc_mode_amount + config_entry_value = 60 + +/datum/config_entry/number/mc_tick_rate + abstract_type = /datum/config_entry/number/mc_tick_rate + +/datum/config_entry/number/mc_tick_rate/ValidateAndSet(str_val) + . = ..() + if (.) + Master.UpdateTickRate() + +/datum/config_entry/flag/resume_after_initializations + +/datum/config_entry/flag/resume_after_initializations/ValidateAndSet(str_val) + . = ..() + if(. && Master.current_runlevel) + world.sleep_offline = !config_entry_value + +/datum/config_entry/number/rounds_until_hard_restart + config_entry_value = -1 + min_val = 0 diff --git a/code/controllers/configuration/entries/stamina_combat.dm b/code/controllers/configuration/entries/stamina_combat.dm index 65580899f1..681b903286 100644 --- a/code/controllers/configuration/entries/stamina_combat.dm +++ b/code/controllers/configuration/entries/stamina_combat.dm @@ -12,11 +12,7 @@ /// Base regeneration per second /datum/config_entry/number/stamina_combat/base_regeneration - config_entry_value = 0.5 - -/// Combat mode regeneration per second -/datum/config_entry/number/stamina_combat/combat_regeneration - config_entry_value = 5 + config_entry_value = 3.5 /// After out_of_combat_timer elapses, additionally regenerate this percent of total stamina per second. Unaffected by combat mode. /datum/config_entry/number/stamina_combat/percent_regeneration_out_of_combat @@ -33,3 +29,5 @@ /// Factor to multiply by for stamina usage past buffer into health /datum/config_entry/number/stamina_combat/overdraw_penalty_factor config_entry_value = 1.5 + +/datum/config_entry/flag/disable_stambuffer diff --git a/code/controllers/configuration/entries/threat.dm b/code/controllers/configuration/entries/threat.dm new file mode 100644 index 0000000000..3a3e03e149 --- /dev/null +++ b/code/controllers/configuration/entries/threat.dm @@ -0,0 +1,7 @@ +/datum/config_entry/keyed_list/job_threat + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM + +/datum/config_entry/keyed_list/antag_threat + key_mode = KEY_MODE_TEXT + value_mode = VALUE_MODE_NUM diff --git a/code/controllers/configuration/entries/urls.dm b/code/controllers/configuration/entries/urls.dm new file mode 100644 index 0000000000..fe82574da0 --- /dev/null +++ b/code/controllers/configuration/entries/urls.dm @@ -0,0 +1,26 @@ +/datum/config_entry/string/server + +/datum/config_entry/string/banappeals + +/datum/config_entry/string/wikiurl + config_entry_value = "https://katlin.dog/citadel-wiki" + +/datum/config_entry/string/wikiurltg + config_entry_value = "http://www.tgstation13.org/wiki" + +/datum/config_entry/string/forumurl + config_entry_value = "http://tgstation13.org/phpBB/index.php" + +/datum/config_entry/string/rulesurl + config_entry_value = "http://www.tgstation13.org/wiki/Rules" + +/datum/config_entry/string/githuburl + config_entry_value = "https://www.github.com/tgstation/-tg-station" + +/datum/config_entry/string/roundstatsurl + +/datum/config_entry/string/gamelogurl + +/datum/config_entry/number/githubrepoid + config_entry_value = null + min_val = 0 diff --git a/code/controllers/configuration/entries/vote.dm b/code/controllers/configuration/entries/vote.dm new file mode 100644 index 0000000000..545fd01e3c --- /dev/null +++ b/code/controllers/configuration/entries/vote.dm @@ -0,0 +1,55 @@ +/datum/config_entry/flag/allow_vote_restart // allow votes to restart + +/datum/config_entry/flag/allow_vote_mode // allow votes to change mode + +/datum/config_entry/number/vote_delay // minimum time between voting sessions (deciseconds, 10 minute default) + config_entry_value = 6000 + min_val = 0 + +/datum/config_entry/number/vote_period // length of voting period (deciseconds, default 1 minute) + config_entry_value = 600 + min_val = 0 + +/// Length of time before the first autotransfer vote is called (deciseconds, default 2 hours) +/// Set to 0 to disable the subsystem altogether. +/datum/config_entry/number/vote_autotransfer_initial + config_entry_value = 72000 + min_val = 0 + +///length of time to wait before subsequent autotransfer votes (deciseconds, default 30 minutes) +/datum/config_entry/number/vote_autotransfer_interval + config_entry_value = 18000 + min_val = 0 + +/// maximum extensions until the round autoends. +/// Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. +/// Set to -1 to disable the maximum extensions cap. +/datum/config_entry/number/vote_autotransfer_maximum + config_entry_value = 4 + min_val = -1 + +/datum/config_entry/flag/default_no_vote // vote does not default to nochange/norestart + +/datum/config_entry/flag/no_dead_vote // dead people can't vote + +/datum/config_entry/flag/maprotation + +/datum/config_entry/flag/tgstyle_maprotation + +/datum/config_entry/string/map_vote_type + config_entry_value = APPROVAL_VOTING + +/datum/config_entry/number/maprotatechancedelta + config_entry_value = 0.75 + min_val = 0 + max_val = 1 + integer = FALSE + +/datum/config_entry/flag/allow_map_voting + +/datum/config_entry/flag/modetier_voting + +/datum/config_entry/number/dropped_modes + config_entry_value = 3 + +/datum/config_entry/flag/must_be_readied_to_vote_gamemode diff --git a/code/controllers/subsystem/acid.dm b/code/controllers/subsystem/acid.dm deleted file mode 100644 index 25d080a1b1..0000000000 --- a/code/controllers/subsystem/acid.dm +++ /dev/null @@ -1,37 +0,0 @@ -SUBSYSTEM_DEF(acid) - name = "Acid" - priority = FIRE_PRIORITY_ACID - flags = SS_NO_INIT|SS_BACKGROUND - runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME - - var/list/currentrun = list() - var/list/processing = list() - -/datum/controller/subsystem/acid/stat_entry(msg) - msg = "P:[length(processing)]" - return ..() - - -/datum/controller/subsystem/acid/fire(resumed = 0) - if (!resumed) - src.currentrun = processing.Copy() - - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - - while (currentrun.len) - var/obj/O = currentrun[currentrun.len] - currentrun.len-- - if (!O || QDELETED(O)) - processing -= O - if (MC_TICK_CHECK) - return - continue - - if(O.acid_level && O.acid_processing()) - else - O.update_icon() - processing -= O - - if (MC_TICK_CHECK) - return diff --git a/code/controllers/subsystem/activity.dm b/code/controllers/subsystem/activity.dm index 0a8d248e58..d10e67f210 100644 --- a/code/controllers/subsystem/activity.dm +++ b/code/controllers/subsystem/activity.dm @@ -11,6 +11,7 @@ SUBSYSTEM_DEF(activity) /datum/controller/subsystem/activity/Initialize(timeofday) RegisterSignal(SSdcs,COMSIG_GLOB_EXPLOSION,.proc/on_explosion) RegisterSignal(SSdcs,COMSIG_GLOB_MOB_DEATH,.proc/on_death) + return ..() /datum/controller/subsystem/activity/fire(resumed = 0) calculate_threat() @@ -54,7 +55,10 @@ SUBSYSTEM_DEF(activity) var/weight = (text2num(threat_history[i+1])-text2num(threat_history[i])) total_weight += weight total_amt += weight * (threat_history[threat_history[i]]) - return round(total_amt / total_weight,0.1) + if(total_weight == 0) + return total_amt + else + return round(total_amt / total_weight,0.1) /datum/controller/subsystem/activity/proc/get_max_threat() . = 0 diff --git a/code/controllers/subsystem/adjacent_air.dm b/code/controllers/subsystem/adjacent_air.dm index e93db07775..99ee587826 100644 --- a/code/controllers/subsystem/adjacent_air.dm +++ b/code/controllers/subsystem/adjacent_air.dm @@ -20,6 +20,9 @@ SUBSYSTEM_DEF(adjacent_air) return ..() /datum/controller/subsystem/adjacent_air/fire(resumed = FALSE, mc_check = TRUE) + if(SSair.thread_running()) + pause() + return var/list/queue = src.queue diff --git a/code/controllers/subsystem/air.dm b/code/controllers/subsystem/air.dm index 3c58c90452..583cf98259 100644 --- a/code/controllers/subsystem/air.dm +++ b/code/controllers/subsystem/air.dm @@ -9,24 +9,36 @@ SUBSYSTEM_DEF(air) var/cost_turfs = 0 var/cost_groups = 0 var/cost_highpressure = 0 + var/cost_deferred_airs var/cost_hotspots = 0 + var/cost_post_process = 0 var/cost_superconductivity = 0 var/cost_pipenets = 0 var/cost_rebuilds = 0 var/cost_atmos_machinery = 0 var/cost_equalize = 0 + var/thread_wait_ticks = 0 + var/cur_thread_wait_ticks = 0 + + var/low_pressure_turfs = 0 + var/high_pressure_turfs = 0 + + var/num_group_turfs_processed = 0 + var/num_equalize_processed = 0 var/list/hotspots = list() var/list/networks = list() var/list/pipenets_needing_rebuilt = list() + var/list/deferred_airs = list() + var/max_deferred_airs = 0 var/list/obj/machinery/atmos_machinery = list() + var/list/obj/machinery/atmos_air_machinery = list() var/list/pipe_init_dirs_cache = list() //atmos singletons var/list/gas_reactions = list() //Special functions lists - var/list/turf/active_super_conductivity = list() var/list/turf/open/high_pressure_delta = list() @@ -34,54 +46,88 @@ SUBSYSTEM_DEF(air) var/currentpart = SSAIR_REBUILD_PIPENETS var/map_loading = TRUE - var/list/queued_for_activation var/log_explosive_decompression = TRUE // If things get spammy, admemes can turn this off. - var/monstermos_turf_limit = 10 - var/monstermos_hard_turf_limit = 2000 - var/monstermos_enabled = TRUE + // Max number of turfs equalization will grab. + var/equalize_turf_limit = 10 + // Max number of turfs to look for a space turf, and max number of turfs that will be decompressed. + var/equalize_hard_turf_limit = 2000 + // Whether equalization should be enabled at all. + var/equalize_enabled = TRUE + // Whether turf-to-turf heat exchanging should be enabled. + var/heat_enabled = FALSE + // Max number of times process_turfs will share in a tick. + var/share_max_steps = 3 + // Excited group processing will try to equalize groups with total pressure difference less than this amount. + var/excited_group_pressure_goal = 1 /datum/controller/subsystem/air/stat_entry(msg) msg += "C:{" - msg += "EQ:[round(cost_equalize,1)]|" - msg += "AT:[round(cost_turfs,1)]|" - msg += "EG:[round(cost_groups,1)]|" msg += "HP:[round(cost_highpressure,1)]|" msg += "HS:[round(cost_hotspots,1)]|" + msg += "HE:[round(heat_process_time(),1)]|" msg += "SC:[round(cost_superconductivity,1)]|" msg += "PN:[round(cost_pipenets,1)]|" msg += "AM:[round(cost_atmos_machinery,1)]" msg += "} " - var/active_turfs_len = get_amt_active_turfs() - msg += "AT:[active_turfs_len]|" - msg += "EG:[get_amt_excited_groups()]|" + msg += "TC:{" + msg += "AT:[round(cost_turfs,1)]|" + msg += "EG:[round(cost_groups,1)]|" + msg += "EQ:[round(cost_equalize,1)]|" + msg += "PO:[round(cost_post_process,1)]" + msg += "}" + msg += "TH:[round(thread_wait_ticks,1)]|" msg += "HS:[hotspots.len]|" msg += "PN:[networks.len]|" msg += "HP:[high_pressure_delta.len]|" - msg += "AS:[active_super_conductivity.len]|" + msg += "HT:[high_pressure_turfs]|" + msg += "LT:[low_pressure_turfs]|" + msg += "ET:[num_equalize_processed]|" + msg += "GT:[num_group_turfs_processed]|" + msg += "DF:[max_deferred_airs]|" msg += "GA:[get_amt_gas_mixes()]|" - msg += "MG:[get_max_gas_mixes()]|" - msg += "AT/MS:[round((cost ? active_turfs_len/cost : 0),0.1)]" + msg += "MG:[get_max_gas_mixes()]" return ..() /datum/controller/subsystem/air/Initialize(timeofday) - extools_update_ssair() map_loading = FALSE setup_allturfs() setup_atmos_machinery() setup_pipenets() gas_reactions = init_gas_reactions() - extools_update_reactions() + auxtools_update_reactions() return ..() /datum/controller/subsystem/air/proc/extools_update_ssair() -/datum/controller/subsystem/air/proc/extools_update_reactions() + +/datum/controller/subsystem/air/proc/auxtools_update_reactions() + +/proc/reset_all_air() + SSair.can_fire = 0 + message_admins("Air reset begun.") + for(var/turf/open/T in world) + T.Initalize_Atmos(0) + CHECK_TICK + message_admins("Air reset done.") + SSair.can_fire = 1 + +/datum/controller/subsystem/air/proc/thread_running() + return FALSE + +/proc/fix_corrupted_atmos() + +/datum/admins/proc/fixcorruption() + set category = "Debug" + set desc="Fixes air that has weird NaNs (-1.#IND and such). Hopefully." + set name="Fix Infinite Air" + fix_corrupted_atmos() /datum/controller/subsystem/air/fire(resumed = 0) var/timer = TICK_USAGE_REAL if(currentpart == SSAIR_REBUILD_PIPENETS) + timer = TICK_USAGE_REAL var/list/pipenet_rebuilds = pipenets_needing_rebuilt for(var/thing in pipenet_rebuilds) var/obj/machinery/atmospherics/AT = thing @@ -96,13 +142,14 @@ SUBSYSTEM_DEF(air) currentpart = SSAIR_PIPENETS if(currentpart == SSAIR_PIPENETS || !resumed) + timer = TICK_USAGE_REAL process_pipenets(resumed) cost_pipenets = MC_AVERAGE(cost_pipenets, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 currentpart = SSAIR_ATMOSMACHINERY - + // This is only machinery like filters, mixers that don't interact with air if(currentpart == SSAIR_ATMOSMACHINERY) timer = TICK_USAGE_REAL process_atmos_machinery(resumed) @@ -110,33 +157,6 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = monstermos_enabled ? SSAIR_EQUALIZE : SSAIR_ACTIVETURFS - - if(currentpart == SSAIR_EQUALIZE) - timer = TICK_USAGE_REAL - process_turf_equalize(resumed) - cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_ACTIVETURFS - - if(currentpart == SSAIR_ACTIVETURFS) - timer = TICK_USAGE_REAL - process_active_turfs(resumed) - cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 - currentpart = SSAIR_EXCITEDGROUPS - - if(currentpart == SSAIR_EXCITEDGROUPS) - timer = TICK_USAGE_REAL - process_excited_groups(resumed) - cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) - if(state != SS_RUNNING) - return - resumed = 0 currentpart = SSAIR_HIGHPRESSURE if(currentpart == SSAIR_HIGHPRESSURE) @@ -146,6 +166,34 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 + currentpart = SSAIR_FINALIZE_TURFS + // This literally just waits for the turf processing thread to finish, doesn't do anything else. + // this is necessary cause the next step after this interacts with the air--we get consistency + // issues if we don't wait for it, disappearing gases etc. + if(currentpart == SSAIR_FINALIZE_TURFS) + finish_turf_processing(resumed) + if(state != SS_RUNNING) + cur_thread_wait_ticks++ + return + resumed = 0 + thread_wait_ticks = MC_AVERAGE(thread_wait_ticks, cur_thread_wait_ticks) + cur_thread_wait_ticks = 0 + currentpart = SSAIR_DEFERRED_AIRS + if(currentpart == SSAIR_DEFERRED_AIRS) + timer = TICK_USAGE_REAL + process_deferred_airs(resumed) + cost_deferred_airs = MC_AVERAGE(cost_deferred_airs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_ATMOSMACHINERY_AIR + if(currentpart == SSAIR_ATMOSMACHINERY_AIR) + timer = TICK_USAGE_REAL + process_atmos_air_machinery(resumed) + cost_atmos_machinery = MC_AVERAGE(cost_atmos_machinery, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 currentpart = SSAIR_HOTSPOTS if(currentpart == SSAIR_HOTSPOTS) @@ -155,19 +203,58 @@ SUBSYSTEM_DEF(air) if(state != SS_RUNNING) return resumed = 0 - currentpart = SSAIR_SUPERCONDUCTIVITY - - if(currentpart == SSAIR_SUPERCONDUCTIVITY) + currentpart = heat_enabled ? SSAIR_TURF_CONDUCTION : SSAIR_ACTIVETURFS + // Heat -- slow and of questionable usefulness. Off by default for this reason. Pretty cool, though. + if(currentpart == SSAIR_TURF_CONDUCTION) timer = TICK_USAGE_REAL - process_super_conductivity(resumed) + if(process_turf_heat(TICK_REMAINING_MS)) + pause() cost_superconductivity = MC_AVERAGE(cost_superconductivity, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) if(state != SS_RUNNING) return resumed = 0 + currentpart = SSAIR_ACTIVETURFS + // This simply starts the turf thread. It runs in the background until the FINALIZE_TURFS step, at which point it's waited for. + // This also happens to do all the commented out stuff below, all in a single separate thread. This is mostly so that the + // waiting is consistent. + if(currentpart == SSAIR_ACTIVETURFS) + timer = TICK_USAGE_REAL + process_turfs(resumed) + cost_turfs = MC_AVERAGE(cost_turfs, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + /* + // Monstermos and/or Putnamos--making large pressure deltas move faster + if(currentpart == SSAIR_EQUALIZE) + timer = TICK_USAGE_REAL + process_turf_equalize(resumed) + cost_equalize = MC_AVERAGE(cost_equalize, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_EXCITEDGROUPS + // Making small pressure deltas equalize immediately so they don't process anymore + if(currentpart == SSAIR_EXCITEDGROUPS) + timer = TICK_USAGE_REAL + process_excited_groups(resumed) + cost_groups = MC_AVERAGE(cost_groups, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_TURF_POST_PROCESS + // Quick multithreaded "should we display/react?" checks followed by finishing those up before the next step + if(currentpart == SSAIR_TURF_POST_PROCESS) + timer = TICK_USAGE_REAL + post_process_turfs(resumed) + cost_post_process = MC_AVERAGE(cost_post_process, TICK_DELTA_TO_MS(TICK_USAGE_REAL - timer)) + if(state != SS_RUNNING) + return + resumed = 0 + currentpart = SSAIR_HOTSPOTS + */ currentpart = SSAIR_REBUILD_PIPENETS - - /datum/controller/subsystem/air/proc/process_pipenets(resumed = 0) if (!resumed) src.currentrun = networks.Copy() @@ -187,6 +274,31 @@ SUBSYSTEM_DEF(air) if(istype(atmos_machine, /obj/machinery/atmospherics)) pipenets_needing_rebuilt += atmos_machine +/datum/controller/subsystem/air/proc/process_deferred_airs(resumed = 0) + max_deferred_airs = max(deferred_airs.len,max_deferred_airs) + while(deferred_airs.len) + var/list/cur_op = deferred_airs[deferred_airs.len] + deferred_airs.len-- + var/datum/gas_mixture/air1 + var/datum/gas_mixture/air2 + if(isopenturf(cur_op[1])) + var/turf/open/T = cur_op[1] + air1 = T.return_air() + else + air1 = cur_op[1] + if(isopenturf(cur_op[2])) + var/turf/open/T = cur_op[2] + air2 = T.return_air() + else + air2 = cur_op[2] + if(istype(cur_op[3], /datum/callback)) + var/datum/callback/cb = cur_op[3] + cb.Invoke(air1, air2) + else + air1.transfer_ratio_to(air2, cur_op[3]) + if(MC_TICK_CHECK) + return + /datum/controller/subsystem/air/proc/process_atmos_machinery(resumed = 0) var/seconds = wait * 0.1 if (!resumed) @@ -201,19 +313,22 @@ SUBSYSTEM_DEF(air) if(MC_TICK_CHECK) return - -/datum/controller/subsystem/air/proc/process_super_conductivity(resumed = 0) +/datum/controller/subsystem/air/proc/process_atmos_air_machinery(resumed = 0) + var/seconds = wait * 0.1 if (!resumed) - src.currentrun = active_super_conductivity.Copy() + src.currentrun = atmos_air_machinery.Copy() //cache for sanic speed (lists are references anyways) var/list/currentrun = src.currentrun while(currentrun.len) - var/turf/T = currentrun[currentrun.len] + var/obj/machinery/M = currentrun[currentrun.len] currentrun.len-- - T.super_conduct() + if(!M || (M.process_atmos(seconds) == PROCESS_KILL)) + atmos_air_machinery.Remove(M) if(MC_TICK_CHECK) return +/datum/controller/subsystem/air/proc/process_turf_heat() + /datum/controller/subsystem/air/proc/process_hotspots(resumed = 0) if (!resumed) src.currentrun = hotspots.Copy() @@ -241,7 +356,7 @@ SUBSYSTEM_DEF(air) return /datum/controller/subsystem/air/proc/process_turf_equalize(resumed = 0) - if(process_turf_equalize_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) + if(process_turf_equalize_auxtools(resumed,TICK_REMAINING_MS)) pause() /* //cache for sanic speed @@ -260,8 +375,8 @@ SUBSYSTEM_DEF(air) return */ -/datum/controller/subsystem/air/proc/process_active_turfs(resumed = 0) - if(process_active_turfs_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) +/datum/controller/subsystem/air/proc/process_turfs(resumed = 0) + if(process_turfs_auxtools(resumed,TICK_REMAINING_MS)) pause() /* //cache for sanic speed @@ -280,75 +395,32 @@ SUBSYSTEM_DEF(air) */ /datum/controller/subsystem/air/proc/process_excited_groups(resumed = 0) - if(process_excited_groups_extools(resumed, (Master.current_ticklimit - TICK_USAGE) * 0.01 * world.tick_lag)) + if(process_excited_groups_auxtools(resumed,TICK_REMAINING_MS)) pause() - /* - if (!resumed) - src.currentrun = excited_groups.Copy() - //cache for sanic speed (lists are references anyways) - var/list/currentrun = src.currentrun - while(currentrun.len) - var/datum/excited_group/EG = currentrun[currentrun.len] - currentrun.len-- - EG.breakdown_cooldown++ - EG.dismantle_cooldown++ - if(EG.breakdown_cooldown >= EXCITED_GROUP_BREAKDOWN_CYCLES) - EG.self_breakdown() - else if(EG.dismantle_cooldown >= EXCITED_GROUP_DISMANTLE_CYCLES) - EG.dismantle() - if (MC_TICK_CHECK) - return - */ -/datum/controller/subsystem/air/proc/process_active_turfs_extools() -/datum/controller/subsystem/air/proc/process_turf_equalize_extools() -/datum/controller/subsystem/air/proc/process_excited_groups_extools() -/datum/controller/subsystem/air/proc/get_amt_excited_groups() -/datum/controller/subsystem/air/proc/get_amt_active_turfs() +/datum/controller/subsystem/air/proc/finish_turf_processing(resumed = 0) + if(finish_turf_processing_auxtools(TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/post_process_turfs(resumed = 0) + if(post_process_turfs_auxtools(resumed,TICK_REMAINING_MS)) + pause() + +/datum/controller/subsystem/air/proc/finish_turf_processing_auxtools() +/datum/controller/subsystem/air/proc/process_turfs_auxtools() +/datum/controller/subsystem/air/proc/post_process_turfs_auxtools() +/datum/controller/subsystem/air/proc/process_turf_equalize_auxtools() +/datum/controller/subsystem/air/proc/process_excited_groups_auxtools() /datum/controller/subsystem/air/proc/get_amt_gas_mixes() /datum/controller/subsystem/air/proc/get_max_gas_mixes() -/datum/controller/subsystem/air/proc/add_to_active_extools() -/datum/controller/subsystem/air/proc/remove_from_active_extools() -/datum/controller/subsystem/air/proc/get_active_turfs() -/datum/controller/subsystem/air/proc/clear_active_turfs() - -/datum/controller/subsystem/air/proc/remove_from_active(turf/open/T) - remove_from_active_extools(T) - #ifdef VISUALIZE_ACTIVE_TURFS - T.remove_atom_colour(TEMPORARY_COLOUR_PRIORITY, "#00ff00") - #endif - if(istype(T)) - T.set_excited(FALSE) - T.eg_garbage_collect() - -/datum/controller/subsystem/air/proc/add_to_active(turf/open/T, blockchanges = 1) - if(istype(T) && T.air) - #ifdef VISUALIZE_ACTIVE_TURFS - T.add_atom_colour("#00ff00", TEMPORARY_COLOUR_PRIORITY) - #endif - T.set_excited(TRUE) - add_to_active_extools(T) - if(blockchanges) - T.eg_garbage_collect() - else if(T.flags_1 & INITIALIZED_1) - for(var/turf/S in T.atmos_adjacent_turfs) - add_to_active(S) - else if(map_loading) - if(queued_for_activation) - queued_for_activation[T] = T - return - else - T.requires_activation = TRUE +/datum/controller/subsystem/air/proc/turf_process_time() +/datum/controller/subsystem/air/proc/heat_process_time() /datum/controller/subsystem/air/StartLoadingMap() - LAZYINITLIST(queued_for_activation) map_loading = TRUE /datum/controller/subsystem/air/StopLoadingMap() map_loading = FALSE - for(var/T in queued_for_activation) - add_to_active(T) - queued_for_activation.Cut() /datum/controller/subsystem/air/proc/setup_allturfs() var/list/turfs_to_init = block(locate(1, 1, 1), locate(world.maxx, world.maxy, world.maxz)) @@ -356,7 +428,6 @@ SUBSYSTEM_DEF(air) // Clear active turfs - faster than removing every single turf in the world // one-by-one, and Initalize_Atmos only ever adds `src` back in. - clear_active_turfs() for(var/thing in turfs_to_init) var/turf/T = thing @@ -364,67 +435,9 @@ SUBSYSTEM_DEF(air) continue T.Initalize_Atmos(times_fired) CHECK_TICK - var/starting_ats = get_amt_active_turfs() - if(starting_ats) - sleep(world.tick_lag) - var/timer = world.timeofday - 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).") - var/list/turfs_to_check = get_active_turfs() - for(var/T in turfs_to_check) - GLOB.active_turfs_startlist += T - - //now lets clear out these active turfs - do - var/list/new_turfs_to_check = list() - for(var/turf/open/T in turfs_to_check) - new_turfs_to_check += T.resolve_active_graph() - CHECK_TICK - for(var/T in new_turfs_to_check) - add_to_active_extools(T) - turfs_to_check = new_turfs_to_check - - while (turfs_to_check.len) - var/ending_ats = get_amt_active_turfs() - /*for(var/thing in excited_groups) - var/datum/excited_group/EG = thing - //EG.self_breakdown(space_is_all_consuming = 1) - //EG.dismantle() - CHECK_TICK*/ - - var/msg = "HEY! LISTEN! [DisplayTimeText(world.timeofday - timer)] were wasted processing [starting_ats] turf(s) (connected to [ending_ats] other turfs) with atmos differences at round start." - to_chat(world, "[msg]") - warning(msg) - -/turf/open/proc/resolve_active_graph() - . = list() - /* - var/datum/excited_group/EG = excited_group - if (blocks_air || !air) - return - if (!EG) - EG = new - EG.add_turf(src) - - for (var/turf/open/ET in atmos_adjacent_turfs) - if ( ET.blocks_air || !ET.air) - continue - - var/ET_EG = ET.excited_group - if (ET_EG) - if (ET_EG != EG) - EG.merge_groups(ET_EG) - EG = excited_group //merge_groups() may decide to replace our current EG - else - EG.add_turf(ET) - if (!ET.excited) - ET.excited = 1 - . += ET*/ - -/turf/open/space/resolve_active_graph() - return list() /datum/controller/subsystem/air/proc/setup_atmos_machinery() - for (var/obj/machinery/atmospherics/AM in atmos_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) AM.atmosinit() CHECK_TICK @@ -432,7 +445,7 @@ SUBSYSTEM_DEF(air) // all atmos machinery has to initalize before the first // pipenet can be built. /datum/controller/subsystem/air/proc/setup_pipenets() - for (var/obj/machinery/atmospherics/AM in atmos_machinery) + for (var/obj/machinery/atmospherics/AM in atmos_machinery + atmos_air_machinery) AM.build_network() CHECK_TICK @@ -460,12 +473,15 @@ SUBSYSTEM_DEF(air) return pipe_init_dirs_cache[type]["[dir]"] -/proc/get_extools_benchmarks() - #undef SSAIR_PIPENETS #undef SSAIR_ATMOSMACHINERY -#undef SSAIR_ACTIVETURFS #undef SSAIR_EXCITEDGROUPS #undef SSAIR_HIGHPRESSURE #undef SSAIR_HOTSPOTS -#undef SSAIR_SUPERCONDUCTIVITY +#undef SSAIR_TURF_CONDUCTION +#undef SSAIR_REBUILD_PIPENETS +#undef SSAIR_EQUALIZE +#undef SSAIR_ACTIVETURFS +#undef SSAIR_TURF_POST_PROCESS +#undef SSAIR_FINALIZE_TURFS +#undef SSAIR_ATMOSMACHINERY_AIR diff --git a/code/controllers/subsystem/callback.dm b/code/controllers/subsystem/callback.dm new file mode 100644 index 0000000000..21c43f3e6c --- /dev/null +++ b/code/controllers/subsystem/callback.dm @@ -0,0 +1,14 @@ +SUBSYSTEM_DEF(callbacks) + name = "Auxtools Callbacks" + flags = SS_TICKER | SS_NO_INIT + wait = 1 + priority = FIRE_PRIORITY_CALLBACKS + +/proc/process_atmos_callbacks() + SScallbacks.can_fire = 0 + SScallbacks.flags |= SS_NO_FIRE + CRASH("Auxtools not found! Callback subsystem shutting itself off.") + +/datum/controller/subsystem/callbacks/fire() + if(process_atmos_callbacks(TICK_REMAINING_MS)) + pause() diff --git a/code/controllers/subsystem/fluid.dm b/code/controllers/subsystem/fluid.dm index c4fa13d693..70903e0088 100644 --- a/code/controllers/subsystem/fluid.dm +++ b/code/controllers/subsystem/fluid.dm @@ -1,5 +1,5 @@ PROCESSING_SUBSYSTEM_DEF(fluids) name = "Fluids" - wait = 20 + wait = 10 stat_tag = "FD" //its actually Fluid Ducts - flags = SS_NO_INIT | SS_TICKER + flags = SS_NO_INIT diff --git a/code/controllers/subsystem/nightshift.dm b/code/controllers/subsystem/nightshift.dm index 78b2e63cf2..c45bd64702 100644 --- a/code/controllers/subsystem/nightshift.dm +++ b/code/controllers/subsystem/nightshift.dm @@ -42,6 +42,7 @@ SUBSYSTEM_DEF(nightshift) update_nightshift(night_time, announcing) /datum/controller/subsystem/nightshift/proc/update_nightshift(active, announce = TRUE, max_level_override) + set waitfor = FALSE nightshift_active = active if(announce) if (active) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 7096c667e1..86bd517602 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -15,7 +15,7 @@ SUBSYSTEM_DEF(parallax) /datum/controller/subsystem/parallax/PreInit() . = ..() if(prob(70)) //70% chance to pick a special extra layer - random_layer = pick(/obj/screen/parallax_layer/random/space_gas, /obj/screen/parallax_layer/random/asteroids) + random_layer = pick(/atom/movable/screen/parallax_layer/random/space_gas, /atom/movable/screen/parallax_layer/random/asteroids) random_parallax_color = pick(COLOR_TEAL, COLOR_GREEN, COLOR_YELLOW, COLOR_CYAN, COLOR_ORANGE, COLOR_PURPLE)//Special color for random_layer1. Has to be done here so everyone sees the same color. [COLOR_SILVER] planet_y_offset = rand(100, 160) planet_x_offset = rand(100, 160) diff --git a/code/controllers/subsystem/processing/processing.dm b/code/controllers/subsystem/processing/processing.dm index f5a423b353..661eafc2a5 100644 --- a/code/controllers/subsystem/processing/processing.dm +++ b/code/controllers/subsystem/processing/processing.dm @@ -47,5 +47,5 @@ SUBSYSTEM_DEF(processing) * If you override this do not call parent, as it will return PROCESS_KILL. This is done to prevent objects that dont override process() from staying in the processing list */ /datum/proc/process(delta_time) - // SHOULD_NOT_SLEEP(TRUE) + SHOULD_NOT_SLEEP(TRUE) return PROCESS_KILL diff --git a/code/controllers/subsystem/research.dm b/code/controllers/subsystem/research.dm index ac9db60ccc..946980389c 100644 --- a/code/controllers/subsystem/research.dm +++ b/code/controllers/subsystem/research.dm @@ -409,8 +409,7 @@ SUBSYSTEM_DEF(research) var/datum/techweb_node/TN = techweb_nodes[id] TN.Initialize() techweb_nodes = returned - if (!verify_techweb_nodes()) //Verify all nodes have ids and such. - stack_trace("Invalid techweb nodes detected") + verify_techweb_nodes() calculate_techweb_nodes() calculate_techweb_boost_list() if (!verify_techweb_nodes()) //Verify nodes and designs have been crosslinked properly. @@ -442,52 +441,52 @@ SUBSYSTEM_DEF(research) for(var/n in techweb_nodes) var/datum/techweb_node/N = techweb_nodes[n] if(!istype(N)) - WARNING("Invalid research node with ID [n] detected and removed.") + stack_trace("Invalid research node with ID [n] detected and removed.") techweb_nodes -= n research_node_id_error(n) . = FALSE for(var/p in N.prereq_ids) var/datum/techweb_node/P = techweb_nodes[p] if(!istype(P)) - WARNING("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research prerequisite node with ID [p] detected in node [N.display_name]\[[N.id]\] removed.") N.prereq_ids -= p research_node_id_error(p) . = FALSE for(var/d in N.design_ids) var/datum/design/D = techweb_designs[d] if(!istype(D)) - WARNING("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research design with ID [d] detected in node [N.display_name]\[[N.id]\] removed.") N.design_ids -= d design_id_error(d) . = FALSE for(var/u in N.unlock_ids) var/datum/techweb_node/U = techweb_nodes[u] if(!istype(U)) - WARNING("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") + stack_trace("Invalid research unlock node with ID [u] detected in node [N.display_name]\[[N.id]\] removed.") N.unlock_ids -= u research_node_id_error(u) . = FALSE for(var/p in N.boost_item_paths) if(!ispath(p)) N.boost_item_paths -= p - WARNING("[p] is not a valid path.") + stack_trace("[p] is not a valid path.") node_boost_error(N.id, "[p] is not a valid path.") . = FALSE var/list/points = N.boost_item_paths[p] if(islist(points)) for(var/i in points) if(!isnum(points[i])) - WARNING("[points[i]] is not a valid number.") + stack_trace("[points[i]] is not a valid number.") node_boost_error(N.id, "[points[i]] is not a valid number.") . = FALSE else if(!point_types[i]) - WARNING("[i] is not a valid point type.") + stack_trace("[i] is not a valid point type.") node_boost_error(N.id, "[i] is not a valid point type.") . = FALSE else if(!isnull(points)) N.boost_item_paths -= p node_boost_error(N.id, "No valid list.") - WARNING("No valid list.") + stack_trace("No valid list.") . = FALSE CHECK_TICK diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 889fdf35a1..6af79d4d14 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -726,6 +726,8 @@ SUBSYSTEM_DEF(shuttle) preview_shuttle.register(replace) + preview_shuttle.reset_air() + // TODO indicate to the user that success happened, rather than just // blanking the modification tab preview_shuttle = null diff --git a/code/controllers/subsystem/sun.dm b/code/controllers/subsystem/sun.dm index 746b1be7a9..dba9adac98 100644 --- a/code/controllers/subsystem/sun.dm +++ b/code/controllers/subsystem/sun.dm @@ -59,5 +59,3 @@ SUBSYSTEM_DEF(sun) /datum/controller/subsystem/sun/proc/complete_movement() SEND_SIGNAL(src, COMSIG_SUN_MOVED, primary_sun, suns) - -#undef OCCLUSION_DISTANCE diff --git a/code/controllers/subsystem/ticker.dm b/code/controllers/subsystem/ticker.dm index a7a3e87672..dfee659080 100755 --- a/code/controllers/subsystem/ticker.dm +++ b/code/controllers/subsystem/ticker.dm @@ -421,7 +421,7 @@ SUBSYSTEM_DEF(ticker) 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) + var/atom/movable/screen/splash/S = new(living.client, TRUE) S.Fade(TRUE) living.client.init_verbs() livings += living diff --git a/code/controllers/subsystem/time_track.dm b/code/controllers/subsystem/time_track.dm index 8a0a351d48..4ef740ce8e 100644 --- a/code/controllers/subsystem/time_track.dm +++ b/code/controllers/subsystem/time_track.dm @@ -31,18 +31,20 @@ SUBSYSTEM_DEF(time_track) "maptick", "num_timers", "air_turf_cost", + "air_turf_thread_time", + "air_equalize_cost", + "air_post_process_cost", "air_eg_cost", "air_highpressure_cost", "air_hotspots_cost", - "air_superconductivity_cost", + "air_heat_spread_cost", "air_pipenets_cost", "air_rebuilds_cost", - "air_turf_count", - "air_eg_count", + "air_amt_gas_mixes", + "air_alloc_gas_mixes", "air_hotspot_count", "air_network_count", "air_delta_count", - "air_superconductive_count" ) ) @@ -81,17 +83,19 @@ SUBSYSTEM_DEF(time_track) MAPTICK_LAST_INTERNAL_TICK_USAGE, length(SStimer.timer_id_dict), SSair.cost_turfs, + SSair.turf_process_time(), + SSair.cost_equalize, + SSair.cost_post_process, SSair.cost_groups, SSair.cost_highpressure, SSair.cost_hotspots, SSair.cost_superconductivity, SSair.cost_pipenets, SSair.cost_rebuilds, - SSair.get_active_turfs(), //does not return a list, which is what we want - SSair.get_amt_excited_groups(), + SSair.get_amt_gas_mixes(), + SSair.get_max_gas_mixes(), length(SSair.hotspots), length(SSair.networks), - length(SSair.high_pressure_delta), - length(SSair.active_super_conductivity) + length(SSair.high_pressure_delta) ) ) diff --git a/code/controllers/subsystem/title.dm b/code/controllers/subsystem/title.dm index 996f73ccf6..3cc3d9dd99 100644 --- a/code/controllers/subsystem/title.dm +++ b/code/controllers/subsystem/title.dm @@ -10,7 +10,7 @@ SUBSYSTEM_DEF(title) /datum/controller/subsystem/title/Initialize() if(file_path && icon) - return + return ..() if(fexists("data/previous_title.dat")) var/previous_path = file2text("data/previous_title.dat") @@ -31,15 +31,13 @@ SUBSYSTEM_DEF(title) if(length(title_screens)) file_path = "[global.config.directory]/title_screens/images/[pick(title_screens)]" - if(!file_path) + if(!file_path || !fexists(file_path)) file_path = "icons/default_title.dmi" - ASSERT(fexists(file_path)) - - icon = new(fcopy_rsc(file_path)) - - if(splash_turf) - splash_turf.icon = icon + if(fexists(file_path)) + icon = new(fcopy_rsc(file_path)) + if(splash_turf) + splash_turf.icon = icon return ..() @@ -59,7 +57,7 @@ SUBSYSTEM_DEF(title) for(var/thing in GLOB.clients) if(!thing) continue - var/obj/screen/splash/S = new(thing, FALSE) + var/atom/movable/screen/splash/S = new(thing, FALSE) S.Fade(FALSE,FALSE) /datum/controller/subsystem/title/Recover() diff --git a/code/datums/action.dm b/code/datums/action.dm index 064829f0df..1a8ea7a60f 100644 --- a/code/datums/action.dm +++ b/code/datums/action.dm @@ -11,7 +11,7 @@ var/check_flags = 0 var/required_mobility_flags = MOBILITY_USE var/processing = FALSE - var/obj/screen/movable/action_button/button = null + var/atom/movable/screen/movable/action_button/button = null var/buttontooltipstyle = "" var/transparent_when_unavailable = TRUE var/use_target_appearance = FALSE @@ -159,7 +159,7 @@ button.color = rgb(255,255,255,255) return 1 -/datum/action/proc/ApplyIcon(obj/screen/movable/action_button/current_button, force = FALSE) +/datum/action/proc/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force = FALSE) if(icon_icon && button_icon_state && ((current_button.button_icon_state != button_icon_state) || force)) current_button.cut_overlays() current_button.add_overlay(mutable_appearance(icon_icon, button_icon_state)) @@ -821,7 +821,7 @@ icon_icon = 'icons/mob/actions/actions_items.dmi' button_icon_state = "storage_gather_switch" -/datum/action/item_action/storage_gather_mode/ApplyIcon(obj/screen/movable/action_button/current_button) +/datum/action/item_action/storage_gather_mode/ApplyIcon(atom/movable/screen/movable/action_button/current_button) . = ..() var/old_layer = target.layer var/old_plane = target.plane diff --git a/code/datums/brain_damage/hypnosis.dm b/code/datums/brain_damage/hypnosis.dm index f4c4541db9..de5311943c 100644 --- a/code/datums/brain_damage/hypnosis.dm +++ b/code/datums/brain_damage/hypnosis.dm @@ -47,7 +47,7 @@ "These words keep echoing in your mind. You find yourself completely fascinated by them.")]") to_chat(owner, "You've been hypnotized by this sentence. You must follow these words. If it isn't a clear order, you can freely interpret how to do so,\ as long as you act like the words are your highest priority.") - var/obj/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /obj/screen/alert/hypnosis) + var/atom/movable/screen/alert/hypnosis/hypno_alert = owner.throw_alert("hypnosis", /atom/movable/screen/alert/hypnosis) hypno_alert.desc = "\"[hypnotic_phrase]\"... your mind seems to be fixated on this concept." ..() diff --git a/code/datums/brain_damage/severe.dm b/code/datums/brain_damage/severe.dm index 3ba00d305b..ed0a9fbab8 100644 --- a/code/datums/brain_damage/severe.dm +++ b/code/datums/brain_damage/severe.dm @@ -164,7 +164,7 @@ /datum/brain_trauma/severe/monophobia/on_life() ..() if(check_alone()) - stress = min(stress + 0.5, 100) + stress = min(stress + 0.25, 100) if(stress > 10 && (prob(5))) stress_reaction() else diff --git a/code/datums/cinematic.dm b/code/datums/cinematic.dm index 2648ae1eab..2a8a0ea98a 100644 --- a/code/datums/cinematic.dm +++ b/code/datums/cinematic.dm @@ -18,7 +18,7 @@ playing.play(watcher) qdel(playing) -/obj/screen/cinematic +/atom/movable/screen/cinematic icon = 'icons/effects/station_explosion.dmi' icon_state = "station_intact" plane = SPLASHSCREEN_PLANE @@ -32,7 +32,7 @@ var/list/watching = list() //List of clients watching this var/list/locked = list() //Who had mob_transforming set during the cinematic var/is_global = FALSE //Global cinematics will override mob-specific ones - var/obj/screen/cinematic/screen + var/atom/movable/screen/cinematic/screen var/datum/callback/special_callback //For special effects synced with animation (explosions after the countdown etc) var/cleanup_time = 300 //How long for the final screen to remain var/stop_ooc = TRUE //Turns off ooc when played globally. @@ -74,7 +74,7 @@ ooc_toggled = TRUE toggle_ooc(FALSE) - //Place /obj/screen/cinematic into everyone's screens, prevent them from moving + //Place /atom/movable/screen/cinematic into everyone's screens, prevent them from moving for(var/MM in watchers) var/mob/M = MM show_to(M, M.client) @@ -101,7 +101,7 @@ if(!C) return watching += C - M.overlay_fullscreen("cinematic",/obj/screen/fullscreen/cinematic_backdrop) + M.overlay_fullscreen("cinematic",/atom/movable/screen/fullscreen/cinematic_backdrop) C.screen += screen //Sound helper diff --git a/code/datums/components/acid.dm b/code/datums/components/acid.dm new file mode 100644 index 0000000000..2e3784dc97 --- /dev/null +++ b/code/datums/components/acid.dm @@ -0,0 +1,65 @@ +/datum/component/acid + dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS + var/level = 0 + +/datum/component/acid/Initialize(acidpwr, acid_volume) + if(!isobj(parent)) + return COMPONENT_INCOMPATIBLE + var/obj/O = parent + var/acid_cap = acidpwr * 300 + level = min(acidpwr * acid_volume, acid_cap) + START_PROCESSING(SSprocessing, src) + RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, .proc/add_acid_overlay) + if(isitem(parent)) + RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, .proc/on_attack_hand) + O.update_icon() + +/datum/component/acid/proc/on_attack_hand(datum/source, mob/user) + var/obj/item/I = parent + if(istype(I) && level > 20 && !ismob(I.loc))// so we can still remove the clothes on us that have acid. + var/mob/living/carbon/C = user + if(istype(C)) + if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF)))) + to_chat(user, "The acid on [I] burns your hand!") + var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") + if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage + C.update_damage_overlays() + +/datum/component/acid/InheritComponent(datum/component/C, i_am_original, acidpwr, acid_volume) + if(!i_am_original) + return + var/acid_cap = acidpwr * 300 + if(level < acid_cap) + if(C) + var/datum/component/acid/other = C + level = min(level + other.level, acid_cap) + else + level = min(level + acidpwr * acid_volume, acid_cap) + +/datum/component/acid/Destroy() + STOP_PROCESSING(SSprocessing, src) + var/obj/O = parent + level = 0 + O.update_overlays() + return ..() + +/datum/component/acid/process() + var/obj/O = parent + if(!istype(O)) + qdel(src) + return PROCESS_KILL + if(!(O.resistance_flags & ACID_PROOF)) + if(prob(33)) + playsound(O.loc, 'sound/items/welder.ogg', 150, 1) + O.take_damage(min(1 + round(sqrt(level)*0.3), 300), BURN, "acid", 0) + + level = max(level - (5 + 3*round(sqrt(level))), 0) + if(level <= 0) + qdel(src) + return PROCESS_KILL + else + O.update_icon() + return TRUE + +/datum/component/acid/proc/add_acid_overlay(atom/source, list/overlay_list) + overlay_list += GLOB.acid_overlay diff --git a/code/datums/components/activity.dm b/code/datums/components/activity.dm index ae18ca01a2..7c4c758d49 100644 --- a/code/datums/components/activity.dm +++ b/code/datums/components/activity.dm @@ -16,7 +16,7 @@ RegisterSignal(L, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_MOB_ATTACK_RANGED, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ATTACK_HAND, COMSIG_MOB_THROW, COMSIG_MOVABLE_TELEPORTED, COMSIG_LIVING_GUN_PROCESS_FIRE, COMSIG_MOB_APPLY_DAMAGE), .proc/minor_activity) /datum/component/activity/proc/log_activity() - historical_activity_levels[world.time] = activity_level + historical_activity_levels["[world.time]"] = activity_level /datum/component/activity/proc/minor_activity(datum/source) activity_level += 1 diff --git a/code/datums/components/combat_mode.dm b/code/datums/components/combat_mode.dm index 29d90fd509..b61ca33fb8 100644 --- a/code/datums/components/combat_mode.dm +++ b/code/datums/components/combat_mode.dm @@ -7,7 +7,7 @@ var/mode_flags = COMBAT_MODE_INACTIVE var/combatmessagecooldown var/lastmousedir - var/obj/screen/combattoggle/hud_icon + var/atom/movable/screen/combattoggle/hud_icon var/hud_loc /datum/component/combat_mode/Initialize(hud_loc = ui_combat_toggle) @@ -90,7 +90,6 @@ source.playsound_local(source, 'sound/misc/ui_toggle.ogg', 50, FALSE, pressure_affected = FALSE) //Sound from interbay! RegisterSignal(source, COMSIG_MOB_CLIENT_MOUSEMOVE, .proc/onMouseMove) RegisterSignal(source, COMSIG_MOVABLE_MOVED, .proc/on_move) - RegisterSignal(source, COMSIG_MOB_CLIENT_MOVE, .proc/on_client_move) if(hud_icon) hud_icon.combat_on = TRUE hud_icon.update_icon() @@ -115,7 +114,7 @@ to_chat(source, self_message) if(playsound) source.playsound_local(source, 'sound/misc/ui_toggleoff.ogg', 50, FALSE, pressure_affected = FALSE) //Slightly modified version of the toggleon sound! - UnregisterSignal(source, list(COMSIG_MOB_CLIENT_MOUSEMOVE, COMSIG_MOVABLE_MOVED, COMSIG_MOB_CLIENT_MOVE)) + UnregisterSignal(source, list(COMSIG_MOB_CLIENT_MOUSEMOVE, COMSIG_MOVABLE_MOVED)) if(hud_icon) hud_icon.combat_on = FALSE hud_icon.update_icon() @@ -128,11 +127,6 @@ if((mode_flags & COMBAT_MODE_ACTIVE) && L.client) L.setDir(lastmousedir, ismousemovement = TRUE) -/// Added movement delay if moving backward. -/datum/component/combat_mode/proc/on_client_move(mob/source, client/client, direction, n, oldloc, added_delay) - if(oldloc != n && direction == REVERSE_DIR(source.dir)) - client.move_delay += added_delay*0.5 - ///Changes the user direction to (try) match the pointer. /datum/component/combat_mode/proc/onMouseMove(mob/source, object, location, control, params) if(source.client.show_popup_menus) @@ -184,18 +178,18 @@ safe_disable_combat_mode(source) /// The screen button. -/obj/screen/combattoggle +/atom/movable/screen/combattoggle name = "toggle combat mode" icon = 'modular_citadel/icons/ui/screen_midnight.dmi' icon_state = "combat_off" var/mutable_appearance/flashy var/combat_on = FALSE ///Wheter combat mode is enabled or not, so we don't have to store a reference. -/obj/screen/combattoggle/Click() +/atom/movable/screen/combattoggle/Click() if(hud && usr == hud.mymob) SEND_SIGNAL(hud.mymob, COMSIG_TOGGLE_COMBAT_MODE) -/obj/screen/combattoggle/update_icon_state() +/atom/movable/screen/combattoggle/update_icon_state() var/mob/living/user = hud?.mymob if(!user) return @@ -206,7 +200,7 @@ else icon_state = "combat_off" -/obj/screen/combattoggle/update_overlays() +/atom/movable/screen/combattoggle/update_overlays() . = ..() var/mob/living/carbon/user = hud?.mymob if(!(user?.client)) diff --git a/code/datums/components/crafting/craft.dm b/code/datums/components/crafting/craft.dm deleted file mode 100644 index 3283c514b8..0000000000 --- a/code/datums/components/crafting/craft.dm +++ /dev/null @@ -1,491 +0,0 @@ -/datum/component/personal_crafting/Initialize() - if(!ismob(parent)) - return COMPONENT_INCOMPATIBLE - RegisterSignal(parent, COMSIG_MOB_CLIENT_LOGIN, .proc/create_mob_button) - -/datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL) - var/datum/hud/H = user.hud_used - var/obj/screen/craft/C = new() - C.icon = H.ui_style - H.static_inventory += C - if(!CL.prefs.widescreenpref) - C.screen_loc = ui_boxcraft - CL.screen += C - RegisterSignal(C, COMSIG_CLICK, .proc/component_ui_interact) - -/datum/component/personal_crafting - var/busy - var/viewing_category = 1 - var/viewing_subcategory = 1 - var/list/categories = list( - CAT_WEAPONRY = list( - CAT_WEAPON, - CAT_AMMO, - ), - CAT_ROBOT = CAT_NONE, - CAT_MISC = list( - CAT_MISCELLANEOUS, - CAT_TOOL, - CAT_FURNITURE, - ), - CAT_PRIMAL = CAT_NONE, - CAT_FOOD = list( - CAT_BREAD, - CAT_BURGER, - CAT_CAKE, - CAT_DONUT, - CAT_EGG, - CAT_ICE, - CAT_MEAT, - CAT_MEXICAN, - CAT_MISCFOOD, - CAT_PASTRY, - CAT_PIE, - CAT_PIZZA, - CAT_SEAFOOD, - CAT_SALAD, - CAT_SANDWICH, - CAT_SOUP, - CAT_SPAGHETTI, - ), - CAT_DRINK = CAT_NONE, - CAT_CLOTHING = CAT_NONE, - ) - - var/cur_category = CAT_NONE - var/cur_subcategory = CAT_NONE - var/datum/action/innate/crafting/button - var/display_craftable_only = FALSE - var/display_compact = TRUE - - - - -/* This is what procs do: - get_environment - gets a list of things accessable for crafting by user - get_surroundings - takes a list of things and makes a list of key-types to values-amounts of said type in the list - check_contents - takes a recipe and a key-type list and checks if said recipe can be done with available stuff - check_tools - takes recipe, a key-type list, and a user and checks if there are enough tools to do the stuff, checks bugs one level deep - construct_item - takes a recipe and a user, call all the checking procs, calls do_after, checks all the things again, calls del_reqs, creates result, calls CheckParts of said result with argument being list returned by deel_reqs - del_reqs - takes recipe and a user, loops over the recipes reqs var and tries to find everything in the list make by get_environment and delete it/add to parts list, then returns the said list -*/ - - - -/** - * Check that the contents of the recipe meet the requirements. - * - * user: The /mob that initated the crafting. - * R: The /datum/crafting_recipe being attempted. - * contents: List of items to search for R's reqs. - */ -/datum/component/personal_crafting/proc/check_contents(mob/user, datum/crafting_recipe/R, list/contents) - var/list/item_instances = contents["instances"] - contents = contents["other"] - - var/list/requirements_list = list() - - // Process all requirements - for(var/requirement_path in R.reqs) - // Check we have the appropriate amount available in the contents list - var/needed_amount = R.reqs[requirement_path] - for(var/content_item_path in contents) - // Right path and not blacklisted - if(!ispath(content_item_path, requirement_path) || R.blacklist.Find(requirement_path)) - continue - - needed_amount -= contents[content_item_path] - if(needed_amount <= 0) - break - - if(needed_amount > 0) - return FALSE - - // Store the instances of what we will use for R.check_requirements() for requirement_path - var/list/instances_list = list() - for(var/instance_path in item_instances) - if(ispath(instance_path, requirement_path)) - instances_list += item_instances[instance_path] - - requirements_list[requirement_path] = instances_list - - for(var/requirement_path in R.chem_catalysts) - if(contents[requirement_path] < R.chem_catalysts[requirement_path]) - return FALSE - - return R.check_requirements(user, requirements_list) - -/datum/component/personal_crafting/proc/get_environment(mob/user) - . = list() - for(var/obj/item/I in user.held_items) - . += I - if(!isturf(user.loc)) - return - var/list/L = block(get_step(user, SOUTHWEST), get_step(user, NORTHEAST)) - for(var/A in L) - var/turf/T = A - if(T.Adjacent(user)) - for(var/B in T) - var/atom/movable/AM = B - if(AM.flags_1 & HOLOGRAM_1) - continue - . += AM - for(var/slot in list(SLOT_R_STORE, SLOT_L_STORE)) - . += user.get_item_by_slot(slot) - -/datum/component/personal_crafting/proc/get_surroundings(mob/user) - . = list() - .["tool_behaviour"] = list() - .["other"] = list() - .["instances"] = list() - for(var/obj/item/I in get_environment(user)) - if(I.flags_1 & HOLOGRAM_1) - continue - if(.["instances"][I.type]) - .["instances"][I.type] += I - else - .["instances"][I.type] = list(I) - if(istype(I, /obj/item/stack)) - var/obj/item/stack/S = I - .["other"][I.type] += S.amount - else if(I.tool_behaviour) - .["tool_behaviour"] += I.tool_behaviour - .["other"][I.type] += 1 - else - if(istype(I, /obj/item/reagent_containers)) - var/obj/item/reagent_containers/RC = I - if(RC.is_drainable()) - for(var/datum/reagent/A in RC.reagents.reagent_list) - .["other"][A.type] += A.volume - .["other"][I.type] += 1 - -/datum/component/personal_crafting/proc/check_tools(mob/user, datum/crafting_recipe/R, list/contents) - if(!R.tools.len) - return TRUE - var/list/possible_tools = list() - var/list/present_qualities = list() - present_qualities |= contents["tool_behaviour"] - for(var/obj/item/I in user.contents) - if(istype(I, /obj/item/storage)) - for(var/obj/item/SI in I.contents) - possible_tools += SI.type - if(SI.tool_behaviour) - present_qualities.Add(SI.tool_behaviour) - - possible_tools += I.type - - if(I.tool_behaviour) - present_qualities.Add(I.tool_behaviour) - - possible_tools |= contents["other"] - - main_loop: - for(var/A in R.tools) - if(A in present_qualities) - continue - else - for(var/I in possible_tools) - if(ispath(I, A)) - continue main_loop - return FALSE - return TRUE - -/datum/component/personal_crafting/proc/construct_item(mob/user, datum/crafting_recipe/R) - var/list/contents = get_surroundings(user) - var/send_feedback = TRUE - if(check_contents(user, R, contents)) - if(check_tools(user, R, contents)) - if(do_after(user, R.time, target = user)) - contents = get_surroundings(user) - if(!check_contents(user, R, contents)) - return ", missing component." - if(!check_tools(user, R, contents)) - return ", missing tool." - var/list/parts = del_reqs(R, user) - var/atom/movable/I = new R.result (get_turf(user.loc)) - I.CheckParts(parts, R) - if(isitem(I)) - if(isfood(I)) - var/obj/item/reagent_containers/food/food_result = I - var/total_quality = 0 - var/total_items = 0 - for(var/obj/item/reagent_containers/food/ingredient in parts) - total_items += 1 - total_quality += ingredient.food_quality - if(total_items == 0) - food_result.adjust_food_quality(50) - else - food_result.adjust_food_quality(total_quality / total_items) - user.put_in_hands(I) - if(send_feedback) - SSblackbox.record_feedback("tally", "object_crafted", 1, I.type) - log_craft("[I] crafted by [user] at [loc_name(I.loc)]") - return FALSE - return "." - return ", missing tool." - return ", missing component." - - -/*Del reqs works like this: - - Loop over reqs var of the recipe - Set var amt to the value current cycle req is pointing to, its amount of type we need to delete - Get var/surroundings list of things accessable to crafting by get_environment() - Check the type of the current cycle req - If its reagent then do a while loop, inside it try to locate() reagent containers, inside such containers try to locate needed reagent, if there isnt remove thing from surroundings - If there is enough reagent in the search result then delete the needed amount, create the same type of reagent with the same data var and put it into deletion list - If there isnt enough take all of that reagent from the container, put into deletion list, substract the amt var by the volume of reagent, remove the container from surroundings list and keep searching - While doing above stuff check deletion list if it already has such reagnet, if yes merge instead of adding second one - If its stack check if it has enough amount - If yes create new stack with the needed amount and put in into deletion list, substract taken amount from the stack - If no put all of the stack in the deletion list, substract its amount from amt and keep searching - While doing above stuff check deletion list if it already has such stack type, if yes try to merge them instead of adding new one - If its anything else just locate() in in the list in a while loop, each find --s the amt var and puts the found stuff in deletion loop - - Then do a loop over parts var of the recipe - Do similar stuff to what we have done above, but now in deletion list, until the parts conditions are satisfied keep taking from the deletion list and putting it into parts list for return - - After its done loop over deletion list and delete all the shit that wasnt taken by parts loop - - del_reqs return the list of parts resulting object will receive as argument of CheckParts proc, on the atom level it will add them all to the contents, on all other levels it calls ..() and does whatever is needed afterwards but from contents list already -*/ - -/datum/component/personal_crafting/proc/del_reqs(datum/crafting_recipe/R, mob/user) - var/list/surroundings - var/list/Deletion = list() - . = list() - var/data - var/amt - main_loop: - for(var/A in R.reqs) - amt = R.reqs[A] - surroundings = get_environment(user) - surroundings -= Deletion - if(ispath(A, /datum/reagent)) - var/datum/reagent/RG = new A - var/datum/reagent/RGNT - while(amt > 0) - var/obj/item/reagent_containers/RC = locate() in surroundings - RG = RC.reagents.get_reagent(A) - if(RG) - if(!locate(RG.type) in Deletion) - Deletion += new RG.type() - if(RG.volume > amt) - RG.volume -= amt - data = RG.data - RC.reagents.conditional_update(RC) - RG = locate(RG.type) in Deletion - RG.volume = amt - RG.data += data - continue main_loop - else - surroundings -= RC - amt -= RG.volume - RC.reagents.reagent_list -= RG - RC.reagents.conditional_update(RC) - RGNT = locate(RG.type) in Deletion - RGNT.volume += RG.volume - RGNT.data += RG.data - qdel(RG) - RC.on_reagent_change() - else - surroundings -= RC - else if(ispath(A, /obj/item/stack)) - var/obj/item/stack/S - var/obj/item/stack/SD - while(amt > 0) - S = locate(A) in surroundings - if(S.amount >= amt) - if(!locate(S.type) in Deletion) - SD = new S.type() - Deletion += SD - S.use(amt) - SD = locate(S.type) in Deletion - SD.amount += amt - continue main_loop - else - amt -= S.amount - if(!locate(S.type) in Deletion) - Deletion += S - else - data = S.amount - S = locate(S.type) in Deletion - S.add(data) - surroundings -= S - else - var/atom/movable/I - while(amt > 0) - I = locate(A) in surroundings - Deletion += I - surroundings -= I - amt-- - var/list/partlist = list(R.parts.len) - for(var/M in R.parts) - partlist[M] = R.parts[M] - for(var/A in R.parts) - if(istype(A, /datum/reagent)) - var/datum/reagent/RG = locate(A) in Deletion - if(RG.volume > partlist[A]) - RG.volume = partlist[A] - . += RG - Deletion -= RG - continue - else if(istype(A, /obj/item/stack)) - var/obj/item/stack/ST = locate(A) in Deletion - if(ST.amount > partlist[A]) - ST.amount = partlist[A] - . += ST - Deletion -= ST - continue - else - while(partlist[A] > 0) - var/atom/movable/AM = locate(A) in Deletion - . += AM - Deletion -= AM - partlist[A] -= 1 - while(Deletion.len) - var/DL = Deletion[Deletion.len] - Deletion.Cut(Deletion.len) - qdel(DL) - -/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user) - if(user == parent) - ui_interact(user) - -/datum/component/personal_crafting/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.not_incapacitated_turf_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - cur_category = categories[1] - if(islist(categories[cur_category])) - var/list/subcats = categories[cur_category] - cur_subcategory = subcats[1] - else - cur_subcategory = CAT_NONE - ui = new(user, src, ui_key, "personal_crafting", "Crafting Menu", 700, 800, master_ui, state) - ui.open() - - -/datum/component/personal_crafting/ui_data(mob/user) - var/list/data = list() - data["busy"] = busy - data["category"] = cur_category - data["subcategory"] = cur_subcategory - data["display_craftable_only"] = display_craftable_only - data["display_compact"] = display_compact - - var/list/surroundings = get_surroundings(user) - var/list/craftability = list() - for(var/rec in GLOB.crafting_recipes) - var/datum/crafting_recipe/R = rec - - if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. - continue - - if((R.category != cur_category) || (R.subcategory != cur_subcategory)) - continue - - craftability["[REF(R)]"] = check_contents(user, R, surroundings) - - data["craftability"] = craftability - return data - -/datum/component/personal_crafting/ui_static_data(mob/user) - var/list/data = list() - - var/list/crafting_recipes = list() - for(var/rec in GLOB.crafting_recipes) - var/datum/crafting_recipe/R = rec - - if(R.name == "") //This is one of the invalid parents that sneaks in - continue - - if(!R.always_availible && !(R.type in user?.mind?.learned_recipes)) //User doesn't actually know how to make this. - continue - - if(isnull(crafting_recipes[R.category])) - crafting_recipes[R.category] = list() - - if(R.subcategory == CAT_NONE) - crafting_recipes[R.category] += list(build_recipe_data(R)) - else - if(isnull(crafting_recipes[R.category][R.subcategory])) - crafting_recipes[R.category][R.subcategory] = list() - crafting_recipes[R.category]["has_subcats"] = TRUE - crafting_recipes[R.category][R.subcategory] += list(build_recipe_data(R)) - - data["crafting_recipes"] = crafting_recipes - return data - - -/datum/component/personal_crafting/ui_act(action, params) - if(..()) - return - switch(action) - if("make") - var/datum/crafting_recipe/TR = locate(params["recipe"]) in GLOB.crafting_recipes - ui_interact(usr) - if(busy) - to_chat(usr, "You are already making something!") - return - busy = TRUE - var/fail_msg = construct_item(usr, TR) - if(!fail_msg) - to_chat(usr, "[TR.name] constructed.") - else - to_chat(usr, "Construction failed[fail_msg]") - busy = FALSE - if("toggle_recipes") - display_craftable_only = !display_craftable_only - . = TRUE - if("toggle_compact") - display_compact = !display_compact - . = TRUE - if("set_category") - if(!isnull(params["category"])) - cur_category = params["category"] - if(!isnull(params["subcategory"])) - if(params["subcategory"] == "0") - cur_subcategory = "" - else - cur_subcategory = params["subcategory"] - . = TRUE - -/datum/component/personal_crafting/proc/build_recipe_data(datum/crafting_recipe/R) - var/list/data = list() - data["name"] = R.name - data["ref"] = "[REF(R)]" - var/req_text = "" - var/tool_text = "" - var/catalyst_text = "" - - for(var/a in R.reqs) - //We just need the name, so cheat-typecast to /atom for speed (even tho Reagents are /datum they DO have a "name" var) - //Also these are typepaths so sadly we can't just do "[a]" - var/atom/A = a - req_text += " [R.reqs[A]] [initial(A.name)]," - req_text = replacetext(req_text,",","",-1) - data["req_text"] = req_text - - for(var/a in R.chem_catalysts) - var/atom/A = a //cheat-typecast - catalyst_text += " [R.chem_catalysts[A]] [initial(A.name)]," - catalyst_text = replacetext(catalyst_text,",","",-1) - data["catalyst_text"] = catalyst_text - - for(var/a in R.tools) - if(ispath(a, /obj/item)) - var/obj/item/b = a - tool_text += " [initial(b.name)]," - else - tool_text += " [a]," - tool_text = replacetext(tool_text,",","",-1) - data["tool_text"] = tool_text - - return data - -//Mind helpers - -/datum/mind/proc/teach_crafting_recipe(R) - if(!learned_recipes) - learned_recipes = list() - learned_recipes |= R diff --git a/code/datums/components/crafting/crafting.dm b/code/datums/components/crafting/crafting.dm index 1a9f4c0512..3ed3e521e4 100644 --- a/code/datums/components/crafting/crafting.dm +++ b/code/datums/components/crafting/crafting.dm @@ -4,7 +4,11 @@ /datum/component/personal_crafting/proc/create_mob_button(mob/user, client/CL) var/datum/hud/H = user.hud_used - var/obj/screen/craft/C = new() + for(var/huds in H.static_inventory) + if(istype(huds, /atom/movable/screen/craft)) + return + //We don't want to be stacking multiple crafting huds on relogs + var/atom/movable/screen/craft/C = new() C.icon = H.ui_style H.static_inventory += C CL.screen += C @@ -20,7 +24,7 @@ CAT_AMMO, ), CAT_ROBOT = CAT_NONE, - CAT_MISC = list( + CAT_MISCELLANEOUS = list( CAT_MISCELLANEOUS, CAT_TOOL, CAT_FURNITURE, @@ -319,7 +323,7 @@ Deletion.Cut(Deletion.len) qdel(DL) -/datum/component/personal_crafting/proc/component_ui_interact(obj/screen/craft/image, location, control, params, user) +/datum/component/personal_crafting/proc/component_ui_interact(atom/movable/screen/craft/image, location, control, params, user) if(user == parent) ui_interact(user) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 032dd0ea90..ad37f770ed 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -8,7 +8,7 @@ time = 1 reqs = list(/obj/item/stack/sheet/plastic = 1, /obj/item/stack/sheet/mineral/wood = 1) - category = CAT_MISC + category = CAT_MISCELLANEOUS subcategory = CAT_TOOL /datum/crafting_recipe/showercurtain @@ -18,7 +18,7 @@ /obj/item/stack/rods = 1) result = /obj/structure/curtain subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/guillotine name = "Guillotine" @@ -29,7 +29,7 @@ /obj/item/stack/cable_coil = 10) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/femur_breaker name = "Femur Breaker" @@ -39,7 +39,7 @@ /obj/item/stack/cable_coil = 30) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS // Blood Sucker stuff // /datum/crafting_recipe/bloodsucker/blackcoffin @@ -54,7 +54,7 @@ ///obj/item/pipe = 2) time = 150 subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = TRUE /datum/crafting_recipe/bloodsucker/meatcoffin @@ -66,7 +66,7 @@ /obj/item/restraints/handcuffs/cable = 1) time = 150 subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = TRUE /datum/crafting_recipe/bloodsucker/metalcoffin @@ -77,7 +77,7 @@ reqs = list(/obj/item/stack/sheet/metal = 5) time = 100 subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = TRUE /datum/crafting_recipe/bloodsucker/vassalrack @@ -100,7 +100,7 @@ // ) time = 150 subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = FALSE // Disabled until learned @@ -117,7 +117,7 @@ ) time = 100 subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = FALSE // Disabled til learned /datum/crafting_recipe/furnace @@ -129,7 +129,7 @@ /obj/item/stack/rods = 2) tools = list(TOOL_CROWBAR) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/tableanvil name = "Table Anvil" @@ -139,7 +139,7 @@ /obj/item/stack/rods = 2) tools = list(TOOL_SCREWDRIVER, TOOL_WRENCH, TOOL_WELDER) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/sandvil name = "Sandstone Anvil" @@ -148,7 +148,7 @@ reqs = list(/obj/item/stack/sheet/mineral/sandstone = 24) tools = list(TOOL_CROWBAR) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/basaltblock name = "Sintered Basalt Block" @@ -157,7 +157,7 @@ reqs = list(/obj/item/stack/ore/glass/basalt = 50) tools = list(TOOL_WELDER) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/basaltanvil name = "Basalt Anvil" @@ -166,7 +166,7 @@ reqs = list(/obj/item/basaltblock = 5) tools = list(TOOL_CROWBAR) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /////////////////// //Tools & Storage// /////////////////// @@ -177,7 +177,7 @@ time = 1 reqs = list(/obj/item/stack/medical/gauze = 1, /datum/reagent/space_cleaner/sterilizine = 5) - category = CAT_MISC + category = CAT_MISCELLANEOUS subcategory = CAT_TOOL /datum/crafting_recipe/brute_pack @@ -186,7 +186,7 @@ time = 1 reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/styptic_powder = 10) - category = CAT_MISC + category = CAT_MISCELLANEOUS subcategory = CAT_TOOL /datum/crafting_recipe/burn_pack @@ -195,7 +195,7 @@ time = 1 reqs = list(/obj/item/stack/medical/gauze/adv = 1, /datum/reagent/medicine/silver_sulfadiazine = 10) - category = CAT_MISC + category = CAT_MISCELLANEOUS subcategory = CAT_TOOL /datum/crafting_recipe/ghettojetpack @@ -206,7 +206,7 @@ /obj/item/extinguisher = 1, /obj/item/pipe = 3, /obj/item/stack/cable_coil = 30) - category = CAT_MISC + category = CAT_MISCELLANEOUS subcategory = CAT_TOOL tools = list(TOOL_WRENCH, TOOL_WELDER, TOOL_WIRECUTTER) @@ -220,7 +220,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/toolboxhammer name = "Toolbox Hammer" @@ -231,7 +231,7 @@ /obj/item/stack/rods = 2) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/papersack name = "Paper Sack" @@ -239,7 +239,7 @@ time = 10 reqs = list(/obj/item/paper = 5) subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/smallcarton name = "Small Carton" @@ -247,7 +247,7 @@ time = 10 reqs = list(/obj/item/stack/sheet/cardboard = 1) subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bronze_driver name = "Bronze Plated Screwdriver" @@ -259,7 +259,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bronze_welder name = "Bronze Plated Welding Tool" @@ -271,7 +271,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bronze_wirecutters name = "Bronze Plated Wirecutters" @@ -283,7 +283,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bronze_crowbar name = "Bronze Plated Crowbar" @@ -295,7 +295,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bronze_wrench name = "Bronze Plated Wrench" @@ -307,7 +307,7 @@ /datum/reagent/water = 15) time = 40 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/rcl name = "Makeshift Rapid Cable Layer" @@ -316,7 +316,7 @@ tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) reqs = list(/obj/item/stack/sheet/metal = 15) subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/picket_sign name = "Picket Sign" @@ -325,7 +325,7 @@ /obj/item/stack/sheet/cardboard = 2) time = 80 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/electrochromatic_kit name = "Electrochromatic Kit" @@ -334,7 +334,7 @@ /obj/item/stack/cable_coil = 1) time = 5 subcategory = CAT_TOOL - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/blackmarket_uplink name = "Black Market Uplink" @@ -346,7 +346,7 @@ /obj/item/radio = 1, /obj/item/analyzer = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/heretic/codex name = "Codex Cicatrix" @@ -358,7 +358,7 @@ /obj/item/stack/sheet/animalhide/human = 1) time = 150 subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS always_availible = FALSE //////////// @@ -372,7 +372,21 @@ /obj/item/stack/rods = 8) time = 100 subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS + +/datum/crafting_recipe/motorized_wheelchair + name = "Hoverchair" + result = /obj/vehicle/ridden/wheelchair/motorized + reqs = list(/obj/item/stack/sheet/plasteel = 10, + /obj/item/stack/rods = 8, + /obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/capacitor = 1) + parts = list(/obj/item/stock_parts/manipulator = 2, + /obj/item/stock_parts/capacitor = 1) + tools = list(TOOL_WELDER, TOOL_SCREWDRIVER, TOOL_WRENCH) + time = 200 + subcategory = CAT_MISCELLANEOUS + category = CAT_MISCELLANEOUS /datum/crafting_recipe/skateboard name = "Skateboard" @@ -381,7 +395,7 @@ reqs = list(/obj/item/stack/sheet/metal = 5, /obj/item/stack/rods = 10) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/scooter name = "Scooter" @@ -390,7 +404,7 @@ reqs = list(/obj/item/stack/sheet/metal = 5, /obj/item/stack/rods = 12) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS ///////// //Toys/// @@ -401,28 +415,28 @@ reqs = list(/obj/item/light/bulb = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) result = /obj/item/toy/sword subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/extendohand name = "Extendo-Hand" reqs = list(/obj/item/bodypart/r_arm/robot = 1, /obj/item/clothing/gloves/boxing = 1) result = /obj/item/extendohand subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/toyneb name = "Non-Euplastic Blade" reqs = list(/obj/item/light/tube = 1, /obj/item/stack/cable_coil = 1, /obj/item/stack/sheet/plastic = 4) result = /obj/item/toy/sword/cx subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/catgirlplushie name = "Catgirl Plushie" reqs = list(/obj/item/toy/plush/hairball = 3) result = /obj/item/toy/plush/catgirl subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS //////////// //Unsorted// @@ -436,7 +450,7 @@ reqs = list(/obj/item/stack/sheet/mineral/wood = 1) result = /obj/item/stick subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/swordhilt @@ -445,14 +459,14 @@ reqs = list(/obj/item/stack/sheet/mineral/wood = 2) result = /obj/item/swordhandle subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/blackcarpet name = "Black Carpet" reqs = list(/obj/item/stack/tile/carpet = 50, /obj/item/toy/crayon/black = 1) result = /obj/item/stack/tile/carpet/black/fifty subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/paperframes name = "Paper Frames" @@ -460,7 +474,7 @@ time = 10 reqs = list(/obj/item/stack/sheet/mineral/wood = 5, /obj/item/paper = 20) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/naturalpaper name = "Hand-Pressed Paper" @@ -469,7 +483,7 @@ tools = list(/obj/item/hatchet) result = /obj/item/paper_bin/bundlenatural subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/bluespacehonker name = "Bluespace Bike horn" @@ -479,7 +493,7 @@ /obj/item/toy/crayon/blue = 1, /obj/item/bikehorn = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/mousetrap name = "Mouse Trap" @@ -488,7 +502,7 @@ reqs = list(/obj/item/stack/sheet/cardboard = 1, /obj/item/stack/rods = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/flashlight_eyes name = "Flashlight Eyes" @@ -499,7 +513,7 @@ /obj/item/restraints/handcuffs/cable = 1 ) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/pressureplate name = "Pressure Plate" @@ -510,7 +524,7 @@ /obj/item/stack/cable_coil = 2, /obj/item/assembly/igniter = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/gold_horn name = "Golden Bike Horn" @@ -519,7 +533,7 @@ reqs = list(/obj/item/stack/sheet/mineral/bananium = 5, /obj/item/bikehorn = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/spooky_camera name = "Camera Obscura" @@ -529,7 +543,7 @@ /datum/reagent/water/holywater = 10) parts = list(/obj/item/camera = 1) subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/coconut_bong name = "Coconut Bong" @@ -538,7 +552,7 @@ /obj/item/reagent_containers/food/snacks/grown/coconut = 1) time = 70 subcategory = CAT_MISCELLANEOUS - category = CAT_MISC + category = CAT_MISCELLANEOUS ////////////// //Banners///// @@ -551,7 +565,7 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/captain/parade = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/engineering_banner name = "Engitopia Banner" @@ -560,7 +574,7 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/engineering/engineer = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/cargo_banner name = "Cargonia Banner" @@ -569,7 +583,7 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/cargo/tech = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/science_banner name = "Sciencia Banner" @@ -578,7 +592,7 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/rnd/scientist = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/medical_banner name = "Meditopia Banner" @@ -587,7 +601,7 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/medical/doctor = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS /datum/crafting_recipe/security_banner name = "Securistan Banner" @@ -596,4 +610,4 @@ reqs = list(/obj/item/stack/rods = 2, /obj/item/clothing/under/rank/security/officer = 1) subcategory = CAT_FURNITURE - category = CAT_MISC + category = CAT_MISCELLANEOUS diff --git a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm index 95361c3da2..01ad269a8e 100644 --- a/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm +++ b/code/datums/components/crafting/recipes/recipes_weapon_and_ammo.dm @@ -72,6 +72,16 @@ category = CAT_WEAPONRY subcategory = CAT_MELEE +/datum/crafting_recipe/newsbaton + name = "Newspaper Baton" + result = /obj/item/melee/classic_baton/telescopic/newspaper + reqs = list(/obj/item/melee/classic_baton/telescopic = 1, + /obj/item/newspaper = 1, + /obj/item/stack/sticky_tape = 2) + time = 40 + category = CAT_WEAPONRY + subcategory = CAT_MELEE + /datum/crafting_recipe/bokken name = "Training Bokken" result = /obj/item/melee/bokken diff --git a/code/datums/components/embedded.dm b/code/datums/components/embedded.dm index ec5ec19a6b..dcbf40a16b 100644 --- a/code/datums/components/embedded.dm +++ b/code/datums/components/embedded.dm @@ -142,7 +142,7 @@ if(harmful) victim.visible_message("[weapon] embeds itself in [victim]'s [limb.name]!",ignored_mobs=victim) to_chat(victim, "[weapon] embeds itself in your [limb.name]!") - victim.throw_alert("embeddedobject", /obj/screen/alert/embeddedobject) + victim.throw_alert("embeddedobject", /atom/movable/screen/alert/embeddedobject) playsound(victim,'sound/weapons/bladeslice.ogg', 40) weapon.add_mob_blood(victim)//it embedded itself in you, of course it's bloody! damage = weapon.w_class * impact_pain_mult @@ -265,6 +265,7 @@ /// Items embedded/stuck to carbons both check whether they randomly fall out (if applicable), as well as if the target mob and limb still exists. /// Items harmfully embedded in carbons have an additional check for random pain (if applicable) /datum/component/embedded/proc/processCarbon() + set waitfor = FALSE var/mob/living/carbon/victim = parent if(!victim || !limb) // in case the victim and/or their limbs exploded (say, due to a sticky bomb) diff --git a/code/datums/components/identification.dm b/code/datums/components/identification.dm index f7dc211504..59b98b57ac 100644 --- a/code/datums/components/identification.dm +++ b/code/datums/components/identification.dm @@ -24,6 +24,7 @@ identification_method_flags = id_method_flags /datum/component/identification/RegisterWithParent() + RegisterSignal(parent, COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK, .proc/check_knowledge) RegisterSignal(parent, COMSIG_PARENT_EXAMINE, .proc/on_examine) if(identification_effect_flags & ID_COMPONENT_EFFECT_NO_ACTIONS) RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/on_equip) diff --git a/code/datums/components/lockon_aiming.dm b/code/datums/components/lockon_aiming.dm index 2f4401862d..4acdece7e5 100644 --- a/code/datums/components/lockon_aiming.dm +++ b/code/datums/components/lockon_aiming.dm @@ -158,6 +158,7 @@ autolock() /datum/component/lockon_aiming/proc/autolock() + set waitfor = FALSE var/mob/M = parent if(!M.client) return FALSE diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index 359c97c507..e100326f7b 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -13,7 +13,7 @@ var/mood_modifier = 1 //Modifier to allow certain mobs to be less affected by moodlets var/list/datum/mood_event/mood_events = list() var/insanity_effect = 0 //is the owner being punished for low mood? If so, how much? - var/obj/screen/mood/screen_obj + var/atom/movable/screen/mood/screen_obj var/datum/skill_modifier/bad_mood/malus var/datum/skill_modifier/great_mood/bonus var/static/malus_id = 0 diff --git a/code/datums/components/nanites.dm b/code/datums/components/nanites.dm index 3db861d0f0..50ac5e5cc5 100644 --- a/code/datums/components/nanites.dm +++ b/code/datums/components/nanites.dm @@ -214,7 +214,6 @@ /datum/component/nanites/proc/check_viral_prevention() return SEND_SIGNAL(src, COMSIG_NANITE_INTERNAL_VIRAL_PREVENTION_CHECK) -//Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) ///Syncs the nanite component to another, making it so programs are the same with the same programming (except activation status) /datum/component/nanites/proc/sync(datum/signal_source, datum/component/nanites/source, full_overwrite = TRUE, copy_activation = FALSE) var/list/programs_to_remove = programs.Copy() - permanent_programs @@ -274,10 +273,9 @@ ///Modifies the current nanite volume, then checks if the nanites are depleted or exceeding the maximum amount /datum/component/nanites/proc/adjust_nanites(datum/source, amount) - nanite_volume = clamp(nanite_volume + amount, 0, max_nanites) SIGNAL_HANDLER - nanite_volume += amount + nanite_volume = max(nanite_volume + amount, 0) //Lets not have negative nanite counts on permanent ones. if(nanite_volume > max_nanites) reject_excess_nanites() if(nanite_volume <= 0) //oops we ran out @@ -407,7 +405,6 @@ nanite_volume = clamp(amount, 0, max_nanites) /datum/component/nanites/proc/set_max_volume(datum/source, amount) - max_nanites = max(1, max_nanites) SIGNAL_HANDLER max_nanites = max(1, amount) diff --git a/code/datums/components/orbiter.dm b/code/datums/components/orbiter.dm index 26f52f6ba5..c34d56982a 100644 --- a/code/datums/components/orbiter.dm +++ b/code/datums/components/orbiter.dm @@ -90,7 +90,7 @@ return SEND_SIGNAL(parent, COMSIG_ATOM_ORBIT_END, orbiter, refreshing) UnregisterSignal(orbiter, COMSIG_MOVABLE_MOVED) - orbiter.SpinAnimation(0, 0) + orbiter.SpinAnimation(0, 0, parallel = FALSE) if(istype(orbiters[orbiter],/matrix)) //This is ugly. orbiter.transform = orbiters[orbiter] orbiters -= orbiter diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index cf0b3d6920..752fafe6bd 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -435,15 +435,15 @@ RevenantThrow(over_object, M, source) return if(!M.incapacitated()) - if(!istype(over_object, /obj/screen)) + if(!istype(over_object, /atom/movable/screen)) dump_content_at(over_object, M) return if(A.loc != M) return playsound(A, "rustle", 50, 1, -5) A.do_jiggle() - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(A, H.held_index) return A.add_fingerprint(M) diff --git a/code/datums/components/storage/ui.dm b/code/datums/components/storage/ui.dm index 044afa2850..820d7067d4 100644 --- a/code/datums/components/storage/ui.dm +++ b/code/datums/components/storage/ui.dm @@ -20,8 +20,8 @@ . = list() var/list/accessible_contents = accessible_items() var/adjusted_contents = length(accessible_contents) - var/obj/screen/storage/close/ui_close - var/obj/screen/storage/boxes/ui_boxes + var/atom/movable/screen/storage/close/ui_close + var/atom/movable/screen/storage/boxes/ui_boxes //Numbered contents display var/list/datum/numbered_display/numbered_contents @@ -62,7 +62,7 @@ for(var/obj/O in accessible_items()) if(QDELETED(O)) continue - var/obj/screen/storage/item_holder/D = new(null, src, O) + var/atom/movable/screen/storage/item_holder/D = new(null, src, O) D.mouse_opacity = MOUSE_OPACITY_OPAQUE //This is here so storage items that spawn with contents correctly have the "click around item to equip" D.screen_loc = "[cx]:[screen_pixel_x],[cy]:[screen_pixel_y]" O.maptext = "" @@ -81,9 +81,9 @@ */ /datum/component/storage/proc/orient2hud_volumetric(mob/user, maxcolumns) . = list() - var/obj/screen/storage/left/ui_left - var/obj/screen/storage/continuous/ui_continuous - var/obj/screen/storage/close/ui_close + var/atom/movable/screen/storage/left/ui_left + var/atom/movable/screen/storage/continuous/ui_continuous + var/atom/movable/screen/storage/close/ui_close // Generate ui_item_blocks for missing ones and render+orient. var/list/atom/contents = accessible_items() @@ -137,7 +137,7 @@ for(var/i in percentage_by_item) I = i var/percent = percentage_by_item[I] - var/obj/screen/storage/volumetric_box/center/B = new /obj/screen/storage/volumetric_box/center(null, src, I) + var/atom/movable/screen/storage/volumetric_box/center/B = new /atom/movable/screen/storage/volumetric_box/center(null, src, I) var/pixels_to_use = overrun? MINIMUM_PIXELS_PER_ITEM : max(using_horizontal_pixels * percent, MINIMUM_PIXELS_PER_ITEM) var/addrow = FALSE if(CEILING(pixels_to_use, 1) >= FLOOR(horizontal_pixels - current_pixel - VOLUMETRIC_STORAGE_EDGE_PADDING, 1)) @@ -255,22 +255,22 @@ * Gets our ui_boxes, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_boxes() - return new /obj/screen/storage/boxes(null, src) + return new /atom/movable/screen/storage/boxes(null, src) /** * Gets our ui_left, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_left() - return new /obj/screen/storage/left(null, src) + return new /atom/movable/screen/storage/left(null, src) /** * Gets our ui_close, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_close() - return new /obj/screen/storage/close(null, src) + return new /atom/movable/screen/storage/close(null, src) /** * Gets our ui_continuous, making it if it doesn't exist. */ /datum/component/storage/proc/get_ui_continuous() - return new /obj/screen/storage/continuous(null, src) + return new /atom/movable/screen/storage/continuous(null, src) diff --git a/code/datums/components/tackle.dm b/code/datums/components/tackle.dm index 10ff5bda3d..911ca7ecbe 100644 --- a/code/datums/components/tackle.dm +++ b/code/datums/components/tackle.dm @@ -370,7 +370,7 @@ user.emote("scream") user.gain_trauma(/datum/brain_trauma/severe/paralysis/spinesnapped) // oopsie indeed! shake_camera(user, 7, 7) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 4.5) if(94 to 98) @@ -381,7 +381,7 @@ user.gain_trauma_type(BRAIN_TRAUMA_MILD) user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) shake_camera(user, 6, 6) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 3.5) if(84 to 93) @@ -394,7 +394,7 @@ user.playsound_local(get_turf(user), 'sound/weapons/flashbang.ogg', 100, TRUE, 8, 0.9) user.DefaultCombatKnockdown(40) shake_camera(user, 5, 5) - user.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + user.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) user.clear_fullscreen("flash", 2.5) if(64 to 83) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index f563826eb9..0b4b3ef2dd 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -159,9 +159,9 @@ /datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power) if(!istype(C)) return - C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself + C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself if(triple_metabolism) - C.reagents.metabolize(C, can_overdose=TRUE) + C.reagents.metabolize(C, SSMOBS_DT, 0, can_overdose=TRUE) C.overeatduration = max(C.overeatduration - 2, 0) var/lost_nutrition = 9 - (reduced_hunger * 5) C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed @@ -404,8 +404,8 @@ if(M.loc) environment = M.loc.return_air() if(environment) - plasmamount = environment.get_moles(/datum/gas/plasma) - if(plasmamount && plasmamount > GLOB.meta_gas_visibility[/datum/gas/plasma]) //if there's enough plasma in the air to see + plasmamount = environment.get_moles(GAS_PLASMA) + if(plasmamount && plasmamount > GLOB.gas_data.visibility[GAS_PLASMA]) //if there's enough plasma in the air to see . += power * 0.5 if(M.reagents.has_reagent(/datum/reagent/toxin/plasma)) . += power * 0.75 diff --git a/code/datums/diseases/advance/symptoms/oxygen.dm b/code/datums/diseases/advance/symptoms/oxygen.dm index 24e01dbbaf..67e2a8c588 100644 --- a/code/datums/diseases/advance/symptoms/oxygen.dm +++ b/code/datums/diseases/advance/symptoms/oxygen.dm @@ -47,7 +47,7 @@ Bonus M.adjustOxyLoss(-7, 0) M.losebreath = max(0, M.losebreath - 4) if(regenerate_blood && M.blood_volume < (BLOOD_VOLUME_NORMAL * M.blood_ratio)) - M.blood_volume += 1 + M.adjust_integration_blood(1) else if(prob(base_message_chance)) to_chat(M, "[pick("Your lungs feel great.", "You realize you haven't been breathing.", "You don't feel the need to breathe.")]") diff --git a/code/datums/diseases/advance/symptoms/skin.dm b/code/datums/diseases/advance/symptoms/skin.dm index d7a457aec1..1593d108a6 100644 --- a/code/datums/diseases/advance/symptoms/skin.dm +++ b/code/datums/diseases/advance/symptoms/skin.dm @@ -32,10 +32,8 @@ BONUS var/mob/living/M = A.affected_mob switch(A.stage) if(5) - var/static/list/banned_reagents = list(/datum/reagent/colorful_reagent/crayonpowder/invisible, /datum/reagent/colorful_reagent/crayonpowder/white) - var/color = pick(subtypesof(/datum/reagent/colorful_reagent/crayonpowder) - banned_reagents) if(M.reagents.total_volume <= (M.reagents.maximum_volume/10)) // no flooding humans with 1000 units of colorful reagent - M.reagents.add_reagent(color, 5) + M.reagents.add_reagent(/datum/reagent/colorful_reagent, 5) else if (prob(50)) // spam M.visible_message("[M] looks rather vibrant...", "The colors, man, the colors...") diff --git a/code/datums/dna.dm b/code/datums/dna.dm index 248b669ab1..a2982a3caf 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -405,7 +405,7 @@ /mob/living/carbon/human/proc/hardset_dna(ui, list/mutation_index, newreal_name, newblood_type, datum/species/mrace, newfeatures, list/default_mutation_genes) - + set waitfor = FALSE if(newreal_name) real_name = newreal_name dna.generate_unique_enzymes() diff --git a/code/datums/elements/earhealing.dm b/code/datums/elements/earhealing.dm index 91c2120fc2..1c74777845 100644 --- a/code/datums/elements/earhealing.dm +++ b/code/datums/elements/earhealing.dm @@ -24,7 +24,8 @@ else user_by_item -= source -/datum/element/earhealing/process() +/datum/element/earhealing/proc/do_process() + set waitfor = FALSE for(var/i in user_by_item) var/mob/living/carbon/user = user_by_item[i] if(HAS_TRAIT(user, TRAIT_DEAF)) @@ -35,3 +36,6 @@ ears.deaf = max(ears.deaf - 0.25, (ears.damage < ears.maxHealth ? 0 : 1)) // Do not clear deafness if our ears are too damaged ears.damage = max(ears.damage - 0.025, 0) CHECK_TICK + +/datum/element/earhealing/process() + do_process() diff --git a/code/datums/elements/mob_holder.dm b/code/datums/elements/mob_holder.dm index 92ee9be7d2..6633ee3a47 100644 --- a/code/datums/elements/mob_holder.dm +++ b/code/datums/elements/mob_holder.dm @@ -184,7 +184,7 @@ return location.loc.assume_air(env) return location.assume_air(env) -/obj/item/clothing/head/mob_holder/remove_air(amount) +/obj/item/clothing/head/mob_holder/proc/get_loc_for_air() var/atom/location = loc if(!loc) return //null @@ -192,9 +192,33 @@ while(location != T) location = location.loc if(ismob(location)) - return location.loc.remove_air(amount) + return location.loc + return location + +/obj/item/clothing/head/mob_holder/assume_air_moles(datum/gas_mixture/env, moles) + var/atom/location = get_loc_for_air() + return location.assume_air_moles(env, moles) + +/obj/item/clothing/head/mob_holder/assume_air_ratio(datum/gas_mixture/env, ratio) + var/atom/location = get_loc_for_air() + return location.assume_air_ratio(env, ratio) + +/obj/item/clothing/head/mob_holder/remove_air(amount) + var/atom/location = get_loc_for_air() return location.remove_air(amount) +/obj/item/clothing/head/mob_holder/remove_air_ratio(ratio) + var/atom/location = get_loc_for_air() + return location.remove_air_ratio(ratio) + +/obj/item/clothing/head/mob_holder/transfer_air(datum/gas_mixture/taker, amount) + var/atom/location = get_loc_for_air() + return location.transfer_air(taker, amount) + +/obj/item/clothing/head/mob_holder/transfer_air_ratio(datum/gas_mixture/taker, ratio) + var/atom/location = get_loc_for_air() + return location.transfer_air(taker, ratio) + // escape when found if applicable /obj/item/clothing/head/mob_holder/on_found(mob/living/finder) if(escape_on_find) diff --git a/code/datums/elements/photosynthesis.dm b/code/datums/elements/photosynthesis.dm index 4fe0615b1f..8e1c8c53ff 100644 --- a/code/datums/elements/photosynthesis.dm +++ b/code/datums/elements/photosynthesis.dm @@ -59,7 +59,7 @@ var/mob/living/L = AM if(L.stat == DEAD) continue - if(light_nutrition_gain) + if(light_nutrition_gain && L.nutrition < NUTRITION_LEVEL_WELL_FED) L.adjust_nutrition(light_amount * light_nutrition_gain * attached_atoms[AM], NUTRITION_LEVEL_WELL_FED) if(light_amount > bonus_lum || light_amount < malus_lum) var/mult = ((light_amount > bonus_lum) ? 1 : -1) * attached_atoms[AM] diff --git a/code/datums/elements/trash.dm b/code/datums/elements/trash.dm new file mode 100644 index 0000000000..a83889c6ca --- /dev/null +++ b/code/datums/elements/trash.dm @@ -0,0 +1,19 @@ +/datum/element/trash + element_flags = ELEMENT_DETACH + +/datum/element/trash/Attach(datum/target) + . = ..() + RegisterSignal(target, COMSIG_ITEM_ATTACK, .proc/UseFromHand) + +/datum/element/trash/proc/UseFromHand(obj/item/source, mob/living/M, mob/living/user) + if((M == user || user.vore_flags & TRASH_FORCEFEED) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(HAS_TRAIT(H, TRAIT_TRASHCAN)) + playsound(H.loc,'sound/items/eatfood.ogg', rand(10,50), 1) + if(H.vore_selected) + H.visible_message("[H] [H.vore_selected.vore_verb]s the [source] into their [H.vore_selected]", + "You [H.vore_selected.vore_verb]s the [source] into your [H.vore_selected]") + source.forceMove(H.vore_selected) + else + H.visible_message("[H] consumes the [source].") + qdel(source) diff --git a/code/datums/explosion2.dm b/code/datums/explosion2.dm index 75f65e4b23..9ebdc8a326 100644 --- a/code/datums/explosion2.dm +++ b/code/datums/explosion2.dm @@ -283,14 +283,11 @@ // insanity define to mark the next set of cardinals. #define CARDINAL_MARK(ndir, cdir, edir) \ if(edir & cdir) { \ - CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ - }; - -#define CARDINAL_MARK_NOCHECK(ndir, cdir, edir) \ - expanding = get_step(T,ndir); \ - if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ - powers_next[expanding] = max(powers_next[expanding], returned); \ - edges_next[expanding] = (cdir | edges_next[expanding]); \ + expanding = get_step(T,ndir); \ + if(expanding && !exploded_last[expanding] && !edges[expanding]) { \ + powers_next[expanding] = max(powers_next[expanding], returned); \ + edges_next[expanding] = (cdir | edges_next[expanding]); \ + }; \ }; // insanity define to do diagonal marking as 2 substeps @@ -308,24 +305,15 @@ }; // insanity define to mark the diagonals that would otherwise be missed -#define DIAGONAL_MARK(ndir, cdir, edir) \ - if(edir & cdir) { \ - DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ - }; - // this only works because right now, WEX_DIR_X is the same as a byond dir // and we know we're only passing in one dir at a time. // if this ever stops being the case, and explosions break when you touch this, now you know why. -#define DIAGONAL_MARK_NOCHECK(ndir, cdir, edir) \ - DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ - DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); - - // mark -#define MARK(ndir, cdir, edir) \ +#define DIAGONAL_MARK(ndir, cdir, edir) \ if(edir & cdir) { \ - CARDINAL_MARK_NOCHECK(ndir, cdir, edir); \ - DIAGONAL_MARK_NOCHECK(ndir, cdir, edir); \ + DIAGONAL_SUBSTEP(turn(ndir, 90), turn(cdir, 90), edir); \ + DIAGONAL_SUBSTEP(turn(ndir, -90), turn(cdir, -90), edir); \ }; + CARDINAL_MARK(NORTH, WEX_DIR_NORTH, dir) CARDINAL_MARK(SOUTH, WEX_DIR_SOUTH, dir) CARDINAL_MARK(EAST, WEX_DIR_EAST, dir) @@ -372,7 +360,9 @@ #undef WEX_ACT +#undef CALCULATE_DIAGONAL_POWER +#undef CALCULATE_DIAGONAL_CROSS_POWER + #undef DIAGONAL_SUBSTEP #undef DIAGONAL_MARK #undef CARDINAL_MARK -#undef MARK diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index c1aed96d61..720813c1a7 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -142,12 +142,12 @@ // Can most things breathe? if(trace_gases) continue - var/oxy_moles = A.get_moles(/datum/gas/oxygen) + var/oxy_moles = A.get_moles(GAS_O2) if(oxy_moles < 16 || oxy_moles > 50) continue - if(A.get_moles(/datum/gas/plasma)) + if(A.get_moles(GAS_PLASMA)) continue - if(A.get_moles(/datum/gas/carbon_dioxide) >= 10) + if(A.get_moles(GAS_CO2) >= 10) continue // Aim for goldilocks temperatures and pressure diff --git a/code/datums/martial/_martial.dm b/code/datums/martial/_martial.dm index bc48e82395..19cfc7691d 100644 --- a/code/datums/martial/_martial.dm +++ b/code/datums/martial/_martial.dm @@ -43,12 +43,8 @@ /datum/martial_art/proc/damage_roll(mob/living/carbon/human/A, mob/living/carbon/human/D) //Here we roll for our damage to be added into the damage var in the various attack procs. This is changed depending on whether we are in combat mode, lying down, or if our target is in combat mode. var/damage = rand(A.dna.species.punchdamagelow, A.dna.species.punchdamagehigh) - if(SEND_SIGNAL(D, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - damage *= 1.2 if(!CHECK_MOBILITY(A, MOBILITY_STAND)) damage *= 0.7 - if(SEND_SIGNAL(A, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - damage *= 0.8 return damage /datum/martial_art/proc/teach(mob/living/carbon/human/H, make_temporary = FALSE) diff --git a/code/datums/martial/sleeping_carp.dm b/code/datums/martial/sleeping_carp.dm index 9b9ea3c86e..a55e947709 100644 --- a/code/datums/martial/sleeping_carp.dm +++ b/code/datums/martial/sleeping_carp.dm @@ -144,14 +144,16 @@ parry_time_active_visual_override = 3 parry_time_spindown_visual_override = 12 parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK //can attack while - parry_time_perfect = 2.5 // first ds isn't perfect - parry_time_perfect_leeway = 1.5 + parry_time_perfect = 2.5 + parry_time_perfect_leeway = 2.5 parry_imperfect_falloff_percent = 5 parry_efficiency_to_counterattack = 100 parry_efficiency_considered_successful = 65 // VERY generous parry_efficiency_perfect = 100 parry_failed_stagger_duration = 4 SECONDS + parry_failed_cooldown_duration = 2 SECONDS parry_cooldown = 0.5 SECONDS + parry_flags = NONE /mob/living/carbon/human/UseStaminaBuffer(amount, warn = FALSE, considered_action = TRUE) amount *= physiology? physiology.stamina_buffer_mod : 1 diff --git a/code/datums/mutable_appearance.dm b/code/datums/mutable_appearance.dm index 31023b3fc7..968809747b 100644 --- a/code/datums/mutable_appearance.dm +++ b/code/datums/mutable_appearance.dm @@ -10,11 +10,14 @@ // And yes this does have to be in the constructor, BYOND ignores it if you set it as a normal var // Helper similar to image() -/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, color = "#FFFFFF") +/proc/mutable_appearance(icon, icon_state = "", layer = FLOAT_LAYER, plane = FLOAT_PLANE, alpha = 255, appearance_flags = NONE, color = "#FFFFFF") var/mutable_appearance/MA = new() MA.icon = icon MA.icon_state = icon_state MA.layer = layer MA.plane = plane + MA.alpha = alpha + MA.appearance_flags |= appearance_flags MA.color = color return MA + diff --git a/code/datums/mutations/actions.dm b/code/datums/mutations/actions.dm index fbee213585..8f7d67abb8 100644 --- a/code/datums/mutations/actions.dm +++ b/code/datums/mutations/actions.dm @@ -227,7 +227,7 @@ //can we sniff? is there miasma in the air? var/datum/gas_mixture/air = user.loc.return_air() - if(air.get_moles(/datum/gas/miasma)) + if(air.get_moles(GAS_MIASMA)) user.adjust_disgust(sensitivity * 45) to_chat(user, "With your overly sensitive nose, you get a whiff of stench and feel sick! Try moving to a cleaner area!") return diff --git a/code/datums/numbered_display.dm b/code/datums/numbered_display.dm index fc2035b39f..b714be23fb 100644 --- a/code/datums/numbered_display.dm +++ b/code/datums/numbered_display.dm @@ -6,5 +6,5 @@ /datum/numbered_display/New(obj/item/sample, _number = 1, datum/component/storage/parent) if(!istype(sample)) qdel(src) - sample_object = new /obj/screen/storage/item_holder(null, parent, sample) + sample_object = new /atom/movable/screen/storage/item_holder(null, parent, sample) number = _number diff --git a/code/datums/ruins/lavaland.dm b/code/datums/ruins/lavaland.dm index a08b535aff..5d97448d69 100644 --- a/code/datums/ruins/lavaland.dm +++ b/code/datums/ruins/lavaland.dm @@ -35,6 +35,14 @@ cost = 10 allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/library + name = "Lavaland Library" + id = "llibrary" + description = "A once grand library, now lost to the confines of lavaland." + suffix = "lavaland_surface_library.dmm" + cost = 5 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/seed_vault name = "Seed Vault" id = "seed-vault" @@ -79,6 +87,20 @@ suffix = "lavaland_surface_animal_hospital.dmm" allow_duplicates = FALSE +/datum/map_template/ruin/lavaland/hotsprings + name = "Hot Springs" + id = "lhotsprings" + description = "Just relax and take a dip! Lavaland's finest hot springs await!" + suffix = "lavaland_surface_hotsprings.dmm" + +/datum/map_template/ruin/lavaland/engioutpost + name = "Engineer Outpost" + id = "lengioutpost" + description = "Blown up by an unfortunate accident." + suffix = "lavaland_surface_engioutpost.dmm" + cost = 10 + allow_duplicates = FALSE + /datum/map_template/ruin/lavaland/sin cost = 10 allow_duplicates = FALSE @@ -115,6 +137,24 @@ suffix = "lavaland_surface_sloth.dmm" // Generates nothing but atmos runtimes and salt +/datum/map_template/ruin/lavaland/sin/lust + name = "Ruin of Lust" + id = "llust" + description = "Not exactly what you expected." + suffix = "lavaland_surface_lust.dmm" + +/datum/map_template/ruin/lavaland/sin/wrath + name = "Ruin of Wrath" + id = "lwrath" + description = "You'll fight and fight and just keep fighting." + suffix = "lavaland_surface_wrath.dmm" + +/datum/map_template/ruin/lavaland/bathhouse + name = "Bath House" + id = "lbathhouse" + description = "A taste of paradise, locked in the hell of Lavaland." + suffix = "lavaland_surface_bathhouse.dmm" + /datum/map_template/ruin/lavaland/ratvar name = "Dead God" id = "ratvar" @@ -132,19 +172,20 @@ /datum/map_template/ruin/lavaland/blood_drunk_miner name = "Blood-Drunk Miner" - id = "blooddrunk" - description = "A strange arrangement of stone tiles and an insane, beastly miner contemplating them." - suffix = "lavaland_surface_blooddrunk1.dmm" + description = "An insane, beastly miner contemplating stone tiles..." always_place = TRUE - allow_duplicates = FALSE //will only spawn one variant of the ruin - -/datum/map_template/ruin/lavaland/blood_drunk_miner/guidance - name = "Blood-Drunk Miner (Guidance)" - suffix = "lavaland_surface_blooddrunk2.dmm" - -/datum/map_template/ruin/lavaland/blood_drunk_miner/hunter - name = "Blood-Drunk Miner (Hunter)" - suffix = "lavaland_surface_blooddrunk3.dmm" + allow_duplicates = FALSE + id = "blooddrunk" +/datum/map_template/ruin/lavaland/blood_drunk_miner/New() + if(prob(25)) + suffix = "lavaland_surface_blooddrunk1.dmm" + else if(prob(34)) + suffix = "lavaland_surface_blooddrunk2.dmm" + else if(prob(50)) + suffix = "lavaland_surface_blooddrunk3.dmm" + else + suffix = "lavaland_surface_mining_site.dmm" + . = ..() /datum/map_template/ruin/lavaland/ufo_crash name = "UFO Crash" diff --git a/code/datums/status_effects/buffs.dm b/code/datums/status_effects/buffs.dm index bf910b3944..ae05134b56 100644 --- a/code/datums/status_effects/buffs.dm +++ b/code/datums/status_effects/buffs.dm @@ -3,9 +3,9 @@ /datum/status_effect/shadow_mend id = "shadow_mend" duration = 30 - alert_type = /obj/screen/alert/status_effect/shadow_mend + alert_type = /atom/movable/screen/alert/status_effect/shadow_mend -/obj/screen/alert/status_effect/shadow_mend +/atom/movable/screen/alert/status_effect/shadow_mend name = "Shadow Mend" desc = "Shadowy energies wrap around your wounds, sealing them at a price. After healing, you will slowly lose health every three seconds for thirty seconds." icon_state = "shadow_mend" @@ -29,9 +29,9 @@ id = "void_price" duration = 300 tick_interval = 30 - alert_type = /obj/screen/alert/status_effect/void_price + alert_type = /atom/movable/screen/alert/status_effect/void_price -/obj/screen/alert/status_effect/void_price +/atom/movable/screen/alert/status_effect/void_price name = "Void Price" desc = "Black tendrils cinch tightly against you, digging wicked barbs into your flesh." icon_state = "shadow_mend" @@ -46,17 +46,17 @@ duration = 200 tick_interval = 0 //tick as fast as possible status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/vanguard + alert_type = /atom/movable/screen/alert/status_effect/vanguard var/datum/progressbar/progbar var/stamhealed = 0 //How much stamina did we regenerate? -/obj/screen/alert/status_effect/vanguard +/atom/movable/screen/alert/status_effect/vanguard name = "Vanguard" desc = "You're absorbing stuns aswell as quickly regenerating stamina, but be careful: 50% of stamina restored and 25% of stuns absorbed will affect you after this effect ends." icon_state = "vanguard" alerttooltipstyle = "clockcult" -/obj/screen/alert/status_effect/vanguard/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/vanguard/MouseEntered(location,control,params) var/mob/living/L = usr var/datum/status_effect/vanguard_shield/E = attached_effect if(istype(L)) //this is probably more safety than actually needed @@ -118,9 +118,9 @@ /datum/status_effect/inathneqs_endowment id = "inathneqs_endowment" duration = 150 - alert_type = /obj/screen/alert/status_effect/inathneqs_endowment + alert_type = /atom/movable/screen/alert/status_effect/inathneqs_endowment -/obj/screen/alert/status_effect/inathneqs_endowment +/atom/movable/screen/alert/status_effect/inathneqs_endowment name = "Inath-neq's Endowment" desc = "Adrenaline courses through you as the Resonant Cogwheel's energy shields you from all harm!" icon_state = "inathneqs_endowment" @@ -149,7 +149,7 @@ /datum/status_effect/cyborg_power_regen id = "power_regen" duration = 100 - alert_type = /obj/screen/alert/status_effect/power_regen + alert_type = /atom/movable/screen/alert/status_effect/power_regen var/power_to_give = 0 //how much power is gained each tick /datum/status_effect/cyborg_power_regen/on_creation(mob/living/new_owner, new_power_per_tick) @@ -157,7 +157,7 @@ if(. && isnum(new_power_per_tick)) power_to_give = new_power_per_tick -/obj/screen/alert/status_effect/power_regen +/atom/movable/screen/alert/status_effect/power_regen name = "Power Regeneration" desc = "You are quickly regenerating power!" icon_state = "power_regen" @@ -174,16 +174,16 @@ id = "his_grace" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_grace + alert_type = /atom/movable/screen/alert/status_effect/his_grace var/bloodlust = 0 -/obj/screen/alert/status_effect/his_grace +/atom/movable/screen/alert/status_effect/his_grace name = "His Grace" desc = "His Grace hungers, and you must feed Him." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/his_grace/MouseEntered(location,control,params) desc = initial(desc) var/datum/status_effect/his_grace/HG = attached_effect desc += "
Current Bloodthirst: [HG.bloodlust]\ @@ -225,7 +225,7 @@ /datum/status_effect/wish_granters_gift //Fully revives after ten seconds. id = "wish_granters_gift" duration = 50 - alert_type = /obj/screen/alert/status_effect/wish_granters_gift + alert_type = /atom/movable/screen/alert/status_effect/wish_granters_gift /datum/status_effect/wish_granters_gift/on_apply() to_chat(owner, "Death is not your end! The Wish Granter's energy suffuses you, and you begin to rise...") @@ -236,7 +236,7 @@ owner.revive(full_heal = TRUE, admin_revive = TRUE) owner.visible_message("[owner] appears to wake from the dead, having healed all wounds!", "You have regenerated.") -/obj/screen/alert/status_effect/wish_granters_gift +/atom/movable/screen/alert/status_effect/wish_granters_gift name = "Wish Granter's Immortality" desc = "You are being resurrected!" icon_state = "wish_granter" @@ -274,7 +274,7 @@ id = "blooddrunk" duration = 10 tick_interval = 0 - alert_type = /obj/screen/alert/status_effect/blooddrunk + alert_type = /atom/movable/screen/alert/status_effect/blooddrunk var/last_health = 0 var/last_bruteloss = 0 var/last_fireloss = 0 @@ -283,7 +283,7 @@ var/last_cloneloss = 0 var/last_staminaloss = 0 -/obj/screen/alert/status_effect/blooddrunk +/atom/movable/screen/alert/status_effect/blooddrunk name = "Blood-Drunk" desc = "You are drunk on blood! Your pulse thunders in your ears! Nothing can harm you!" //not true, and the item description mentions its actual effect icon_state = "blooddrunk" @@ -430,7 +430,7 @@ /datum/status_effect/fleshmend id = "fleshmend" duration = 100 - alert_type = /obj/screen/alert/status_effect/fleshmend + alert_type = /atom/movable/screen/alert/status_effect/fleshmend /datum/status_effect/fleshmend/tick() if(owner.on_fire) @@ -453,7 +453,7 @@ QDEL_LIST(C.all_scars) -/obj/screen/alert/status_effect/fleshmend +/atom/movable/screen/alert/status_effect/fleshmend name = "Fleshmend" desc = "Our wounds are rapidly healing. This effect is prevented if we are on fire." icon_state = "fleshmend" @@ -562,7 +562,7 @@ var/mob/living/simple_animal/SM = L SM.adjustHealth(-3.5, forced = TRUE) -/obj/screen/alert/status_effect/regenerative_core +/atom/movable/screen/alert/status_effect/regenerative_core name = "Reinforcing Tendrils" desc = "You can move faster than your broken body could normally handle!" icon_state = "regenerative_core" @@ -572,7 +572,7 @@ id = "Regenerative Core" duration = 1 MINUTES status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/regenerative_core + alert_type = /atom/movable/screen/alert/status_effect/regenerative_core var/heal_amount = 25 /datum/status_effect/regenerative_core/on_apply() @@ -597,9 +597,9 @@ id = "Anatomic Panacea" duration = 100 tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/panacea + alert_type = /atom/movable/screen/alert/status_effect/panacea -/obj/screen/alert/status_effect/panacea +/atom/movable/screen/alert/status_effect/panacea name = "Panacea" desc = "We purge the impurities from our body." icon_state = "panacea" @@ -774,7 +774,7 @@ status_type = STATUS_EFFECT_REFRESH duration = 15 SECONDS examine_text = "They don't seem to be all here." - alert_type = /obj/screen/alert/status_effect/crucible_soul + alert_type = /atom/movable/screen/alert/status_effect/crucible_soul var/turf/location /datum/status_effect/crucible_soul/on_apply() @@ -796,7 +796,7 @@ id = "Blessing of Dusk and Dawn" status_type = STATUS_EFFECT_REFRESH duration = 60 SECONDS - alert_type =/obj/screen/alert/status_effect/duskndawn + alert_type =/atom/movable/screen/alert/status_effect/duskndawn /datum/status_effect/duskndawn/on_apply() . = ..() @@ -813,7 +813,7 @@ status_type = STATUS_EFFECT_REFRESH duration = 60 SECONDS tick_interval = 1 SECONDS - alert_type = /obj/screen/alert/status_effect/marshal + alert_type = /atom/movable/screen/alert/status_effect/marshal /datum/status_effect/marshal/on_apply() . = ..() @@ -849,17 +849,17 @@ carbie.blood_volume += carbie.blood_volume >= BLOOD_VOLUME_NORMAL ? 0 : heal_amt*3 -/obj/screen/alert/status_effect/crucible_soul +/atom/movable/screen/alert/status_effect/crucible_soul name = "Blessing of Crucible Soul" desc = "You phased through the reality, you are halfway to your final destination..." icon_state = "crucible" -/obj/screen/alert/status_effect/duskndawn +/atom/movable/screen/alert/status_effect/duskndawn name = "Blessing of Dusk and Dawn" desc = "Many things hide beyond the horizon, with Owl's help i managed to slip past sun's guard and moon's watch." icon_state = "duskndawn" -/obj/screen/alert/status_effect/marshal +/atom/movable/screen/alert/status_effect/marshal name = "Blessing of Wounded Soldier" desc = "Some people seek power through redemption, one thing many people don't know is that battle is the ultimate redemption and wounds let you bask in eternal glory." icon_state = "wounded_soldier" diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 1c49f61996..d6cde67198 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -58,7 +58,7 @@ //SLEEPING /datum/status_effect/incapacitating/sleeping id = "sleeping" - alert_type = /obj/screen/alert/status_effect/asleep + alert_type = /atom/movable/screen/alert/status_effect/asleep needs_update_stat = TRUE var/mob/living/carbon/carbon_owner var/mob/living/carbon/human/human_owner @@ -95,62 +95,60 @@ /datum/status_effect/staggered/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) duration = set_duration + if(!CONFIG_GET(flag/sprint_enabled)) + new_owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/stagger, TRUE, CONFIG_GET(number/sprintless_stagger_slowdown)) + return ..() + +/datum/status_effect/staggered/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/stagger) return ..() /datum/status_effect/off_balance id = "offbalance" + blocks_sprint = TRUE alert_type = null /datum/status_effect/off_balance/on_creation(mob/living/new_owner, set_duration) if(isnum(set_duration)) duration = set_duration + if(!CONFIG_GET(flag/sprint_enabled)) + new_owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/off_balance, TRUE, CONFIG_GET(number/sprintless_off_balance_slowdown)) return ..() /datum/status_effect/off_balance/on_remove() var/active_item = owner.get_active_held_item() if(active_item) owner.visible_message("[owner.name] regains their grip on \the [active_item]!", "You regain your grip on \the [active_item]", null, COMBAT_MESSAGE_RANGE) + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/off_balance) return ..() -/obj/screen/alert/status_effect/asleep +/atom/movable/screen/alert/status_effect/asleep name = "Asleep" desc = "You've fallen asleep. Wait a bit and you should wake up. Unless you don't, considering how helpless you are." icon_state = "asleep" + /datum/status_effect/grouped/stasis id = "stasis" duration = -1 tick_interval = 10 var/last_dead_time -/datum/status_effect/no_combat_mode - id = "no_combat_mode" - alert_type = null - status_type = STATUS_EFFECT_REPLACE - blocks_combatmode = TRUE - -/datum/status_effect/no_combat_mode/on_creation(mob/living/new_owner, set_duration) - if(isnum(set_duration)) - duration = set_duration - . = ..() - -/datum/status_effect/no_combat_mode/robotic_emp +/datum/status_effect/robotic_emp id = "emp_no_combat_mode" /datum/status_effect/mesmerize id = "Mesmerize" - alert_type = /obj/screen/alert/status_effect/mesmerized + alert_type = /atom/movable/screen/alert/status_effect/mesmerized /datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration) . = ..() ADD_TRAIT(owner, TRAIT_MUTE, "mesmerize") - ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, "mesmerize") owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize) /datum/status_effect/mesmerize/on_remove() . = ..() REMOVE_TRAIT(owner, TRAIT_MUTE, "mesmerize") - REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, "mesmerize") owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/mesmerize) /datum/status_effect/mesmerize/on_creation(mob/living/new_owner, set_duration) @@ -158,7 +156,7 @@ duration = set_duration . = ..() -/obj/screen/alert/status_effect/mesmerized +/atom/movable/screen/alert/status_effect/mesmerized name = "Mesmerized" desc = "You can't tear your sight from who is in front of you... their gaze is simply too enthralling.." icon = 'icons/mob/actions/bloodsucker.dmi' @@ -168,7 +166,7 @@ id = "tased" alert_type = null var/movespeed_mod = /datum/movespeed_modifier/status_effect/tased - var/stamdmg_per_ds = 0 //a 20 duration would do 20 stamdmg, disablers do 24 or something + var/stamdmg_per_ds = 1 //a 20 duration would do 20 stamdmg, disablers do 24 or something var/last_tick = 0 //fastprocess processing speed is a goddamn sham, don't trust it. /datum/status_effect/electrode/on_creation(mob/living/new_owner, set_duration) @@ -199,17 +197,34 @@ /datum/status_effect/electrode/no_combat_mode id = "tased_strong" movespeed_mod = /datum/movespeed_modifier/status_effect/tased/no_combat_mode - blocks_combatmode = TRUE stamdmg_per_ds = 1 +/datum/status_effect/vtec_disabled + id = "vtec_disable" + tick = FALSE + +/datum/status_effect/vtec_disabled/on_creation(mob/living/new_owner, set_duration) + if(isnum(set_duration)) + duration = set_duration + . = ..() + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.vtec_disabled = TRUE + +/datum/status_effect/vtec_disabled/on_remove() + if(iscyborg(owner)) + var/mob/living/silicon/robot/R = owner + R.vtec_disabled = FALSE + return ..() + //OTHER DEBUFFS /datum/status_effect/his_wrath //does minor damage over time unless holding His Grace id = "his_wrath" duration = -1 tick_interval = 4 - alert_type = /obj/screen/alert/status_effect/his_wrath + alert_type = /atom/movable/screen/alert/status_effect/his_wrath -/obj/screen/alert/status_effect/his_wrath +/atom/movable/screen/alert/status_effect/his_wrath name = "His Wrath" desc = "You fled from His Grace instead of feeding Him, and now you suffer." icon_state = "his_grace" @@ -228,11 +243,11 @@ duration = 70 tick_interval = 0 //tick as fast as possible status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/belligerent + alert_type = /atom/movable/screen/alert/status_effect/belligerent var/leg_damage_on_toggle = 2 //damage on initial application and when the owner tries to toggle to run var/cultist_damage_on_toggle = 10 //damage on initial application and when the owner tries to toggle to run, but to cultists -/obj/screen/alert/status_effect/belligerent +/atom/movable/screen/alert/status_effect/belligerent name = "Belligerent" desc = "Kneel, her-eti'c." icon_state = "belligerent" @@ -753,7 +768,7 @@ /datum/status_effect/necropolis_curse/proc/apply_curse(set_curse) curse_flags |= set_curse if(curse_flags & CURSE_BLINDING) - owner.overlay_fullscreen("curse", /obj/screen/fullscreen/curse, 1) + owner.overlay_fullscreen("curse", /atom/movable/screen/fullscreen/curse, 1) /datum/status_effect/necropolis_curse/proc/remove_curse(remove_curse) if(remove_curse & CURSE_BLINDING) @@ -812,7 +827,7 @@ status_type = STATUS_EFFECT_UNIQUE tick_interval = 5 duration = 100 - alert_type = /obj/screen/alert/status_effect/kindle + alert_type = /atom/movable/screen/alert/status_effect/kindle var/old_health var/old_oxyloss @@ -841,7 +856,7 @@ owner.visible_message("The light in [owner]'s eyes fades!", \ "You snap out of your daze!") -/obj/screen/alert/status_effect/kindle +/atom/movable/screen/alert/status_effect/kindle name = "Dazzling Lights" desc = "Blinding light dances in your vision, stunning and silencing you. Any damage taken will shorten the light's effects!" icon_state = "kindle" @@ -854,7 +869,7 @@ status_type = STATUS_EFFECT_UNIQUE duration = 600 examine_text = "SUBJECTPRONOUN is drenched in thick, blue ichor!" - alert_type = /obj/screen/alert/status_effect/ichorial_stain + alert_type = /atom/movable/screen/alert/status_effect/ichorial_stain /datum/status_effect/ichorial_stain/on_apply() . = ..() @@ -867,7 +882,7 @@ owner.visible_message("The blue ichor on [owner]'s body dries out!", \ "The ichor on your body is dry - you can now be revived by vitality matrices again!") -/obj/screen/alert/status_effect/ichorial_stain +/atom/movable/screen/alert/status_effect/ichorial_stain name = "Ichorial Stain" desc = "Your body is covered in blue ichor! You can't be revived by vitality matrices." icon_state = "ichorial_stain" @@ -893,7 +908,7 @@ /datum/status_effect/strandling //get it, strand as in durathread strand + strangling = strandling hahahahahahahahahahhahahaha i want to die id = "strandling" status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/strandling + alert_type = /atom/movable/screen/alert/status_effect/strandling /datum/status_effect/strandling/on_apply() ADD_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") @@ -903,13 +918,13 @@ REMOVE_TRAIT(owner, TRAIT_MAGIC_CHOKE, "dumbmoron") return ..() -/obj/screen/alert/status_effect/strandling +/atom/movable/screen/alert/status_effect/strandling name = "Choking strand" desc = "A magical strand of Durathread is wrapped around your neck, preventing you from breathing! Click this icon to remove the strand." icon_state = "his_grace" alerttooltipstyle = "hisgrace" -/obj/screen/alert/status_effect/strandling/Click(location, control, params) +/atom/movable/screen/alert/status_effect/strandling/Click(location, control, params) . = ..() to_chat(mob_viewer, "You attempt to remove the durathread strand from around your neck.") if(do_after(mob_viewer, 35, null, mob_viewer)) @@ -946,9 +961,9 @@ tick_interval = 10 examine_text = "SUBJECTPRONOUN seems slow and unfocused." var/stun = TRUE - alert_type = /obj/screen/alert/status_effect/trance + alert_type = /atom/movable/screen/alert/status_effect/trance -/obj/screen/alert/status_effect/trance +/atom/movable/screen/alert/status_effect/trance name = "Trance" desc = "Everything feels so distant, and you can feel your thoughts forming loops inside your head..." icon_state = "high" @@ -1054,7 +1069,7 @@ id = "dna_melt" duration = 600 status_type = STATUS_EFFECT_REPLACE - alert_type = /obj/screen/alert/status_effect/dna_melt + alert_type = /atom/movable/screen/alert/status_effect/dna_melt var/kill_either_way = FALSE //no amount of removing mutations is gonna save you now /datum/status_effect/dna_melt/on_creation(mob/living/new_owner, set_duration, updating_canmove) @@ -1069,7 +1084,7 @@ H.something_horrible(kill_either_way) return ..() -/obj/screen/alert/status_effect/dna_melt +/atom/movable/screen/alert/status_effect/dna_melt name = "Genetic Breakdown" desc = "I don't feel so good. Your body can't handle the mutations! You have one minute to remove your mutations, or you will be met with a horrible fate." icon_state = "dna_melt" diff --git a/code/datums/status_effects/gas.dm b/code/datums/status_effects/gas.dm index d3d39e625a..26881fe94c 100644 --- a/code/datums/status_effects/gas.dm +++ b/code/datums/status_effects/gas.dm @@ -2,11 +2,11 @@ id = "frozen" duration = 100 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/freon + alert_type = /atom/movable/screen/alert/status_effect/freon var/icon/cube var/can_melt = TRUE -/obj/screen/alert/status_effect/freon +/atom/movable/screen/alert/status_effect/freon name = "Frozen Solid" desc = "You're frozen inside an ice cube, and cannot move! You can still do stuff, like shooting. Resist out of the cube!" icon_state = "frozen" diff --git a/code/datums/status_effects/neutral.dm b/code/datums/status_effects/neutral.dm index 5f59359193..2c274802b4 100644 --- a/code/datums/status_effects/neutral.dm +++ b/code/datums/status_effects/neutral.dm @@ -48,7 +48,7 @@ get_kill() return ..() -/obj/screen/alert/status_effect/in_love +/atom/movable/screen/alert/status_effect/in_love name = "In Love" desc = "You feel so wonderfully in love!" icon_state = "in_love" @@ -57,7 +57,7 @@ id = "in_love" duration = -1 status_type = STATUS_EFFECT_UNIQUE - alert_type = /obj/screen/alert/status_effect/in_love + alert_type = /atom/movable/screen/alert/status_effect/in_love var/mob/living/date /datum/status_effect/in_love/on_creation(mob/living/new_owner, mob/living/love_interest) diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 9dbbc1c469..fe605ba4a6 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -5,17 +5,17 @@ /datum/status_effect var/id = "effect" //Used for screen alerts. var/duration = -1 //How long the status effect lasts in DECISECONDS. Enter -1 for an effect that never ends unless removed through some means. + /// do we tick()? + var/tick = TRUE var/tick_interval = 10 //How many deciseconds between ticks, approximately. Leave at 10 for every second. var/next_tick //The scheduled time for the next tick. var/mob/living/owner //The mob affected by the status effect. var/on_remove_on_mob_delete = FALSE //if we call on_remove() when the mob is deleted var/examine_text //If defined, this text will appear when the mob is examined - to use he, she etc. use "SUBJECTPRONOUN" and replace it in the examines themselves - var/alert_type = /obj/screen/alert/status_effect //the alert thrown by the status effect, contains name and description - /// If this is TRUE, the user will have combt mode forcefully disabled while this is active. - var/blocks_combatmode = FALSE + var/alert_type = /atom/movable/screen/alert/status_effect //the alert thrown by the status effect, contains name and description /// If this is TRUE, the user will have sprint forcefully disabled while this is active. var/blocks_sprint = FALSE - var/obj/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists + var/atom/movable/screen/alert/status_effect/linked_alert = null //the alert itself, if it exists /// How many of the effect can be on one mob, and what happens when you try to add another var/status_type = STATUS_EFFECT_UNIQUE @@ -34,7 +34,7 @@ duration = world.time + duration next_tick = world.time + tick_interval if(alert_type) - var/obj/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) + var/atom/movable/screen/alert/status_effect/A = owner.throw_alert(id, alert_type) A.attached_effect = src //so the alert can reference us, if it needs to linked_alert = A //so we can reference the alert, if we need to START_PROCESSING(SSstatus_effects, src) @@ -61,8 +61,6 @@ /datum/status_effect/proc/on_apply() //Called whenever the buff is applied; returning FALSE will cause it to autoremove itself. SHOULD_CALL_PARENT(TRUE) - if(blocks_combatmode) - ADD_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) if(blocks_sprint) ADD_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) return TRUE @@ -74,8 +72,6 @@ /datum/status_effect/proc/on_remove() //Called whenever the buff expires or is removed; do note that at the point this is called, it is out of the owner's status_effects but owner is not yet null SHOULD_CALL_PARENT(TRUE) - if(blocks_combatmode) - REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) if(blocks_sprint) REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) return TRUE @@ -83,8 +79,6 @@ /datum/status_effect/proc/be_replaced() //Called instead of on_remove when a status effect is replaced by itself or when a status effect with on_remove_on_mob_delete = FALSE has its mob deleted owner.clear_alert(id) LAZYREMOVE(owner.status_effects, src) - if(blocks_combatmode) - REMOVE_TRAIT(owner, TRAIT_COMBAT_MODE_LOCKED, src) if(blocks_sprint) REMOVE_TRAIT(owner, TRAIT_SPRINT_LOCKED, src) owner = null @@ -106,7 +100,7 @@ // ALERT HOOK // //////////////// -/obj/screen/alert/status_effect +/atom/movable/screen/alert/status_effect name = "Curse of Mundanity" desc = "You don't feel any different..." var/datum/status_effect/attached_effect diff --git a/code/datums/status_effects/wound_effects.dm b/code/datums/status_effects/wound_effects.dm index 2ead3e6e19..74fc55e95b 100644 --- a/code/datums/status_effects/wound_effects.dm +++ b/code/datums/status_effects/wound_effects.dm @@ -1,13 +1,13 @@ // The shattered remnants of your broken limbs fill you with determination! -/obj/screen/alert/status_effect/determined +/atom/movable/screen/alert/status_effect/determined name = "Determined" desc = "The serious wounds you've sustained have put your body into fight-or-flight mode! Now's the time to look for an exit!" icon_state = "regenerative_core" /datum/status_effect/determined id = "determined" - alert_type = /obj/screen/alert/status_effect/determined + alert_type = /atom/movable/screen/alert/status_effect/determined /datum/status_effect/determined/on_apply() . = ..() @@ -21,7 +21,7 @@ id = "limp" status_type = STATUS_EFFECT_REPLACE tick_interval = 10 - alert_type = /obj/screen/alert/status_effect/limp + alert_type = /atom/movable/screen/alert/status_effect/limp var/msg_stage = 0//so you dont get the most intense messages immediately /// The left leg of the limping person var/obj/item/bodypart/l_leg/left @@ -49,7 +49,7 @@ UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_CARBON_GAIN_WOUND, COMSIG_CARBON_LOSE_WOUND, COMSIG_CARBON_ATTACH_LIMB, COMSIG_CARBON_REMOVE_LIMB)) return ..() -/obj/screen/alert/status_effect/limp +/atom/movable/screen/alert/status_effect/limp name = "Limping" desc = "One or more of your legs has been wounded, slowing down steps with that leg! Get it fixed, or at least splinted!" @@ -99,11 +99,11 @@ ///////////////////////// // wound alert -/obj/screen/alert/status_effect/wound +/atom/movable/screen/alert/status_effect/wound name = "Wounded" desc = "Your body has sustained serious damage, click here to inspect yourself." -/obj/screen/alert/status_effect/wound/Click() +/atom/movable/screen/alert/status_effect/wound/Click() var/mob/living/carbon/C = usr C.check_self_for_injuries() diff --git a/code/datums/traits/neutral.dm b/code/datums/traits/neutral.dm index 18d565ed5a..2f0667d942 100644 --- a/code/datums/traits/neutral.dm +++ b/code/datums/traits/neutral.dm @@ -154,3 +154,11 @@ /datum/quirk/longtimer/on_spawn() var/mob/living/carbon/C = quirk_holder C.generate_fake_scars(rand(min_scars, max_scars)) + +/datum/quirk/trashcan + name = "Trashcan" + desc = "You are able to consume and digest trash." + value = 0 + gain_text = "You feel like munching on a can of soda." + lose_text = "You no longer feel like you should be eating trash." + mob_trait = TRAIT_TRASHCAN diff --git a/code/datums/wires/_wires.dm b/code/datums/wires/_wires.dm index 1c9c14ee3e..81f99cfa69 100644 --- a/code/datums/wires/_wires.dm +++ b/code/datums/wires/_wires.dm @@ -166,6 +166,7 @@ on_pulse(wire, user) /datum/wires/proc/pulse_color(color, mob/living/user) + set waitfor = FALSE LAZYINITLIST(current_users) if(current_users[user]) return FALSE diff --git a/code/datums/wires/airlock.dm b/code/datums/wires/airlock.dm index 9af78b0090..f21b3acc31 100644 --- a/code/datums/wires/airlock.dm +++ b/code/datums/wires/airlock.dm @@ -106,12 +106,7 @@ A.aiControlDisabled = 1 else if(A.aiControlDisabled == -1) A.aiControlDisabled = 2 - sleep(10) - if(A) - if(A.aiControlDisabled == 1) - A.aiControlDisabled = 0 - else if(A.aiControlDisabled == 2) - A.aiControlDisabled = -1 + addtimer(CALLBACK(A, /obj/machinery/door/airlock.proc/reset_ai_wire), 1 SECONDS) if(WIRE_SHOCK) // Pulse to shock the door for 10 ticks. if(!A.secondsElectrified) A.set_electrified(30, usr) @@ -125,6 +120,12 @@ A.lights = !A.lights A.update_icon() +/obj/machinery/door/airlock/proc/reset_ai_wire() + if(aiControlDisabled == 1) + aiControlDisabled = 0 + else if(aiControlDisabled == 2) + aiControlDisabled = -1 + /datum/wires/airlock/on_cut(wire, mend) var/obj/machinery/door/airlock/A = holder if(usr && !A.hasSiliconAccessInArea(usr) && A.isElectrified() && A.shock(usr, 100)) diff --git a/code/datums/world_topic.dm b/code/datums/world_topic.dm index 6b8d1c9ce5..679d2faf11 100644 --- a/code/datums/world_topic.dm +++ b/code/datums/world_topic.dm @@ -124,7 +124,7 @@ for(var/mob/dead/observer/O in GLOB.player_list) if(O.key == expected_key) if(O.client?.address == addr) - new /obj/screen/splash(O.client, TRUE) + new /atom/movable/screen/splash(O.client, TRUE) break /datum/world_topic/adminmsg diff --git a/code/datums/wounds/_wounds.dm b/code/datums/wounds/_wounds.dm index 9c5a41de5d..6cab8818ee 100644 --- a/code/datums/wounds/_wounds.dm +++ b/code/datums/wounds/_wounds.dm @@ -136,7 +136,7 @@ SEND_SIGNAL(victim, COMSIG_CARBON_GAIN_WOUND, src, limb) victim.emote("pain") if(!victim.alerts["wound"]) // only one alert is shared between all of the wounds - victim.throw_alert("wound", /obj/screen/alert/status_effect/wound) + victim.throw_alert("wound", /atom/movable/screen/alert/status_effect/wound) var/demoted if(old_wound) diff --git a/code/datums/wounds/pierce.dm b/code/datums/wounds/pierce.dm index 56c60b31d7..b26728c377 100644 --- a/code/datums/wounds/pierce.dm +++ b/code/datums/wounds/pierce.dm @@ -128,7 +128,7 @@ initial_flow = 1.5 gauzed_clot_rate = 0.8 internal_bleeding_chance = 30 - internal_bleeding_coefficient = 1.25 + internal_bleeding_coefficient = 1 threshold_minimum = 40 threshold_penalty = 15 status_effect_type = /datum/status_effect/wound/pierce/moderate @@ -142,10 +142,10 @@ occur_text = "looses a violent spray of blood, revealing a pierced wound" sound_effect = 'sound/effects/wounds/pierce2.ogg' severity = WOUND_SEVERITY_SEVERE - initial_flow = 2.25 + initial_flow = 2 gauzed_clot_rate = 0.6 internal_bleeding_chance = 60 - internal_bleeding_coefficient = 1.5 + internal_bleeding_coefficient = 1.25 threshold_minimum = 60 threshold_penalty = 25 status_effect_type = /datum/status_effect/wound/pierce/severe @@ -159,10 +159,10 @@ occur_text = "blasts apart, sending chunks of viscera flying in all directions" sound_effect = 'sound/effects/wounds/pierce3.ogg' severity = WOUND_SEVERITY_CRITICAL - initial_flow = 3 + initial_flow = 2.7 gauzed_clot_rate = 0.4 internal_bleeding_chance = 80 - internal_bleeding_coefficient = 1.75 + internal_bleeding_coefficient = 1.5 threshold_minimum = 110 threshold_penalty = 40 status_effect_type = /datum/status_effect/wound/pierce/critical diff --git a/code/datums/wounds/slash.dm b/code/datums/wounds/slash.dm index 9044835272..6a631ab8f4 100644 --- a/code/datums/wounds/slash.dm +++ b/code/datums/wounds/slash.dm @@ -253,7 +253,7 @@ occur_text = "is cut open, slowly leaking blood" sound_effect = 'sound/effects/wounds/blood1.ogg' severity = WOUND_SEVERITY_MODERATE - initial_flow = 1.5 + initial_flow = 1.25 minimum_flow = 0.375 max_per_type = 3 clot_rate = 0.12 @@ -270,8 +270,8 @@ occur_text = "is ripped open, veins spurting blood" sound_effect = 'sound/effects/wounds/blood2.ogg' severity = WOUND_SEVERITY_SEVERE - initial_flow = 2.4375 - minimum_flow = 2.0625 + initial_flow = 2 + minimum_flow = 1.75 clot_rate = 0.07 max_per_type = 4 threshold_minimum = 60 @@ -288,8 +288,8 @@ occur_text = "is torn open, spraying blood wildly" sound_effect = 'sound/effects/wounds/blood3.ogg' severity = WOUND_SEVERITY_CRITICAL - initial_flow = 3.1875 - minimum_flow = 3 + initial_flow = 2.75 + minimum_flow = 2.5 clot_rate = -0.05 // critical cuts actively get worse instead of better max_per_type = 5 threshold_minimum = 90 diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 2a21d72119..a28d558454 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -553,7 +553,7 @@ GLOBAL_LIST_EMPTY(teleportlocs) A.power_equip = power_equip A.power_environ = power_environ INVOKE_ASYNC(A, .proc/power_change) - update_icon() + update_appearance() /area/proc/usage(chan) switch(chan) diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 7752dfb8d5..48213279f1 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -103,6 +103,9 @@ /// A luminescence-shifted value of the last color calculated for chatmessage overlays var/chat_color_darkened + ///Used for changing icon states for different base sprites. + var/base_icon_state + ///Mobs that are currently do_after'ing this atom, to be cleared from on Destroy() var/list/targeted_by @@ -169,7 +172,7 @@ * * [/turf/open/space/proc/Initialize] */ /atom/proc/Initialize(mapload, ...) - // SHOULD_NOT_SLEEP(TRUE) + SHOULD_NOT_SLEEP(TRUE) SHOULD_CALL_PARENT(TRUE) if(flags_1 & INITIALIZED_1) stack_trace("Warning: [src]([type]) initialized multiple times!") @@ -378,12 +381,26 @@ return FALSE /atom/proc/assume_air(datum/gas_mixture/giver) - qdel(giver) + return null + +/atom/proc/assume_air_moles(datum/gas_mixture/giver, moles) + return null + +/atom/proc/assume_air_ratio(datum/gas_mixture/giver, ratio) return null /atom/proc/remove_air(amount) return null +/atom/proc/remove_air_ratio(ratio) + return null + +/atom/proc/transfer_air(datum/gas_mixture/taker, amount) + return null + +/atom/proc/transfer_air_ratio(datum/gas_mixture/taker, ratio) + return null + /atom/proc/return_air() if(loc) return loc.return_air() @@ -517,37 +534,75 @@ if(!LAZYLEN(.)) // lol ..length return list("You examine [src] closer, but find nothing of interest...") +/** + * Updates the appearence of the icon + * + * Mostly delegates to update_name, update_desc, and update_icon + * + * Arguments: + * - updates: A set of bitflags dictating what should be updated. Defaults to [ALL] + */ +/atom/proc/update_appearance(updates=ALL) + //SHOULD_NOT_SLEEP(TRUE) + //SHOULD_CALL_PARENT(TRUE) + + . = NONE + updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_APPEARANCE, updates) + if(updates & UPDATE_NAME) + . |= update_name(updates) + if(updates & UPDATE_DESC) + . |= update_desc(updates) + if(updates & UPDATE_ICON) + . |= update_icon(updates) + +/// Updates the name of the atom +/atom/proc/update_name(updates=ALL) + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_NAME, updates) + +/// Updates the description of the atom +/atom/proc/update_desc(updates=ALL) + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_DESC, updates) + /// Updates the icon of the atom -/atom/proc/update_icon() - // I expect we're going to need more return flags and options in this proc - var/signalOut = SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON) - . = FALSE +/atom/proc/update_icon(updates=ALL) + SIGNAL_HANDLER + //SHOULD_CALL_PARENT(TRUE) - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_ICON_STATE)) + . = NONE + updates &= ~SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON, updates) + if(updates & UPDATE_ICON_STATE) update_icon_state() - . = TRUE + . |= UPDATE_ICON_STATE - if(!(signalOut & COMSIG_ATOM_NO_UPDATE_OVERLAYS)) - var/list/new_overlays = update_overlays() + if(updates & UPDATE_OVERLAYS) + if(LAZYLEN(managed_vis_overlays)) + SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) + + var/list/new_overlays = update_overlays(updates) if(managed_overlays) cut_overlay(managed_overlays) managed_overlays = null if(length(new_overlays)) managed_overlays = new_overlays add_overlay(new_overlays) - . = TRUE + . |= UPDATE_OVERLAYS - SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, signalOut, .) + . |= SEND_SIGNAL(src, COMSIG_ATOM_UPDATED_ICON, updates, .) /// Updates the icon state of the atom /atom/proc/update_icon_state() + //SHOULD_CALL_PARENT(TRUE) + return SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_ICON_STATE) /// Updates the overlays of the atom /atom/proc/update_overlays() - SHOULD_CALL_PARENT(TRUE) + //SHOULD_CALL_PARENT(TRUE) . = list() SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_OVERLAYS, .) + /atom/proc/relaymove(mob/living/user) if(!istype(user)) return //why are you buckling nonliving mobs to atoms? diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 098f1a2ea0..391d3b467d 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -57,13 +57,20 @@ /// Should we use tooltips, if the thing does not have the code implemented `get_tooltip_data()`, it will default to examine(src) var/tooltips = FALSE - + /// How loudly we yell + var/yell_power = 50 + /// last time we yelled + var/last_yell = 0 /atom/movable/Initialize(mapload) . = ..() switch(blocks_emissive) if(EMISSIVE_BLOCK_GENERIC) - update_emissive_block() + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) + gen_emissive_blocker.color = GLOB.em_block_color + gen_emissive_blocker.dir = dir + gen_emissive_blocker.appearance_flags |= appearance_flags + add_overlay(list(gen_emissive_blocker)) if(EMISSIVE_BLOCK_UNIQUE) render_target = ref(src) em_block = new(src, render_target) @@ -108,13 +115,23 @@ /atom/movable/proc/update_emissive_block() if(blocks_emissive != EMISSIVE_BLOCK_GENERIC) return - if(length(managed_vis_overlays)) - for(var/a in managed_vis_overlays) - var/obj/effect/overlay/vis/vs - if(vs.plane == EMISSIVE_BLOCKER_PLANE) - SSvis_overlays.remove_vis_overlay(src, list(vs)) - break - SSvis_overlays.add_vis_overlay(src, icon, icon_state, EMISSIVE_BLOCKER_LAYER, EMISSIVE_BLOCKER_PLANE, dir) + else if (blocks_emissive == EMISSIVE_BLOCK_GENERIC) + var/mutable_appearance/gen_emissive_blocker = mutable_appearance(icon, icon_state, plane = EMISSIVE_PLANE, alpha = src.alpha) + gen_emissive_blocker.color = GLOB.em_block_color + gen_emissive_blocker.dir = dir + gen_emissive_blocker.appearance_flags |= appearance_flags + return gen_emissive_blocker + else if(blocks_emissive == EMISSIVE_BLOCK_UNIQUE) + if(!em_block) + render_target = ref(src) + em_block = new(src, render_target) + return em_block + +/atom/movable/update_overlays() + . = ..() + var/emissive_block = update_emissive_block() + if(emissive_block) + . += emissive_block /atom/movable/proc/can_zFall(turf/source, levels = 1, turf/target, direction) if(!direction) diff --git a/code/game/gamemodes/dynamic/dynamic.dm b/code/game/gamemodes/dynamic/dynamic.dm index 55f91ba3d3..c7fee7df96 100644 --- a/code/game/gamemodes/dynamic/dynamic.dm +++ b/code/game/gamemodes/dynamic/dynamic.dm @@ -711,10 +711,15 @@ GLOBAL_VAR_INIT(dynamic_forced_storyteller, null) update_playercounts() if (storyteller.should_inject_antag()) SSblackbox.record_feedback("tally","dynamic",1,"Attempted midround injections") - 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) + do_midround_injection() + +/datum/game_mode/dynamic/proc/do_midround_injection() + set waitfor = FALSE + 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) + /// Updates current_players. /datum/game_mode/dynamic/proc/update_playercounts() diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm index ed17d830ba..a253aa906c 100644 --- a/code/game/gamemodes/gangs/dominator.dm +++ b/code/game/gamemodes/gangs/dominator.dm @@ -105,14 +105,18 @@ if(tempgang != gang) tempgang.message_gangtools("WARNING: [gang.name] Gang takeover imminent. Their dominator at [domloc.map_name] must be destroyed!",1,1) else - Cinematic(CINEMATIC_MALF,world) //Here is the gang victory trigger on the dominator ending. - gang.winner = TRUE - SSticker.news_report = GANG_VICTORY - SSticker.force_ending = TRUE + endgame() if(!.) STOP_PROCESSING(SSmachines, src) +/obj/machinery/dominator/proc/endgame() + set waitfor = FALSE + Cinematic(CINEMATIC_MALF,world) //Here is the gang victory trigger on the dominator ending. + gang.winner = TRUE + SSticker.news_report = GANG_VICTORY + SSticker.force_ending = TRUE + /obj/machinery/dominator/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) switch(damage_type) if(BRUTE) diff --git a/code/game/gamemodes/objective_items.dm b/code/game/gamemodes/objective_items.dm index 7b7fdbeaf9..78644281b8 100644 --- a/code/game/gamemodes/objective_items.dm +++ b/code/game/gamemodes/objective_items.dm @@ -130,7 +130,7 @@ /datum/objective_item/steal/plasma/check_special_completion(obj/item/tank/T) var/target_amount = text2num(name) var/found_amount = 0 - found_amount += T.air_contents.get_moles(/datum/gas/plasma) + found_amount += T.air_contents.get_moles(GAS_PLASMA) return found_amount>=target_amount diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index 6319dec891..e05991dd8a 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -148,11 +148,15 @@ Class Procs: START_PROCESSING(SSmachines, src) else START_PROCESSING(SSfastprocess, src) - power_change() RegisterSignal(src, COMSIG_ENTER_AREA, .proc/power_change) if (occupant_typecache) occupant_typecache = typecacheof(occupant_typecache) + return INITIALIZE_HINT_LATELOAD + +/obj/machinery/LateInitialize() + . = ..() + power_change() /obj/machinery/Destroy() GLOB.machines.Remove(src) @@ -176,6 +180,17 @@ Class Procs: /obj/machinery/proc/process_atmos()//If you dont use process why are you here return PROCESS_KILL +///Called when we want to change the value of the stat variable. Holds bitflags. +/obj/machinery/proc/set_machine_stat(new_value) + if(new_value == stat) + return + . = stat + stat = new_value + on_machine_stat_update(stat) + +/obj/machinery/proc/on_machine_stat_update(stat) + return + /obj/machinery/emp_act(severity) . = ..() if(use_power && !stat && !(. & EMP_PROTECT_SELF)) @@ -383,8 +398,11 @@ Class Procs: M.icon_state = "box_1" /obj/machinery/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) stat |= BROKEN + SEND_SIGNAL(src, COMSIG_MACHINERY_BROKEN, damage_flag) + update_appearance() return TRUE /obj/machinery/contents_explosion(severity, target) diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 7950d54ad3..35aa822a23 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -407,7 +407,7 @@ /obj/machinery/camera/get_remote_view_fullscreens(mob/user) if(view_range == short_range) //unfocused - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /obj/machinery/camera/update_remote_sight(mob/living/user) user.see_invisible = SEE_INVISIBLE_LIVING //can't see ghosts through cameras diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index e95543cffb..75c84bd2a8 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -173,10 +173,7 @@ clonemind.transfer_to(H) else if(get_clone_mind == CLONEPOD_POLL_MIND) - var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE) - if(LAZYLEN(candidates)) - var/mob/C = pick(candidates) - H.key = C.key + poll_for_mind(H, clonename) if(grab_ghost_when == CLONER_FRESH_CLONE) H.grab_ghost() @@ -206,6 +203,13 @@ attempting = FALSE return TRUE +/obj/machinery/clonepod/proc/poll_for_mind(mob/living/carbon/human/H, clonename) + set waitfor = FALSE + var/list/candidates = pollCandidatesForMob("Do you want to play as [clonename]'s defective clone? (Don't ERP without permission from the original)", null, null, null, 100, H, POLL_IGNORE_CLONE) + if(LAZYLEN(candidates)) + var/mob/C = pick(candidates) + H.key = C.key + //Grow clones to maturity then kick them out. FREELOADERS /obj/machinery/clonepod/process() var/mob/living/mob_occupant = occupant @@ -384,7 +388,7 @@ to_chat(occupant, "There is a bright flash!
You feel like a new being.
") mob_occupant.flash_act() - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_ON_CLONE] if(policy) to_chat(occupant, policy) diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 0c628ba43e..a2d32e0d4f 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -57,8 +57,8 @@ var/overlay_state = icon_screen if(stat & BROKEN) overlay_state = "[icon_state]_broken" - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, overlay_state, EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha=128) + . += mutable_appearance(icon, overlay_state) + . += emissive_appearance(icon, overlay_state) /obj/machinery/computer/power_change() ..() diff --git a/code/game/machinery/computer/atmos_control.dm b/code/game/machinery/computer/atmos_control.dm index 98d8811948..fa552a4e66 100644 --- a/code/game/machinery/computer/atmos_control.dm +++ b/code/game/machinery/computer/atmos_control.dm @@ -60,7 +60,7 @@ var/total_moles = air_sample.total_moles() if(total_moles) for(var/gas_id in air_sample.get_gases()) - var/gas_name = GLOB.meta_gas_names[gas_id] + var/gas_name = GLOB.gas_data.names[gas_id] signal.data["gases"][gas_name] = air_sample.get_moles(gas_id) / total_moles * 100 radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) @@ -73,11 +73,11 @@ /obj/machinery/air_sensor/Initialize() . = ..() - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src set_frequency(frequency) /obj/machinery/air_sensor/Destroy() - SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src SSradio.remove_object(src, frequency) return ..() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index a62d2cd102..a6b774523c 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -16,10 +16,10 @@ // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background interaction_flags_machine = INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_SET_MACHINE //| INTERACT_MACHINE_REQUIRES_SIGHT @@ -40,8 +40,8 @@ cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 7d2c851206..9d675bc5dd 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -275,7 +275,7 @@ if(final) playsound(origin, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(get_turf(final)) - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) //Shorter flash than normal since it's an ~~advanced~~ console! else playsound(origin, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/game/machinery/computer/mechlaunchpad.dm b/code/game/machinery/computer/mechlaunchpad.dm index 3489ee5d35..86c4a35799 100644 --- a/code/game/machinery/computer/mechlaunchpad.dm +++ b/code/game/machinery/computer/mechlaunchpad.dm @@ -123,7 +123,7 @@ var/list/this_pad = list() this_pad["name"] = pad.display_name this_pad["id"] = i - if(pad.machine_stat & NOPOWER) + if(pad.stat & NOPOWER) this_pad["inactive"] = TRUE pad_list += list(this_pad) else @@ -135,7 +135,7 @@ var/obj/machinery/mechpad/current_pad = mechpads[selected_id] data["pad_name"] = current_pad.display_name data["selected_pad"] = current_pad - if(QDELETED(current_pad) || (current_pad.machine_stat & NOPOWER)) + if(QDELETED(current_pad) || (current_pad.stat & NOPOWER)) data["pad_active"] = FALSE return data data["pad_active"] = TRUE diff --git a/code/game/machinery/computer/pod.dm b/code/game/machinery/computer/pod.dm index 97e2d4ea0a..f1cf187ff9 100644 --- a/code/game/machinery/computer/pod.dm +++ b/code/game/machinery/computer/pod.dm @@ -34,6 +34,7 @@ * Initiates launching sequence by checking if all components are functional, opening poddoors, firing mass drivers and then closing poddoors */ /obj/machinery/computer/pod/proc/alarm() + set waitfor = FALSE if(stat & (NOPOWER|BROKEN)) return diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 2a4b586d7c..5215baf87f 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -254,7 +254,7 @@ DA.update_name() qdel(src) -/obj/machinery/door/airlock/plasma/BlockSuperconductivity() //we don't stop the heat~ +/obj/machinery/door/airlock/plasma/BlockThermalConductivity() //we don't stop the heat~ return 0 /obj/machinery/door/airlock/plasma/attackby(obj/item/C, mob/user, params) diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index a20374f878..9ff03cd387 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -9,6 +9,7 @@ layer = OPEN_DOOR_LAYER power_channel = ENVIRON max_integrity = 350 + damage_deflection = 10 armor = list("melee" = 30, "bullet" = 30, "laser" = 20, "energy" = 20, "bomb" = 10, "bio" = 100, "rad" = 100, "fire" = 80, "acid" = 70) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1|DEFAULT_RICOCHET_1 @@ -38,7 +39,7 @@ var/locked = FALSE //whether the door is bolted or not. var/assemblytype //the type of door frame to drop during deconstruction var/datum/effect_system/spark_spread/spark_system - var/damage_deflection = 10 + var/real_explosion_block //ignore this, just use explosion_block var/red_alert_access = FALSE //if TRUE, this door will always open on red alert var/poddoor = FALSE @@ -223,11 +224,6 @@ return 1 return ..() -/obj/machinery/door/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < damage_deflection) - return 0 - . = ..() - /obj/machinery/door/take_damage(damage_amount, damage_type = BRUTE, damage_flag = 0, sound_effect = 1, attack_dir) . = ..() if(. && obj_integrity > 0) @@ -386,7 +382,7 @@ if(!glass && GLOB.cameranet) GLOB.cameranet.updateVisibility(src, 0) -/obj/machinery/door/BlockSuperconductivity() // All non-glass airlocks block heat, this is intended. +/obj/machinery/door/BlockThermalConductivity() // All non-glass airlocks block heat, this is intended. if(opacity || heat_proof) return 1 return 0 diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index c6b29cf54c..229a2d98d8 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -79,23 +79,33 @@ if(is_station_level(z)) . += "fire_[GLOB.security_level]" - SSvis_overlays.add_vis_overlay(src, icon, "fire_[GLOB.security_level]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_[GLOB.security_level]") + . += emissive_appearance(icon, "fire_[GLOB.security_level]") else . += "fire_[SEC_LEVEL_GREEN]" - SSvis_overlays.add_vis_overlay(src, icon, "fire_[SEC_LEVEL_GREEN]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_[SEC_LEVEL_GREEN]") + . += emissive_appearance(icon, "fire_[SEC_LEVEL_GREEN]") var/area/A = src.loc A = A.loc if(!detecting || !A.fire) . += "fire_off" - SSvis_overlays.add_vis_overlay(src, icon, "fire_off", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_off") + . += emissive_appearance(icon, "fire_off") else if(obj_flags & EMAGGED) . += "fire_emagged" - SSvis_overlays.add_vis_overlay(src, icon, "fire_emagged", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_emagged") + . += emissive_appearance(icon, "fire_emagged") else . += "fire_on" - SSvis_overlays.add_vis_overlay(src, icon, "fire_on", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) + . += mutable_appearance(icon, "fire_on") + . += emissive_appearance(icon, "fire_on") + + if(!panel_open && detecting) //It just looks horrible with the panel open + . += "fire_detected" + . += mutable_appearance(icon, "fire_detected") + . += emissive_appearance(icon, "fire_detected") //Pain /obj/machinery/firealarm/emp_act(severity) . = ..() diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 421e3433ca..03d9dcee4b 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -1,52 +1,70 @@ -// the light switch -// can have multiple per area -// can also operate on non-loc area through "otherarea" var +/// The light switch. Can have multiple per area. /obj/machinery/light_switch name = "light switch" icon = 'icons/obj/power.dmi' icon_state = "light1" - plane = ABOVE_WALL_PLANE + base_icon_state = "light" desc = "Make dark." - var/on = TRUE var/area/area = null var/otherarea = null +/obj/machinery/light_switch/directional/north + dir = SOUTH + pixel_y = 26 + +/obj/machinery/light_switch/directional/south + dir = NORTH + pixel_y = -26 + +/obj/machinery/light_switch/directional/east + dir = WEST + pixel_x = 26 + +/obj/machinery/light_switch/directional/west + dir = EAST + pixel_x = -26 + /obj/machinery/light_switch/Initialize() . = ..() - area = get_area(src) - + if(istext(area)) + area = text2path(area) + if(ispath(area)) + area = GLOB.areas_by_type[area] if(otherarea) area = locate(text2path("/area/[otherarea]")) + if(!area) + area = get_area(src) if(!name) name = "light switch ([area.name])" - on = area.lightswitch - update_icon() +/obj/machinery/light_switch/update_appearance(updates=ALL) + . = ..() + luminosity = (stat & NOPOWER) ? 0 : 1 /obj/machinery/light_switch/update_icon_state() if(stat & NOPOWER) - icon_state = "light-p" - else - if(on) - icon_state = "light1" - else - icon_state = "light0" + icon_state = "[base_icon_state]-p" + return ..() + icon_state = "[base_icon_state][area.lightswitch ? 1 : 0]" + return ..() + +/obj/machinery/light_switch/update_overlays() + . = ..() + if(!(stat & NOPOWER)) + . += emissive_appearance(icon, "[base_icon_state]-glow", alpha = src.alpha) /obj/machinery/light_switch/examine(mob/user) . = ..() - . += "It is [on? "on" : "off"]." - + . += "It is [area.lightswitch ? "on" : "off"]." /obj/machinery/light_switch/interact(mob/user) . = ..() - on = !on - area.lightswitch = on - area.update_icon() + area.lightswitch = !area.lightswitch + area.update_appearance() for(var/obj/machinery/light_switch/L in area) - L.on = on - L.update_icon() + L.update_appearance() area.power_change() @@ -58,7 +76,7 @@ else stat |= NOPOWER - update_icon() + update_appearance() /obj/machinery/light_switch/emp_act(severity) . = ..() diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index aad64df6d9..e346439e03 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -30,7 +30,7 @@ integrity_failure = 0.5 armor = list("melee" = 50, "bullet" = 30, "laser" = 30, "energy" = 30, "bomb" = 30, "bio" = 0, "rad" = 0, "fire" = 90, "acid" = 90) /// Base turret icon state - var/base_icon_state = "standard" + base_icon_state = "standard" /// Scan range of the turret for locating targets var/scan_range = 7 /// For turrets inside other objects @@ -459,11 +459,11 @@ else if(iscarbon(A)) var/mob/living/carbon/C = A - //If not emagged, only target carbons that can use items - if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || !(C.mobility_flags & MOBILITY_USE))) + //If not on lethal, only target carbons that aren't cuffed nor stamcrit or just plain crit. + if(mode != TURRET_LETHAL && (C.stat || C.handcuffed || IS_STAMCRIT(C))) continue - //If emagged, target all but dead carbons + //If on lethal, target all but dead carbons if(mode == TURRET_LETHAL && C.stat == DEAD) continue @@ -503,6 +503,7 @@ return 1 /obj/machinery/porta_turret/proc/popUp() //pops the turret up + set waitfor = FALSE if(!anchored) return if(raising || raised) @@ -521,6 +522,7 @@ layer = MOB_LAYER /obj/machinery/porta_turret/proc/popDown() //pops the turret down + set waitfor = FALSE if(raising || !raised) return if(stat & BROKEN) diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm index aad011119f..62696a0853 100755 --- a/code/game/machinery/recharger.dm +++ b/code/game/machinery/recharger.dm @@ -2,6 +2,7 @@ name = "recharger" icon = 'icons/obj/stationobjs.dmi' icon_state = "recharger0" + base_icon_state = "recharger" desc = "A charging dock for energy based weaponry." use_power = IDLE_POWER_USE idle_power_usage = 4 @@ -187,16 +188,29 @@ if(B.cell) B.cell.charge = 0 +/obj/machinery/recharger/update_appearance(updates) + . = ..() + if((stat & (NOPOWER|BROKEN)) || panel_open || !anchored) + luminosity = 0 + return + luminosity = 1 -/obj/machinery/recharger/update_icon_state() +/obj/machinery/recharger/update_overlays() + . = ..() if(stat & (NOPOWER|BROKEN) || !anchored) - icon_state = "rechargeroff" - else if(panel_open) - icon_state = "rechargeropen" - else if(charging) - if(using_power) - icon_state = "recharger1" - else - icon_state = "recharger2" - else - icon_state = "recharger0" + return + if(panel_open) + . += mutable_appearance(icon, "[base_icon_state]-open", alpha = src.alpha) + return + + if(!charging) + . += mutable_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-empty", alpha = src.alpha) + return + if(using_power) + . += mutable_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-charging", alpha = src.alpha) + return + + . += mutable_appearance(icon, "[base_icon_state]-full", alpha = src.alpha) + . += emissive_appearance(icon, "[base_icon_state]-full", alpha = src.alpha) diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index 56854d2d71..8f7b772072 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -28,7 +28,7 @@ pipe_flags = PIPING_ONE_PER_TURF | PIPING_DEFAULT_LAYER_ONLY - var/gas_type = /datum/gas/plasma + var/gas_type = GAS_PLASMA var/efficiency_multiplier = 1 var/gas_capacity = 0 diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index d6478f2e58..0a529cd395 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -66,7 +66,7 @@ if(panel_open) . += "sheater-open" -/obj/machinery/space_heater/process() +/obj/machinery/space_heater/process_atmos() if(!on || !is_operational()) if (on) // If it's broken, turn it off too on = FALSE @@ -220,7 +220,7 @@ usr.visible_message("[usr] switches [on ? "on" : "off"] \the [src].", "You switch [on ? "on" : "off"] \the [src].") update_icon() if (on) - START_PROCESSING(SSmachines, src) + SSair.atmos_air_machinery += src . = TRUE if("mode") setMode = params["mode"] diff --git a/code/game/machinery/syndicatebomb.dm b/code/game/machinery/syndicatebomb.dm index 561daf433d..4009b1b56b 100644 --- a/code/game/machinery/syndicatebomb.dm +++ b/code/game/machinery/syndicatebomb.dm @@ -288,6 +288,7 @@ qdel(src) /obj/item/bombcore/proc/defuse() + set waitfor = FALSE //Note: Because of how var/defused is used you shouldn't override this UNLESS you intend to set the var to 0 or // otherwise remove the core/reset the wires before the end of defuse(). It will repeatedly be called otherwise. diff --git a/code/game/mecha/combat/neovgre.dm b/code/game/mecha/combat/neovgre.dm index 584a2d007e..75470abe88 100644 --- a/code/game/mecha/combat/neovgre.dm +++ b/code/game/mecha/combat/neovgre.dm @@ -70,7 +70,6 @@ cell.charge = INFINITY max_integrity = INFINITY obj_integrity = max_integrity - CHECK_TICK //Just to be on the safe side lag wise else if(cell.charge < cell.maxcharge) for(var/obj/effect/clockwork/sigil/transmission/T in range(SIGIL_ACCESS_RANGE, src)) @@ -80,7 +79,6 @@ adjust_clockwork_power(-delta) if(obj_integrity < max_integrity && istype(loc, /turf/open/floor/clockwork)) obj_integrity += min(max_integrity - obj_integrity, max_integrity / 200) - CHECK_TICK /obj/mecha/combat/neovgre/Initialize() .=..() diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 4dbb57479f..e1861232f4 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -422,12 +422,12 @@ return var/datum/gas_mixture/GM = new if(prob(10)) - GM.adjust_moles(/datum/gas/plasma,100) + GM.adjust_moles(GAS_PLASMA,100) GM.set_temperature(1500+T0C) //should be enough to start a fire T.visible_message("[src] suddenly disgorges a cloud of heated plasma.") qdel(src) else - GM.adjust_moles(/datum/gas/plasma,5) + GM.adjust_moles(GAS_PLASMA,5) GM.set_temperature(istype(T) ? T.air.return_temperature() : T20C) T.visible_message("[src] suddenly disgorges a cloud of plasma.") T.assume_air(GM) diff --git a/code/game/mecha/equipment/weapons/mecha_ammo.dm b/code/game/mecha/equipment/weapons/mecha_ammo.dm index 83a85ffcba..3253e6cbd6 100644 --- a/code/game/mecha/equipment/weapons/mecha_ammo.dm +++ b/code/game/mecha/equipment/weapons/mecha_ammo.dm @@ -12,7 +12,7 @@ var/load_audio = "sound/weapons/gun_magazine_insert_empty_1.ogg" var/ammo_type -/obj/item/mecha_ammo/proc/update_name() +/obj/item/mecha_ammo/update_name() if(!rounds) name = "empty ammo box" desc = "An exosuit ammuniton box that has since been emptied. Please recycle." diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index ce8171405f..86bbf81dd2 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -203,11 +203,7 @@ equipment.Cut() cell = null internal_tank = null - if(loc) - loc.assume_air(cabin_air) - air_update_turf() - else - qdel(cabin_air) + assume_air(cabin_air) cabin_air = null qdel(spark_system) spark_system = null @@ -257,8 +253,8 @@ /obj/mecha/proc/add_cabin() cabin_air = new(200) cabin_air.set_temperature(T20C) - cabin_air.set_moles(/datum/gas/oxygen,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) - cabin_air.set_moles(/datum/gas/nitrogen,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.set_moles(GAS_O2,O2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) + cabin_air.set_moles(GAS_N2,N2STANDARD*cabin_air.return_volume()/(R_IDEAL_GAS_EQUATION*cabin_air.return_temperature())) return cabin_air /obj/mecha/proc/add_radio() @@ -321,13 +317,7 @@ if(internal_damage & MECHA_INT_TANK_BREACH) //remove some air from internal tank if(internal_tank) - var/datum/gas_mixture/int_tank_air = internal_tank.return_air() - var/datum/gas_mixture/leaked_gas = int_tank_air.remove_ratio(0.1) - if(loc) - loc.assume_air(leaked_gas) - air_update_turf() - else - qdel(leaked_gas) + assume_air_ratio(internal_tank.return_air(), 0.1) if(internal_damage & MECHA_INT_SHORT_CIRCUIT) if(get_charge()) @@ -350,8 +340,7 @@ if(pressure_delta > 0) //cabin pressure lower than release pressure if(tank_air.return_temperature() > 0) transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = tank_air.remove(transfer_moles) - cabin_air.merge(removed) + tank_air.transfer_to(cabin_air,transfer_moles) else if(pressure_delta < 0) //cabin pressure higher than release pressure var/datum/gas_mixture/t_air = return_air() pressure_delta = cabin_pressure - release_pressure @@ -359,11 +348,7 @@ pressure_delta = min(cabin_pressure - t_air.return_pressure(), pressure_delta) if(pressure_delta > 0) //if location pressure is lower than cabin pressure transfer_moles = pressure_delta*cabin_air.return_volume()/(cabin_air.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = cabin_air.remove(transfer_moles) - if(t_air) - t_air.merge(removed) - else //just delete the cabin gas, we're in space or some shit - qdel(removed) + cabin_air.transfer_to(t_air, transfer_moles) if(occupant) if(cell) @@ -372,22 +357,22 @@ if(0.75 to INFINITY) occupant.clear_alert("charge") if(0.5 to 0.75) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 1) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 2) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - occupant.throw_alert("charge", /obj/screen/alert/lowcell, 3) + occupant.throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - occupant.throw_alert("charge", /obj/screen/alert/emptycell) + occupant.throw_alert("charge", /atom/movable/screen/alert/emptycell) var/integrity = obj_integrity/max_integrity*100 switch(integrity) if(30 to 45) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 1) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 1) if(15 to 35) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 2) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 2) if(-INFINITY to 15) - occupant.throw_alert("mech damage", /obj/screen/alert/low_mech_integrity, 3) + occupant.throw_alert("mech damage", /atom/movable/screen/alert/low_mech_integrity, 3) else occupant.clear_alert("mech damage") var/atom/checking = occupant.loc @@ -809,6 +794,11 @@ return cabin_air.remove(amount) return ..() +/obj/mecha/remove_air_ratio(ratio) + if(use_internal_tank) + return cabin_air.remove_ratio(ratio) + return ..() + /obj/mecha/return_air() if(use_internal_tank) return cabin_air diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 27b0aa4e66..afc4312779 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -73,7 +73,7 @@ M.setDir(dir) buckled_mobs |= M M.update_mobility() - M.throw_alert("buckled", /obj/screen/alert/restrained/buckled) + M.throw_alert("buckled", /atom/movable/screen/alert/restrained/buckled) post_buckle_mob(M) SEND_SIGNAL(src, COMSIG_MOVABLE_BUCKLE, M, force) diff --git a/code/game/objects/effects/alien_acid.dm b/code/game/objects/effects/alien_acid.dm index 6496b392c3..40d950332c 100644 --- a/code/game/objects/effects/alien_acid.dm +++ b/code/game/objects/effects/alien_acid.dm @@ -9,6 +9,7 @@ resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF layer = ABOVE_NORMAL_TURF_LAYER var/turf/target + var/acid_level = 0 // Removed from obj, so it goes here now /obj/effect/acid/Initialize(mapload, acid_pwr, acid_amt) @@ -42,7 +43,7 @@ for(var/obj/O in target) if(prob(20) && !(resistance_flags & UNACIDABLE)) - if(O.acid_level < acid_level*0.3) + if(O.acid_level() < acid_level*0.3) var/acid_used = min(acid_level*0.05, 20) O.acid_act(10, acid_used) acid_level = max(0, acid_level - acid_used*10) diff --git a/code/game/objects/effects/anomalies.dm b/code/game/objects/effects/anomalies.dm index 8f8b83bfde..66579c90f3 100644 --- a/code/game/objects/effects/anomalies.dm +++ b/code/game/objects/effects/anomalies.dm @@ -296,7 +296,7 @@ var/mob/C = pick(candidates) message_admins("[key_name_admin(C)] has taken control of ([key_name_admin(S)])") C.transfer_ckey(S, FALSE) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_ON_PYROCLASTIC_SENTIENT] if(policy) to_chat(S,policy) diff --git a/code/game/objects/effects/decals/cleanable/humans.dm b/code/game/objects/effects/decals/cleanable/humans.dm index bd32ddadf3..e5ccd9f21a 100644 --- a/code/game/objects/effects/decals/cleanable/humans.dm +++ b/code/game/objects/effects/decals/cleanable/humans.dm @@ -53,7 +53,7 @@ bloodiness = 0 /obj/effect/decal/cleanable/blood/old/Initialize(mapload, list/datum/disease/diseases) - ..() + . = ..() icon_state += "-old" add_blood_DNA(list("Non-human DNA" = "A+")) diff --git a/code/game/objects/effects/decals/misc.dm b/code/game/objects/effects/decals/misc.dm index 8f46d5cc46..752a5dff2c 100644 --- a/code/game/objects/effects/decals/misc.dm +++ b/code/game/objects/effects/decals/misc.dm @@ -19,10 +19,93 @@ icon = 'icons/obj/chempuff.dmi' pass_flags = PASSTABLE | PASSGRILLE layer = FLY_LAYER + var/stream = FALSE + var/speed = 1 + var/range = 3 + var/hits_left = 3 + var/range_left = 3 + var/firstmove = TRUE + var/list/hit /obj/effect/decal/chempuff/blob_act(obj/structure/blob/B) return +/obj/effect/decal/chempuff/Initialize(mapload, stream_mode, speed, range, hits_left, size) + . = ..() + create_reagents(size, NONE, NO_REAGENTS_VALUE) + stream = stream_mode + src.speed = speed + src.range = src.range_left = range + src.hits_left = hits_left + hit = list() + +/obj/effect/decal/chempuff/Destroy() + hit = null + return ..() + +/// proc called to handle us hitting something +/obj/effect/decal/chempuff/proc/hit_thing(atom/A, bump_hit) + // if the thing is invisible it usually is abstract/underfloor. also, don't hit ourselves. + if(A == src || A.invisibility) + return + // don't hit anything on the first move unless overridden (see: we're colliding a wall blocking our move out of the first tile) + if(firstmove && !bump_hit) + return + // we're out of hits or we already hit it + if(!hits_left || hit[A]) + return + var/living = isliving(A) + // if it's not dense and we're a stream instead of a mist, and we're not out of range + if(!A.density && stream && range_left && !bump_hit) + return + // non living mobs are effectively abstract + if(ismob(A) && !living) + return + hit[A] = TRUE + reagents.reaction(A, VAPOR) + // mobs absorb enough to decrement hits_left, as well as stuff blocking us. + if(ismob(A) || bump_hit) + hits_left-- + +/obj/effect/decal/chempuff/Crossed(atom/movable/AM, oldloc) + . = ..() + // bump things moving into us as long as we're not on our first move/moving out of origin tile + hit_thing(AM) + +/obj/effect/decal/chempuff/Bump(atom/A) + . = ..() + // if we hit something blocking our movement, collide it regardless even if we're still on our origin tile + hit_thing(A, TRUE) + +/obj/effect/decal/chempuff/proc/run_puff(atom/target) + var/safety = 255 + while(range_left) + if(!safety--) + CRASH("Spray ran out of safety.") + // move towards new turf + step_towards(src, target) + if(firstmove) + // mark first movement so future Cross()es result in collisions + firstmove = FALSE + // decrement range + range_left-- + // if we got nullspaced, exit + if(!isturf(loc)) + break + // hit everything in it + for(var/atom/T in loc) + hit_thing(T) + // if we got deleted or ran out of hits, stop + if(!hits_left || !isturf(loc)) + break + if(!hits_left || !isturf(loc)) + // yeah yeah sue me it's copypasted code but I don't want to declare a var. + break + // hit the turf + hit_thing(loc) + sleep(speed) + qdel(src) + /obj/effect/decal/fakelattice name = "lattice" desc = "A lightweight support lattice." diff --git a/code/game/objects/effects/effect_system/effects_foam.dm b/code/game/objects/effects/effect_system/effects_foam.dm index 9b02396763..a0f53ceab7 100644 --- a/code/game/objects/effects/effect_system/effects_foam.dm +++ b/code/game/objects/effects/effect_system/effects_foam.dm @@ -40,8 +40,8 @@ if(hotspot && istype(T) && T.air) qdel(hotspot) var/datum/gas_mixture/G = T.air - var/plas_amt = min(30,G.get_moles(/datum/gas/plasma)) //Absorb some plasma - G.adjust_moles(/datum/gas/plasma,-plas_amt) + var/plas_amt = min(30,G.get_moles(GAS_PLASMA)) //Absorb some plasma + G.adjust_moles(GAS_PLASMA,-plas_amt) absorbed_plasma += plas_amt if(G.return_temperature() > T20C) G.set_temperature(max(G.return_temperature()/2,T20C)) @@ -322,7 +322,7 @@ for(var/obj/effect/hotspot/H in O) qdel(H) for(var/I in G.get_gases()) - if(I == /datum/gas/oxygen || I == /datum/gas/nitrogen) + if(I == GAS_O2 || I == GAS_N2) continue G.set_moles(I, 0) O.air_update_turf() @@ -341,7 +341,7 @@ return TRUE . = ..() -/obj/structure/foamedmetal/resin/BlockSuperconductivity() +/obj/structure/foamedmetal/resin/BlockThermalConductivity() return TRUE #undef ALUMINUM_FOAM diff --git a/code/game/objects/effects/effect_system/effects_smoke.dm b/code/game/objects/effects/effect_system/effects_smoke.dm index 9a11f0e1d7..3e80ade0ce 100644 --- a/code/game/objects/effects/effect_system/effects_smoke.dm +++ b/code/game/objects/effects/effect_system/effects_smoke.dm @@ -170,9 +170,9 @@ T.air_update_turf() for(var/obj/effect/hotspot/H in T) qdel(H) - if(G.get_moles(/datum/gas/plasma)) - G.adjust_moles(/datum/gas/nitrogen, G.get_moles(/datum/gas/plasma)) - G.set_moles(/datum/gas/plasma, 0) + if(G.get_moles(GAS_PLASMA)) + G.adjust_moles(GAS_N2, G.get_moles(GAS_PLASMA)) + G.set_moles(GAS_PLASMA, 0) if (weldvents) for(var/obj/machinery/atmospherics/components/unary/U in T) if(!isnull(U.welded) && !U.welded) //must be an unwelded vent pump or vent scrubber. diff --git a/code/game/objects/effects/glowshroom.dm b/code/game/objects/effects/glowshroom.dm index 2d28d3a041..22dd772ebe 100644 --- a/code/game/objects/effects/glowshroom.dm +++ b/code/game/objects/effects/glowshroom.dm @@ -73,6 +73,8 @@ myseed.adjust_yield(rand(-3,2)) myseed.adjust_production(rand(-3,3)) myseed.endurance = clamp(myseed.endurance + rand(-3,2), 0, 100) // adjust_endurance has a min value of 10, need to edit directly + // Scale health to endurance + max_integrity = obj_integrity = 10 + myseed.endurance / 2 delay_spread = delay_spread - myseed.production * 100 //So the delay goes DOWN with better stats instead of up. :I var/datum/plant_gene/trait/glow/G = myseed.get_gene(/datum/plant_gene/trait/glow) if(ispath(G)) // Seeds were ported to initialize so their genes are still typepaths here, luckily their initializer is smart enough to handle us doing this @@ -193,8 +195,14 @@ /obj/structure/glowshroom/proc/Decay(spread, amount) if (spread) // Decay due to spread myseed.endurance -= amount + max_integrity = min(max_integrity, 10 + myseed.endurance / 2) + if(obj_integrity > max_integrity) + obj_integrity = max_integrity else // Timed decay myseed.endurance -= 1 + max_integrity = min(max_integrity, 10 + myseed.endurance / 2) + if(obj_integrity > max_integrity) + obj_integrity = max_integrity if (myseed.endurance > 0) addtimer(CALLBACK(src, .proc/Decay), delay_decay, FALSE) // Recall decay timer return diff --git a/code/game/objects/effects/spawners/bombspawner.dm b/code/game/objects/effects/spawners/bombspawner.dm index b5aaff5746..fb92e31f1e 100644 --- a/code/game/objects/effects/spawners/bombspawner.dm +++ b/code/game/objects/effects/spawners/bombspawner.dm @@ -1,6 +1,6 @@ #define CELSIUS_TO_KELVIN(T_K) ((T_K) + T0C) -#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.meta_gas_specific_heats[/datum/gas/plasma]) / (((PRESSURE_P) * GLOB.meta_gas_specific_heats[/datum/gas/plasma] + (PRESSURE_O) * GLOB.meta_gas_specific_heats[/datum/gas/oxygen]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.meta_gas_specific_heats[/datum/gas/oxygen] / CELSIUS_TO_KELVIN(TEMP_O))) +#define OPTIMAL_TEMP_K_PLA_BURN_SCALE(PRESSURE_P,PRESSURE_O,TEMP_O) (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA]) / (((PRESSURE_P) * GLOB.gas_data.specific_heats[GAS_PLASMA] + (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2]) / PLASMA_UPPER_TEMPERATURE - (PRESSURE_O) * GLOB.gas_data.specific_heats[GAS_O2] / CELSIUS_TO_KELVIN(TEMP_O))) #define OPTIMAL_TEMP_K_PLA_BURN_RATIO(PRESSURE_P,PRESSURE_O,TEMP_O) (CELSIUS_TO_KELVIN(TEMP_O) * PLASMA_OXYGEN_FULLBURN * (PRESSURE_P) / (PRESSURE_O)) /obj/effect/spawner/newbomb @@ -19,10 +19,10 @@ var/obj/item/tank/internals/plasma/PT = new(V) var/obj/item/tank/internals/oxygen/OT = new(V) - PT.air_contents.set_moles(/datum/gas/plasma, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) + PT.air_contents.set_moles(GAS_PLASMA, pressure_p*PT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_p))) PT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_p)) - OT.air_contents.set_moles(/datum/gas/oxygen, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) + OT.air_contents.set_moles(GAS_O2, pressure_o*OT.volume/(R_IDEAL_GAS_EQUATION*CELSIUS_TO_KELVIN(temp_o))) OT.air_contents.set_temperature(CELSIUS_TO_KELVIN(temp_o)) V.tank_one = PT diff --git a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm index eb50ae43a7..2d6fb2c2a2 100644 --- a/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm +++ b/code/game/objects/effects/temporary_visuals/projectiles/tracer.dm @@ -17,7 +17,7 @@ line = null if(qdel_in) QDEL_IN(PB, qdel_in) -d + /obj/effect/projectile/tracer name = "beam" icon = 'icons/obj/projectiles_tracer.dmi' diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5089d26c88..cd486ccf6b 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -352,15 +352,6 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb C.update_damage_overlays() return - if(acid_level > 20 && ismob(loc))// so we can still remove the clothes on us that have acid. - var/mob/living/carbon/C = user - if(istype(C)) - if(!C.gloves || (!(C.gloves.resistance_flags & (UNACIDABLE|ACID_PROOF)))) - to_chat(user, "The acid on [src] burns your hand!") - var/obj/item/bodypart/affecting = C.get_bodypart("[(user.active_hand_index % 2 == 0) ? "r" : "l" ]_arm") - if(affecting && affecting.receive_damage( 0, 5 )) // 5 burn damage - C.update_damage_overlays() - if(!(interaction_flags_item & INTERACT_ITEM_ATTACK_HAND_PICKUP)) //See if we're supposed to auto pickup. return @@ -461,6 +452,21 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb SHOULD_CALL_PARENT(TRUE) SEND_SIGNAL(src, COMSIG_ITEM_PICKUP, user) item_flags |= IN_INVENTORY + if(item_flags & (ITEM_CAN_BLOCK | ITEM_CAN_PARRY) && user.client && !(type in user.client.block_parry_hinted)) + var/list/dat = list("You have picked up an item that can be used to block and/or parry:") + // cit change - parry/block feedback + var/datum/block_parry_data/data = return_block_parry_datum(block_parry_data) + if(item_flags & ITEM_CAN_BLOCK) + dat += "[src] can be used to block damage using directional block. Press your active block keybind to use it." + if(data.block_automatic_enabled) + dat += "[src] is also capable of automatically blocking damage, if you are facing the right direction (usually towards your attacker)!" + if(item_flags & ITEM_CAN_PARRY) + dat += "[src] can be used to parry damage using active parry. Pressed your active parry keybind to initiate a timed parry sequence." + if(data.parry_automatic_enabled) + dat += "[src] is also capable of automatically parrying an incoming attack, if your mouse is over your attacker at the time if you being hit in a direct, melee attack." + dat += "Examine [src] to get a full readout of its block/parry stats." + to_chat(user, dat.Join("
")) + user.client.block_parry_hinted |= type // called when "found" in pockets and storage items. Returns 1 if the search should end. /obj/item/proc/on_found(mob/finder) @@ -504,12 +510,13 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb */ /obj/item/proc/equipped(mob/user, slot, initial = FALSE) SHOULD_CALL_PARENT(TRUE) - SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) + var/signal_flags = SEND_SIGNAL(src, COMSIG_ITEM_EQUIPPED, user, slot) current_equipped_slot = slot - for(var/X in actions) - var/datum/action/A = X - if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. - A.Grant(user) + if(!(signal_flags & COMPONENT_NO_GRANT_ACTIONS)) + for(var/X in actions) + var/datum/action/A = X + if(item_action_slot_check(slot, user, A)) //some items only give their actions buttons when in a specific slot. + A.Grant(user) item_flags |= IN_INVENTORY // if(!initial) // if(equip_sound && (slot_flags & slot)) diff --git a/code/game/objects/items/chrono_eraser.dm b/code/game/objects/items/chrono_eraser.dm index 16bc6897c8..c104d5c62a 100644 --- a/code/game/objects/items/chrono_eraser.dm +++ b/code/game/objects/items/chrono_eraser.dm @@ -242,12 +242,18 @@ return BULLET_ACT_HIT /obj/effect/chrono_field/assume_air() - return 0 + return null + +/obj/effect/chrono_field/assume_air_moles() + return null + +/obj/effect/chrono_field/assume_air_ratio() + return null /obj/effect/chrono_field/return_air() //we always have nominal air and temperature var/datum/gas_mixture/GM = new - GM.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD) - GM.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD) + GM.set_moles(GAS_O2, MOLES_O2STANDARD) + GM.set_moles(GAS_N2, MOLES_N2STANDARD) GM.set_temperature(T20C) return GM diff --git a/code/game/objects/items/cigs_lighters.dm b/code/game/objects/items/cigs_lighters.dm index 4280e7105f..16ebe20e51 100644 --- a/code/game/objects/items/cigs_lighters.dm +++ b/code/game/objects/items/cigs_lighters.dm @@ -387,6 +387,10 @@ CIGARETTE PACKETS ARE IN FANCY.DM throwforce = 0 grind_results = list(/datum/reagent/carbon = 2) +/obj/item/cigbutt/Initialize() + . = ..() + AddElement(/datum/element/trash) + /obj/item/cigbutt/cigarbutt name = "cigar butt" desc = "A manky old cigar butt." diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index c601624072..0570de6bcf 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -99,8 +99,8 @@ . = ..() if(!. && ismob(loc) && loc == usr) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/defibrillator/attackby(obj/item/W, mob/user, params) @@ -283,7 +283,7 @@ var/combat = FALSE //If it penetrates armor and gives additional functionality var/grab_ghost = FALSE var/tlimit = DEFIB_TIME_LIMIT * 10 - var/base_icon_state = "defibpaddles" + base_icon_state = "defibpaddles" var/disarm_shock_time = 10 var/wielded = FALSE // track wielded status on item @@ -620,7 +620,7 @@ if(req_defib) if(defib.healdisk) H.heal_overall_damage(25, 25) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/game/objects/items/devices/PDA/PDA.dm b/code/game/objects/items/devices/PDA/PDA.dm index 2820b11312..2339e88a76 100644 --- a/code/game/objects/items/devices/PDA/PDA.dm +++ b/code/game/objects/items/devices/PDA/PDA.dm @@ -447,7 +447,7 @@ GLOBAL_LIST_EMPTY(PDAs) for(var/id in environment.get_gases()) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0) - dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100, 0.01)]%
" + dat += "[GLOB.gas_data.names[id]]: [round(gas_level*100, 0.01)]%
" dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
" dat += "
" diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 5177224835..1e43f0f883 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -184,7 +184,7 @@ /obj/item/multitool/ai_detect/proc/show_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 150 var/datum/atom_hud/H = GLOB.huds[hud_type] if(!H.hudusers[user]) @@ -194,7 +194,7 @@ /obj/item/multitool/ai_detect/proc/remove_hud(mob/user) if(user && hud_type) - var/obj/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] + var/atom/movable/screen/plane_master/camera_static/PM = user.hud_used.plane_masters["[CAMERA_STATIC_PLANE]"] PM.alpha = 255 var/datum/atom_hud/H = GLOB.huds[hud_type] H.remove_hud_from(user) diff --git a/code/game/objects/items/devices/paicard.dm b/code/game/objects/items/devices/paicard.dm index e7a9d51ebe..d54911528d 100644 --- a/code/game/objects/items/devices/paicard.dm +++ b/code/game/objects/items/devices/paicard.dm @@ -122,7 +122,7 @@ /obj/item/paicard/proc/setPersonality(mob/living/silicon/pai/personality) src.pai = personality src.add_overlay("pai-null") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_PAI] if(policy) to_chat(personality, policy) diff --git a/code/game/objects/items/devices/portable_chem_mixer.dm b/code/game/objects/items/devices/portable_chem_mixer.dm index 3e1b20cfc2..c773699b1d 100644 --- a/code/game/objects/items/devices/portable_chem_mixer.dm +++ b/code/game/objects/items/devices/portable_chem_mixer.dm @@ -130,8 +130,8 @@ . = ..() if(ismob(loc)) var/mob/M = loc - if(!M.incapacitated() && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!M.incapacitated() && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) /obj/item/storage/portable_chem_mixer/ui_interact(mob/user, datum/tgui/ui) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 7e49882979..0bf7b13646 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -426,18 +426,21 @@ GENETICS SCANNER if(ishuman(C)) if(H.is_bleeding()) msg += "Subject is bleeding!\n" - var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) + var/blood_percent = round((C.scan_blood_volume() / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) + var/integrated_blood_percent = round((C.integrating_blood / (BLOOD_VOLUME_NORMAL * C.blood_ratio))*100) var/blood_type = C.dna.blood_type if(!(blood_typepath in GLOB.blood_reagent_types)) var/datum/reagent/R = GLOB.chemical_reagents_list[blood_typepath] if(R) blood_type = R.name - if(C.scan_blood_volume() <= (BLOOD_VOLUME_SAFE*C.blood_ratio) && C.scan_blood_volume() > (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" - else if(C.scan_blood_volume() <= (BLOOD_VOLUME_OKAY*C.blood_ratio)) - msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" + + if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_SAFE * C.blood_ratio) && (C.scan_blood_volume() + C.integrating_blood) > (BLOOD_VOLUME_OKAY*C.blood_ratio)) + msg += "LOW blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" + else if((C.scan_blood_volume() + C.integrating_blood) <= (BLOOD_VOLUME_OKAY * C.blood_ratio)) + msg += "CRITICAL blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" else - msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl, type: [blood_type]\n" + msg += "Blood level [blood_percent] %, [C.scan_blood_volume()] cl[C.integrating_blood? ", with [integrated_blood_percent] % of it integrating, [C.integrating_blood] cl " : ""]. type: [blood_type]\n" + var/cyberimp_detect for(var/obj/item/organ/cyberimp/CI in C.internal_organs) @@ -708,7 +711,7 @@ GENETICS SCANNER for(var/id in air_contents.get_gases()) if(air_contents.get_moles(id) >= 0.005) var/gas_concentration = air_contents.get_moles(id)/total_moles - to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)") + to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(air_contents.get_moles(id), 0.01)] mol)") to_chat(user, "Temperature: [round(temperature - T0C,0.01)] °C ([round(temperature, 0.01)] K)") else @@ -721,7 +724,7 @@ GENETICS SCANNER var/instability = round(cached_scan_results["fusion"], 0.01) var/tier = instability2text(instability) to_chat(user, "Large amounts of free neutrons detected in the air indicate that a fusion reaction took place.") - to_chat(user, "Instability of the last fusion reaction: [instability]\n This indicates it was [tier].") + to_chat(user, "Instability of the last fusion reaction: [instability]\n This indicates it was [tier]") return /obj/item/analyzer/proc/scan_turf(mob/user, turf/location) @@ -739,36 +742,36 @@ GENETICS SCANNER to_chat(user, "Pressure: [round(pressure, 0.01)] kPa") if(total_moles) - var/o2_concentration = environment.get_moles(/datum/gas/oxygen)/total_moles - var/n2_concentration = environment.get_moles(/datum/gas/nitrogen)/total_moles - var/co2_concentration = environment.get_moles(/datum/gas/carbon_dioxide)/total_moles - var/plasma_concentration = environment.get_moles(/datum/gas/plasma)/total_moles + var/o2_concentration = environment.get_moles(GAS_O2)/total_moles + var/n2_concentration = environment.get_moles(GAS_N2)/total_moles + var/co2_concentration = environment.get_moles(GAS_CO2)/total_moles + var/plasma_concentration = environment.get_moles(GAS_PLASMA)/total_moles if(abs(n2_concentration - N2STANDARD) < 20) - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)") + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)") else - to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/nitrogen), 0.01)] mol)") + to_chat(user, "Nitrogen: [round(n2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_N2), 0.01)] mol)") if(abs(o2_concentration - O2STANDARD) < 2) - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)") + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)") else - to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/oxygen), 0.01)] mol)") + to_chat(user, "Oxygen: [round(o2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_O2), 0.01)] mol)") if(co2_concentration > 0.01) - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)") + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)") else - to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/carbon_dioxide), 0.01)] mol)") + to_chat(user, "CO2: [round(co2_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_CO2), 0.01)] mol)") if(plasma_concentration > 0.005) - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)") + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)") else - to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(/datum/gas/plasma), 0.01)] mol)") + to_chat(user, "Plasma: [round(plasma_concentration*100, 0.01)] % ([round(environment.get_moles(GAS_PLASMA), 0.01)] mol)") for(var/id in environment.get_gases()) if(id in GLOB.hardcoded_gases) continue var/gas_concentration = environment.get_moles(id)/total_moles - to_chat(user, "[GLOB.meta_gas_names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)") + to_chat(user, "[GLOB.gas_data.names[id]]: [round(gas_concentration*100, 0.01)] % ([round(environment.get_moles(id), 0.01)] mol)") to_chat(user, "Temperature: [round(environment.return_temperature()-T0C, 0.01)] °C ([round(environment.return_temperature(), 0.01)] K)") if(cached_scan_results && cached_scan_results["fusion"]) //notify the user if a fusion reaction was detected diff --git a/code/game/objects/items/devices/traitordevices.dm b/code/game/objects/items/devices/traitordevices.dm index 8c36703855..ac79b3b887 100644 --- a/code/game/objects/items/devices/traitordevices.dm +++ b/code/game/objects/items/devices/traitordevices.dm @@ -78,22 +78,29 @@ effective or pretty fucking useless. var/ui_x = 320 var/ui_y = 335 +/obj/item/healthanalyzer/rad_laser/Initialize() + . = ..() + AddComponent(/datum/component/identification/syndicate, ID_COMPONENT_DEL_ON_IDENTIFY, ID_COMPONENT_EFFECT_NO_ACTIONS, ID_COMPONENT_IDENTIFY_WITH_DECONSTRUCTOR) + /obj/item/healthanalyzer/rad_laser/attack(mob/living/M, mob/living/user) if(!stealth || !irradiate) - ..() + return ..() + var/knowledge = SEND_SIGNAL(src, COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK, user) == ID_COMPONENT_KNOWLEDGE_FULL if(!irradiate) return if(!used) - log_combat(user, M, "irradiated", src) + log_combat(user, M, "[knowledge? "" : "unknowingly "]irradiated", src) var/cooldown = get_cooldown() used = TRUE icon_state = "health1" addtimer(VARSET_CALLBACK(src, used, FALSE), cooldown) addtimer(VARSET_CALLBACK(src, icon_state, "health"), cooldown) - to_chat(user, "Successfully irradiated [M].") + if(knowledge) + to_chat(user, "Successfully irradiated [M].") addtimer(CALLBACK(src, .proc/radiation_aftereffect, M, intensity), (wavelength+(intensity*4))*5) else - to_chat(user, "The radioactive microlaser is still recharging.") + if(knowledge) + to_chat(user, "The radioactive microlaser is still recharging.") /obj/item/healthanalyzer/rad_laser/proc/radiation_aftereffect(mob/living/M, passed_intensity) if(QDELETED(M) || !ishuman(M) || HAS_TRAIT(M, TRAIT_RADIMMUNE)) @@ -109,7 +116,9 @@ effective or pretty fucking useless. interact(user) /obj/item/healthanalyzer/rad_laser/interact(mob/user) - ui_interact(user) + var/knowledge = SEND_SIGNAL(src, COMSIG_IDENTIFICATION_KNOWLEDGE_CHECK, user) == ID_COMPONENT_KNOWLEDGE_FULL + if(knowledge) + ui_interact(user) /obj/item/healthanalyzer/rad_laser/ui_state(mob/user) return GLOB.hands_state diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index 8b0d46be44..536209b575 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -172,20 +172,15 @@ if(!target_self) target.set_volume(target.return_volume() + tank_two.volume) target.set_volume(target.return_volume() + tank_one.air_contents.return_volume()) - var/datum/gas_mixture/temp - temp = tank_one.air_contents.remove_ratio(1) - target.merge(temp) + tank_one.air_contents.transfer_ratio_to(target, 1) if(!target_self) - temp = tank_two.air_contents.remove_ratio(1) - target.merge(temp) + tank_two.air_contents.transfer_ratio_to(target, 1) /obj/item/transfer_valve/proc/split_gases() if (!valve_open || !tank_one || !tank_two) return var/ratio1 = tank_one.air_contents.return_volume()/tank_two.air_contents.return_volume() - var/datum/gas_mixture/temp - temp = tank_two.air_contents.remove_ratio(ratio1) - tank_one.air_contents.merge(temp) + tank_two.air_contents.transfer_ratio_to(tank_one.air_contents, ratio1) tank_two.air_contents.set_volume(tank_two.air_contents.return_volume() - tank_one.air_contents.return_volume()) /* diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 3d62a98ddf..eea189c3be 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -41,7 +41,7 @@ /datum/block_parry_data/dual_esword // please run at the man going apeshit with his funny doublesword can_block_directions = BLOCK_DIR_NORTH | BLOCK_DIR_NORTHEAST | BLOCK_DIR_NORTHWEST | BLOCK_DIR_WEST | BLOCK_DIR_EAST - block_damage_absorption = 2 + block_damage_absorption = 5 block_damage_multiplier = 0.15 block_damage_multiplier_override = list( ATTACK_TYPE_MELEE = 0.25 @@ -59,7 +59,7 @@ ) parry_time_windup = 0 - parry_time_active = 8 + parry_time_active = 12 parry_time_spindown = 0 // we want to signal to players the most dangerous phase, the time when automatic counterattack is a thing. parry_time_windup_visual_override = 1 @@ -69,12 +69,10 @@ parry_time_perfect = 2 // first ds isn't perfect parry_time_perfect_leeway = 1 parry_imperfect_falloff_percent = 10 - parry_efficiency_to_counterattack = 100 parry_efficiency_considered_successful = 25 // VERY generous parry_failed_stagger_duration = 3 SECONDS - parry_failed_clickcd_duration = CLICK_CD_MELEE -/obj/item/dualsaber/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) +/obj/item/dualsaber/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT @@ -83,7 +81,7 @@ /obj/item/dualsaber/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) . = ..() if(parry_efficiency >= 90) // perfect parry - block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT . |= BLOCK_SHOULD_REDIRECT /obj/item/dualsaber/Initialize() @@ -369,14 +367,12 @@ parry_time_perfect = 1 parry_time_perfect_leeway = 1 parry_imperfect_falloff_percent = 7.5 - parry_efficiency_to_counterattack = 100 parry_efficiency_considered_successful = 80 parry_efficiency_perfect = 120 parry_efficiency_perfect_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 30, ) parry_failed_stagger_duration = 3 SECONDS - parry_failed_clickcd_duration = 2 SECONDS /obj/item/dualsaber/hypereutactic/chaplain/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/electrostaff.dm b/code/game/objects/items/electrostaff.dm index a1c06f8d23..70a25bc9f9 100644 --- a/code/game/objects/items/electrostaff.dm +++ b/code/game/objects/items/electrostaff.dm @@ -45,15 +45,15 @@ // no attacking while blocking block_lock_attacking = TRUE - parry_time_windup = 1 - parry_time_active = 5 + parry_time_windup = 0 + parry_time_active = 7 parry_time_spindown = 0 parry_time_spindown_visual_override = 1 - parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING // no attacking while parrying + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK // no attacking while parrying parry_time_perfect = 0 parry_time_perfect_leeway = 0.5 - parry_efficiency_perfect = 100 - parry_imperfect_falloff_percent = 1 + parry_efficiency_perfect = 85 + parry_imperfect_falloff_percent = 10 parry_imperfect_falloff_percent_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 45 // really crappy vs projectiles ) @@ -61,9 +61,7 @@ TEXT_ATTACK_TYPE_PROJECTILE = 1 // extremely harsh window for projectiles ) // not extremely punishing to fail, but no spamming the parry. - parry_cooldown = 2.5 SECONDS parry_failed_stagger_duration = 1.5 SECONDS - parry_failed_clickcd_duration = 1 SECONDS /obj/item/electrostaff/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/flamethrower.dm b/code/game/objects/items/flamethrower.dm index 73299a2006..3cfef6aa1f 100644 --- a/code/game/objects/items/flamethrower.dm +++ b/code/game/objects/items/flamethrower.dm @@ -210,13 +210,11 @@ //TODO: DEFERRED Consider checking to make sure tank pressure is high enough before doing this... //Transfer 5% of current tank air contents to turf var/datum/gas_mixture/air_transfer = ptank.air_contents.remove_ratio(release_amount) - air_transfer.set_moles(/datum/gas/plasma, air_transfer.get_moles(/datum/gas/plasma) * 5) + air_transfer.set_moles(GAS_PLASMA, air_transfer.get_moles(GAS_PLASMA) * 5) target.assume_air(air_transfer) //Burn it based on transfered gas target.hotspot_expose((ptank.air_contents.return_temperature()*2) + 380,500) //location.hotspot_expose(1000,500,1) - SSair.add_to_active(target, 0) - /obj/item/flamethrower/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/gift.dm b/code/game/objects/items/gift.dm index a9ed94aae9..9f9db64873 100644 --- a/code/game/objects/items/gift.dm +++ b/code/game/objects/items/gift.dm @@ -14,7 +14,7 @@ GLOBAL_LIST_INIT(gift_item_blacklist, typecacheof(list( /obj/mafia_game_board, /obj/docking_port, /obj/shapeshift_holder, - /obj/screen + /atom/movable/screen ))) GLOBAL_LIST_EMPTY(possible_gifts) diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 9ae8fb80db..60538b479b 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -1,6 +1,8 @@ /obj/item/restraints breakouttime = 600 var/demoralize_criminals = TRUE // checked on carbon/carbon.dm to decide wheter to apply the handcuffed negative moodlet or not. + /// allow movement at all during breakout + var/allow_breakout_movement = FALSE /obj/item/restraints/suicide_act(mob/living/carbon/user) user.visible_message("[user] is strangling [user.p_them()]self with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -243,6 +245,7 @@ throwforce = 0 w_class = WEIGHT_CLASS_NORMAL slowdown = 7 + allow_breakout_movement = TRUE breakouttime = 300 //Deciseconds = 30s = 0.5 minute /obj/item/restraints/legcuffs/proc/on_removed() @@ -312,7 +315,7 @@ trap_damage = 0 item_flags = DROPDEL flags_1 = NONE - breakouttime = 25 + breakouttime = 50 /obj/item/restraints/legcuffs/beartrap/energy/New() ..() @@ -328,7 +331,7 @@ . = ..() /obj/item/restraints/legcuffs/beartrap/energy/cyborg - breakouttime = 20 // Cyborgs shouldn't have a strong restraint + breakouttime = 40 // Cyborgs shouldn't have a strong restraint /obj/item/restraints/legcuffs/bola name = "bola" @@ -379,7 +382,7 @@ icon_state = "ebola" hitsound = 'sound/weapons/taserhit.ogg' w_class = WEIGHT_CLASS_SMALL - breakouttime = 25 + breakouttime = 50 /obj/item/restraints/legcuffs/bola/energy/on_removed() do_sparks(1, TRUE, src) diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index 0673e1d489..05b7ef4802 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -337,7 +337,7 @@ page_link = "Guide_to_chemistry" /obj/item/book/manual/wiki/chemistry/Initialize() - ..() + . = ..() new /obj/item/book/manual/wiki/cit/chemistry(loc) new /obj/item/book/manual/wiki/cit/chem_recipies(loc) diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 55546a7f9c..1be570b62b 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -121,11 +121,14 @@ parry_time_perfect = 2.5 // first ds isn't perfect parry_time_perfect_leeway = 1.5 parry_imperfect_falloff_percent = 5 - parry_efficiency_to_counterattack = 100 + parry_efficiency_to_counterattack = INFINITY parry_efficiency_considered_successful = 65 // VERY generous parry_efficiency_perfect = 100 parry_failed_stagger_duration = 4 SECONDS parry_cooldown = 0.5 SECONDS + parry_automatic_enabled = TRUE + autoparry_single_efficiency = 65 + autoparry_cooldown_absolute = 3 SECONDS /obj/item/melee/transforming/energy/sword/Initialize(mapload) . = ..() @@ -149,8 +152,8 @@ /obj/item/melee/transforming/energy/sword/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) . = ..() - if(parry_efficiency >= 80) // perfect parry - block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_RETURN_TO_SENDER + if(parry_efficiency >= 100) // perfect parry + block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT . |= BLOCK_SHOULD_REDIRECT /obj/item/melee/transforming/energy/sword/cyborg diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 0172f1c150..dbfeb9d08f 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -72,15 +72,17 @@ block_parry_data = /datum/block_parry_data/captain_saber /datum/block_parry_data/captain_saber - parry_time_windup = 0.5 - parry_time_active = 4 - parry_time_spindown = 1 + parry_time_windup = 0 + parry_time_active = 10 + parry_time_spindown = 0 parry_time_perfect = 0.75 - parry_time_perfect_leeway = 0.75 + parry_time_perfect_leeway = 1.5 parry_imperfect_falloff_percent = 30 parry_efficiency_perfect = 100 parry_failed_stagger_duration = 3 SECONDS - parry_failed_clickcd_duration = 2 SECONDS + parry_failed_clickcd_duration = 0 + parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK + parry_automatic_enabled = TRUE /obj/item/melee/sabre/Initialize() . = ..() @@ -176,30 +178,28 @@ // Fast, efficient parry. /datum/block_parry_data/traitor_rapier - parry_time_windup = 0.5 - parry_time_active = 5 + parry_time_windup = 0 + parry_time_active = 10 parry_time_spindown = 0 parry_time_active_visual_override = 3 parry_time_spindown_visual_override = 2 parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING - parry_time_perfect = 0 - parry_time_perfect_leeway = 3 + parry_time_perfect = 2 + parry_time_perfect_leeway = 2 parry_time_perfect_leeway_override = list( TEXT_ATTACK_TYPE_PROJECTILE = 1 ) - parry_imperfect_falloff_percent_override = list( - TEXT_ATTACK_TYPE_PROJECTILE = 50 // useless after 3rd decisecond - ) parry_imperfect_falloff_percent = 30 parry_efficiency_to_counterattack = 100 parry_efficiency_considered_successful = 1 - parry_efficiency_perfect = 100 parry_data = list( - PARRY_DISARM_ATTACKER = TRUE, - PARRY_KNOCKDOWN_ATTACKER = 10 + PARRY_KNOCKDOWN_ATTACKER = 10, + PARRY_DISARM_ATTACKER = TRUE ) + parry_efficiency_perfect = 100 + parry_stamina_cost = 5 parry_failed_stagger_duration = 2 SECONDS - parry_failed_clickcd_duration = CLICK_CD_RANGE + parry_automatic_enabled = TRUE parry_cooldown = 0 /obj/item/melee/rapier/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) @@ -259,6 +259,8 @@ var/stam_dmg = 30 var/cooldown_check = 0 // Used internally, you don't want to modify var/cooldown = 13 // Default wait time until can stun again. + /// block mitigation needed to prevent knockdown/disarms + var/block_percent_to_counter = 50 var/stun_time_silicon = 60 // How long it stuns silicons for - 6 seconds. var/affect_silicon = FALSE // Does it stun silicons. var/on_sound // "On" sound, played when switching between able to stun or not. @@ -356,7 +358,8 @@ if(cooldown_check < world.time) if(!UseStaminaBufferStandard(user, STAM_COST_BATON_MOB_MULT, warn = TRUE)) return DISCARD_LAST_ACTION - if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, null) & BLOCK_SUCCESS) + var/list/block_return = list() + if(target.mob_run_block(src, 0, "[user]'s [name]", ATTACK_TYPE_MELEE, 0, user, null, block_return) & BLOCK_SUCCESS) playsound(target, 'sound/weapons/genhit.ogg', 50, 1) return if(ishuman(target)) @@ -367,7 +370,8 @@ if(stun_animation) user.do_attack_animation(target) playsound(get_turf(src), on_stun_sound, 75, 1, -1) - target.DefaultCombatKnockdown(softstun_ds, TRUE, FALSE, hardstun_ds, stam_dmg) + var/countered = block_return[BLOCK_RETURN_MITIGATION_PERCENT] > block_percent_to_counter + target.DefaultCombatKnockdown(softstun_ds, TRUE, FALSE, countered? 0 : hardstun_ds, stam_dmg, !countered) additional_effects_carbon(target, user) log_combat(user, target, "stunned", src) add_fingerprint(user) @@ -453,6 +457,18 @@ playsound(src.loc, on_sound, 50, 1) add_fingerprint(user) +/obj/item/melee/classic_baton/telescopic/newspaper + name = "The Daily Whiplash" + desc = "A newspaper wrapped around a telescopic baton in such a way that it looks like you're beating people with a rolled up newspaper." + icon = 'icons/obj/bureaucracy.dmi' + icon_state = "newspaper" + lefthand_file = 'icons/mob/inhands/misc/books_lefthand.dmi' + righthand_file = 'icons/mob/inhands/misc/books_righthand.dmi' + on_sound = 'sound/weapons/batonextend.ogg' + on_icon_state = "newspaper2" + off_icon_state = "newspaper" + on_item_state = "newspaper" + /obj/item/melee/classic_baton/telescopic/contractor_baton name = "contractor baton" desc = "A compact, specialised baton assigned to Syndicate contractors. Applies light electrical shocks to targets." @@ -695,11 +711,14 @@ playsound(src, 'sound/weapons/batonextend.ogg', 50, 1) /obj/item/melee/roastingstick/proc/finish_roasting(user, atom/target) + if(!held_sausage || held_sausage.roasted) + return // no to_chat(user, "You finish roasting [held_sausage]") playsound(src,'sound/items/welder2.ogg',50,1) held_sausage.add_atom_colour(rgb(103,63,24), FIXED_COLOUR_PRIORITY) held_sausage.name = "[target.name]-roasted [held_sausage.name]" held_sausage.desc = "[held_sausage.desc] It has been cooked to perfection on \a [target]." + held_sausage.roasted = TRUE update_icon() /obj/item/melee/cleric_mace diff --git a/code/game/objects/items/pet_carrier.dm b/code/game/objects/items/pet_carrier.dm index aad923346b..78fe1a896e 100644 --- a/code/game/objects/items/pet_carrier.dm +++ b/code/game/objects/items/pet_carrier.dm @@ -307,7 +307,7 @@ if(isanimal(occupant)) var/mob/living/simple_animal/animal = occupant - occupant_gas_supply[/datum/gas/oxygen] = 0.0064 //make sure it has some gas in so it isn't depressurized + occupant_gas_supply[GAS_O2] = 0.0064 //make sure it has some gas in so it isn't depressurized occupant_gas_supply.set_temperature(animal.minbodytemp) //simple animals only care about temperature/pressure when their turf isnt a location if(ishuman(occupant)) //humans require resistance to cold/heat and living in no air while inside, and lose this when outside diff --git a/code/game/objects/items/plushes.dm b/code/game/objects/items/plushes.dm index c213fa34df..59464d25a7 100644 --- a/code/game/objects/items/plushes.dm +++ b/code/game/objects/items/plushes.dm @@ -446,7 +446,7 @@ mood_message = null cheer_up() -/obj/item/toy/plush/proc/update_desc() +/obj/item/toy/plush/update_desc() desc = normal_desc if(mood_message) desc += mood_message @@ -466,7 +466,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) can_random_spawn = FALSE /obj/item/toy/plush/random/Initialize() - SHOULD_CALL_PARENT(FALSE) + ..() var/newtype var/list/snowflake_list = CONFIG_GET(keyed_list/snowflake_plushies) @@ -612,6 +612,12 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) icon_state = "kobold" item_state = "kobold" +/obj/item/toy/plush/lizardplushie/kobold + name = "spacelizard plushie" + desc = "An adorable stuffed toy that resembles a lizard in a suit." + icon_state = "plushie_spacelizard" + item_state = "plushie_spacelizard" + /obj/item/toy/plush/nukeplushie name = "operative plushie" desc = "A stuffed toy that resembles a syndicate nuclear operative. The tag claims operatives to be purely fictitious." @@ -643,17 +649,17 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) /obj/item/toy/plush/beeplushie name = "bee plushie" desc = "A cute toy that resembles an even cuter bee." - icon_state = "plushie_h" - item_state = "plushie_h" + icon_state = "plushie_bee" + item_state = "plushie_bee" attack_verb = list("stung") gender = FEMALE squeak_override = list('modular_citadel/sound/voice/scream_moth.ogg' = 1) /obj/item/toy/plush/mothplushie - name = "insect plushie" + name = "moth plushie" desc = "An adorable stuffed toy that resembles some kind of insect." - icon_state = "bumble" - item_state = "bumble" + icon_state = "moff" + item_state = "moff" squeak_override = list('modular_citadel/sound/voice/mothsqueak.ogg' = 1) can_random_spawn = FALSE @@ -665,6 +671,20 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) attack_verb = list("lit", "flickered", "flashed") squeak_override = list('sound/weapons/magout.ogg' = 1) +/obj/item/toy/plush/drake + name = "drake plushie" + desc = "A large beast from lavaland turned into a marketable plushie!" + icon_state = "drake" + item_state = "drake" + attack_verb = list("bit", "devoured", "burned") + +/obj/item/toy/plush/deer + name = "deer plushie" + desc = "Oh deer, a plushie!" + icon_state = "deer" + item_state = "deer" + attack_verb = list("bleated", "rammed", "kicked") + /obj/item/toy/plush/box name = "cardboard plushie" desc = "A toy box plushie, it holds cotten. Only a baddie would place a bomb through the postal system..." @@ -694,7 +714,7 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) attack_verb = list("scanned", "beeped", "stared") /obj/item/toy/plush/borgplushie - name = "robot plushie" + name = "K9 plushie" desc = "An adorable stuffed toy of a robot." icon_state = "securityk9" item_state = "securityk9" @@ -702,25 +722,28 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) squeak_override = list('sound/machines/beep.ogg' = 1) /obj/item/toy/plush/borgplushie/medihound + name = "medihound plushie" icon_state = "medihound" item_state = "medihound" /obj/item/toy/plush/borgplushie/scrubpuppy + name = "scrubpuppy plushie" icon_state = "scrubpuppy" item_state = "scrubpuppy" +/obj/item/toy/plush/borgplushie/pupdozer + name = "pupdozer plushie" + icon_state = "pupdozer" + item_state = "pupdozer" + /obj/item/toy/plush/aiplush name = "AI plushie" desc = "A little stuffed toy AI core... it appears to be malfunctioning." - icon_state = "exo" - item_state = "exo" + icon_state = "malfai" + item_state = "malfai" attack_verb = list("hacked", "detonated", "overloaded") squeak_override = list('sound/machines/beep.ogg' = 9, 'sound/machines/buzz-two.ogg' = 1) -/obj/item/toy/plush/mammal/fox - icon_state = "fox" - item_state = "fox" - /obj/item/toy/plush/snakeplushie name = "snake plushie" desc = "An adorable stuffed toy that resembles a snake. Not to be mistaken for the real thing." @@ -732,6 +755,72 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) /obj/item/toy/plush/mammal name = "mammal plushie" desc = "An adorable stuffed toy resembling some sort of crew member." + icon_state = "ych" + item_state = "ych" + can_random_spawn = FALSE + +/obj/item/toy/plush/mammal/fox + name = "fox plushie" + desc = "An adorable stuffed toy resembling a fox." + icon_state = "fox" + item_state = "fox" + attack_verb = list("yipped", "geckered", "yapped") + +/obj/item/toy/plush/mammal/dog + name = "dog plushie" + icon_state = "corgi" + item_state = "corgi" + desc = "An adorable stuffed toy that resembles a dog." + attack_verb = list("barked", "boofed", "borked") + squeak_override = list( + 'modular_citadel/sound/voice/bark1.ogg' = 1, + 'modular_citadel/sound/voice/bark2.ogg' = 1 + ) + +/obj/item/toy/plush/mammal/dog/fcorgi + name = "corgi plushie" + icon_state = "girlycorgi" + item_state = "girlycorgi" + desc = "An adorable stuffed toy that resembles a dog. This one dons a pink ribbon." + +/obj/item/toy/plush/mammal/dog/borgi + name = "borgi plushie" + icon_state = "borgi" + item_state = "borgi" + desc = "An adorable stuffed toy that resembles a robot dog." + +/obj/item/toy/plush/xeno + name = "xenohybrid plushie" + desc = "An adorable stuffed toy that resembles a xenomorphic crewmember." + icon_state = "xeno" + item_state = "xeno" + squeak_override = list('sound/voice/hiss2.ogg' = 1) + can_random_spawn = FALSE + +/obj/item/toy/plush/bird + name = "bird plushie" + desc = "An adorable stuffed plushie that resembles an avian." + icon_state = "bird" + item_state = "bird" + attack_verb = list("peeped", "beeped", "poofed") + squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) + can_random_spawn = FALSE + +/obj/item/toy/plush/sergal + name = "sergal plushie" + desc = "An adorable stuffed plushie that resembles a sagaru." + icon_state = "sergal" + item_state = "sergal" + squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) + can_random_spawn = FALSE + +/obj/item/toy/plush/catgirl + name = "feline plushie" + desc = "An adorable stuffed toy that resembles a feline." + icon_state = "cat" + item_state = "cat" + attack_verb = list("headbutt", "scritched", "bit") + squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) can_random_spawn = FALSE /obj/item/toy/plush/catgirl/fermis @@ -742,40 +831,25 @@ GLOBAL_LIST_INIT(valid_plushie_paths, valid_plushie_paths()) attack_verb = list("cuddled", "petpatted", "wigglepurred") squeak_override = list('modular_citadel/sound/voice/merowr.ogg' = 1) -/obj/item/toy/plush/xeno - name = "xenohybrid plushie" - desc = "An adorable stuffed toy that resmembles a xenomorphic crewmember." - squeak_override = list('sound/voice/hiss2.ogg' = 1) - can_random_spawn = FALSE +/obj/item/toy/plush/teddybear + name = "teddy" + desc = "It's a teddy bear!" + icon_state = "teddy" + item_state = "teddy" -/obj/item/toy/plush/bird - name = "bird plushie" - desc = "An adorable stuffed plushie that resembles an avian." - attack_verb = list("peeped", "beeped", "poofed") - squeak_override = list('modular_citadel/sound/voice/peep.ogg' = 1) - can_random_spawn = FALSE - -/obj/item/toy/plush/sergal - name = "sergal plushie" - desc = "An adorable stuffed plushie that resembles a sagaru." - squeak_override = list('modular_citadel/sound/voice/merp.ogg' = 1) - can_random_spawn = FALSE - -/obj/item/toy/plush/mammal/dog - desc = "An adorable stuffed toy that resembles a canine." - attack_verb = list("barked", "boofed", "borked") - squeak_override = list( - 'modular_citadel/sound/voice/bark1.ogg' = 1, - 'modular_citadel/sound/voice/bark2.ogg' = 1 - ) - -/obj/item/toy/plush/catgirl - name = "feline plushie" - desc = "An adorable stuffed toy that resembles a feline." - attack_verb = list("headbutt", "scritched", "bit") - squeak_override = list('modular_citadel/sound/voice/nya.ogg' = 1) - can_random_spawn = FALSE +/obj/item/toy/plush/crab + name = "crab plushie" + desc = "Fewer pinches than a real one, but it still clicks." + icon_state = "crab" + item_state = "crab" + attack_verb = list("clicked", "clacked", "pinched") +/obj/item/toy/plush/gondola + name = "gondola plushie" + desc = "Just looking at it seems to calm you down. Please do not eat it though." + icon_state = "gondola" + item_state = "gondola" + attack_verb = list("calmed", "smiled", "peaced") /obj/item/toy/plush/hairball name = "Hairball" diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index e62208f848..42e345b502 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -266,6 +266,7 @@ . += tank.icon_state /obj/item/pneumatic_cannon/proc/fill_with_type(type, amount) + set waitfor = FALSE if(!ispath(type, /obj) && !ispath(type, /mob)) return FALSE var/loaded = 0 diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index f95acd6018..569b11b8b0 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -79,27 +79,27 @@ var/weight = getweight(user, STAM_COST_ATTACK_MOB_MULT) if(!user.UseStaminaBuffer(weight, warn = TRUE)) return FALSE - var/datum/gas_mixture/gasused = tank.air_contents.remove(gasperfist * fisto_setting) var/turf/T = get_turf(src) if(!T) return FALSE var/totalitemdamage = target.pre_attacked_by(src, user) - T.assume_air(gasused) - T.air_update_turf() - if(!gasused) + var/moles_used = gasperfist * fisto_setting + if(!moles_used) to_chat(user, "\The [src]'s tank is empty!") target.apply_damage((totalitemdamage / 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) + if(tank.air_contents.total_moles() < moles_used) 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((totalitemdamage / 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 + T.assume_air_moles(tank.air_contents, gasperfist * fisto_setting) + T.air_update_turf() target.apply_damage(totalitemdamage * fisto_setting, BRUTE, wound_bonus = -25*fisto_setting**2) 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!") diff --git a/code/game/objects/items/robot/robot_upgrades.dm b/code/game/objects/items/robot/robot_upgrades.dm index 291fc30aa2..88648bcbb7 100644 --- a/code/game/objects/items/robot/robot_upgrades.dm +++ b/code/game/objects/items/robot/robot_upgrades.dm @@ -90,7 +90,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst to_chat(user, "There's no room for another VTEC unit!") return FALSE - //R.speed = -2 // Gotta go fast. + //R.vtec = -2 // Gotta go fast. //Citadel change - makes vtecs give an ability rather than reducing the borg's speed instantly VC = new /obj/effect/proc_holder/silicon/cyborg/vtecControl R.AddAbility(VC) @@ -100,7 +100,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst . = ..() if (.) R.RemoveAbility(VC) - R.speed = initial(R.speed) + R.vtec = initial(R.vtec) R.cansprint = 1 /obj/item/borg/upgrade/disablercooler @@ -681,7 +681,7 @@ as performing this in action() will cause the upgrade to end up in the borg inst action_icon_state = "Chevron_State_0" var/currentState = 0 - var/maxReduction = 1 + var/maxReduction = 0.5 /obj/effect/proc_holder/silicon/cyborg/vtecControl/Trigger(mob/living/silicon/robot/user) @@ -690,11 +690,11 @@ as performing this in action() will cause the upgrade to end up in the borg inst if(istype(user)) switch(currentState) if (0) - user.speed = initial(user.speed) + user.vtec = initial(user.vtec) if (1) - user.speed = initial(user.speed) - maxReduction * 0.5 + user.vtec = initial(user.vtec) - maxReduction * 0.5 if (2) - user.speed = initial(user.speed) - maxReduction * 1 + user.vtec = initial(user.vtec) - maxReduction * 1 action.button_icon_state = "Chevron_State_[currentState]" action.UpdateButtonIcon() diff --git a/code/game/objects/items/shields.dm b/code/game/objects/items/shields.dm index 84faf27242..74efe3a196 100644 --- a/code/game/objects/items/shields.dm +++ b/code/game/objects/items/shields.dm @@ -34,6 +34,10 @@ block_damage_absorption = 5 block_resting_stamina_penalty_multiplier = 2 block_projectile_mitigation = 75 + block_damage_absorption_override = list( + TEXT_ATTACK_TYPE_TACKLE = INFINITY, + TEXT_ATTACK_TYPE_THROWN = 10 + ) /obj/item/shield/examine(mob/user) . = ..() @@ -120,8 +124,6 @@ return TRUE /obj/item/shield/proc/user_shieldbash(mob/living/user, atom/target, harmful) - if(!SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE)) //Combat mode has to be enabled for shield bashing - return FALSE if(!(shield_flags & SHIELD_CAN_BASH)) to_chat(user, "[src] can't be used to shield bash!") return FALSE @@ -376,11 +378,10 @@ /obj/item/shield/riot/flash/on_shield_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) . = ..() - if (. && !embedded_flash.crit_fail) + if (. && damage && !embedded_flash.crit_fail) embedded_flash.activate() update_icon() - /obj/item/shield/riot/flash/attackby(obj/item/W, mob/user) if(istype(W, /obj/item/assembly/flash/handheld)) var/obj/item/assembly/flash/handheld/flash = W @@ -547,7 +548,7 @@ force = 3 throwforce = 3 throw_speed = 3 - var/base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted + base_icon_state = "eshield" // [base_icon_state]1 for expanded, [base_icon_state]0 for contracted var/on_force = 10 var/on_throwforce = 8 var/on_throw_speed = 2 @@ -564,7 +565,7 @@ return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT return ..() -/obj/item/shield/energy/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) +/obj/item/shield/energy/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) if((attack_type & ATTACK_TYPE_PROJECTILE) && is_energy_reflectable_projectile(object)) block_return[BLOCK_RETURN_REDIRECT_METHOD] = REDIRECT_METHOD_DEFLECT return BLOCK_SUCCESS | BLOCK_REDIRECTED | BLOCK_SHOULD_REDIRECT diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 68762a63c7..382e361e8a 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -18,7 +18,7 @@ . = ..() update_desc() -/obj/item/stack/spacecash/proc/update_desc() +/obj/item/stack/spacecash/update_desc() var/total_worth = get_item_credit_value() desc = "It's worth [total_worth] credit[( total_worth > 1 ) ? "s" : ""]" diff --git a/code/game/objects/items/stacks/sheets/leather.dm b/code/game/objects/items/stacks/sheets/leather.dm index f655e831d8..eeb673a0c7 100644 --- a/code/game/objects/items/stacks/sheets/leather.dm +++ b/code/game/objects/items/stacks/sheets/leather.dm @@ -13,6 +13,7 @@ GLOBAL_LIST_INIT(human_recipes, list( \ new/datum/stack_recipe("bloated human costume", /obj/item/clothing/suit/hooded/bloated_human, 5), \ + new/datum/stack_recipe("human skin hat", /obj/item/clothing/head/human_leather, 1), \ )) /obj/item/stack/sheet/animalhide/human/get_main_recipes() diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 592b2e42cc..15153521ed 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -179,6 +179,7 @@ GLOBAL_LIST_INIT(metal_recipes, list ( \ GLOBAL_LIST_INIT(plasteel_recipes, list ( \ new/datum/stack_recipe("AI core", /obj/structure/AIcore, 4, time = 50, one_per_turf = TRUE), \ new/datum/stack_recipe("bomb assembly", /obj/machinery/syndicatebomb/empty, 10, time = 50), \ + new/datum/stack_recipe("plasteel keg", /obj/structure/custom_keg, 10, time = 50), \ new/datum/stack_recipe("micro powered fan assembly", /obj/machinery/fan_assembly, 5, time = 50, one_per_turf = TRUE, on_floor = TRUE), \ new /datum/stack_recipe_list("crates", list( \ new /datum/stack_recipe("gray crate", /obj/structure/closet/crate, 5, time = 50, one_per_turf = 1, on_floor = 1), \ diff --git a/code/game/objects/items/stacks/stack.dm b/code/game/objects/items/stacks/stack.dm index d126e39873..266d8b7b86 100644 --- a/code/game/objects/items/stacks/stack.dm +++ b/code/game/objects/items/stacks/stack.dm @@ -48,7 +48,7 @@ amount -= max_amount new type(loc, max_amount, FALSE) if(!merge_type) - merge_type = type + merge_type = src.type if(LAZYLEN(mats_per_unit)) set_mats_per_unit(mats_per_unit, 1) diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index 7721de42ad..62bde0e4e6 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -16,14 +16,16 @@ armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 50, "bio" = 0, "rad" = 0, "fire" = 80, "acid" = 80) attack_speed = CLICK_CD_MELEE - var/stamina_loss_amount = 35 + var/stamina_loss_amount = 40 var/turned_on = FALSE var/knockdown = TRUE + /// block percent needed to prevent knockdown/disarm + var/block_percent_to_counter = 50 var/obj/item/stock_parts/cell/cell var/hitcost = 750 var/throw_hit_chance = 35 var/preload_cell_type //if not empty the baton starts with this type of cell - var/cooldown_duration = 5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown + var/cooldown_duration = 3.5 SECONDS //How long our baton rightclick goes on cooldown for after applying a knockdown var/status_duration = 5 SECONDS //how long our status effects last for otherwise COOLDOWN_DECLARE(shove_cooldown) diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 92e0cee7e8..75ad909777 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -8,7 +8,7 @@ w_class = WEIGHT_CLASS_BULKY distribute_pressure = ONE_ATMOSPHERE * O2STANDARD actions_types = list(/datum/action/item_action/set_internals, /datum/action/item_action/toggle_jetpack, /datum/action/item_action/jetpack_stabilization) - var/gas_type = /datum/gas/oxygen + var/gas_type = GAS_O2 var/on = FALSE var/stabilizers = FALSE var/full_speed = TRUE // If the jetpack will have a speedboost in space/nograv or not @@ -77,13 +77,7 @@ turn_off(user) return - var/datum/gas_mixture/removed = air_contents.remove(num) - if(removed.total_moles() < 0.005) - turn_off(user) - return - - var/turf/T = get_turf(user) - T.assume_air(removed) + assume_air_moles(air_contents, num) return TRUE @@ -116,13 +110,7 @@ turn_off(user) return - var/datum/gas_mixture/removed = air_contents.remove(num) - if(removed.total_moles() < 0.005) - turn_off(user) - return - - var/turf/T = get_turf(user) - T.assume_air(removed) + assume_air_moles(air_contents, num) return TRUE @@ -171,7 +159,7 @@ icon_state = "jetpack-black" item_state = "jetpack-black" distribute_pressure = 0 - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/item/tank/jetpack/carbondioxide/eva name = "surplus jetpack (carbon dioxide)" diff --git a/code/game/objects/items/tanks/tank_types.dm b/code/game/objects/items/tanks/tank_types.dm index 84f2098b06..c49f820854 100644 --- a/code/game/objects/items/tanks/tank_types.dm +++ b/code/game/objects/items/tanks/tank_types.dm @@ -20,7 +20,7 @@ /obj/item/tank/internals/oxygen/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return @@ -48,8 +48,8 @@ force = 10 /obj/item/tank/internals/anesthetic/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(/datum/gas/nitrous_oxide, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.set_moles(GAS_NITROUS, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) return /* @@ -63,8 +63,8 @@ dog_fashion = /datum/dog_fashion/back /obj/item/tank/internals/air/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) - air_contents.set_moles(/datum/gas/nitrogen, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) + air_contents.set_moles(GAS_O2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * O2STANDARD) + air_contents.set_moles(GAS_N2, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C) * N2STANDARD) return @@ -81,7 +81,7 @@ /obj/item/tank/internals/plasma/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return /obj/item/tank/internals/plasma/attackby(obj/item/W, mob/user, params) @@ -98,14 +98,14 @@ return ..() /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) //Makes empty oxygen tanks spawn without gas /obj/item/tank/internals/plasma/empty/populate_gas() return /obj/item/tank/internals/plasma/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) /* * Plasmaman Plasma Tank @@ -120,11 +120,11 @@ distribute_pressure = TANK_DEFAULT_RELEASE_PRESSURE /obj/item/tank/internals/plasmaman/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return /obj/item/tank/internals/plasmaman/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return @@ -137,7 +137,7 @@ w_class = WEIGHT_CLASS_SMALL //thanks i forgot this /obj/item/tank/internals/plasmaman/belt/full/populate_gas() - air_contents.set_moles(/datum/gas/plasma, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_PLASMA, (10*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return //makes empty plasma tanks spawn without gas. @@ -160,7 +160,7 @@ /obj/item/tank/internals/emergency_oxygen/populate_gas() - air_contents.set_moles(/datum/gas/oxygen, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_O2, (3*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return /obj/item/tank/internals/emergency_oxygen/empty/populate_gas() @@ -196,5 +196,5 @@ volume = 10 /obj/item/tank/internals/methyl_bromide/populate_gas() - air_contents.set_moles(/datum/gas/methyl_bromide, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) + air_contents.set_moles(GAS_METHYL_BROMIDE, (6*ONE_ATMOSPHERE)*volume/(R_IDEAL_GAS_EQUATION*T20C)) return diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index 746b25facb..01da046809 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -83,7 +83,6 @@ if(istype(location)) location.assume_air(air_contents) air_contents.clear() - SSair.add_to_active(location) visible_message("[user] cuts [C]'s restraints with [src]!") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 454016d9e7..547217366b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -889,8 +889,8 @@ M.put_in_hands(src) to_chat(usr, "You pick up the deck.") - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) to_chat(usr, "You pick up the deck.") diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 2109d1038e..1816f26843 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -7,6 +7,10 @@ w_class = WEIGHT_CLASS_TINY resistance_flags = FLAMMABLE +/obj/item/trash/Initialize() + . = ..() + AddElement(/datum/element/trash) + /obj/item/trash/raisins name = "\improper 4no raisins" icon_state= "4no_raisins" @@ -80,6 +84,3 @@ name = "boritos bag" icon_state = "boritos" grind_results = list(/datum/reagent/aluminium = 1) //from the mylar bag - -/obj/item/trash/attack(mob/M, mob/living/user) - return diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 1c8504c5ad..902b1eaa13 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -332,6 +332,12 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 bare_wound_bonus = 0 wound_bonus = 0 +/obj/item/melee/bokken/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) + . = ..() + if(!istype(object, /obj/item/melee/bokken)) + // no counterattack. + block_return[BLOCK_RETURN_FORCE_NO_PARRY_COUNTERATTACK] = TRUE + /datum/block_parry_data/bokken // fucked up parry data, emphasizing quicker, shorter parries parry_stamina_cost = 10 // be wise about when you parry, though, else you won't be able to fight enough to make it count parry_time_windup = 0 @@ -358,7 +364,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 parry_time_perfect = 2.5 // however... parry_time_perfect_leeway = 2 // the entire time, the parry is perfect parry_failed_stagger_duration = 1 SECONDS - parry_failed_clickcd_duration = 1 SECONDS // more forgiving punishments for missed parries // still, don't fucking miss your parries or you're down stamina and staggered to shit /datum/block_parry_data/bokken/quick_parry/proj @@ -475,7 +480,6 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 parry_time_perfect = 1 parry_time_perfect_leeway = 1 parry_failed_stagger_duration = 1 SECONDS - parry_failed_clickcd_duration = 1 SECONDS /datum/block_parry_data/bokken/waki/quick_parry/proj parry_efficiency_perfect_override = list() diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 02f2009667..78a5c9ece9 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -22,6 +22,8 @@ //returns the damage value of the attack after processing the obj's various armor protections /obj/proc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0) + if(damage_flag == MELEE && damage_amount < damage_deflection) + return 0 switch(damage_type) if(BRUTE) if(BURN) @@ -204,32 +206,23 @@ GLOBAL_DATUM_INIT(acid_overlay, /mutable_appearance, mutable_appearance('icons/e //the obj's reaction when touched by acid /obj/acid_act(acidpwr, acid_volume) if(!(resistance_flags & UNACIDABLE) && acid_volume) - - if(!acid_level) - SSacid.processing[src] = src - update_icon() - var/acid_cap = acidpwr * 300 //so we cannot use huge amounts of weak acids to do as well as strong acids. - if(acid_level < acid_cap) - acid_level = min(acid_level + acidpwr * acid_volume, acid_cap) + AddComponent(/datum/component/acid, acidpwr, acid_volume) return 1 -//the proc called by the acid subsystem to process the acid that's on the obj -/obj/proc/acid_processing() - . = 1 - if(!(resistance_flags & ACID_PROOF)) - if(prob(33)) - playsound(loc, 'sound/items/welder.ogg', 150, 1) - take_damage(min(1 + round(sqrt(acid_level)*0.3), 300), BURN, "acid", 0) - - acid_level = max(acid_level - (5 + 3*round(sqrt(acid_level))), 0) - if(!acid_level) - return 0 - //called when the obj is destroyed by acid. /obj/proc/acid_melt() - SSacid.processing -= src + var/datum/component/acid/acid = GetComponent(/datum/component/acid) + if(acid) + acid.RemoveComponent() deconstruct(FALSE) +/obj/proc/acid_level() + var/datum/component/acid/acid = GetComponent(/datum/component/acid) + if(acid) + return acid.level + else + return 0 + //// FIRE /obj/fire_act(exposed_temperature, exposed_volume) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index f0edf7ee1d..58c571d9e6 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -20,9 +20,10 @@ var/max_integrity = 500 var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the obj breaks. 0.5 being 50% - var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF + ///Damage under this value will be completely ignored + var/damage_deflection = 0 - var/acid_level = 0 //how much acid is on that obj + var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF var/persistence_replacement //have something WAY too amazing to live to the next round? Set a new path here. Overuse of this var will make me upset. var/current_skin //the item reskin @@ -96,12 +97,43 @@ else return null +/obj/assume_air_moles(datum/gas_mixture/giver, moles) + if(loc) + return loc.assume_air_moles(giver, moles) + else + return null + +/obj/assume_air_ratio(datum/gas_mixture/giver, ratio) + if(loc) + return loc.assume_air_ratio(giver, ratio) + else + return null + +/obj/transfer_air(datum/gas_mixture/taker, moles) + if(loc) + return loc.transfer_air(taker, moles) + else + return null + +/obj/transfer_air_ratio(datum/gas_mixture/taker, ratio) + if(loc) + return loc.transfer_air_ratio(taker, ratio) + else + return null + + /obj/remove_air(amount) if(loc) return loc.remove_air(amount) else return null +/obj/remove_air_ratio(ratio) + if(loc) + return loc.remove_air_ratio(ratio) + else + return null + /obj/return_air() if(loc) return loc.return_air() @@ -116,8 +148,7 @@ if(breath_request>0) var/datum/gas_mixture/environment = return_air() - var/breath_percentage = BREATH_VOLUME / environment.return_volume() - return remove_air(environment.total_moles() * breath_percentage) + return remove_air_ratio(BREATH_VOLUME / environment.return_volume()) else return null @@ -339,8 +370,6 @@ /obj/update_overlays() . = ..() - if(acid_level) - . += GLOB.acid_overlay if(resistance_flags & ON_FIRE) . += GLOB.fire_overlay diff --git a/code/game/objects/structures/aliens.dm b/code/game/objects/structures/aliens.dm index ce11daec54..bc7ce8c36e 100644 --- a/code/game/objects/structures/aliens.dm +++ b/code/game/objects/structures/aliens.dm @@ -81,8 +81,8 @@ resintype = "wall" canSmoothWith = list(/obj/structure/alien/resin/wall, /obj/structure/alien/resin/membrane) -/obj/structure/alien/resin/wall/BlockSuperconductivity() - return 1 +/obj/structure/alien/resin/wall/BlockThermalConductivity() + return TRUE /obj/structure/alien/resin/membrane name = "resin membrane" diff --git a/code/game/objects/structures/beds_chairs/chair.dm b/code/game/objects/structures/beds_chairs/chair.dm index 76ab086eb2..89f018f291 100644 --- a/code/game/objects/structures/beds_chairs/chair.dm +++ b/code/game/objects/structures/beds_chairs/chair.dm @@ -348,7 +348,7 @@ parry_time_perfect = 1.5 parry_time_perfect_leeway = 1 parry_imperfect_falloff_percent = 7.5 - parry_efficiency_to_counterattack = 100 + parry_efficiency_to_counterattack = INFINITY parry_efficiency_considered_successful = 50 parry_efficiency_perfect = 120 parry_efficiency_perfect_override = list( diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 00c4b1f7db..4e57a2f717 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -86,7 +86,7 @@ . += "off" . += "sparking" //Overlay is similar enough for both that we can use the same mask for both - SSvis_overlays.add_vis_overlay(src, icon, "locked", EMISSIVE_LAYER, EMISSIVE_PLANE, dir, alpha) + . += emissive_appearance(icon, "locked", alpha = src.alpha) . += locked ? "locked" : "unlocked" @@ -356,7 +356,7 @@ return /obj/structure/closet/MouseDrop_T(atom/movable/O, mob/living/user) - if(!istype(O) || O.anchored || istype(O, /obj/screen)) + if(!istype(O) || O.anchored || istype(O, /atom/movable/screen)) return if(!istype(user) || user.incapacitated() || user.lying) return @@ -531,7 +531,7 @@ /obj/structure/closet/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/structure/closet/emp_act(severity) . = ..() diff --git a/code/game/objects/structures/door_assembly.dm b/code/game/objects/structures/door_assembly.dm index aba3b743bb..d03e0fd57e 100644 --- a/code/game/objects/structures/door_assembly.dm +++ b/code/game/objects/structures/door_assembly.dm @@ -269,7 +269,7 @@ . += get_airlock_overlay("glass_construction", overlays_file) . += get_airlock_overlay("panel_c[state+1]", overlays_file) -/obj/structure/door_assembly/proc/update_name() +/obj/structure/door_assembly/update_name() name = "" switch(state) if(AIRLOCK_ASSEMBLY_NEEDS_WIRES) diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index d996f86df7..cb9309c4c4 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -95,7 +95,7 @@ alpha = 150 resistance_flags = FIRE_PROOF -/obj/structure/holosign/barrier/firelock/BlockSuperconductivity() +/obj/structure/holosign/barrier/firelock/BlockThermalConductivity() return TRUE /obj/structure/holosign/barrier/firelock/Initialize() @@ -115,7 +115,7 @@ CanAtmosPass = ATMOS_PASS_NO resistance_flags = FIRE_PROOF -/obj/structure/holosign/barrier/combifan/BlockSuperconductivity() +/obj/structure/holosign/barrier/combifan/BlockThermalConductivity() return TRUE /obj/structure/holosign/barrier/combifan/Initialize() diff --git a/code/game/objects/structures/mirror.dm b/code/game/objects/structures/mirror.dm index 32040b8573..a70d9d4678 100644 --- a/code/game/objects/structures/mirror.dm +++ b/code/game/objects/structures/mirror.dm @@ -48,14 +48,34 @@ return // no message spam ..() +/obj/structure/mirror/attacked_by(obj/item/I, mob/living/user) + if(broken || !istype(user) || !I.force) + return ..() + + . = ..() + if(broken) // breaking a mirror truly gets you bad luck! + to_chat(user, "A chill runs down your spine as [src] shatters...") + user.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message + +/obj/structure/mirror/bullet_act(obj/item/projectile/P) + if(broken || !isliving(P.firer) || !P.damage) + return ..() + + . = ..() + if(broken) // breaking a mirror truly gets you bad luck! + var/mob/living/unlucky_dude = P.firer + to_chat(unlucky_dude, "A chill runs down your spine as [src] shatters...") + unlucky_dude.AddComponent(/datum/component/omen, silent=TRUE) // we have our own message + /obj/structure/mirror/obj_break(damage_flag, mapload) - if(!broken && !(flags_1 & NODECONSTRUCT_1)) - icon_state = "mirror_broke" - if(!mapload) - playsound(src, "shatter", 70, 1) - if(desc == initial(desc)) - desc = "Oh no, seven years of bad luck!" - broken = TRUE + if(broken || (flags_1 & NODECONSTRUCT_1)) + return + icon_state = "mirror_broke" + if(!mapload) + playsound(src, "shatter", 70, TRUE) + if(desc == initial(desc)) + desc = "Oh no, seven years of bad luck!" + broken = TRUE /obj/structure/mirror/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm index 82ca59161c..4980981574 100644 --- a/code/game/objects/structures/morgue.dm +++ b/code/game/objects/structures/morgue.dm @@ -139,7 +139,7 @@ GLOBAL_LIST_EMPTY(bodycontainers) //Let them act as spawnpoints for revenants an /obj/structure/bodycontainer/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) /* * Morgue */ diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index 6356424aaf..065c0d2f28 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -243,6 +243,32 @@ new framestack(T, framestackamount) qdel(src) + +/** + * Gets all connected tables + * Cardinals only + */ +/obj/structure/table/proc/connected_floodfill(max = 25) + . = list() + connected_floodfill_internal(., list()) + +/obj/structure/table/proc/connected_floodfill_internal(list/out = list(), list/processed = list()) + if(processed[src]) + return + processed[src] = TRUE + out += src + var/obj/structure/table/other +#define RUN_TABLE(dir) \ + other = locate(/obj/structure/table) in get_step(src, dir); \ + if(other) { \ + other.connected_floodfill_internal(out, processed); \ + } + RUN_TABLE(NORTH) + RUN_TABLE(SOUTH) + RUN_TABLE(EAST) + RUN_TABLE(WEST) +#undef RUN_TABLE + /obj/structure/table/greyscale icon = 'icons/obj/smooth_structures/table_greyscale.dmi' icon_state = "table" diff --git a/code/game/objects/structures/transit_tubes/station.dm b/code/game/objects/structures/transit_tubes/station.dm index a5b6b0c9e1..376725b262 100644 --- a/code/game/objects/structures/transit_tubes/station.dm +++ b/code/game/objects/structures/transit_tubes/station.dm @@ -121,6 +121,7 @@ /obj/structure/transit_tube/station/proc/launch_pod() + set waitfor = FALSE if(launch_cooldown >= world.time) return for(var/obj/structure/transit_tube_pod/pod in loc) @@ -149,9 +150,7 @@ pod_moving = 0 if(!QDELETED(pod)) var/datum/gas_mixture/floor_mixture = loc.return_air() - floor_mixture.archive() - pod.air_contents.archive() - pod.air_contents.share(floor_mixture, 1) //mix the pod's gas mixture with the tile it's on + equalize_all_gases_in_list(list(pod.air_contents,floor_mixture)) air_update_turf() /obj/structure/transit_tube/station/init_tube_dirs() diff --git a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm index 89b03a8d78..82e946a2f4 100644 --- a/code/game/objects/structures/transit_tubes/transit_tube_pod.dm +++ b/code/game/objects/structures/transit_tubes/transit_tube_pod.dm @@ -10,8 +10,8 @@ /obj/structure/transit_tube_pod/Initialize() . = ..() - air_contents.set_moles(/datum/gas/oxygen, MOLES_O2STANDARD) - air_contents.set_moles(/datum/gas/nitrogen, MOLES_N2STANDARD) + air_contents.set_moles(GAS_O2, MOLES_O2STANDARD) + air_contents.set_moles(GAS_N2, MOLES_N2STANDARD) air_contents.set_temperature(T20C) @@ -153,9 +153,25 @@ /obj/structure/transit_tube_pod/assume_air(datum/gas_mixture/giver) return air_contents.merge(giver) +/obj/structure/transit_tube_pod/assume_air_moles(datum/gas_mixture/giver, moles) + return giver.transfer_to(air_contents, moles) + +/obj/structure/transit_tube_pod/assume_air_ratio(datum/gas_mixture/giver, ratio) + return giver.transfer_ratio_to(air_contents, ratio) + /obj/structure/transit_tube_pod/remove_air(amount) return air_contents.remove(amount) +/obj/structure/transit_tube_pod/remove_air_ratio(ratio) + return air_contents.remove_ratio(ratio) + +/obj/structure/transit_tube_pod/transfer_air(datum/gas_mixture/taker, moles) + return air_contents.transfer_to(taker, moles) + +/obj/structure/transit_tube_pod/transfer_air_ratio(datum/gas_mixture/taker, ratio) + return air_contents.transfer_ratio_to(taker, ratio) + + /obj/structure/transit_tube_pod/relaymove(mob/mob, direction) if(istype(mob) && mob.client) if(!moving) diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index 01c62a7901..9a2b4aab1a 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -354,10 +354,10 @@ . = SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) . = O.clean_blood() O.remove_atom_colour(WASHABLE_COLOUR_PRIORITY) - if(isitem(O)) - var/obj/item/I = O - I.acid_level = 0 - I.extinguish() + var/datum/component/acid/acid = O.GetComponent(/datum/component/acid) + if(acid) + acid.level = 0 + O.extinguish() /obj/machinery/shower/proc/wash_turf() if(isturf(loc)) @@ -601,7 +601,9 @@ busy = FALSE SEND_SIGNAL(O, COMSIG_COMPONENT_CLEAN_ACT, CLEAN_WEAK) O.clean_blood() - O.acid_level = 0 + var/datum/component/acid/acid = O.GetComponent(/datum/component/acid) + if(acid) + acid.level = 0 create_reagents(5) reagents.add_reagent(dispensedreagent, 5) reagents.reaction(O, TOUCH) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 6fbe1bc357..5f84094477 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -674,7 +674,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) /obj/structure/window/plasma/reinforced/unanchored anchored = FALSE -/obj/structure/window/plasma/reinforced/BlockSuperconductivity() +/obj/structure/window/plasma/reinforced/BlockThermalConductivity() return TRUE /obj/structure/window/reinforced/tinted diff --git a/code/game/sound.dm b/code/game/sound.dm index 1816336bd1..3a65d47f3f 100644 --- a/code/game/sound.dm +++ b/code/game/sound.dm @@ -43,7 +43,8 @@ falloff_distance - Distance at which falloff begins. Sound is at peak volume (in */ -/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0) +/proc/playsound(atom/source, soundin, vol as num, vary, extrarange as num, falloff_exponent = SOUND_FALLOFF_EXPONENT, frequency = null, channel = 0, pressure_affected = TRUE, ignore_walls = TRUE, + falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, envwet = -10000, envdry = 0, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, distance_multiplier_min_range = SOUND_DEFAULT_MULTIPLIER_EFFECT_RANGE) if(isarea(source)) CRASH("playsound(): source is an area") @@ -83,11 +84,11 @@ falloff_distance - Distance at which falloff begins. Sound is at peak volume (in for(var/P in listeners) var/mob/M = P if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry) for(var/P in SSmobs.dead_players_by_zlevel[source_z]) var/mob/M = P if(get_dist(M, turf_source) <= maxdistance) - M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, null, envwet, envdry) + M.playsound_local(turf_source, soundin, vol, vary, frequency, falloff_exponent, channel, pressure_affected, S, maxdistance, falloff_distance, get_dist(M, turf_source) <= distance_multiplier_min_range? 1 : distance_multiplier, envwet, envdry) /*! playsound @@ -108,7 +109,8 @@ distance_multiplier - Can be used to multiply the distance at which the sound is */ -/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = 1, envwet = -10000, envdry = 0) +/mob/proc/playsound_local(turf/turf_source, soundin, vol as num, vary, frequency, falloff_exponent = SOUND_FALLOFF_EXPONENT, channel = 0, pressure_affected = TRUE, sound/S, max_distance, + falloff_distance = SOUND_DEFAULT_FALLOFF_DISTANCE, distance_multiplier = SOUND_DEFAULT_DISTANCE_MULTIPLIER, envwet = -10000, envdry = 0) if(!client || !can_hear()) return diff --git a/code/game/turfs/change_turf.dm b/code/game/turfs/change_turf.dm index 66e7ebd424..bb5ca6da1a 100644 --- a/code/game/turfs/change_turf.dm +++ b/code/game/turfs/change_turf.dm @@ -15,9 +15,7 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( if(turf_type) var/turf/newT = ChangeTurf(turf_type, baseturf_type, flags) - SSair.remove_from_active(newT) CALCULATE_ADJACENT_TURFS(newT) - SSair.add_to_active(newT,1) /turf/proc/copyTurf(turf/T) if(T.type != type) @@ -54,6 +52,14 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( /turf/proc/TerraformTurf(path, new_baseturf, flags) return ChangeTurf(path, new_baseturf, flags) +/turf/proc/get_z_base_turf() + . = SSmapping.level_trait(z, ZTRAIT_BASETURF) || /turf/open/space + if (!ispath(.)) + . = text2path(.) + if (!ispath(.)) + warning("Z-level [z] has invalid baseturf '[SSmapping.level_trait(z, ZTRAIT_BASETURF)]'") + . = /turf/open/space + // 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) @@ -61,17 +67,12 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( 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 + path = get_z_base_turf() 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 + if(!GLOB.use_preloader && path == type && !(flags & CHANGETURF_FORCEOP) && (baseturfs == new_baseturfs)) // Don't no-op if the map loader requires it to be reconstructed, or if this is a new set of baseturfs return src if(flags & CHANGETURF_SKIP) return new path(src) @@ -142,22 +143,25 @@ 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/datum/gas_mixture/stashed_air = new() stashed_air.copy_from(air) . = ..() if (!.) // changeturf failed or didn't do anything QDEL_NULL(stashed_air) - update_air_ref() return var/turf/open/newTurf = . newTurf.air.copy_from(stashed_air) + update_air_ref(planetary_atmos ? 1 : 2) QDEL_NULL(stashed_air) - SSair.add_to_active(newTurf) else if(ispath(path,/turf/closed)) flags |= CHANGETURF_RECALC_ADJACENT - return ..() + update_air_ref(-1) + . = ..() + else + . = ..() + if(!istype(air,/datum/gas_mixture)) + Initalize_Atmos(0) // Take off the top layer turf and replace it with the next baseturf down /turf/proc/ScrapeAway(amount=1, flags) @@ -317,7 +321,6 @@ GLOBAL_LIST_INIT(blacklisted_automated_baseturfs, typecacheof(list( total.merge(S.air) air.copy_from(total.remove_ratio(1/turf_count)) - SSair.add_to_active(src) /turf/proc/ReplaceWithLattice() ScrapeAway(flags = CHANGETURF_INHERIT_AIR) diff --git a/code/game/turfs/closed.dm b/code/game/turfs/closed.dm index 91a8ba4f46..a3ec6c6276 100644 --- a/code/game/turfs/closed.dm +++ b/code/game/turfs/closed.dm @@ -8,15 +8,17 @@ rad_insulation = RAD_MEDIUM_INSULATION wave_explosion_block = 10 wave_explosion_multiply = 0.75 + /// How much we block yelling + var/yelling_resistance = 10 + /// how much of inbound yelling to dampen + var/yelling_dampen = 0.5 /turf/closed/Initialize() . = ..() - update_air_ref() /turf/closed/AfterChange() . = ..() SSair.high_pressure_delta -= src - update_air_ref() /turf/closed/get_smooth_underlay_icon(mutable_appearance/underlay_appearance, turf/asking_turf, adjacency_dir) return FALSE @@ -201,16 +203,19 @@ desc = "A wall made out of a strange metal. The squares on it pulse in a predictable pattern." icon = 'icons/turf/walls/hierophant_wall.dmi' icon_state = "wall" - + /turf/closed/indestructible/rock/glacierrock name = "unaturally hard ice wall" desc = "Ice, hardened over thousands of years, you're not breaking through this." icon = 'icons/turf/walls.dmi' icon_state = "snow_rock" - + /turf/closed/indestructible/rock/glacierrock/blue name = "blue ice wall" desc = "The incredible compressive forces that formed this sturdy ice wall gave it a blue color." icon = 'icons/turf/walls.dmi' icon_state = "ice" canSmoothWith = list(/turf/closed/indestructible/rock/glacierrock/blue) + +/turf/closed/get_yelling_resistance(power) + return yelling_resistance + (power * yelling_dampen) diff --git a/code/game/turfs/open.dm b/code/game/turfs/open.dm index 81426688be..b526b5b886 100644 --- a/code/game/turfs/open.dm +++ b/code/game/turfs/open.dm @@ -218,18 +218,15 @@ flash_color(L, flash_color = "#C80000", flash_time = 10) /turf/open/Initalize_Atmos(times_fired) - set_excited(FALSE) + if(!blocks_air) + if(!istype(air,/datum/gas_mixture/turf)) + air = new(2500,src) + air.copy_from_turf(src) + update_air_ref(planetary_atmos ? 1 : 2) + update_visuals() - current_cycle = times_fired ImmediateCalculateAdjacentTurfs() - for(var/i in atmos_adjacent_turfs) - var/turf/open/enemy_tile = i - var/datum/gas_mixture/enemy_air = enemy_tile.return_air() - if(!get_excited() && air.compare(enemy_air)) - //testing("Active turf found. Return value of compare(): [is_active]") - set_excited(TRUE) - SSair.add_to_active_extools(src) /turf/open/proc/GetHeatCapacity() . = air.heat_capacity() @@ -323,8 +320,8 @@ /turf/open/rad_act(pulse_strength) . = ..() - if (air.get_moles(/datum/gas/carbon_dioxide) && air.get_moles(/datum/gas/oxygen)) - pulse_strength = min(pulse_strength,air.get_moles(/datum/gas/carbon_dioxide)*1000,air.get_moles(/datum/gas/oxygen)*2000) //Ensures matter is conserved properly - air.set_moles(/datum/gas/carbon_dioxide, max(air.get_moles(/datum/gas/carbon_dioxide)-(pulse_strength/1000),0)) - air.set_moles(/datum/gas/oxygen, max(air.get_moles(/datum/gas/oxygen)-(pulse_strength/2000),0)) - air.adjust_moles(/datum/gas/pluoxium, pulse_strength/4000) + if (air.get_moles(GAS_CO2) && air.get_moles(GAS_O2)) + pulse_strength = min(pulse_strength,air.get_moles(GAS_CO2)*1000,air.get_moles(GAS_O2)*2000) //Ensures matter is conserved properly + air.set_moles(GAS_CO2, max(air.get_moles(GAS_CO2)-(pulse_strength/1000),0)) + air.set_moles(GAS_O2, max(air.get_moles(GAS_O2)-(pulse_strength/2000),0)) + air.adjust_moles(GAS_PLUOXIUM, pulse_strength/4000) diff --git a/code/game/turfs/openspace/transparent.dm b/code/game/turfs/openspace/transparent.dm new file mode 100644 index 0000000000..570f153d41 --- /dev/null +++ b/code/game/turfs/openspace/transparent.dm @@ -0,0 +1,95 @@ +/turf/open/transparent + baseturfs = /turf/open/transparent/openspace + intact = FALSE //this means wires go on top + +/turf/open/transparent/Initialize() // handle plane and layer here so that they don't cover other obs/turfs in Dream Maker + . = ..() + plane = OPENSPACE_PLANE + layer = OPENSPACE_LAYER + + return INITIALIZE_HINT_LATELOAD + +/turf/open/transparent/LateInitialize() + update_multiz(TRUE, TRUE) + +/turf/open/transparent/Destroy() + vis_contents.len = 0 + return ..() + +/turf/open/transparent/update_multiz(prune_on_fail = FALSE, init = FALSE) + . = ..() + var/turf/T = below() + if(!T) + vis_contents.len = 0 + if(!show_bottom_level() && prune_on_fail) //If we cant show whats below, and we prune on fail, change the turf to plating as a fallback + ChangeTurf(/turf/open/floor/plating, flags = CHANGETURF_INHERIT_AIR) + return FALSE + if(init) + vis_contents += T + return TRUE + +/turf/open/transparent/multiz_turf_del(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +/turf/open/transparent/multiz_turf_new(turf/T, dir) + if(dir != DOWN) + return + update_multiz() + +///Called when there is no real turf below this turf +/turf/open/transparent/proc/show_bottom_level() + var/turf/path = get_z_base_turf() + var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE) + underlays += underlay_appearance + return TRUE + + +/turf/open/transparent/glass + name = "Glass floor" + desc = "Dont jump on it, or do, I'm not your mom." + icon = 'icons/turf/floors/glass.dmi' + icon_state = "floor_glass" + smooth = SMOOTH_MORE + var/floor_tile = /obj/item/stack/sheet/glass + canSmoothWith = list(/turf/open/transparent/glass, /turf/open/transparent/glass/reinforced) + footstep = FOOTSTEP_PLATING + barefootstep = FOOTSTEP_HARD_BAREFOOT + clawfootstep = FOOTSTEP_HARD_CLAW + heavyfootstep = FOOTSTEP_GENERIC_HEAVY + +/turf/open/transparent/glass/Initialize() + icon_state = "" //Prevent the normal icon from appearing behind the smooth overlays + ..() + return INITIALIZE_HINT_LATELOAD + +/turf/open/floor/glass/LateInitialize() + . = ..() + // AddElement(/datum/element/turf_z_transparency, TRUE) + +/turf/open/transparent/glass/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin removing glass...") + if(I.use_tool(src, user, 30, volume=80)) + if(!istype(src, /turf/open/transparent/glass)) + return TRUE + if(floor_tile) + new floor_tile(src, 2) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return TRUE + +/turf/open/transparent/glass/reinforced + name = "Reinforced glass floor" + desc = "Do jump on it, it can take it." + icon = 'icons/turf/floors/reinf_glass.dmi' + floor_tile = /obj/item/stack/sheet/rglass + +/turf/open/transparent/glass/reinforced/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin removing reinforced glass...") + if(I.use_tool(src, user, 30, volume=80)) + if(!istype(src, /turf/open/transparent/glass/reinforced)) + return TRUE + if(floor_tile) + new floor_tile(src, 2) + ScrapeAway(flags = CHANGETURF_INHERIT_AIR) + return TRUE diff --git a/code/game/turfs/simulated/floor.dm b/code/game/turfs/simulated/floor.dm index e5034e4b2f..4b03b2b8e6 100644 --- a/code/game/turfs/simulated/floor.dm +++ b/code/game/turfs/simulated/floor.dm @@ -27,7 +27,7 @@ var/icon_regular_floor = "floor" //used to remember what icon the tile should have by default var/icon_plating = "plating" - thermal_conductivity = 0.004 + thermal_conductivity = 0.04 heat_capacity = 10000 intact = 1 var/broken = 0 diff --git a/code/game/turfs/simulated/floor/fancy_floor.dm b/code/game/turfs/simulated/floor/fancy_floor.dm index 3960f9a034..f707037771 100644 --- a/code/game/turfs/simulated/floor/fancy_floor.dm +++ b/code/game/turfs/simulated/floor/fancy_floor.dm @@ -69,7 +69,7 @@ ChangeTurf(/turf/open/floor/plating/rust) /turf/open/floor/wood/cold - temperature = 255.37 + initial_temperature = 255.37 /turf/open/floor/wood/airless initial_gas_mix = AIRLESS_ATMOS diff --git a/code/game/turfs/simulated/floor/plating/misc_plating.dm b/code/game/turfs/simulated/floor/plating/misc_plating.dm index 5323db001f..d834272bea 100644 --- a/code/game/turfs/simulated/floor/plating/misc_plating.dm +++ b/code/game/turfs/simulated/floor/plating/misc_plating.dm @@ -177,7 +177,7 @@ icon = 'icons/turf/floors/ice_turf.dmi' icon_state = "unsmooth" initial_gas_mix = FROZEN_ATMOS - temperature = 180 + initial_temperature = 180 planetary_atmos = TRUE baseturfs = /turf/open/floor/plating/ice slowdown = 1 @@ -201,10 +201,10 @@ canSmoothWith = list(/turf/open/floor/plating/ice/smooth, /turf/open/floor/plating/ice, /turf/open/floor/plating/ice/colder) /turf/open/floor/plating/ice/colder - temperature = 140 + initial_temperature = 140 /turf/open/floor/plating/ice/temperate - temperature = 255.37 + initial_temperature = 255.37 /turf/open/floor/plating/ice/break_tile() return @@ -221,7 +221,7 @@ icon = 'icons/turf/snow.dmi' icon_state = "snowplating" initial_gas_mix = FROZEN_ATMOS - temperature = 180 + initial_temperature = 180 attachment_holes = FALSE planetary_atmos = TRUE footstep = FOOTSTEP_SAND @@ -230,7 +230,7 @@ heavyfootstep = FOOTSTEP_GENERIC_HEAVY /turf/open/floor/plating/snowed/cavern - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" + initial_gas_mix = "n2=82;plasma=24;TEMP=120" /turf/open/floor/plating/snowed/smoothed smooth = SMOOTH_MORE | SMOOTH_BORDER @@ -240,10 +240,10 @@ icon_state = "smooth" /turf/open/floor/plating/snowed/colder - temperature = 140 + initial_temperature = 140 /turf/open/floor/plating/snowed/temperatre - temperature = 255.37 + initial_temperature = 255.37 /turf/open/floor/plating/snowed/smoothed/icemoon initial_gas_mix = ICEMOON_DEFAULT_ATMOS diff --git a/code/game/turfs/simulated/floor/reinf_floor.dm b/code/game/turfs/simulated/floor/reinf_floor.dm index f8c6ff1ce2..2d03624354 100644 --- a/code/game/turfs/simulated/floor/reinf_floor.dm +++ b/code/game/turfs/simulated/floor/reinf_floor.dm @@ -3,7 +3,7 @@ name = "reinforced floor" desc = "Extremely sturdy." icon_state = "engine" - thermal_conductivity = 0.0025 + thermal_conductivity = 0.025 heat_capacity = INFINITY floor_tile = /obj/item/stack/rods footstep = FOOTSTEP_PLATING diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index 517df8775c..4a5b9f43de 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -14,8 +14,8 @@ density = TRUE blocks_air = TRUE layer = EDGED_TURF_LAYER + initial_temperature = 293.15 // base_icon_state = "smoothrocks" - temperature = TCMB var/smooth_icon = 'icons/turf/smoothrocks.dmi' var/environment_type = "asteroid" var/turf/open/floor/plating/turf_type = /turf/open/floor/plating/asteroid/airless diff --git a/code/game/turfs/simulated/wall/mineral_walls.dm b/code/game/turfs/simulated/wall/mineral_walls.dm index 5d928f377e..ed48c24462 100644 --- a/code/game/turfs/simulated/wall/mineral_walls.dm +++ b/code/game/turfs/simulated/wall/mineral_walls.dm @@ -90,7 +90,7 @@ icon = 'icons/turf/walls/plasma_wall.dmi' icon_state = "plasma" sheet_type = /obj/item/stack/sheet/mineral/plasma - thermal_conductivity = 0.004 + thermal_conductivity = 0.04 canSmoothWith = list(/turf/closed/wall/mineral/plasma, /obj/structure/falsewall/plasma) /turf/closed/wall/mineral/plasma/attackby(obj/item/W, mob/user, params) diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index 708ca230b1..72612f82ff 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -15,3 +15,7 @@ barefootstep = FOOTSTEP_WATER clawfootstep = FOOTSTEP_WATER heavyfootstep = FOOTSTEP_WATER + +/turf/open/water/decorative + initial_gas_mix = OPENTURF_DEFAULT_ATMOS + planetary_atmos = FALSE diff --git a/code/game/turfs/space/space.dm b/code/game/turfs/space/space.dm index b1a4efc97e..3ed3891fdf 100644 --- a/code/game/turfs/space/space.dm +++ b/code/game/turfs/space/space.dm @@ -5,8 +5,8 @@ intact = 0 dirt_buildup_allowed = FALSE - temperature = TCMB - thermal_conductivity = OPEN_HEAT_TRANSFER_COEFFICIENT + initial_temperature = TCMB + thermal_conductivity = 0 heat_capacity = 700000 wave_explosion_multiply = EXPLOSION_DAMPEN_SPACE wave_explosion_block = EXPLOSION_BLOCK_SPACE @@ -15,7 +15,7 @@ var/destination_x var/destination_y - var/static/datum/gas_mixture/immutable/space/space_gas = new + var/static/datum/gas_mixture/immutable/space/space_gas plane = PLANE_SPACE layer = SPACE_LAYER light_power = 0.25 @@ -36,8 +36,10 @@ /turf/open/space/Initialize() SHOULD_CALL_PARENT(FALSE) icon_state = SPACE_ICON_STATE + if(!space_gas) + space_gas = new air = space_gas - update_air_ref() + update_air_ref(0) vis_contents.Cut() //removes inherited overlays visibilityChanged() @@ -58,9 +60,6 @@ if(!IS_DYNAMIC_LIGHTING(src) && IS_DYNAMIC_LIGHTING(A)) add_overlay(/obj/effect/fullbright) - if(requires_activation) - SSair.add_to_active(src) - if (light_power && light_range) update_light() @@ -103,6 +102,9 @@ /turf/open/space/remove_air(amount) return null +/turf/open/space/remove_air_ratio(amount) + return null + /turf/open/space/proc/update_starlight() if(CONFIG_GET(flag/starlight)) for(var/t in RANGE_TURFS(1,src)) //RANGE_TURFS is in code\__HELPERS\game.dm @@ -274,6 +276,8 @@ destination_y = dest_y destination_z = dest_z +/turf/open/space/get_yelling_resistance(power) + return INFINITY // no sound through space for crying out loud /turf/open/space/transparent baseturfs = /turf/open/space/transparent/openspace @@ -318,12 +322,7 @@ ///Called when there is no real turf below this turf /turf/open/space/transparent/proc/show_bottom_level() - var/turf/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 + var/turf/path = get_z_base_turf() var/mutable_appearance/underlay_appearance = mutable_appearance(initial(path.icon), initial(path.icon_state), layer = TURF_LAYER, plane = PLANE_SPACE) underlays += underlay_appearance return TRUE diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm index 1a9d8146bb..d949158850 100755 --- a/code/game/turfs/turf.dm +++ b/code/game/turfs/turf.dm @@ -16,7 +16,7 @@ GLOBAL_LIST_EMPTY(station_turfs) // This shouldn't be modified directly, use the helper procs. var/list/baseturfs = /turf/baseturf_bottom - var/temperature = T20C + var/initial_temperature = T20C var/to_be_destroyed = 0 //Used for fire, if a melting temperature was reached, it will be destroyed var/max_fire_temperature_sustained = 0 //The max temperature of the fire which it was subjected to @@ -76,7 +76,6 @@ GLOBAL_LIST_EMPTY(station_turfs) if(requires_activation) CALCULATE_ADJACENT_TURFS(src) - SSair.add_to_active(src) if (light_power && light_range) update_light() @@ -96,9 +95,21 @@ GLOBAL_LIST_EMPTY(station_turfs) set_custom_materials(custom_materials) ComponentInitialize() + if(isopenturf(src)) + var/turf/open/O = src + __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf()) && !O.planetary_atmos) + else + update_air_ref(-1) + __auxtools_update_turf_temp_info(isspaceturf(get_z_base_turf())) return INITIALIZE_HINT_NORMAL +/turf/proc/__auxtools_update_turf_temp_info() + +/turf/return_temperature() + +/turf/proc/set_temperature() + /turf/proc/Initalize_Atmos(times_fired) CALCULATE_ADJACENT_TURFS(src) @@ -120,7 +131,6 @@ GLOBAL_LIST_EMPTY(station_turfs) for(var/A in B.contents) qdel(A) return - SSair.remove_from_active(src) visibilityChanged() QDEL_LIST(blueprint_data) flags_1 &= ~INITIALIZED_1 @@ -615,3 +625,16 @@ GLOBAL_LIST_EMPTY(station_turfs) . = ..() if(. != BULLET_ACT_FORCE_PIERCE) . = BULLET_ACT_TURF + +/turf/proc/get_yelling_resistance(power) + . = 0 + // don't bother checking fulltile, we don't need accuracy + var/obj/window = locate(/obj/structure/window) in src + if(!window) + window = locate(/obj/machinery/door/window) in src + if(window) + . += 4 // windows are minimally resistant + // if there's more than one someone fucked up as that shouldn't happen + var/obj/machinery/door/D = locate() in src + if(D?.density) + . += D.opacity? 29 : 19 // glass doors are slightly more resistant to screaming diff --git a/code/game/world.dm b/code/game/world.dm index 4369ca6668..f466913346 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -7,46 +7,20 @@ GLOBAL_VAR_INIT(tgs_initialized, FALSE) GLOBAL_VAR(topic_status_lastcache) GLOBAL_LIST(topic_status_cache) -/** - * World creation - * - * Here is where a round itself is actually begun and setup. - * * db connection setup - * * config loaded from files - * * loads admins - * * Sets up the dynamic menu system - * * and most importantly, calls initialize on the master subsystem, starting the game loop that causes the rest of the game to begin processing and setting up - * - * - * Nothing happens until something moves. ~Albert Einstein - * - * For clarity, this proc gets triggered later in the initialization pipeline, it is not the first thing to happen, as it might seem. - * - * Initialization Pipeline: - * Global vars are new()'ed, (including config, glob, and the master controller will also new and preinit all subsystems when it gets new()ed) - * Compiled in maps are loaded (mainly centcom). all areas/turfs/objs/mobs(ATOMs) in these maps will be new()ed - * world/New() (You are here) - * Once world/New() returns, client's can connect. - * 1 second sleep - * Master Controller initialization. - * Subsystem initialization. - * Non-compiled-in maps are maploaded, all atoms are new()ed - * All atoms in both compiled and uncompiled maps are initialized() - */ +//This happens after the Master subsystem new(s) (it's a global datum) +//So subsystems globals exist, but are not initialised + /world/New() - if (fexists(EXTOOLS)) - call(EXTOOLS, "maptick_initialize")() -#ifdef EXTOOLS_LOGGING - call(EXTOOLS, "init_logging")() - else - CRASH("[EXTOOLS] does not exist!") -#endif - enable_debugger() + var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") + if (debug_server) + call(debug_server, "auxtools_init")() + enable_debugging() + AUXTOOLS_CHECK(AUXMOS) #ifdef REFERENCE_TRACKING enable_reference_tracking() #endif - world.Profile(PROFILE_START) + log_world("World loaded at [TIME_STAMP("hh:mm:ss", FALSE)]!") GLOB.config_error_log = GLOB.world_manifest_log = GLOB.world_pda_log = GLOB.world_job_debug_log = GLOB.sql_error_log = GLOB.world_href_log = GLOB.world_runtime_log = GLOB.world_attack_log = GLOB.world_game_log = "data/logs/config_error.[GUID()].log" //temporary file used to record errors with loading config, moved to log directory once logging is set bl @@ -298,10 +272,15 @@ GLOBAL_LIST(topic_status_cache) log_world("World rebooted at [TIME_STAMP("hh:mm:ss", FALSE)]") shutdown_logging() // Past this point, no logging procs can be used, at risk of data loss. + AUXTOOLS_SHUTDOWN(AUXMOS) ..() /world/Del() shutdown_logging() // makes sure the thread is closed before end, else we terminate + AUXTOOLS_SHUTDOWN(AUXMOS) + var/debug_server = world.GetConfig("env", "AUXTOOLS_DEBUG_DLL") + if (debug_server) + call(debug_server, "auxtools_shutdown")() ..() /world/proc/update_status() @@ -378,7 +357,7 @@ GLOBAL_LIST(topic_status_cache) SSidlenpcpool.MaxZChanged() world.refresh_atmos_grid() -/// Extools atmos +/// Auxtools atmos /world/proc/refresh_atmos_grid() /world/proc/change_fps(new_value = 20) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 89fd7036a2..22bbf03014 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -194,6 +194,7 @@ GLOBAL_PROTECT(admin_verbs_debug) // /client/proc/check_missing_sprites, // #endif /datum/admins/proc/create_or_modify_area, + /datum/admins/proc/fixcorruption, #ifdef REFERENCE_TRACKING /datum/admins/proc/view_refs, /datum/admins/proc/view_del_failures, diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index a123d73e62..138913b3a4 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -581,7 +581,7 @@ if(Rad.anchored) if(!Rad.loaded_tank) var/obj/item/tank/internals/plasma/Plasma = new/obj/item/tank/internals/plasma(Rad) - Plasma.air_contents.set_moles(/datum/gas/plasma,70) + Plasma.air_contents.set_moles(GAS_PLASMA,70) Rad.drainratio = 0 Rad.loaded_tank = Plasma Plasma.forceMove(Rad) diff --git a/code/modules/admin/verbs/diagnostics.dm b/code/modules/admin/verbs/diagnostics.dm index 358e7f1bec..8defd78a06 100644 --- a/code/modules/admin/verbs/diagnostics.dm +++ b/code/modules/admin/verbs/diagnostics.dm @@ -10,7 +10,7 @@ for(var/id in env.get_gases()) var/moles = env.get_moles(id) if (moles >= 0.00001) - lines += "[GLOB.meta_gas_names[id]]: [moles] mol" + lines += "[GLOB.gas_data.names[id]]: [moles] mol" to_chat(usr, lines.Join("\n")) /client/proc/air_status(turf/target) diff --git a/code/modules/admin/view_variables/reference_tracking.dm b/code/modules/admin/view_variables/reference_tracking.dm index c293500298..279654eec1 100644 --- a/code/modules/admin/view_variables/reference_tracking.dm +++ b/code/modules/admin/view_variables/reference_tracking.dm @@ -4,7 +4,7 @@ GLOBAL_LIST_EMPTY(deletion_failures) /world/proc/enable_reference_tracking() if (fexists(EXTOOLS)) - call(EXTOOLS, "ref_tracking_initialize")() + //call(EXTOOLS, "ref_tracking_initialize")() /proc/get_back_references(datum/D) CRASH("/proc/get_back_references not hooked by extools, reference tracking will not function!") diff --git a/code/modules/antagonists/_common/antag_datum.dm b/code/modules/antagonists/_common/antag_datum.dm index b92b659183..4082a48e71 100644 --- a/code/modules/antagonists/_common/antag_datum.dm +++ b/code/modules/antagonists/_common/antag_datum.dm @@ -96,6 +96,7 @@ GLOBAL_LIST_EMPTY(antagonists) //Proc called when the datum is given to a mind. /datum/antagonist/proc/on_gain() + set waitfor = FALSE if(!(owner?.current)) return if(!silent) diff --git a/code/modules/antagonists/abductor/equipment/gland.dm b/code/modules/antagonists/abductor/equipment/gland.dm index aed096e9df..d0002d1f4a 100644 --- a/code/modules/antagonists/abductor/equipment/gland.dm +++ b/code/modules/antagonists/abductor/equipment/gland.dm @@ -61,7 +61,7 @@ active_mind_control = TRUE message_admins("[key_name(user)] sent an abductor mind control message to [key_name(owner)]: [command]") update_gland_hud() - var/obj/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = owner.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command addtimer(CALLBACK(src, .proc/clear_mind_control), mind_control_duration) return TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/heal.dm b/code/modules/antagonists/abductor/equipment/glands/heal.dm index 5ea8f77d6c..8917e1661e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/heal.dm +++ b/code/modules/antagonists/abductor/equipment/glands/heal.dm @@ -144,7 +144,7 @@ owner.Stun(15) owner.adjustToxLoss(-15, TRUE, TRUE) - owner.blood_volume = min(BLOOD_VOLUME_NORMAL, owner.blood_volume + 20) + owner.adjust_integration_blood(20) if(owner.blood_volume < BLOOD_VOLUME_NORMAL) keep_going = TRUE diff --git a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm index fa63e2c82a..cb3bb50b1e 100644 --- a/code/modules/antagonists/abductor/equipment/glands/mindshock.dm +++ b/code/modules/antagonists/abductor/equipment/glands/mindshock.dm @@ -43,7 +43,7 @@ message_admins("[key_name(user)] broadcasted an abductor mind control message from [key_name(owner)] to [key_name(H)]: [command]") - var/obj/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = H.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command if(LAZYLEN(broadcasted_mobs)) diff --git a/code/modules/antagonists/abductor/equipment/glands/quantum.dm b/code/modules/antagonists/abductor/equipment/glands/quantum.dm index fc1ddae030..eade62b1bb 100644 --- a/code/modules/antagonists/abductor/equipment/glands/quantum.dm +++ b/code/modules/antagonists/abductor/equipment/glands/quantum.dm @@ -35,7 +35,7 @@ if(entangled_mob && ishuman(entangled_mob) && (entangled_mob.stat < DEAD)) to_chat(entangled_mob, "You suddenly feel an irresistible compulsion to follow an order...") to_chat(entangled_mob, "[command]") - var/obj/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /obj/screen/alert/mind_control) + var/atom/movable/screen/alert/mind_control/mind_alert = entangled_mob.throw_alert("mind_control", /atom/movable/screen/alert/mind_control) mind_alert.command = command message_admins("[key_name(owner)] mirrored an abductor mind control message to [key_name(entangled_mob)]: [command]") update_gland_hud() diff --git a/code/modules/antagonists/blob/blob/blobs/factory.dm b/code/modules/antagonists/blob/blob/blobs/factory.dm index 284a43562e..dfb3c6d71b 100644 --- a/code/modules/antagonists/blob/blob/blobs/factory.dm +++ b/code/modules/antagonists/blob/blob/blobs/factory.dm @@ -26,7 +26,7 @@ if(naut) naut.factory = null to_chat(naut, "Your factory was destroyed! You feel yourself dying!") - naut.throw_alert("nofactory", /obj/screen/alert/nofactory) + naut.throw_alert("nofactory", /atom/movable/screen/alert/nofactory) spores = null return ..() diff --git a/code/modules/antagonists/blob/blob/theblob.dm b/code/modules/antagonists/blob/blob/theblob.dm index b61374f754..a95f73f90d 100644 --- a/code/modules/antagonists/blob/blob/theblob.dm +++ b/code/modules/antagonists/blob/blob/theblob.dm @@ -64,7 +64,7 @@ result++ . -= result - 1 -/obj/structure/blob/BlockSuperconductivity() +/obj/structure/blob/BlockThermalConductivity() return atmosblock /obj/structure/blob/CanPass(atom/movable/mover, turf/target) diff --git a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm index 3e358cd795..29e64a4913 100644 --- a/code/modules/antagonists/bloodsucker/bloodsucker_life.dm +++ b/code/modules/antagonists/bloodsucker/bloodsucker_life.dm @@ -89,6 +89,7 @@ owner.current.adjustStaminaLoss(-1.5 + (actual_regen * -7) * mult, 0) // Humans lose stamina damage really quickly. Vamps should heal more. owner.current.adjustCloneLoss(-0.1 * (actual_regen * 2) * mult, 0) owner.current.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1 * (actual_regen * 4) * mult) + owner.current.integrating_blood = 0 // No Bleeding /*if(ishuman(owner.current)) //NOTE Current bleeding is horrible, not to count the amount of blood ballistics delete. var/mob/living/carbon/human/H = owner.current diff --git a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm index 5af2a49b1b..07c92bfd97 100644 --- a/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm +++ b/code/modules/antagonists/bloodsucker/datum_bloodsucker.dm @@ -670,9 +670,9 @@ #define ui_vamprank_display "WEST:6,CENTER-2:-5" // 2 tiles down /datum/hud - var/obj/screen/bloodsucker/blood_counter/blood_display - var/obj/screen/bloodsucker/rank_counter/vamprank_display - var/obj/screen/bloodsucker/sunlight_counter/sunlight_display + var/atom/movable/screen/bloodsucker/blood_counter/blood_display + var/atom/movable/screen/bloodsucker/rank_counter/vamprank_display + var/atom/movable/screen/bloodsucker/sunlight_counter/sunlight_display /datum/antagonist/bloodsucker/proc/add_hud() return @@ -708,36 +708,36 @@ owner.current.hud_used.vamprank_display.icon_state = (bloodsucker_level_unspent > 0) ? "rank_up" : "rank" -/obj/screen/bloodsucker +/atom/movable/screen/bloodsucker invisibility = INVISIBILITY_ABSTRACT -/obj/screen/bloodsucker/proc/clear() +/atom/movable/screen/bloodsucker/proc/clear() invisibility = INVISIBILITY_ABSTRACT -/obj/screen/bloodsucker/proc/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/proc/update_counter(value, valuecolor) invisibility = 0 -/obj/screen/bloodsucker/blood_counter +/atom/movable/screen/bloodsucker/blood_counter icon = 'icons/mob/actions/bloodsucker.dmi' name = "Blood Consumed" icon_state = "blood_display" screen_loc = ui_blood_display -/obj/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/blood_counter/update_counter(value, valuecolor) ..() maptext = "
[round(value,1)]
" -/obj/screen/bloodsucker/rank_counter +/atom/movable/screen/bloodsucker/rank_counter name = "Bloodsucker Rank" icon = 'icons/mob/actions/bloodsucker.dmi' icon_state = "rank" screen_loc = ui_vamprank_display -/obj/screen/bloodsucker/rank_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/rank_counter/update_counter(value, valuecolor) ..() maptext = "
[round(value,1)]
" -/obj/screen/bloodsucker/sunlight_counter +/atom/movable/screen/bloodsucker/sunlight_counter icon = 'icons/mob/actions/bloodsucker.dmi' name = "Solar Flare Timer" icon_state = "sunlight_night" @@ -761,7 +761,7 @@ owner.current.hud_used.sunlight_display.icon_state = "sunlight_" + (amDay ? "day":"night") -/obj/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) +/atom/movable/screen/bloodsucker/sunlight_counter/update_counter(value, valuecolor) ..() maptext = "
[value]
" diff --git a/code/modules/antagonists/bloodsucker/datum_hunter.dm b/code/modules/antagonists/bloodsucker/datum_hunter.dm index c0933d8a3c..b221a83a60 100644 --- a/code/modules/antagonists/bloodsucker/datum_hunter.dm +++ b/code/modules/antagonists/bloodsucker/datum_hunter.dm @@ -109,13 +109,13 @@ /datum/status_effect/agent_pinpointer/hunter_edition - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/hunter_edition + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/hunter_edition minimum_range = HUNTER_SCAN_MIN_DISTANCE tick_interval = HUNTER_SCAN_PING_TIME duration = 160 // Lasts 10s range_fuzz_factor = 5//PINPOINTER_EXTRA_RANDOM_RANGE -/obj/screen/alert/status_effect/agent_pinpointer/hunter_edition +/atom/movable/screen/alert/status_effect/agent_pinpointer/hunter_edition name = "Monster Tracking" desc = "You always know where the hellspawn are." diff --git a/code/modules/antagonists/bloodsucker/datum_vassal.dm b/code/modules/antagonists/bloodsucker/datum_vassal.dm index 91e89e71e6..5162897d60 100644 --- a/code/modules/antagonists/bloodsucker/datum_vassal.dm +++ b/code/modules/antagonists/bloodsucker/datum_vassal.dm @@ -110,13 +110,13 @@ /datum/status_effect/agent_pinpointer/vassal_edition id = "agent_pinpointer" - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/vassal_edition + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/vassal_edition minimum_range = VASSAL_SCAN_MIN_DISTANCE tick_interval = VASSAL_SCAN_PING_TIME duration = -1 // runs out fast range_fuzz_factor = 0 -/obj/screen/alert/status_effect/agent_pinpointer/vassal_edition +/atom/movable/screen/alert/status_effect/agent_pinpointer/vassal_edition name = "Blood Bond" desc = "You always know where your master is." //icon = 'icons/obj/device.dmi' diff --git a/code/modules/antagonists/changeling/changeling.dm b/code/modules/antagonists/changeling/changeling.dm index 843e5c6db2..8e6b5c9060 100644 --- a/code/modules/antagonists/changeling/changeling.dm +++ b/code/modules/antagonists/changeling/changeling.dm @@ -297,8 +297,14 @@ prof.socks = H.socks prof.socks_color = H.socks_color - var/list/slots = list("head", "wear_mask", "back", "wear_suit", "w_uniform", "shoes", "belt", "gloves", "glasses", "ears", "wear_id", "s_store") - for(var/slot in slots) + var/datum/icon_snapshot/entry = new + entry.name = H.name + entry.icon = H.icon + entry.icon_state = H.icon_state + entry.overlays = H.get_overlays_copy(list(HANDS_LAYER, HANDCUFF_LAYER, LEGCUFF_LAYER)) + prof.profile_snapshot = entry + + for(var/slot in GLOB.slots) if(slot in H.vars) var/obj/item/I = H.vars[slot] if(!I) @@ -518,6 +524,9 @@ var/socks var/socks_color + /// Icon snapshot of the profile + var/datum/icon_snapshot/profile_snapshot + /datum/changelingprofile/Destroy() qdel(dna) . = ..() @@ -535,13 +544,14 @@ newprofile.underwear = underwear newprofile.undershirt = undershirt newprofile.socks = socks - + newprofile.profile_snapshot = profile_snapshot /datum/antagonist/changeling/xenobio name = "Xenobio Changeling" give_objectives = FALSE show_in_roundend = FALSE //These are here for admin tracking purposes only you_are_greet = FALSE + antag_moodlet = FALSE /datum/antagonist/changeling/roundend_report() var/list/parts = list() diff --git a/code/modules/antagonists/changeling/powers/adrenaline.dm b/code/modules/antagonists/changeling/powers/adrenaline.dm index 32171a036a..643458d05a 100644 --- a/code/modules/antagonists/changeling/powers/adrenaline.dm +++ b/code/modules/antagonists/changeling/powers/adrenaline.dm @@ -13,5 +13,5 @@ //Recover from stuns. /obj/effect/proc_holder/changeling/adrenaline/sting_action(mob/living/user) - user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/drug/methamphetamine/changeling = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) + user.do_adrenaline(0, FALSE, 70, 0, TRUE, list(/datum/reagent/medicine/epinephrine = 3, /datum/reagent/medicine/changelinghaste = 10, /datum/reagent/medicine/changelingadrenaline = 5), "Energy rushes through us.", 0, 0.75, 0) return TRUE diff --git a/code/modules/antagonists/changeling/powers/humanform.dm b/code/modules/antagonists/changeling/powers/humanform.dm index c38bfe3b5b..c9edc12eeb 100644 --- a/code/modules/antagonists/changeling/powers/humanform.dm +++ b/code/modules/antagonists/changeling/powers/humanform.dm @@ -10,15 +10,8 @@ //Transform into a human. /obj/effect/proc_holder/changeling/humanform/sting_action(mob/living/carbon/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/list/names = list() - for(var/datum/changelingprofile/prof in changeling.stored_profiles) - names += "[prof.name]" - var/chosen_name = input("Select the target DNA: ", "Target DNA", null) as null|anything in names - if(!chosen_name) - return - - var/datum/changelingprofile/chosen_prof = changeling.get_dna(chosen_name) + var/datum/changelingprofile/chosen_prof = changeling.select_dna() if(!chosen_prof) return if(!user || user.mob_transforming) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index 3857d1206c..f4b74c5567 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -466,7 +466,7 @@ block_return[BLOCK_RETURN_BLOCK_CAPACITY] = (block_return[BLOCK_RETURN_BLOCK_CAPACITY] || 0) + remaining_uses return ..() -/obj/item/shield/changeling/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) +/obj/item/shield/changeling/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) . = ..() if(--remaining_uses < 1) if(ishuman(loc)) diff --git a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm index 3d54c19350..3bda7335a1 100644 --- a/code/modules/antagonists/changeling/powers/pheromone_receptors.dm +++ b/code/modules/antagonists/changeling/powers/pheromone_receptors.dm @@ -30,7 +30,7 @@ //Modified IA pinpointer - Points to the NEAREST changeling, but will only get you within a few tiles of the target. //You'll still have to rely on intuition and observation to make the identification. Lings can 'hide' in public places. /datum/status_effect/agent_pinpointer/changeling - alert_type = /obj/screen/alert/status_effect/agent_pinpointer/changeling + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer/changeling minimum_range = CHANGELING_PHEROMONE_MIN_DISTANCE tick_interval = CHANGELING_PHEROMONE_PING_TIME range_fuzz_factor = 0 @@ -55,6 +55,6 @@ scan_target = null -/obj/screen/alert/status_effect/agent_pinpointer/changeling +/atom/movable/screen/alert/status_effect/agent_pinpointer/changeling name = "Pheromone Scent" desc = "The nose always knows." diff --git a/code/modules/antagonists/changeling/powers/tiny_prick.dm b/code/modules/antagonists/changeling/powers/tiny_prick.dm index a8fe56aae7..9bda1bf5b9 100644 --- a/code/modules/antagonists/changeling/powers/tiny_prick.dm +++ b/code/modules/antagonists/changeling/powers/tiny_prick.dm @@ -78,7 +78,7 @@ if(changeling.chosen_sting) unset_sting(user) return - selected_dna = changeling.select_dna("Select the target DNA: ", "Target DNA") + selected_dna = changeling.select_dna() if(!selected_dna) return if(NOTRANSSTING in selected_dna.dna.species.species_traits) diff --git a/code/modules/antagonists/changeling/powers/transform.dm b/code/modules/antagonists/changeling/powers/transform.dm index 8e3a36740b..cfd42f05cf 100644 --- a/code/modules/antagonists/changeling/powers/transform.dm +++ b/code/modules/antagonists/changeling/powers/transform.dm @@ -134,7 +134,7 @@ //Change our DNA to that of somebody we've absorbed. /obj/effect/proc_holder/changeling/transform/sting_action(mob/living/carbon/human/user) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling) - var/datum/changelingprofile/chosen_prof = changeling.select_dna("Select the target DNA: ", "Target DNA") + var/datum/changelingprofile/chosen_prof = changeling.select_dna() if(!chosen_prof) return @@ -142,15 +142,21 @@ changeling_transform(user, chosen_prof) return TRUE -/datum/antagonist/changeling/proc/select_dna(var/prompt, var/title) +/** + * Gives a changeling a list of all possible dnas in their profiles to choose from and returns profile containing their chosen dna + */ +/datum/antagonist/changeling/proc/select_dna() var/mob/living/carbon/user = owner.current if(!istype(user)) return - var/list/names = list("Drop Flesh Disguise") - for(var/datum/changelingprofile/prof in stored_profiles) - names += "[prof.name]" + var/list/disguises = list("Drop Flesh Disguise" = image(icon = 'icons/mob/radial.dmi', icon_state = "radial_drop")) + for(var/datum/changelingprofile/current_profile in stored_profiles) + var/datum/icon_snapshot/snap = current_profile.profile_snapshot + var/image/disguise_image = image(icon = snap.icon, icon_state = snap.icon_state) + disguise_image.overlays = snap.overlays + disguises[current_profile.name] = disguise_image - var/chosen_name = input(prompt, title, null) as null|anything in names + var/chosen_name = show_radial_menu(user, user, disguises, custom_check = CALLBACK(src, .proc/check_menu, user), radius = 40, require_near = TRUE, tooltips = TRUE) if(!chosen_name) return @@ -158,6 +164,21 @@ for(var/slot in GLOB.slots) if(istype(user.vars[slot], GLOB.slot2type[slot])) qdel(user.vars[slot]) + return var/datum/changelingprofile/prof = get_dna(chosen_name) return prof + +/** + * Checks if we are allowed to interact with a radial menu + * + * Arguments: + * * user The carbon mob interacting with the menu + */ +/datum/antagonist/changeling/proc/check_menu(mob/living/carbon/user) + if(!istype(user)) + return FALSE + var/datum/antagonist/changeling/changeling_datum = user.mind.has_antag_datum(/datum/antagonist/changeling) + if(!changeling_datum) + return FALSE + return TRUE diff --git a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm index 1da49efe3c..3609037f58 100644 --- a/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm +++ b/code/modules/antagonists/clockcult/clock_effects/city_of_cogs_rift.dm @@ -69,7 +69,7 @@ do_sparks(5, TRUE, AM) if(isliving(AM)) var/mob/living/L = AM - L.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + L.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) L.clear_fullscreen("flash", 5) var/obj/item/transfer_valve/TTV = locate() in L.GetAllContents() if(TTV) diff --git a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm index 34370faa0a..4b88d203d6 100644 --- a/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm +++ b/code/modules/antagonists/clockcult/clock_effects/clock_sigils.dm @@ -225,18 +225,22 @@ return ..() /obj/effect/clockwork/sigil/transmission/process() - var/power_drained = 0 - var/power_mod = 0.005 - for(var/t in spiral_range_turfs(SIGIL_ACCESS_RANGE, src)) - var/turf/T = t - for(var/M in T) - var/atom/movable/A = M - power_drained += A.power_drain(TRUE) + do_process() - CHECK_TICK +/obj/effect/clockwork/sigil/transmission/proc/do_process() + set waitfor = FALSE + var/power_drained = 0 + var/power_mod = 0.005 + for(var/t in spiral_range_turfs(SIGIL_ACCESS_RANGE, src)) + var/turf/T = t + for(var/M in T) + var/atom/movable/A = M + power_drained += A.power_drain(TRUE) - adjust_clockwork_power(power_drained * power_mod * 15) - new /obj/effect/temp_visual/ratvar/sigil/transmission(loc, 1 + (power_drained * 0.0035)) + CHECK_TICK + + adjust_clockwork_power(power_drained * power_mod * 15) + new /obj/effect/temp_visual/ratvar/sigil/transmission(loc, 1 + (power_drained * 0.0035)) /obj/effect/clockwork/sigil/transmission/proc/charge_cyborg(mob/living/silicon/robot/cyborg) if(!cyborg_checks(cyborg)) diff --git a/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm b/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm index 12b2af3f64..ce6e315cd8 100644 --- a/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm +++ b/code/modules/antagonists/clockcult/clock_effects/servant_blocker.dm @@ -29,7 +29,7 @@ return return TRUE -/obj/effect/clockwork/servant_blocker/BlockSuperconductivity() +/obj/effect/clockwork/servant_blocker/BlockThermalConductivity() return TRUE /obj/effect/clockwork/servant_blocker/singularity_act() diff --git a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm index aa69478217..b702b19566 100644 --- a/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm +++ b/code/modules/antagonists/clockcult/clock_items/clock_weapons/ratvarian_spear.dm @@ -90,7 +90,6 @@ parry_time_perfect = 2 parry_efficiency_perfect = 110 //Very low leeway for counterattacks... parry_efficiency_considered_successful = 0.8 - parry_efficiency_to_counterattack = 1 + parry_efficiency_to_counterattack = 110 parry_cooldown = 15 //But also very low cooldown.. parry_failed_stagger_duration = 2 SECONDS //And relatively small penalties for failing. - parry_failed_clickcd_duration = 1 SECONDS diff --git a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm index 2a916c7a2f..5e25b8de82 100644 --- a/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm +++ b/code/modules/antagonists/clockcult/clock_items/wraith_spectacles.dm @@ -97,18 +97,18 @@ id = "wraith_spectacles" duration = -1 //remains until eye damage done reaches 0 while the glasses are not worn tick_interval = 20 - alert_type = /obj/screen/alert/status_effect/wraith_spectacles + alert_type = /atom/movable/screen/alert/status_effect/wraith_spectacles var/eye_damage_done = 0 var/nearsight_breakpoint = 30 var/blind_breakpoint = 45 -/obj/screen/alert/status_effect/wraith_spectacles +/atom/movable/screen/alert/status_effect/wraith_spectacles name = "Wraith Spectacles" desc = "You shouldn't actually see this, as it should be procedurally generated." icon_state = "wraithspecs" alerttooltipstyle = "clockcult" -/obj/screen/alert/status_effect/wraith_spectacles/MouseEntered(location,control,params) +/atom/movable/screen/alert/status_effect/wraith_spectacles/MouseEntered(location,control,params) var/mob/living/carbon/human/L = usr if(istype(L)) //this is probably more safety than actually needed var/datum/status_effect/wraith_spectacles/W = attached_effect diff --git a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm index 025306dae4..973b615f4a 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -141,7 +141,7 @@ if(isliving(M.current) && M.current.stat != DEAD) var/turf/t_turf = isAI(M.current) ? get_step(get_step(src, NORTH),NORTH) : get_turf(src) // AI too fat, must make sure it always ends up a 2 tiles north instead of on the ark. do_teleport(M.current, t_turf, channel = TELEPORT_CHANNEL_CULT, forced = TRUE) - M.current.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + M.current.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) M.current.clear_fullscreen("flash", 5) playsound(src, 'sound/magic/clockwork/invoke_general.ogg', 50, FALSE) recalls_remaining-- @@ -181,9 +181,15 @@ make_glow() glow.icon_state = "clockwork_gateway_disrupted" resistance_flags |= INDESTRUCTIBLE - sleep(27) - explosion(src, 1, 3, 8, 8) - sound_to_playing_players('sound/effects/explosion_distant.ogg', volume = 50) + addtimer(CALLBACK(src, .proc/go_boom), 2.7 SECONDS) + return + qdel(src) + +/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/go_boom() + if(QDELETED(src)) + return + explosion(src, 1, 3, 8, 8) + sound_to_playing_players('sound/effects/explosion_distant.ogg', volume = 50) qdel(src) /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/make_glow() @@ -240,6 +246,36 @@ if(GATEWAY_RATVAR_COMING to INFINITY) . += "The anomaly is stable! Something is coming through!" +/obj/structure/destructible/clockwork/massive/celestial_gateway/proc/fulfill_purpose() + set waitfor = FALSE + countdown.stop() + resistance_flags |= INDESTRUCTIBLE + purpose_fulfilled = TRUE + make_glow() + animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125) + sound_to_playing_players(volume = 100, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/ratvar_rises.ogg')) //End the sounds + sleep(125) + make_glow() + animate(glow, transform = matrix() * 3, alpha = 0, time = 5) + QDEL_IN(src, 3) + sleep(3) + GLOB.clockwork_gateway_activated = TRUE + var/turf/T = SSmapping.get_station_center() + new /obj/structure/destructible/clockwork/massive/ratvar(T) + var/x0 = T.x + var/y0 = T.y + for(var/I in spiral_range_turfs(255, T, tick_checked = TRUE)) + var/turf/T2 = I + if(!T2) + continue + var/dist = cheap_hypotenuse(T2.x, T2.y, x0, y0) + if(dist < 100) + dist = TRUE + else + dist = FALSE + T.ratvar_act(dist) + CHECK_TICK + /obj/structure/destructible/clockwork/massive/celestial_gateway/process() adjust_clockwork_power(2.5) //Provides weak power generation on its own if(seconds_until_activation) @@ -275,7 +311,7 @@ var/turf/T = get_turf(M) if(is_servant_of_ratvar(M) && (!T || T.z != z)) M.forceMove(get_step(src, SOUTH)) - M.overlay_fullscreen("flash", /obj/screen/fullscreen/flash) + M.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash) M.clear_fullscreen("flash", 5) progress_in_seconds += GATEWAY_SUMMON_RATE switch(progress_in_seconds) @@ -300,33 +336,7 @@ glow.icon_state = "clockwork_gateway_closing" if(GATEWAY_RATVAR_ARRIVAL to INFINITY) if(!purpose_fulfilled) - countdown.stop() - resistance_flags |= INDESTRUCTIBLE - purpose_fulfilled = TRUE - make_glow() - animate(glow, transform = matrix() * 1.5, alpha = 255, time = 125) - sound_to_playing_players(volume = 100, channel = CHANNEL_JUSTICAR_ARK, S = sound('sound/effects/ratvar_rises.ogg')) //End the sounds - sleep(125) - make_glow() - animate(glow, transform = matrix() * 3, alpha = 0, time = 5) - QDEL_IN(src, 3) - sleep(3) - GLOB.clockwork_gateway_activated = TRUE - var/turf/T = SSmapping.get_station_center() - new /obj/structure/destructible/clockwork/massive/ratvar(T) - var/x0 = T.x - var/y0 = T.y - for(var/I in spiral_range_turfs(255, T, tick_checked = TRUE)) - var/turf/T2 = I - if(!T2) - continue - var/dist = cheap_hypotenuse(T2.x, T2.y, x0, y0) - if(dist < 100) - dist = TRUE - else - dist = FALSE - T.ratvar_act(dist) - CHECK_TICK + fulfill_purpose() //Converts nearby turfs into their clockwork equivalent, with ever-increasing range the closer the ark is to summoning Ratvar /obj/structure/destructible/clockwork/massive/celestial_gateway/proc/conversion_pulse() diff --git a/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm index 73488d736a..ededd0174c 100644 --- a/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm +++ b/code/modules/antagonists/clockcult/clock_structures/prolonging_prism.dm @@ -60,12 +60,8 @@ delay_remaining += PRISM_DELAY_DURATION toggle(0, user) -/obj/structure/destructible/clockwork/powered/prolonging_prism/process() - var/turf/own_turf = get_turf(src) - if(SSshuttle.emergency.mode != SHUTTLE_CALL || delay_remaining <= 0 || !own_turf || !is_station_level(own_turf.z)) - forced_disable(FALSE) - return - . = ..() +/obj/structure/destructible/clockwork/powered/prolonging_prism/proc/do_process() + set waitfor = FALSE var/delay_amount = 40 delay_remaining -= delay_amount var/efficiency = get_efficiency_mod() @@ -114,6 +110,14 @@ new /obj/effect/temp_visual/ratvar/prolonging_prism(T) CHECK_TICK //we may be going over a hell of a lot of turfs +/obj/structure/destructible/clockwork/powered/prolonging_prism/process() + var/turf/own_turf = get_turf(src) + if(SSshuttle.emergency.mode != SHUTTLE_CALL || delay_remaining <= 0 || !own_turf || !is_station_level(own_turf.z)) + forced_disable(FALSE) + return + . = ..() + do_process() + /obj/structure/destructible/clockwork/powered/prolonging_prism/proc/get_delay_cost() return FLOOR(delay_cost, MIN_CLOCKCULT_POWER) diff --git a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm index 24ad1af88a..51f8dc7101 100644 --- a/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm +++ b/code/modules/antagonists/clockcult/clock_structures/ratvar_the_clockwork_justicar.dm @@ -110,6 +110,7 @@ //Put me in Reebe, will you? Ratvar has found and is going to do a hecking murder on Nar'Sie /obj/structure/destructible/clockwork/massive/ratvar/proc/clash_of_the_titans(obj/singularity/narsie/narsie) + set waitfor = FALSE var/winner = "Undeclared" var/base_victory_chance = 1 while(src && narsie) diff --git a/code/modules/antagonists/clockcult/clockcult.dm b/code/modules/antagonists/clockcult/clockcult.dm index 6f91299cdb..8bf26d6397 100644 --- a/code/modules/antagonists/clockcult/clockcult.dm +++ b/code/modules/antagonists/clockcult/clockcult.dm @@ -136,7 +136,7 @@ hierophant_network.span_for_name = "nezbere" hierophant_network.span_for_message = "brass" hierophant_network.Grant(current) - current.throw_alert("clockinfo", /obj/screen/alert/clockwork/infodump) + current.throw_alert("clockinfo", /atom/movable/screen/alert/clockwork/infodump) var/obj/structure/destructible/clockwork/massive/celestial_gateway/G = GLOB.ark_of_the_clockwork_justiciar if(G && G.active && ishuman(current)) current.add_overlay(mutable_appearance('icons/effects/genetics.dmi', "servitude", -ANTAG_LAYER)) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index 568f01ab83..9bd1030685 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -687,10 +687,10 @@ if(H.stat == DEAD) to_chat(user,"Only a revive rune can bring back the dead!") return - if(H.blood_volume < (BLOOD_VOLUME_SAFE*H.blood_ratio)) + if(H.functional_blood() < (BLOOD_VOLUME_SAFE*H.blood_ratio)) var/restore_blood = (BLOOD_VOLUME_SAFE*H.blood_ratio) - H.blood_volume - if(uses*2 < restore_blood) - H.blood_volume += uses*2 + if(uses * 2 < restore_blood) + H.adjust_integration_blood(uses * 2) to_chat(user,"You use the last of your blood rites to restore what blood you could!") uses = 0 return ..() diff --git a/code/modules/antagonists/cult/cult.dm b/code/modules/antagonists/cult/cult.dm index 0cc0ed133e..a18523069e 100644 --- a/code/modules/antagonists/cult/cult.dm +++ b/code/modules/antagonists/cult/cult.dm @@ -124,7 +124,7 @@ communion.Grant(current) if(ishuman(current)) magic.Grant(current) - current.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + current.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(cult_team?.cult_risen) cult_team.rise(current) if(cult_team.cult_ascendent) diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index 25fd446b06..a2f283ec67 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -204,26 +204,31 @@ STOP_PROCESSING(SSfastprocess, src) return ..() +/obj/structure/destructible/cult/pylon/proc/heal_friends() + set waitfor = FALSE + for(var/mob/living/L in range(5, src)) + if(iscultist(L) || isshade(L) || isconstruct(L)) + if(L.health != L.maxHealth) + new /obj/effect/temp_visual/heal(get_turf(src), "#960000") + if(ishuman(L)) + L.adjustBruteLoss(-1, 0, only_organic = FALSE) + L.adjustFireLoss(-1, 0, only_organic = FALSE) + L.updatehealth() + if(isshade(L) || isconstruct(L)) + var/mob/living/simple_animal/M = L + if(M.health < M.maxHealth) + M.adjustHealth(-3) + if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio)) + L.adjust_integration_blood(1.0) + CHECK_TICK + + /obj/structure/destructible/cult/pylon/process() if(!anchored) return if(last_heal <= world.time) last_heal = world.time + heal_delay - for(var/mob/living/L in range(5, src)) - if(iscultist(L) || isshade(L) || isconstruct(L)) - if(L.health != L.maxHealth) - new /obj/effect/temp_visual/heal(get_turf(src), "#960000") - if(ishuman(L)) - L.adjustBruteLoss(-1, 0, only_organic = FALSE) - L.adjustFireLoss(-1, 0, only_organic = FALSE) - L.updatehealth() - if(isshade(L) || isconstruct(L)) - var/mob/living/simple_animal/M = L - if(M.health < M.maxHealth) - M.adjustHealth(-3) - if(ishuman(L) && L.blood_volume < (BLOOD_VOLUME_NORMAL * L.blood_ratio)) - L.blood_volume += 1.0 - CHECK_TICK + heal_friends() if(last_corrupt <= world.time) var/list/validturfs = list() var/list/cultturfs = list() diff --git a/code/modules/antagonists/cult/runes.dm b/code/modules/antagonists/cult/runes.dm index 276729b359..7981a10701 100644 --- a/code/modules/antagonists/cult/runes.dm +++ b/code/modules/antagonists/cult/runes.dm @@ -647,7 +647,7 @@ structure_check() searches for nearby cultist structures required for the invoca GLOB.wall_runes -= src return ..() -/obj/effect/rune/wall/BlockSuperconductivity() +/obj/effect/rune/wall/BlockThermalConductivity() return density /obj/effect/rune/wall/invoke(var/list/invokers) diff --git a/code/modules/antagonists/devil/devil.dm b/code/modules/antagonists/devil/devil.dm index 3b6dc68986..65ce89d33f 100644 --- a/code/modules/antagonists/devil/devil.dm +++ b/code/modules/antagonists/devil/devil.dm @@ -515,7 +515,6 @@ GLOBAL_LIST_INIT(devil_suffix, list(" the Red", " the Soulless", " the Master", var/mob/living/silicon/robot_devil = owner.current var/laws = list("You may not use violence to coerce someone into selling their soul.", "You may not directly and knowingly physically harm a devil, other than yourself.", GLOB.lawlorify[LAW][ban], GLOB.lawlorify[LAW][obligation], "Accomplish your objectives at all costs.") robot_devil.set_law_sixsixsix(laws) - sleep(10) if(owner.assigned_role == "Clown" && ishuman(owner.current)) var/mob/living/carbon/human/S = owner.current to_chat(S, "Your infernal nature has allowed you to overcome your clownishness.") diff --git a/code/modules/antagonists/devil/true_devil/_true_devil.dm b/code/modules/antagonists/devil/true_devil/_true_devil.dm index 069080170e..ac1e5630da 100644 --- a/code/modules/antagonists/devil/true_devil/_true_devil.dm +++ b/code/modules/antagonists/devil/true_devil/_true_devil.dm @@ -104,7 +104,7 @@ /mob/living/carbon/true_devil/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) return 666 -/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/carbon/true_devil/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) if(mind && has_bane(BANE_LIGHT)) mind.disrupt_spells(-500) return ..() //flashes don't stop devils UNLESS it's their bane. diff --git a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm index 4d6576ee92..158acc0071 100644 --- a/code/modules/antagonists/eldritch_cult/eldritch_magic.dm +++ b/code/modules/antagonists/eldritch_cult/eldritch_magic.dm @@ -147,7 +147,7 @@ carbon_target.blood_volume -= 20 if(carbon_user.blood_volume < BLOOD_VOLUME_MAXIMUM) //we dont want to explode after all - carbon_user.blood_volume += 20 + carbon_user.adjust_integration_blood(20) return /obj/effect/proc_holder/spell/pointed/blood_siphon/can_target(atom/target, mob/user, silent) diff --git a/code/modules/antagonists/morph/morph.dm b/code/modules/antagonists/morph/morph.dm index 077c380ef0..8352b8f238 100644 --- a/code/modules/antagonists/morph/morph.dm +++ b/code/modules/antagonists/morph/morph.dm @@ -38,7 +38,7 @@ var/atom/movable/form = null var/morph_time = 0 var/static/list/blacklist_typecache = typecacheof(list( - /obj/screen, + /atom/movable/screen, /obj/singularity, /mob/living/simple_animal/hostile/morph, /obj/effect, diff --git a/code/modules/antagonists/traitor/IAA/internal_affairs.dm b/code/modules/antagonists/traitor/IAA/internal_affairs.dm index ff012e556a..4414fe8257 100644 --- a/code/modules/antagonists/traitor/IAA/internal_affairs.dm +++ b/code/modules/antagonists/traitor/IAA/internal_affairs.dm @@ -42,12 +42,12 @@ id = "agent_pinpointer" duration = -1 tick_interval = PINPOINTER_PING_TIME - alert_type = /obj/screen/alert/status_effect/agent_pinpointer + alert_type = /atom/movable/screen/alert/status_effect/agent_pinpointer var/minimum_range = PINPOINTER_MINIMUM_RANGE var/range_fuzz_factor = PINPOINTER_EXTRA_RANDOM_RANGE var/mob/scan_target = null -/obj/screen/alert/status_effect/agent_pinpointer +/atom/movable/screen/alert/status_effect/agent_pinpointer name = "Internal Affairs Integrated Pinpointer" desc = "Even stealthier than a normal implant." icon = 'icons/obj/device.dmi' diff --git a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm index 0659655da5..fcc8bcade8 100644 --- a/code/modules/antagonists/traitor/equipment/Malf_Modules.dm +++ b/code/modules/antagonists/traitor/equipment/Malf_Modules.dm @@ -401,6 +401,7 @@ GLOBAL_LIST_INIT(blacklisted_malf_machines, typecacheof(list( next_announce += DOOMSDAY_ANNOUNCE_INTERVAL /obj/machinery/doomsday_device/proc/detonate() + set waitfor = FALSE sound_to_playing_players('sound/machines/alarm.ogg') sleep(100) for(var/i in GLOB.mob_living_list) diff --git a/code/modules/antagonists/wizard/equipment/soulstone.dm b/code/modules/antagonists/wizard/equipment/soulstone.dm index c328fa232d..d4d70cd053 100644 --- a/code/modules/antagonists/wizard/equipment/soulstone.dm +++ b/code/modules/antagonists/wizard/equipment/soulstone.dm @@ -224,7 +224,7 @@ if(target.type == /mob/living/simple_animal/hostile/construct/shade) //Make sure we remember which body belonged to the shade var/mob/living/simple_animal/hostile/construct/shade/shade = target newstruct.original_mind = shade.original_mind - var/obj/screen/alert/bloodsense/BS + var/atom/movable/screen/alert/bloodsense/BS if(newstruct.mind && ((stoner && iscultist(stoner)) || cultoverride) && SSticker?.mode) SSticker.mode.add_cultist(newstruct.mind, 0) if(iscultist(stoner) || cultoverride) @@ -232,7 +232,7 @@ else if(stoner) to_chat(newstruct, "You are still bound to serve your creator, [stoner], follow [stoner.p_their()] orders and help [stoner.p_them()] complete [stoner.p_their()] goals at all costs.") newstruct.clear_alert("bloodsense") - BS = newstruct.throw_alert("bloodsense", /obj/screen/alert/bloodsense) + BS = newstruct.throw_alert("bloodsense", /atom/movable/screen/alert/bloodsense) if(BS) BS.Cviewer = newstruct newstruct.cancel_camera() diff --git a/code/modules/arousal/arousal.dm b/code/modules/arousal/arousal.dm index bd8b5dbf7a..36da6c73ba 100644 --- a/code/modules/arousal/arousal.dm +++ b/code/modules/arousal/arousal.dm @@ -197,6 +197,7 @@ //Here's the main proc itself /mob/living/carbon/human/proc/mob_climax(forced_climax=FALSE,cause = "") //Forced is instead of the other proc, makes you cum if you have the tools for it, ignoring restraints + set waitfor = FALSE if(mb_cd_timer > world.time) if(!forced_climax) //Don't spam the message to the victim if forced to come too fast to_chat(src, "You need to wait [DisplayTimeText((mb_cd_timer - world.time), TRUE)] before you can do that again!") diff --git a/code/modules/arousal/genitals.dm b/code/modules/arousal/genitals.dm index 723049a784..bfcaff7d56 100644 --- a/code/modules/arousal/genitals.dm +++ b/code/modules/arousal/genitals.dm @@ -27,6 +27,12 @@ if(do_update) update() +/obj/item/organ/genital/Destroy() + if(linked_organ?.linked_organ == src) + linked_organ.linked_organ = null + linked_organ = null + . = ..() + /obj/item/organ/genital/proc/set_aroused_state(new_state,cause = "manual toggle") if(!(genital_flags & GENITAL_CAN_AROUSE)) return FALSE @@ -150,7 +156,7 @@ /obj/item/organ/genital/proc/update_size() return -/obj/item/organ/genital/proc/update_appearance() +/obj/item/organ/genital/proc/update_appearance_genitals() if(!owner || owner.stat == DEAD) aroused_state = FALSE @@ -187,7 +193,7 @@ . = ..() if(.) update() - RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance) + RegisterSignal(owner, COMSIG_MOB_DEATH, .proc/update_appearance_genitals) if(genital_flags & GENITAL_THROUGH_CLOTHES) owner.exposed_genitals += src diff --git a/code/modules/arousal/toys/dildos.dm b/code/modules/arousal/toys/dildos.dm index 2482b93300..4de6877915 100644 --- a/code/modules/arousal/toys/dildos.dm +++ b/code/modules/arousal/toys/dildos.dm @@ -20,7 +20,7 @@ var/is_knotted = FALSE //Lists moved to _cit_helpers.dm as globals so they're not instanced individually -/obj/item/dildo/proc/update_appearance() +/obj/item/dildo/update_appearance() icon_state = "[dildo_type]_[dildo_shape]_[dildo_size]" var/sizeword = "" switch(dildo_size) diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index 1c814fa193..8c025e2ab4 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -146,7 +146,7 @@ return /obj/item/tank/proc/ignite() //This happens when a bomb is told to explode - var/fuel_moles = air_contents.get_moles(/datum/gas/plasma) + air_contents.get_moles(/datum/gas/oxygen)/6 + var/fuel_moles = air_contents.get_moles(GAS_PLASMA) + air_contents.get_moles(GAS_O2)/6 var/datum/gas_mixture/bomb_mixture = air_contents.copy() var/strength = 1 @@ -196,9 +196,8 @@ ground_zero.air_update_turf() /obj/item/tank/proc/release() //This happens when the bomb is not welded. Tank contents are just spat out. - var/datum/gas_mixture/removed = air_contents.remove(air_contents.total_moles()) var/turf/T = get_turf(src) if(!T) return - T.assume_air(removed) + T.assume_air(air_contents) air_update_turf() diff --git a/code/modules/assembly/infrared.dm b/code/modules/assembly/infrared.dm index 899eb12511..d0ed0f2436 100644 --- a/code/modules/assembly/infrared.dm +++ b/code/modules/assembly/infrared.dm @@ -81,6 +81,7 @@ return /obj/item/assembly/infra/proc/refreshBeam() + set waitfor = FALSE QDEL_LIST(beams) if(throwing || !on || !secured) return diff --git a/code/modules/atmospherics/auxgm/breathing_classes.dm b/code/modules/atmospherics/auxgm/breathing_classes.dm new file mode 100644 index 0000000000..4abfab58ee --- /dev/null +++ b/code/modules/atmospherics/auxgm/breathing_classes.dm @@ -0,0 +1,37 @@ +// Breathing classes are, yes, just a list of gases, associated with numbers. +// But they're very simple: pluoxium's status as O2 * 8 is represented here, +// with a single line of code, no hardcoding and special-casing across the codebase. +// Not only that, but they're very general: you could have a negative value +// to simulate asphyxiants, e.g. if I add krypton it could go into the oxygen +// breathing class at -7, simulating krypton narcosis. + +/datum/breathing_class + var/list/gases = null + var/list/products = null + var/danger_reagent = null + var/low_alert_category = "not_enough_oxy" + var/low_alert_datum = /atom/movable/screen/alert/not_enough_oxy + var/high_alert_category = "too_much_oxy" + var/high_alert_datum = /atom/movable/screen/alert/too_much_oxy + +/datum/breathing_class/oxygen + gases = list( + GAS_O2 = 1, + GAS_PLUOXIUM = 8, + GAS_CO2 = -0.7, // CO2 isn't actually toxic, just an asphyxiant + ) + products = list( + GAS_CO2 = 1, + ) + +/datum/breathing_class/plasma + gases = list( + GAS_PLASMA = 1 + ) + products = list( + GAS_CO2 = 1 + ) + low_alert_category = "not_enough_tox" + low_alert_datum = /atom/movable/screen/alert/not_enough_tox + high_alert_category = "too_much_tox" + high_alert_datum = /atom/movable/screen/alert/too_much_tox diff --git a/code/modules/atmospherics/auxgm/gas_types.dm b/code/modules/atmospherics/auxgm/gas_types.dm new file mode 100644 index 0000000000..6d30d7ed92 --- /dev/null +++ b/code/modules/atmospherics/auxgm/gas_types.dm @@ -0,0 +1,194 @@ +/datum/gas/oxygen + id = GAS_O2 + specific_heat = 20 + name = "Oxygen" + oxidation_temperature = T0C - 100 // it checks max of this and fire temperature, so rarely will things spontaneously combust + powermix = 1 + heat_penalty = 1 + transmit_modifier = 1.5 + +/datum/gas/nitrogen + id = GAS_N2 + specific_heat = 20 + name = "Nitrogen" + powermix = -1 + heat_penalty = -1.5 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_nitro", + alert_type = /atom/movable/screen/alert/not_enough_nitro + ), + too_much_alert = list( + alert_category = "too_much_nitro", + alert_type = /atom/movable/screen/alert/too_much_nitro + ) + ) + +/datum/gas/carbon_dioxide //what the fuck is this? + id = GAS_CO2 + specific_heat = 30 + name = "Carbon Dioxide" + powermix = 1 + heat_penalty = 0.1 + powerloss_inhibition = 1 + breath_results = GAS_O2 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_co2", + alert_type = /atom/movable/screen/alert/not_enough_co2 + ), + too_much_alert = list( + alert_category = "too_much_co2", + alert_type = /atom/movable/screen/alert/too_much_co2 + ) + ) + fusion_power = 3 + +/datum/gas/plasma + id = GAS_PLASMA + specific_heat = 200 + name = "Plasma" + gas_overlay = "plasma" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + heat_penalty = 15 + transmit_modifier = 4 + powermix = 1 + // no fire info cause it has its own bespoke reaction for trit generation reasons + +/datum/gas/water_vapor + id = GAS_H2O + specific_heat = 40 + name = "Water Vapor" + gas_overlay = "water_vapor" + moles_visible = MOLES_GAS_VISIBLE + fusion_power = 8 + heat_penalty = 8 + powermix = 1 + breath_reagent = /datum/reagent/water + +/datum/gas/hypernoblium + id = GAS_HYPERNOB + specific_heat = 2000 + name = "Hyper-noblium" + gas_overlay = "freon" + moles_visible = MOLES_GAS_VISIBLE + +/datum/gas/nitrous_oxide + id = GAS_NITROUS + specific_heat = 40 + name = "Nitrous Oxide" + gas_overlay = "nitrous_oxide" + moles_visible = MOLES_GAS_VISIBLE * 2 + flags = GAS_FLAG_DANGEROUS + fire_products = list(GAS_N2 = 1) + oxidation_rate = 0.5 + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + 100 + heat_resistance = 6 + +/datum/gas/nitryl + id = GAS_NITRYL + specific_heat = 20 + name = "Nitryl" + gas_overlay = "nitryl" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + fusion_power = 15 + fire_products = list(GAS_N2 = 0.5) + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 + +/datum/gas/tritium + id = GAS_TRITIUM + specific_heat = 10 + name = "Tritium" + gas_overlay = "tritium" + moles_visible = MOLES_GAS_VISIBLE + flags = GAS_FLAG_DANGEROUS + fusion_power = 1 + powermix = 1 + heat_penalty = 10 + transmit_modifier = 30 + /* + these are for when we add hydrogen, trit gets to keep its hardcoded fire for legacy reasons + fire_provides = list(GAS_H2O = 2) + fire_burn_rate = 2 + fire_energy_released = FIRE_HYDROGEN_ENERGY_RELEASED + fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 50 + */ + +/datum/gas/bz + id = GAS_BZ + specific_heat = 20 + name = "BZ" + flags = GAS_FLAG_DANGEROUS + fusion_power = 8 + powermix = 1 + heat_penalty = 5 + transmit_modifier = -2 + radioactivity_modifier = 5 + +/datum/gas/stimulum + id = GAS_STIMULUM + specific_heat = 5 + name = "Stimulum" + fusion_power = 7 + +/datum/gas/pluoxium + id = GAS_PLUOXIUM + specific_heat = 80 + name = "Pluoxium" + fusion_power = 10 + oxidation_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST * 1000 // it is VERY stable + oxidation_rate = 8 + powermix = -1 + heat_penalty = -1 + transmit_modifier = -5 + heat_resistance = 3 + +/datum/gas/miasma + id = GAS_MIASMA + specific_heat = 20 + fusion_power = 50 + name = "Miasma" + gas_overlay = "miasma" + moles_visible = MOLES_GAS_VISIBLE * 60 + +/datum/gas/methane + id = GAS_METHANE + specific_heat = 30 + name = "Methane" + breath_results = GAS_METHYL_BROMIDE + fire_products = list(GAS_CO2 = 1, GAS_H2O = 2) + fire_burn_rate = 0.5 + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_ch4", + alert_type = /atom/movable/screen/alert/not_enough_ch4 + ), + too_much_alert = list( + alert_category = "too_much_ch4", + alert_type = /atom/movable/screen/alert/too_much_ch4 + ) + ) + fire_energy_released = FIRE_CARBON_ENERGY_RELEASED + fire_temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST + +/datum/gas/methyl_bromide + id = GAS_METHYL_BROMIDE + specific_heat = 42 + name = "Methyl Bromide" + flags = GAS_FLAG_DANGEROUS + breath_alert_info = list( + not_enough_alert = list( + alert_category = "not_enough_ch3br", + alert_type = /atom/movable/screen/alert/not_enough_ch3br + ), + too_much_alert = list( + alert_category = "too_much_ch3br", + alert_type = /atom/movable/screen/alert/too_much_ch3br + ) + ) + fire_products = list(GAS_CO2 = 1, GAS_H2O = 1.5, GAS_BZ = 0.5) + fire_energy_released = FIRE_CARBON_ENERGY_RELEASED + fire_burn_rate = 0.5 + fire_temperature = 808 // its autoignition, it apparently doesn't spark readily, so i don't put it lower diff --git a/code/modules/atmospherics/environmental/LINDA_fire.dm b/code/modules/atmospherics/environmental/LINDA_fire.dm index 81e103fba2..cfa3e7eb14 100644 --- a/code/modules/atmospherics/environmental/LINDA_fire.dm +++ b/code/modules/atmospherics/environmental/LINDA_fire.dm @@ -13,28 +13,21 @@ if(!air) return - var/oxy = air.get_moles(/datum/gas/oxygen) - if (oxy < 0.5) + if (air.get_oxidation_power(exposed_temperature) < 0.5 || air.get_moles(GAS_HYPERNOB) > 5) return - var/tox = air.get_moles(/datum/gas/plasma) - var/trit = air.get_moles(/datum/gas/tritium) + var/has_fuel = air.get_moles(GAS_PLASMA) > 0.5 || air.get_moles(GAS_TRITIUM) > 0.5 || air.get_fuel_amount(exposed_temperature) > 0.5 if(active_hotspot) if(soh) - if(tox > 0.5 || trit > 0.5) + if(has_fuel) if(active_hotspot.temperature < exposed_temperature) active_hotspot.temperature = exposed_temperature if(active_hotspot.volume < exposed_volume) active_hotspot.volume = exposed_volume return - if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && (tox > 0.5 || trit > 0.5)) - + if((exposed_temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) && has_fuel) active_hotspot = new /obj/effect/hotspot(src, exposed_volume*25, exposed_temperature) - active_hotspot.just_spawned = (current_cycle < SSair.times_fired) - //remove just_spawned protection if no longer processing this cell - SSair.add_to_active(src, 0) - //This is the icon for fire on turfs, also helps for nurturing small fires until they are full tile /obj/effect/hotspot anchored = TRUE @@ -48,7 +41,6 @@ var/volume = 125 var/temperature = FIRE_MINIMUM_TEMPERATURE_TO_EXIST - var/just_spawned = TRUE var/bypassing = FALSE var/visual_update_tick = 0 @@ -70,7 +62,7 @@ location.active_hotspot = src - bypassing = !just_spawned && (volume > CELL_VOLUME*0.95) + bypassing = volume > CELL_VOLUME*0.95 if(bypassing) volume = location.air.reaction_results["fire"]*FIRE_GROWTH_RATE @@ -150,10 +142,6 @@ #define INSUFFICIENT(path) (location.air.get_moles(path) < 0.5) /obj/effect/hotspot/process() - if(just_spawned) - just_spawned = FALSE - return - var/turf/open/location = loc if(!istype(location)) qdel(src) @@ -164,13 +152,7 @@ if((temperature < FIRE_MINIMUM_TEMPERATURE_TO_EXIST) || (volume <= 1)) qdel(src) return - if(!location.air || (INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) - qdel(src) - return - - //Not enough to burn - // god damn it previous coder you made the INSUFFICIENT macro for a fucking reason why didn't you use it here smh - if((INSUFFICIENT(/datum/gas/plasma) && INSUFFICIENT(/datum/gas/tritium)) || INSUFFICIENT(/datum/gas/oxygen)) + if(!location.air || location.air.get_moles(GAS_HYPERNOB) > 5 || location.air.get_oxidation_power() < 0.5 || (INSUFFICIENT(GAS_PLASMA) && INSUFFICIENT(GAS_TRITIUM) && location.air.get_fuel_amount() < 0.5)) qdel(src) return diff --git a/code/modules/atmospherics/environmental/LINDA_system.dm b/code/modules/atmospherics/environmental/LINDA_system.dm index f714a94646..8d063825f1 100644 --- a/code/modules/atmospherics/environmental/LINDA_system.dm +++ b/code/modules/atmospherics/environmental/LINDA_system.dm @@ -19,57 +19,58 @@ /turf/open/CanAtmosPass(turf/T, vertical = FALSE) var/dir = vertical? get_dir_multiz(src, T) : get_dir(src, T) var/opp = REVERSE_DIR(dir) - var/R = FALSE + . = TRUE if(vertical && !(zAirOut(dir, T) && T.zAirIn(dir, src))) - R = TRUE + . = FALSE if(blocks_air || T.blocks_air) - R = TRUE + . = FALSE if (T == src) - return !R + return . for(var/obj/O in contents+T.contents) var/turf/other = (O.loc == src ? T : src) if(!(vertical? (CANVERTICALATMOSPASS(O, other)) : (CANATMOSPASS(O, other)))) - R = TRUE - if(O.BlockSuperconductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments - atmos_supeconductivity |= dir - T.atmos_supeconductivity |= opp - return FALSE //no need to keep going, we got all we asked + . = FALSE + if(O.BlockThermalConductivity()) //the direction and open/closed are already checked on CanAtmosPass() so there are no arguments + conductivity_blocked_directions |= dir + T.conductivity_blocked_directions |= opp + if(!.) + return . - atmos_supeconductivity &= ~dir - T.atmos_supeconductivity &= ~opp - - return !R - -/atom/movable/proc/BlockSuperconductivity() // objects that block air and don't let superconductivity act. Only firelocks atm. +/atom/movable/proc/BlockThermalConductivity() // Objects that don't let heat through. return FALSE /turf/proc/ImmediateCalculateAdjacentTurfs() + if(SSair.thread_running()) + CALCULATE_ADJACENT_TURFS(src) + return var/canpass = CANATMOSPASS(src, src) var/canvpass = CANVERTICALATMOSPASS(src, src) for(var/direction in GLOB.cardinals_multiz) var/turf/T = get_step_multiz(src, direction) - var/opp_dir = REVERSE_DIR(direction) - if(!isopenturf(T)) + if(!istype(T)) continue - if(!(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) + var/opp_dir = REVERSE_DIR(direction) + if(isopenturf(T) && !(blocks_air || T.blocks_air) && ((direction & (UP|DOWN))? (canvpass && CANVERTICALATMOSPASS(T, src)) : (canpass && CANATMOSPASS(T, src))) ) LAZYINITLIST(atmos_adjacent_turfs) LAZYINITLIST(T.atmos_adjacent_turfs) atmos_adjacent_turfs[T] = direction T.atmos_adjacent_turfs[src] = opp_dir - T.__update_extools_adjacent_turfs() else if (atmos_adjacent_turfs) atmos_adjacent_turfs -= T if (T.atmos_adjacent_turfs) T.atmos_adjacent_turfs -= src - T.__update_extools_adjacent_turfs() UNSETEMPTY(T.atmos_adjacent_turfs) + T.set_sleeping(T.blocks_air) + T.__update_auxtools_turf_adjacency_info(isspaceturf(T.get_z_base_turf()), -1) UNSETEMPTY(atmos_adjacent_turfs) src.atmos_adjacent_turfs = atmos_adjacent_turfs - __update_extools_adjacent_turfs() + set_sleeping(blocks_air) + __update_auxtools_turf_adjacency_info(isspaceturf(get_z_base_turf())) -/turf/proc/__update_extools_adjacent_turfs() +/turf/proc/set_sleeping(should_sleep) +/turf/proc/__update_auxtools_turf_adjacency_info() //returns a list of adjacent turfs that can share air with this one. //alldir includes adjacent diagonal tiles that can share @@ -111,7 +112,6 @@ /turf/air_update_turf(command = 0) if(command) ImmediateCalculateAdjacentTurfs() - SSair.add_to_active(src,command) /atom/movable/proc/move_update_air(turf/T) if(isturf(T)) @@ -130,7 +130,4 @@ var/datum/gas_mixture/G = new G.parse_gas_string(text) - - air.merge(G) - archive() - SSair.add_to_active(src, 0) + assume_air(G) diff --git a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm index 244b51bd2b..3a3ba555de 100644 --- a/code/modules/atmospherics/environmental/LINDA_turf_tile.dm +++ b/code/modules/atmospherics/environmental/LINDA_turf_tile.dm @@ -1,18 +1,13 @@ /turf //used for temperature calculations - var/thermal_conductivity = 0.005 + //conductivity is divided by 10 when interacting with air for balance purposes + var/thermal_conductivity = 0.05 var/heat_capacity = 1 - var/temperature_archived //list of open turfs adjacent to us var/list/atmos_adjacent_turfs - //bitfield of dirs in which we are superconducitng - var/atmos_supeconductivity = NONE - var/is_openturf = FALSE // used by extools shizz. - - //used to determine whether we should archive - var/archived_cycle = 0 - var/current_cycle = 0 + //bitfield of dirs in which we thermal conductivity is blocked + var/conductivity_blocked_directions = NONE //used for mapping and for breathing while in walls (because that's a thing that needs to be accounted for...) //string parsed by /datum/gas/proc/copy_from_turf @@ -32,21 +27,17 @@ var/planetary_atmos = FALSE //air will revert to initial_gas_mix over time var/list/atmos_overlay_types //gas IDs of current active gas overlays - is_openturf = TRUE /turf/open/Initialize() if(!blocks_air) - air = new + air = new(2500,src) air.copy_from_turf(src) - update_air_ref() + update_air_ref(planetary_atmos ? 1 : 2) . = ..() /turf/open/Destroy() if(active_hotspot) QDEL_NULL(active_hotspot) - // Adds the adjacent turfs to the current atmos processing - for(var/T in atmos_adjacent_turfs) - SSair.add_to_active(T) return ..() /// Function for Extools Atmos @@ -55,10 +46,46 @@ /////////////////GAS MIXTURE PROCS/////////////////// /turf/open/assume_air(datum/gas_mixture/giver) //use this for machines to adjust air + return assume_air_ratio(giver, 1) + +/turf/open/assume_air_moles(datum/gas_mixture/giver, moles) if(!giver) return FALSE - air.merge(giver) - update_visuals() + if(SSair.thread_running()) + SSair.deferred_airs += list(list(giver, air, moles / giver.total_moles())) + else + giver.transfer_to(air, moles) + update_visuals() + return TRUE + +/turf/open/assume_air_ratio(datum/gas_mixture/giver, ratio) + if(!giver) + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(giver, air, ratio)) + else + giver.transfer_ratio_to(air, ratio) + update_visuals() + return TRUE + +/turf/open/transfer_air(datum/gas_mixture/taker, moles) + if(!taker || !return_air()) // shouldn't transfer from space + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(air, taker, moles / air.total_moles())) + else + air.transfer_to(taker, moles) + update_visuals() + return TRUE + +/turf/open/transfer_air_ratio(datum/gas_mixture/taker, ratio) + if(!taker || !return_air()) + return FALSE + if(SSair.thread_running()) + SSair.deferred_airs += list(list(air, taker, ratio)) + else + air.transfer_ratio_to(taker, ratio) + update_visuals() return TRUE /turf/open/remove_air(amount) @@ -67,6 +94,12 @@ update_visuals() return removed +/turf/open/remove_air_ratio(ratio) + var/datum/gas_mixture/ours = return_air() + var/datum/gas_mixture/removed = ours.remove_ratio(ratio) + update_visuals() + return removed + /turf/open/proc/copy_air_with_tile(turf/open/T) if(istype(T)) air.copy_from(T.air) @@ -86,17 +119,9 @@ return air /turf/temperature_expose() - if(temperature > heat_capacity) + if(return_temperature() > heat_capacity) to_be_destroyed = TRUE -/turf/proc/archive() - temperature_archived = temperature - -/turf/open/archive() - air.archive() - archived_cycle = SSair.times_fired - temperature_archived = temperature - /turf/open/proc/eg_reset_cooldowns() /turf/open/proc/eg_garbage_collect() /turf/open/proc/get_excited() @@ -121,8 +146,8 @@ for(var/id in air.get_gases()) if (nonoverlaying_gases[id]) continue - var/gas_overlay = GLOB.meta_gas_overlays[id] - if(gas_overlay && air.get_moles(id) > GLOB.meta_gas_visibility[META_GAS_MOLES_VISIBLE]) + var/gas_overlay = GLOB.gas_data.overlays[id] + if(gas_overlay && air.get_moles(id) > GLOB.gas_data.visibility[id]) new_overlay_types += gas_overlay[min(FACTOR_GAS_VISIBLE_MAX, CEILING(air.get_moles(id) / MOLES_GAS_VISIBLE_STEP, 1))] if (atmos_overlay_types) @@ -156,7 +181,7 @@ for (var/gastype in subtypesof(/datum/gas)) var/datum/gas/gasvar = gastype if (!initial(gasvar.gas_overlay)) - .[gastype] = TRUE + .[initial(gasvar.id)] = TRUE /////////////////////////////SIMULATION/////////////////////////////////// @@ -171,7 +196,6 @@ } */ /turf/proc/process_cell(fire_count) - SSair.remove_from_active(src) /turf/open/proc/equalize_pressure_in_zone(cyclenum) /turf/open/proc/consider_firelocks(turf/T2) @@ -198,7 +222,10 @@ //////////////////////////SPACEWIND///////////////////////////// -/turf/open/proc/consider_pressure_difference(turf/T, difference) +/turf/proc/consider_pressure_difference() + return + +/turf/open/consider_pressure_difference(turf/T, difference) if(difference > pressure_difference) pressure_direction = get_dir(src, T) pressure_difference = difference @@ -236,117 +263,3 @@ if (move_prob > PROBABILITY_OFFSET && prob(move_prob) && (move_resist != INFINITY) && (!anchored && (max_force >= (move_resist * MOVE_FORCE_PUSH_RATIO))) || (anchored && (max_force >= (move_resist * MOVE_FORCE_FORCEPUSH_RATIO)))) step(src, direction) -////////////////////////SUPERCONDUCTIVITY///////////////////////////// -/turf/proc/conductivity_directions() - if(archived_cycle < SSair.times_fired) - archive() - return NORTH|SOUTH|EAST|WEST - -/turf/open/conductivity_directions() - if(blocks_air) - return ..() - for(var/direction in GLOB.cardinals) - var/turf/T = get_step(src, direction) - if(!(T in atmos_adjacent_turfs) && !(atmos_supeconductivity & direction)) - . |= direction - -/turf/proc/neighbor_conduct_with_src(turf/open/other) - if(!other.blocks_air) //Open but neighbor is solid - other.temperature_share_open_to_solid(src) - else //Both tiles are solid - other.share_temperature_mutual_solid(src, thermal_conductivity) - temperature_expose(null, temperature, null) - -/turf/open/neighbor_conduct_with_src(turf/other) - if(blocks_air) - ..() - return - - if(!other.blocks_air) //Both tiles are open - var/turf/open/T = other - T.air.temperature_share(air, WINDOW_HEAT_TRANSFER_COEFFICIENT) - else //Solid but neighbor is open - temperature_share_open_to_solid(other) - SSair.add_to_active(src, 0) - -/turf/proc/super_conduct() - var/conductivity_directions = conductivity_directions() - archive() - if(conductivity_directions) - //Conduct with tiles around me - for(var/direction in GLOB.cardinals) - if(conductivity_directions & direction) - var/turf/neighbor = get_step(src,direction) - - if(!neighbor.thermal_conductivity) - continue - - if(neighbor.archived_cycle < SSair.times_fired) - neighbor.archive() - - neighbor.neighbor_conduct_with_src(src) - - neighbor.consider_superconductivity() - - radiate_to_spess() - - finish_superconduction() - -/turf/proc/finish_superconduction(temp = temperature) - //Make sure still hot enough to continue conducting heat - if(temp < MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION) - SSair.active_super_conductivity -= src - return FALSE - -/turf/open/finish_superconduction() - //Conduct with air on my tile if I have it - if(!blocks_air) - temperature = air.temperature_share(null, thermal_conductivity, temperature, heat_capacity) - ..((blocks_air ? temperature : air.return_temperature())) - -/turf/proc/consider_superconductivity() - if(!thermal_conductivity) - return FALSE - - SSair.active_super_conductivity[src] = TRUE - - return TRUE - -/turf/open/consider_superconductivity(starting) - if(planetary_atmos) - return FALSE - if(air.return_temperature() < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - if(air.heat_capacity() < M_CELL_WITH_RATIO) // Was: MOLES_CELLSTANDARD*0.1*0.05 Since there are no variables here we can make this a constant. - return FALSE - return ..() - -/turf/closed/consider_superconductivity(starting) - if(temperature < (starting?MINIMUM_TEMPERATURE_START_SUPERCONDUCTION:MINIMUM_TEMPERATURE_FOR_SUPERCONDUCTION)) - return FALSE - return ..() - -/turf/proc/radiate_to_spess() //Radiate excess tile heat to space - if(temperature > T0C) //Considering 0 degC as te break even point for radiation in and out - var/delta_temperature = (temperature_archived - TCMB) //hardcoded space temperature - if((heat_capacity > 0) && (abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER)) - - var/heat = thermal_conductivity*delta_temperature* \ - (heat_capacity*HEAT_CAPACITY_VACUUM/(heat_capacity+HEAT_CAPACITY_VACUUM)) - temperature -= heat/heat_capacity - temperature = max(temperature,T0C) //otherwise we just sorta get stuck at super cold temps forever - -/turf/open/proc/temperature_share_open_to_solid(turf/sharer) - sharer.temperature = air.temperature_share(null, sharer.thermal_conductivity, sharer.temperature, sharer.heat_capacity) - -/turf/proc/share_temperature_mutual_solid(turf/sharer, conduction_coefficient) //to be understood - var/delta_temperature = (temperature_archived - sharer.temperature_archived) - if(abs(delta_temperature) > MINIMUM_TEMPERATURE_DELTA_TO_CONSIDER && heat_capacity && sharer.heat_capacity) - - var/heat = conduction_coefficient*delta_temperature* \ - (heat_capacity*sharer.heat_capacity/(heat_capacity+sharer.heat_capacity)) - - temperature -= heat/heat_capacity - sharer.temperature += heat/sharer.heat_capacity - temperature = max(temperature,T0C) - sharer.temperature = max(sharer.temperature,T0C) diff --git a/code/modules/atmospherics/gasmixtures/auxgm.dm b/code/modules/atmospherics/gasmixtures/auxgm.dm new file mode 100644 index 0000000000..4aa68aa710 --- /dev/null +++ b/code/modules/atmospherics/gasmixtures/auxgm.dm @@ -0,0 +1,146 @@ +GLOBAL_LIST_INIT(hardcoded_gases, list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLASMA)) //the main four gases, which were at one time hardcoded +GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(GAS_O2, GAS_N2, GAS_CO2, GAS_PLUOXIUM, GAS_STIMULUM, GAS_NITRYL))) //unable to react amongst themselves + +// Auxgm +// It's a send-up of XGM, like what baystation got. +// It's got the same architecture as XGM, but it's structured +// differently to make it more convenient for auxmos. + +// Most important compared to TG is that it does away with hardcoded typepaths, +// which lead to problems on the auxmos end anyway. We cache the string value +// references on the Rust end, so no performance is lost here. + +// Also allows you to add new gases at runtime + +/proc/_auxtools_register_gas(datum/gas/gas) // makes sure auxtools knows stuff about this gas + +/datum/auxgm + var/list/datums = list() + var/list/specific_heats = list() + var/list/names = list() + var/list/visibility = list() + var/list/overlays = list() + var/list/flags = list() + var/list/ids = list() + var/list/typepaths = list() + var/list/fusion_powers = list() + var/list/breathing_classes = list() + var/list/breath_results = list() + var/list/breath_reagents = list() + var/list/breath_reagents_dangerous = list() + var/list/breath_alert_info = list() + var/list/oxidation_temperatures = list() + var/list/oxidation_rates = list() + var/list/fire_temperatures = list() + var/list/fire_enthalpies = list() + var/list/fire_products = list() + var/list/fire_burn_rates = list() + var/list/supermatter = list() + + +/datum/gas + var/id = "" + var/specific_heat = 0 + var/name = "" + var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi + var/moles_visible = null + var/flags = NONE //currently used by canisters + var/fusion_power = 0 // How much the gas destabilizes a fusion reaction + var/breath_results = GAS_CO2 // what breathing this breathes out + var/breath_reagent = null // what breathing this adds to your reagents + var/breath_reagent_dangerous = null // what breathing this adds to your reagents IF it's above a danger threshold + var/list/breath_alert_info = null // list for alerts that pop up when you have too much/not enough of something + var/oxidation_temperature = null // temperature above which this gas is an oxidizer; null for none + var/oxidation_rate = 1 // how many moles of this can oxidize how many moles of material + var/fire_temperature = null // temperature above which gas may catch fire; null for none + var/list/fire_products = null // what results when this gas is burned (oxidizer or fuel); null for none + var/fire_energy_released = 0 // how much energy is released per mole of fuel burned + var/fire_burn_rate = 1 // how many moles are burned per product released + var/powermix = 0 // how much this gas contributes to the supermatter's powermix ratio + var/heat_penalty = 0 // heat and waste penalty from having the supermatter crystal surrounded by this gas; negative numbers reduce + var/transmit_modifier = 0 // bonus to supermatter power generation (multiplicative, since it's % based, and divided by 10) + var/radioactivity_modifier = 0 // improves effect of transmit modifiers, must be from -10 to 10 + var/heat_resistance = 0 // makes the crystal more resistant against heat damage. + var/powerloss_inhibition = 0 // Reduces how much power the supermatter loses each tick + +/datum/gas/proc/breath(partial_pressure, light_threshold, heavy_threshold, moles, mob/living/carbon/C, obj/item/organ/lungs/lungs) + // This is only called on gases with the GAS_FLAG_BREATH_PROC flag. When possible, do NOT use this-- + // greatly prefer just adding a reagent. This is mostly around for legacy reasons. + return null + +/datum/auxgm/proc/add_gas(datum/gas/gas) + var/g = gas.id + if(g) + datums[g] = gas + specific_heats[g] = gas.specific_heat + names[g] = gas.name + if(gas.moles_visible) + visibility[g] = gas.moles_visible + overlays[g] = new /list(FACTOR_GAS_VISIBLE_MAX) + for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX) + overlays[g][i] = new /obj/effect/overlay/gas(gas.gas_overlay, i * 255 / FACTOR_GAS_VISIBLE_MAX) + else + visibility[g] = 0 + overlays[g] = 0 + flags[g] = gas.flags + ids[g] = g + typepaths[g] = gas.type + fusion_powers[g] = gas.fusion_power + + if(gas.breath_alert_info) + breath_alert_info[g] = gas.breath_alert_info + breath_results[g] = gas.breath_results + if(gas.breath_reagent) + breath_reagents[g] = gas.breath_reagent + if(gas.breath_reagent_dangerous) + breath_reagents_dangerous[g] = gas.breath_reagent_dangerous + + if(gas.oxidation_temperature) + oxidation_temperatures[g] = gas.oxidation_temperature + oxidation_rates[g] = gas.oxidation_rate + if(gas.fire_products) + fire_products[g] = gas.fire_products + fire_enthalpies[g] = gas.fire_energy_released + else if(gas.fire_temperature) + fire_temperatures[g] = gas.fire_temperature + fire_burn_rates[g] = gas.fire_burn_rate + if(gas.fire_products) + fire_products[g] = gas.fire_products + fire_enthalpies[g] = gas.fire_energy_released + add_supermatter_properties(gas) + _auxtools_register_gas(gas) + +/proc/finalize_gas_refs() + +/datum/auxgm/New() + src.supermatter[HEAT_PENALTY] = list() + src.supermatter[TRANSMIT_MODIFIER] = list() + src.supermatter[RADIOACTIVITY_MODIFIER] = list() + src.supermatter[HEAT_RESISTANCE] = list() + src.supermatter[POWERLOSS_INHIBITION] = list() + src.supermatter[POWER_MIX] = list() + src.supermatter[ALL_SUPERMATTER_GASES] = list() + + for(var/gas_path in subtypesof(/datum/gas)) + var/datum/gas/gas = new gas_path + add_gas(gas) + for(var/breathing_class_path in subtypesof(/datum/breathing_class)) + var/datum/breathing_class/class = new breathing_class_path + breathing_classes[breathing_class_path] = class + finalize_gas_refs() + + +GLOBAL_DATUM_INIT(gas_data, /datum/auxgm, new) + +/obj/effect/overlay/gas + icon = 'icons/effects/atmospherics.dmi' + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + anchored = TRUE // should only appear in vis_contents, but to be safe + layer = FLY_LAYER + appearance_flags = TILE_BOUND + vis_flags = NONE + +/obj/effect/overlay/gas/New(state, alph) + . = ..() + icon_state = state + alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/gas_mixture.dm b/code/modules/atmospherics/gasmixtures/gas_mixture.dm index f310f17b04..ed4b1f63c2 100644 --- a/code/modules/atmospherics/gasmixtures/gas_mixture.dm +++ b/code/modules/atmospherics/gasmixtures/gas_mixture.dm @@ -6,27 +6,24 @@ What are the archived variables for? #define MINIMUM_HEAT_CAPACITY 0.0003 #define MINIMUM_MOLE_COUNT 0.01 -//Unomos - global list inits for all of the meta gas lists. -//This setup allows procs to only look at one list instead of trying to dig around in lists-within-lists -GLOBAL_LIST_INIT(meta_gas_specific_heats, meta_gas_heat_list()) -GLOBAL_LIST_INIT(meta_gas_names, meta_gas_name_list()) -GLOBAL_LIST_INIT(meta_gas_visibility, meta_gas_visibility_list()) -GLOBAL_LIST_INIT(meta_gas_overlays, meta_gas_overlay_list()) -GLOBAL_LIST_INIT(meta_gas_dangers, meta_gas_danger_list()) -GLOBAL_LIST_INIT(meta_gas_ids, meta_gas_id_list()) -GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture /// Never ever set this variable, hooked into vv_get_var for view variables viewing. var/gas_list_view_only var/initial_volume = CELL_VOLUME //liters var/list/reaction_results var/list/analyzer_results //used for analyzer feedback - not initialized until its used - var/_extools_pointer_gasmixture = 0 // Contains the memory address of the shared_ptr object for this gas mixture in c++ land. Don't. Touch. This. Var. + var/_extools_pointer_gasmixture // Contains the index in the gas vector for this gas mixture in rust land. Don't. Touch. This. Var. + +GLOBAL_LIST_INIT(auxtools_atmos_initialized,FALSE) + +/proc/auxtools_atmos_init() /datum/gas_mixture/New(volume) if (!isnull(volume)) initial_volume = volume - ATMOS_EXTOOLS_CHECK + AUXTOOLS_CHECK(AUXMOS) + if(!GLOB.auxtools_atmos_initialized && auxtools_atmos_init()) + GLOB.auxtools_atmos_initialized = TRUE __gasmixture_register() reaction_results = new @@ -43,6 +40,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) var/list/dummy = get_gases() for(var/gas in dummy) dummy[gas] = get_moles(gas) + dummy["CAP [gas]"] = partial_heat_capacity(gas) dummy["TEMP"] = return_temperature() dummy["PRESSURE"] = return_pressure() dummy["HEAT CAPACITY"] = heat_capacity() @@ -79,16 +77,16 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) var/list/gases = get_gases() for(var/gas in gases) gases[gas] = get_moles(gas) - var/gastype = input(usr, "What kind of gas?", "Set Gas") as null|anything in subtypesof(/datum/gas) - if(!ispath(gastype, /datum/gas)) + var/gasid = input(usr, "What kind of gas?", "Set Gas") as null|anything in GLOB.gas_data.ids + if(!gasid) return - var/amount = input(usr, "Input amount", "Set Gas", gases[gastype] || 0) as num|null + var/amount = input(usr, "Input amount", "Set Gas", gases[gasid] || 0) as num|null if(!isnum(amount)) return amount = max(0, amount) - log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.") - message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas type [gastype] to [amount] moles.") - set_moles(gastype, amount) + log_admin("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") + message_admins("[key_name(usr)] modified gas mixture [REF(src)]: Set gas [gasid] to [amount] moles.") + set_moles(gasid, amount) if(href_list[VV_HK_SET_TEMPERATURE]) var/temp = input(usr, "Set the temperature of this mixture to?", "Set Temperature", return_temperature()) as num|null if(!isnum(temp)) @@ -107,9 +105,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) set_volume(volume) /* +we use a hook instead /datum/gas_mixture/Del() __gasmixture_unregister() - . = ..()*/ + . = ..() + */ /datum/gas_mixture/proc/__gasmixture_unregister() /datum/gas_mixture/proc/__gasmixture_register() @@ -123,6 +123,8 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/heat_capacity() //joules per kelvin +/datum/gas_mixture/proc/partial_heat_capacity(gas_type) + /datum/gas_mixture/proc/total_moles() /datum/gas_mixture/proc/return_pressure() //kilopascals @@ -147,7 +149,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/vv_react(datum/holder) return react(holder) -/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, list/gases) +/datum/gas_mixture/proc/scrub_into(datum/gas_mixture/target, ratio, list/gases) /datum/gas_mixture/proc/mark_immutable() /datum/gas_mixture/proc/get_gases() /datum/gas_mixture/proc/multiply(factor) @@ -155,7 +157,7 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/clear() /datum/gas_mixture/proc/adjust_moles(gas_type, amt = 0) - set_moles(gas_type, get_moles(gas_type) + amt) + set_moles(gas_type, clamp(get_moles(gas_type) + amt,0,INFINITY)) /datum/gas_mixture/proc/return_volume() //liters @@ -175,7 +177,9 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) /datum/gas_mixture/proc/transfer_to(datum/gas_mixture/target, amount) //Transfers amount of gas to target. Equivalent to target.merge(remove(amount)) but faster. - //Removes amount of gas from the gas_mixture + +/datum/gas_mixture/proc/transfer_ratio_to(datum/gas_mixture/target, ratio) + //Transfers ratio of gas to target. Equivalent to target.merge(remove_ratio(amount)) but faster. /datum/gas_mixture/proc/remove_ratio(ratio) //Proportionally removes amount of gas from the gas_mixture @@ -213,6 +217,24 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) //Performs various reactions such as combustion or fusion (LOL) //Returns: 1 if any reaction took place; 0 otherwise +/datum/gas_mixture/proc/adjust_heat(amt) + //Adjusts the thermal energy of the gas mixture, rather than having to do the full calculation. + //Returns: null + +/datum/gas_mixture/proc/equalize_with(datum/gas_mixture/giver) + //Makes this mix have the same temperature and gas ratios as the giver, but with the same pressure, accounting for volume. + //Returns: null + +/datum/gas_mixture/proc/get_oxidation_power(temp) + //Gets how much oxidation this gas can do, optionally at a given temperature. + +/datum/gas_mixture/proc/get_fuel_amount(temp) + //Gets how much fuel for fires (not counting trit/plasma!) this gas has, optionally at a given temperature. + +/proc/equalize_all_gases_in_list(list/L) + //Makes every gas in the given list have the same pressure, temperature and gas proportions. + //Returns: null + /datum/gas_mixture/proc/__remove() /datum/gas_mixture/remove(amount) var/datum/gas_mixture/removed = new type @@ -234,26 +256,21 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) return copy /datum/gas_mixture/copy_from_turf(turf/model) + set_temperature(initial(model.initial_temperature)) parse_gas_string(model.initial_gas_mix) - - //acounts for changes in temperature - var/turf/model_parent = model.parent_type - if(model.temperature != initial(model.temperature) || model.temperature != initial(model_parent.temperature)) - set_temperature(model.temperature) - return 1 /datum/gas_mixture/parse_gas_string(gas_string) var/list/gas = params2list(gas_string) if(gas["TEMP"]) - set_temperature(text2num(gas["TEMP"])) + var/temp = text2num(gas["TEMP"]) gas -= "TEMP" + if(!isnum(temp) || temp < 2.7) + temp = 2.7 + set_temperature(temp) clear() for(var/id in gas) - var/path = id - if(!ispath(path)) - path = gas_id2path(path) //a lot of these strings can't have embedded expressions (especially for mappers), so support for IDs needs to stick around - set_moles(path, text2num(gas[id])) + set_moles(id, text2num(gas[id])) archive() return 1 /* @@ -305,17 +322,11 @@ GLOBAL_LIST_INIT(meta_gas_fusions, meta_gas_fusion_list()) if (. & STOP_REACTIONS) break */ -//Takes the amount of the gas you want to PP as an argument -//So I don't have to do some hacky switches/defines/magic strings -//eg: -//Tox_PP = get_partial_pressure(gas_mixture.toxins) -//O2_PP = get_partial_pressure(gas_mixture.oxygen) -/datum/gas_mixture/proc/get_breath_partial_pressure(gas_pressure) - return (gas_pressure * R_IDEAL_GAS_EQUATION * return_temperature()) / BREATH_VOLUME -//inverse -/datum/gas_mixture/proc/get_true_breath_pressure(partial_pressure) - return (partial_pressure * BREATH_VOLUME) / (R_IDEAL_GAS_EQUATION * return_temperature()) +/datum/gas_mixture/proc/set_analyzer_results(instability) + if(!analyzer_results) + analyzer_results = new + analyzer_results["fusion"] = instability //Mathematical proofs: /* @@ -379,8 +390,7 @@ get_true_breath_pressure(pp) --> gas_pp = pp/breath_pp*total_moles() var/transfer_moles = pressure_delta*output_air.return_volume()/(input_air.return_temperature() * R_IDEAL_GAS_EQUATION) //Actually transfer the gas - var/datum/gas_mixture/removed = input_air.remove(transfer_moles) - output_air.merge(removed) + input_air.transfer_to(output_air, transfer_moles) return TRUE return FALSE diff --git a/code/modules/atmospherics/gasmixtures/gas_types.dm b/code/modules/atmospherics/gasmixtures/gas_types.dm deleted file mode 100644 index fa5641254e..0000000000 --- a/code/modules/atmospherics/gasmixtures/gas_types.dm +++ /dev/null @@ -1,214 +0,0 @@ -GLOBAL_LIST_INIT(hardcoded_gases, list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/plasma)) //the main four gases, which were at one time hardcoded -GLOBAL_LIST_INIT(nonreactive_gases, typecacheof(list(/datum/gas/oxygen, /datum/gas/nitrogen, /datum/gas/carbon_dioxide, /datum/gas/pluoxium, /datum/gas/stimulum, /datum/gas/nitryl))) //unable to react amongst themselves - -/proc/gas_id2path(id) - var/list/meta_gas = GLOB.meta_gas_ids - if(id in meta_gas) - return id - for(var/path in meta_gas) - if(meta_gas[path] == id) - return path - return "" - -//Unomos - oh god oh fuck oh shit oh lord have mercy this is messy as fuck oh god -//my addiction to seeing better performance numbers isn't healthy, kids -//you see this shit, children? -//i am not a good idol. don't take after me. -//this is literally worse than my alcohol addiction -/proc/meta_gas_heat_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.specific_heat) - -/proc/meta_gas_name_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.name) - -/proc/meta_gas_visibility_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.moles_visible) - -/proc/meta_gas_overlay_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = 0 //gotta make sure if(GLOB.meta_gas_overlays[gaspath]) doesn't break - if(initial(gas.moles_visible) != null) - .[gas_path] = new /list(FACTOR_GAS_VISIBLE_MAX) - for(var/i in 1 to FACTOR_GAS_VISIBLE_MAX) - .[gas_path][i] = new /obj/effect/overlay/gas(initial(gas.gas_overlay), i * 255 / FACTOR_GAS_VISIBLE_MAX) - -/proc/meta_gas_danger_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.dangerous) - -/proc/meta_gas_id_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.id) - -/proc/meta_gas_fusion_list() - . = subtypesof(/datum/gas) - for(var/gas_path in .) - var/datum/gas/gas = gas_path - .[gas_path] = initial(gas.fusion_power) - -/*||||||||||||||/----------\||||||||||||||*\ -||||||||||||||||[GAS DATUMS]|||||||||||||||| -||||||||||||||||\__________/|||||||||||||||| -||||These should never be instantiated. |||| -||||They exist only to make it easier |||| -||||to add a new gas. They are accessed |||| -||||only by meta_gas_list(). |||| -\*||||||||||||||||||||||||||||||||||||||||*/ - -/datum/gas - var/id = "" - var/specific_heat = 0 - var/name = "" - var/gas_overlay = "" //icon_state in icons/effects/atmospherics.dmi - var/moles_visible = null - var/dangerous = FALSE //currently used by canisters - var/fusion_power = 0 //How much the gas accelerates a fusion reaction - var/rarity = 0 // relative rarity compared to other gases, used when setting up the reactions list. - -/datum/gas/oxygen - id = "o2" - specific_heat = 20 - name = "Oxygen" - rarity = 900 - -/datum/gas/nitrogen - id = "n2" - specific_heat = 20 - name = "Nitrogen" - rarity = 1000 - -/datum/gas/carbon_dioxide //what the fuck is this? - id = "co2" - specific_heat = 30 - name = "Carbon Dioxide" - fusion_power = 3 - rarity = 700 - -/datum/gas/plasma - id = "plasma" - specific_heat = 200 - name = "Plasma" - gas_overlay = "plasma" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 800 - -/datum/gas/water_vapor - id = "water_vapor" - specific_heat = 40 - name = "Water Vapor" - gas_overlay = "water_vapor" - moles_visible = MOLES_GAS_VISIBLE - fusion_power = 8 - rarity = 500 - -/datum/gas/hypernoblium - id = "nob" - specific_heat = 2000 - name = "Hyper-noblium" - gas_overlay = "freon" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - rarity = 50 - -/datum/gas/nitrous_oxide - id = "n2o" - specific_heat = 40 - name = "Nitrous Oxide" - gas_overlay = "nitrous_oxide" - moles_visible = MOLES_GAS_VISIBLE * 2 - dangerous = TRUE - rarity = 600 - -/datum/gas/nitryl - id = "no2" - specific_heat = 20 - name = "Nitryl" - gas_overlay = "nitryl" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 15 - rarity = 100 - -/datum/gas/tritium - id = "tritium" - specific_heat = 10 - name = "Tritium" - gas_overlay = "tritium" - moles_visible = MOLES_GAS_VISIBLE - dangerous = TRUE - fusion_power = 1 - rarity = 300 - -/datum/gas/bz - id = "bz" - specific_heat = 20 - name = "BZ" - dangerous = TRUE - fusion_power = 8 - rarity = 400 - -/datum/gas/stimulum - id = "stim" - specific_heat = 5 - name = "Stimulum" - fusion_power = 7 - rarity = 1 - -/datum/gas/pluoxium - id = "pluox" - specific_heat = 80 - name = "Pluoxium" - fusion_power = 10 - rarity = 200 - -/datum/gas/miasma - id = "miasma" - specific_heat = 20 - fusion_power = 50 - name = "Miasma" - gas_overlay = "miasma" - moles_visible = MOLES_GAS_VISIBLE * 60 - rarity = 250 - -/datum/gas/methane - id = "methane" - specific_heat = 30 - name = "Methane" - rarity = 320 - -/datum/gas/methyl_bromide - id = "methyl_bromide" - specific_heat = 42 - name = "Methyl Bromide" - dangerous = TRUE - rarity = 310 - - -/obj/effect/overlay/gas - icon = 'icons/effects/atmospherics.dmi' - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - anchored = TRUE // should only appear in vis_contents, but to be safe - layer = FLY_LAYER - appearance_flags = TILE_BOUND - vis_flags = NONE - -/obj/effect/overlay/gas/New(state, alph) - . = ..() - icon_state = state - alpha = alph diff --git a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm index eefad7c970..300f5c2b4f 100644 --- a/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm +++ b/code/modules/atmospherics/gasmixtures/immutable_mixtures.dm @@ -27,4 +27,4 @@ /datum/gas_mixture/immutable/cloner/populate() ..() - set_moles(/datum/gas/nitrogen, MOLES_O2STANDARD + MOLES_N2STANDARD) + set_moles(GAS_N2, MOLES_O2STANDARD + MOLES_N2STANDARD) diff --git a/code/modules/atmospherics/gasmixtures/reactions.dm b/code/modules/atmospherics/gasmixtures/reactions.dm index 5f425d87ff..b523d333df 100644 --- a/code/modules/atmospherics/gasmixtures/reactions.dm +++ b/code/modules/atmospherics/gasmixtures/reactions.dm @@ -8,13 +8,6 @@ if(initial(reaction.exclude)) continue reaction = new r - var/datum/gas/reaction_key - for (var/req in reaction.min_requirements) - if (ispath(req)) - var/datum/gas/req_gas = req - if (!reaction_key || initial(reaction_key.rarity) > initial(req_gas.rarity)) - reaction_key = req_gas - reaction.major_gas = reaction_key . += reaction sortTim(., /proc/cmp_gas_reaction) @@ -26,7 +19,6 @@ //when in doubt, use MINIMUM_MOLE_COUNT. var/list/min_requirements var/list/max_requirements - var/major_gas //the highest rarity gas used in the reaction. var/exclude = FALSE //do it this way to allow for addition/removal of reactions midmatch in the future var/priority = 100 //lower numbers are checked/react later than higher numbers. if two reactions have the same priority they may happen in either order var/name = "reaction" @@ -49,7 +41,7 @@ id = "nobstop" /datum/gas_reaction/nobliumsupression/init_reqs() - min_requirements = list(/datum/gas/hypernoblium = REACTION_OPPRESSION_THRESHOLD) + min_requirements = list(GAS_HYPERNOB = REACTION_OPPRESSION_THRESHOLD) /datum/gas_reaction/nobliumsupression/react() return STOP_REACTIONS @@ -61,7 +53,7 @@ id = "vapor" /datum/gas_reaction/water_vapor/init_reqs() - min_requirements = list(/datum/gas/water_vapor = MOLES_GAS_VISIBLE) + min_requirements = list(GAS_H2O = MOLES_GAS_VISIBLE) /datum/gas_reaction/water_vapor/react(datum/gas_mixture/air, datum/holder) var/turf/open/location = isturf(holder) ? holder : null @@ -70,7 +62,7 @@ if(location && location.freon_gas_act()) . = REACTING else if(location && location.water_vapor_gas_act()) - air.adjust_moles(/datum/gas/water_vapor,-MOLES_GAS_VISIBLE) + air.adjust_moles(GAS_H2O,-MOLES_GAS_VISIBLE) . = REACTING // no test cause it's entirely based on location @@ -84,10 +76,22 @@ /datum/gas_reaction/tritfire/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - /datum/gas/tritium = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT + GAS_TRITIUM = MINIMUM_MOLE_COUNT, + GAS_O2 = MINIMUM_MOLE_COUNT ) +/proc/fire_expose(turf/open/location, datum/gas_mixture/air, temperature) + if(istype(location) && temperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + location.hotspot_expose(temperature, CELL_VOLUME) + for(var/I in location) + var/atom/movable/item = I + item.temperature_expose(air, temperature, CELL_VOLUME) + location.temperature_expose(air, temperature, CELL_VOLUME) + +/proc/radiation_burn(turf/open/location, energy_released) + if(istype(location) && prob(10)) + radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) + /datum/gas_reaction/tritfire/react(datum/gas_mixture/air, datum/holder) var/energy_released = 0 var/old_heat_capacity = air.heat_capacity() @@ -97,20 +101,20 @@ var/turf/open/location = isturf(holder) ? holder : null var/burned_fuel = 0 - if(air.get_moles(/datum/gas/oxygen) < air.get_moles(/datum/gas/tritium)) - burned_fuel = air.get_moles(/datum/gas/oxygen)/TRITIUM_BURN_OXY_FACTOR - air.adjust_moles(/datum/gas/tritium, -burned_fuel) + if(air.get_moles(GAS_O2) < air.get_moles(GAS_TRITIUM)) + burned_fuel = air.get_moles(GAS_O2)/TRITIUM_BURN_OXY_FACTOR + air.adjust_moles(GAS_TRITIUM, -burned_fuel) else - burned_fuel = air.get_moles(/datum/gas/tritium)*TRITIUM_BURN_TRIT_FACTOR - air.adjust_moles(/datum/gas/tritium, -air.get_moles(/datum/gas/tritium)/TRITIUM_BURN_TRIT_FACTOR) - air.adjust_moles(/datum/gas/oxygen,-air.get_moles(/datum/gas/tritium)) + burned_fuel = air.get_moles(GAS_TRITIUM)*TRITIUM_BURN_TRIT_FACTOR + air.adjust_moles(GAS_TRITIUM, -air.get_moles(GAS_TRITIUM)/TRITIUM_BURN_TRIT_FACTOR) + air.adjust_moles(GAS_O2,-air.get_moles(GAS_TRITIUM)) if(burned_fuel) energy_released += (FIRE_HYDROGEN_ENERGY_RELEASED * burned_fuel) if(location && prob(10) && burned_fuel > TRITIUM_MINIMUM_RADIATION_ENERGY) //woah there let's not crash the server radiation_pulse(location, energy_released/TRITIUM_BURN_RADIOACTIVITY_FACTOR) - air.adjust_moles(/datum/gas/water_vapor, burned_fuel/TRITIUM_BURN_OXY_FACTOR) + air.adjust_moles(GAS_H2O, burned_fuel/TRITIUM_BURN_OXY_FACTOR) cached_results["fire"] += burned_fuel @@ -133,8 +137,8 @@ /datum/gas_reaction/tritfire/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/tritium,50) - G.set_moles(/datum/gas/oxygen,50) + G.set_moles(GAS_TRITIUM,50) + G.set_moles(GAS_O2,50) G.set_temperature(500) var/result = G.react() if(result != REACTING) @@ -152,8 +156,8 @@ /datum/gas_reaction/plasmafire/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST, - /datum/gas/plasma = MINIMUM_MOLE_COUNT, - /datum/gas/oxygen = MINIMUM_MOLE_COUNT + GAS_PLASMA = MINIMUM_MOLE_COUNT, + GAS_O2 = MINIMUM_MOLE_COUNT ) /datum/gas_reaction/plasmafire/react(datum/gas_mixture/air, datum/holder) @@ -178,21 +182,21 @@ temperature_scale = (temperature-PLASMA_MINIMUM_BURN_TEMPERATURE)/(PLASMA_UPPER_TEMPERATURE-PLASMA_MINIMUM_BURN_TEMPERATURE) if(temperature_scale > 0) oxygen_burn_rate = OXYGEN_BURN_RATE_BASE - temperature_scale - if(air.get_moles(/datum/gas/oxygen) / air.get_moles(/datum/gas/plasma) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. + if(air.get_moles(GAS_O2) / air.get_moles(GAS_PLASMA) > SUPER_SATURATION_THRESHOLD) //supersaturation. Form Tritium. super_saturation = TRUE - if(air.get_moles(/datum/gas/oxygen) > air.get_moles(/datum/gas/plasma)*PLASMA_OXYGEN_FULLBURN) - plasma_burn_rate = (air.get_moles(/datum/gas/plasma)*temperature_scale)/PLASMA_BURN_RATE_DELTA + if(air.get_moles(GAS_O2) > air.get_moles(GAS_PLASMA)*PLASMA_OXYGEN_FULLBURN) + plasma_burn_rate = (air.get_moles(GAS_PLASMA)*temperature_scale)/PLASMA_BURN_RATE_DELTA else - plasma_burn_rate = (temperature_scale*(air.get_moles(/datum/gas/oxygen)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA + plasma_burn_rate = (temperature_scale*(air.get_moles(GAS_O2)/PLASMA_OXYGEN_FULLBURN))/PLASMA_BURN_RATE_DELTA if(plasma_burn_rate > MINIMUM_HEAT_CAPACITY) - plasma_burn_rate = min(plasma_burn_rate,air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/oxygen)/oxygen_burn_rate) //Ensures matter is conserved properly - air.set_moles(/datum/gas/plasma, QUANTIZE(air.get_moles(/datum/gas/plasma) - plasma_burn_rate)) - air.set_moles(/datum/gas/oxygen, QUANTIZE(air.get_moles(/datum/gas/oxygen) - (plasma_burn_rate * oxygen_burn_rate))) + plasma_burn_rate = min(plasma_burn_rate,air.get_moles(GAS_PLASMA),air.get_moles(GAS_O2)/oxygen_burn_rate) //Ensures matter is conserved properly + air.set_moles(GAS_PLASMA, QUANTIZE(air.get_moles(GAS_PLASMA) - plasma_burn_rate)) + air.set_moles(GAS_O2, QUANTIZE(air.get_moles(GAS_O2) - (plasma_burn_rate * oxygen_burn_rate))) if (super_saturation) - air.adjust_moles(/datum/gas/tritium, plasma_burn_rate) + air.adjust_moles(GAS_TRITIUM, plasma_burn_rate) else - air.adjust_moles(/datum/gas/carbon_dioxide, plasma_burn_rate) + air.adjust_moles(GAS_CO2, plasma_burn_rate) energy_released += FIRE_PLASMA_ENERGY_RELEASED * (plasma_burn_rate) @@ -217,8 +221,8 @@ /datum/gas_reaction/plasmafire/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/plasma,50) - G.set_moles(/datum/gas/oxygen,50) + G.set_moles(GAS_PLASMA,50) + G.set_moles(GAS_O2,50) G.set_volume(1000) G.set_temperature(500) var/result = G.react() @@ -226,21 +230,114 @@ return list("success" = FALSE, "message" = "Reaction didn't go at all!") if(!G.reaction_results["fire"]) return list("success" = FALSE, "message" = "Plasma fires aren't setting fire results correctly!") - if(!G.get_moles(/datum/gas/carbon_dioxide)) + if(!G.get_moles(GAS_CO2)) return list("success" = FALSE, "message" = "Plasma fires aren't making CO2!") G.clear() - G.set_moles(/datum/gas/plasma,10) - G.set_moles(/datum/gas/oxygen,1000) + G.set_moles(GAS_PLASMA,10) + G.set_moles(GAS_O2,1000) G.set_temperature(500) result = G.react() - if(!G.get_moles(/datum/gas/tritium)) + if(!G.get_moles(GAS_TRITIUM)) return list("success" = FALSE, "message" = "Plasma fires aren't making trit!") return ..() +/datum/gas_reaction/genericfire + priority = -3 // very last reaction + name = "Combustion" + id = "genericfire" + +/datum/gas_reaction/genericfire/init_reqs() + var/lowest_fire_temp = INFINITY + var/list/fire_temperatures = GLOB.gas_data.fire_temperatures + for(var/gas in fire_temperatures) + lowest_fire_temp = min(lowest_fire_temp, fire_temperatures[gas]) + var/lowest_oxi_temp = INFINITY + var/list/oxidation_temperatures = GLOB.gas_data.oxidation_temperatures + for(var/gas in oxidation_temperatures) + lowest_oxi_temp = min(lowest_oxi_temp, oxidation_temperatures[gas]) + min_requirements = list( + "TEMP" = max(lowest_oxi_temp, lowest_fire_temp), + "FIRE_REAGENTS" = MINIMUM_MOLE_COUNT + ) + +// no requirements, always runs +// bad idea? maybe +// this is overridden by auxmos but, hey, good idea to have it readable + +/datum/gas_reaction/genericfire/react(datum/gas_mixture/air, datum/holder) + var/temperature = air.return_temperature() + var/list/oxidation_temps = GLOB.gas_data.oxidation_temperatures + var/list/oxidation_rates = GLOB.gas_data.oxidation_rates + var/oxidation_power = 0 + var/list/burn_results = list() + var/list/fuels = list() + var/list/oxidizers = list() + var/list/fuel_rates = GLOB.gas_data.fire_burn_rates + var/list/fuel_temps = GLOB.gas_data.fire_temperatures + var/total_fuel = 0 + var/energy_released = 0 + for(var/G in air.get_gases()) + var/oxidation_temp = oxidation_temps[G] + if(oxidation_temp && oxidation_temp > temperature) + var/temperature_scale = max(0, 1-(temperature / oxidation_temp)) + var/amt = air.get_moles(G) * temperature_scale + oxidizers[G] = amt + oxidation_power += amt * oxidation_rates[G] + else + var/fuel_temp = fuel_temps[G] + if(fuel_temp && fuel_temp > temperature) + var/amt = (air.get_moles(G) / fuel_rates[G]) * max(0, 1-(temperature / fuel_temp)) + fuels[G] = amt // we have to calculate the actual amount we're using after we get all oxidation together + total_fuel += amt + if(oxidation_power <= 0 || total_fuel <= 0) + return NO_REACTION + var/oxidation_ratio = oxidation_power / total_fuel + if(oxidation_ratio > 1) + for(var/oxidizer in oxidizers) + oxidizers[oxidizer] /= oxidation_ratio + else if(oxidation_ratio < 1) + for(var/fuel in fuels) + fuels[fuel] *= oxidation_ratio + fuels += oxidizers + var/list/fire_products = GLOB.gas_data.fire_products + var/list/fire_enthalpies = GLOB.gas_data.fire_enthalpies + for(var/fuel in fuels + oxidizers) + var/amt = fuels[fuel] + if(!burn_results[fuel]) + burn_results[fuel] = 0 + burn_results[fuel] -= amt + energy_released += amt * fire_enthalpies[fuel] + for(var/product in fire_products[fuel]) + if(!burn_results[product]) + burn_results[product] = 0 + burn_results[product] += amt + var/final_energy = air.thermal_energy() + energy_released + for(var/result in burn_results) + air.adjust_moles(result, burn_results[result]) + air.set_temperature(final_energy / air.heat_capacity()) + var/list/cached_results = air.reaction_results + cached_results["fire"] = min(total_fuel, oxidation_power) * 2 + return cached_results["fire"] ? REACTING : NO_REACTION + + //fusion: a terrible idea that was fun but broken. Now reworked to be less broken and more interesting. Again (and again, and again). Again! //Fusion Rework Counter: Please increment this if you make a major overhaul to this system again. //6 reworks +/proc/fusion_ball(datum/holder, reaction_energy, instability) + var/turf/open/location + if (istype(holder,/datum/pipeline)) //Find the tile the reaction is occuring on, or a random part of the network if it's a pipenet. + var/datum/pipeline/fusion_pipenet = holder + location = get_turf(pick(fusion_pipenet.members)) + else + location = get_turf(holder) + if(location) + var/particle_chance = ((PARTICLE_CHANCE_CONSTANT)/(reaction_energy-PARTICLE_CHANCE_CONSTANT)) + 1//Asymptopically approaches 100% as the energy of the reaction goes up. + if(prob(PERCENT(particle_chance))) + location.fire_nuclear_particle() + var/rad_power = max((FUSION_RAD_COEFFICIENT/instability) + FUSION_RAD_MAX,0) + radiation_pulse(location,rad_power) + /datum/gas_reaction/fusion exclude = FALSE priority = 2 @@ -250,9 +347,9 @@ /datum/gas_reaction/fusion/init_reqs() min_requirements = list( "TEMP" = FUSION_TEMPERATURE_THRESHOLD, - /datum/gas/tritium = FUSION_TRITIUM_MOLES_USED, - /datum/gas/plasma = FUSION_MOLE_THRESHOLD, - /datum/gas/carbon_dioxide = FUSION_MOLE_THRESHOLD) + GAS_TRITIUM = FUSION_TRITIUM_MOLES_USED, + GAS_PLASMA = FUSION_MOLE_THRESHOLD, + GAS_CO2 = FUSION_MOLE_THRESHOLD) /datum/gas_reaction/fusion/react(datum/gas_mixture/air, datum/holder) var/turf/open/location @@ -268,12 +365,12 @@ var/list/cached_scan_results = air.analyzer_results var/old_heat_capacity = air.heat_capacity() var/reaction_energy = 0 //Reaction energy can be negative or positive, for both exothermic and endothermic reactions. - var/initial_plasma = air.get_moles(/datum/gas/plasma) - var/initial_carbon = air.get_moles(/datum/gas/carbon_dioxide) + var/initial_plasma = air.get_moles(GAS_PLASMA) + var/initial_carbon = air.get_moles(GAS_CO2) var/scale_factor = (air.return_volume())/(PI) //We scale it down by volume/Pi because for fusion conditions, moles roughly = 2*volume, but we want it to be based off something constant between reactions. var/toroidal_size = (2*PI)+TORADIANS(arctan((air.return_volume()-TOROID_VOLUME_BREAKEVEN)/TOROID_VOLUME_BREAKEVEN)) //The size of the phase space hypertorus var/gas_power = 0 - var/list/gas_fusion_powers = GLOB.meta_gas_fusions + var/list/gas_fusion_powers = GLOB.gas_data.fusion_powers for (var/gas_id in air.get_gases()) gas_power += (gas_fusion_powers[gas_id]*air.get_moles(gas_id)) var/instability = MODULUS((gas_power*INSTABILITY_GAS_POWER_FACTOR)**2,toroidal_size) //Instability effects how chaotic the behavior of the reaction is @@ -287,9 +384,9 @@ carbon = MODULUS(carbon - plasma, toroidal_size) - air.set_moles(/datum/gas/plasma, plasma*scale_factor + FUSION_MOLE_THRESHOLD) //Scales the gases back up - air.set_moles(/datum/gas/carbon_dioxide , carbon*scale_factor + FUSION_MOLE_THRESHOLD) - var/delta_plasma = initial_plasma - air.get_moles(/datum/gas/plasma) + air.set_moles(GAS_PLASMA, plasma*scale_factor + FUSION_MOLE_THRESHOLD) //Scales the gases back up + air.set_moles(GAS_CO2 , carbon*scale_factor + FUSION_MOLE_THRESHOLD) + var/delta_plasma = initial_plasma - air.get_moles(GAS_PLASMA) reaction_energy += delta_plasma*PLASMA_BINDING_ENERGY //Energy is gained or lost corresponding to the creation or destruction of mass. if(instability < FUSION_INSTABILITY_ENDOTHERMALITY) @@ -298,17 +395,17 @@ reaction_energy *= (instability-FUSION_INSTABILITY_ENDOTHERMALITY)**0.5 if(air.thermal_energy() + reaction_energy < 0) //No using energy that doesn't exist. - air.set_moles(/datum/gas/plasma,initial_plasma) - air.set_moles(/datum/gas/carbon_dioxide, initial_carbon) + air.set_moles(GAS_PLASMA,initial_plasma) + air.set_moles(GAS_CO2, initial_carbon) return NO_REACTION - air.adjust_moles(/datum/gas/tritium, -FUSION_TRITIUM_MOLES_USED) + air.adjust_moles(GAS_TRITIUM, -FUSION_TRITIUM_MOLES_USED) //The decay of the tritium and the reaction's energy produces waste gases, different ones depending on whether the reaction is endo or exothermic if(reaction_energy > 0) - air.adjust_moles(/datum/gas/oxygen, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) - air.adjust_moles(/datum/gas/nitrous_oxide, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) + air.adjust_moles(GAS_O2, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) + air.adjust_moles(GAS_NITROUS, FUSION_TRITIUM_MOLES_USED*(reaction_energy*FUSION_TRITIUM_CONVERSION_COEFFICIENT)) else - air.adjust_moles(/datum/gas/bz, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) - air.adjust_moles(/datum/gas/nitryl, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) + air.adjust_moles(GAS_BZ, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) + air.adjust_moles(GAS_NITRYL, FUSION_TRITIUM_MOLES_USED*(reaction_energy*-FUSION_TRITIUM_CONVERSION_COEFFICIENT)) if(reaction_energy) if(location) @@ -325,10 +422,10 @@ /datum/gas_reaction/fusion/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/carbon_dioxide,300) - G.set_moles(/datum/gas/plasma,1000) - G.set_moles(/datum/gas/tritium,100.61) - G.set_moles(/datum/gas/nitryl,1) + G.set_moles(GAS_CO2,300) + G.set_moles(GAS_PLASMA,1000) + G.set_moles(GAS_TRITIUM,100.61) + G.set_moles(GAS_NITRYL,1) G.set_temperature(15000) G.set_volume(1000) var/result = G.react() @@ -337,11 +434,11 @@ if(abs(G.analyzer_results["fusion"] - 3) > 0.0000001) var/instability = G.analyzer_results["fusion"] return list("success" = FALSE, "message" = "Fusion is not calculating analyzer results correctly, should be 3.000000045, is instead [instability]") - if(abs(G.get_moles(/datum/gas/plasma) - 850.616) > 0.5) - var/plas = G.get_moles(/datum/gas/plasma) + if(abs(G.get_moles(GAS_PLASMA) - 850.616) > 0.5) + var/plas = G.get_moles(GAS_PLASMA) return list("success" = FALSE, "message" = "Fusion is not calculating plasma correctly, should be 850.616, is instead [plas]") - if(abs(G.get_moles(/datum/gas/carbon_dioxide) - 1699.384) > 0.5) - var/co2 = G.get_moles(/datum/gas/carbon_dioxide) + if(abs(G.get_moles(GAS_CO2) - 1699.384) > 0.5) + var/co2 = G.get_moles(GAS_CO2) return list("success" = FALSE, "message" = "Fusion is not calculating co2 correctly, should be 1699.384, is instead [co2]") if(abs(G.return_temperature() - 27600) > 200) // calculating this manually sucks dude var/temp = G.return_temperature() @@ -355,9 +452,9 @@ /datum/gas_reaction/nitrylformation/init_reqs() min_requirements = list( - /datum/gas/oxygen = 20, - /datum/gas/nitrogen = 20, - /datum/gas/nitrous_oxide = 5, + GAS_O2 = 20, + GAS_N2 = 20, + GAS_NITROUS = 5, "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST*25 ) @@ -365,13 +462,13 @@ var/temperature = air.return_temperature() var/old_heat_capacity = air.heat_capacity() - var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),air.get_moles(/datum/gas/oxygen),air.get_moles(/datum/gas/nitrogen)) + var/heat_efficency = min(temperature/(FIRE_MINIMUM_TEMPERATURE_TO_EXIST*100),air.get_moles(GAS_O2),air.get_moles(GAS_N2)) var/energy_used = heat_efficency*NITRYL_FORMATION_ENERGY - if ((air.get_moles(/datum/gas/oxygen) - heat_efficency < 0 )|| (air.get_moles(/datum/gas/nitrogen) - heat_efficency < 0)) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_O2) - heat_efficency < 0 )|| (air.get_moles(GAS_N2) - heat_efficency < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/oxygen, -heat_efficency) - air.adjust_moles(/datum/gas/nitrogen, -heat_efficency) - air.adjust_moles(/datum/gas/nitryl, heat_efficency*2) + air.adjust_moles(GAS_O2, -heat_efficency) + air.adjust_moles(GAS_N2, -heat_efficency) + air.adjust_moles(GAS_NITRYL, heat_efficency*2) if(energy_used > 0) var/new_heat_capacity = air.heat_capacity() @@ -381,15 +478,15 @@ /datum/gas_reaction/nitrylformation/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/oxygen,30) - G.set_moles(/datum/gas/nitrogen,30) - G.set_moles(/datum/gas/nitrous_oxide,10) + G.set_moles(GAS_O2,30) + G.set_moles(GAS_N2,30) + G.set_moles(GAS_NITROUS,10) G.set_volume(1000) G.set_temperature(150000) var/result = G.react() if(result != REACTING) return list("success" = FALSE, "message" = "Reaction didn't go at all!") - if(!G.get_moles(/datum/gas/nitryl) < 0.8) + if(!G.get_moles(GAS_NITRYL) < 0.8) return list("success" = FALSE, "message" = "Nitryl isn't being generated correctly!") return ..() @@ -400,8 +497,8 @@ /datum/gas_reaction/bzformation/init_reqs() min_requirements = list( - /datum/gas/nitrous_oxide = 10, - /datum/gas/plasma = 10 + GAS_NITROUS = 10, + GAS_PLASMA = 10 ) @@ -409,16 +506,16 @@ var/temperature = air.return_temperature() var/pressure = air.return_pressure() var/old_heat_capacity = air.heat_capacity() - var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(air.get_moles(/datum/gas/plasma)/air.get_moles(/datum/gas/nitrous_oxide),1))),air.get_moles(/datum/gas/nitrous_oxide),air.get_moles(/datum/gas/plasma)/2) + var/reaction_efficency = min(1/((pressure/(0.1*ONE_ATMOSPHERE))*(max(air.get_moles(GAS_PLASMA)/air.get_moles(GAS_NITROUS),1))),air.get_moles(GAS_NITROUS),air.get_moles(GAS_PLASMA)/2) var/energy_released = 2*reaction_efficency*FIRE_CARBON_ENERGY_RELEASED - if ((air.get_moles(/datum/gas/nitrous_oxide) - reaction_efficency < 0 )|| (air.get_moles(/datum/gas/plasma) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_NITROUS) - reaction_efficency < 0 )|| (air.get_moles(GAS_PLASMA) - (2*reaction_efficency) < 0) || energy_released <= 0) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/bz, reaction_efficency) - if(reaction_efficency == air.get_moles(/datum/gas/nitrous_oxide)) - air.adjust_moles(/datum/gas/bz, -min(pressure,1)) - air.adjust_moles(/datum/gas/oxygen, min(pressure,1)) - air.adjust_moles(/datum/gas/nitrous_oxide, -reaction_efficency) - air.adjust_moles(/datum/gas/plasma, -2*reaction_efficency) + air.adjust_moles(GAS_BZ, reaction_efficency) + if(reaction_efficency == air.get_moles(GAS_NITROUS)) + air.adjust_moles(GAS_BZ, -min(pressure,1)) + air.adjust_moles(GAS_O2, min(pressure,1)) + air.adjust_moles(GAS_NITROUS, -reaction_efficency) + air.adjust_moles(GAS_PLASMA, -2*reaction_efficency) SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, min((reaction_efficency**2)*BZ_RESEARCH_SCALE),BZ_RESEARCH_MAX_AMOUNT) @@ -430,14 +527,14 @@ /datum/gas_reaction/bzformation/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/plasma,15) - G.set_moles(/datum/gas/nitrous_oxide,15) + G.set_moles(GAS_PLASMA,15) + G.set_moles(GAS_NITROUS,15) G.set_volume(1000) G.set_temperature(10) var/result = G.react() if(result != REACTING) return list("success" = FALSE, "message" = "Reaction didn't go at all!") - if(!G.get_moles(/datum/gas/bz) < 4) // efficiency is 4.0643 and bz generation == efficiency + if(!G.get_moles(GAS_BZ) < 4) // efficiency is 4.0643 and bz generation == efficiency return list("success" = FALSE, "message" = "Nitryl isn't being generated correctly!") return ..() @@ -448,23 +545,23 @@ /datum/gas_reaction/stimformation/init_reqs() min_requirements = list( - /datum/gas/tritium = 30, - /datum/gas/plasma = 10, - /datum/gas/bz = 20, - /datum/gas/nitryl = 30, + GAS_TRITIUM = 30, + GAS_PLASMA = 10, + GAS_BZ = 20, + GAS_NITRYL = 30, "TEMP" = STIMULUM_HEAT_SCALE/2) /datum/gas_reaction/stimformation/react(datum/gas_mixture/air) var/old_heat_capacity = air.heat_capacity() - var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(/datum/gas/tritium),air.get_moles(/datum/gas/plasma),air.get_moles(/datum/gas/nitryl)) + var/heat_scale = min(air.return_temperature()/STIMULUM_HEAT_SCALE,air.get_moles(GAS_TRITIUM),air.get_moles(GAS_PLASMA),air.get_moles(GAS_NITRYL)) var/stim_energy_change = heat_scale + STIMULUM_FIRST_RISE*(heat_scale**2) - STIMULUM_FIRST_DROP*(heat_scale**3) + STIMULUM_SECOND_RISE*(heat_scale**4) - STIMULUM_ABSOLUTE_DROP*(heat_scale**5) - if ((air.get_moles(/datum/gas/tritium) - heat_scale < 0 )|| (air.get_moles(/datum/gas/plasma) - heat_scale < 0) || (air.get_moles(/datum/gas/nitryl) - heat_scale < 0)) //Shouldn't produce gas from nothing. + if ((air.get_moles(GAS_TRITIUM) - heat_scale < 0 )|| (air.get_moles(GAS_PLASMA) - heat_scale < 0) || (air.get_moles(GAS_NITRYL) - heat_scale < 0)) //Shouldn't produce gas from nothing. return NO_REACTION - air.adjust_moles(/datum/gas/stimulum, heat_scale/10) - air.adjust_moles(/datum/gas/tritium, -heat_scale) - air.adjust_moles(/datum/gas/plasma, -heat_scale) - air.adjust_moles(/datum/gas/nitryl, -heat_scale) + air.adjust_moles(GAS_STIMULUM, heat_scale/10) + air.adjust_moles(GAS_TRITIUM, -heat_scale) + air.adjust_moles(GAS_PLASMA, -heat_scale) + air.adjust_moles(GAS_NITRYL, -heat_scale) SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, STIMULUM_RESEARCH_AMOUNT*max(stim_energy_change,0)) if(stim_energy_change) @@ -476,17 +573,17 @@ /datum/gas_reaction/stimformation/test() //above mentioned "strange pattern" is a basic quintic polynomial, it's fine, can calculate it manually var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/bz,30) - G.set_moles(/datum/gas/plasma,1000) - G.set_moles(/datum/gas/tritium,1000) - G.set_moles(/datum/gas/nitryl,1000) + G.set_moles(GAS_BZ,30) + G.set_moles(GAS_PLASMA,1000) + G.set_moles(GAS_TRITIUM,1000) + G.set_moles(GAS_NITRYL,1000) G.set_volume(1000) G.set_temperature(12998000) // yeah, really var/result = G.react() if(result != REACTING) return list("success" = FALSE, "message" = "Reaction didn't go at all!") - if(!G.get_moles(/datum/gas/stimulum) < 900) + if(!G.get_moles(GAS_STIMULUM) < 900) return list("success" = FALSE, "message" = "Stimulum isn't being generated correctly!") return ..() @@ -497,19 +594,19 @@ /datum/gas_reaction/nobliumformation/init_reqs() min_requirements = list( - /datum/gas/nitrogen = 10, - /datum/gas/tritium = 5, + GAS_N2 = 10, + GAS_TRITIUM = 5, "ENER" = NOBLIUM_FORMATION_ENERGY) /datum/gas_reaction/nobliumformation/react(datum/gas_mixture/air) var/old_heat_capacity = air.heat_capacity() - var/nob_formed = min((air.get_moles(/datum/gas/nitrogen)+air.get_moles(/datum/gas/tritium))/100,air.get_moles(/datum/gas/tritium)/10,air.get_moles(/datum/gas/nitrogen)/20) - var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(/datum/gas/bz),1))) - if ((air.get_moles(/datum/gas/tritium) - 10*nob_formed < 0) || (air.get_moles(/datum/gas/nitrogen) - 20*nob_formed < 0)) + var/nob_formed = min((air.get_moles(GAS_N2)+air.get_moles(GAS_TRITIUM))/100,air.get_moles(GAS_TRITIUM)/10,air.get_moles(GAS_N2)/20) + var/energy_taken = nob_formed*(NOBLIUM_FORMATION_ENERGY/(max(air.get_moles(GAS_BZ),1))) + if ((air.get_moles(GAS_TRITIUM) - 10*nob_formed < 0) || (air.get_moles(GAS_N2) - 20*nob_formed < 0)) return NO_REACTION - air.adjust_moles(/datum/gas/tritium, -10*nob_formed) - air.adjust_moles(/datum/gas/nitrogen, -20*nob_formed) - air.adjust_moles(/datum/gas/hypernoblium,nob_formed) + air.adjust_moles(GAS_TRITIUM, -10*nob_formed) + air.adjust_moles(GAS_N2, -20*nob_formed) + air.adjust_moles(GAS_HYPERNOB,nob_formed) SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, nob_formed*NOBLIUM_RESEARCH_AMOUNT) @@ -520,8 +617,8 @@ /datum/gas_reaction/nobliumformation/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/nitrogen,100) - G.set_moles(/datum/gas/tritium,500) + G.set_moles(GAS_N2,100) + G.set_moles(GAS_TRITIUM,500) G.set_volume(1000) G.set_temperature(5000000) // yeah, really var/result = G.react() @@ -540,18 +637,18 @@ /datum/gas_reaction/miaster/init_reqs() min_requirements = list( "TEMP" = FIRE_MINIMUM_TEMPERATURE_TO_EXIST+70, - /datum/gas/miasma = MINIMUM_MOLE_COUNT + GAS_MIASMA = MINIMUM_MOLE_COUNT ) /datum/gas_reaction/miaster/react(datum/gas_mixture/air, datum/holder) // As the name says it, it needs to be dry - if(air.get_moles(/datum/gas/water_vapor) && air.get_moles(/datum/gas/water_vapor)/air.total_moles() > 0.1) + if(air.get_moles(GAS_H2O) && air.get_moles(GAS_H2O)/air.total_moles() > 0.1) return //Replace miasma with oxygen - var/cleaned_air = min(air.get_moles(/datum/gas/miasma), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) - air.adjust_moles(/datum/gas/miasma, -cleaned_air) - air.adjust_moles(/datum/gas/oxygen, cleaned_air) + var/cleaned_air = min(air.get_moles(GAS_MIASMA), 20 + (air.return_temperature() - FIRE_MINIMUM_TEMPERATURE_TO_EXIST - 70) / 20) + air.adjust_moles(GAS_MIASMA, -cleaned_air) + air.adjust_moles(GAS_O2, cleaned_air) //Possibly burning a bit of organic matter through maillard reaction, so a *tiny* bit more heat would be understandable air.set_temperature(air.return_temperature() + cleaned_air * 0.002) @@ -559,16 +656,16 @@ /datum/gas_reaction/miaster/test() var/datum/gas_mixture/G = new - G.set_moles(/datum/gas/miasma,1) + G.set_moles(GAS_MIASMA,1) G.set_volume(1000) G.set_temperature(450) var/result = G.react() if(result != REACTING) return list("success" = FALSE, "message" = "Reaction didn't go at all!") G.clear() - G.set_moles(/datum/gas/miasma,1) + G.set_moles(GAS_MIASMA,1) G.set_temperature(450) - G.set_moles(/datum/gas/water_vapor,0.5) + G.set_moles(GAS_H2O,0.5) result = G.react() if(result != NO_REACTION) return list("success" = FALSE, "message" = "Miasma sterilization not stopping due to water vapor correctly!") diff --git a/code/modules/atmospherics/gasmixtures/zextools_broke.dm b/code/modules/atmospherics/gasmixtures/zextools_broke.dm index eef6933edb..fe7b1c462b 100644 --- a/code/modules/atmospherics/gasmixtures/zextools_broke.dm +++ b/code/modules/atmospherics/gasmixtures/zextools_broke.dm @@ -9,14 +9,14 @@ /datum/gas_mixture/heat_capacity() //joules per kelvin var/list/cached_gases = gases - var/list/cached_gasheats = GLOB.meta_gas_specific_heats + var/list/cached_gasheats = GLOB.gas_data.specific_heats . = 0 for(var/id in cached_gases) . += cached_gases[id] * cached_gasheats[id] /datum/gas_mixture/turf/heat_capacity() // Same as above except vacuums return HEAT_CAPACITY_VACUUM var/list/cached_gases = gases - var/list/cached_gasheats = GLOB.meta_gas_specific_heats + var/list/cached_gasheats = GLOB.gas_data.specific_heats for(var/id in cached_gases) . += cached_gases[id] * cached_gasheats[id] if(!.) @@ -56,20 +56,20 @@ return gases[gas_type] /datum/gas_mixture/set_moles(gas_type, moles) gases[gas_type] = moles -/datum/gas_mixture/scrub_into(datum/gas_mixture/target, list/gases) +/datum/gas_mixture/scrub_into(datum/gas_mixture/target, ratio, list/gases) if(isnull(target)) return FALSE - var/list/removed_gases = target.gases + var/list/removed_gases = gases //Filter it var/datum/gas_mixture/filtered_out = new var/list/filtered_gases = filtered_out.gases filtered_out.temperature = removed.temperature for(var/gas in filter_types & removed_gases) - filtered_gases[gas] = removed_gases[gas] - removed_gases[gas] = 0 - merge(filtered_out) + filtered_gases[gas] = removed_gases[gas] * ratio + removed_gases[gas] = removed_gases[gas] * (1 - ratio) + target.merge(filtered_out) /datum/gas_mixture/mark_immutable() return /datum/gas_mixture/get_gases() @@ -208,7 +208,7 @@ var/delta var/gas_heat_capacity //and also cache this shit rq because that results in sanic speed for reasons byond explanation - var/list/cached_gasheats = GLOB.meta_gas_specific_heats + var/list/cached_gasheats = GLOB.gas_data.specific_heats //GAS TRANSFER for(var/id in cached_gases | sharer_gases) // transfer gases diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index c63797282d..806126e684 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -94,63 +94,63 @@ var/list/TLV = list( // Breathable air. "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C, T0C+10, T0C+40, T0C+66), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv(-1, -1, 2, 5), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects - /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires - /datum/gas/methane = new/datum/tlv(-1, -1, 3, 6), - /datum/gas/methyl_bromide = new/datum/tlv/dangerous + GAS_O2 = new/datum/tlv(16, 19, 40, 50), // Partial pressure, kpa + GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + GAS_MIASMA = new/datum/tlv(-1, -1, 2, 5), + GAS_PLASMA = new/datum/tlv/dangerous, + GAS_NITROUS = new/datum/tlv/dangerous, + GAS_BZ = new/datum/tlv/dangerous, + GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + GAS_H2O = new/datum/tlv/dangerous, + GAS_TRITIUM = new/datum/tlv/dangerous, + GAS_STIMULUM = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects + GAS_NITRYL = new/datum/tlv/dangerous, + GAS_PLUOXIUM = new/datum/tlv(-1, -1, 5, 6), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + GAS_METHANE = new/datum/tlv(-1, -1, 3, 6), + GAS_METHYL_BROMIDE = new/datum/tlv/dangerous ) /obj/machinery/airalarm/server // No checks here. TLV = list( "pressure" = new/datum/tlv/no_checks, "temperature" = new/datum/tlv/no_checks, - /datum/gas/oxygen = new/datum/tlv/no_checks, - /datum/gas/nitrogen = new/datum/tlv/no_checks, - /datum/gas/carbon_dioxide = new/datum/tlv/no_checks, - /datum/gas/miasma = new/datum/tlv/no_checks, - /datum/gas/plasma = new/datum/tlv/no_checks, - /datum/gas/nitrous_oxide = new/datum/tlv/no_checks, - /datum/gas/bz = new/datum/tlv/no_checks, - /datum/gas/hypernoblium = new/datum/tlv/no_checks, - /datum/gas/water_vapor = new/datum/tlv/no_checks, - /datum/gas/tritium = new/datum/tlv/no_checks, - /datum/gas/stimulum = new/datum/tlv/no_checks, - /datum/gas/nitryl = new/datum/tlv/no_checks, - /datum/gas/pluoxium = new/datum/tlv/no_checks, - /datum/gas/methane = new/datum/tlv/no_checks, - /datum/gas/methyl_bromide = new/datum/tlv/no_checks + GAS_O2 = new/datum/tlv/no_checks, + GAS_N2 = new/datum/tlv/no_checks, + GAS_CO2 = new/datum/tlv/no_checks, + GAS_MIASMA = new/datum/tlv/no_checks, + GAS_PLASMA = new/datum/tlv/no_checks, + GAS_NITROUS = new/datum/tlv/no_checks, + GAS_BZ = new/datum/tlv/no_checks, + GAS_HYPERNOB = new/datum/tlv/no_checks, + GAS_H2O = new/datum/tlv/no_checks, + GAS_TRITIUM = new/datum/tlv/no_checks, + GAS_STIMULUM = new/datum/tlv/no_checks, + GAS_NITRYL = new/datum/tlv/no_checks, + GAS_PLUOXIUM = new/datum/tlv/no_checks, + GAS_METHANE = new/datum/tlv/no_checks, + GAS_METHYL_BROMIDE = new/datum/tlv/no_checks ) /obj/machinery/airalarm/kitchen_cold_room // Copypasta: to check temperatures. TLV = list( "pressure" = new/datum/tlv(ONE_ATMOSPHERE * 0.8, ONE_ATMOSPHERE* 0.9, ONE_ATMOSPHERE * 1.1, ONE_ATMOSPHERE * 1.2), // kPa "temperature" = new/datum/tlv(T0C-73.15, T0C-63.15, T0C, T0C+10), - /datum/gas/oxygen = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa - /datum/gas/nitrogen = new/datum/tlv(-1, -1, 1000, 1000), - /datum/gas/carbon_dioxide = new/datum/tlv(-1, -1, 5, 10), - /datum/gas/miasma = new/datum/tlv/(-1, -1, 2, 5), - /datum/gas/plasma = new/datum/tlv/dangerous, - /datum/gas/nitrous_oxide = new/datum/tlv/dangerous, - /datum/gas/bz = new/datum/tlv/dangerous, - /datum/gas/hypernoblium = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic - /datum/gas/water_vapor = new/datum/tlv/dangerous, - /datum/gas/tritium = new/datum/tlv/dangerous, - /datum/gas/stimulum = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects - /datum/gas/nitryl = new/datum/tlv/dangerous, - /datum/gas/pluoxium = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires - /datum/gas/methane = new/datum/tlv(-1, -1, 3, 6), - /datum/gas/methyl_bromide = new/datum/tlv/dangerous + GAS_O2 = new/datum/tlv(16, 19, 135, 140), // Partial pressure, kpa + GAS_N2 = new/datum/tlv(-1, -1, 1000, 1000), + GAS_CO2 = new/datum/tlv(-1, -1, 5, 10), + GAS_MIASMA = new/datum/tlv/(-1, -1, 2, 5), + GAS_PLASMA = new/datum/tlv/dangerous, + GAS_NITROUS = new/datum/tlv/dangerous, + GAS_BZ = new/datum/tlv/dangerous, + GAS_HYPERNOB = new/datum/tlv(-1, -1, 1000, 1000), // Hyper-Noblium is inert and nontoxic + GAS_H2O = new/datum/tlv/dangerous, + GAS_TRITIUM = new/datum/tlv/dangerous, + GAS_STIMULUM = new/datum/tlv(-1, -1, 1000, 1000), // Stimulum has only positive effects + GAS_NITRYL = new/datum/tlv/dangerous, + GAS_PLUOXIUM = new/datum/tlv(-1, -1, 1000, 1000), // Unlike oxygen, pluoxium does not fuel plasma/tritium fires + GAS_METHANE = new/datum/tlv(-1, -1, 3, 6), + GAS_METHYL_BROMIDE = new/datum/tlv/dangerous ) /obj/machinery/airalarm/unlocked @@ -298,7 +298,7 @@ continue cur_tlv = TLV[gas_id] data["environment_data"] += list(list( - "name" = GLOB.meta_gas_names[gas_id], + "name" = GLOB.gas_data.names[gas_id], "value" = environment.get_moles(gas_id) / total_moles * 100, "unit" = "%", "danger_level" = cur_tlv.get_danger_level(environment.get_moles(gas_id) * partial_pressure) @@ -368,11 +368,11 @@ thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max1", "selected" = selected.max1)) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = "max2", "selected" = selected.max2)) - for(var/gas_id in GLOB.meta_gas_names) + for(var/gas_id in GLOB.gas_data.names) if(!(gas_id in TLV)) // We're not interested in this gas, it seems. continue selected = TLV[gas_id] - thresholds += list(list("name" = GLOB.meta_gas_names[gas_id], "settings" = list())) + thresholds += list(list("name" = GLOB.gas_data.names[gas_id], "settings" = list())) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min2", "selected" = selected.min2)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "min1", "selected" = selected.min1)) thresholds[thresholds.len]["settings"] += list(list("env" = gas_id, "val" = "max1", "selected" = selected.max1)) @@ -532,7 +532,7 @@ for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma), + "set_filters" = list(GAS_CO2, GAS_MIASMA), "scrubbing" = 1, "widenet" = 0, )) @@ -547,19 +547,19 @@ send_signal(device_id, list( "power" = 1, "set_filters" = list( - /datum/gas/carbon_dioxide, - /datum/gas/miasma, - /datum/gas/plasma, - /datum/gas/water_vapor, - /datum/gas/hypernoblium, - /datum/gas/nitrous_oxide, - /datum/gas/nitryl, - /datum/gas/tritium, - /datum/gas/bz, - /datum/gas/stimulum, - /datum/gas/pluoxium, - /datum/gas/methane, - /datum/gas/methyl_bromide + GAS_CO2, + GAS_MIASMA, + GAS_PLASMA, + GAS_H2O, + GAS_HYPERNOB, + GAS_NITROUS, + GAS_NITRYL, + GAS_TRITIUM, + GAS_BZ, + GAS_STIMULUM, + GAS_PLUOXIUM, + GAS_METHANE, + GAS_METHYL_BROMIDE ), "scrubbing" = 1, "widenet" = 1, @@ -587,7 +587,7 @@ for(var/device_id in A.air_scrub_names) send_signal(device_id, list( "power" = 1, - "set_filters" = list(/datum/gas/carbon_dioxide, /datum/gas/miasma), + "set_filters" = list(GAS_CO2, GAS_MIASMA), "scrubbing" = 1, "widenet" = 0, )) diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index 7f4a8cd794..6f45599463 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -39,6 +39,7 @@ var/construction_type var/pipe_state //icon_state as a pipe item var/on = FALSE + var/interacts_with_air = FALSE /obj/machinery/atmospherics/examine(mob/user) . = ..() @@ -57,7 +58,10 @@ armor = list("melee" = 25, "bullet" = 10, "laser" = 10, "energy" = 100, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 100, "acid" = 70) ..() if(process) - SSair.atmos_machinery += src + if(interacts_with_air) + SSair.atmos_air_machinery += src + else + SSair.atmos_machinery += src SetInitDirections() /obj/machinery/atmospherics/Destroy() @@ -65,6 +69,7 @@ nullifyNode(i) SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src SSair.pipenets_needing_rebuilt -= src dropContents() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm index d1bb58b99a..4dd7b672a7 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/dp_vent_pump.dm @@ -15,6 +15,9 @@ desc = "Has a valve and pump attached to it. There are two ports." level = 1 + + interacts_with_air = TRUE + var/frequency = 0 var/id = null var/datum/radio_frequency/radio_connection @@ -69,12 +72,7 @@ if(air1.return_temperature() > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - //Removed can be null if there is no atmosphere in air1 - if(!removed) - return - - loc.assume_air(removed) + loc.assume_air_moles(air1, transfer_moles) air_update_turf() var/datum/pipeline/parent1 = parents[1] @@ -90,11 +88,7 @@ moles_delta = min(moles_delta, (input_pressure_min - air2.return_pressure()) * our_multiplier) if(moles_delta > 0) - var/datum/gas_mixture/removed = loc.remove_air(moles_delta) - if (isnull(removed)) // in space - return - - air2.merge(removed) + loc.transfer_air(air2, moles_delta) air_update_turf() var/datum/pipeline/parent2 = parents[2] diff --git a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm index eb00e432b7..dc5a6eccd4 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/pump.dm @@ -81,9 +81,7 @@ var/pressure_delta = target_pressure - output_starting_pressure var/transfer_moles = pressure_delta*air2.return_volume()/(air1.return_temperature() * R_IDEAL_GAS_EQUATION) - //Actually transfer the gas - var/datum/gas_mixture/removed = air1.remove(transfer_moles) - air2.merge(removed) + air1.transfer_to(air2,transfer_moles) update_parents() diff --git a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm index 1b049322a1..46d584339b 100644 --- a/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm +++ b/code/modules/atmospherics/machinery/components/binary_devices/volume_pump.dm @@ -67,9 +67,7 @@ var/transfer_ratio = transfer_rate/air1.return_volume() - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - - air2.merge(removed) + air1.transfer_ratio_to(air2,transfer_ratio) update_parents() diff --git a/code/modules/atmospherics/machinery/components/components_base.dm b/code/modules/atmospherics/machinery/components/components_base.dm index b6911a1709..f8866877fe 100644 --- a/code/modules/atmospherics/machinery/components/components_base.dm +++ b/code/modules/atmospherics/machinery/components/components_base.dm @@ -120,14 +120,9 @@ times_lost++ var/shared_loss = lost/times_lost - var/datum/gas_mixture/to_release for(var/i in 1 to device_type) var/datum/gas_mixture/air = airs[i] - if(!to_release) - to_release = air.remove(shared_loss) - continue - to_release.merge(air.remove(shared_loss)) - T.assume_air(to_release) + T.assume_air_moles(air, shared_loss) air_update_turf(1) /obj/machinery/atmospherics/components/proc/safe_input(var/title, var/text, var/default_set) diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm index 11c54409f6..4182f5ceca 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/filter.dm @@ -98,33 +98,11 @@ //Actually transfer the gas if(transfer_ratio > 0) - var/datum/gas_mixture/removed = air1.remove_ratio(transfer_ratio) - - if(!removed) - return - - var/filtering = TRUE - if(!ispath(filter_type)) - if(filter_type) - filter_type = gas_id2path(filter_type) //support for mappers so they don't need to type out paths - else - filtering = FALSE - - if(filtering && removed.get_moles(filter_type)) - var/datum/gas_mixture/filtered_out = new - - filtered_out.set_temperature(removed.return_temperature()) - filtered_out.set_moles(filter_type, removed.get_moles(filter_type)) - - removed.set_moles(filter_type, 0) - - var/datum/gas_mixture/target = (air2.return_pressure() < 9000 ? air2 : air1) - target.merge(filtered_out) + if(filter_type && air2.return_pressure() <= 9000) + air1.scrub_into(air2, transfer_ratio, list(filter_type)) if(air3.return_pressure() <= 9000) - air3.merge(removed) - else - air1.merge(removed) // essentially just leaving it in + air1.transfer_ratio_to(air3, transfer_ratio) update_parents() @@ -145,9 +123,9 @@ data["max_rate"] = round(MAX_TRANSFER_RATE) data["filter_types"] = list() - data["filter_types"] += list(list("name" = "Nothing", "path" = "", "selected" = !filter_type)) - for(var/path in GLOB.meta_gas_ids) - data["filter_types"] += list(list("name" = GLOB.meta_gas_names[path], "id" = GLOB.meta_gas_ids[path], "selected" = (path == gas_id2path(filter_type)))) + data["filter_types"] += list(list("name" = "Nothing", "id" = "", "selected" = !filter_type)) + for(var/id in GLOB.gas_data.ids) + data["filter_types"] += list(list("name" = GLOB.gas_data.names[id], "id" = id, "selected" = (id == filter_type))) return data @@ -177,10 +155,10 @@ if("filter") filter_type = null var/filter_name = "nothing" - var/gas = gas_id2path(params["mode"]) - if(gas in GLOB.meta_gas_names) + var/gas = params["mode"] + if(gas in GLOB.gas_data.names) filter_type = gas - filter_name = GLOB.meta_gas_names[gas] + filter_name = GLOB.gas_data.names[gas] investigate_log("was set to filter [filter_name] by [key_name(usr)]", INVESTIGATE_ATMOS) . = TRUE update_icon() diff --git a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm index 7dac6d540e..3296981e5e 100644 --- a/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm +++ b/code/modules/atmospherics/machinery/components/trinary_devices/mixer.dm @@ -110,14 +110,12 @@ //Actually transfer the gas if(transfer_moles1) - var/datum/gas_mixture/removed1 = air1.remove(transfer_moles1) - air3.merge(removed1) + air1.transfer_to(air3, transfer_moles1) var/datum/pipeline/parent1 = parents[1] parent1.update = TRUE if(transfer_moles2) - var/datum/gas_mixture/removed2 = air2.remove(transfer_moles2) - air3.merge(removed2) + air2.transfer_to(air3, transfer_moles2) var/datum/pipeline/parent2 = parents[2] parent2.update = TRUE diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index cf2cdd80a7..efafc1c9a8 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -210,7 +210,7 @@ if(reagent_transfer == 0) // Magically transfer reagents. Because cryo magic. beaker.reagents.trans_to(occupant, 1, efficiency * 0.25) // Transfer reagents. beaker.reagents.reaction(occupant, VAPOR) - air1.adjust_moles(/datum/gas/oxygen, -max(0,air1.get_moles(/datum/gas/oxygen) - 2 / efficiency)) //Let's use gas for this + air1.adjust_moles(GAS_O2, -max(0,air1.get_moles(GAS_O2) - 2 / efficiency)) //Let's use gas for this if(++reagent_transfer >= 10 * efficiency) // Throttle reagent transfer (higher efficiency will transfer the same amount but consume less from the beaker). reagent_transfer = 0 @@ -224,7 +224,7 @@ var/datum/gas_mixture/air1 = airs[1] - if(!nodes[1] || !airs[1] || air1.get_moles(/datum/gas/oxygen) < 5) // Turn off if the machine won't work. + if(!nodes[1] || !airs[1] || air1.get_moles(GAS_O2) < 5) // Turn off if the machine won't work. on = FALSE update_icon() return @@ -439,7 +439,7 @@ return // we don't see the pipe network while inside cryo. /obj/machinery/atmospherics/components/unary/cryo_cell/get_remote_view_fullscreens(mob/user) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) /obj/machinery/atmospherics/components/unary/cryo_cell/can_crawl_through() return // can't ventcrawl in or out of cryo. diff --git a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm index 9aa3c8c16d..b2fa26edba 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/outlet_injector.dm @@ -16,6 +16,7 @@ var/datum/radio_frequency/radio_connection level = 1 + interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "injector" @@ -65,11 +66,7 @@ var/datum/gas_mixture/air_contents = airs[1] if(air_contents.return_temperature() > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) + loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) air_update_turf() update_parents() @@ -84,9 +81,7 @@ injecting = 1 if(air_contents.return_temperature() > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - loc.assume_air(removed) + loc.assume_air_ratio(air_contents, volume_rate / air_contents.return_volume()) update_parents() flick("inje_inject", src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm index 3f5bb818ce..7cfdb9d63c 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/passive_vent.dm @@ -6,6 +6,7 @@ can_unwrench = TRUE level = 1 + interacts_with_air = TRUE layer = GAS_SCRUBBER_LAYER pipe_state = "pvent" @@ -29,23 +30,10 @@ var/pressure_delta = abs(external_pressure - internal_pressure) if(pressure_delta > 0.5) - if(external_pressure < internal_pressure) - var/air_temperature = (external.return_temperature() > 0) ? external.return_temperature() : internal.return_temperature() - var/transfer_moles = (pressure_delta * external.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = internal.remove(transfer_moles) - external.merge(removed) - else - var/air_temperature = (internal.return_temperature() > 0) ? internal.return_temperature() : external.return_temperature() - var/transfer_moles = (pressure_delta * internal.return_volume()) / (air_temperature * R_IDEAL_GAS_EQUATION) - transfer_moles = min(transfer_moles, external.total_moles() * internal.return_volume() / external.return_volume()) - var/datum/gas_mixture/removed = external.remove(transfer_moles) - if(isnull(removed)) - return - internal.merge(removed) - + equalize_all_gases_in_list(list(internal,external)) active = TRUE - active = internal.temperature_share(external, OPEN_HEAT_TRANSFER_COEFFICIENT) ? TRUE : active + active = internal.temperature_share(external, OPEN_HEAT_TRANSFER_COEFFICIENT) || active if(active) air_update_turf() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm index f0d0d1d856..ee4223b157 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/relief_valve.dm @@ -5,6 +5,7 @@ icon_state = "relief_valve-e-map" can_unwrench = TRUE interaction_flags_machine = INTERACT_MACHINE_OFFLINE | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_SET_MACHINE + interacts_with_air = TRUE var/opened = FALSE var/open_pressure = ONE_ATMOSPHERE * 3 var/close_pressure = ONE_ATMOSPHERE @@ -49,14 +50,11 @@ else if(!opened && our_pressure >= open_pressure) opened = TRUE update_icon_nopipes() - if(opened && air_contents.return_temperature() > 0) + if(opened) var/datum/gas_mixture/environment = loc.return_air() - var/pressure_delta = our_pressure - environment.return_pressure() - var/transfer_moles = pressure_delta*200/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - if(transfer_moles > 0) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) + var/pressure_delta = abs(our_pressure - environment.return_pressure()) + if(pressure_delta > 0.1) + equalize_all_gases_in_list(list(air_contents,environment)) air_update_turf() update_parents() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm index d6c18b1beb..9a77b386ba 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/tank.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/tank.dm @@ -21,8 +21,8 @@ air_contents.set_volume(volume) air_contents.set_temperature(T20C) if(gas_type) - air_contents.set_moles(gas_type, AIR_CONTENTS) - name = "[name] ([GLOB.meta_gas_names[gas_type]])" + air_contents.set_moles(gas_type,AIR_CONTENTS) + name = "[name] ([GLOB.gas_data.names[gas_type]])" setPipingLayer(piping_layer) /obj/machinery/atmospherics/components/unary/tank/air @@ -32,30 +32,30 @@ /obj/machinery/atmospherics/components/unary/tank/air/New() ..() var/datum/gas_mixture/air_contents = airs[1] - air_contents.set_moles(/datum/gas/oxygen, AIR_CONTENTS * 0.21) - air_contents.set_moles(/datum/gas/nitrogen, AIR_CONTENTS * 0.79) + air_contents.set_moles(GAS_O2, AIR_CONTENTS * 0.21) + air_contents.set_moles(GAS_N2, AIR_CONTENTS * 0.79) /obj/machinery/atmospherics/components/unary/tank/carbon_dioxide - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/machinery/atmospherics/components/unary/tank/toxins icon_state = "orange" - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA /obj/machinery/atmospherics/components/unary/tank/nitrogen icon_state = "red" - gas_type = /datum/gas/nitrogen + gas_type = GAS_N2 /obj/machinery/atmospherics/components/unary/tank/oxygen icon_state = "blue" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 /obj/machinery/atmospherics/components/unary/tank/nitrous icon_state = "red_white" - gas_type = /datum/gas/nitrous_oxide + gas_type = GAS_NITROUS /obj/machinery/atmospherics/components/unary/tank/bz - gas_type = /datum/gas/bz + gas_type = GAS_BZ // /obj/machinery/atmospherics/components/unary/tank/freon // icon_state = "blue" @@ -75,17 +75,17 @@ /obj/machinery/atmospherics/components/unary/tank/hypernoblium icon_state = "blue" - gas_type = /datum/gas/hypernoblium + gas_type = GAS_HYPERNOB /obj/machinery/atmospherics/components/unary/tank/miasma - gas_type = /datum/gas/miasma + gas_type = GAS_MIASMA /obj/machinery/atmospherics/components/unary/tank/nitryl - gas_type = /datum/gas/nitryl + gas_type = GAS_NITRYL /obj/machinery/atmospherics/components/unary/tank/pluoxium icon_state = "blue" - gas_type = /datum/gas/pluoxium + gas_type = GAS_PLUOXIUM // /obj/machinery/atmospherics/components/unary/tank/proto_nitrate // icon_state = "red" @@ -93,14 +93,14 @@ /obj/machinery/atmospherics/components/unary/tank/stimulum icon_state = "red" - gas_type = /datum/gas/stimulum + gas_type = GAS_STIMULUM /obj/machinery/atmospherics/components/unary/tank/tritium - gas_type = /datum/gas/tritium + gas_type = GAS_TRITIUM /obj/machinery/atmospherics/components/unary/tank/water_vapor icon_state = "grey" - gas_type = /datum/gas/water_vapor + gas_type = GAS_H2O // /obj/machinery/atmospherics/components/unary/tank/zauker // gas_type = /datum/gas/zauker diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm index 1a86898f1f..1a53a5299f 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_pump.dm @@ -15,6 +15,8 @@ level = 1 layer = GAS_SCRUBBER_LAYER + interacts_with_air = TRUE + var/id_tag = null var/pump_direction = RELEASING @@ -107,9 +109,7 @@ if(air_contents.return_temperature() > 0) var/transfer_moles = pressure_delta*environment.return_volume()/(air_contents.return_temperature() * R_IDEAL_GAS_EQUATION) - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) + loc.assume_air_moles(air_contents, transfer_moles) air_update_turf() else // external -> internal @@ -122,11 +122,7 @@ moles_delta = min(moles_delta, (internal_pressure_bound - air_contents.return_pressure()) * our_multiplier) if(moles_delta > 0) - var/datum/gas_mixture/removed = loc.remove_air(moles_delta) - if (isnull(removed)) // in space - return - - air_contents.merge(removed) + loc.transfer_air(air_contents, moles_delta) air_update_turf() update_parents() diff --git a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm index 025c9734ca..90d5f077a5 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/vent_scrubber.dm @@ -13,10 +13,12 @@ level = 1 layer = GAS_SCRUBBER_LAYER + interacts_with_air = TRUE + var/id_tag = null var/scrubbing = SCRUBBING //0 = siphoning, 1 = scrubbing - var/filter_types = list(/datum/gas/carbon_dioxide) + var/filter_types = list(GAS_CO2) var/volume_rate = 200 var/widenet = 0 //is this scrubber acting on the 3x3 area around it. var/list/turf/adjacent_turfs = list() @@ -33,11 +35,6 @@ if(!id_tag) id_tag = assign_uid_vents() - for(var/f in filter_types) - if(istext(f)) - filter_types -= f - filter_types += gas_id2path(f) - /obj/machinery/atmospherics/components/unary/vent_scrubber/Destroy() var/area/A = get_base_area(src) if (A) @@ -97,8 +94,8 @@ return FALSE var/list/f_types = list() - for(var/path in GLOB.meta_gas_ids) - f_types += list(list("gas_id" = GLOB.meta_gas_ids[path], "gas_name" = GLOB.meta_gas_names[path], "enabled" = (path in filter_types))) + for(var/id in GLOB.gas_data.ids) + f_types += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in filter_types))) var/datum/signal/signal = new(list( "tag" = id_tag, @@ -150,32 +147,17 @@ var/datum/gas_mixture/environment = tile.return_air() var/datum/gas_mixture/air_contents = airs[1] - if(air_contents.return_pressure() >= 50*ONE_ATMOSPHERE) + if(air_contents.return_pressure() >= 50*ONE_ATMOSPHERE || !islist(filter_types)) return FALSE if(scrubbing & SCRUBBING) - var/transfer_moles = min(1, volume_rate/environment.return_volume())*environment.total_moles() + environment.scrub_into(air_contents, volume_rate/environment.return_volume(), filter_types) - //Take a gas sample - var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) - - //Nothing left to remove from the tile - if(isnull(removed)) - return FALSE - - removed.scrub_into(air_contents, filter_types) - - //Remix the resulting gases - tile.assume_air(removed) tile.air_update_turf() else //Just siphoning all air - var/transfer_moles = environment.total_moles()*(volume_rate/environment.return_volume()) - - var/datum/gas_mixture/removed = tile.remove_air(transfer_moles) - - air_contents.merge(removed) + environment.transfer_ratio_to(air_contents, volume_rate/environment.return_volume()) tile.air_update_turf() update_parents() @@ -222,12 +204,12 @@ investigate_log(" was toggled to [scrubbing ? "scrubbing" : "siphon"] mode by [key_name(signal_sender)]",INVESTIGATE_ATMOS) if("toggle_filter" in signal.data) - filter_types ^= gas_id2path(signal.data["toggle_filter"]) + filter_types ^= signal.data["toggle_filter"] if("set_filters" in signal.data) filter_types = list() for(var/gas in signal.data["set_filters"]) - filter_types += gas_id2path(gas) + filter_types += gas if("init" in signal.data) name = signal.data["init"] diff --git a/code/modules/atmospherics/machinery/datum_pipeline.dm b/code/modules/atmospherics/machinery/datum_pipeline.dm index bd7dd6d297..1d0c59f789 100644 --- a/code/modules/atmospherics/machinery/datum_pipeline.dm +++ b/code/modules/atmospherics/machinery/datum_pipeline.dm @@ -241,25 +241,4 @@ /datum/pipeline/proc/reconcile_air() var/list/datum/gas_mixture/GL = get_all_connected_airs() - - var/total_thermal_energy = 0 - var/total_heat_capacity = 0 - var/datum/gas_mixture/total_gas_mixture = new(0) - - for(var/i in GL) - var/datum/gas_mixture/G = i - total_gas_mixture.set_volume(total_gas_mixture.return_volume() + G.return_volume()) - - total_gas_mixture.merge(G) - - total_thermal_energy += G.thermal_energy() - total_heat_capacity += G.heat_capacity() - - total_gas_mixture.set_temperature(total_heat_capacity ? total_thermal_energy/total_heat_capacity : 0) - - if(total_gas_mixture.return_volume() > 0) - //Update individual gas_mixtures by volume ratio - for(var/i in GL) - var/datum/gas_mixture/G = i - G.copy_from(total_gas_mixture) - G.multiply(G.return_volume()/total_gas_mixture.return_volume()) + equalize_all_gases_in_list(GL) diff --git a/code/modules/atmospherics/machinery/other/miner.dm b/code/modules/atmospherics/machinery/other/miner.dm index 1842211fd2..1caae1376f 100644 --- a/code/modules/atmospherics/machinery/other/miner.dm +++ b/code/modules/atmospherics/machinery/other/miner.dm @@ -12,6 +12,7 @@ icon_state = "miner" density = FALSE resistance_flags = INDESTRUCTIBLE|ACID_PROOF|FIRE_PROOF + interacts_with_air = TRUE var/spawn_id = null var/spawn_temp = T20C var/spawn_mol = MOLES_CELLSTANDARD * 10 @@ -117,7 +118,7 @@ on_overlay.color = overlay_color add_overlay(on_overlay) -/obj/machinery/atmospherics/miner/process() +/obj/machinery/atmospherics/miner/process_atmos() update_power() check_operation() if(active && !broken) @@ -144,34 +145,34 @@ /obj/machinery/atmospherics/miner/n2o name = "\improper N2O Gas Miner" overlay_color = "#FFCCCC" - spawn_id = /datum/gas/nitrous_oxide + spawn_id = GAS_NITROUS /obj/machinery/atmospherics/miner/nitrogen name = "\improper N2 Gas Miner" overlay_color = "#CCFFCC" - spawn_id = /datum/gas/nitrogen + spawn_id = GAS_N2 /obj/machinery/atmospherics/miner/oxygen name = "\improper O2 Gas Miner" overlay_color = "#007FFF" - spawn_id = /datum/gas/oxygen + spawn_id = GAS_O2 /obj/machinery/atmospherics/miner/toxins name = "\improper Plasma Gas Miner" overlay_color = "#FF0000" - spawn_id = /datum/gas/plasma + spawn_id = GAS_PLASMA /obj/machinery/atmospherics/miner/carbon_dioxide name = "\improper CO2 Gas Miner" overlay_color = "#CDCDCD" - spawn_id = /datum/gas/carbon_dioxide + spawn_id = GAS_CO2 /obj/machinery/atmospherics/miner/bz name = "\improper BZ Gas Miner" overlay_color = "#FAFF00" - spawn_id = /datum/gas/bz + spawn_id = GAS_BZ /obj/machinery/atmospherics/miner/water_vapor name = "\improper Water Vapor Gas Miner" overlay_color = "#99928E" - spawn_id = /datum/gas/water_vapor + spawn_id = GAS_H2O 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 7c170f8afc..5fdedd5be7 100644 --- a/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/heat_exchange/he_pipes.dm @@ -1,11 +1,12 @@ /obj/machinery/atmospherics/pipe/heat_exchanging level = 2 - var/minimum_temperature_difference = 20 + var/minimum_temperature_difference = 0.01 var/thermal_conductivity = WINDOW_HEAT_TRANSFER_COEFFICIENT color = "#404040" buckle_lying = 1 var/icon_temperature = T20C //stop small changes in temperature causing icon refresh resistance_flags = LAVA_PROOF | FIRE_PROOF + interacts_with_air = TRUE /obj/machinery/atmospherics/pipe/heat_exchanging/Initialize() . = ..() diff --git a/code/modules/atmospherics/machinery/pipes/pipes.dm b/code/modules/atmospherics/machinery/pipes/pipes.dm index 23fd2292ff..e05502dbad 100644 --- a/code/modules/atmospherics/machinery/pipes/pipes.dm +++ b/code/modules/atmospherics/machinery/pipes/pipes.dm @@ -54,6 +54,9 @@ /obj/machinery/atmospherics/pipe/remove_air(amount) return parent.air.remove(amount) +/obj/machinery/atmospherics/pipe/remove_air_ratio(ratio) + return parent.air.remove_ratio(ratio) + /obj/machinery/atmospherics/pipe/attackby(obj/item/W, mob/user, params) if(istype(W, /obj/item/pipe_meter)) var/obj/item/pipe_meter/meter = W diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 90f8680da9..15c6475033 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -28,7 +28,7 @@ // var/pressure_limit = 50000 var/temperature_resistance = 1000 + T0C - var/starter_temp + var/starter_temp = T20C // Prototype vars var/prototype = FALSE var/valve_timer = null @@ -74,37 +74,37 @@ name = "n2 canister" desc = "Nitrogen. Reportedly useful for something." icon_state = "red" - gas_type = /datum/gas/nitrogen + gas_type = GAS_N2 /obj/machinery/portable_atmospherics/canister/oxygen name = "o2 canister" desc = "Oxygen. Necessary for human life." icon_state = "blue" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 /obj/machinery/portable_atmospherics/canister/carbon_dioxide name = "co2 canister" desc = "Carbon dioxide. What the fuck is carbon dioxide?" icon_state = "black" - gas_type = /datum/gas/carbon_dioxide + gas_type = GAS_CO2 /obj/machinery/portable_atmospherics/canister/toxins name = "plasma canister" desc = "Plasma. The reason YOU are here. Highly toxic." icon_state = "orange" - gas_type = /datum/gas/plasma + gas_type = GAS_PLASMA /obj/machinery/portable_atmospherics/canister/bz name = "\improper BZ canister" desc = "BZ. A powerful hallucinogenic nerve agent." icon_state = "purple" - gas_type = /datum/gas/bz + gas_type = GAS_BZ /obj/machinery/portable_atmospherics/canister/nitrous_oxide name = "n2o canister" desc = "Nitrous oxide. Known to cause drowsiness." icon_state = "redws" - gas_type = /datum/gas/nitrous_oxide + gas_type = GAS_NITROUS /obj/machinery/portable_atmospherics/canister/air name = "air canister" @@ -115,57 +115,57 @@ name = "tritium canister" desc = "Tritium. Inhalation might cause irradiation." icon_state = "green" - gas_type = /datum/gas/tritium + gas_type = GAS_TRITIUM /obj/machinery/portable_atmospherics/canister/nob name = "hyper-noblium canister" desc = "Hyper-Noblium. More noble than all other gases." icon_state = "freon" - gas_type = /datum/gas/hypernoblium + gas_type = GAS_HYPERNOB /obj/machinery/portable_atmospherics/canister/nitryl name = "nitryl canister" desc = "Nitryl. Feels great 'til the acid eats your lungs." icon_state = "brown" - gas_type = /datum/gas/nitryl + gas_type = GAS_NITRYL /obj/machinery/portable_atmospherics/canister/stimulum name = "stimulum canister" desc = "Stimulum. High energy gas, high energy people." icon_state = "darkpurple" - gas_type = /datum/gas/stimulum + gas_type = GAS_STIMULUM /obj/machinery/portable_atmospherics/canister/pluoxium name = "pluoxium canister" desc = "Pluoxium. Like oxygen, but more bang for your buck." icon_state = "darkblue" - gas_type = /datum/gas/pluoxium + gas_type = GAS_PLUOXIUM /obj/machinery/portable_atmospherics/canister/water_vapor name = "water vapor canister" desc = "Water vapor. We get it, you vape." icon_state = "water_vapor" - gas_type = /datum/gas/water_vapor + gas_type = GAS_H2O filled = 1 /obj/machinery/portable_atmospherics/canister/miasma name = "miasma canister" desc = "Miasma. Makes you wish your nose were blocked." icon_state = "miasma" - gas_type = /datum/gas/miasma + gas_type = GAS_MIASMA filled = 1 /obj/machinery/portable_atmospherics/canister/methane name = "methane canister" desc = "Methane. The simplest of hydrocarbons. Non-toxic but highly flammable." icon_state = "greyblackred" - gas_type = /datum/gas/methane + gas_type = GAS_METHANE /obj/machinery/portable_atmospherics/canister/methyl_bromide name = "methyl bromide canister" desc = "Methyl bromide. A potent toxin to most, essential for the Kharmaan to live." icon_state = "purplecyan" - gas_type = /datum/gas/methyl_bromide + gas_type = GAS_METHYL_BROMIDE /obj/machinery/portable_atmospherics/canister/proc/get_time_left() if(timing) @@ -198,7 +198,7 @@ name = "prototype canister" desc = "A prototype canister for a prototype bike, what could go wrong?" icon_state = "proto" - gas_type = /datum/gas/oxygen + gas_type = GAS_O2 filled = 1 release_pressure = ONE_ATMOSPHERE*2 @@ -217,13 +217,13 @@ // air_contents.add_gas(gas_type) if(starter_temp) air_contents.set_temperature(starter_temp) + if(!air_contents.return_volume()) + CRASH("Auxtools is failing somehow! Gas with pointer [air_contents._extools_pointer_gasmixture] is not valid.") air_contents.set_moles(gas_type,(maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) - if(starter_temp) - air_contents.set_temperature(starter_temp) /obj/machinery/portable_atmospherics/canister/air/create_gas() - air_contents.set_moles(/datum/gas/oxygen, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) - air_contents.set_moles(/datum/gas/nitrogen, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.set_moles(GAS_O2, (O2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) + air_contents.set_moles(GAS_N2, (N2STANDARD * maximum_pressure * filled) * air_contents.return_volume() / (R_IDEAL_GAS_EQUATION * air_contents.return_temperature())) /obj/machinery/portable_atmospherics/canister/update_icon_state() if(stat & BROKEN) @@ -287,9 +287,8 @@ /obj/machinery/portable_atmospherics/canister/proc/canister_break() disconnect() - var/datum/gas_mixture/expelled_gas = air_contents.remove(air_contents.total_moles()) var/turf/T = get_turf(src) - T.assume_air(expelled_gas) + T.assume_air(air_contents) air_update_turf() obj_break() @@ -434,10 +433,10 @@ var/list/danger = list() for(var/id in air_contents.get_gases()) var/gas = air_contents.get_moles(id) - if(!GLOB.meta_gas_dangers[id]) + if(!(GLOB.gas_data.flags[id] & GAS_FLAG_DANGEROUS)) continue - if(gas > (GLOB.meta_gas_visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility - danger[GLOB.meta_gas_names[id]] = gas //ex. "plasma" = 20 + if(gas > (GLOB.gas_data.visibility[id] || MOLES_GAS_VISIBLE)) //if moles_visible is undefined, default to default visibility + danger[GLOB.gas_data.names[id]] = gas //ex. "plasma" = 20 if(danger.len) message_admins("[ADMIN_LOOKUPFLW(usr)] opened a canister that contains the following at [ADMIN_VERBOSEJMP(src)]:") diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 166727f6ae..93dc414968 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -16,7 +16,7 @@ /obj/machinery/portable_atmospherics/New() ..() - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src air_contents = new(volume) air_contents.set_temperature(T20C) @@ -24,7 +24,7 @@ return 1 /obj/machinery/portable_atmospherics/Destroy() - SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src disconnect() qdel(air_contents) diff --git a/code/modules/atmospherics/machinery/portable/pump.dm b/code/modules/atmospherics/machinery/portable/pump.dm index 2c9bcdc1a7..68708c3233 100644 --- a/code/modules/atmospherics/machinery/portable/pump.dm +++ b/code/modules/atmospherics/machinery/portable/pump.dm @@ -112,8 +112,8 @@ if("power") on = !on if(on && !holding) - var/plasma = air_contents.get_moles(/datum/gas/plasma) - var/n2o = air_contents.get_moles(/datum/gas/nitrous_oxide) + var/plasma = air_contents.get_moles(GAS_PLASMA) + var/n2o = air_contents.get_moles(GAS_NITROUS) if(n2o || plasma) message_admins("[ADMIN_LOOKUPFLW(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [ADMIN_VERBOSEJMP(src)]") log_admin("[key_name(usr)] turned on a pump that contains [n2o ? "N2O" : ""][n2o && plasma ? " & " : ""][plasma ? "Plasma" : ""] at [AREACOORD(src)]") diff --git a/code/modules/atmospherics/machinery/portable/scrubber.dm b/code/modules/atmospherics/machinery/portable/scrubber.dm index 7fd50158ca..7e27d64c7a 100644 --- a/code/modules/atmospherics/machinery/portable/scrubber.dm +++ b/code/modules/atmospherics/machinery/portable/scrubber.dm @@ -10,7 +10,7 @@ var/use_overlays = TRUE volume = 1000 - var/list/scrubbing = list(/datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz, /datum/gas/nitryl, /datum/gas/tritium, /datum/gas/hypernoblium, /datum/gas/water_vapor) + var/list/scrubbing = list(GAS_PLASMA, GAS_CO2, GAS_NITROUS, GAS_BZ, GAS_NITRYL, GAS_TRITIUM, GAS_HYPERNOB, GAS_H2O) /obj/machinery/portable_atmospherics/scrubber/Destroy() var/turf/T = get_turf(src) @@ -42,14 +42,7 @@ scrub(T.return_air()) /obj/machinery/portable_atmospherics/scrubber/proc/scrub(var/datum/gas_mixture/mixture) - var/transfer_moles = min(1, volume_rate / mixture.return_volume()) * mixture.total_moles() - - var/datum/gas_mixture/filtering = mixture.remove(transfer_moles) // Remove part of the mixture to filter. - if(!filtering) - return - - filtering.scrub_into(air_contents,scrubbing) - mixture.merge(filtering) // Returned the cleaned gas. + mixture.scrub_into(air_contents, volume_rate / mixture.return_volume(), scrubbing) if(!holding) air_update_turf() @@ -76,8 +69,8 @@ data["id_tag"] = -1 //must be defined in order to reuse code between portable and vent scrubbers data["filter_types"] = list() - for(var/path in GLOB.meta_gas_ids) - data["filter_types"] += list(list("gas_id" = GLOB.meta_gas_ids[path], "gas_name" = GLOB.meta_gas_names[path], "enabled" = (path in scrubbing))) + for(var/id in GLOB.gas_data.ids) + data["filter_types"] += list(list("gas_id" = id, "gas_name" = GLOB.gas_data.names[id], "enabled" = (id in scrubbing))) if(holding) data["holding"] = list() @@ -100,7 +93,7 @@ holding = null . = TRUE if("toggle_filter") - scrubbing ^= gas_id2path(params["val"]) + scrubbing ^= params["val"] . = TRUE update_icon() diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index 551c1c5536..c67bbb8a4d 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -205,6 +205,12 @@ GLOBAL_LIST_EMPTY(gateway_destinations) deactivate() return +/obj/machinery/gateway/update_icon_state() + if(target) + icon_state = "on_old" + else + icon_state = "portal_frame" + /obj/machinery/gateway/safe_throw_at(atom/target, range, speed, mob/thrower, spin = TRUE, diagonals_first = FALSE, datum/callback/callback, force = MOVE_FORCE_STRONG, gentle = FALSE) return diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index d873b42d33..5d30ccd907 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -156,13 +156,13 @@ /turf/open/floor/plasteel/dark/snowdin initial_gas_mix = FROZEN_ATMOS planetary_atmos = 1 - temperature = 180 + initial_temperature = 180 /turf/open/lava/plasma name = "liquid plasma" desc = "A flowing stream of chilled liquid plasma. You probably shouldn't get in." icon_state = "liquidplasma" - initial_gas_mix = "o2=0;n2=82;plasma=24;TEMP=120" + initial_gas_mix = "n2=82;plasma=24;TEMP=120" baseturfs = /turf/open/lava/plasma slowdown = 2 diff --git a/code/modules/buildmode/buildmode.dm b/code/modules/buildmode/buildmode.dm index 4a56257882..e0703201a1 100644 --- a/code/modules/buildmode/buildmode.dm +++ b/code/modules/buildmode/buildmode.dm @@ -17,10 +17,10 @@ var/switch_state = BM_SWITCHSTATE_NONE var/switch_width = 5 // modeswitch UI - var/obj/screen/buildmode/mode/modebutton + var/atom/movable/screen/buildmode/mode/modebutton var/list/modeswitch_buttons = list() // dirswitch UI - var/obj/screen/buildmode/bdir/dirbutton + var/atom/movable/screen/buildmode/bdir/dirbutton var/list/dirswitch_buttons = list() /datum/buildmode/New(client/c) @@ -34,7 +34,7 @@ holder.screen += buttons holder.click_intercept = src mode.enter_mode(src) - + /datum/buildmode/proc/quit() mode.exit_mode(src) holder.screen -= buttons @@ -63,16 +63,16 @@ /datum/buildmode/proc/create_buttons() // keep a reference so we can update it upon mode switch - modebutton = new /obj/screen/buildmode/mode(src) + modebutton = new /atom/movable/screen/buildmode/mode(src) buttons += modebutton - buttons += new /obj/screen/buildmode/help(src) + buttons += new /atom/movable/screen/buildmode/help(src) // keep a reference so we can update it upon dir switch - dirbutton = new /obj/screen/buildmode/bdir(src) + dirbutton = new /atom/movable/screen/buildmode/bdir(src) buttons += dirbutton - buttons += new /obj/screen/buildmode/quit(src) + buttons += new /atom/movable/screen/buildmode/quit(src) // build the lists of switching buttons - build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /obj/screen/buildmode/modeswitch) - build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /obj/screen/buildmode/dirswitch) + build_options_grid(subtypesof(/datum/buildmode_mode), modeswitch_buttons, /atom/movable/screen/buildmode/modeswitch) + build_options_grid(list(SOUTH,EAST,WEST,NORTH,NORTHWEST), dirswitch_buttons, /atom/movable/screen/buildmode/dirswitch) // this creates a nice offset grid for choosing between buildmode options, // because going "click click click ah hell" sucks. @@ -81,7 +81,7 @@ for(var/thing in elements) var/x = pos_idx % switch_width var/y = FLOOR(pos_idx / switch_width, 1) - var/obj/screen/buildmode/B = new buttontype(src, thing) + var/atom/movable/screen/buildmode/B = new buttontype(src, thing) // extra .5 for a nice offset look B.screen_loc = "NORTH-[(1 + 0.5 + y*1.5)],WEST+[0.5 + x*1.5]" buttonslist += B @@ -100,7 +100,7 @@ else close_switchstates() open_modeswitch() - + /datum/buildmode/proc/open_modeswitch() switch_state = BM_SWITCHSTATE_MODE holder.screen += modeswitch_buttons @@ -115,7 +115,7 @@ else close_switchstates() open_dirswitch() - + /datum/buildmode/proc/open_dirswitch() switch_state = BM_SWITCHSTATE_DIR holder.screen += dirswitch_buttons @@ -155,7 +155,7 @@ new /datum/buildmode(M.client) message_admins("[key_name_admin(usr)] has entered build mode.") log_admin("[key_name(usr)] has entered build mode.") - + #undef BM_SWITCHSTATE_NONE #undef BM_SWITCHSTATE_MODE #undef BM_SWITCHSTATE_DIR diff --git a/code/modules/buildmode/buttons.dm b/code/modules/buildmode/buttons.dm index 6901a0e42e..5c5c0000d1 100644 --- a/code/modules/buildmode/buttons.dm +++ b/code/modules/buildmode/buttons.dm @@ -1,23 +1,23 @@ -/obj/screen/buildmode +/atom/movable/screen/buildmode icon = 'icons/misc/buildmode.dmi' var/datum/buildmode/bd // If we don't do this, we get occluded by item action buttons layer = ABOVE_HUD_LAYER -/obj/screen/buildmode/New(bld) +/atom/movable/screen/buildmode/New(bld) bd = bld return ..() -/obj/screen/buildmode/Destroy() +/atom/movable/screen/buildmode/Destroy() bd = null return ..() -/obj/screen/buildmode/mode +/atom/movable/screen/buildmode/mode name = "Toggle Mode" icon_state = "buildmode_basic" screen_loc = "NORTH,WEST" -/obj/screen/buildmode/mode/Click(location, control, params) +/atom/movable/screen/buildmode/mode/Click(location, control, params) var/list/pa = params2list(params) if(pa.Find("left")) @@ -27,63 +27,63 @@ update_icon() return 1 -/obj/screen/buildmode/mode/update_icon_state() +/atom/movable/screen/buildmode/mode/update_icon_state() icon_state = bd.mode.get_button_iconstate() -/obj/screen/buildmode/help +/atom/movable/screen/buildmode/help icon_state = "buildhelp" screen_loc = "NORTH,WEST+1" name = "Buildmode Help" -/obj/screen/buildmode/help/Click(location, control, params) +/atom/movable/screen/buildmode/help/Click(location, control, params) bd.mode.show_help(usr.client) return 1 -/obj/screen/buildmode/bdir +/atom/movable/screen/buildmode/bdir icon_state = "build" screen_loc = "NORTH,WEST+2" name = "Change Dir" -/obj/screen/buildmode/bdir/update_icon_state() +/atom/movable/screen/buildmode/bdir/update_icon_state() dir = bd.build_dir -/obj/screen/buildmode/bdir/Click() +/atom/movable/screen/buildmode/bdir/Click() bd.toggle_dirswitch() update_icon() return 1 // used to switch between modes -/obj/screen/buildmode/modeswitch +/atom/movable/screen/buildmode/modeswitch var/datum/buildmode_mode/modetype -/obj/screen/buildmode/modeswitch/New(bld, mt) +/atom/movable/screen/buildmode/modeswitch/New(bld, mt) modetype = mt icon_state = "buildmode_[initial(modetype.key)]" name = initial(modetype.key) return ..(bld) -/obj/screen/buildmode/modeswitch/Click() +/atom/movable/screen/buildmode/modeswitch/Click() bd.change_mode(modetype) return 1 // used to switch between dirs -/obj/screen/buildmode/dirswitch +/atom/movable/screen/buildmode/dirswitch icon_state = "build" -/obj/screen/buildmode/dirswitch/New(bld, dir) +/atom/movable/screen/buildmode/dirswitch/New(bld, dir) src.dir = dir name = dir2text(dir) return ..(bld) -/obj/screen/buildmode/dirswitch/Click() +/atom/movable/screen/buildmode/dirswitch/Click() bd.change_dir(dir) return 1 -/obj/screen/buildmode/quit +/atom/movable/screen/buildmode/quit icon_state = "buildquit" screen_loc = "NORTH,WEST+3" name = "Quit Buildmode" -/obj/screen/buildmode/quit/Click() +/atom/movable/screen/buildmode/quit/Click() bd.quit() return 1 diff --git a/code/modules/cargo/bounties/engineering.dm b/code/modules/cargo/bounties/engineering.dm index b84fd2ca2c..5ddce8fb2c 100644 --- a/code/modules/cargo/bounties/engineering.dm +++ b/code/modules/cargo/bounties/engineering.dm @@ -4,7 +4,7 @@ reward = 7500 wanted_types = list(/obj/item/tank) var/moles_required = 20 // A full tank is 28 moles, but CentCom ignores that fact. - var/gas_type = /datum/gas/pluoxium + var/gas_type = GAS_PLUOXIUM /datum/bounty/item/engineering/gas/applies_to(obj/O) if(!..()) @@ -15,12 +15,12 @@ //datum/bounty/item/engineering/gas/nitryl_tank // name = "Full Tank of Nitryl" // description = "The non-human staff of Station 88 has been volunteered to test performance enhancing drugs. Ship them a tank full of Nitryl so they can get started." -// gas_type = /datum/gas/nitryl +// gas_type = GAS_NITRYL /datum/bounty/item/engineering/gas/tritium_tank name = "Full Tank of Tritium" description = "Station 49 is looking to kickstart their research program. Ship them a tank full of Tritium." - gas_type = /datum/gas/tritium + gas_type = GAS_TRITIUM /datum/bounty/item/engineering/pacman name = "P.A.C.M.A.N.-type portable generator" diff --git a/code/modules/cargo/centcom_podlauncher.dm b/code/modules/cargo/centcom_podlauncher.dm index 05a9eef4f2..e4060de1a2 100644 --- a/code/modules/cargo/centcom_podlauncher.dm +++ b/code/modules/cargo/centcom_podlauncher.dm @@ -51,9 +51,9 @@ var/obj/structure/closet/supplypod/centcompod/temp_pod //The temporary pod that is modified by this datum, then cloned. The buildObject() clone of this pod is what is launched // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background var/tabIndex = 1 var/renderLighting = FALSE @@ -92,8 +92,8 @@ cam_screen.del_on_map_removal = TRUE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() if (!renderLighting && instance.plane == LIGHTING_PLANE) instance.alpha = 100 instance.assigned_map = map_name @@ -581,7 +581,7 @@ var/left_click = pa.Find("left") if (launcherActivated) //Clicking on UI elements shouldn't launch a pod - if(istype(target,/obj/screen)) + if(istype(target,/atom/movable/screen)) return FALSE . = TRUE @@ -616,7 +616,7 @@ sleep(rand()*2) //looks cooler than them all appearing at once. Gives the impression of burst fire. else if (picking_dropoff_turf) //Clicking on UI elements shouldn't pick a dropoff turf - if(istype(target,/obj/screen)) + if(istype(target,/atom/movable/screen)) return FALSE . = TRUE diff --git a/code/modules/cargo/exports.dm b/code/modules/cargo/exports.dm index 12a5002ac7..b72e497a5f 100644 --- a/code/modules/cargo/exports.dm +++ b/code/modules/cargo/exports.dm @@ -84,17 +84,19 @@ Credit dupes that require a lot of manual work shouldn't be removed, unless they /datum/export/New() ..() - SSprocessing.processing += src + START_PROCESSING(SSprocessing, src) init_cost = cost export_types = typecacheof(export_types) exclude_types = typecacheof(exclude_types) /datum/export/Destroy() - SSprocessing.processing -= src + STOP_PROCESSING(SSprocessing, src) return ..() /datum/export/process() - ..() + . = ..() + if(!k_elasticity) + return PROCESS_KILL cost *= NUM_E**(k_elasticity * (1/30)) if(cost > init_cost) cost = init_cost diff --git a/code/modules/cargo/exports/large_objects.dm b/code/modules/cargo/exports/large_objects.dm index 9202fd1f81..dca23c9f22 100644 --- a/code/modules/cargo/exports/large_objects.dm +++ b/code/modules/cargo/exports/large_objects.dm @@ -169,13 +169,13 @@ /datum/export/large/gas_canister/get_cost(obj/O) var/obj/machinery/portable_atmospherics/canister/C = O var/worth = 10 - worth += C.air_contents.get_moles(/datum/gas/bz)*3 - worth += C.air_contents.get_moles(/datum/gas/stimulum)*25 - worth += C.air_contents.get_moles(/datum/gas/hypernoblium)*20 - worth += C.air_contents.get_moles(/datum/gas/miasma)*2 - worth += C.air_contents.get_moles(/datum/gas/tritium)*7 - worth += C.air_contents.get_moles(/datum/gas/pluoxium)*6 - worth += C.air_contents.get_moles(/datum/gas/nitryl)*10 + worth += C.air_contents.get_moles(GAS_BZ)*3 + worth += C.air_contents.get_moles(GAS_STIMULUM)*25 + worth += C.air_contents.get_moles(GAS_HYPERNOB)*20 + worth += C.air_contents.get_moles(GAS_MIASMA)*2 + worth += C.air_contents.get_moles(GAS_TRITIUM)*7 + worth += C.air_contents.get_moles(GAS_PLUOXIUM)*6 + worth += C.air_contents.get_moles(GAS_NITRYL)*10 return worth diff --git a/code/modules/client/client_defines.dm b/code/modules/client/client_defines.dm index 241cd6be93..99f24107c7 100644 --- a/code/modules/client/client_defines.dm +++ b/code/modules/client/client_defines.dm @@ -60,7 +60,7 @@ preload_rsc = PRELOAD_RSC - var/obj/screen/click_catcher/void + var/atom/movable/screen/click_catcher/void //These two vars are used to make a special mouse cursor, with a unique icon for clicking var/mouse_up_icon = null @@ -88,7 +88,7 @@ var/datum/player_details/player_details //these persist between logins/logouts during the same round. - var/list/char_render_holders //Should only be a key-value list of north/south/east/west = obj/screen. + var/list/char_render_holders //Should only be a key-value list of north/south/east/west = atom/movable/screen. /// Last time they used fix macros var/last_macro_fix = 0 @@ -168,7 +168,7 @@ * Assoc list with all the active maps - when a screen obj is added to * a map, it's put in here as well. * - * Format: list( = list(/obj/screen)) + * Format: list( = list(/atom/movable/screen)) */ var/list/screen_maps = list() @@ -183,3 +183,7 @@ //world.time of when the crew manifest can be accessed var/crew_manifest_delay + /// Should go in persistent round player data sometime. This tracks what items have already warned the user on pickup that they can block/parry. + var/list/block_parry_hinted = list() + /// moused over objects, currently capped at 7. this is awful, and should be replaced with a component to track it using signals for parrying at some point. + var/list/moused_over_objects = list() diff --git a/code/modules/client/client_procs.dm b/code/modules/client/client_procs.dm index 8add693d48..571adb406b 100644 --- a/code/modules/client/client_procs.dm +++ b/code/modules/client/client_procs.dm @@ -1029,7 +1029,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( var/pos = 0 for(var/D in GLOB.cardinals) pos++ - var/obj/screen/O = LAZYACCESS(char_render_holders, "[D]") + var/atom/movable/screen/O = LAZYACCESS(char_render_holders, "[D]") if(!O) O = new LAZYSET(char_render_holders, "[D]", O) @@ -1040,7 +1040,7 @@ GLOBAL_LIST_INIT(blacklisted_builds, list( /client/proc/clear_character_previews() for(var/index in char_render_holders) - var/obj/screen/S = char_render_holders[index] + var/atom/movable/screen/S = char_render_holders[index] screen -= S qdel(S) char_render_holders = null diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm index 251bcc72ad..5bc0440b77 100644 --- a/code/modules/client/preferences.dm +++ b/code/modules/client/preferences.dm @@ -187,6 +187,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) var/vore_flags = 0 var/list/belly_prefs = list() var/vore_taste = "nothing in particular" + var/vore_smell = null var/toggleeatingnoise = TRUE var/toggledigestionnoise = TRUE var/hound_sleeper = TRUE @@ -1068,6 +1069,7 @@ GLOBAL_LIST_EMPTY(preferences_datums) 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 += "Allow trash forcefeeding (requires Trashcan quirk) [(cit_toggles & TRASH_FORCEFEED) ? "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"]
" @@ -2800,6 +2802,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("toggledigestionnoise") cit_toggles ^= DIGESTION_NOISES + if("toggleforcefeedtrash") + cit_toggles ^= TRASH_FORCEFEED + if("breast_enlargement") cit_toggles ^= BREAST_ENLARGEMENT @@ -2835,9 +2840,9 @@ GLOBAL_LIST_EMPTY(preferences_datums) if("ambientocclusion") ambientocclusion = !ambientocclusion if(parent && parent.screen && parent.screen.len) - var/obj/screen/plane_master/game_world/G = parent.mob.hud_used.plane_masters["[GAME_PLANE]"] - var/obj/screen/plane_master/above_wall/A = parent.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"] - var/obj/screen/plane_master/wall/W = parent.mob.hud_used.plane_masters["[WALL_PLANE]"] + var/atom/movable/screen/plane_master/game_world/G = parent.mob.hud_used.plane_masters["[GAME_PLANE]"] + var/atom/movable/screen/plane_master/above_wall/A = parent.mob.hud_used.plane_masters["[ABOVE_WALL_PLANE]"] + var/atom/movable/screen/plane_master/wall/W = parent.mob.hud_used.plane_masters["[WALL_PLANE]"] G.backdrop(parent.mob) A.backdrop(parent.mob) W.backdrop(parent.mob) diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm index 45c5357c4d..d4d13dc40f 100644 --- a/code/modules/client/preferences_savefile.dm +++ b/code/modules/client/preferences_savefile.dm @@ -821,6 +821,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car S["vore_flags"] >> vore_flags S["vore_taste"] >> vore_taste + S["vore_smell"] >> vore_smell var/char_vr_path = "[vr_path]/character_[default_slot]_v2.json" if(fexists(char_vr_path)) var/list/json_from_file = json_decode(file2text(char_vr_path)) @@ -994,6 +995,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car vore_flags = sanitize_integer(vore_flags, 0, MAX_VORE_FLAG, 0) vore_taste = copytext(vore_taste, 1, MAX_TASTE_LEN) + vore_smell = copytext(vore_smell, 1, MAX_TASTE_LEN) belly_prefs = SANITIZE_LIST(belly_prefs) cit_character_pref_load(S) @@ -1147,6 +1149,7 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car WRITE_FILE(S["vore_flags"] , vore_flags) WRITE_FILE(S["vore_taste"] , vore_taste) + WRITE_FILE(S["vore_smell"] , vore_smell) var/char_vr_path = "[vr_path]/character_[default_slot]_v2.json" var/belly_prefs_json = safe_json_encode(list("belly_prefs" = belly_prefs)) if(fexists(char_vr_path)) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 416c6309d4..56ddb5f5f1 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -79,8 +79,8 @@ if(ismecha(M.loc)) // stops inventory actions in a mech return - if(!. && !M.incapacitated() && loc == M && istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(!. && !M.incapacitated() && loc == M && istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 86468a0269..8c8400a45d 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -236,10 +236,9 @@ parry_efficiency_considered_successful = 0.01 parry_efficiency_to_counterattack = INFINITY // no auto counter parry_max_attacks = INFINITY - parry_failed_cooldown_duration = 2.25 SECONDS - parry_failed_stagger_duration = 2.25 SECONDS + parry_failed_cooldown_duration = 1.5 SECONDS + parry_failed_stagger_duration = 1.5 SECONDS parry_cooldown = 0 - parry_failed_clickcd_duration = 0 /obj/item/clothing/gloves/fingerless/pugilist/mauler name = "mauler gauntlets" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 124ece8fdc..fd181779f1 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -482,3 +482,9 @@ icon_state = "kabuto" item_state = "kabuto" flags_inv = HIDEHAIR|HIDEEARS + +/obj/item/clothing/head/human_leather + name = "human skin hat" + desc = "This will scare them. All will know my power." + icon_state = "human_leather" + item_state = "human_leather" diff --git a/code/modules/clothing/shoes/_shoes.dm b/code/modules/clothing/shoes/_shoes.dm index 49256b490d..7a1e6b14f3 100644 --- a/code/modules/clothing/shoes/_shoes.dm +++ b/code/modules/clothing/shoes/_shoes.dm @@ -27,7 +27,7 @@ ///How long it takes to lace/unlace these shoes var/lace_time = 5 SECONDS ///any alerts we have active - var/obj/screen/alert/our_alert + var/atom/movable/screen/alert/our_alert /obj/item/clothing/shoes/ComponentInitialize() . = ..() @@ -93,7 +93,7 @@ user.update_inv_shoes() equipped_before_drop = TRUE if(can_be_tied && tied == SHOES_UNTIED) - our_alert = user.throw_alert("shoealert", /obj/screen/alert/shoes/untied) + our_alert = user.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE) /obj/item/clothing/shoes/proc/restore_offsets(mob/user) @@ -150,7 +150,7 @@ UnregisterSignal(src, COMSIG_SHOES_STEP_ACTION) else if(tied == SHOES_UNTIED && our_guy && user == our_guy) - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) // if we're the ones unknotting our own laces, of course we know they're untied RegisterSignal(src, COMSIG_SHOES_STEP_ACTION, .proc/check_trip, override=TRUE) /** @@ -233,7 +233,7 @@ our_guy.Knockdown(10) our_guy.visible_message("[our_guy] trips on [our_guy.p_their()] knotted shoelaces and falls! What a klutz!", "You trip on your knotted shoelaces and fall over!") SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "trip", /datum/mood_event/tripped) // well we realized they're knotted now! - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/knotted) + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/knotted) else if(tied == SHOES_UNTIED) var/wiser = TRUE // did we stumble and realize our laces are undone? @@ -263,7 +263,7 @@ wiser = FALSE if(wiser) SEND_SIGNAL(our_guy, COMSIG_ADD_MOOD_EVENT, "untied", /datum/mood_event/untied) // well we realized they're untied now! - our_alert = our_guy.throw_alert("shoealert", /obj/screen/alert/shoes/untied) + our_alert = our_guy.throw_alert("shoealert", /atom/movable/screen/alert/shoes/untied) /obj/item/clothing/shoes/on_attack_hand(mob/living/user, act_intent, unarmed_attack_flags) diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 57659a70c4..6642731d8b 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -238,7 +238,7 @@ var/mob/holder = null var/phase_time = 0 var/phase_time_length = 3 - var/obj/screen/chronos_target/target_ui = null + var/atom/movable/screen/chronos_target/target_ui = null var/obj/item/clothing/suit/space/chronos/chronosuit /obj/effect/chronos_cam/singularity_act() @@ -299,13 +299,13 @@ holder.unset_machine() return ..() -/obj/screen/chronos_target +/atom/movable/screen/chronos_target name = "target display" screen_loc = "CENTER,CENTER" color = "#ff3311" blend_mode = BLEND_SUBTRACT -/obj/screen/chronos_target/New(loc, var/mob/living/carbon/human/user) +/atom/movable/screen/chronos_target/New(loc, var/mob/living/carbon/human/user) if(user) var/icon/user_icon = getFlatIcon(user) icon = user_icon diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index b56f689979..a58b218c1a 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -103,14 +103,14 @@ . = ..() AddElement(/datum/element/polychromic, poly_colors, 3) -/obj/item/clothing/neck/cancloak/polychromic +/obj/item/clothing/neck/cloak/cancloak/polychromic name = "canvas cloak" desc = "A rugged cloak made of canvas." icon_state = "cancloak" item_state = "cloak" var/list/poly_colors = list("#585858", "#373737", "#BEBEBE") -/obj/item/clothing/neck/cancloak/polychromic/ComponentInitialize() +/obj/item/clothing/neck/cloak/cancloak/polychromic/ComponentInitialize() . = ..() AddElement(/datum/element/polychromic, poly_colors, 3) diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 60d82292ef..4e5be1306c 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -280,23 +280,21 @@ item_state = "qipao" body_parts_covered = CHEST|GROIN can_adjust = FALSE + fitted = FEMALE_UNIFORM_TOP mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON + /obj/item/clothing/under/costume/qipao/white name = "White Qipao" desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is white." icon_state = "qipao_white" item_state = "qipao_white" - body_parts_covered = CHEST|GROIN - can_adjust = FALSE /obj/item/clothing/under/costume/qipao/red name = "Red Qipao" desc = "A Qipao, traditionally worn in ancient Earth China by women during social events and lunar new years. This one is red." icon_state = "qipao_red" item_state = "qipao_red" - body_parts_covered = CHEST|GROIN - can_adjust = FALSE /obj/item/clothing/under/costume/cheongsam name = "Black Cheongsam" @@ -332,9 +330,11 @@ /obj/item/clothing/under/costume/kimono name = "Kimono" - desc = "A traditional piece of clothing from japan" + desc = "A traditional piece of clothing from Japan." icon_state = "kimono" item_state = "kimono" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/costume/kimono/black name = "Black Kimono" diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index e01ceba0bf..4dac5f1961 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -319,37 +319,46 @@ /obj/item/clothing/under/misc/black_dress name = "little black dress" - desc = "A small black dress" + desc = "A small black dress." icon_state = "littleblackdress_s" item_state = "littleblackdress_s" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/pinktutu name = "pink tutu" - desc = "A pink tutu" + desc = "A pink tutu." icon_state = "pinktutu_s" item_state = "pinktutu_s" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/bathrobe name = "bathrobe" desc = "A blue bathrobe." icon_state = "bathrobe" item_state = "bathrobe" + fitted = FEMALE_UNIFORM_TOP + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitred name = "red mech suit" desc = "What are you, stupid?" icon_state = "red_mech_suit" item_state = "red_mech_suit" + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitwhite name = "white mech suit" desc = "...Mom?" icon_state = "white_mech_suit" item_state = "white_mech_suit" + can_adjust = FALSE /obj/item/clothing/under/misc/mechsuitblue name = "blue mech suit" desc = "Get in the damn robot already!" icon_state = "blue_mech_suit" item_state = "blue_mech_suit" + can_adjust = FALSE diff --git a/code/modules/events/cat_surgeon.dm b/code/modules/events/cat_surgeon.dm index d968e5e1f8..2d5651b9b1 100644 --- a/code/modules/events/cat_surgeon.dm +++ b/code/modules/events/cat_surgeon.dm @@ -2,8 +2,11 @@ name = "Cat Surgeon" typepath = /datum/round_event/cat_surgeon max_occurrences = 1 - weight = 10 + weight = 8 +/datum/round_event/cat_surgeon/announce(fake) + priority_announce("One of our... ahem... 'special' cases has escaped. As it happens their last known location before their tracker went dead is your station so keep an eye out for them. On an unrelated note, has anyone seen our cats?", + sender_override = "Nanotrasen Psych Ward") /datum/round_event/cat_surgeon/start() var/list/spawn_locs = list() @@ -16,7 +19,7 @@ var/turf/T = get_turf(pick(spawn_locs)) var/mob/living/simple_animal/hostile/cat_butcherer/S = new(T) - playsound(S, 'sound/misc/catscream.ogg', 50, 1, -1) + playsound(S, 'sound/misc/catscream.ogg', 75, 1, -1) message_admins("A cat surgeon has been spawned at [COORD(T)][ADMIN_JMP(T)]") log_game("A cat surgeon has been spawned at [COORD(T)]") return SUCCESSFUL_SPAWN diff --git a/code/modules/events/portal_storm.dm b/code/modules/events/portal_storm.dm index 5ef30d0030..59bb22e9af 100644 --- a/code/modules/events/portal_storm.dm +++ b/code/modules/events/portal_storm.dm @@ -56,7 +56,10 @@ next_boss_spawn = startWhen + CEILING(2 * number_of_hostiles / number_of_bosses, 1) /datum/round_event/portal_storm/announce(fake) - set waitfor = 0 + do_announce() + +/datum/round_event/portal_storm/proc/do_announce() + set waitfor = FALSE sound_to_playing_players('sound/magic/lightning_chargeup.ogg') sleep(80) priority_announce("Massive bluespace anomaly detected en route to [station_name()]. Brace for impact.") diff --git a/code/modules/events/sentience.dm b/code/modules/events/sentience.dm index ba14a5307f..d90792c88f 100644 --- a/code/modules/events/sentience.dm +++ b/code/modules/events/sentience.dm @@ -37,7 +37,7 @@ continue if(L.mob_biotypes & blacklisted_biotypes) //hey can you don't continue - if(!(L in GLOB.player_list) && !L.mind) + if(!(L in GLOB.player_list) && !L.mind && !L.incapacitated()) potential += L if(!potential.len) diff --git a/code/modules/events/spacevine.dm b/code/modules/events/spacevine.dm index c8679447b8..6fcaa5e6b0 100644 --- a/code/modules/events/spacevine.dm +++ b/code/modules/events/spacevine.dm @@ -171,7 +171,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/oxygen, max(GM.get_moles(/datum/gas/oxygen) - severity * holder.energy, 0)) + GM.set_moles(GAS_O2, max(GM.get_moles(GAS_O2) - severity * holder.energy, 0)) /datum/spacevine_mutation/nitro_eater name = "nitrogen consuming" @@ -183,7 +183,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/nitrogen, max(GM.get_moles(/datum/gas/nitrogen) - severity * holder.energy, 0)) + GM.set_moles(GAS_N2, max(GM.get_moles(GAS_N2) - severity * holder.energy, 0)) /datum/spacevine_mutation/carbondioxide_eater name = "CO2 consuming" @@ -195,7 +195,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/carbon_dioxide, max(GM.get_moles(/datum/gas/carbon_dioxide) - severity * holder.energy, 0)) + GM.set_moles(GAS_CO2, max(GM.get_moles(GAS_CO2) - severity * holder.energy, 0)) /datum/spacevine_mutation/plasma_eater name = "toxins consuming" @@ -207,7 +207,7 @@ var/turf/open/floor/T = holder.loc if(istype(T)) var/datum/gas_mixture/GM = T.air - GM.set_moles(/datum/gas/plasma, max(GM.get_moles(/datum/gas/plasma) - severity * holder.energy, 0)) + GM.set_moles(GAS_PLASMA, max(GM.get_moles(GAS_PLASMA) - severity * holder.energy, 0)) /datum/spacevine_mutation/thorns name = "thorny" diff --git a/code/modules/events/supernova.dm b/code/modules/events/supernova.dm index ca64984cde..e1d6991c89 100644 --- a/code/modules/events/supernova.dm +++ b/code/modules/events/supernova.dm @@ -12,6 +12,7 @@ var/power = 1 var/datum/sun/supernova var/storm_count = 0 + var/announced = FALSE /datum/round_event/supernova/setup() announceWhen = rand(4, 60) @@ -30,9 +31,10 @@ supernova.power_mod = 0 /datum/round_event/supernova/announce() - var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : ""] We hope you enjoy the light." + var/message = "[station_name()]: Our tachyon-doppler array has detected a supernova in your vicinity. Peak flux from the supernova estimated to be [round(power,0.1)] times current solar flux; if the supernova is close to your sun in the sky, your solars may receive this as a power boost.[power > 1 ? " Short burts of radiation may be possible, so please prepare accordingly." : "We expect no radiation bursts from this one."] We hope you enjoy the light." if(prob(power * 25)) priority_announce(message, sender_override = "Nanotrasen Meteorology Division") + announced = TRUE else print_command_report(message) @@ -56,15 +58,16 @@ supernova.power_mod = min(supernova.power_mod*1.2, power) if(activeFor > endWhen-10) supernova.power_mod /= 4 - if(prob(round(supernova.power_mod*2)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) + if(prob(round(supernova.power_mod)) && prob(3) && storm_count < 5 && !SSweather.get_weather_by_type(/datum/weather/rad_storm)) SSweather.run_weather(/datum/weather/rad_storm/supernova) storm_count++ /datum/round_event/supernova/end() SSsun.suns -= supernova qdel(supernova) - priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.", - sender_override = "Nanotrasen Meteorology Division") + if(announced) + priority_announce("The supernova's flux is now negligible. Radiation storms have ceased. Have a pleasant shift, [station_name()], and thank you for bearing with nature.", + sender_override = "Nanotrasen Meteorology Division") /datum/weather/rad_storm/supernova weather_duration_lower = 50 diff --git a/code/modules/events/wizard/fakeexplosion.dm b/code/modules/events/wizard/fakeexplosion.dm index 5858064819..3ba20f4768 100644 --- a/code/modules/events/wizard/fakeexplosion.dm +++ b/code/modules/events/wizard/fakeexplosion.dm @@ -7,5 +7,4 @@ /datum/round_event/wizard/fake_explosion/start() sound_to_playing_players('sound/machines/alarm.ogg') - sleep(100) - Cinematic(CINEMATIC_NUKE_FAKE,world) + addtimer(CALLBACK(GLOBAL_PROC,.proc/Cinematic, CINEMATIC_NUKE_FAKE, world), 100) diff --git a/code/modules/fields/fields.dm b/code/modules/fields/fields.dm index cb8d3e8dcf..8c7b414996 100644 --- a/code/modules/fields/fields.dm +++ b/code/modules/fields/fields.dm @@ -64,7 +64,8 @@ pass = FALSE return pass -/datum/proximity_monitor/advanced/process() +/datum/proximity_monitor/advanced/proc/lag_checked_process() + set waitfor = FALSE if(process_inner_turfs) for(var/turf/T in field_turfs) process_inner_turf(T) @@ -72,7 +73,10 @@ if(process_edge_turfs) for(var/turf/T in edge_turfs) process_edge_turf(T) - CHECK_TICK //Same here. + CHECK_TICK //Same here. + +/datum/proximity_monitor/advanced/process() + lag_checked_process() /datum/proximity_monitor/advanced/proc/process_inner_turf(turf/T) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index cc18207a29..adbf48470d 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(!hallucination) return - hallucination-- + hallucination = max(hallucination-1, 0) if(world.time < next_hallucination) return @@ -933,46 +933,46 @@ GLOBAL_LIST_INIT(hallucination_list, list( feedback_details += "Type: [alert_type]" switch(alert_type) if("not_enough_oxy") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_oxy, override = TRUE) if("not_enough_tox") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_tox, override = TRUE) if("not_enough_co2") - target.throw_alert(alert_type, /obj/screen/alert/not_enough_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/not_enough_co2, override = TRUE) if("too_much_oxy") - target.throw_alert(alert_type, /obj/screen/alert/too_much_oxy, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_oxy, override = TRUE) if("too_much_co2") - target.throw_alert(alert_type, /obj/screen/alert/too_much_co2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_co2, override = TRUE) if("too_much_tox") - target.throw_alert(alert_type, /obj/screen/alert/too_much_tox, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/too_much_tox, override = TRUE) if("nutrition") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/fat, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fat, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/starving, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/starving, override = TRUE) if("gravity") - target.throw_alert(alert_type, /obj/screen/alert/weightless, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/weightless, override = TRUE) if("fire") - target.throw_alert(alert_type, /obj/screen/alert/fire, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/fire, override = TRUE) if("temphot") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/hot, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hot, 3, override = TRUE) if("tempcold") alert_type = "temp" - target.throw_alert(alert_type, /obj/screen/alert/cold, 3, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/cold, 3, override = TRUE) if("pressure") if(prob(50)) - target.throw_alert(alert_type, /obj/screen/alert/highpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/highpressure, 2, override = TRUE) else - target.throw_alert(alert_type, /obj/screen/alert/lowpressure, 2, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/lowpressure, 2, override = TRUE) //BEEP BOOP I AM A ROBOT if("newlaw") - target.throw_alert(alert_type, /obj/screen/alert/newlaw, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/newlaw, override = TRUE) if("locked") - target.throw_alert(alert_type, /obj/screen/alert/locked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/locked, override = TRUE) if("hacked") - target.throw_alert(alert_type, /obj/screen/alert/hacked, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/hacked, override = TRUE) if("charge") - target.throw_alert(alert_type, /obj/screen/alert/emptycell, override = TRUE) + target.throw_alert(alert_type, /atom/movable/screen/alert/emptycell, override = TRUE) sleep(duration) target.clear_alert(alert_type, clear_override = TRUE) qdel(src) @@ -1181,7 +1181,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( if(target.client) target.client.images += fire_overlay to_chat(target, "You're set on fire!") - target.throw_alert("fire", /obj/screen/alert/fire, override = TRUE) + target.throw_alert("fire", /atom/movable/screen/alert/fire, override = TRUE) sleep(20) for(var/i in 1 to 3) if(target.fire_stacks <= 0) @@ -1203,7 +1203,7 @@ GLOBAL_LIST_INIT(hallucination_list, list( target.clear_alert("temp", clear_override = TRUE) else target.clear_alert("temp", clear_override = TRUE) - target.throw_alert("temp", /obj/screen/alert/hot, stage, override = TRUE) + target.throw_alert("temp", /atom/movable/screen/alert/hot, stage, override = TRUE) /datum/hallucination/fire/proc/clear_fire() if(!active) diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 7377913c15..f650a935ea 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -497,6 +497,72 @@ /obj/item/reagent_containers/food/drinks/bottle/grenadine/empty list_reagents = null +/obj/item/reagent_containers/food/drinks/bottle/blank //Don't let players print these from a lathe, bottles should be obtained in mass from the bar only. + name = "glass bottle" + desc = "This blank bottle is unyieldingly anonymous, offering no clues to it's contents." + icon_state = "glassbottle" + volume = 90 + spillable = TRUE + obj_flags = UNIQUE_RENAME + +/obj/item/reagent_containers/food/drinks/bottle/blank/update_icon() + ..() + add_overlay("[initial(icon_state)]shine") + +/obj/item/reagent_containers/food/drinks/bottle/blank/Initialize() + . = ..() + update_icon() + +/obj/item/reagent_containers/food/drinks/bottle/blank/get_part_rating() + return reagents.maximum_volume + +/obj/item/reagent_containers/food/drinks/bottle/blank/on_reagent_change(changetype) + update_icon() + +/obj/item/reagent_containers/food/drinks/bottle/blank/update_overlays() + . = ..() + if(!cached_icon) + cached_icon = icon_state + + if(reagents.total_volume) + var/mutable_appearance/filling = mutable_appearance('icons/obj/reagentfillings.dmi', "[cached_icon]10", color = mix_color_from_reagents(reagents.reagent_list)) + + var/percent = round((reagents.total_volume / volume) * 100) + switch(percent) + if(0 to 9) + filling.icon_state = "[cached_icon]0" + if(10 to 19) + filling.icon_state = "[cached_icon]10" + if(20 to 29) + filling.icon_state = "[cached_icon]20" + if(30 to 39) + filling.icon_state = "[cached_icon]30" + if(40 to 49) + filling.icon_state = "[cached_icon]40" + if(50 to 59) + filling.icon_state = "[cached_icon]50" + if(60 to 69) + filling.icon_state = "[cached_icon]60" + if(70 to 79) + filling.icon_state = "[cached_icon]70" + if(80 to 89) + filling.icon_state = "[cached_icon]80" + if(90 to INFINITY) + filling.icon_state = "[cached_icon]90" + . += filling + +/obj/item/reagent_containers/food/drinks/bottle/blank/small + name = "small glass bottle" + desc = "This small bottle is unyieldingly anonymous, offering no clues to it's contents." + icon_state = "glassbottlesmall" + volume = 60 + +/obj/item/reagent_containers/food/drinks/bottle/blank/pitcher + name = "glass pitcher" + desc = "This is a pitcher for large amounts of liquid of any kind." + icon_state = "unipitcher" + volume = 120 + ////////////////////////// MOLOTOV /////////////////////// /obj/item/reagent_containers/food/drinks/bottle/molotov name = "molotov cocktail" diff --git a/code/modules/food_and_drinks/food/customizables.dm b/code/modules/food_and_drinks/food/customizables.dm index 0e2bdc63c8..42f536c4f3 100644 --- a/code/modules/food_and_drinks/food/customizables.dm +++ b/code/modules/food_and_drinks/food/customizables.dm @@ -66,7 +66,7 @@ . = ..() -/obj/item/reagent_containers/food/snacks/customizable/proc/update_name(obj/item/reagent_containers/food/snacks/S) +/obj/item/reagent_containers/food/snacks/customizable/update_name(obj/item/reagent_containers/food/snacks/S) for(var/obj/item/I in ingredients) if(!istype(S, I.type)) customname = "custom" diff --git a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm index f97ef17364..58769cebf1 100644 --- a/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm +++ b/code/modules/food_and_drinks/kitchen_machinery/smartfridge.dm @@ -59,6 +59,10 @@ else icon_state = "[initial(icon_state)]-off" +/obj/machinery/smartfridge/update_overlays() + . = ..() + if(!stat) + . += emissive_appearance(icon, "smartfridge-light-mask", alpha = src.alpha) /******************* @@ -468,7 +472,7 @@ /obj/item/reagent_containers/medspray/sterilizine = 1) /obj/machinery/smartfridge/organ/preloaded/Initialize() - ..() + . = ..() var/list = list(/obj/item/organ/tongue, /obj/item/organ/brain, /obj/item/organ/heart, /obj/item/organ/liver, /obj/item/organ/ears, /obj/item/organ/eyes, /obj/item/organ/tail, /obj/item/organ/stomach) var/newtype = pick(list) load(new newtype(src.loc)) diff --git a/code/modules/holiday/halloween/jacqueen.dm b/code/modules/holiday/halloween/jacqueen.dm index 11bd330112..ed7453ad3e 100644 --- a/code/modules/holiday/halloween/jacqueen.dm +++ b/code/modules/holiday/halloween/jacqueen.dm @@ -57,7 +57,7 @@ /obj/mafia_game_board, /obj/docking_port, /obj/shapeshift_holder, - /obj/screen + /atom/movable/screen )) /mob/living/simple_animal/jacq/Initialize() diff --git a/code/modules/holodeck/area_copy.dm b/code/modules/holodeck/area_copy.dm index cb9965d34a..738d10665a 100644 --- a/code/modules/holodeck/area_copy.dm +++ b/code/modules/holodeck/area_copy.dm @@ -139,7 +139,6 @@ GLOBAL_LIST_INIT(duplicate_forbidden_vars_by_type, typecacheof_assoc_list(list( if(toupdate.len) for(var/turf/T1 in toupdate) CALCULATE_ADJACENT_TURFS(T1) - SSair.add_to_active(T1,1) return copiedobjs diff --git a/code/modules/holodeck/holo_effect.dm b/code/modules/holodeck/holo_effect.dm index 09dcd7fa64..c37ccf657b 100644 --- a/code/modules/holodeck/holo_effect.dm +++ b/code/modules/holodeck/holo_effect.dm @@ -61,7 +61,7 @@ var/datum/effect_system/spark_spread/s = new s.set_up(3, 1, T) s.start() - T.temperature = 5000 + T.set_temperature(5000) T.hotspot_expose(50000, 50000, TRUE, TRUE) diff --git a/code/modules/hydroponics/fermenting_barrel.dm b/code/modules/hydroponics/fermenting_barrel.dm index 76e36a1725..3d6b90eb2d 100644 --- a/code/modules/hydroponics/fermenting_barrel.dm +++ b/code/modules/hydroponics/fermenting_barrel.dm @@ -73,3 +73,40 @@ icon_state = "barrel_open" else icon_state = "barrel" + +/obj/structure/custom_keg + name = "Plasteel Keg" + desc = "A large plasteel keg. You can use it to hold liquids. You may wanna label this, too." + icon = 'icons/obj/objects.dmi' + icon_state = "keg" + density = TRUE + anchored = FALSE + pressure_resistance = 2 * ONE_ATMOSPHERE + max_integrity = 300 + var/open = FALSE + +/obj/structure/custom_keg/Initialize() + create_reagents(1000, DRAINABLE | AMOUNT_VISIBLE) + . = ..() + +/obj/structure/custom_keg/examine(mob/user) + . = ..() + . += "It is currently [open?"open, letting you pour liquids in.":"closed, letting you draw liquids from the tap."]" + +/obj/structure/custom_keg/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) + open = !open + if(open) + DISABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE) + ENABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE) + to_chat(user, "You open [src], letting you fill it.") + else + DISABLE_BITFIELD(reagents.reagents_holder_flags, REFILLABLE) + ENABLE_BITFIELD(reagents.reagents_holder_flags, DRAINABLE) + to_chat(user, "You close [src], letting you draw from its tap.") + update_icon() + +/obj/structure/custom_keg/update_icon_state() + if(open) + icon_state = "keg_open" + else + icon_state = "keg" diff --git a/code/modules/hydroponics/gene_modder.dm b/code/modules/hydroponics/gene_modder.dm index a0c273613f..a6ba5ec461 100644 --- a/code/modules/hydroponics/gene_modder.dm +++ b/code/modules/hydroponics/gene_modder.dm @@ -430,7 +430,7 @@ src.pixel_x = rand(-5, 5) src.pixel_y = rand(-5, 5) -/obj/item/disk/plantgene/proc/update_name() +/obj/item/disk/plantgene/update_name() if(gene) name = "[gene.get_name()] (plant data disk)" else diff --git a/code/modules/hydroponics/grown/misc.dm b/code/modules/hydroponics/grown/misc.dm index 74b5c19b88..733d973832 100644 --- a/code/modules/hydroponics/grown/misc.dm +++ b/code/modules/hydroponics/grown/misc.dm @@ -58,7 +58,7 @@ return var/datum/gas_mixture/stank = new - stank.adjust_moles(/datum/gas/miasma,(yield + 6)*7*0.02) // this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses + stank.adjust_moles(GAS_MIASMA,(yield + 6)*0.14) // 0.14 = 7*0.02, this process is only being called about 2/7 as much as corpses so this is 12-32 times a corpses stank.set_temperature(T20C) // without this the room would eventually freeze and miasma mining would be easier T.assume_air(stank) T.air_update_turf() diff --git a/code/modules/hydroponics/grown/mushrooms.dm b/code/modules/hydroponics/grown/mushrooms.dm index e6d2484632..c001d6cb3b 100644 --- a/code/modules/hydroponics/grown/mushrooms.dm +++ b/code/modules/hydroponics/grown/mushrooms.dm @@ -149,6 +149,7 @@ endurance = 30 maturation = 5 yield = 1 + genes = list(/datum/plant_gene/trait/plant_type/fungal_metabolism, /datum/plant_gene/trait/eyes) growing_icon = 'icons/obj/hydroponics/growing_mushrooms.dmi' mutatelist = list() reagents_add = list(/datum/reagent/consumable/nutriment/vitamin = 0.05, /datum/reagent/consumable/nutriment = 0.15) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index ecbfa7584b..9c82cf34d3 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -226,7 +226,7 @@ var/turf/open/O = loc if(O.air) var/datum/gas_mixture/loc_air = O.air - if(loc_air.get_moles(/datum/gas/oxygen) > 13) + if(loc_air.get_moles(GAS_O2) > 13) return TRUE return FALSE diff --git a/code/modules/hydroponics/hydroponics.dm b/code/modules/hydroponics/hydroponics.dm index aca727ad8d..fa7decc437 100644 --- a/code/modules/hydroponics/hydroponics.dm +++ b/code/modules/hydroponics/hydroponics.dm @@ -391,6 +391,7 @@ mutate(4, 10, 2, 4, 50, 4, 10, 3) /obj/machinery/hydroponics/proc/mutatespecie() // Mutagent produced a new plant! + set waitfor = FALSE if(!myseed || dead) return diff --git a/code/modules/hydroponics/plant_genes.dm b/code/modules/hydroponics/plant_genes.dm index da19fa11f8..8485e20f61 100644 --- a/code/modules/hydroponics/plant_genes.dm +++ b/code/modules/hydroponics/plant_genes.dm @@ -419,6 +419,15 @@ else to_chat(user, "You need five lengths of cable to make a [G] battery!") +/datum/plant_gene/trait/eyes + name = "Oculary Mimicry" + /// Our googly eyes appearance. + var/mutable_appearance/googly + +/datum/plant_gene/trait/eyes/on_new(obj/item/reagent_containers/food/snacks/grown/G, newloc) + googly = mutable_appearance('icons/obj/hydroponics/harvest.dmi', "eyes") + googly.appearance_flags = RESET_COLOR + G.add_overlay(googly) /datum/plant_gene/trait/stinging name = "Hypodermic Prickles" diff --git a/code/modules/integrated_electronics/subtypes/atmospherics.dm b/code/modules/integrated_electronics/subtypes/atmospherics.dm index d449775bd1..b3056d46cf 100644 --- a/code/modules/integrated_electronics/subtypes/atmospherics.dm +++ b/code/modules/integrated_electronics/subtypes/atmospherics.dm @@ -19,7 +19,7 @@ /obj/item/integrated_circuit/atmospherics/Initialize() air_contents = new(volume) - ..() + return ..() /obj/item/integrated_circuit/atmospherics/return_air() return air_contents @@ -131,11 +131,10 @@ var/pressure_delta = target_pressure - target_air.return_pressure() if(pressure_delta > 0.1) var/transfer_moles = (pressure_delta*target_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY - var/datum/gas_mixture/removed = source_air.remove(transfer_moles) if(istype(snowflake)) //Snowflake check for tanks specifically, because tank ruptures are handled in a very snowflakey way that expects all tank interactions to be handled via the tank's procs - snowflake.assume_air(removed) + snowflake.assume_air_moles(source_air, transfer_moles) else - target_air.merge(removed) + source_air.transfer_to(target_air, transfer_moles) // - volume pump - // **Works** @@ -183,12 +182,10 @@ //The second part of the min caps the pressure built by the volume pumps to the max pump pressure var/transfer_ratio = min(transfer_rate,target_air.return_volume()*PUMP_MAX_PRESSURE/source_air.return_pressure())/source_air.return_volume() - var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY) - if(istype(snowflake)) - snowflake.assume_air(removed) + snowflake.assume_air_ratio(source_air, transfer_ratio * PUMP_EFFICIENCY) else - target_air.merge(removed) + source_air.transfer_ratio_to(target_air, transfer_ratio * PUMP_EFFICIENCY) // - gas vent - // **works** @@ -376,7 +373,7 @@ for(var/filtered_gas in removed.get_gases()) //Get the name of the gas and see if it is in the list - if(GLOB.meta_gas_names[filtered_gas] in wanted) + if(GLOB.gas_data.names[filtered_gas] in wanted) //The gas that is put in all the filtered out gases filtered_out.set_temperature(removed.return_temperature()) filtered_out.set_moles(filtered_gas, removed.get_moles(filtered_gas)) @@ -468,16 +465,12 @@ var/snowflakecheck = istype(gas_output, /obj/item/tank) - var/datum/gas_mixture/mix = source_1_gases.remove(transfer_moles * gas_percentage) if(snowflakecheck) - gas_output.assume_air(mix) + gas_output.assume_air_moles(source_1_gases, transfer_moles * gas_percentage) + gas_output.assume_air_moles(source_2_gases, transfer_moles * (1-gas_percentage)) else - output_gases.merge(mix) - mix = source_2_gases.remove(transfer_moles * (1-gas_percentage)) - if(snowflakecheck) - gas_output.assume_air(mix) - else - output_gases.merge(mix) + source_1_gases.transfer_to(output_gases, transfer_moles * gas_percentage) + source_2_gases.transfer_to(output_gases, transfer_moles * (1-gas_percentage)) // - integrated tank - // **works** diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 9abf5d86a0..f66931e253 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -1163,7 +1163,7 @@ var/list/gas_names = list() var/list/gas_amounts = list() for(var/id in air_contents.get_gases()) - var/name = GLOB.meta_gas_names[id] + var/name = GLOB.gas_data.names[id] var/amt = round(air_contents.get_moles(id), 0.001) gas_names.Add(name) gas_amounts.Add(amt) diff --git a/code/modules/integrated_electronics/subtypes/weaponized.dm b/code/modules/integrated_electronics/subtypes/weaponized.dm index 25fa7058fb..54b14cccbc 100644 --- a/code/modules/integrated_electronics/subtypes/weaponized.dm +++ b/code/modules/integrated_electronics/subtypes/weaponized.dm @@ -292,10 +292,7 @@ if(!source_air || !target_air) return - var/datum/gas_mixture/removed = source_air.remove(gas_per_throw) - if(!removed) - return - target_air.merge(removed) + source_air.transfer_to(target_air, gas_per_throw) // If the item is in a grabber circuit we'll update the grabber's outputs after we've thrown it. var/obj/item/integrated_circuit/manipulation/grabber/G = A.loc diff --git a/code/modules/jobs/job_types/head_of_personnel.dm b/code/modules/jobs/job_types/head_of_personnel.dm index f1b7d3e8c4..07c1a12ced 100644 --- a/code/modules/jobs/job_types/head_of_personnel.dm +++ b/code/modules/jobs/job_types/head_of_personnel.dm @@ -23,14 +23,14 @@ ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_VAULT, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY) minimal_access = list(ACCESS_SECURITY, ACCESS_SEC_DOORS, ACCESS_COURT, ACCESS_WEAPONS, ACCESS_MEDICAL, ACCESS_ENGINE, ACCESS_CHANGE_IDS, ACCESS_AI_UPLOAD, ACCESS_EVA, ACCESS_HEADS, ACCESS_ALL_PERSONAL_LOCKERS, ACCESS_MAINT_TUNNELS, ACCESS_BAR, ACCESS_JANITOR, ACCESS_CONSTRUCTION, ACCESS_MORGUE, ACCESS_CREMATORIUM, ACCESS_KITCHEN, ACCESS_HYDROPONICS, ACCESS_LAWYER, - ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_MINING, ACCESS_VAULT, ACCESS_MINING_STATION, - ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY, ACCESS_MINERAL_STOREROOM) + ACCESS_THEATRE, ACCESS_CHAPEL_OFFICE, ACCESS_LIBRARY, ACCESS_RESEARCH, ACCESS_VAULT, + ACCESS_HOP, ACCESS_RC_ANNOUNCE, ACCESS_KEYCARD_AUTH, ACCESS_GATEWAY) paycheck = PAYCHECK_COMMAND paycheck_department = ACCOUNT_SRV diff --git a/code/modules/jobs/job_types/quartermaster.dm b/code/modules/jobs/job_types/quartermaster.dm index 301acff5c4..ff811d30d1 100644 --- a/code/modules/jobs/job_types/quartermaster.dm +++ b/code/modules/jobs/job_types/quartermaster.dm @@ -25,7 +25,7 @@ minimal_access = list(ACCESS_MAINT_TUNNELS, ACCESS_MAILSORTING, ACCESS_CARGO, ACCESS_CARGO_BOT, ACCESS_QM, ACCESS_MINING, ACCESS_MINING_STATION, ACCESS_MINERAL_STOREROOM, ACCESS_KEYCARD_AUTH, ACCESS_RC_ANNOUNCE, ACCESS_SEC_DOORS, ACCESS_HEADS) - paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. + paycheck = PAYCHECK_HARD //They can already buy stuff using cargo budget, don't give em a command-level paycheck. //alright i'll agree to that -qweq paycheck_department = ACCOUNT_CAR display_order = JOB_DISPLAY_ORDER_QUARTERMASTER diff --git a/code/modules/keybindings/keybind/mob.dm b/code/modules/keybindings/keybind/mob.dm index 257ccc37e6..15911d831e 100644 --- a/code/modules/keybindings/keybind/mob.dm +++ b/code/modules/keybindings/keybind/mob.dm @@ -76,3 +76,15 @@ else user.mob.dropItemToGround(I) return TRUE + +/datum/keybinding/mob/examine_immediate + hotkey_keys = list() + classic_keys = list() + name = "examine_immediate" + full_name = "Examine (Immediate)" + description = "Immediately examine anything you're hovering your mouse over." + +/datum/keybinding/mob/examine_immediate/down(client/user) + var/atom/A = user.mouseObject + if(A) + A.attempt_examinate(user.mob) diff --git a/code/modules/lighting/emissive_blocker.dm b/code/modules/lighting/emissive_blocker.dm index 04c1bb7302..46dc44792b 100644 --- a/code/modules/lighting/emissive_blocker.dm +++ b/code/modules/lighting/emissive_blocker.dm @@ -7,9 +7,9 @@ * almost guaranteed to be doing something wrong. */ /atom/movable/emissive_blocker - name = "" - plane = EMISSIVE_BLOCKER_PLANE - layer = EMISSIVE_BLOCKER_LAYER + name = "emissive blocker" + plane = EMISSIVE_PLANE + layer = FLOAT_LAYER mouse_opacity = MOUSE_OPACITY_TRANSPARENT rad_flags = RAD_NO_CONTAMINATE | RAD_PROTECT_CONTENTS //Why? @@ -23,6 +23,8 @@ verbs.Cut() //Cargo culting from lighting object, this maybe affects memory usage? render_source = source + color = GLOB.em_block_color + /atom/movable/emissive_blocker/ex_act(severity) return FALSE diff --git a/code/modules/lighting/lighting_atom.dm b/code/modules/lighting/lighting_atom.dm index 71702bef12..f9df19d2ac 100644 --- a/code/modules/lighting/lighting_atom.dm +++ b/code/modules/lighting/lighting_atom.dm @@ -132,3 +132,54 @@ /mob/living/proc/mob_light(_color, _range, _power, _duration) var/obj/effect/dummy/lighting_obj/moblight/mob_light_obj = new (src, _color, _range, _power, _duration) return mob_light_obj + +// Setter for the light power of this atom. +/atom/proc/set_light_power(new_power) + if(new_power == light_power) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_POWER, new_power) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_power + light_power = new_power + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_POWER, .) + +/// Setter for the light range of this atom. +/atom/proc/set_light_range(new_range) + if(new_range == light_range) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_RANGE, new_range) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_range + light_range = new_range + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_RANGE, .) + +/// Setter for the light color of this atom. +/atom/proc/set_light_color(new_color) + if(new_color == light_color) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_COLOR, new_color) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_color + light_color = new_color + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_COLOR, .) +/* +/// Setter for whether or not this atom's light is on. +/atom/proc/set_light_on(new_value) + if(new_value == ) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_ON, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_on + light_on = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_ON, .) + +/// Setter for the light flags of this atom. +/atom/proc/set_light_flags(new_value) + if(new_value == light_flags) + return + if(SEND_SIGNAL(src, COMSIG_ATOM_SET_LIGHT_FLAGS, new_value) & COMPONENT_BLOCK_LIGHT_UPDATE) + return + . = light_flags + light_flags = new_value + SEND_SIGNAL(src, COMSIG_ATOM_UPDATE_LIGHT_FLAGS, .) +*/ diff --git a/code/modules/mapping/map_template.dm b/code/modules/mapping/map_template.dm index cc3bfc201e..c7bbef44c9 100644 --- a/code/modules/mapping/map_template.dm +++ b/code/modules/mapping/map_template.dm @@ -152,7 +152,6 @@ locate(min(T.x + width + 1, world.maxx), min(T.y + height + 1, world.maxy), T.z)) for(var/i in border) var/turf/turf_to_disable = i - 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() if(annihilate == MAP_TEMPLATE_ANNIHILATE_PRELOAD) diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 859ea58d26..ddec9232ce 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -196,7 +196,6 @@ parry_imperfect_falloff_percent = 20 parry_efficiency_to_counterattack = 100 // perfect parry or you're cringe parry_failed_stagger_duration = 1.5 SECONDS // a good time to reconsider your actions... - parry_failed_clickcd_duration = 1.5 SECONDS // or your failures /obj/item/kinetic_crusher/glaive/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) // if you're dumb enough to go for a parry... var/turf/proj_turf = owner.loc // destabilizer bolt, ignoring cooldown diff --git a/code/modules/mining/equipment/survival_pod.dm b/code/modules/mining/equipment/survival_pod.dm index f780d889ea..2452beb0e1 100644 --- a/code/modules/mining/equipment/survival_pod.dm +++ b/code/modules/mining/equipment/survival_pod.dm @@ -89,6 +89,11 @@ name = "large empty capsule" desc = "An extremly large capsule which requires power. Useful for projects all over." template_id = "shelter_delta" + +/obj/item/survivalcapsule/luxury/penthouse + name = "penthouse bluespace sheler capsule" + desc = "The absolute pinnacle of luxury in terms of survival capsules. While exuberantly expensive it has everything needed to make a small home in lavaland." + template_id = "shelter_epsilon" //Pod objects //Window @@ -307,7 +312,7 @@ /obj/item/energy_katana, /obj/item/hierophant_club, /obj/item/his_grace, - /obj/item/gun/ballistic/minigun, + /obj/item/gun/energy/minigun, /obj/item/gun/ballistic/automatic/l6_saw, /obj/item/gun/magic/staff/chaos, /obj/item/gun/magic/staff/spellblade, diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index a915a89c73..e64505df7e 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -61,37 +61,32 @@ new /obj/item/guardiancreator(src) /obj/structure/closet/crate/necropolis/tendril/weapon_armor/PopulateContents() - var/loot = rand(1,11) + var/loot = rand(1,10) switch(loot) if(1) new /obj/item/clothing/suit/space/hardsuit/cult(src) if(2) new /obj/item/katana/lavaland(src) if(3) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) - else - new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) - if(4) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src) - if(5) + if(4) new /obj/item/nullrod/scythe/talking(src) - if(6) + if(5) new /obj/item/nullrod/armblade(src) - if(7) + if(6) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src) - if(8) + if(7) new /obj/item/grenade/clusterbuster/inferno(src) - if(9) + if(8) new /obj/item/gun/magic/wand/book/shock(src) - if(10) + if(9) new /obj/item/gun/magic/wand/book/page(src) - if(11) + if(10) new /obj/item/gun/magic/wand/book/spark(src) /obj/structure/closet/crate/necropolis/tendril/misc/PopulateContents() - var/loot = rand(1,14) + var/loot = rand(1,12) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -106,31 +101,21 @@ if(6) new /obj/item/jacobs_ladder(src) if(7) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) - else - new /obj/item/disk/design_disk/modkit_disc/bounty(src) - if(8) new /obj/item/wisp_lantern(src) - if(9) + if(8) new /obj/item/pickaxe/rosegold(src) - if(10) + if(9) new /obj/item/bedsheet/cosmos(src) new /obj/item/melee/skateboard/hoverboard(src) - if(11) + if(10) new /obj/item/disk/tech_disk/illegal(src) - if(12) + if(11) new /obj/item/clothing/suit/space/hardsuit/cult(src) - if(13) + if(12) new /obj/item/katana/lavaland(src) - if(14) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) - else - new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) /obj/structure/closet/crate/necropolis/tendril/all/PopulateContents() - var/loot = rand(1,29) + var/loot = rand(1,28) switch(loot) if(1) new /obj/item/shared_storage/red(src) @@ -145,56 +130,51 @@ if(6) new /obj/item/jacobs_ladder(src) if(7) - if(prob(50)) - new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) - else - new /obj/item/disk/design_disk/modkit_disc/bounty(src) - if(8) new /obj/item/wisp_lantern(src) - if(9) + if(8) new /obj/item/pickaxe/rosegold(src) - if(10) + if(9) new /obj/item/bedsheet/cosmos(src) new /obj/item/melee/skateboard/hoverboard(src) - if(11) + if(10) new /obj/item/disk/tech_disk/illegal(src) - if(12) + if(11) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/beserker/old(src) - if(13) + if(12) new /obj/item/nullrod/scythe/talking(src) - if(14) + if(13) new /obj/item/nullrod/armblade(src) - if(15) + if(14) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor/old(src) - if(16) + if(15) new /obj/item/grenade/clusterbuster/inferno(src) - if(17) + if(16) new /obj/item/gun/magic/wand/book/shock(src) - if(18) + if(17) new /obj/item/gun/magic/wand/book/page(src) - if(19) + if(18) new /obj/item/gun/magic/wand/book/spark(src) - if(20) + if(19) new /obj/item/soulstone/anybody(src) - if(21) + if(20) new /obj/item/rod_of_asclepius(src) - if(22) + if(21) new /obj/item/organ/heart/cursed/wizard(src) - if(23) + if(22) new /obj/item/book/granter/spell/summonitem(src) - if(24) + if(23) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) - if(25) + if(24) new /obj/item/clothing/neck/necklace/memento_mori(src) - if(26) + if(25) new /obj/item/warp_cube/red(src) - if(27) + if(26) new /obj/item/immortality_talisman(src) - if(28) + if(27) new /obj/item/gun/magic/wand/book/healing(src) - if(29) + if(28) new /obj/item/guardiancreator(src) //KA modkit design discs diff --git a/code/modules/mining/machine_redemption.dm b/code/modules/mining/machine_redemption.dm index 6cba540ca0..1adc951447 100644 --- a/code/modules/mining/machine_redemption.dm +++ b/code/modules/mining/machine_redemption.dm @@ -145,8 +145,11 @@ D.createmessage("Ore Redemption Machine", "New minerals available!", msg, 1, 0) /obj/machinery/mineral/ore_redemption/process() - if(!materials.mat_container || panel_open || !powered()) - return + if(materials.mat_container && !panel_open && powered()) + process_all_ores() + +/obj/machinery/mineral/ore_redemption/proc/process_all_ores() + set waitfor = FALSE var/atom/input = get_step(src, input_dir) var/obj/structure/ore_box/OB = locate() in input if(OB) @@ -165,6 +168,7 @@ else if(!message_sent) send_console_message() + /obj/machinery/mineral/ore_redemption/attackby(obj/item/W, mob/user, params) if(default_unfasten_wrench(user, W)) return diff --git a/code/modules/mining/machine_unloading.dm b/code/modules/mining/machine_unloading.dm index dc7caa12c8..b39b0df6ab 100644 --- a/code/modules/mining/machine_unloading.dm +++ b/code/modules/mining/machine_unloading.dm @@ -10,22 +10,25 @@ output_dir = EAST speed_process = TRUE -/obj/machinery/mineral/unloading_machine/process() - var/turf/T = get_step(src,input_dir) - if(T) - var/limit - for(var/obj/structure/ore_box/B in T) - for (var/obj/item/stack/ore/O in B) - B.contents -= O - unload_mineral(O) - limit++ - if (limit>=10) - return - CHECK_TICK - CHECK_TICK - for(var/obj/item/I in T) - unload_mineral(I) +/obj/machinery/mineral/unloading_machine/proc/horrible_quadratic_monster(var/turf/T) + set waitfor = FALSE + var/limit = 0 + for(var/obj/structure/ore_box/B in T) + for (var/obj/item/stack/ore/O in B) + B.contents -= O + unload_mineral(O) limit++ if (limit>=10) return CHECK_TICK + for(var/obj/item/I in T) + unload_mineral(I) + limit++ + if (limit>=10) + return + CHECK_TICK + +/obj/machinery/mineral/unloading_machine/process() + var/turf/T = get_step(src,input_dir) + if(T) + horrible_quadratic_monster(T) diff --git a/code/modules/mining/machine_vending.dm b/code/modules/mining/machine_vending.dm index 8a7c3a81bd..7a3cd9140b 100644 --- a/code/modules/mining/machine_vending.dm +++ b/code/modules/mining/machine_vending.dm @@ -57,6 +57,7 @@ new /datum/data/mining_equipment("Luxury Shelter Capsule", /obj/item/survivalcapsule/luxury, 3000), new /datum/data/mining_equipment("Luxury Bar Capsule", /obj/item/survivalcapsule/luxury/elitebar, 10000), new /datum/data/mining_equipment("Empty Capsule", /obj/item/survivalcapsule/luxury/empty, 5000), + new /datum/data/mining_equipment("Penthouse Capsule", /obj/item/survivalcapsule/luxury/penthouse, 15000), new /datum/data/mining_equipment("Nanotrasen Minebot", /mob/living/simple_animal/hostile/mining_drone, 800), new /datum/data/mining_equipment("Minebot Melee Upgrade", /obj/item/mine_bot_upgrade, 400), new /datum/data/mining_equipment("Minebot Armor Upgrade", /obj/item/mine_bot_upgrade/health, 400), diff --git a/code/modules/mining/mint.dm b/code/modules/mining/mint.dm index 2a8e0f2516..f8a4ba4a72 100644 --- a/code/modules/mining/mint.dm +++ b/code/modules/mining/mint.dm @@ -64,8 +64,6 @@ if(materials.use_amount_mat(coin_mat, chosen)) for(var/coin_to_make in 1 to 5) create_coins() - produced_coins++ - CHECK_TICK else var/found_new = FALSE for(var/datum/material/inserted_material in materials.materials) @@ -131,6 +129,7 @@ return TRUE /obj/machinery/mineral/mint/proc/create_coins() + set waitfor = FALSE var/turf/T = get_step(src,output_dir) var/temp_list = list() temp_list[chosen] = 400 @@ -143,3 +142,5 @@ O.forceMove(bag_to_use) //don't bother sending the signal, the new bag is empty and all that. SSblackbox.record_feedback("amount", "coins_minted", 1) + produced_coins++ + CHECK_TICK diff --git a/code/modules/mining/shelters.dm b/code/modules/mining/shelters.dm index 6bd04ffd6d..83a8412ca8 100644 --- a/code/modules/mining/shelters.dm +++ b/code/modules/mining/shelters.dm @@ -85,3 +85,14 @@ . = ..() whitelisted_turfs = typecacheof(/turf/closed/mineral) banned_objects = typecacheof(/obj/structure/stone_tile) + +/datum/map_template/shelter/epsilon + name = "Shelter Epsilon" + shelter_id = "shelter_epsilon" + description = "A small apartment in the palm of your hand." + mappath = "_maps/templates/shelter_5.dmm" + +/datum/map_template/shelter/epsilon/New() + . = ..() + whitelisted_turfs = typecacheof(/turf/closed/mineral) + banned_objects = typecacheof(/obj/structure/stone_tile) diff --git a/code/modules/mob/dead/dead.dm b/code/modules/mob/dead/dead.dm index 223366c7ab..5647bc2305 100644 --- a/code/modules/mob/dead/dead.dm +++ b/code/modules/mob/dead/dead.dm @@ -91,7 +91,7 @@ INITIALIZE_IMMEDIATE(/mob/dead) var/client/C = client to_chat(C, "Sending you to [pick].") - new /obj/screen/splash(C) + new /atom/movable/screen/splash(C) mob_transforming = TRUE sleep(29) //let the animation play diff --git a/code/modules/mob/dead/new_player/new_player.dm b/code/modules/mob/dead/new_player/new_player.dm index 11f1d58c0c..f7f3450f6e 100644 --- a/code/modules/mob/dead/new_player/new_player.dm +++ b/code/modules/mob/dead/new_player/new_player.dm @@ -21,7 +21,7 @@ /mob/dead/new_player/Initialize() if(client && SSticker.state == GAME_STATE_STARTUP) - var/obj/screen/splash/S = new(client, TRUE, TRUE) + var/atom/movable/screen/splash/S = new(client, TRUE, TRUE) S.Fade(TRUE) if(length(GLOB.newplayer_start)) @@ -567,7 +567,7 @@ if(job && !job.override_latejoin_spawn(character)) SSjob.SendToLateJoin(character) if(!arrivals_docked) - var/obj/screen/splash/Spl = new(character.client, TRUE) + var/atom/movable/screen/splash/Spl = new(character.client, TRUE) Spl.Fade(TRUE) character.playsound_local(get_turf(character), 'sound/voice/ApproachingTG.ogg', 25) diff --git a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm index e17dc43950..b5ba7f0732 100644 --- a/code/modules/mob/dead/new_player/sprite_accessories/tails.dm +++ b/code/modules/mob/dead/new_player/sprite_accessories/tails.dm @@ -436,13 +436,27 @@ /datum/sprite_accessory/tails/human/shark name = "Shark" - icon_state = "shark" + icon_state = "carp" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/human/shark name = "Shark" + icon_state = "carp" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails/human/sharkalt + name = "Shark (alt)" + icon_state = "shark" + color_src = MATRIXED + icon = 'modular_citadel/icons/mob/mam_tails.dmi' + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails_animated/human/sharkalt + name = "Shark (alt)" icon_state = "shark" color_src = MATRIXED icon = 'modular_citadel/icons/mob/mam_tails.dmi' @@ -679,7 +693,7 @@ icon_state = "crow" matrixed_sections = MATRIX_RED -/datum/sprite_accessory/tails/mam_tail/cow +/datum/sprite_accessory/tails/mam_tails/cow name = "Cow" icon_state = "cow" matrixed_sections = MATRIX_RED @@ -897,11 +911,21 @@ /datum/sprite_accessory/tails/mam_tails/shark name = "Shark" - icon_state = "shark" + icon_state = "carp" matrixed_sections = MATRIX_RED /datum/sprite_accessory/tails_animated/mam_tails_animated/shark name = "Shark" + icon_state = "carp" + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails/mam_tails/sharkalt + name = "Shark (alt)" + icon_state = "shark" + matrixed_sections = MATRIX_RED + +/datum/sprite_accessory/tails_animated/mam_tails_animated/sharkalt + name = "Shark (alt)" icon_state = "shark" matrixed_sections = MATRIX_RED diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 6c464c3cd1..429f00161b 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -447,7 +447,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp if(message) to_chat(src, "[message]") if(source) - var/obj/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /obj/screen/alert/notify_cloning) + var/atom/movable/screen/alert/A = throw_alert("[REF(source)]_notify_cloning", /atom/movable/screen/alert/notify_cloning) if(A) if(client && client.prefs && client.prefs.UI_style) A.icon = ui_style2icon(client.prefs.UI_style) diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index cf1a158fc5..7615792028 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -39,29 +39,35 @@ return if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. - - //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER)) + if(integrating_blood > 0) + var/blood_integrated = max(integrating_blood - 1, 0) + var/blood_diff = integrating_blood - blood_integrated + integrating_blood = blood_integrated + if(blood_volume < BLOOD_VOLUME_MAXIMUM) + blood_volume += blood_diff + if(blood_volume < BLOOD_VOLUME_NORMAL) var/nutrition_ratio = 0 - switch(nutrition) - if(0 to NUTRITION_LEVEL_STARVING) - nutrition_ratio = 0.2 - if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - nutrition_ratio = 0.4 - if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) - nutrition_ratio = 0.6 - if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) - nutrition_ratio = 0.8 - else - nutrition_ratio = 1 - if(satiety > 80) - nutrition_ratio *= 1.25 - adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) - blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) + if(!HAS_TRAIT(src, TRAIT_NOHUNGER)) + switch(nutrition) + if(0 to NUTRITION_LEVEL_STARVING) + nutrition_ratio = 0.2 + if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) + nutrition_ratio = 0.4 + if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FED) + nutrition_ratio = 0.6 + if(NUTRITION_LEVEL_FED to NUTRITION_LEVEL_WELL_FED) + nutrition_ratio = 0.8 + else + nutrition_ratio = 1 + if(satiety > 80) + nutrition_ratio *= 1.25 + adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR) + blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio) //Effects of bloodloss var/word = pick("dizzy","woozy","faint") - switch(blood_volume) + var/blood_effect_volume = blood_volume + integrating_blood + switch(blood_effect_volume) if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS) if(prob(10)) to_chat(src, "You feel terribly bloated.") @@ -94,14 +100,22 @@ bleed(temp_bleed) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/proc/bleed(amt) - if(blood_volume) +/mob/living/carbon/proc/bleed(amt, force) + var/bled = FALSE //Have we bled amnt? + if(blood_volume > amt || force && blood_volume) blood_volume = max(blood_volume - amt, 0) - if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean - if(amt >= 10) - add_splatter_floor(src.loc) - else - add_splatter_floor(src.loc, 1) + bled = TRUE + if(integrating_blood > amt || force && integrating_blood) + integrating_blood = max(integrating_blood - amt, 0) + bled = TRUE + if(!bled && !force) //If we are already cycling back through, don't do this again + bleed(amt, TRUE) //we cycle back through to try to bleed SOMETHING, not neccesarily the required amount + return + if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean + if(amt >= 10) + add_splatter_floor(src.loc) + else + add_splatter_floor(src.loc, TRUE) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod @@ -114,6 +128,7 @@ /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) + integrating_blood = 0 /mob/living/carbon/restore_blood() blood_volume = (BLOOD_VOLUME_NORMAL * blood_ratio) @@ -368,10 +383,17 @@ return blood_ratio = 1 -/mob/living/proc/AdjustBloodVol(var/value) +/mob/living/proc/AdjustBloodVol(value) if(blood_ratio == value) return blood_ratio = value if(ishuman(src)) var/mob/living/carbon/human/H = src H.handle_blood() + +/mob/living/proc/adjust_integration_blood(value, remove_actual_blood, force) + if(integrating_blood + value < 0 && remove_actual_blood) + blood_volume += value + integrating_blood + blood_volume = max(blood_volume, 0) + integrating_blood += value + integrating_blood = clamp(integrating_blood, 0, force ? INFINITY : (BLOOD_VOLUME_MAXIMUM - (integrating_blood + blood_volume))) diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index f5970d9da2..e9a62d209b 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -78,7 +78,7 @@ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT) //Body temperature is too hot. - throw_alert("alien_fire", /obj/screen/alert/alien_fire) + throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) switch(bodytemperature) if(360 to 400) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) 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 0ce8482ca1..a7044174b0 100644 --- a/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm +++ b/code/modules/mob/living/carbon/alien/humanoid/caste/hunter.dm @@ -7,7 +7,7 @@ meleeKnockdownPower = 75 meleeSlashHumanPower = 20 meleeSlashSAPower = 45 - var/obj/screen/leap_icon = null + var/atom/movable/screen/leap_icon = null /mob/living/carbon/alien/humanoid/hunter/create_internal_organs() internal_organs += new /obj/item/organ/alien/plasmavessel/small diff --git a/code/modules/mob/living/carbon/alien/life.dm b/code/modules/mob/living/carbon/alien/life.dm index 0a2434055f..530d2acd63 100644 --- a/code/modules/mob/living/carbon/alien/life.dm +++ b/code/modules/mob/living/carbon/alien/life.dm @@ -16,20 +16,20 @@ var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME //Partial pressure of the toxins in our breath - var/Toxins_pp = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure + var/Toxins_pp = (breath.get_moles(GAS_PLASMA)/breath.total_moles())*breath_pressure if(Toxins_pp > tox_detect_threshold) // Detect toxins in air - adjustPlasma(breath.get_moles(/datum/gas/plasma)*250) - throw_alert("alien_tox", /obj/screen/alert/alien_tox) + adjustPlasma(breath.get_moles(GAS_PLASMA)*250) + throw_alert("alien_tox", /atom/movable/screen/alert/alien_tox) - toxins_used = breath.get_moles(/datum/gas/plasma) + toxins_used = breath.get_moles(GAS_PLASMA) else clear_alert("alien_tox") //Breathe in toxins and out oxygen - breath.adjust_moles(/datum/gas/plasma, -toxins_used) - breath.adjust_moles(/datum/gas/oxygen, toxins_used) + breath.adjust_moles(GAS_PLASMA, -toxins_used) + breath.adjust_moles(GAS_O2, toxins_used) //BREATH TEMPERATURE handle_breath_temperature(breath) diff --git a/code/modules/mob/living/carbon/alien/organs.dm b/code/modules/mob/living/carbon/alien/organs.dm index 8e3966eb03..41c3882de6 100644 --- a/code/modules/mob/living/carbon/alien/organs.dm +++ b/code/modules/mob/living/carbon/alien/organs.dm @@ -85,7 +85,7 @@ owner.adjustOxyLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt) if(owner.blood_volume && (owner.blood_volume < BLOOD_VOLUME_NORMAL)) - owner.blood_volume += 5 + owner.adjust_integration_blood(5) else owner.adjustPlasma(plasma_rate * 0.1) @@ -141,7 +141,7 @@ owner.stuttering += 30 recent_queen_death = 1 - owner.throw_alert("alien_noqueen", /obj/screen/alert/alien_vulnerable) + owner.throw_alert("alien_noqueen", /atom/movable/screen/alert/alien_vulnerable) addtimer(CALLBACK(src, .proc/clear_queen_death), QUEEN_DEATH_DEBUFF_DURATION) diff --git a/code/modules/mob/living/carbon/alien/status_procs.dm b/code/modules/mob/living/carbon/alien/status_procs.dm index 71d61cab25..e20b20ef3d 100644 --- a/code/modules/mob/living/carbon/alien/status_procs.dm +++ b/code/modules/mob/living/carbon/alien/status_procs.dm @@ -2,7 +2,7 @@ //The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage, // eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait. -/mob/living/carbon/alien/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) +/mob/living/carbon/alien/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg, knocktofloor) return //no /////////////////////////////////// STUN //////////////////////////////////// diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index a0beb07fab..f6ef8e8177 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -57,7 +57,7 @@ var/oindex = active_hand_index active_hand_index = held_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[oindex]"] if(H) H.update_icon() @@ -158,7 +158,7 @@ throw_mode_off() if(!target || !isturf(loc)) return - if(istype(target, /obj/screen)) + if(istype(target, /atom/movable/screen)) return //CIT CHANGES - makes it impossible to throw while in stamina softcrit @@ -358,10 +358,11 @@ return I.item_flags |= BEING_REMOVED breakouttime = I.breakouttime + var/datum/cuffbreak_checker/cuffbreak_checker = new(get_turf(src), istype(I, /obj/item/restraints)? I : null) 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, required_mobility_flags = MOBILITY_RESIST)) + if(do_after_advanced(src, breakouttime, src, NONE, CALLBACK(cuffbreak_checker, /datum/cuffbreak_checker.proc/check_movement), required_mobility_flags = MOBILITY_RESIST)) clear_cuffs(I, cuff_break) else to_chat(src, "You fail to remove [I]!") @@ -370,15 +371,36 @@ 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, required_mobility_flags = MOBILITY_RESIST)) + if(do_after_advanced(src, breakouttime, src, NONE, CALLBACK(cuffbreak_checker, /datum/cuffbreak_checker.proc/check_movement), required_mobility_flags = MOBILITY_RESIST)) 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) + + QDEL_NULL(cuffbreak_checker) I.item_flags &= ~BEING_REMOVED +/datum/cuffbreak_checker + var/turf/last + var/obj/item/restraints/cuffs + +/datum/cuffbreak_checker/New(turf/initial_turf, obj/item/restraints/R) + last = initial_turf + if(R) + cuffs = R + +/datum/cuffbreak_checker/proc/check_movement(atom/user, delay, atom/target, time_left, do_after_flags, required_mobility_flags, required_combat_flags, mob_redirect, stage, initially_held_item, tool, list/passed_in) + if(get_turf(user) != last) + last = get_turf(user) + passed_in[1] = 0.5 + if(cuffs && !cuffs.allow_breakout_movement) + return DO_AFTER_STOP + else + passed_in[1] = 1 + return DO_AFTER_CONTINUE + /mob/living/carbon/proc/uncuff() if (handcuffed) var/obj/item/W = handcuffed @@ -459,10 +481,6 @@ if(HAS_TRAIT(src, TRAIT_CLUMSY)) modifier -= 40 //Clumsy people are more likely to hit themselves -Honk! - //CIT CHANGES START HERE - else if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - modifier -= 50 - if(modifier < 100) dropItemToGround(I) //END OF CIT CHANGES @@ -503,7 +521,7 @@ return ..() /mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) - if((HAS_TRAIT(src, TRAIT_NOHUNGER) || HAS_TRAIT(src, TRAIT_TOXINLOVER)) && !force) + if(HAS_TRAIT(src, TRAIT_NOHUNGER) && !force) return TRUE if(nutrition < 100 && !blood && !force) @@ -681,7 +699,7 @@ become_blind(EYES_COVERED) else if(tinttotal >= TINT_DARKENED) cure_blind(EYES_COVERED) - overlay_fullscreen("tint", /obj/screen/fullscreen/impaired, 2) + overlay_fullscreen("tint", /atom/movable/screen/fullscreen/impaired, 2) else cure_blind(EYES_COVERED) clear_fullscreen("tint", 0) @@ -757,10 +775,10 @@ visionseverity = 9 if(-INFINITY to -24) visionseverity = 10 - overlay_fullscreen("critvision", /obj/screen/fullscreen/crit/vision, visionseverity) + overlay_fullscreen("critvision", /atom/movable/screen/fullscreen/crit/vision, visionseverity) else clear_fullscreen("critvision") - overlay_fullscreen("crit", /obj/screen/fullscreen/crit, severity) + overlay_fullscreen("crit", /atom/movable/screen/fullscreen/crit, severity) else clear_fullscreen("crit") clear_fullscreen("critvision") @@ -784,7 +802,7 @@ severity = 6 if(45 to INFINITY) severity = 7 - overlay_fullscreen("oxy", /obj/screen/fullscreen/oxy, severity) + overlay_fullscreen("oxy", /atom/movable/screen/fullscreen/oxy, severity) else clear_fullscreen("oxy") @@ -805,7 +823,7 @@ severity = 5 if(85 to INFINITY) severity = 6 - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -870,7 +888,7 @@ if(handcuffed) drop_all_held_items() stop_pulling() - throw_alert("handcuffed", /obj/screen/alert/restrained/handcuffed, new_master = src.handcuffed) + throw_alert("handcuffed", /atom/movable/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 @@ -949,7 +967,9 @@ /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 + var/datum/component/acid/acid = I.GetComponent(/datum/component/acid) + if(acid) + acid.level = 0 I.extinguish() //extinguishes our clothes ..() @@ -1253,3 +1273,6 @@ var/mob/living/carbon/C = usr if(I.can_give()) C.give(src) + +/mob/living/carbon/proc/functional_blood() + return blood_volume + integrating_blood diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index b2c14c30fe..46ba9a5eb0 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -361,7 +361,7 @@ return embeds -/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/carbon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) . = ..() var/damage = override_protection ? intensity : intensity - get_eye_protection() diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 05eefd4482..d13a0f1149 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -797,6 +797,7 @@ dna.remove_mutation(HM.name) if(blood_volume < (BLOOD_VOLUME_NORMAL*blood_ratio)) blood_volume = (BLOOD_VOLUME_NORMAL*blood_ratio) + integrating_blood = 0 ..() /mob/living/carbon/human/check_weakness(obj/item/weapon, mob/living/attacker) @@ -813,7 +814,7 @@ ..() /mob/living/carbon/human/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, vomit_type = VOMIT_TOXIC, harm = TRUE, force = FALSE, purge_ratio = 0.1) - if(blood && dna?.species && (NOBLOOD in dna.species.species_traits) && !HAS_TRAIT(src, TRAIT_TOXINLOVER)) + if(blood && dna?.species && (NOBLOOD in dna.species.species_traits)) if(message) visible_message("[src] dry heaves!", \ "You try to throw up, but there's nothing in your stomach!") @@ -1027,10 +1028,10 @@ return if(!HAS_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN)) //if we want to ignore slowdown from damage, but not from equipment var/scaling = maxHealth / 100 - var/health_deficiency = ((maxHealth / scaling) - (health / scaling) + (getStaminaLoss()*0.75))//CIT CHANGE - reduces the impact of staminaloss and makes stamina buffer influence it + var/health_deficiency = max(((maxHealth / scaling) - (health / scaling)), (getStaminaLoss()*0.75)) if(health_deficiency >= 40) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency-39) / 75) - add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency-39) / 25) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown, TRUE, (health_deficiency - 15) / 75) + add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying, TRUE, (health_deficiency - 15) / 25) else remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown) remove_movespeed_modifier(/datum/movespeed_modifier/damage_slowdown_flying) @@ -1073,9 +1074,9 @@ if(HAS_TRAIT(src, TRAIT_TOXINLOVER)) return "" if(isplasmaman(src)) - return "" if(isgolem(src)) - return "" return "" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a74afc10f5..1174fcba70 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -409,7 +409,7 @@ return var/informed = FALSE if(isrobotic(src)) - apply_status_effect(/datum/status_effect/no_combat_mode/robotic_emp, severity / 20) + apply_status_effect(/datum/status_effect/robotic_emp, severity / 20) severity *= 0.5 var/do_not_stun = FALSE if(HAS_TRAIT(src, TRAIT_ROBOTIC_ORGANISM)) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 102f3df65d..de934318b3 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -15,7 +15,6 @@ block_parry_data = /datum/block_parry_data/unarmed/human default_block_parry_data = /datum/block_parry_data/unarmed/human - causes_dirt_buildup_on_floor = TRUE //Hair colour and style var/hair_color = "000" @@ -52,6 +51,9 @@ var/obj/item/l_store = null var/obj/item/s_store = null + /// When an braindead player has their equipment fiddled with, we log that info here for when they come back so they know who took their ID while they were DC'd for 30 seconds + var/list/afk_thefts + var/special_voice = "" // For changing our voice. Used by a symptom. var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding @@ -143,7 +145,7 @@ ) parry_efficiency_considered_successful = 0.01 - parry_efficiency_to_counterattack = 0.01 + parry_efficiency_to_counterattack = INFINITY // no counterattacks parry_max_attacks = INFINITY parry_failed_cooldown_duration = 1.5 SECONDS parry_failed_stagger_duration = 1 SECONDS diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index 7e3b2ab015..2e530226c8 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -182,3 +182,8 @@ destination.underwear = underwear destination.undershirt = undershirt destination.socks = socks + +/mob/living/carbon/human/adjust_integration_blood(value, force) + if(NOBLOOD in dna.species.species_traits) //Can't lose blood if your species doesn't have any + return + . = ..() diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 1619d0f6de..54d6771c6c 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -90,13 +90,31 @@ //End bloody footprints S.step_action() + if(movement_type & GROUND) + dirt_buildup() /mob/living/carbon/human/Process_Spacemove(movement_dir = 0) //Temporary laziness thing. Will change to handles by species reee. if(dna.species.space_move(src)) return TRUE return ..() -/mob/living/carbon/human/dirt_buildup(strength) +/mob/living/carbon/human/proc/dirt_buildup(strength = 1) if(!shoes || !(shoes.body_parts_covered & FEET)) return // barefoot advantage - return ..() + var/turf/open/T = loc + if(!istype(T) || !T.dirt_buildup_allowed) + return + var/area/A = T.loc + if(!A.dirt_buildup_allowed) + return + var/multiplier = CONFIG_GET(number/turf_dirty_multiplier) + strength *= multiplier + var/obj/effect/decal/cleanable/dirt/D = locate() in T + if(D) + D.dirty(strength) + else + T.dirtyness += strength + if(T.dirtyness >= (isnull(T.dirt_spawn_threshold)? CONFIG_GET(number/turf_dirt_threshold) : T.dirt_spawn_threshold)) + D = new /obj/effect/decal/cleanable/dirt(T) + D.dirty(T.dirt_spawn_threshold - T.dirtyness) + T.dirtyness = 0 // reset. diff --git a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm index f2ffaec84c..c8f870bf2a 100644 --- a/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm +++ b/code/modules/mob/living/carbon/human/innate_abilities/blobform.dm @@ -56,7 +56,6 @@ ADD_TRAIT(H, TRAIT_MOBILITY_NOPICKUP, SLIMEPUDDLE_TRAIT) ADD_TRAIT(H, TRAIT_MOBILITY_NOUSE, SLIMEPUDDLE_TRAIT) ADD_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT) - ADD_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT) ADD_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT) ADD_TRAIT(H, TRAIT_ARMOR_BROKEN, SLIMEPUDDLE_TRAIT) H.update_disabled_bodyparts(silent = TRUE) //silently update arms to be paralysed @@ -99,7 +98,6 @@ REMOVE_TRAIT(H, TRAIT_MOBILITY_NOPICKUP, SLIMEPUDDLE_TRAIT) REMOVE_TRAIT(H, TRAIT_MOBILITY_NOUSE, SLIMEPUDDLE_TRAIT) REMOVE_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT) - REMOVE_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT) REMOVE_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT) REMOVE_TRAIT(H, TRAIT_ARMOR_BROKEN, SLIMEPUDDLE_TRAIT) REMOVE_TRAIT(H, TRAIT_HUMAN_NO_RENDER, SLIMEPUDDLE_TRAIT) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index c4d023da58..b135ae9cd8 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -209,7 +209,7 @@ update_tint() if(G.vision_correction) if(HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha)) update_sight() if(!QDELETED(src)) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 767250c863..b43cd266be 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -89,15 +89,15 @@ var/datum/species/S = dna.species if(S.breathid == "o2") - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) else if(S.breathid == "tox") - throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) + throw_alert("not_enough_tox", /atom/movable/screen/alert/not_enough_tox) else if(S.breathid == "co2") - throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) + throw_alert("not_enough_co2", /atom/movable/screen/alert/not_enough_co2) else if(S.breathid == "n2") - throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) + throw_alert("not_enough_nitro", /atom/movable/screen/alert/not_enough_nitro) else if(S.breathid == "ch3br") - throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) + throw_alert("not_enough_ch3br", /atom/movable/screen/alert/not_enough_ch3br) return FALSE else diff --git a/code/modules/mob/living/carbon/human/login.dm b/code/modules/mob/living/carbon/human/login.dm index a89921143a..ebf76eeafa 100644 --- a/code/modules/mob/living/carbon/human/login.dm +++ b/code/modules/mob/living/carbon/human/login.dm @@ -2,3 +2,33 @@ ..() if(dna?.species?.has_field_of_vision && CONFIG_GET(flag/use_field_of_vision)) LoadComponent(/datum/component/field_of_vision, field_of_vision_type) + + if(!LAZYLEN(afk_thefts)) + return + + var/list/print_msg = list() + print_msg += "*---------*" + print_msg += "As you snap back to consciousness, you recall people messing with your stuff..." + + afk_thefts = reverseRange(afk_thefts) + + for(var/list/iter_theft as anything in afk_thefts) + if(!islist(iter_theft) || LAZYLEN(iter_theft) != AFK_THEFT_TIME) + stack_trace("[src] ([ckey]) returned to their body and had a null/malformed afk_theft entry. Contents: [json_encode(iter_theft)]") + continue + + var/thief_name = iter_theft[AFK_THEFT_NAME] + var/theft_message = iter_theft[AFK_THEFT_MESSAGE] + var/time_since = world.time - iter_theft[AFK_THEFT_TIME] + + if(time_since > AFK_THEFT_FORGET_DETAILS_TIME) + print_msg += "\tSomeone [theft_message], but it was at least [DisplayTimeText(AFK_THEFT_FORGET_DETAILS_TIME)] ago." + else + print_msg += "\t[thief_name] [theft_message] roughly [DisplayTimeText(time_since, 10)] ago." + + if(LAZYLEN(afk_thefts) >= AFK_THEFT_MAX_MESSAGES) + print_msg += "There may have been more, but that's all you can remember..." + print_msg += "*---------*" + + to_chat(src, print_msg.Join("\n")) + LAZYNULL(afk_thefts) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 96a44792a8..6f94be2d41 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -439,6 +439,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. */ /datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) + set waitfor = FALSE // Drop the items the new species can't wear for(var/slot_id in no_equip) var/obj/item/thing = C.get_item_by_slot(slot_id) @@ -679,7 +680,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/mutable_appearance/hair_overlay = mutable_appearance(layer = -HAIR_LAYER) if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain if(!(NOBLOOD in species_traits)) - hair_overlay.icon = 'icons/mob/hair.dmi' + hair_overlay.icon = 'icons/mob/human_parts.dmi' hair_overlay.icon_state = "debrained" else if(H.hair_style && (HAIR in species_traits)) @@ -1364,7 +1365,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) /datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H) if(chem.type == exotic_blood && !istype(exotic_blood, /datum/reagent/blood)) - H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM) + H.adjust_integration_blood(round(chem.volume, 0.1)) H.reagents.del_reagent(chem.type) return TRUE return FALSE @@ -1458,13 +1459,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) switch(H.nutrition) if(NUTRITION_LEVEL_FULL to INFINITY) - H.throw_alert("nutrition", /obj/screen/alert/fat) + H.throw_alert("nutrition", /atom/movable/screen/alert/fat) if(NUTRITION_LEVEL_HUNGRY to NUTRITION_LEVEL_FULL) H.clear_alert("nutrition") if(NUTRITION_LEVEL_STARVING to NUTRITION_LEVEL_HUNGRY) - H.throw_alert("nutrition", /obj/screen/alert/hungry) + H.throw_alert("nutrition", /atom/movable/screen/alert/hungry) if(0 to NUTRITION_LEVEL_STARVING) - H.throw_alert("nutrition", /obj/screen/alert/starving) + H.throw_alert("nutrition", /atom/movable/screen/alert/starving) /datum/species/proc/update_health_hud(mob/living/carbon/human/H) return 0 @@ -1589,12 +1590,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) var/punchedbrute = target.getBruteLoss() //CITADEL CHANGES - makes resting and disabled combat mode reduce punch damage, makes being out of combat mode result in you taking more damage - if(!SEND_SIGNAL(target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - damage *= 1.2 if(!CHECK_MOBILITY(user, MOBILITY_STAND)) damage *= 0.65 - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - damage *= 0.8 //END OF CITADEL CHANGES var/obj/item/bodypart/affecting = target.get_bodypart(ran_zone(user.zone_selected)) @@ -1718,12 +1715,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) else user.do_attack_animation(target, ATTACK_EFFECT_DISARM) - if(HAS_TRAIT(user, TRAIT_PUGILIST))//CITADEL CHANGE - makes disarmspam cause staminaloss, pugilists can do it almost effortlessly - if(!user.UseStaminaBuffer(1, warn = TRUE)) - return - else - if(!user.UseStaminaBuffer(1, warn = TRUE)) - return + if(!user.UseStaminaBuffer(1, warn = TRUE)) + return if(attacker_style && attacker_style.disarm_act(user,target)) return TRUE @@ -1741,12 +1734,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) log_combat(user, target, "disarmed out of grab from") return var/randn = rand(1, 100) - if(SEND_SIGNAL(target, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) // CITADEL CHANGE - randn += -10 //CITADEL CHANGE - being out of combat mode makes it easier for you to get disarmed if(!CHECK_MOBILITY(user, MOBILITY_STAND)) //CITADEL CHANGE randn += 100 //CITADEL CHANGE - No kosher disarming if you're resting - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) //CITADEL CHANGE - randn += 25 //CITADEL CHANGE - Makes it harder to disarm outside of combat mode if(user.pulling == target) randn -= 20 //If you have the time to get someone in a grab, you should have a greater chance at snatching the thing in their hand. Will be made completely obsolete by the grab rework but i've got a poor track record for releasing big projects on time so w/e i guess if(HAS_TRAIT(user, TRAIT_PUGILIST)) @@ -1951,9 +1940,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(IS_STAMCRIT(user)) to_chat(user, "You're too exhausted for that.") return - if(SEND_SIGNAL(user, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - to_chat(user, "You need combat mode to be active to that!") - return if(user.IsKnockdown() || user.IsParalyzed() || user.IsStun()) to_chat(user, "You can't seem to force yourself up right now!") return @@ -1993,6 +1979,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(CHECK_MOBILITY(target, MOBILITY_STAND)) target.adjustStaminaLoss(5) + else + target.adjustStaminaLoss(target.getStaminaLoss() > 75? 5 : 75) if(target.is_shove_knockdown_blocked()) return @@ -2035,7 +2023,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) target.visible_message("[user.name] shoves [target.name]!", "[user.name] shoves you!", null, COMBAT_MESSAGE_RANGE, null, user, "You shove [target.name]!") - target.Stagger(SHOVE_STAGGER_DURATION) var/obj/item/target_held_item = target.get_active_held_item() if(!target.has_status_effect(STATUS_EFFECT_OFF_BALANCE)) if(target_held_item) @@ -2182,19 +2169,19 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.adjust_bodytemperature(natural*(1/(thermal_protection+1)) + min(thermal_protection * (loc_temp - H.bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)) switch((loc_temp - H.bodytemperature)*thermal_protection) if(-INFINITY to -50) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 3) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 3) if(-50 to -35) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 2) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 2) if(-35 to -20) - H.throw_alert("tempfeel", /obj/screen/alert/cold, 1) + H.throw_alert("tempfeel", /atom/movable/screen/alert/cold, 1) if(-20 to 0) //This is the sweet spot where air is considered normal H.clear_alert("tempfeel") if(0 to 15) //When the air around you matches your body's temperature, you'll start to feel warm. - H.throw_alert("tempfeel", /obj/screen/alert/hot, 1) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 1) if(15 to 30) - H.throw_alert("tempfeel", /obj/screen/alert/hot, 2) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 2) if(30 to INFINITY) - H.throw_alert("tempfeel", /obj/screen/alert/hot, 3) + H.throw_alert("tempfeel", /atom/movable/screen/alert/hot, 3) // +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt. if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTHEAT)) @@ -2215,11 +2202,11 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if (burn_damage) switch(burn_damage) if(0 to 2) - H.throw_alert("temp", /obj/screen/alert/sweat, 1) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 1) if(2 to 4) - H.throw_alert("temp", /obj/screen/alert/sweat, 2) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 2) else - H.throw_alert("temp", /obj/screen/alert/sweat, 3) + H.throw_alert("temp", /atom/movable/screen/alert/sweat, 3) burn_damage = burn_damage * heatmod * H.physiology.heat_mod if (H.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4) //40% for level 3 damage on humans H.emote("scream") @@ -2232,13 +2219,13 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) H.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/cold, multiplicative_slowdown = ((BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR)) switch(H.bodytemperature) if(200 to BODYTEMP_COLD_DAMAGE_LIMIT) - H.throw_alert("temp", /obj/screen/alert/shiver, 1) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 1) H.apply_damage(COLD_DAMAGE_LEVEL_1*coldmod*H.physiology.cold_mod, BURN) if(120 to 200) - H.throw_alert("temp", /obj/screen/alert/shiver, 2) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 2) H.apply_damage(COLD_DAMAGE_LEVEL_2*coldmod*H.physiology.cold_mod, BURN) else - H.throw_alert("temp", /obj/screen/alert/shiver, 3) + H.throw_alert("temp", /atom/movable/screen/alert/shiver, 3) H.apply_damage(COLD_DAMAGE_LEVEL_3*coldmod*H.physiology.cold_mod, BURN) else @@ -2253,21 +2240,21 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(HAZARD_HIGH_PRESSURE to INFINITY) if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE)) H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) else H.clear_alert("pressure") if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/highpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) H.clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE)) H.clear_alert("pressure") else H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod) - H.throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) ////////// // FIRE // diff --git a/code/modules/mob/living/carbon/human/species_types/bugmen.dm b/code/modules/mob/living/carbon/human/species_types/bugmen.dm index c649339fe3..f87f425b5f 100644 --- a/code/modules/mob/living/carbon/human/species_types/bugmen.dm +++ b/code/modules/mob/living/carbon/human/species_types/bugmen.dm @@ -6,7 +6,7 @@ species_traits = list(LIPS,EYECOLOR,HAIR,FACEHAIR,MUTCOLORS,HORNCOLOR,WINGCOLOR,HAS_FLESH,HAS_BONE) inherent_biotypes = MOB_ORGANIC|MOB_HUMANOID|MOB_BUG mutant_bodyparts = list("mcolor" = "FFFFFF","mcolor2" = "FFFFFF","mcolor3" = "FFFFFF", "mam_tail" = "None", "mam_ears" = "None", - "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None") + "insect_wings" = "None", "insect_fluff" = "None", "mam_snouts" = "None", "taur" = "None", "insect_markings" = "None", "mam_body_markings" = list()) attack_verb = "slash" attack_sound = 'sound/weapons/slash.ogg' miss_sound = 'sound/weapons/slashmiss.ogg' diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index d92f4ab14a..ae7a7546e1 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -124,21 +124,21 @@ brutemod = 1.25 switch(get_charge(H)) if(ETHEREAL_CHARGE_NONE) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 3) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 3) if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 2) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 2) if(H.health > 10.5) apply_damage(0.65, TOX, null, null, H) brutemod = 1.75 if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL) - H.throw_alert("ethereal_charge", /obj/screen/alert/etherealcharge, 1) + H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 1) brutemod = 1.5 if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD) - H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 1) + H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 1) apply_damage(0.2, TOX, null, null, H) brutemod = 1.5 if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS) - H.throw_alert("ethereal_overcharge", /obj/screen/alert/ethereal_overcharge, 2) + H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2) apply_damage(0.65, TOX, null, null, H) brutemod = 1.75 if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels diff --git a/code/modules/mob/living/carbon/human/species_types/felinid.dm b/code/modules/mob/living/carbon/human/species_types/felinid.dm index 6327375bb5..eee5757b46 100644 --- a/code/modules/mob/living/carbon/human/species_types/felinid.dm +++ b/code/modules/mob/living/carbon/human/species_types/felinid.dm @@ -4,7 +4,7 @@ id = SPECIES_FELINID limbs_id = SPECIES_HUMAN - mutant_bodyparts = list("mam_tail" = "Cat", "mam_ears" = "Cat", "deco_wings" = "None") + mutant_bodyparts = list("mam_tail" = "Cat", "mam_ears" = "Cat", "deco_wings" = "None", "mam_body_markings" = list()) mutantears = /obj/item/organ/ears/cat mutanttail = /obj/item/organ/tail/cat diff --git a/code/modules/mob/living/carbon/human/species_types/humans.dm b/code/modules/mob/living/carbon/human/species_types/humans.dm index d0f6c64550..e0558e6533 100644 --- a/code/modules/mob/living/carbon/human/species_types/humans.dm +++ b/code/modules/mob/living/carbon/human/species_types/humans.dm @@ -4,7 +4,7 @@ default_color = "FFFFFF" species_traits = list(EYECOLOR,HAIR,FACEHAIR,LIPS,MUTCOLORS_PARTSONLY,WINGCOLOR,HAS_FLESH,HAS_BONE) - mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade") + mutant_bodyparts = list("mcolor" = "FFFFFF", "mcolor2" = "FFFFFF","mcolor3" = "FFFFFF","tail_human" = "None", "ears" = "None", "taur" = "None", "deco_wings" = "None", "legs" = "Plantigrade", "mam_body_markings" = list()) use_skintones = USE_SKINTONES_GRAYSCALE_CUSTOM skinned_type = /obj/item/stack/sheet/animalhide/human disliked_food = GROSS | RAW diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 2f463fa8bc..04c69a4138 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -53,16 +53,16 @@ exotic_blood_color = "#" + H.dna.features["mcolor"] /datum/species/jelly/spec_life(mob/living/carbon/human/H) - if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for blooduskers + if(H.stat == DEAD || HAS_TRAIT(H, TRAIT_NOMARROW)) //can't farm slime jelly from a dead slime/jelly person indefinitely, and no regeneration for bloodsuckers return if(!H.blood_volume) - H.blood_volume += 5 + H.adjust_integration_blood(5) H.adjustBruteLoss(5) to_chat(H, "You feel empty!") if(H.blood_volume < (BLOOD_VOLUME_NORMAL * H.blood_ratio)) if(H.nutrition >= NUTRITION_LEVEL_STARVING) - H.blood_volume += 3 + H.adjust_integration_blood(3) H.nutrition -= 2.5 if(H.blood_volume < (BLOOD_VOLUME_OKAY*H.blood_ratio)) if(prob(5)) @@ -82,7 +82,7 @@ consumed_limb.drop_limb() to_chat(H, "Your [consumed_limb] is drawn back into your body, unable to maintain its shape!") qdel(consumed_limb) - H.blood_volume += 20 + H.adjust_integration_blood(20) ////////////////////////////////////////////////////////SLIMEPEOPLE/////////////////////////////////////////////////////////////////// @@ -151,7 +151,7 @@ if(prob(5)) to_chat(H, "You feel very bloated!") else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED) - H.blood_volume += 3 + H.adjust_integration_blood(3) H.nutrition -= 2.5 ..() @@ -505,7 +505,7 @@ button_icon_state = "slimeeject" ..() -/datum/action/innate/integrate_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/integrate_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) if(species && species.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) @@ -559,7 +559,7 @@ return TRUE return FALSE -/datum/action/innate/use_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force) +/datum/action/innate/use_extract/ApplyIcon(atom/movable/screen/movable/action_button/current_button, force) ..(current_button, TRUE) if(species && species.current_extract) current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state)) diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index e368489c57..547d017c23 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -37,7 +37,7 @@ if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed) if(environment) if(environment.total_moles()) - if(environment.get_moles(/datum/gas/oxygen) >= 1) //Same threshhold that extinguishes fire + if(environment.get_moles(GAS_O2) >= 1) //Same threshhold that extinguishes fire H.adjust_fire_stacks(0.5) if(!H.on_fire && H.fire_stacks > 0) H.visible_message("[H]'s body reacts with the atmosphere and bursts into flames!","Your body reacts with the atmosphere and bursts into flame!") diff --git a/code/modules/mob/living/carbon/human/status_procs.dm b/code/modules/mob/living/carbon/human/status_procs.dm index 7892380d8b..ec961da4dd 100644 --- a/code/modules/mob/living/carbon/human/status_procs.dm +++ b/code/modules/mob/living/carbon/human/status_procs.dm @@ -3,7 +3,7 @@ amount = dna.species.spec_stun(src,amount) return ..() -/mob/living/carbon/human/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) +/mob/living/carbon/human/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg, knocktofloor) amount = dna.species.spec_stun(src,amount) return ..() diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index f18d768df3..52d736f9ce 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -128,7 +128,7 @@ There are several things that need to be remembered: remove_overlay(UNIFORM_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_W_UNIFORM] inv.update_icon() if(istype(w_uniform, /obj/item/clothing/under)) @@ -180,7 +180,7 @@ There are several things that need to be remembered: remove_overlay(ID_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_ID] inv.update_icon() var/mutable_appearance/id_overlay = overlays_standing[ID_LAYER] @@ -205,7 +205,7 @@ There are several things that need to be remembered: remove_overlay(GLOVES_LAYER) if(client && hud_used && hud_used.inv_slots[SLOT_GLOVES]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLOVES] inv.update_icon() if(!gloves && bloody_hands) @@ -242,7 +242,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_GLASSES] inv.update_icon() if(glasses) @@ -269,7 +269,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_EARS] inv.update_icon() if(ears) @@ -295,7 +295,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_SHOES] inv.update_icon() if(dna.species.mutant_bodyparts["taur"]) @@ -330,7 +330,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_STORE_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_S_STORE] inv.update_icon() if(s_store) @@ -357,7 +357,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] inv.update_icon() if(head) @@ -394,7 +394,7 @@ There are several things that need to be remembered: remove_overlay(BELT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BELT] inv.update_icon() if(belt) @@ -416,7 +416,7 @@ There are several things that need to be remembered: remove_overlay(SUIT_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_SUIT] inv.update_icon() if(wear_suit) @@ -477,7 +477,7 @@ There are several things that need to be remembered: /mob/living/carbon/human/update_inv_pockets() if(client && hud_used) - var/obj/screen/inventory/inv + var/atom/movable/screen/inventory/inv inv = hud_used.inv_slots[SLOT_L_STORE] inv.update_icon() @@ -506,7 +506,7 @@ There are several things that need to be remembered: return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] inv.update_icon() if(wear_mask) diff --git a/code/modules/mob/living/carbon/inventory.dm b/code/modules/mob/living/carbon/inventory.dm index 0447de6064..fca7c1f72c 100644 --- a/code/modules/mob/living/carbon/inventory.dm +++ b/code/modules/mob/living/carbon/inventory.dm @@ -183,7 +183,7 @@ if(!targets) return for(var/mob/living/carbon/C in targets) - var/obj/screen/alert/give/G = C.throw_alert("[src]", /obj/screen/alert/give) + var/atom/movable/screen/alert/give/G = C.throw_alert("[src]", /atom/movable/screen/alert/give) if(!G) return G.setup(C, src, receiving) diff --git a/code/modules/mob/living/carbon/life.dm b/code/modules/mob/living/carbon/life.dm index 9885efd7c7..6f0f5453da 100644 --- a/code/modules/mob/living/carbon/life.dm +++ b/code/modules/mob/living/carbon/life.dm @@ -1,6 +1,6 @@ /mob/living/carbon/BiologicalLife(seconds, times_fired) //Reagent processing needs to come before breathing, to prevent edge cases. - handle_organs() + handle_organs(seconds, times_fired) . = ..() // if . is false, we are dead. if(stat == DEAD) stop_sound_channel(CHANNEL_HEARTBEAT) @@ -23,7 +23,7 @@ handle_brain_damage() if(stat != DEAD) - handle_liver() + handle_liver(seconds, times_fired) if(stat != DEAD) handle_corruption() @@ -115,16 +115,18 @@ breath = loc_as_obj.handle_internal_lifeform(src, BREATH_VOLUME) else if(isturf(loc)) //Breathe from loc as turf - var/breath_moles = 0 + var/breath_ratio = 0 if(environment) - breath_moles = environment.total_moles()*BREATH_PERCENTAGE + breath_ratio = BREATH_VOLUME/environment.return_volume() - breath = loc.remove_air(breath_moles) + breath = loc.remove_air_ratio(breath_ratio) else //Breathe from loc as obj again if(istype(loc, /obj/)) var/obj/loc_as_obj = loc loc_as_obj.handle_internal_lifeform(src,0) + if(breath) + breath.set_volume(BREATH_VOLUME) check_breath(breath) if(breath) @@ -153,7 +155,7 @@ adjustOxyLoss(1) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) return 0 var/safe_oxy_min = 16 @@ -163,11 +165,11 @@ var/SA_para_min = 1 var/SA_sleep_min = 5 var/oxygen_used = 0 - var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME - - var/O2_partialpressure = (breath.get_moles(/datum/gas/oxygen)/breath.total_moles())*breath_pressure - var/Toxins_partialpressure = (breath.get_moles(/datum/gas/plasma)/breath.total_moles())*breath_pressure - var/CO2_partialpressure = (breath.get_moles(/datum/gas/carbon_dioxide)/breath.total_moles())*breath_pressure + var/moles = breath.total_moles() + var/breath_pressure = (moles*R_IDEAL_GAS_EQUATION*breath.return_temperature())/BREATH_VOLUME + var/O2_partialpressure = ((breath.get_moles(GAS_O2)/moles)*breath_pressure) + (((breath.get_moles(GAS_PLUOXIUM)*8)/moles)*breath_pressure) + var/Toxins_partialpressure = (breath.get_moles(GAS_PLASMA)/moles)*breath_pressure + var/CO2_partialpressure = (breath.get_moles(GAS_CO2)/moles)*breath_pressure //OXYGEN @@ -181,7 +183,7 @@ adjustOxyLoss(8) if(prob(20)) emote("cough") - throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) + throw_alert("too_much_oxy", /atom/movable/screen/alert/too_much_oxy) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) if(O2_partialpressure < safe_oxy_min) //Not enough oxygen @@ -191,11 +193,11 @@ var/ratio = 1 - O2_partialpressure/safe_oxy_min adjustOxyLoss(min(5*ratio, 3)) failed_last_breath = 1 - oxygen_used = breath.get_moles(/datum/gas/oxygen)*ratio + oxygen_used = breath.get_moles(GAS_O2)*ratio else adjustOxyLoss(3) failed_last_breath = 1 - throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) + throw_alert("not_enough_oxy", /atom/movable/screen/alert/not_enough_oxy) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "suffocation", /datum/mood_event/suffocation) else //Enough oxygen @@ -203,12 +205,12 @@ o2overloadtime = 0 //reset our counter for this too if(health >= crit_threshold) adjustOxyLoss(-5) - oxygen_used = breath.get_moles(/datum/gas/oxygen) + oxygen_used = breath.get_moles(GAS_O2) clear_alert("not_enough_oxy") SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation") - breath.adjust_moles(/datum/gas/oxygen, -oxygen_used) - breath.adjust_moles(/datum/gas/carbon_dioxide, oxygen_used) + breath.adjust_moles(GAS_O2, -oxygen_used) + breath.adjust_moles(GAS_CO2, oxygen_used) //CARBON DIOXIDE if(CO2_partialpressure > safe_co2_max) @@ -227,15 +229,15 @@ //TOXINS/PLASMA if(Toxins_partialpressure > safe_tox_max) - var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_tox_max) * 10 + var/ratio = (breath.get_moles(GAS_PLASMA)/safe_tox_max) * 10 adjustToxLoss(clamp(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE)) - throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) + throw_alert("too_much_tox", /atom/movable/screen/alert/too_much_tox) else clear_alert("too_much_tox") //NITROUS OXIDE - if(breath.get_moles(/datum/gas/nitrous_oxide)) - var/SA_partialpressure = (breath.get_moles(/datum/gas/nitrous_oxide)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_NITROUS)) + var/SA_partialpressure = (breath.get_moles(GAS_NITROUS)/breath.total_moles())*breath_pressure if(SA_partialpressure > SA_para_min) Unconscious(60) if(SA_partialpressure > SA_sleep_min) @@ -248,26 +250,26 @@ SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "chemical_euphoria") //BZ (Facepunch port of their Agent B) - if(breath.get_moles(/datum/gas/bz)) - var/bz_partialpressure = (breath.get_moles(/datum/gas/bz)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_BZ)) + var/bz_partialpressure = (breath.get_moles(GAS_BZ)/breath.total_moles())*breath_pressure if(bz_partialpressure > 1) hallucination += 10 else if(bz_partialpressure > 0.01) hallucination += 5 //TRITIUM - if(breath.get_moles(/datum/gas/tritium)) - var/tritium_partialpressure = (breath.get_moles(/datum/gas/tritium)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_TRITIUM)) + var/tritium_partialpressure = (breath.get_moles(GAS_TRITIUM)/breath.total_moles())*breath_pressure radiation += tritium_partialpressure/10 //NITRYL - if(breath.get_moles(/datum/gas/nitryl)) - var/nitryl_partialpressure = (breath.get_moles(/datum/gas/nitryl)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_NITRYL)) + var/nitryl_partialpressure = (breath.get_moles(GAS_NITRYL)/breath.total_moles())*breath_pressure adjustFireLoss(nitryl_partialpressure/4) //MIASMA - if(breath.get_moles(/datum/gas/miasma)) - var/miasma_partialpressure = (breath.get_moles(/datum/gas/miasma)/breath.total_moles())*breath_pressure + if(breath.get_moles(GAS_MIASMA)) + var/miasma_partialpressure = (breath.get_moles(GAS_MIASMA)/breath.total_moles())*breath_pressure if(miasma_partialpressure > MINIMUM_MOLES_DELTA_TO_MOVE) if(prob(0.05 * miasma_partialpressure)) @@ -365,7 +367,7 @@ var/datum/gas_mixture/stank = new - stank.set_moles(/datum/gas/miasma,0.1) + stank.set_moles(GAS_MIASMA,0.1) stank.set_temperature(BODYTEMP_NORMAL) @@ -376,25 +378,25 @@ /mob/living/carbon/proc/handle_blood() return -/mob/living/carbon/proc/handle_bodyparts() +/mob/living/carbon/proc/handle_bodyparts(seconds, times_fired) for(var/I in bodyparts) var/obj/item/bodypart/BP = I if(BP.needs_processing) - . |= BP.on_life() + . |= BP.on_life(seconds, times_fired) -/mob/living/carbon/proc/handle_organs() +/mob/living/carbon/proc/handle_organs(seconds, times_fired) if(stat != DEAD) for(var/V in internal_organs) var/obj/item/organ/O = V if(O) - O.on_life() + O.on_life(seconds, times_fired) else if(reagents.has_reagent(/datum/reagent/toxin/formaldehyde, 1) || reagents.has_reagent(/datum/reagent/preservahyde, 1)) // No organ decay if the body contains formaldehyde. Or preservahyde. return for(var/V in internal_organs) var/obj/item/organ/O = V if(O) - O.on_death() //Needed so organs decay while inside the body. + O.on_death(seconds, times_fired) //Needed so organs decay while inside the body. /mob/living/carbon/handle_diseases() for(var/thing in diseases) @@ -510,9 +512,8 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //this updates all special effects: stun, sleeping, knockdown, druggy, stuttering, etc.. /mob/living/carbon/handle_status_effects() ..() - var/combat_mode = SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_ACTIVE) if(getStaminaLoss() && !HAS_TRAIT(src, TRAIT_NO_STAMINA_REGENERATION)) - adjustStaminaLoss((!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? STAM_RECOVERY_STAM_CRIT : STAM_RECOVERY_RESTING) : STAM_RECOVERY_NORMAL) * (combat_mode? 0.25 : 1)) + adjustStaminaLoss((!CHECK_MOBILITY(src, MOBILITY_STAND) ? ((combat_flags & COMBAT_FLAG_HARD_STAMCRIT) ? STAM_RECOVERY_STAM_CRIT : STAM_RECOVERY_RESTING) : STAM_RECOVERY_NORMAL)) if(!(combat_flags & COMBAT_FLAG_HARD_STAMCRIT) && incomingstammult != 1) incomingstammult = max(0.01, incomingstammult) @@ -686,16 +687,16 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put //LIVER// ///////// -/mob/living/carbon/proc/handle_liver() +/mob/living/carbon/proc/handle_liver(seconds, times_fired) var/obj/item/organ/liver/liver = getorganslot(ORGAN_SLOT_LIVER) if((!dna && !liver) || (NOLIVER in dna.species.species_traits)) return if(!liver || liver.organ_flags & ORGAN_FAILING) - liver_failure() + liver_failure(seconds, times_fired) -/mob/living/carbon/proc/liver_failure() +/mob/living/carbon/proc/liver_failure(seconds, times_fired) reagents.end_metabolization(src, keep_liverless = TRUE) //Stops trait-based effects on reagents, to prevent permanent buffs - reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE) + reagents.metabolize(src, seconds, times_fired, can_overdose=FALSE, liverless = TRUE) if(HAS_TRAIT(src, TRAIT_STABLELIVER)) return adjustToxLoss(4, TRUE, TRUE) diff --git a/code/modules/mob/living/carbon/monkey/life.dm b/code/modules/mob/living/carbon/monkey/life.dm index 9e6431985c..480cbebe11 100644 --- a/code/modules/mob/living/carbon/monkey/life.dm +++ b/code/modules/mob/living/carbon/monkey/life.dm @@ -80,13 +80,13 @@ if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT)) switch(bodytemperature) if(360 to 400) - throw_alert("temp", /obj/screen/alert/hot, 1) + throw_alert("temp", /atom/movable/screen/alert/hot, 1) apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) if(400 to 460) - throw_alert("temp", /obj/screen/alert/hot, 2) + throw_alert("temp", /atom/movable/screen/alert/hot, 2) apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) if(460 to INFINITY) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) if(on_fire) apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) else @@ -96,13 +96,13 @@ if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell)) switch(bodytemperature) if(200 to 260) - throw_alert("temp", /obj/screen/alert/cold, 1) + throw_alert("temp", /atom/movable/screen/alert/cold, 1) apply_damage(COLD_DAMAGE_LEVEL_1, BURN) if(120 to 200) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) apply_damage(COLD_DAMAGE_LEVEL_2, BURN) if(-INFINITY to 120) - throw_alert("temp", /obj/screen/alert/cold, 3) + throw_alert("temp", /atom/movable/screen/alert/cold, 3) apply_damage(COLD_DAMAGE_LEVEL_3, BURN) else clear_alert("temp") @@ -117,16 +117,16 @@ switch(adjusted_pressure) if(HAZARD_HIGH_PRESSURE to INFINITY) adjustBruteLoss( min( ( (adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) ) - throw_alert("pressure", /obj/screen/alert/highpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2) if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) - throw_alert("pressure", /obj/screen/alert/highpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/highpressure, 1) if(WARNING_LOW_PRESSURE to WARNING_HIGH_PRESSURE) clear_alert("pressure") if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) - throw_alert("pressure", /obj/screen/alert/lowpressure, 1) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 1) else adjustBruteLoss( LOW_PRESSURE_DAMAGE ) - throw_alert("pressure", /obj/screen/alert/lowpressure, 2) + throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2) return diff --git a/code/modules/mob/living/carbon/monkey/monkey.dm b/code/modules/mob/living/carbon/monkey/monkey.dm index d49059f839..4ab24c31dd 100644 --- a/code/modules/mob/living/carbon/monkey/monkey.dm +++ b/code/modules/mob/living/carbon/monkey/monkey.dm @@ -173,4 +173,4 @@ if(prob(10)) var/obj/item/clothing/head/helmet/justice/escape/helmet = new(src) equip_to_slot_or_del(helmet,SLOT_HEAD) - helmet.attack_self(src) // todo encapsulate toggle + INVOKE_ASYNC(helmet, /obj/item.proc/attack_self, src) // todo encapsulate toggle diff --git a/code/modules/mob/living/carbon/monkey/update_icons.dm b/code/modules/mob/living/carbon/monkey/update_icons.dm index 43f57ea40d..cd1a5896eb 100644 --- a/code/modules/mob/living/carbon/monkey/update_icons.dm +++ b/code/modules/mob/living/carbon/monkey/update_icons.dm @@ -51,7 +51,7 @@ overlays_standing[HANDCUFF_LAYER] = legcuffs apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = legcuffed) //monkey HUD updates for items in our inventory diff --git a/code/modules/mob/living/carbon/status_procs.dm b/code/modules/mob/living/carbon/status_procs.dm index d602c25331..5b5aa9d5c0 100644 --- a/code/modules/mob/living/carbon/status_procs.dm +++ b/code/modules/mob/living/carbon/status_procs.dm @@ -5,8 +5,8 @@ /mob/living/carbon/adjust_drugginess(amount) druggy = max(druggy+amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "high", /datum/mood_event/high) sound_environment_override = SOUND_ENVIRONMENT_DRUGGED else @@ -18,8 +18,8 @@ /mob/living/carbon/set_drugginess(amount) druggy = max(amount, 0) if(druggy) - overlay_fullscreen("high", /obj/screen/fullscreen/high) - throw_alert("high", /obj/screen/alert/high) + overlay_fullscreen("high", /atom/movable/screen/fullscreen/high) + throw_alert("high", /atom/movable/screen/alert/high) else clear_fullscreen("high") clear_alert("high") diff --git a/code/modules/mob/living/carbon/update_icons.dm b/code/modules/mob/living/carbon/update_icons.dm index a1ea18a8b9..43e0db1f08 100644 --- a/code/modules/mob/living/carbon/update_icons.dm +++ b/code/modules/mob/living/carbon/update_icons.dm @@ -91,7 +91,7 @@ return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_WEAR_MASK] inv?.update_icon() if(wear_mask) @@ -105,7 +105,7 @@ remove_overlay(NECK_LAYER) if(client && hud_used && hud_used.inv_slots[SLOT_NECK]) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_NECK] inv.update_icon() if(wear_neck) @@ -119,7 +119,7 @@ remove_overlay(BACK_LAYER) if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_BACK] inv?.update_icon() if(back) @@ -135,7 +135,7 @@ return if(client && hud_used) - var/obj/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] + var/atom/movable/screen/inventory/inv = hud_used.inv_slots[SLOT_HEAD] inv?.update_icon() if(head) @@ -163,7 +163,7 @@ overlays_standing[LEGCUFF_LAYER] = legcuffs apply_overlay(LEGCUFF_LAYER) - throw_alert("legcuffed", /obj/screen/alert/restrained/legcuffed, new_master = legcuffed) + throw_alert("legcuffed", /atom/movable/screen/alert/restrained/legcuffed, new_master = legcuffed) //mob HUD updates for items in our inventory @@ -171,7 +171,7 @@ /mob/living/carbon/proc/update_hud_handcuffed() if(hud_used) for(var/hand in hud_used.hand_slots) - var/obj/screen/inventory/hand/H = hud_used.hand_slots[hand] + var/atom/movable/screen/inventory/hand/H = hud_used.hand_slots[hand] if(H) H.update_icon() diff --git a/code/modules/mob/living/life.dm b/code/modules/mob/living/life.dm index 0ce5af12b9..43a5d9c2c8 100644 --- a/code/modules/mob/living/life.dm +++ b/code/modules/mob/living/life.dm @@ -141,7 +141,7 @@ ExtinguishMob() return var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment - if(!G.get_moles(/datum/gas/oxygen, 1)) + if(!G.get_moles(GAS_O2, 1)) ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire return var/turf/location = get_turf(src) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ae716efc71..5603801dce 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -548,7 +548,7 @@ var/severity = 0 var/healthpercent = (health/maxHealth) * 100 if(hud_used?.healthdoll) //to really put you in the boots of a simplemob - var/obj/screen/healthdoll/living/livingdoll = hud_used.healthdoll + var/atom/movable/screen/healthdoll/living/livingdoll = hud_used.healthdoll switch(healthpercent) if(100 to INFINITY) livingdoll.icon_state = "living0" @@ -579,7 +579,7 @@ UNLINT(livingdoll.filters += filter(type="alpha", icon = mob_mask)) livingdoll.filters += filter(type="drop_shadow", size = -1) if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") @@ -869,11 +869,11 @@ clear_alert("gravity") else if(has_gravity >= GRAVITY_DAMAGE_TRESHOLD) - throw_alert("gravity", /obj/screen/alert/veryhighgravity) + throw_alert("gravity", /atom/movable/screen/alert/veryhighgravity) else - throw_alert("gravity", /obj/screen/alert/highgravity) + throw_alert("gravity", /atom/movable/screen/alert/highgravity) else - throw_alert("gravity", /obj/screen/alert/weightless) + throw_alert("gravity", /atom/movable/screen/alert/weightless) if(!override && !is_flying()) INVOKE_ASYNC(src, /atom/movable.proc/float, !has_gravity) @@ -911,6 +911,12 @@ "[src] tries to remove your [what.name].", target = src, target_message = "You try to remove [who]'s [what.name].") what.add_fingerprint(src) + if(ishuman(who)) + var/mob/living/carbon/human/victim_human = who + if(victim_human.key && !victim_human.client) // AKA braindead + if(victim_human.stat <= SOFT_CRIT && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) + var/list/new_entry = list(list(src.name, "tried unequipping your [what]", world.time)) + LAZYADD(victim_human.afk_thefts, new_entry) else to_chat(src,"You try to remove [who]'s [what.name].") what.add_fingerprint(src) @@ -957,6 +963,13 @@ to_chat(src, "\The [what.name] doesn't fit in that place!") return + if(ishuman(who)) + var/mob/living/carbon/human/victim_human = who + if(victim_human.key && !victim_human.client) // AKA braindead + if(victim_human.stat <= SOFT_CRIT && LAZYLEN(victim_human.afk_thefts) <= AFK_THEFT_MAX_MESSAGES) + var/list/new_entry = list(list(src.name, "tried equipping you with [what]", world.time)) + LAZYADD(victim_human.afk_thefts, new_entry) + who.visible_message("[src] tries to put [what] on [who].", "[src] tries to put [what] on you.", target = src, target_message = "You try to put [what] on [who].") @@ -995,7 +1008,7 @@ loc_temp = obj_temp else if(isspaceturf(get_turf(src))) var/turf/heat_turf = get_turf(src) - loc_temp = heat_turf.temperature + loc_temp = heat_turf.return_temperature() return loc_temp /mob/living/proc/get_standard_pixel_x_offset(lying = 0) @@ -1146,7 +1159,7 @@ visible_message("[src] catches fire!", \ "You're set on fire!") new/obj/effect/dummy/lighting_obj/moblight/fire(src) - throw_alert("fire", /obj/screen/alert/fire) + throw_alert("fire", /atom/movable/screen/alert/fire) update_fire() SEND_SIGNAL(src, COMSIG_LIVING_IGNITED,src) return TRUE diff --git a/code/modules/mob/living/living_active_block.dm b/code/modules/mob/living/living_active_block.dm index db472df388..9ccaeb6c59 100644 --- a/code/modules/mob/living/living_active_block.dm +++ b/code/modules/mob/living/living_active_block.dm @@ -48,25 +48,23 @@ animate(src, pixel_x = get_standard_pixel_x_offset(), pixel_y = get_standard_pixel_y_offset(), time = 2.5, FALSE, SINE_EASING | EASE_IN) /mob/living/proc/continue_starting_active_block() - if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - return DO_AFTER_STOP return (combat_flags & COMBAT_FLAG_ACTIVE_BLOCK_STARTING)? DO_AFTER_CONTINUE : DO_AFTER_STOP /mob/living/get_standard_pixel_x_offset() . = ..() if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) if(dir & EAST) - . += 8 + . += 4 if(dir & WEST) - . -= 8 + . -= 4 /mob/living/get_standard_pixel_y_offset() . = ..() if(combat_flags & (COMBAT_FLAG_ACTIVE_BLOCK_STARTING | COMBAT_FLAG_ACTIVE_BLOCKING)) if(dir & NORTH) - . += 8 + . += 4 if(dir & SOUTH) - . -= 8 + . -= 4 /** * Proc called by keybindings to toggle active blocking. @@ -100,11 +98,6 @@ if(!I.can_active_block()) to_chat(src, "[I] is either not capable of being used to actively block, or is not currently in a state that can! (Try wielding it if it's twohanded, for example.)") return - // QOL: Attempt to toggle on combat mode if it isn't already - SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE) - if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - to_chat(src, "You must be in combat mode to actively block!") - return FALSE var/datum/block_parry_data/data = I.get_block_parry_data() var/delay = data.block_start_delay combat_flags |= COMBAT_FLAG_ACTIVE_BLOCK_STARTING @@ -147,7 +140,7 @@ /** * Calculates FINAL ATTACK DAMAGE after mitigation */ -/obj/item/proc/active_block_calculate_final_damage(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) +/obj/item/proc/active_block_calculate_final_damage(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, passive = FALSE) var/datum/block_parry_data/data = get_block_parry_data() var/absorption = data.attack_type_list_scan(data.block_damage_absorption_override, attack_type) var/efficiency = data.attack_type_list_scan(data.block_damage_multiplier_override, attack_type) @@ -156,7 +149,7 @@ if(isnull(absorption)) absorption = data.block_damage_absorption if(isnull(efficiency)) - efficiency = data.block_damage_multiplier + efficiency = data.block_damage_multiplier * (passive? (1 / data.block_automatic_mitigation_multiplier) : 1) if(isnull(limit)) limit = data.block_damage_limit // now we calculate damage to reduce. @@ -172,7 +165,7 @@ return final_damage /// Amount of stamina from damage blocked. Note that the damage argument is damage_blocked. -/obj/item/proc/active_block_stamina_cost(mob/living/owner, atom/object, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) +/obj/item/proc/active_block_stamina_cost(mob/living/owner, atom/object, damage_blocked, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, passive = FALSE) var/datum/block_parry_data/data = get_block_parry_data() var/efficiency = data.attack_type_list_scan(data.block_stamina_efficiency_override, attack_type) if(isnull(efficiency)) @@ -182,7 +175,7 @@ multiplier = data.attack_type_list_scan(data.block_resting_stamina_penalty_multiplier_override, attack_type) if(isnull(multiplier)) multiplier = data.block_resting_stamina_penalty_multiplier - return (damage_blocked / efficiency) * multiplier + return (damage_blocked / efficiency) * multiplier * (passive? data.block_automatic_stamina_multiplier : 1) /// Apply the stamina damage to our user, notice how damage argument is stamina_amount. /obj/item/proc/active_block_do_stamina_damage(mob/living/owner, atom/object, stamina_amount, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return) @@ -214,6 +207,18 @@ return /obj/item/proc/active_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + return directional_block(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return, override_direction) + +/obj/item/proc/can_passive_block() + if(!block_parry_data || !(item_flags & ITEM_CAN_BLOCK)) + return FALSE + var/datum/block_parry_data/data = return_block_parry_datum(block_parry_data) + return data.block_automatic_enabled + +/obj/item/proc/passive_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction) + return directional_block(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return, override_direction, TRUE) + +/obj/item/proc/directional_block(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, final_block_chance, list/block_return, override_direction, passive = FALSE) if(!can_active_block()) return BLOCK_NONE var/datum/block_parry_data/data = get_block_parry_data() @@ -228,12 +233,12 @@ incoming_direction = get_dir(get_turf(attacker) || get_turf(object), src) if(!CHECK_MOBILITY(owner, MOBILITY_STAND) && !(data.block_resting_attack_types_anydir & attack_type) && (!(data.block_resting_attack_types_directional & attack_type) || !can_block_direction(owner.dir, incoming_direction))) return BLOCK_NONE - else if(!can_block_direction(owner.dir, incoming_direction)) + else if(!can_block_direction(owner.dir, incoming_direction, passive)) return BLOCK_NONE block_return[BLOCK_RETURN_ACTIVE_BLOCK] = TRUE - var/final_damage = active_block_calculate_final_damage(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + var/final_damage = active_block_calculate_final_damage(owner, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return, passive) var/damage_blocked = damage - final_damage - var/stamina_cost = active_block_stamina_cost(owner, object, damage_blocked, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) + var/stamina_cost = active_block_stamina_cost(owner, object, damage_blocked, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return, passive) active_block_do_stamina_damage(owner, object, stamina_cost, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, block_return) block_return[BLOCK_RETURN_ACTIVE_BLOCK_DAMAGE_MITIGATED] = damage - final_damage block_return[BLOCK_RETURN_SET_DAMAGE_TO] = final_damage @@ -261,9 +266,9 @@ /** * Gets the block direction bitflags of what we can block. */ -/obj/item/proc/blockable_directions() +/obj/item/proc/blockable_directions(passive = FALSE) var/datum/block_parry_data/data = get_block_parry_data() - return data.can_block_directions + return (!isnull(data.block_automatic_directions) && passive)? data.block_automatic_directions : data.can_block_directions /** * Checks if we can block from a specific direction from our direction. @@ -272,14 +277,14 @@ * * our_dir - our direction. * * their_dir - their direction. Must be a single direction, or NONE for an attack from the same tile. This is incoming direction. */ -/obj/item/proc/can_block_direction(our_dir, their_dir) +/obj/item/proc/can_block_direction(our_dir, their_dir, passive = FALSE) their_dir = turn(their_dir, 180) if(our_dir != NORTH) var/turn_angle = dir2angle(our_dir) // dir2angle(), ss13 proc is clockwise so dir2angle(EAST) == 90 // turn(), byond proc is counterclockwise so turn(NORTH, 90) == WEST their_dir = turn(their_dir, turn_angle) - return (DIR2BLOCKDIR(their_dir) & blockable_directions()) + return (DIR2BLOCKDIR(their_dir) & blockable_directions(passive)) /** * can_block_direction but for "compound" directions to check all of them and return the number of directions that were blocked. diff --git a/code/modules/mob/living/living_active_parry.dm b/code/modules/mob/living/living_active_parry.dm index 10f8aaf2f4..e34c5ce053 100644 --- a/code/modules/mob/living/living_active_parry.dm +++ b/code/modules/mob/living/living_active_parry.dm @@ -14,18 +14,58 @@ /** * Initiates a parrying sequence. */ -/mob/living/proc/initiate_parry_sequence() +/mob/living/proc/initiate_parry_sequence(silent = FALSE, list/override_method_data) if(parrying) - return // already parrying + return FALSE // already parrying if(!(mobility_flags & MOBILITY_USE)) - to_chat(src, "You can't move your arms!") - return + if(!silent) + to_chat(src, "You can't move your arms!") + return FALSE if(!(combat_flags & COMBAT_FLAG_PARRY_CAPABLE)) - to_chat(src, "You are not something that can parry attacks.") - return + if(!silent) + to_chat(src, "You are not something that can parry attacks.") + return FALSE if(!(mobility_flags & MOBILITY_STAND)) - to_chat(src, "You aren't able to parry without solid footing!") - return + if(!silent) + to_chat(src, "You aren't able to parry without solid footing!") + return FALSE + var/datum/block_parry_data/data + var/list/determined = override_method_data || determine_parry_method(FALSE, FALSE) + if(!islist(determined)) + return FALSE + var/method = determined[1] + data = return_block_parry_datum(determined[2]) + var/datum/tool = determined[3] + var/full_parry_duration = data.parry_time_windup + data.parry_time_active + data.parry_time_spindown + // no system in place to "fallback" if out of the 3 the top priority one can't parry due to constraints but something else can. + // can always implement it later, whatever. + if((data.parry_respect_clickdelay && !CheckActionCooldown()) || ((parry_end_time_last + data.parry_cooldown) > world.time)) + if(!silent) + to_chat(src, "You are not ready to parry (again)!") + return FALSE + // Point of no return, make sure everything is set. + parrying = method + if(method == ITEM_PARRY) + active_parry_item = tool + if(!UseStaminaBuffer(data.parry_stamina_cost, TRUE)) + return FALSE + parry_start_time = world.time + successful_parries = list() + successful_parry_counterattacks = list() + addtimer(CALLBACK(src, .proc/end_parry_sequence), full_parry_duration) + if(data.parry_flags & PARRY_LOCK_ATTACKING) + ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_PARRY_TRAIT) + if(data.parry_flags & PARRY_LOCK_SPRINTING) + ADD_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_PARRY_TRAIT) + handle_parry_starting_effects(data) + return TRUE + +/** + * Massive snowflake proc for getting something to parry with. + * + * @return list of [method, data, tool], where method is the parry method define, data is the block_parry_data var that must be run through return_block_parry_data, and tool is the concept/object/martial art/etc used. + */ +/mob/living/proc/determine_parry_method(silent = TRUE, autoparry = FALSE) // Prioritize item, then martial art, then unarmed. // yanderedev else if time var/obj/item/using_item = get_active_held_item() @@ -55,7 +95,8 @@ var/list/other_items = list() var/list/override = list() if(SEND_SIGNAL(src, COMSIG_LIVING_ACTIVE_PARRY_START, method, tool, other_items, override) & COMPONENT_PREVENT_PARRY_START) - to_chat(src, "Something is preventing you from parrying!") + if(!silent) + to_chat(src, "Something is preventing you from parrying!") return if(length(override)) var/datum/thing = override[1] @@ -72,35 +113,10 @@ method = ITEM_PARRY data = using_item.block_parry_data if(!method) - to_chat(src, "You have nothing to parry with!") + if(!silent) + to_chat(src, "You have nothing to parry with!") return FALSE - //QOL: Try to enable combat mode if it isn't already - SEND_SIGNAL(src, COMSIG_ENABLE_COMBAT_MODE) - if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) - to_chat(src, "You must be in combat mode to parry!") - return FALSE - data = return_block_parry_datum(data) - var/full_parry_duration = data.parry_time_windup + data.parry_time_active + data.parry_time_spindown - // no system in place to "fallback" if out of the 3 the top priority one can't parry due to constraints but something else can. - // can always implement it later, whatever. - if((data.parry_respect_clickdelay && !CheckActionCooldown()) || ((parry_end_time_last + data.parry_cooldown) > world.time)) - to_chat(src, "You are not ready to parry (again)!") - return FALSE - // Point of no return, make sure everything is set. - parrying = method - if(method == ITEM_PARRY) - active_parry_item = using_item - if(!UseStaminaBuffer(data.parry_stamina_cost, TRUE)) - return FALSE - parry_start_time = world.time - successful_parries = list() - addtimer(CALLBACK(src, .proc/end_parry_sequence), full_parry_duration) - if(data.parry_flags & PARRY_LOCK_ATTACKING) - ADD_TRAIT(src, TRAIT_MOBILITY_NOUSE, ACTIVE_PARRY_TRAIT) - if(data.parry_flags & PARRY_LOCK_SPRINTING) - ADD_TRAIT(src, TRAIT_SPRINT_LOCKED, ACTIVE_PARRY_TRAIT) - handle_parry_starting_effects(data) - return TRUE + return list(method, data, tool) /** * Tries to find a backup parry item. @@ -146,6 +162,7 @@ parry_start_time = 0 parry_end_time_last = world.time + (successful? 0 : data.parry_failed_cooldown_duration) successful_parries = null + successful_parry_counterattacks = null /** * Handles starting effects for parrying. @@ -178,17 +195,17 @@ /** * Called when an attack is parried using this, whether or not the parry was successful. */ -/obj/item/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) +/obj/item/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time, autoparry = FALSE) /** * Called when an attack is parried innately, whether or not the parry was successful. */ -/mob/living/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) +/mob/living/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time, autoparry = FALSE) /** * Called when an attack is parried using this, whether or not the parry was successful. */ -/datum/martial_art/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time) +/datum/martial_art/proc/on_active_parry(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/block_return, parry_efficiency, parry_time, autoparry = FALSE) /** * Called when an attack is parried and block_parra_data indicates to use a proc to handle counterattack. @@ -205,6 +222,94 @@ */ /datum/martial_art/proc/active_parry_reflex_counter(mob/living/owner, atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list, parry_efficiency, list/effect_text) +/** + * Attempts to automatically parry an attacker. + */ +/mob/living/proc/attempt_auto_parry(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) + // determine how we'll parry + var/list/determined = determine_parry_method(TRUE, TRUE) + if(!islist(determined)) + return BLOCK_NONE + var/datum/block_parry_data/data = return_block_parry_datum(determined[2]) + if(!data.parry_automatic_enabled || (last_autoparry > (world.time - data.autoparry_cooldown_absolute))) + return BLOCK_NONE + if(attack_type && !(attack_type & data.parry_attack_types)) + return BLOCK_NONE + // before doing anything, check if the user moused over them properly + if(!client) + return BLOCK_NONE + var/found = attacker == client.mouseObject + if(!found) + for(var/i in client.moused_over_objects) + if(i == object) + if((client.moused_over_objects[i] + (data.autoparry_mouse_delay_maximum)) >= world.time) + found = TRUE + break + if(!found) + return BLOCK_NONE + + // if that works, try to start parry + // first, check cooldowns + + // now, depending on if we're doing a single simulation or a full sequence + last_autoparry = world.time + if(data.autoparry_sequence_simulation) + // for full sequence simulation + initiate_parry_sequence(TRUE, determined) + if(data.autoparry_sequence_start_time == -1) + parry_start_time = world.time - data.parry_time_windup + else + parry_start_time = world.time - data.autoparry_sequence_start_time + // recurse back to original + return run_parry(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, FALSE) + else + // yes, this is mostly a copypaste of run_parry. + var/efficiency = data.attack_type_list_scan(data.autoparry_single_efficiency_override, attack_type) + if(isnull(efficiency)) + efficiency = data.autoparry_single_efficiency + var/method = determined[1] + switch(method) + if(ITEM_PARRY) + var/obj/item/I = determined[3] + . = I.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, null, TRUE) + if(UNARMED_PARRY) + . = on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, null, TRUE) + if(MARTIAL_PARRY) + . = mind.martial_art.on_active_parry(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, null, TRUE) + if(!isnull(return_list[BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY])) // one of our procs overrode + efficiency = return_list[BLOCK_RETURN_OVERRIDE_PARRY_EFFICIENCY] + if(efficiency <= 0) // Do not allow automatically handled/standardized parries that increase damage for now. + return + . |= BLOCK_SHOULD_PARTIAL_MITIGATE + if(efficiency >= data.parry_efficiency_perfect) + . |= data.perfect_parry_block_return_flags + if(data.perfect_parry_block_return_list) + return_list |= data.perfect_parry_block_return_list + else if(efficiency >= data.parry_efficiency_considered_successful) + . |= data.imperfect_parry_block_return_flags + if(data.imperfect_parry_block_return_list) + return_list |= data.imperfect_parry_block_return_list + else + . |= data.failed_parry_block_return_flags + if(data.failed_parry_block_return_list) + return_list |= data.failed_parry_block_return_list + if(isnull(return_list[BLOCK_RETURN_MITIGATION_PERCENT])) // if one of the on_active_parry procs overrode. We don't have to worry about interference since parries are the first thing checked in the [do_run_block()] sequence. + return_list[BLOCK_RETURN_MITIGATION_PERCENT] = clamp(efficiency, 0, 100) // do not allow > 100% or < 0% for now. + if((return_list[BLOCK_RETURN_MITIGATION_PERCENT] >= 100) || (damage <= 0)) + . |= BLOCK_SUCCESS + var/list/effect_text + var/pacifist_counter_check = TRUE + if(HAS_TRAIT(src, TRAIT_PACIFISM)) + switch(parrying) + if(ITEM_PARRY) + pacifist_counter_check = (!active_parry_item.force || active_parry_item.damtype == STAMINA) + else + pacifist_counter_check = FALSE //Both martial and unarmed counter attacks generally are harmful, so no need to have the same line twice. + if(efficiency >= data.parry_efficiency_to_counterattack && pacifist_counter_check && !return_list[BLOCK_RETURN_FORCE_NO_PARRY_COUNTERATTACK] && (!(attacker in successful_parry_counterattacks) && !data.parry_allow_repeated_counterattacks)) + effect_text = run_parry_countereffects(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, data) + if(data.parry_flags & PARRY_DEFAULT_HANDLE_FEEDBACK) + handle_parry_feedback(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, effect_text, data) + /** * Gets the stage of our parry sequence we're currently in. */ @@ -235,12 +340,20 @@ return world.time - parry_start_time /// same return values as normal blocking, called with absolute highest priority in the block "chain". -/mob/living/proc/run_parry(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list()) +/mob/living/proc/run_parry(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), allow_auto = TRUE) var/stage = get_parry_stage() + if(attack_type & ATTACK_TYPE_PARRY_COUNTERATTACK) + return BLOCK_NONE // don't infinite loop if(stage != PARRY_ACTIVE) - return BLOCK_NONE + // If they're not currently parrying, attempt auto parry + if(stage == NOT_PARRYING) + if(!allow_auto || SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + return BLOCK_NONE + return attempt_auto_parry(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list) + else + return BLOCK_NONE var/datum/block_parry_data/data = get_parry_data() - if(attack_type && (!(attack_type & data.parry_attack_types) || (attack_type & ATTACK_TYPE_PARRY_COUNTERATTACK))) // if this attack is from a parry do not parry it lest we infinite loop. + if(attack_type && !(attack_type & data.parry_attack_types)) return BLOCK_NONE var/efficiency = data.get_parry_efficiency(attack_type, get_parry_time()) switch(parrying) @@ -281,7 +394,7 @@ pacifist_counter_check = (!active_parry_item.force || active_parry_item.damtype == STAMINA) else pacifist_counter_check = FALSE //Both martial and unarmed counter attacks generally are harmful, so no need to have the same line twice. - if(efficiency >= data.parry_efficiency_to_counterattack && pacifist_counter_check) + if(efficiency >= data.parry_efficiency_to_counterattack && pacifist_counter_check && !return_list[BLOCK_RETURN_FORCE_NO_PARRY_COUNTERATTACK] && (!(attacker in successful_parry_counterattacks) && !data.parry_allow_repeated_counterattacks)) effect_text = run_parry_countereffects(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency) if(data.parry_flags & PARRY_DEFAULT_HANDLE_FEEDBACK) handle_parry_feedback(object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, return_list, efficiency, effect_text) @@ -289,8 +402,9 @@ if(length(successful_parries) >= data.parry_max_attacks) end_parry_sequence() -/mob/living/proc/handle_parry_feedback(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency, list/effect_text) - var/datum/block_parry_data/data = get_parry_data() +/mob/living/proc/handle_parry_feedback(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency, list/effect_text, datum/block_parry_data/data) + if(!data) + data = get_parry_data() var/knockdown_check = FALSE if(data.parry_data[PARRY_KNOCKDOWN_ATTACKER] && parry_efficiency >= data.parry_efficiency_to_counterattack) knockdown_check = TRUE @@ -299,12 +413,14 @@ visible_message("[src] parries [attack_text][length(effect_text)? ", [english_list(effect_text)] [attacker]" : ""][length(effect_text) && knockdown_check? " and" : ""][knockdown_check? " knocking them to the ground" : ""]!") /// Run counterattack if any -/mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency) +/mob/living/proc/run_parry_countereffects(atom/object, damage, attack_text, attack_type, armour_penetration, mob/attacker, def_zone, list/return_list = list(), parry_efficiency, datum/block_parry_data/data) if(!isliving(attacker)) return var/mob/living/L = attacker - var/datum/block_parry_data/data = get_parry_data() + if(!data) + data = get_parry_data() var/list/effect_text = list() + successful_parry_counterattacks |= attacker // Always proc so items can override behavior easily switch(parrying) if(ITEM_PARRY) diff --git a/code/modules/mob/living/living_block.dm b/code/modules/mob/living/living_block.dm index d32265e478..99e74916da 100644 --- a/code/modules/mob/living/living_block.dm +++ b/code/modules/mob/living/living_block.dm @@ -37,6 +37,8 @@ var/results if(I == active_block_item) results = I.active_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list, attack_direction) + else if(I.can_passive_block() && !SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE)) + results = I.passive_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list, attack_direction) else results = I.run_block(src, object, damage, attack_text, attack_type, armour_penetration, attacker, def_zone, final_block_chance, return_list) . |= results diff --git a/code/modules/mob/living/living_blocking_parrying.dm b/code/modules/mob/living/living_blocking_parrying.dm index 9e974177e5..0ccc03982a 100644 --- a/code/modules/mob/living/living_blocking_parrying.dm +++ b/code/modules/mob/living/living_blocking_parrying.dm @@ -75,7 +75,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) var/block_stamina_buffer_ratio = 1 /// Stamina dealt directly via UseStaminaBuffer() per SECOND of block. - var/block_stamina_cost_per_second = 1.5 + var/block_stamina_cost_per_second = 1 /// Prevent stamina buffer regeneration while block? var/block_no_stambuffer_regeneration = TRUE /// Prevent stamina regeneration while block? @@ -93,20 +93,31 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Sounds for blocking var/list/block_sounds = list('sound/block_parry/block_metal1.ogg' = 1, 'sound/block_parry/block_metal1.ogg' = 1) + // Autoblock + // Other than for overrides, this mostly just reads from the above vars + /// Can this item automatically block? + var/block_automatic_enabled = TRUE + /// Directions that you can autoblock in. Null to default to normal directions. + var/block_automatic_directions = null + /// Effectiveness multiplier for automated block. Only applies to efficiency, absorption and limits stay the same! + var/block_automatic_mitigation_multiplier = 0.33 + /// Stamina cost multiplier for automated block + var/block_automatic_stamina_multiplier = 1 + /////////// PARRYING //////////// - /// Prioriry for [mob/do_run_block()] while we're being used to parry. + /// Priority for [mob/do_run_block()] while we're being used to parry. // None - Parry is always highest priority! /// Parry doesn't work if you aren't able to otherwise attack due to clickdelay - var/parry_respect_clickdelay = TRUE + var/parry_respect_clickdelay = FALSE /// Parry stamina cost var/parry_stamina_cost = 5 /// Attack types we can block var/parry_attack_types = ALL /// Parry flags - var/parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK | PARRY_LOCK_ATTACKING + var/parry_flags = PARRY_DEFAULT_HANDLE_FEEDBACK /// Parry windup duration in deciseconds. 0 to this is windup, afterwards is main stage. - var/parry_time_windup = 2 + var/parry_time_windup = 0 /// Parry spindown duration in deciseconds. main stage end to this is the spindown stage, afterwards the parry fully ends. var/parry_time_spindown = 3 /// Main parry window in deciseconds. This is between [parry_time_windup] and [parry_time_spindown] @@ -139,7 +150,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Efficiency must be at least this to be considered successful var/parry_efficiency_considered_successful = 0.1 /// Efficiency must be at least this to run automatic counterattack - var/parry_efficiency_to_counterattack = 0.1 + var/parry_efficiency_to_counterattack = INFINITY /// Maximum attacks to parry successfully or unsuccessfully (but not efficiency < 0) during active period, hitting this immediately ends the sequence. var/parry_max_attacks = INFINITY /// Visual icon state override for parrying @@ -153,7 +164,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) /// Stagger duration post-parry if you fail to parry an attack var/parry_failed_stagger_duration = 3.5 SECONDS /// Clickdelay duration post-parry if you fail to parry an attack - var/parry_failed_clickcd_duration = 2 SECONDS + var/parry_failed_clickcd_duration = 0 SECONDS /// Parry cooldown post-parry if failed. This is ADDED to parry_cooldown!!! var/parry_failed_cooldown_duration = 0 SECONDS @@ -166,6 +177,29 @@ GLOBAL_LIST_EMPTY(block_parry_data) var/perfect_parry_block_return_list var/imperfect_parry_block_return_list var/failed_parry_block_return_list + /// Allow multiple counterattacks per parry sequence. Bad idea. + var/parry_allow_repeated_counterattacks = FALSE + + // Auto parry + // Anything not specified like cooldowns/clickdelay respecting is pulled from above. + /// Can this data automatically parry? This is off by default because this is something that requires thought to balance. + var/parry_automatic_enabled = FALSE + /// Hard autoparry cooldown + var/autoparry_cooldown_absolute = 7.5 SECONDS + /// Autoparry : Simulate a parry sequence starting at a certain tick, or simply simulate a single attack parry? + var/autoparry_sequence_simulation = FALSE + // Single attack simulation: + /// Single attack autoparry - efficiency + var/autoparry_single_efficiency = 75 + /// Single attack autoparry - efficiency overrides by attack type, see above + var/list/autoparry_single_efficiency_override + // Parry sequence simulation: + /// Decisecond of sequence to start on. -1 to start to 0th tick of active parry window. + var/autoparry_sequence_start_time = -1 + // Clickdelay/cooldown settings not included, as well as whether or not to lock attack/sprinting/etc. They will be pulled from the above. + + /// ADVANCED - Autoparry requirement for time since last moused over for a specific object + var/autoparry_mouse_delay_maximum = 0.35 SECONDS /** * Quirky proc to get average of flags in list that are in attack_type because why is attack_type a flag. @@ -308,6 +342,7 @@ GLOBAL_LIST_EMPTY(block_parry_data) RENDER_VARIABLE_SIMPLE(parry_cooldown, "Deciseconds it has to be since the last time a parry sequence ended for you before you can parry again.") RENDER_VARIABLE_SIMPLE(parry_failed_stagger_duration, "Deciseconds you are staggered for at the of the parry sequence if you do not successfully parry anything.") RENDER_VARIABLE_SIMPLE(parry_failed_clickcd_duration, "Deciseconds you are put on attack cooldown at the end of the parry sequence if you do not successfully parry anything.") + dat += "" dat += "" return dat.Join("") #undef RENDER_VARIABLE_SIMPLE diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index 4c6ede3904..2888507baa 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -539,7 +539,7 @@ //called when the mob receives a bright flash -/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash, override_protection = 0) +/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash, override_protection = 0) if((override_protection || get_eye_protection() < intensity) && (override_blindness_check || !(HAS_TRAIT(src, TRAIT_BLIND)))) overlay_fullscreen("flash", type) addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index f5919f389c..7b07dfb487 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -50,8 +50,12 @@ var/obj/effect/abstract/parry/parry_visual_effect /// world.time of last parry end var/parry_end_time_last = 0 + /// Last autoparry + var/last_autoparry = 0 /// Successful parries within the current parry cycle. It's a list of efficiency percentages. var/list/successful_parries + /// Current parry counterattacks. Makes sure we can only counterattack someone once per parry. + var/list/successful_parry_counterattacks var/confused = 0 //Makes the mob move in random directions. @@ -63,8 +67,6 @@ //Allows mobs to move through dense areas without restriction. For instance, in space or out of holder objects. var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas //and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt - /// Do we make floors dirty as we move? - var/causes_dirt_buildup_on_floor = FALSE var/list/roundstart_quirks = list() @@ -110,6 +112,7 @@ var/stun_absorption = null //converted to a list of stun absorption sources this mob has when one is added var/blood_volume = 0 //how much blood the mob has + var/integrating_blood = 0 //this is the variable you want to affect if you want to give the mob blood, this will slowly turn into normal blood, preventing some cheesyness, use adjust_integration_blood() instead of modifying directly var/blood_ratio = 1 //How much blood the mob needs, in terms of ratio (i.e 1.2 will require BLOOD_VOLUME_NORMAL of 672) DO NOT GO ABOVE 3.55 Well, actually you can but, then they can't get enough blood. var/obj/effect/proc_holder/ranged_ability //Any ranged ability the mob has, as a click override diff --git a/code/modules/mob/living/living_movement.dm b/code/modules/mob/living/living_movement.dm index bafa38ec5e..07b40b3ab1 100644 --- a/code/modules/mob/living/living_movement.dm +++ b/code/modules/mob/living/living_movement.dm @@ -102,31 +102,6 @@ if(lying && !buckled && prob(getBruteLoss()*200/maxHealth)) makeTrail(newloc, T, old_direction) - if(causes_dirt_buildup_on_floor && (movement_type & GROUND)) - dirt_buildup() - -/** - * Attempts to make the floor dirty. - */ -/mob/living/proc/dirt_buildup(strength = 1) - var/turf/open/T = loc - if(!istype(T) || !T.dirt_buildup_allowed) - return - var/area/A = T.loc - if(!A.dirt_buildup_allowed) - return - var/multiplier = CONFIG_GET(number/turf_dirty_multiplier) - strength *= multiplier - var/obj/effect/decal/cleanable/dirt/D = locate() in T - if(D) - D.dirty(strength) - else - T.dirtyness += strength - if(T.dirtyness >= (isnull(T.dirt_spawn_threshold)? CONFIG_GET(number/turf_dirt_threshold) : T.dirt_spawn_threshold)) - D = new /obj/effect/decal/cleanable/dirt(T) - D.dirty(T.dirt_spawn_threshold - T.dirtyness) - T.dirtyness = 0 // reset. - /mob/living/Move_Pulled(atom/A) . = ..() if(!. || !isliving(A)) diff --git a/code/modules/mob/living/living_sprint.dm b/code/modules/mob/living/living_sprint.dm index 728645c3eb..3fbc229385 100644 --- a/code/modules/mob/living/living_sprint.dm +++ b/code/modules/mob/living/living_sprint.dm @@ -3,7 +3,7 @@ RegisterSignal(src, SIGNAL_TRAIT(TRAIT_SPRINT_LOCKED), .proc/update_sprint_lock) /mob/living/proc/update_sprint_icon() - var/obj/screen/sprintbutton/S = locate() in hud_used?.static_inventory + var/atom/movable/screen/sprintbutton/S = locate() in hud_used?.static_inventory S?.update_icon() /mob/living/proc/update_hud_sprint_bar() diff --git a/code/modules/mob/living/say.dm b/code/modules/mob/living/say.dm index 7ca2234081..1a925e8eaf 100644 --- a/code/modules/mob/living/say.dm +++ b/code/modules/mob/living/say.dm @@ -267,16 +267,10 @@ GLOBAL_LIST_INIT(department_radio_keys, list( eavesdrop_range = EAVESDROP_EXTRA_RANGE var/list/listening = get_hearers_in_view(message_range+eavesdrop_range, source) var/list/the_dead = list() - var/list/yellareas //CIT CHANGE - adds the ability for yelling to penetrate walls and echo throughout areas - if(!eavesdrop_range && say_test(message) == "2") //CIT CHANGE - ditto - yellareas = get_areas_in_range(message_range*0.5, source) //CIT CHANGE - ditto + for(var/_M in GLOB.player_list) var/mob/M = _M if(M.stat != DEAD) //not dead, not important - if(yellareas) //CIT CHANGE - see above. makes yelling penetrate walls - var/area/A = get_area(M) //CIT CHANGE - ditto - if(istype(A) && A.ambientsounds != SPACE && (A in yellareas)) //CIT CHANGE - ditto - listening |= M //CIT CHANGE - ditto continue if(!M.client || !client) //client is so that ghosts don't have to listen to mice continue @@ -303,6 +297,9 @@ GLOBAL_LIST_INIT(department_radio_keys, list( AM.Hear(rendered, src, message_language, message, null, spans, message_mode, source) SEND_GLOBAL_SIGNAL(COMSIG_GLOB_LIVING_SAY_SPECIAL, src, message) + if(!eavesdrop_range && say_test(message) == "2") // Yell hook + process_yelling(listening, rendered, src, message_language, message, spans, message_mode, source) + //speech bubble var/list/speech_bubble_recipients = list() for(var/mob/M in listening) @@ -312,6 +309,30 @@ GLOBAL_LIST_INIT(department_radio_keys, list( I.appearance_flags = APPEARANCE_UI_IGNORE_ALPHA INVOKE_ASYNC(GLOBAL_PROC, /.proc/flick_overlay, I, speech_bubble_recipients, 30) +/atom/movable/proc/process_yelling(list/already_heard, rendered, atom/movable/speaker, datum/language/message_language, message, list/spans, message_mode, obj/source) + if(last_yell > (world.time - 10)) + to_chat(src, "Your voice doesn't project as far as you try to yell in such quick succession.") // yeah no, no spamming an expensive floodfill. + return + last_yell = world.time + var/list/overhearing = list() + var/list/overhearing_text = list() + overhearing = yelling_wavefill(src, yell_power) + if(!overhearing.len) + overhearing_text = "none" + else + for(var/mob/M as anything in overhearing) + overhearing_text += key_name(M) + overhearing_text = english_list(overhearing_text) + log_say("YELL: [ismob(src)? key_name(src) : src] yelled [message] with overhearing mobs [overhearing_text]") + // overhearing = get_hearers_in_view(35, src) | get_hearers_in_range(5, src) + overhearing -= already_heard + if(!overhearing.len) + return + // to_chat(world, "DEBUG: overhearing [english_list(overhearing)]") + for(var/_AM in overhearing) + var/atom/movable/AM = _AM + AM.Hear(rendered, speaker, message_language, message, null, spans, message_mode, source) + /mob/proc/binarycheck() return FALSE diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index ce6a5dcda1..b2b1d2fb5f 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -91,7 +91,7 @@ var/multicam_on = FALSE - var/obj/screen/movable/pic_in_pic/ai/master_multicam + var/atom/movable/screen/movable/pic_in_pic/ai/master_multicam var/list/multicam_screens = list() var/list/all_eyes = list() var/max_multicams = 6 @@ -182,6 +182,7 @@ . = ..() /mob/living/silicon/ai/proc/set_core_display_icon(input, client/C) + set waitfor = FALSE if(client && !C) C = client if(!input && !C?.prefs?.preferred_ai_core_display) diff --git a/code/modules/mob/living/silicon/ai/multicam.dm b/code/modules/mob/living/silicon/ai/multicam.dm index ba92932579..54713acac4 100644 --- a/code/modules/mob/living/silicon/ai/multicam.dm +++ b/code/modules/mob/living/silicon/ai/multicam.dm @@ -1,34 +1,34 @@ //Picture in picture -/obj/screen/movable/pic_in_pic/ai +/atom/movable/screen/movable/pic_in_pic/ai var/mob/living/silicon/ai/ai var/mutable_appearance/highlighted_background var/highlighted = FALSE var/mob/camera/aiEye/pic_in_pic/aiEye -/obj/screen/movable/pic_in_pic/ai/Initialize() +/atom/movable/screen/movable/pic_in_pic/ai/Initialize() . = ..() aiEye = new /mob/camera/aiEye/pic_in_pic() aiEye.screen = src -/obj/screen/movable/pic_in_pic/ai/Destroy() +/atom/movable/screen/movable/pic_in_pic/ai/Destroy() set_ai(null) QDEL_NULL(aiEye) return ..() -/obj/screen/movable/pic_in_pic/ai/Click() +/atom/movable/screen/movable/pic_in_pic/ai/Click() ..() if(ai) ai.select_main_multicam_window(src) -/obj/screen/movable/pic_in_pic/ai/make_backgrounds() +/atom/movable/screen/movable/pic_in_pic/ai/make_backgrounds() ..() highlighted_background = new /mutable_appearance() highlighted_background.icon = 'icons/misc/pic_in_pic.dmi' highlighted_background.icon_state = "background_highlight" highlighted_background.layer = SPACE_LAYER -/obj/screen/movable/pic_in_pic/ai/add_background() +/atom/movable/screen/movable/pic_in_pic/ai/add_background() if((width > 0) && (height > 0)) var/matrix/M = matrix() M.Scale(width + 0.5, height + 0.5) @@ -37,35 +37,35 @@ standard_background.transform = M add_overlay(highlighted ? highlighted_background : standard_background) -/obj/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_size(width, height, do_refresh = TRUE) aiEye.static_visibility_range = (round(max(width, height) / 2) + 1) if(ai) ai.camera_visibility(aiEye) ..() -/obj/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) +/atom/movable/screen/movable/pic_in_pic/ai/set_view_center(atom/target, do_refresh = TRUE) ..() aiEye.setLoc(get_turf(target)) -/obj/screen/movable/pic_in_pic/ai/refresh_view() +/atom/movable/screen/movable/pic_in_pic/ai/refresh_view() ..() aiEye.setLoc(get_turf(center)) -/obj/screen/movable/pic_in_pic/ai/proc/highlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/highlight() if(highlighted) return highlighted = TRUE cut_overlay(standard_background) add_overlay(highlighted_background) -/obj/screen/movable/pic_in_pic/ai/proc/unhighlight() +/atom/movable/screen/movable/pic_in_pic/ai/proc/unhighlight() if(!highlighted) return highlighted = FALSE cut_overlay(highlighted_background) add_overlay(standard_background) -/obj/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) +/atom/movable/screen/movable/pic_in_pic/ai/proc/set_ai(mob/living/silicon/ai/new_ai) if(ai) ai.multicam_screens -= src ai.all_eyes -= aiEye @@ -120,7 +120,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) invisibility = INVISIBILITY_OBSERVER mouse_opacity = MOUSE_OPACITY_ICON icon_state = "ai_pip_camera" - var/obj/screen/movable/pic_in_pic/ai/screen + var/atom/movable/screen/movable/pic_in_pic/ai/screen var/list/cameras_telegraphed = list() var/telegraph_cameras = TRUE var/telegraph_range = 7 @@ -204,7 +204,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) if(!silent) to_chat(src, "Cannot place more than [max_multicams] multicamera windows.") return - var/obj/screen/movable/pic_in_pic/ai/C = new /obj/screen/movable/pic_in_pic/ai() + var/atom/movable/screen/movable/pic_in_pic/ai/C = new /atom/movable/screen/movable/pic_in_pic/ai() C.set_view_size(3, 3, FALSE) C.set_view_center(get_turf(eyeobj)) C.set_ai(src) @@ -235,7 +235,7 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) reset_perspective(GLOB.ai_camera_room_landmark) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.show_to(client) /mob/living/silicon/ai/proc/end_multicam() @@ -245,13 +245,13 @@ GLOBAL_DATUM(ai_camera_room_landmark, /obj/effect/landmark/ai_multicam_room) select_main_multicam_window(null) if(client) for(var/V in multicam_screens) - var/obj/screen/movable/pic_in_pic/P = V + var/atom/movable/screen/movable/pic_in_pic/P = V P.unshow_to(client) reset_perspective() to_chat(src, "Multiple-camera viewing mode deactivated.") -/mob/living/silicon/ai/proc/select_main_multicam_window(obj/screen/movable/pic_in_pic/ai/P) +/mob/living/silicon/ai/proc/select_main_multicam_window(atom/movable/screen/movable/pic_in_pic/ai/P) if(master_multicam == P) return diff --git a/code/modules/mob/living/silicon/examine.dm b/code/modules/mob/living/silicon/examine.dm index 0840ea1191..7de281de5f 100644 --- a/code/modules/mob/living/silicon/examine.dm +++ b/code/modules/mob/living/silicon/examine.dm @@ -1,4 +1,5 @@ /mob/living/silicon/examine(mob/user) //Displays a silicon's laws to ghosts + . = ..() if(laws && isobserver(user)) . += "[src] has the following laws:" for(var/law in laws.get_law_list(include_zeroth = TRUE)) diff --git a/code/modules/mob/living/silicon/laws.dm b/code/modules/mob/living/silicon/laws.dm index acaee05cc6..d92f4a5999 100644 --- a/code/modules/mob/living/silicon/laws.dm +++ b/code/modules/mob/living/silicon/laws.dm @@ -6,7 +6,7 @@ make_laws() /mob/living/silicon/proc/post_lawchange(announce = TRUE) - throw_alert("newlaw", /obj/screen/alert/newlaw) + throw_alert("newlaw", /atom/movable/screen/alert/newlaw) if(announce && last_lawchange_announce != world.time) to_chat(src, "Your laws have been changed.") addtimer(CALLBACK(src, .proc/show_laws), 0) diff --git a/code/modules/mob/living/silicon/pai/software.dm b/code/modules/mob/living/silicon/pai/software.dm index 92f46e24bc..04665401c5 100644 --- a/code/modules/mob/living/silicon/pai/software.dm +++ b/code/modules/mob/living/silicon/pai/software.dm @@ -575,7 +575,7 @@ for(var/id in environment.get_gases()) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0.01) - dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100)]%
" + dat += "[GLOB.gas_data.names[id]]: [round(gas_level*100)]%
" dat += "Temperature: [round(environment.return_temperature()-T0C)]°C
" dat += "Refresh Reading
" dat += "
" diff --git a/code/modules/mob/living/silicon/robot/life.dm b/code/modules/mob/living/silicon/robot/life.dm index 9075af2dbd..d1eaeeacc5 100644 --- a/code/modules/mob/living/silicon/robot/life.dm +++ b/code/modules/mob/living/silicon/robot/life.dm @@ -58,15 +58,15 @@ if(0.75 to INFINITY) clear_alert("charge") if(0.5 to 0.75) - throw_alert("charge", /obj/screen/alert/lowcell, 1) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 1) if(0.25 to 0.5) - throw_alert("charge", /obj/screen/alert/lowcell, 2) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 2) if(0.01 to 0.25) - throw_alert("charge", /obj/screen/alert/lowcell, 3) + throw_alert("charge", /atom/movable/screen/alert/lowcell, 3) else - throw_alert("charge", /obj/screen/alert/emptycell) + throw_alert("charge", /atom/movable/screen/alert/emptycell) else - throw_alert("charge", /obj/screen/alert/nocell) + throw_alert("charge", /atom/movable/screen/alert/nocell) //Robots on fire /mob/living/silicon/robot/handle_fire() diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index a4b12f8834..7ab826cae3 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -23,9 +23,9 @@ robot_modules_background.layer = HUD_LAYER //Objects that appear on screen are on layer ABOVE_HUD_LAYER, UI should be just below it. robot_modules_background.plane = HUD_PLANE - inv1 = new /obj/screen/robot/module1() - inv2 = new /obj/screen/robot/module2() - inv3 = new /obj/screen/robot/module3() + inv1 = new /atom/movable/screen/robot/module1() + inv2 = new /atom/movable/screen/robot/module2() + inv3 = new /atom/movable/screen/robot/module3() previous_health = health @@ -598,7 +598,7 @@ if(wires.is_cut(WIRE_LOCKDOWN)) state = TRUE if(state) - throw_alert("locked", /obj/screen/alert/locked) + throw_alert("locked", /atom/movable/screen/alert/locked) else clear_alert("locked") locked_down = state @@ -611,7 +611,7 @@ module.rebuild_modules() update_icons() if(emagged) - throw_alert("hacked", /obj/screen/alert/hacked) + throw_alert("hacked", /atom/movable/screen/alert/hacked) else clear_alert("hacked") @@ -992,7 +992,8 @@ upgrades.Cut() - speed = 0 + vtec = 0 + vtec_disabled = FALSE ionpulse = FALSE revert_shell() diff --git a/code/modules/mob/living/silicon/robot/robot_defense.dm b/code/modules/mob/living/silicon/robot/robot_defense.dm index 36f291bf36..5342638c03 100644 --- a/code/modules/mob/living/silicon/robot/robot_defense.dm +++ b/code/modules/mob/living/silicon/robot/robot_defense.dm @@ -82,6 +82,18 @@ GLOBAL_LIST_INIT(blacklisted_borg_hats, typecacheof(list( //Hats that don't real if(!opened) return ..() +/mob/living/silicon/robot/disarm_shove(mob/living/carbon/human/H) + visible_message(span_danger("[src]'s motors grind as they are shoved by [H]!")) + vtec_disable(10 SECONDS) + +/mob/living/silicon/robot/proc/vtec_disable(time) + var/datum/status_effect/vtec_disabled/V = has_status_effect(/datum/status_effect/vtec_disabled) + if(V) + V.duration = max(V.duration, world.time + time) + else + apply_status_effect(/datum/status_effect/vtec_disabled, time) + update_movespeed() + /mob/living/silicon/robot/fire_act() if(!on_fire) //Silicons don't gain stacks from hotspots, but hotspots can ignite them IgniteMob() diff --git a/code/modules/mob/living/silicon/robot/robot_defines.dm b/code/modules/mob/living/silicon/robot/robot_defines.dm index fe22ec1236..612298e526 100644 --- a/code/modules/mob/living/silicon/robot/robot_defines.dm +++ b/code/modules/mob/living/silicon/robot/robot_defines.dm @@ -26,15 +26,15 @@ var/previous_health //Hud stuff - var/obj/screen/inv1 = null - var/obj/screen/inv2 = null - var/obj/screen/inv3 = null - var/obj/screen/lamp_button = null - var/obj/screen/thruster_button = null - var/obj/screen/hands = null + var/atom/movable/screen/inv1 = null + var/atom/movable/screen/inv2 = null + var/atom/movable/screen/inv3 = null + var/atom/movable/screen/lamp_button = null + var/atom/movable/screen/thruster_button = null + var/atom/movable/screen/hands = null var/shown_robot_modules = 0 //Used to determine whether they have the module menu shown or not - var/obj/screen/robot_modules_background + var/atom/movable/screen/robot_modules_background //3 Modules can be activated at any one time. var/obj/item/robot_module/module = null @@ -61,7 +61,9 @@ var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) - var/speed = 0 // VTEC speed boost. + var/vtec = 0 // VTEC speed boost. + /// vtec shorted out + var/vtec_disabled = FALSE var/magpulse = FALSE // Magboot-like effect. var/ionpulse = FALSE // Jetpack-like effect. var/ionpulse_on = FALSE // Jetpack-like effect. @@ -88,14 +90,14 @@ ///Lamp brightness. Starts at 3, but can be 1 - 5. var/lamp_intensity = 3 ///Lamp button reference - var/obj/screen/robot/lamp/lampButton + var/atom/movable/screen/robot/lamp/lampButton var/sight_mode = 0 hud_possible = list(ANTAG_HUD, DIAG_STAT_HUD, DIAG_HUD, DIAG_BATT_HUD, DIAG_TRACK_HUD) ///The reference to the built-in tablet that borgs carry. var/obj/item/modular_computer/tablet/integrated/modularInterface - var/obj/screen/robot/modPC/interfaceButton + var/atom/movable/screen/robot/modPC/interfaceButton var/list/upgrades = list() diff --git a/code/modules/mob/living/silicon/robot/robot_movement.dm b/code/modules/mob/living/silicon/robot/robot_movement.dm index e3a640bca0..23500688ae 100644 --- a/code/modules/mob/living/silicon/robot/robot_movement.dm +++ b/code/modules/mob/living/silicon/robot/robot_movement.dm @@ -23,4 +23,4 @@ . = ..() if(!resting && !(combat_flags & COMBAT_FLAG_SPRINT_ACTIVE)) . += 1 - . += speed + . += vtec_disabled? 0 : vtec diff --git a/code/modules/mob/living/silicon/silicon_defense.dm b/code/modules/mob/living/silicon/silicon_defense.dm index 3377bf9601..6c9d508fd8 100644 --- a/code/modules/mob/living/silicon/silicon_defense.dm +++ b/code/modules/mob/living/silicon/silicon_defense.dm @@ -79,6 +79,8 @@ M.visible_message("[M] pets [src].", \ "You pet [src].", target = src, target_message = "[M] pets you.") + if(INTENT_DISARM) + disarm_shove(M) if(INTENT_GRAB) grabbedby(M) else @@ -88,6 +90,9 @@ "[M] punches you, but doesn't leave a dent.", null, COMBAT_MESSAGE_RANGE, null, M, "You punch [src], but don't leave a dent.") +/mob/living/silicon/proc/disarm_shove(mob/living/carbon/human/H) + visible_message(span_danger("[H] shoves [src], but doesn't manage to make much of an effect.")) + /mob/living/silicon/attack_drone(mob/living/simple_animal/drone/M) if(M.a_intent == INTENT_HARM) return @@ -139,6 +144,6 @@ P.on_hit(src, 0, def_zone) return BULLET_ACT_HIT -/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static) +/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /atom/movable/screen/fullscreen/flash/static) if(affect_silicon) return ..() diff --git a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm index a5d36b5ba9..99048b4e9f 100644 --- a/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm +++ b/code/modules/mob/living/simple_animal/bot/SuperBeepsky.dm @@ -33,7 +33,7 @@ /mob/living/simple_animal/bot/secbot/grievous/Initialize() . = ..() weapon = new baton_type(src) - weapon.attack_self(src) + INVOKE_ASYNC(weapon, /obj/item.proc/attack_self, src) /mob/living/simple_animal/bot/secbot/grievous/Destroy() QDEL_NULL(weapon) diff --git a/code/modules/mob/living/simple_animal/bot/mulebot.dm b/code/modules/mob/living/simple_animal/bot/mulebot.dm index 9176f410c3..b287b854a3 100644 --- a/code/modules/mob/living/simple_animal/bot/mulebot.dm +++ b/code/modules/mob/living/simple_animal/bot/mulebot.dm @@ -753,6 +753,12 @@ else return null +/mob/living/simple_animal/bot/mulebot/remove_air_ratio(ratio) + if(loc) + return loc.remove_air_ratio(ratio) + else + return null + /mob/living/simple_animal/bot/mulebot/do_resist() . = ..() if(load) diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index e3486a40e2..fb3d009a72 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -381,6 +381,7 @@ ..() /mob/living/simple_animal/pet/dog/corgi/Ian/proc/Read_Memory() + set waitfor = FALSE if(fexists("data/npc_saves/Ian.sav")) //legacy compatability to convert old format to new var/savefile/S = new /savefile("data/npc_saves/Ian.sav") S["age"] >> age diff --git a/code/modules/mob/living/simple_animal/guardian/guardian.dm b/code/modules/mob/living/simple_animal/guardian/guardian.dm index 7c7ff3779c..b85c0ee643 100644 --- a/code/modules/mob/living/simple_animal/guardian/guardian.dm +++ b/code/modules/mob/living/simple_animal/guardian/guardian.dm @@ -55,7 +55,7 @@ GLOBAL_LIST_EMPTY(parasites) //all currently existing/living guardians var/cooldown = 0 var/mob/living/carbon/summoner var/range = 13 //how far from the user the spirit can be - var/toggle_button_type = /obj/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses + var/toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Inactive //what sort of toggle button the hud uses var/playstyle_string = "You are a standard Guardian. You shouldn't exist!" var/magic_fluff_string = "You draw the Coder, symbolizing bugs and errors. This shouldn't happen! Submit a bug report!" var/tech_fluff_string = "BOOT SEQUENCE COMPLETE. ERROR MODULE LOADED. THIS SHOULDN'T HAPPEN. Submit a bug report!" diff --git a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm index b5bb91d34f..7083f891b8 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/assassin.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/assassin.dm @@ -11,11 +11,11 @@ tech_fluff_string = "Boot sequence complete. Assassin modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's an assassin carp! Just when you thought it was safe to go back to the water... which is unhelpful, because we're in space." - toggle_button_type = /obj/screen/guardian/ToggleMode/Assassin + toggle_button_type = /atom/movable/screen/guardian/ToggleMode/Assassin var/toggle = FALSE var/stealthcooldown = 100 - var/obj/screen/alert/canstealthalert - var/obj/screen/alert/instealthalert + var/atom/movable/screen/alert/canstealthalert + var/atom/movable/screen/alert/instealthalert /mob/living/simple_animal/hostile/guardian/assassin/Initialize() . = ..() @@ -86,12 +86,12 @@ if(stealthcooldown <= world.time) if(toggle) if(!instealthalert) - instealthalert = throw_alert("instealth", /obj/screen/alert/instealth) + instealthalert = throw_alert("instealth", /atom/movable/screen/alert/instealth) clear_alert("canstealth") canstealthalert = null else if(!canstealthalert) - canstealthalert = throw_alert("canstealth", /obj/screen/alert/canstealth) + canstealthalert = throw_alert("canstealth", /atom/movable/screen/alert/canstealth) clear_alert("instealth") instealthalert = null else 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 9060350df4..ee5a648067 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/charger.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/charger.dm @@ -12,14 +12,14 @@ tech_fluff_string = "Boot sequence complete. Charge modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! Caught one! It's a charger carp, that likes running at people. But it doesn't have any legs..." var/charging = 0 - var/obj/screen/alert/chargealert + var/atom/movable/screen/alert/chargealert /mob/living/simple_animal/hostile/guardian/charger/BiologicalLife(seconds, times_fired) if(!(. = ..())) return if(ranged_cooldown <= world.time) if(!chargealert) - chargealert = throw_alert("charge", /obj/screen/alert/cancharge) + chargealert = throw_alert("charge", /atom/movable/screen/alert/cancharge) else clear_alert("charge") chargealert = null diff --git a/code/modules/mob/living/simple_animal/guardian/types/protector.dm b/code/modules/mob/living/simple_animal/guardian/types/protector.dm index 99272a6d3f..b3d9f01ebb 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/protector.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/protector.dm @@ -8,7 +8,7 @@ magic_fluff_string = "..And draw the Guardian, a stalwart protector that never leaves the side of its charge." tech_fluff_string = "Boot sequence complete. Protector modules loaded. Holoparasite swarm online." carp_fluff_string = "CARP CARP CARP! You caught one! Wait, no... it caught you! The fisher has become the fishy." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/toggle = FALSE /mob/living/simple_animal/hostile/guardian/protector/ex_act(severity) diff --git a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm index e2bcdd5684..5df446085a 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/ranged.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/ranged.dm @@ -23,7 +23,7 @@ carp_fluff_string = "CARP CARP CARP! Caught one, it's a ranged carp. This fishy can watch people pee in the ocean." see_invisible = SEE_INVISIBLE_LIVING see_in_dark = 8 - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/list/snares = list() var/toggle = FALSE diff --git a/code/modules/mob/living/simple_animal/guardian/types/support.dm b/code/modules/mob/living/simple_animal/guardian/types/support.dm index b51552acd2..fc2912ec2f 100644 --- a/code/modules/mob/living/simple_animal/guardian/types/support.dm +++ b/code/modules/mob/living/simple_animal/guardian/types/support.dm @@ -10,7 +10,7 @@ magic_fluff_string = "..And draw the CMO, a potent force of life... and death." carp_fluff_string = "CARP CARP CARP! You caught a support carp. It's a kleptocarp!" tech_fluff_string = "Boot sequence complete. Support modules active. Holoparasite swarm online." - toggle_button_type = /obj/screen/guardian/ToggleMode + toggle_button_type = /atom/movable/screen/guardian/ToggleMode var/obj/structure/receiving_pad/beacon var/beacon_cooldown = 0 var/toggle = FALSE diff --git a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm index 98700ffaf0..1b0d210d9c 100644 --- a/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm +++ b/code/modules/mob/living/simple_animal/hostile/bosses/boss.dm @@ -133,6 +133,10 @@ chance_to_hold_onto_points = highest_cost*0.5 if(points != max_points && prob(chance_to_hold_onto_points)) return //Let's save our points for a better ability (unless we're at max points, in which case we can't save anymore!) + do_ability() + +/datum/boss_active_timed_battle/proc/do_ability() + set waitfor = FALSE if(!boss.client) abilities = shuffle(abilities) for(var/ab in abilities) diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index 6950c6409f..78697cb4fe 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -94,7 +94,7 @@ L.SetUnconscious(0, FALSE) L.adjustOxyLoss(-50)// do CPR first if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding - L.blood_volume += 30 + L.adjust_integration_blood(30) L.bleedsuppress = 0 if(L.getBruteLoss() >= 50)// first, did we beat them into crit? if so, heal that var/healing = min(L.getBruteLoss(), 120) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 95f8f2acc1..01a30bb90a 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -364,11 +364,10 @@ /mob/living/simple_animal/hostile/proc/AttackingTarget() SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target) in_melee = TRUE - /* sorry for the simplemob vore fans if(vore_active) if(isliving(target)) var/mob/living/L = target - if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags,DEVOURABLE)) // aggressive check to ensure vore attacks can be made + if(!client && L.Adjacent(src) && CHECK_BITFIELD(L.vore_flags, DEVOURABLE) && CHECK_BITFIELD(L.vore_flags, MOBVORE)) // aggressive check to ensure vore attacks can be made if(prob(voracious_chance)) vore_attack(src,L,src) else @@ -379,7 +378,6 @@ return target.attack_animal(src) else return target.attack_animal(src) - */ return target.attack_animal(src) /mob/living/simple_animal/hostile/proc/Aggro() diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm index 7565a686bf..0f25688b6a 100644 --- a/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm +++ b/code/modules/mob/living/simple_animal/hostile/jungle/seedling.dm @@ -69,7 +69,7 @@ status_type = STATUS_EFFECT_MULTIPLE alert_type = null tick_interval = 1 - var/obj/screen/seedling/seedling_screen_object + var/atom/movable/screen/seedling/seedling_screen_object var/atom/target @@ -81,7 +81,7 @@ /datum/status_effect/seedling_beam_indicator/on_apply() if(owner.client) - seedling_screen_object = new /obj/screen/seedling() + seedling_screen_object = new /atom/movable/screen/seedling() owner.client.screen += seedling_screen_object tick() return ..() @@ -98,7 +98,7 @@ final.Turn(target_angle) seedling_screen_object.transform = final -/obj/screen/seedling +/atom/movable/screen/seedling icon = 'icons/mob/jungle/arachnid.dmi' icon_state = "seedling_beam_indicator" screen_loc = "CENTER:-16,CENTER:-16" diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm index a60c5504e6..e6c5e7c22b 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/blood_drunk_miner.dm @@ -40,8 +40,10 @@ Difficulty: Medium ranged = 1 ranged_cooldown_time = 16 pixel_x = -16 - crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka, /obj/item/crusher_trophy/miner_eye) - loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka) + crusher_loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka, /obj/item/crusher_trophy/miner_eye, /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe, + /obj/item/disk/design_disk/modkit_disc/bounty,/obj/item/disk/design_disk/modkit_disc/resonator_blast,/obj/item/disk/design_disk/modkit_disc/rapid_repeater) + loot = list(/obj/item/melee/transforming/cleaving_saw, /obj/item/gun/energy/kinetic_accelerator/premiumka,/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe, + /obj/item/disk/design_disk/modkit_disc/bounty,/obj/item/disk/design_disk/modkit_disc/resonator_blast,/obj/item/disk/design_disk/modkit_disc/rapid_repeater) wander = FALSE del_on_death = TRUE blood_volume = BLOOD_VOLUME_NORMAL diff --git a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm index 2bcca74f30..1aa0957fee 100644 --- a/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm +++ b/code/modules/mob/living/simple_animal/hostile/megafauna/demonic_frost_miner.dm @@ -26,8 +26,10 @@ Difficulty: Extremely Hard speed = 20 move_to_delay = 20 ranged = TRUE - crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman) - loot = list(/obj/effect/decal/remains/plasma) + crusher_loot = list(/obj/effect/decal/remains/plasma, /obj/item/crusher_trophy/ice_block_talisman, ,/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe, + /obj/item/disk/design_disk/modkit_disc/bounty,/obj/item/disk/design_disk/modkit_disc/resonator_blast,/obj/item/disk/design_disk/modkit_disc/rapid_repeater) + loot = list(/obj/effect/decal/remains/plasma, ,/obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe, + /obj/item/disk/design_disk/modkit_disc/bounty,/obj/item/disk/design_disk/modkit_disc/resonator_blast,/obj/item/disk/design_disk/modkit_disc/rapid_repeater) wander = FALSE del_on_death = TRUE blood_volume = BLOOD_VOLUME_NORMAL @@ -337,11 +339,11 @@ Difficulty: Extremely Hard id = "ice_block_talisman" duration = 25 status_type = STATUS_EFFECT_REFRESH - alert_type = /obj/screen/alert/status_effect/ice_block_talisman + alert_type = /atom/movable/screen/alert/status_effect/ice_block_talisman /// Stored icon overlay for the hit mob, removed when effect is removed var/icon/cube -/obj/screen/alert/status_effect/ice_block_talisman +/atom/movable/screen/alert/status_effect/ice_block_talisman name = "Frozen Solid" desc = "You're frozen inside an ice cube, and cannot move!" icon_state = "frozen" diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm index f2ece50af2..24e595ef7e 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/basilisk.dm @@ -102,23 +102,13 @@ consume_bait() /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/proc/consume_bait() - var/list/L = list() - for(var/obj/O in view(src, 9)) - L += O - var/obj/item/stack/ore/diamond/diamonds = locate(/obj/item/stack/ore/diamond) in L - if(diamonds) - var/distanced = 0 - distanced = get_dist(loc,diamonds.loc) - if(distanced <= 1 && diamonds) - qdel(diamonds) - src.visible_message("[src] consumes [diamonds], and it disappears! ...At least, you think.") - var/obj/item/pen/survival/bait = locate(/obj/item/pen/survival) in L - if(bait) - var/distanceb = 0 - distanceb = get_dist(loc,bait.loc) - if(distanceb <= 1 && bait) - qdel(bait) - visible_message("[src] examines [bait] closer, and telekinetically shatters the pen.") + for(var/obj/O in view(1, src)) + if(istype(O, /obj/item/stack/ore/diamond)) + qdel(O) + src.visible_message("[src] consumes [O], and it disappears! ...At least, you think.") + else if(istype(O, /obj/item/pen/survival)) + qdel(O) + src.visible_message("[src] examines [O] closer, and telekinetically shatters the pen.") /mob/living/simple_animal/hostile/asteroid/basilisk/watcher/random/Initialize() . = ..() 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 e347056924..d677f59440 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 @@ -113,7 +113,7 @@ While using this makes the system rely on OnFire, it still gives options for tim severity = 7 hud_used.healths.icon_state = "elite_health[severity]" if(severity > 0) - overlay_fullscreen("brute", /obj/screen/fullscreen/brute, severity) + overlay_fullscreen("brute", /atom/movable/screen/fullscreen/brute, severity) else clear_fullscreen("brute") diff --git a/code/modules/mob/living/simple_animal/hostile/regalrat.dm b/code/modules/mob/living/simple_animal/hostile/regalrat.dm index 77731f0ea4..950da865f6 100644 --- a/code/modules/mob/living/simple_animal/hostile/regalrat.dm +++ b/code/modules/mob/living/simple_animal/hostile/regalrat.dm @@ -35,14 +35,16 @@ coffer.Grant(src) riot = new /datum/action/cooldown/riot riot.Grant(src) + AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) + INVOKE_ASYNC(src, .proc/poll_for_player) + +/mob/living/simple_animal/hostile/regalrat/proc/poll_for_player() var/list/mob/dead/observer/candidates = pollGhostCandidates("Do you want to play as the Royal Rat, cheesey be his crown?", ROLE_SENTIENCE, null, FALSE, 100, POLL_IGNORE_SENTIENCE_POTION) if(LAZYLEN(candidates) && !mind) var/mob/dead/observer/C = pick(candidates) key = C.key notify_ghosts("All rise for the rat king, ascendant to the throne in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE) - AddElement(/datum/element/ventcrawling, given_tier = VENTCRAWLER_ALWAYS) - /mob/living/simple_animal/hostile/regalrat/handle_automated_action() if(prob(20)) riot.Trigger() diff --git a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm index 5750d1ecb9..e2f83677d8 100644 --- a/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm +++ b/code/modules/mob/living/simple_animal/hostile/retaliate/clown.dm @@ -45,10 +45,10 @@ /mob/living/simple_animal/hostile/retaliate/clown/handle_temperature_damage() if(bodytemperature < minbodytemp) adjustBruteLoss(10) - throw_alert("temp", /obj/screen/alert/cold, 2) + throw_alert("temp", /atom/movable/screen/alert/cold, 2) else if(bodytemperature > maxbodytemp) adjustBruteLoss(15) - throw_alert("temp", /obj/screen/alert/hot, 3) + throw_alert("temp", /atom/movable/screen/alert/hot, 3) else clear_alert("temp") diff --git a/code/modules/mob/living/simple_animal/hostile/tree.dm b/code/modules/mob/living/simple_animal/hostile/tree.dm index 0e106caf46..978d58339d 100644 --- a/code/modules/mob/living/simple_animal/hostile/tree.dm +++ b/code/modules/mob/living/simple_animal/hostile/tree.dm @@ -50,12 +50,12 @@ if(isopenturf(loc)) var/turf/open/T = src.loc if(T.air) - var/co2 = T.air.get_moles(/datum/gas/carbon_dioxide) + var/co2 = T.air.get_moles(GAS_CO2) if(co2 > 0) if(prob(25)) var/amt = min(co2, 9) - T.air.adjust_moles(/datum/gas/carbon_dioxide, -amt) - T.atmos_spawn_air("o2=[amt]") + T.air.adjust_moles(GAS_CO2, -amt) + T.atmos_spawn_air("o2=[amt];TEMP=293.15") /mob/living/simple_animal/hostile/tree/AttackingTarget() . = ..() diff --git a/code/modules/mob/living/simple_animal/hostile/zombie.dm b/code/modules/mob/living/simple_animal/hostile/zombie.dm index 1217084ce3..ecb5cd2290 100644 --- a/code/modules/mob/living/simple_animal/hostile/zombie.dm +++ b/code/modules/mob/living/simple_animal/hostile/zombie.dm @@ -30,6 +30,7 @@ setup_visuals() /mob/living/simple_animal/hostile/zombie/proc/setup_visuals() + set waitfor = FALSE var/datum/preferences/dummy_prefs = new dummy_prefs.pref_species = new /datum/species/zombie dummy_prefs.be_random_body = TRUE diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index e46c57f245..65c553b11d 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -264,10 +264,10 @@ var/turf/open/ST = src.loc if(ST.air) - var/tox = ST.air.get_moles(/datum/gas/plasma) - var/oxy = ST.air.get_moles(/datum/gas/oxygen) - var/n2 = ST.air.get_moles(/datum/gas/nitrogen) - var/co2 = ST.air.get_moles(/datum/gas/carbon_dioxide) + var/tox = ST.air.get_moles(GAS_PLASMA) + var/oxy = ST.air.get_moles(GAS_O2) + var/n2 = ST.air.get_moles(GAS_N2) + var/co2 = ST.air.get_moles(GAS_CO2) if(atmos_requirements["min_oxy"] && oxy < atmos_requirements["min_oxy"]) . = FALSE @@ -554,7 +554,7 @@ var/oindex = active_hand_index active_hand_index = hand_index if(hud_used) - var/obj/screen/inventory/hand/H + var/atom/movable/screen/inventory/hand/H H = hud_used.hand_slots["[hand_index]"] if(H) H.update_icon() diff --git a/code/modules/mob/living/simple_animal/slime/life.dm b/code/modules/mob/living/simple_animal/slime/life.dm index 600222df68..2ce355a0ef 100644 --- a/code/modules/mob/living/simple_animal/slime/life.dm +++ b/code/modules/mob/living/simple_animal/slime/life.dm @@ -129,7 +129,7 @@ Tempstun = 0 if(stat != DEAD) - var/bz_percentage = environment.total_moles() ? (environment.get_moles(/datum/gas/bz) / environment.total_moles()) : 0 + var/bz_percentage = environment.total_moles() ? (environment.get_moles(GAS_BZ) / environment.total_moles()) : 0 var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis if(stat == CONSCIOUS && stasis) diff --git a/code/modules/mob/living/simple_animal/slime/slime.dm b/code/modules/mob/living/simple_animal/slime/slime.dm index f6169be902..68de074e07 100644 --- a/code/modules/mob/living/simple_animal/slime/slime.dm +++ b/code/modules/mob/living/simple_animal/slime/slime.dm @@ -129,7 +129,7 @@ coretype = text2path("/obj/item/slime_extract/[sanitizedcolour]") regenerate_icons() -/mob/living/simple_animal/slime/proc/update_name() +/mob/living/simple_animal/slime/update_name() if(slime_name_regex.Find(name)) number = rand(1, 1000) name = "[colour] [is_adult ? "adult" : "baby"] slime ([number])" diff --git a/code/modules/mob/living/stamina_buffer.dm b/code/modules/mob/living/stamina_buffer.dm index a410df582b..91811e048a 100644 --- a/code/modules/mob/living/stamina_buffer.dm +++ b/code/modules/mob/living/stamina_buffer.dm @@ -35,11 +35,10 @@ return CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/out_of_combat_timer, out_of_combat_timer) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/base_regeneration, base_regeneration) - CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/combat_regeneration, combat_regeneration) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/percent_regeneration_out_of_combat, percent_regeneration_out_of_combat) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/post_action_penalty_delay, post_action_penalty_delay) CONFIG_CACHE_ENTRY_AND_FETCH_VALUE(number/stamina_combat/post_action_penalty_factor, post_action_penalty_factor) - var/base_regen = (SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_INACTIVE))? base_regeneration : combat_regeneration + var/base_regen = base_regeneration var/time_since_last_action = world.time - stamina_buffer_last_use var/action_penalty = ((time_since_last_action) < (post_action_penalty_delay * 10))? post_action_penalty_factor : 1 var/out_of_combat_bonus = (time_since_last_action < (out_of_combat_timer * 10))? 0 : ((buffer_max * percent_regeneration_out_of_combat * 0.01)) diff --git a/code/modules/mob/living/status_procs.dm b/code/modules/mob/living/status_procs.dm index 87fd0cf609..02e88e3741 100644 --- a/code/modules/mob/living/status_procs.dm +++ b/code/modules/mob/living/status_procs.dm @@ -4,7 +4,8 @@ // ignore_castun = same logic as Paralyze() in general // override_duration = If this is set, does Paralyze() for this duration. // override_stam = If this is set, does this amount of stamina damage. -/mob/living/proc/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg) +// knocktofloor - whether to knock them to the ground +/mob/living/proc/DefaultCombatKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE, override_hardstun, override_stamdmg, knocktofloor = TRUE) if(!iscarbon(src)) return Paralyze(amount, updating, ignore_canknockdown) if(!ignore_canknockdown && !(status_flags & CANKNOCKDOWN)) @@ -13,7 +14,8 @@ buckled.unbuckle_mob(src) var/drop_items = amount > 80 //80 is cutoff for old item dropping behavior var/stamdmg = isnull(override_stamdmg)? (amount * 0.25) : override_stamdmg - KnockToFloor(drop_items, TRUE, updating) + if(knocktofloor) + KnockToFloor(drop_items, TRUE, updating) adjustStaminaLoss(stamdmg) if(!isnull(override_hardstun)) Paralyze(override_hardstun) @@ -597,7 +599,7 @@ /mob/living/proc/become_nearsighted(source) if(!HAS_TRAIT(src, TRAIT_NEARSIGHT)) - overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1) + overlay_fullscreen("nearsighted", /atom/movable/screen/fullscreen/impaired, 1) ADD_TRAIT(src, TRAIT_NEARSIGHT, source) /mob/living/proc/cure_husk(source) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 824e262ae1..efb4512bca 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -70,7 +70,7 @@ t += "Temperature: [environment.return_temperature()] \n" for(var/id in environment.get_gases()) if(environment.get_moles(id)) - t+="[GLOB.meta_gas_names[id]]: [environment.get_moles(id)] \n" + t+="[GLOB.gas_data.names[id]]: [environment.get_moles(id)] \n" to_chat(usr, t) @@ -884,7 +884,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) /mob/proc/sync_lighting_plane_alpha() if(hud_used) - var/obj/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] + var/atom/movable/screen/plane_master/lighting/L = hud_used.plane_masters["[LIGHTING_PLANE]"] if (L) L.alpha = lighting_alpha diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index ba2399b831..b77b9913ba 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -142,7 +142,7 @@ var/registered_z - var/list/alerts = list() // contains /obj/screen/alert only // On /mob so clientless mobs will throw alerts properly + var/list/alerts = list() // contains /atom/movable/screen/alert only // On /mob so clientless mobs will throw alerts properly var/list/screens = list() var/list/client_colours = list() var/hud_type = /datum/hud diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 4b0f505067..5bfc6fe652 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -362,7 +362,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp if(flashwindow) window_flash(O.client) if(source) - var/obj/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /obj/screen/alert/notify_action) + var/atom/movable/screen/alert/notify_action/A = O.throw_alert("[REF(source)]_notify_action", /atom/movable/screen/alert/notify_action) if(A) if(O.client.prefs && O.client.prefs.UI_style) A.icon = ui_style2icon(O.client.prefs.UI_style) diff --git a/code/modules/mob/mob_movement.dm b/code/modules/mob/mob_movement.dm index 2af68eab46..bfd4cfcd29 100644 --- a/code/modules/mob/mob_movement.dm +++ b/code/modules/mob/mob_movement.dm @@ -95,7 +95,7 @@ . = ..() if((direction & (direction - 1)) && mob.loc == n) //moved diagonally successfully - add_delay *= 2 + add_delay *= SQRT_2 mob.set_glide_size(DELAY_TO_GLIDE_SIZE(add_delay), FALSE) move_delay += add_delay if(.) // If mob is null here, we deserve the runtime @@ -267,7 +267,7 @@ //1: r-leg 2: groin 3: l-leg /client/proc/check_has_body_select() - return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /obj/screen/zone_sel) + return mob && mob.hud_used && mob.hud_used.zone_select && istype(mob.hud_used.zone_select, /atom/movable/screen/zone_sel) /client/verb/body_toggle_head() set name = "body-toggle-head" @@ -285,7 +285,7 @@ else next_in_line = BODY_ZONE_HEAD - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(next_in_line, mob) /client/verb/body_r_arm() @@ -295,7 +295,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_ARM, mob) /client/verb/body_chest() @@ -305,7 +305,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_CHEST, mob) /client/verb/body_l_arm() @@ -315,7 +315,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_ARM, mob) /client/verb/body_r_leg() @@ -325,7 +325,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_R_LEG, mob) /client/verb/body_groin() @@ -335,7 +335,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_PRECISE_GROIN, mob) /client/verb/body_l_leg() @@ -345,7 +345,7 @@ if(!check_has_body_select()) return - var/obj/screen/zone_sel/selector = mob.hud_used.zone_select + var/atom/movable/screen/zone_sel/selector = mob.hud_used.zone_select selector.set_selected_zone(BODY_ZONE_L_LEG, mob) /client/verb/toggle_walk_run() @@ -364,7 +364,7 @@ return FALSE m_intent = MOVE_INTENT_RUN if(hud_used && hud_used.static_inventory) - for(var/obj/screen/mov_intent/selector in hud_used.static_inventory) + for(var/atom/movable/screen/mov_intent/selector in hud_used.static_inventory) selector.update_icon() /mob/verb/up() diff --git a/code/modules/mob/say_vr.dm b/code/modules/mob/say_vr.dm index 94bf45c1b0..88bb526188 100644 --- a/code/modules/mob/say_vr.dm +++ b/code/modules/mob/say_vr.dm @@ -144,33 +144,14 @@ message = "[user] [user.say_emphasis(message)]" var/list/show_to = list() - var/list/processing = list() - var/safety = 25 + var/list/processed = list() for(var/obj/structure/table/T in range(user, 1)) - processing |= T - for(var/i = 1; i <= processing.len; ++i) - var/obj/structure/table/T = processing[i] - if(safety-- <= 0) - to_chat(user, "Table scan aborted early, some people might have not received the message (max 25)") - break - if(get_dist(T, user) > 7) - continue // nah - processing |= T - for(var/mob/living/M in range(T, 1)) // no ghosts/cameramobs - show_to |= M - var/obj/structure/table/other - other = locate() in get_step(T, NORTH) - if(other) - processing |= other - other = locate() in get_step(T, SOUTH) - if(other) - processing |= other - other = locate() in get_step(T, WEST) - if(other) - processing |= other - other = locate() in get_step(T, EAST) - if(other) - processing |= other + if(processed[T]) + continue + for(var/obj/structure/table/T2 in T.connected_floodfill(25)) + processed[T2] = TRUE + for(var/mob/living/L in range(T2, 1)) + show_to |= L for(var/i in show_to) var/mob/M = i diff --git a/code/modules/mob/status_procs.dm b/code/modules/mob/status_procs.dm index fbef8fd244..089484ea9f 100644 --- a/code/modules/mob/status_procs.dm +++ b/code/modules/mob/status_procs.dm @@ -52,8 +52,8 @@ /mob/proc/update_blindness() if(eye_blind) // UNCONSCIOUS or has blind trait, or has temporary blindness if(stat == CONSCIOUS || stat == SOFT_CRIT) - throw_alert("blind", /obj/screen/alert/blind) - overlay_fullscreen("blind", /obj/screen/fullscreen/blind) + throw_alert("blind", /atom/movable/screen/alert/blind) + overlay_fullscreen("blind", /atom/movable/screen/fullscreen/blind) // You are blind why should you be able to make out details like color, only shapes near you // add_client_colour(/datum/client_colour/monochrome/blind) else // CONSCIOUS no blind trait, no blindness @@ -91,7 +91,7 @@ var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) for(var/A in screens) - var/obj/screen/plane_master/P = A + var/atom/movable/screen/plane_master/P = A P.add_filter("blurry_eyes", 2, EYE_BLUR(clamp(eye_blurry*0.1,0.6,3))) /mob/proc/remove_eyeblur() @@ -100,7 +100,7 @@ var/list/screens = list(hud_used.plane_masters["[GAME_PLANE]"], hud_used.plane_masters["[FLOOR_PLANE]"], hud_used.plane_masters["[WALL_PLANE]"], hud_used.plane_masters["[ABOVE_WALL_PLANE]"]) for(var/A in screens) - var/obj/screen/plane_master/P = A + var/atom/movable/screen/plane_master/P = A P.remove_filter("blurry_eyes") ///Adjust the drugginess of a mob diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index 131a098258..635ec2e54c 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -123,7 +123,7 @@ /obj/item/modular_computer/MouseDrop(obj/over_object, src_location, over_location) var/mob/M = usr - if((!istype(over_object, /obj/screen)) && usr.canUseTopic(src, BE_CLOSE)) + if((!istype(over_object, /atom/movable/screen)) && usr.canUseTopic(src, BE_CLOSE)) return attack_self(M) return ..() @@ -349,6 +349,7 @@ // Relays kill program request to currently active program. Use this to quit current program. /obj/item/modular_computer/proc/kill_program(forced = FALSE) + set waitfor = FALSE if(active_program) active_program.kill_program(forced) active_program = null diff --git a/code/modules/modular_computers/computers/item/laptop.dm b/code/modules/modular_computers/computers/item/laptop.dm index aee5dd4229..5686dec8d0 100644 --- a/code/modules/modular_computers/computers/item/laptop.dm +++ b/code/modules/modular_computers/computers/item/laptop.dm @@ -68,11 +68,11 @@ try_toggle_open(usr) /obj/item/modular_computer/laptop/MouseDrop(obj/over_object, src_location, over_location) - if(istype(over_object, /obj/screen/inventory/hand) || over_object == usr) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand) || over_object == usr) + var/atom/movable/screen/inventory/hand/H = over_object var/mob/M = usr - if(!istype(over_object, /obj/screen/inventory/hand)) + if(!istype(over_object, /atom/movable/screen/inventory/hand)) M.put_in_active_hand(src) return diff --git a/code/modules/modular_computers/file_system/programs/atmosscan.dm b/code/modules/modular_computers/file_system/programs/atmosscan.dm index 7c491712fe..1576a5b4b7 100644 --- a/code/modules/modular_computers/file_system/programs/atmosscan.dm +++ b/code/modules/modular_computers/file_system/programs/atmosscan.dm @@ -31,7 +31,7 @@ for(var/id in env_gases) var/gas_level = environment.get_moles(id)/total_moles if(gas_level > 0) - airlist += list(list("name" = "[GLOB.meta_gas_names[id]]", "percentage" = round(gas_level*100, 0.01))) + airlist += list(list("name" = "[GLOB.gas_data.names[id]]", "percentage" = round(gas_level*100, 0.01))) data["AirData"] = airlist else data["AirPressure"] = 0 diff --git a/code/modules/modular_computers/file_system/programs/secureye.dm b/code/modules/modular_computers/file_system/programs/secureye.dm index 78e72640ed..92275b1e8b 100644 --- a/code/modules/modular_computers/file_system/programs/secureye.dm +++ b/code/modules/modular_computers/file_system/programs/secureye.dm @@ -21,10 +21,10 @@ // Stuff needed to render the map var/map_name - var/obj/screen/map_view/cam_screen + var/atom/movable/screen/map_view/cam_screen /// All the plane masters that need to be applied. var/list/cam_plane_masters - var/obj/screen/background/cam_background + var/atom/movable/screen/background/cam_background /datum/computer_file/program/secureye/New() . = ..() @@ -42,8 +42,8 @@ cam_screen.del_on_map_removal = FALSE cam_screen.screen_loc = "[map_name]:1,1" cam_plane_masters = list() - for(var/plane in subtypesof(/obj/screen/plane_master)) - var/obj/screen/instance = new plane() + for(var/plane in subtypesof(/atom/movable/screen/plane_master)) + var/atom/movable/screen/instance = new plane() instance.assigned_map = map_name instance.del_on_map_removal = FALSE instance.screen_loc = "[map_name]:CENTER" diff --git a/code/modules/modular_computers/file_system/programs/sm_monitor.dm b/code/modules/modular_computers/file_system/programs/sm_monitor.dm index 7ef2f7416a..6c9ce59c72 100644 --- a/code/modules/modular_computers/file_system/programs/sm_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/sm_monitor.dm @@ -139,13 +139,13 @@ var/amount = air.get_moles(gasid) if(amount) gasdata.Add(list(list( - "name"= GLOB.meta_gas_names[gasid], + "name"= GLOB.gas_data.names[gasid], "amount" = round(100*amount/air.total_moles(),0.01)))) else for(var/gasid in air.get_gases()) gasdata.Add(list(list( - "name"= GLOB.meta_gas_names[gasid], + "name"= GLOB.gas_data.names[gasid], "amount" = 0))) data["gases"] = gasdata diff --git a/code/modules/movespeed/modifiers/reagents.dm b/code/modules/movespeed/modifiers/reagents.dm index 1a03e8a602..ca0a74d749 100644 --- a/code/modules/movespeed/modifiers/reagents.dm +++ b/code/modules/movespeed/modifiers/reagents.dm @@ -2,17 +2,53 @@ blacklisted_movetypes = (FLYING|FLOATING) /datum/movespeed_modifier/reagent/stimulants - multiplicative_slowdown = -0.5 + multiplicative_slowdown = -0.55 + +/datum/movespeed_modifier/reagent/ephedrine + // strong painkiller effect that caps out at slightly above runspeed + multiplicative_slowdown = -1.5 + priority = -100 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7 + +/datum/movespeed_modifier/reagent/pepperspray + multiplicative_slowdown = 0.25 + +/datum/movespeed_modifier/reagent/monkey_energy + multiplicative_slowdown = -0.35 /datum/movespeed_modifier/reagent/changelinghaste - multiplicative_slowdown = -2 + // extremely strong painkiller effect: allows user to run at old sprint speeds but not over by cancelling out slowdowns. + // however, will not make user go faster than that + multiplicative_slowdown = -4 + priority = -100 + complex_calculation = TRUE + absolute_max_tiles_per_second = 8 + +/datum/movespeed_modifier/reagent/methamphetamine + // very strong painkiller effect that caps out at slightly above runspeed + multiplicative_slowdown = -2.5 + priority = -100 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7.5 + +/datum/movespeed_modifier/reagent/nitryl + multiplicative_slowdown = -0.65 + +/datum/movespeed_modifier/reagent/freon + multiplicative_slowdown = 1.6 + +/datum/movespeed_modifier/reagent/halon + multiplicative_slowdown = 1.8 + +/datum/movespeed_modifier/reagent/lenturi + multiplicative_slowdown = 1.5 + +/datum/movespeed_modifier/reagent/nuka_cola + multiplicative_slowdown = -0.35 + +/datum/movespeed_modifier/reagent/nooartrium + multiplicative_slowdown = 2 /datum/movespeed_modifier/reagent/skooma multiplicative_slowdown = -1 - -/datum/movespeed_modifier/reagent/nitryl - multiplicative_slowdown = -1 - -/datum/movespeed_modifier/reagent/meth - multiplicative_slowdown = -0.5 - absolute_max_tiles_per_second = 11 diff --git a/code/modules/movespeed/modifiers/status_effects.dm b/code/modules/movespeed/modifiers/status_effects.dm index 1a017c25b0..260ee17c21 100644 --- a/code/modules/movespeed/modifiers/status_effects.dm +++ b/code/modules/movespeed/modifiers/status_effects.dm @@ -45,3 +45,17 @@ /datum/movespeed_modifier/status_effect/mkultra multiplicative_slowdown = -2 blacklisted_movetypes= FLYING|FLOATING + +/datum/movespeed_modifier/status_effect/stagger + variable = TRUE + +/datum/movespeed_modifier/status_effect/off_balance + variable = TRUE + +/datum/movespeed_modifier/status_effect/slime/light_pink + // decently good painkiller + speedup effect + blacklisted_movetypes = FLYING | FLOATING + priority = -150 // someday we really need to make these defines lmao + multiplicative_slowdown = -2 + complex_calculation = TRUE + absolute_max_tiles_per_second = 7 diff --git a/code/modules/paperwork/paper_cutter.dm b/code/modules/paperwork/paper_cutter.dm index f5cb6e1a10..2bb743abbd 100644 --- a/code/modules/paperwork/paper_cutter.dm +++ b/code/modules/paperwork/paper_cutter.dm @@ -101,8 +101,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index 16a9ed33ed..6775532614 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -52,8 +52,8 @@ if(over_object == M) M.put_in_hands(src) - else if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + else if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) add_fingerprint(M) diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index ccb841dec8..515349d666 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -1,44 +1,104 @@ -//update_state -#define UPSTATE_CELL_IN (1<<0) -#define UPSTATE_OPENED1 (1<<1) -#define UPSTATE_OPENED2 (1<<2) -#define UPSTATE_MAINT (1<<3) -#define UPSTATE_BROKE (1<<4) -#define UPSTATE_BLUESCREEN (1<<5) -#define UPSTATE_WIREEXP (1<<6) -#define UPSTATE_ALLGOOD (1<<7) - -#define APC_RESET_EMP "emp" - -//update_overlay -#define APC_UPOVERLAY_CHARGEING0 (1<<0) -#define APC_UPOVERLAY_CHARGEING1 (1<<1) -#define APC_UPOVERLAY_CHARGEING2 (1<<2) -#define APC_UPOVERLAY_EQUIPMENT0 (1<<3) -#define APC_UPOVERLAY_EQUIPMENT1 (1<<4) -#define APC_UPOVERLAY_EQUIPMENT2 (1<<5) -#define APC_UPOVERLAY_LIGHTING0 (1<<6) -#define APC_UPOVERLAY_LIGHTING1 (1<<7) -#define APC_UPOVERLAY_LIGHTING2 (1<<8) -#define APC_UPOVERLAY_ENVIRON0 (1<<9) -#define APC_UPOVERLAY_ENVIRON1 (1<<10) -#define APC_UPOVERLAY_ENVIRON2 (1<<11) -#define APC_UPOVERLAY_LOCKED (1<<12) -#define APC_UPOVERLAY_OPERATING (1<<13) - -#define APC_ELECTRONICS_MISSING 0 // None -#define APC_ELECTRONICS_INSTALLED 1 // Installed but not secured -#define APC_ELECTRONICS_SECURED 2 // Installed and secured +// APC electronics status: +/// There are no electronics in the APC. +#define APC_ELECTRONICS_MISSING 0 +/// The electronics are installed but not secured. +#define APC_ELECTRONICS_INSTALLED 1 +/// The electronics are installed and secured. +#define APC_ELECTRONICS_SECURED 2 +// APC cover status: +/// The APCs cover is closed. #define APC_COVER_CLOSED 0 +/// The APCs cover is open. #define APC_COVER_OPENED 1 +/// The APCs cover is missing. #define APC_COVER_REMOVED 2 +// APC charging status: +/// The APC is not charging. #define APC_NOT_CHARGING 0 +/// The APC is charging. #define APC_CHARGING 1 +/// The APC is fully charged. #define APC_FULLY_CHARGED 2 #define MAXIMUM_COG_REGAIN 100 //How much charge drained by an integration cog can be priority-recharged in one processing-tick +// APC channel status: +/// The APCs power channel is manually set off. +#define APC_CHANNEL_OFF 0 +/// The APCs power channel is automatically off. +#define APC_CHANNEL_AUTO_OFF 1 +/// The APCs power channel is manually set on. +#define APC_CHANNEL_ON 2 +/// The APCs power channel is automatically on. +#define APC_CHANNEL_AUTO_ON 3 + + +// APC autoset enums: +/// The APC turns automated and manual power channels off. +#define AUTOSET_FORCE_OFF 0 +/// The APC turns automated power channels off. +#define AUTOSET_OFF 2 +/// The APC turns automated power channels on. +#define AUTOSET_ON 1 + +// External power status: +/// The APC either isn't attached to a powernet or there is no power on the external powernet. +#define APC_NO_POWER 0 +/// The APCs external powernet does not have enough power to charge the APC. +#define APC_LOW_POWER 1 +/// The APCs external powernet has enough power to charge the APC. +#define APC_HAS_POWER 2 + +// Ethereals: +/// How long it takes an ethereal to drain or charge APCs. Also used as a spam limiter. +#define APC_DRAIN_TIME (7.5 SECONDS) +/// How much power ethereals gain/drain from APCs. +#define APC_POWER_GAIN 200 + +// Wires & EMPs: +/// The wire value used to reset the APCs wires after one's EMPed. +#define APC_RESET_EMP "emp" + +// update_state +// Bitshifts: (If you change the status values to be something other than an int or able to exceed 3 you will need to change these too) +/// The bit shift for the APCs cover status. +#define UPSTATE_COVER_SHIFT (0) + /// The bitflag representing the APCs cover being open for icon purposes. + #define UPSTATE_OPENED1 (APC_COVER_OPENED << UPSTATE_COVER_SHIFT) + /// The bitflag representing the APCs cover being missing for icon purposes. + #define UPSTATE_OPENED2 (APC_COVER_REMOVED << UPSTATE_COVER_SHIFT) + +// Bitflags: +/// The APC has a power cell. +#define UPSTATE_CELL_IN (1<<2) +/// The APC is broken or damaged. +#define UPSTATE_BROKE (1<<3) +/// The APC is undergoing maintenance. +#define UPSTATE_MAINT (1<<4) +/// The APC is emagged or malfed. +#define UPSTATE_BLUESCREEN (1<<5) +/// The APCs wires are exposed. +#define UPSTATE_WIREEXP (1<<6) + +// update_overlay +// Bitflags: +/// Bitflag indicating that the APCs operating status overlay should be shown. +#define UPOVERLAY_OPERATING (1<<0) +/// Bitflag indicating that the APCs locked status overlay should be shown. +#define UPOVERLAY_LOCKED (1<<1) + +// Bitshifts: (If you change the status values to be something other than an int or able to exceed 3 you will need to change these too) +/// Bit shift for the charging status of the APC. +#define UPOVERLAY_CHARGING_SHIFT (2) +/// Bit shift for the equipment status of the APC. +#define UPOVERLAY_EQUIPMENT_SHIFT (4) +/// Bit shift for the lighting channel status of the APC. +#define UPOVERLAY_LIGHTING_SHIFT (6) +/// Bit shift for the environment channel status of the APC. +#define UPOVERLAY_ENVIRON_SHIFT (8) +///Update for hijack overlays +#define UPOVERLAY_HIJACKED (10) // the Area Power Controller (APC), formerly Power Distribution Unit (PDU) // one per area, needs wire connection to power network through a terminal @@ -51,12 +111,13 @@ name = "area power controller" desc = "A control terminal for the area's electrical systems." plane = ABOVE_WALL_PLANE + icon_state = "apc0" use_power = NO_POWER_USE req_access = null max_integrity = 300 integrity_failure = 0.17 - var/damage_deflection = 10 + damage_deflection = 10 resistance_flags = FIRE_PROOF armor = list("melee" = 40, "bullet" = 40, "laser" = 40, "energy" = 100, "bomb" = 30, "bio" = 100, "rad" = 100, "fire" = 90, "acid" = 50) req_access = list(ACCESS_ENGINE_EQUIP) @@ -66,29 +127,29 @@ var/area/area var/areastring = null var/obj/item/stock_parts/cell/cell - var/start_charge = 90 // initial cell charge % - var/cell_type = /obj/item/stock_parts/cell/upgraded //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs + var/start_charge = 90 // initial cell charge % + var/cell_type = /obj/item/stock_parts/cell/upgraded //Base cell has 2500 capacity. Enter the path of a different cell you want to use. cell determines charge rates, max capacity, ect. These can also be changed with other APC vars, but isn't recommended to minimize the risk of accidental usage of dirty editted APCs var/opened = APC_COVER_CLOSED - var/shorted = 0 - var/lighting = 3 - var/equipment = 3 - var/environ = 3 + var/shorted = FALSE + var/lighting = APC_CHANNEL_AUTO_ON + var/equipment = APC_CHANNEL_AUTO_ON + var/environ = APC_CHANNEL_AUTO_ON var/operating = TRUE var/charging = APC_NOT_CHARGING var/chargemode = 1 var/chargecount = 0 var/locked = TRUE var/coverlocked = TRUE - var/aidisabled = 0 + var/aidisabled = FALSE var/tdir = null var/obj/machinery/power/terminal/terminal = null var/lastused_light = 0 var/lastused_equip = 0 var/lastused_environ = 0 var/lastused_total = 0 - var/main_status = 0 // Whether or not there's external power. 0 is "none", 1 is "insufficient", 2 is "charging". - powernet = 0 // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( - var/malfhack = 0 //New var for my changes to AI malf. --NeoFite + var/main_status = 0 + powernet = FALSE // set so that APCs aren't found as powernet nodes //Hackish, Horrible, was like this before I changed it :( + var/malfhack = FALSE //New var for my changes to AI malf. --NeoFite var/mob/living/silicon/ai/malfai = null //See above --NeoFite var/has_electronics = APC_ELECTRONICS_MISSING // 0 - none, 1 - plugged in, 2 - secured by screwdriver var/overload = 1 //used for the Blackout malf module @@ -98,9 +159,9 @@ var/obj/item/clockwork/integration_cog/integration_cog //Is there a cog siphoning power? var/cog_drained = 0 //How much of the cell's charge was drained by an integration cog, recovering this amount takes priority over the normal APC cell recharge calculations, but comes after powering Essentials. var/longtermpower = 10 - var/auto_name = 0 + var/auto_name = FALSE var/failure_timer = 0 - var/force_update = 0 + var/force_update = FALSE var/emergency_lights = FALSE var/nightshift_lights = FALSE var/nightshift_requires_auth = FALSE @@ -119,6 +180,9 @@ /obj/machinery/power/apc/syndicate //general syndicate access req_access = list(ACCESS_SYNDICATE) +/obj/machinery/power/apc/away //general away mission access + req_access = list(ACCESS_AWAY_GENERAL) + /obj/machinery/power/apc/highcap/five_k cell_type = /obj/item/stock_parts/cell/upgraded/plus @@ -177,7 +241,6 @@ area = A if(auto_name) name = "\improper [A.name] APC" - update_icon() make_terminal() update_nightshift_auth_requirement() @@ -187,8 +250,9 @@ opened = APC_COVER_OPENED operating = FALSE name = "\improper [A.name] APC" - stat |= MAINT - update_icon() + set_machine_stat(stat | MAINT) + + update_appearance() addtimer(CALLBACK(src, .proc/update), 5) GLOB.apcs_list += src @@ -196,21 +260,36 @@ wires = new /datum/wires/apc(src) // offset 24 pixels in direction of dir // this allows the APC to be embedded in a wall, yet still inside an area + if (building) + setDir(ndir) + tdir = dir // to fix Vars bug setDir(SOUTH) switch(tdir) if(NORTH) - pixel_x = 0 + if((pixel_y != initial(pixel_y)) && (pixel_y != 23)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_y value ([pixel_y] - should be 23.)") pixel_y = 23 if(SOUTH) - pixel_x = 0 + if((pixel_y != initial(pixel_y)) && (pixel_y != -23)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_y value ([pixel_y] - should be -23.)") pixel_y = -23 if(EAST) - pixel_y = 0 + if((pixel_y != initial(pixel_x)) && (pixel_x != 24)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_x value ([pixel_x] - should be 24.)") pixel_x = 24 if(WEST) - pixel_y = 0 + if((pixel_y != initial(pixel_x)) && (pixel_x != -25)) + log_mapping("APC: ([src]) at [AREACOORD(src)] with dir ([tdir] | [uppertext(dir2text(tdir))]) has pixel_x value ([pixel_x] - should be -25.)") pixel_x = -25 + if (building) + area = get_area(src) + opened = APC_COVER_OPENED + operating = FALSE + name = "\improper [get_area_name(area, TRUE)] APC" + set_machine_stat(stat | MAINT) + update_appearance() + addtimer(CALLBACK(src, .proc/update), 5) /obj/machinery/power/apc/Destroy() GLOB.apcs_list -= src @@ -221,6 +300,7 @@ area.power_equip = FALSE area.power_environ = FALSE area.power_change() + area.poweralert(FALSE, src) if(occupier) malfvacate(1) qdel(wires) @@ -234,7 +314,7 @@ /obj/machinery/power/apc/handle_atom_del(atom/A) if(A == cell) cell = null - update_icon() + update_appearance() updateUsrDialog() /obj/machinery/power/apc/proc/make_terminal() @@ -275,157 +355,130 @@ // update the APC icon to show the three base states // also add overlays for indicator lights -/obj/machinery/power/apc/update_icon() - var/update = check_updates() //returns 0 if no need to update icons. - // 1 if we need to update the icon_state - // 2 if we need to update the overlays - if(!update) - icon_update_needed = FALSE +/obj/machinery/power/apc/update_appearance(updates=check_updates()) + icon_update_needed = FALSE + if(!updates) return - if(update & 1) // Updating the icon state - if(update_state & UPSTATE_ALLGOOD) - icon_state = "apc0" - else if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) - var/basestate = "apc[ cell ? "2" : "1" ]" - if(update_state & UPSTATE_OPENED1) - if(update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) - icon_state = "apcmaint" //disabled APC cannot hold cell - else - icon_state = basestate - else if(update_state & UPSTATE_OPENED2) - if (update_state & UPSTATE_BROKE || malfhack) - icon_state = "[basestate]-b-nocover" - else - icon_state = "[basestate]-nocover" - else if(update_state & UPSTATE_BROKE) - icon_state = "apc-b" - else if(update_state & UPSTATE_BLUESCREEN) - icon_state = "apcemag" - else if(update_state & UPSTATE_WIREEXP) - icon_state = "apcewires" - else if(update_state & UPSTATE_MAINT) - icon_state = "apc0" - - if(!(update_state & UPSTATE_ALLGOOD)) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode - if(update & 2) - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) - if(!(stat & (BROKEN|MAINT)) && update_state & UPSTATE_ALLGOOD) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apcox-[locked]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijackerreturn ? "3" : charging]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco3-[hijackerreturn ? "3" : charging]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - if(operating) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco0-[equipment]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco1-[lighting]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", layer, plane, dir) - SSvis_overlays.add_vis_overlay(src, icon, "apco2-[environ]", EMISSIVE_LAYER, EMISSIVE_PLANE, dir) - + . = ..() // And now, separately for cleanness, the lighting changing - if(update_state & UPSTATE_ALLGOOD) + if(!update_state) switch(charging) if(APC_NOT_CHARGING) - light_color = LIGHT_COLOR_RED + set_light_color(COLOR_SOFT_RED) if(APC_CHARGING) - light_color = LIGHT_COLOR_BLUE + set_light_color(LIGHT_COLOR_BLUE) if(APC_FULLY_CHARGED) - light_color = LIGHT_COLOR_GREEN - if (hijackerreturn) - light_color = LIGHT_COLOR_YELLOW + set_light_color(LIGHT_COLOR_GREEN) set_light(lon_range) - else if(update_state & UPSTATE_BLUESCREEN) - light_color = LIGHT_COLOR_BLUE + return + + if(update_state & UPSTATE_BLUESCREEN) + set_light_color(LIGHT_COLOR_BLUE) set_light(lon_range) - else - set_light(0) + return - icon_update_needed = FALSE + set_light(0) +// update the APC icon to show the three base states +// also add overlays for indicator lights +/obj/machinery/power/apc/update_icon_state() + if(!update_state) + icon_state = "apc0" + return ..() + if(update_state & (UPSTATE_OPENED1|UPSTATE_OPENED2)) + var/basestate = "apc[cell ? 2 : 1]" + if(update_state & UPSTATE_OPENED1) + icon_state = (update_state & (UPSTATE_MAINT|UPSTATE_BROKE)) ? "apcmaint" : basestate + else if(update_state & UPSTATE_OPENED2) + icon_state = "[basestate][((update_state & UPSTATE_BROKE) || malfhack) ? "-b" : null]-nocover" + return ..() + if(update_state & UPSTATE_BROKE) + icon_state = "apc-b" + return ..() + if(update_state & UPSTATE_BLUESCREEN) + icon_state = "apcemag" + return ..() + if(update_state & UPSTATE_WIREEXP) + icon_state = "apcewires" + return ..() + if(update_state & UPSTATE_MAINT) + icon_state = "apc0" + return ..() + +/obj/machinery/power/apc/update_overlays() + . = ..() + if((stat & (BROKEN|MAINT)) || update_state) + return + + . += mutable_appearance(icon, "apcox-[locked]") + . += emissive_appearance(icon, "apcox-[locked]") + . += mutable_appearance(icon, "apco3-[hijackerreturn() ? "3" : charging]") + . += emissive_appearance(icon, "apco3-[hijackerreturn() ? "3" : charging]") + if(!operating) + return + + . += mutable_appearance(icon, "apco0-[equipment]") + . += emissive_appearance(icon, "apco0-[equipment]") + . += mutable_appearance(icon, "apco1-[lighting]") + . += emissive_appearance(icon, "apco1-[lighting]") + . += mutable_appearance(icon, "apco2-[environ]") + . += emissive_appearance(icon, "apco2-[environ]") + +/// Checks for what icon updates we will need to handle /obj/machinery/power/apc/proc/check_updates() - var/last_update_state = update_state - var/last_update_overlay = update_overlay - update_state = 0 - update_overlay = 0 + SIGNAL_HANDLER + . = NONE - if(cell) - update_state |= UPSTATE_CELL_IN + // Handle icon status: + var/new_update_state = NONE if(stat & BROKEN) - update_state |= UPSTATE_BROKE + new_update_state |= UPSTATE_BROKE if(stat & MAINT) - update_state |= UPSTATE_MAINT + new_update_state |= UPSTATE_MAINT + if(opened) - if(opened==APC_COVER_OPENED) - update_state |= UPSTATE_OPENED1 - if(opened==APC_COVER_REMOVED) - update_state |= UPSTATE_OPENED2 + new_update_state |= (opened << UPSTATE_COVER_SHIFT) + if(cell) + new_update_state |= UPSTATE_CELL_IN + else if((obj_flags & EMAGGED) || malfai) - update_state |= UPSTATE_BLUESCREEN + new_update_state |= UPSTATE_BLUESCREEN else if(panel_open) - update_state |= UPSTATE_WIREEXP - if(update_state <= 1) - update_state |= UPSTATE_ALLGOOD + new_update_state |= UPSTATE_WIREEXP + if(new_update_state != update_state) + update_state = new_update_state + . |= UPDATE_ICON_STATE + + // Handle overlay status: + var/new_update_overlay = NONE if(operating) - update_overlay |= APC_UPOVERLAY_OPERATING - - if(update_state & UPSTATE_ALLGOOD) + new_update_overlay |= UPOVERLAY_OPERATING + if(!update_state) if(locked) - update_overlay |= APC_UPOVERLAY_LOCKED + new_update_overlay |= UPOVERLAY_LOCKED - if(!charging) - update_overlay |= APC_UPOVERLAY_CHARGEING0 - else if(charging == APC_CHARGING) - update_overlay |= APC_UPOVERLAY_CHARGEING1 - else if(charging == APC_FULLY_CHARGED) - update_overlay |= APC_UPOVERLAY_CHARGEING2 + new_update_overlay |= (charging << UPOVERLAY_CHARGING_SHIFT) + new_update_overlay |= (equipment << UPOVERLAY_EQUIPMENT_SHIFT) + new_update_overlay |= (lighting << UPOVERLAY_LIGHTING_SHIFT) + new_update_overlay |= (environ << UPOVERLAY_ENVIRON_SHIFT) + new_update_overlay |= (hijackerreturn() << UPOVERLAY_HIJACKED) - if (!equipment) - update_overlay |= APC_UPOVERLAY_EQUIPMENT0 - else if(equipment == 1) - update_overlay |= APC_UPOVERLAY_EQUIPMENT1 - else if(equipment == 2) - update_overlay |= APC_UPOVERLAY_EQUIPMENT2 - - if(!lighting) - update_overlay |= APC_UPOVERLAY_LIGHTING0 - else if(lighting == 1) - update_overlay |= APC_UPOVERLAY_LIGHTING1 - else if(lighting == 2) - update_overlay |= APC_UPOVERLAY_LIGHTING2 - - if(!environ) - update_overlay |= APC_UPOVERLAY_ENVIRON0 - else if(environ==1) - update_overlay |= APC_UPOVERLAY_ENVIRON1 - else if(environ==2) - update_overlay |= APC_UPOVERLAY_ENVIRON2 - - var/results = 0 - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode - if(last_update_state == update_state && last_update_overlay == update_overlay && hijackerreturn == hijackerlast) - return 0 - if(last_update_state != update_state) - results += 1 - if(last_update_overlay != update_overlay || hijackerreturn != hijackerlast) - results += 2 - if (hijackerreturn != hijackerlast) - hijackerlast = hijackerreturn - return results + if(new_update_overlay != update_overlay) + update_overlay = new_update_overlay + . |= UPDATE_OVERLAYS // Used in process so it doesn't update the icon too much /obj/machinery/power/apc/proc/queue_icon_update() icon_update_needed = TRUE +/obj/machinery/power/apc/proc/hijackerreturn() + if(!hijacker) + return FALSE + var/obj/item/implant/hijack/implant = hijacker.getImplant(/obj/item/implant/hijack) + if(implant && !implant.stealthmode) + return TRUE //attack with an item - open/close cover, insert cell, or (un)lock interface /obj/machinery/power/apc/crowbar_act(mob/user, obj/item/W) @@ -478,7 +531,7 @@ else if (opened!=APC_COVER_REMOVED) opened = APC_COVER_CLOSED coverlocked = TRUE //closing cover relocks it - update_icon() + update_appearance() return else if (!(stat & BROKEN)) if(coverlocked && !(stat & MAINT)) // locked... @@ -489,7 +542,7 @@ return else opened = APC_COVER_OPENED - update_icon() + update_appearance() return /obj/machinery/power/apc/screwdriver_act(mob/living/user, obj/item/W) @@ -501,11 +554,11 @@ user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") var/turf/T = get_turf(user) cell.forceMove(T) - cell.update_icon() + cell.update_appearance() cell = null cog_drained = 0 //No more cell means no more averting celldrain charging = APC_NOT_CHARGING - update_icon() + update_appearance() return else switch (has_electronics) @@ -516,28 +569,30 @@ to_chat(user, "You screw the circuit electronics into place.") if (APC_ELECTRONICS_SECURED) has_electronics = APC_ELECTRONICS_INSTALLED - stat |= MAINT + set_machine_stat(stat | MAINT) W.play_tool_sound(src) to_chat(user, "You unfasten the electronics.") else to_chat(user, "There is nothing to secure!") return - update_icon() + update_appearance() else if(obj_flags & EMAGGED) to_chat(user, "The interface is broken!") return else panel_open = !panel_open to_chat(user, "The wires have been [panel_open ? "exposed" : "unexposed"]") - update_icon() + update_appearance() /obj/machinery/power/apc/wirecutter_act(mob/living/user, obj/item/W) + . = ..() if (terminal && opened) terminal.dismantle(user, W) return TRUE /obj/machinery/power/apc/welder_act(mob/living/user, obj/item/W) + . = ..() if (opened && !has_electronics && !terminal) if(!W.tool_start_check(user, amount=3)) return @@ -563,12 +618,12 @@ if(area.hasSiliconAccessInArea(user) && get_dist(src,user)>1) return attack_hand(user) - if (istype(W, /obj/item/stock_parts/cell) && opened) + if(istype(W, /obj/item/stock_parts/cell) && opened) if(cell) to_chat(user, "There is a power cell already installed!") return else - if (stat & MAINT) + if(stat & MAINT) to_chat(user, "There is no connector for your power cell!") return if(!user.transferItemToLoc(W, src)) @@ -578,7 +633,7 @@ "[user.name] has inserted the power cell to [src.name]!",\ "You insert the power cell.") chargecount = 0 - update_icon() + update_appearance() else if (W.GetID()) togglelock(user) else if (istype(W, /obj/item/stack/cable_coil) && opened) @@ -601,16 +656,20 @@ return user.visible_message("[user.name] adds cables to the APC frame.", \ "You start adding cables to the APC frame...") - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) - if(C.use_tool(src, user, 20, 10) && !terminal && opened && has_electronics) - var/turf/T = get_turf(src) - var/obj/structure/cable/N = T.get_cable_node() - if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) - do_sparks(5, TRUE, src) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) + if(do_after(user, 20, target = src)) + if (C.get_amount() < 10 || !C) return - to_chat(user, "You add cables to the APC frame.") - make_terminal() - terminal.connect_to_network() + if (C.get_amount() >= 10 && !terminal && opened && has_electronics) + var/turf/T = get_turf(src) + var/obj/structure/cable/N = T.get_cable_node() + if (prob(50) && electrocute_mob(usr, N, N, 1, TRUE)) + do_sparks(5, TRUE, src) + return + C.use(10) + to_chat(user, "You add cables to the APC frame.") + make_terminal() + terminal.connect_to_network() else if (istype(W, /obj/item/electronics/apc) && opened) if (has_electronics) to_chat(user, "There is already a board inside the [src]!") @@ -621,7 +680,7 @@ user.visible_message("[user.name] inserts the power control board into [src].", \ "You start to insert the power control board into the frame...") - playsound(src.loc, 'sound/items/deconstruct.ogg', 50, 1) + playsound(src.loc, 'sound/items/deconstruct.ogg', 50, TRUE) if(do_after(user, 10, target = src)) if(!has_electronics) has_electronics = APC_ELECTRONICS_INSTALLED @@ -652,7 +711,7 @@ chargecount = 0 user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ "Your [P.name] whirrs with strain as you create a weak power cell and place it into [src]!") - update_icon() + update_appearance() else to_chat(user, "[src] has both electronics and a cell.") return @@ -667,7 +726,7 @@ to_chat(user, "You replace missing APC's cover.") qdel(W) opened = APC_COVER_OPENED - update_icon() + update_appearance() return if (has_electronics) to_chat(user, "You cannot repair this APC until you remove the electronics still inside!") @@ -681,7 +740,7 @@ obj_integrity = max_integrity if (opened==APC_COVER_REMOVED) opened = APC_COVER_OPENED - update_icon() + update_appearance() else if(istype(W, /obj/item/clockwork/integration_cog) && is_servant_of_ratvar(user)) if(integration_cog) to_chat(user, "This APC already has a cog.") @@ -690,7 +749,7 @@ user.visible_message("[user] slices [src]'s cover lock, and it swings wide open!", \ "You slice [src]'s cover lock apart with [W], and the cover swings open.") opened = APC_COVER_OPENED - update_icon() + update_appearance() else user.visible_message("[user] presses [W] into [src]!", \ "You hold [W] in place within [src], and it slowly begins to warm up...") @@ -707,7 +766,7 @@ playsound(src, 'sound/machines/clockcult/steam_whoosh.ogg', 50, FALSE) opened = APC_COVER_CLOSED locked = TRUE //Clockies get full APC access on cogged APCs, but they can't lock or unlock em unless they steal some ID to give all of them APC access, soo this is pretty much just QoL for them and makes cogs a tiny bit more stealthy - update_icon() + update_appearance() return else if(panel_open && !opened && is_wire_tool(W)) wires.interact(user) @@ -745,7 +804,7 @@ return TRUE else if(!cell) if(stat & MAINT) - to_chat(user, "There's no connector for a power cell.") + to_chat(user, span_warning("There's no connector for a power cell.")) return FALSE var/obj/item/stock_parts/cell/crap/empty/C = new(src) C.forceMove(src) @@ -753,7 +812,7 @@ chargecount = 0 user.visible_message("[user] fabricates a weak power cell and places it into [src].", \ "Your [the_rcd.name] whirrs with strain as you create a weak power cell and place it into [src]!") - update_icon() + update_appearance() return TRUE else to_chat(user, "[src] has both electronics and a cell.") @@ -777,10 +836,10 @@ else if(stat & (BROKEN|MAINT)) to_chat(user, "Nothing happens!") else - if((allowed(usr) || area.hasSiliconAccessInArea(usr)) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) + if(allowed(usr) && !wires.is_cut(WIRE_IDSCAN) && !malfhack) locked = !locked to_chat(user, "You [ locked ? "lock" : "unlock"] the APC interface.") - update_icon() + update_appearance() updateUsrDialog() else to_chat(user, "Access denied.") @@ -799,13 +858,9 @@ /obj/machinery/power/apc/obj_break(damage_flag) - if(!(flags_1 & NODECONSTRUCT_1)) - set_broken() - -/obj/machinery/power/apc/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) - if(damage_flag == "melee" && damage_amount < damage_deflection) - return 0 . = ..() + if(.) + set_broken() /obj/machinery/power/apc/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -815,7 +870,7 @@ opened = APC_COVER_REMOVED coverlocked = FALSE visible_message("The APC cover is knocked down!") - update_icon() + update_appearance() /obj/machinery/power/apc/emag_act(mob/user) . = ..() @@ -833,7 +888,7 @@ obj_flags |= EMAGGED locked = FALSE to_chat(user, "You emag the APC interface.") - update_icon() + update_appearance() return TRUE // attack with hand - remove cell (if cover open) or interact with the APC @@ -883,10 +938,10 @@ if(cell) user.visible_message("[user] removes \the [cell] from [src]!","You remove \the [cell].") user.put_in_hands(cell) - cell.update_icon() + cell.update_appearance() src.cell = null charging = APC_NOT_CHARGING - src.update_icon() + src.update_appearance() return if((stat & MAINT) && !opened) //no board; no interface return @@ -975,19 +1030,15 @@ return "[area.name] : [equipment]/[lighting]/[environ] ([lastused_equip+lastused_light+lastused_environ]) : [cell? cell.percent() : "N/C"] ([charging])" /obj/machinery/power/apc/proc/update() - var/old_light = area.power_light - var/old_equip = area.power_equip - var/old_environ = area.power_environ if(operating && !shorted && !failure_timer) - area.power_light = (lighting > 1) - area.power_equip = (equipment > 1) - area.power_environ = (environ > 1) + area.power_light = (lighting > APC_CHANNEL_AUTO_OFF) + area.power_equip = (equipment > APC_CHANNEL_AUTO_OFF) + area.power_environ = (environ > APC_CHANNEL_AUTO_OFF) else area.power_light = FALSE area.power_equip = FALSE area.power_environ = FALSE - if(old_light != area.power_light || old_equip != area.power_equip || old_environ != area.power_environ) - area.power_change() + area.power_change() /obj/machinery/power/apc/proc/can_use(mob/user, loud = 0) //used by attack_hand() and Topic() if(IsAdminGhost(user)) @@ -1032,7 +1083,7 @@ to_chat(usr, "The APC does not respond to the command!") else locked = !locked - update_icon() + update_appearance() . = TRUE if("cover") coverlocked = !coverlocked @@ -1047,20 +1098,20 @@ chargemode = !chargemode if(!chargemode) charging = APC_NOT_CHARGING - update_icon() + update_appearance() . = TRUE if("channel") if(params["eqp"]) equipment = setsubsystem(text2num(params["eqp"])) - update_icon() + update_appearance() update() else if(params["lgt"]) lighting = setsubsystem(text2num(params["lgt"])) - update_icon() + update_appearance() update() else if(params["env"]) environ = setsubsystem(text2num(params["env"])) - update_icon() + update_appearance() update() . = TRUE if("overload") @@ -1075,7 +1126,7 @@ hijacker.toggleSiliconAccessArea(area) hijacker = null set_hijacked_lighting() - update_icon() + update_appearance() var/obj/item/implant/hijack/H = usr.getImplant(/obj/item/implant/hijack) H.stealthcooldown = world.time + 2 MINUTES energy_fail(30 SECONDS * (cell.charge / cell.maxcharge)) @@ -1098,7 +1149,7 @@ malfvacate() if("reboot") failure_timer = 0 - update_icon() + update_appearance() update() if("emergency_lighting") emergency_lights = !emergency_lights @@ -1116,7 +1167,7 @@ add_hiddenprint(user) //delete when runtime log_game("[key_name(user)] turned [operating ? "on" : "off"] the [src] in [AREACOORD(src)]") update() - update_icon() + update_appearance() /obj/machinery/power/apc/proc/hijack(mob/living/L) if (!istype(L)) @@ -1133,7 +1184,7 @@ hijacker.toggleSiliconAccessArea(area) if (L.toggleSiliconAccessArea(area)) hijacker = L - update_icon() + update_appearance() set_hijacked_lighting() H.hijacking = FALSE being_hijacked = FALSE @@ -1150,7 +1201,7 @@ if (do_after(L,H.stealthmode ? 12 SECONDS : 5 SECONDS,target=src)) if (L.toggleSiliconAccessArea(area)) hijacker = L - update_icon() + update_appearance() set_hijacked_lighting() H.hijacking = FALSE being_hijacked = FALSE @@ -1176,8 +1227,8 @@ malf.malfhack = src malf.malfhacking = addtimer(CALLBACK(malf, /mob/living/silicon/ai/.proc/malfhacked, src), 600, TIMER_STOPPABLE) - var/obj/screen/alert/hackingapc/A - A = malf.throw_alert("hackingapc", /obj/screen/alert/hackingapc) + var/atom/movable/screen/alert/hackingapc/A + A = malf.throw_alert("hackingapc", /atom/movable/screen/alert/hackingapc) A.target = src /obj/machinery/power/apc/proc/malfoccupy(mob/living/silicon/ai/malf) @@ -1207,7 +1258,6 @@ add_verb(occupier, /mob/living/silicon/ai/proc/corereturn) occupier.cancel_camera() - /obj/machinery/power/apc/proc/malfvacate(forced) if(!occupier) return @@ -1251,11 +1301,11 @@ return transfer_in_progress = TRUE user.visible_message("[user] slots [card] into [src]...", "Transfer process initiated. Sending request for AI approval...") - playsound(src, 'sound/machines/click.ogg', 50, 1) + playsound(src, 'sound/machines/click.ogg', 50, TRUE) SEND_SOUND(occupier, sound('sound/misc/notice2.ogg')) //To alert the AI that someone's trying to card them if they're tabbed out if(alert(occupier, "[user] is attempting to transfer you to \a [card.name]. Do you consent to this?", "APC Transfer", "Yes - Transfer Me", "No - Keep Me Here") == "No - Keep Me Here") to_chat(user, "AI denied transfer request. Process terminated.") - playsound(src, 'sound/machines/buzz-sigh.ogg', 50, 1) + playsound(src, 'sound/machines/buzz-sigh.ogg', 50, TRUE) transfer_in_progress = FALSE return if(user.loc != T) @@ -1300,16 +1350,16 @@ /obj/machinery/power/apc/process() if(icon_update_needed) - update_icon() + update_appearance() if(stat & (BROKEN|MAINT)) return - if(!area.requires_power) + if(!area || !area.requires_power) return if(failure_timer) update() queue_icon_update() failure_timer-- - force_update = 1 + force_update = TRUE return lastused_light = area.usage(STATIC_LIGHT) @@ -1327,116 +1377,117 @@ var/last_eq = equipment var/last_en = environ var/last_ch = charging + var/excess = surplus() + if(!avail()) - main_status = 0 + main_status = APC_NO_POWER else if(excess < 0) - main_status = 1 + main_status = APC_LOW_POWER else - main_status = 2 + main_status = APC_HAS_POWER - var/cur_excess = excess - var/cur_used = lastused_total - - // first: if we have enough power, power the essentials DIRECTLY - - var/environ_satisfied = FALSE - var/equipment_satisfied = FALSE - var/lighting_satisfied = FALSE - - if(cur_excess >= lastused_environ) - autoset(environ, 1) - add_load(lastused_environ) - cur_excess -= lastused_environ - cur_used -= lastused_environ - environ_satisfied = TRUE - - if(cur_excess >= lastused_equip) - autoset(equipment, 1) - add_load(lastused_equip) - cur_excess -= lastused_equip - cur_used -= lastused_equip - equipment_satisfied = TRUE - - if(cur_excess >= lastused_light) - autoset(lighting, 1) - add_load(lastused_light) - cur_excess -= lastused_light - cur_used -= lastused_light - lighting_satisfied = TRUE - - //If drained by an integration cog: Forcefully avert as much of the powerdrain as possible, though a maximum of MAXIMUM_COG_REGAIN - if(cur_excess && cog_drained && cell) - var/cog_regain = cell.give(min(min(cog_drained, cur_excess), MAXIMUM_COG_REGAIN)) - cur_excess -= cog_regain - cog_drained = max(0, cog_drained - cog_regain) - - // next: take from or charge to the cell, depending on how much is left if(cell && !shorted) - if(cur_excess > 0) - var/charging_cell = min(min(cur_excess*GLOB.CELLRATE, cell.maxcharge * GLOB.CHARGELEVEL), cell.maxcharge - cell.charge) - cell.give(charging_cell) - add_load(charging_cell/GLOB.CELLRATE) - lastused_total += charging_cell - longtermpower = min(10,longtermpower + 1) - if(chargemode && !charging) - chargecount++ - if(chargecount == 10) + // draw power from cell as before to power the area + var/cellused = min(cell.charge, lastused_total JOULES) // clamp deduction to a max, amount left in cell + cell.use(cellused) + //If drained by an integration cog: Forcefully avert as much of the powerdrain as possible, though a maximum of MAXIMUM_COG_REGAIN + if(excess && cog_drained) + var/cog_regain = cell.give(min(min(cog_drained, excess), MAXIMUM_COG_REGAIN)) + excess -= cog_regain + cog_drained = max(0, cog_drained - cog_regain) - chargecount = 0 - charging = APC_CHARGING - else // not enough power available to run the last tick! - charging = APC_NOT_CHARGING - chargecount = 0 - longtermpower = max(-10,longtermpower - 2) - if(cell.charge >= cur_used) - cell.use(GLOB.CELLRATE * cur_used) - else + if(excess > lastused_total) // if power excess recharge the cell + // by the same amount just used + cell.give(cellused) + add_load(cellused WATTS) // add the load used to recharge the cell + else // no excess, and not enough per-apc + if((cell.charge WATTS + excess) >= lastused_total) // can we draw enough from cell+grid to cover last usage? + cell.charge = min(cell.maxcharge, cell.charge + excess JOULES) //recharge with what we can + add_load(excess) // so draw what we can from the grid + charging = APC_NOT_CHARGING + + else // not enough power available to run the last tick! + charging = APC_NOT_CHARGING + chargecount = 0 // This turns everything off in the case that there is still a charge left on the battery, just not enough to run the room. - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) - // set channels based on remaining charge - var/cell_percent = cell.percent() + // set channels depending on how much charge we have left - if(cell.charge <= 0) // zero charge, turn all off - equipment = autoset(equipment, 0) - lighting = autoset(lighting, 0) - environ = autoset(environ, 0) - area.poweralert(0, src) + // Allow the APC to operate as normal if the cell can charge + if(charging && longtermpower < 10) + longtermpower += 1 + else if(longtermpower > -10) + longtermpower -= 2 - else if(cell_percent < 15 && longtermpower < 0) // <15%, turn off lighting & equipment - equipment = autoset(equipment, 2) - lighting = autoset(lighting, 2) - environ = autoset(environ, 1) - area.poweralert(0, src) - else if(cell_percent < 30 && longtermpower < 0) // <30%, turn off lighting - equipment = autoset(equipment, 1) - lighting = autoset(lighting, 2) - environ = autoset(environ, 1) - area.poweralert(0, src) - else // otherwise all can be on - equipment = autoset(equipment, 1) - lighting = autoset(lighting, 1) - environ = autoset(environ, 1) - area.poweralert(1, src) - if(cell_percent > 75) - area.poweralert(1, src) + if(cell.charge <= 0) // zero charge, turn all off + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) + area.poweralert(TRUE, src) + else if(cell.percent() < 15 && longtermpower < 0) // <15%, turn off lighting & equipment + equipment = autoset(equipment, AUTOSET_OFF) + lighting = autoset(lighting, AUTOSET_OFF) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(TRUE, src) + else if(cell.percent() < 30 && longtermpower < 0) // <30%, turn off equipment + equipment = autoset(equipment, AUTOSET_OFF) + lighting = autoset(lighting, AUTOSET_ON) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(TRUE, src) + else // otherwise all can be on + equipment = autoset(equipment, AUTOSET_ON) + lighting = autoset(lighting, AUTOSET_ON) + environ = autoset(environ, AUTOSET_ON) + area.poweralert(FALSE, src) + if(cell.percent() > 75) + area.poweralert(FALSE, src) + // now trickle-charge the cell + if(chargemode && charging == APC_CHARGING && operating) + if(excess > 0) // check to make sure we have enough to charge + // Max charge is capped to % per second constant + var/ch = min(excess JOULES, cell.maxcharge JOULES) + add_load(ch WATTS) // Removes the power we're taking from the grid + cell.give(ch) // actually recharge the cell + + else + charging = APC_NOT_CHARGING // stop charging + chargecount = 0 // show cell as fully charged if so if(cell.charge >= cell.maxcharge) cell.charge = cell.maxcharge charging = APC_FULLY_CHARGED - else // no cell, can still run but not very well + if(chargemode) + if(!charging) + if(excess > cell.maxcharge*GLOB.CHARGELEVEL) + chargecount++ + else + chargecount = 0 + + if(chargecount == 10) + + chargecount = 0 + charging = APC_CHARGING + + else // chargemode off + charging = APC_NOT_CHARGING + chargecount = 0 + + else // no cell, switch everything off + charging = APC_NOT_CHARGING chargecount = 0 - environ = autoset(environ, environ_satisfied) - equipment = autoset(equipment, equipment_satisfied) - lighting = autoset(lighting, lighting_satisfied) + equipment = autoset(equipment, AUTOSET_FORCE_OFF) + lighting = autoset(lighting, AUTOSET_FORCE_OFF) + environ = autoset(environ, AUTOSET_FORCE_OFF) + area.poweralert(TRUE, src) // update icon & area power if anything changed @@ -1447,19 +1498,54 @@ else if (last_ch != charging) queue_icon_update() -// val 0=off, 1=off(auto) 2=on 3=on(auto) -// on 0=off, 1=on, 2=autooff - +/** + * Returns the new status value for an APC channel. + * + * // val 0=off, 1=off(auto) 2=on 3=on(auto) + * // on 0=off, 1=on, 2=autooff + * TODO: Make this use bitflags instead. It should take at most three lines, but it's out of scope for now. + * + * Arguments: + * - val: The current status of the power channel. + * - [APC_CHANNEL_OFF]: The APCs channel has been manually set to off. This channel will not automatically change. + * - [APC_CHANNEL_AUTO_OFF]: The APCs channel is running on automatic and is currently off. Can be automatically set to [APC_CHANNEL_AUTO_ON]. + * - [APC_CHANNEL_ON]: The APCs channel has been manually set to on. This will be automatically changed only if the APC runs completely out of power or is disabled. + * - [APC_CHANNEL_AUTO_ON]: The APCs channel is running on automatic and is currently on. Can be automatically set to [APC_CHANNEL_AUTO_OFF]. + * - on: An enum dictating how to change the channel's status. + * - [AUTOSET_FORCE_OFF]: The APC forces the channel to turn off. This includes manually set channels. + * - [AUTOSET_ON]: The APC allows automatic channels to turn back on. + * - [AUTOSET_OFF]: The APC turns automatic channels off. + */ /obj/machinery/power/apc/proc/autoset(val, on) - if(val == 3 && (on == 2 || !on)) // if auto-on, return auto-off - return 1 - else if(val == 2 && !on) // if on, return off - return 0 - else if(on == 1 && val == 1) // if auto-off, return auto-on - return 3 - // no, i don't understand these comments either + if(on == AUTOSET_FORCE_OFF) + if(val == APC_CHANNEL_ON) // if on, return off + return APC_CHANNEL_OFF + else if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off + return APC_CHANNEL_AUTO_OFF + else if(on == AUTOSET_ON) + if(val == APC_CHANNEL_AUTO_OFF) // if auto-off, return auto-on + return APC_CHANNEL_AUTO_ON + else if(on == AUTOSET_OFF) + if(val == APC_CHANNEL_AUTO_ON) // if auto-on, return auto-off + return APC_CHANNEL_AUTO_OFF return val +/** + * Used by external forces to set the APCs channel status's. + * + * Arguments: + * - val: The desired value of the subsystem: + * - 1: Manually sets the APCs channel to be [APC_CHANNEL_OFF]. + * - 2: Manually sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have any power this defaults to [APC_CHANNEL_OFF] instead. + * - 3: Sets the APCs channel to be [APC_CHANNEL_AUTO_ON]. If the APC doesn't have enough power this defaults to [APC_CHANNEL_AUTO_OFF] instead. + */ +/obj/machinery/power/apc/proc/setsubsystem(val) + if(cell && cell.charge > 0) + return (val == 1) ? APC_CHANNEL_OFF : val + if(val == 3) + return APC_CHANNEL_AUTO_OFF + return APC_CHANNEL_OFF + /obj/machinery/power/apc/proc/reset(wire) switch(wire) if(WIRE_IDSCAN) @@ -1467,14 +1553,13 @@ if(WIRE_POWER1, WIRE_POWER2) if(!wires.is_cut(WIRE_POWER1) && !wires.is_cut(WIRE_POWER2)) shorted = FALSE - update() if(WIRE_AI) if(!wires.is_cut(WIRE_AI)) aidisabled = FALSE if(APC_RESET_EMP) - equipment = 3 - environ = 3 - update_icon() + equipment = APC_CHANNEL_AUTO_ON + environ = APC_CHANNEL_AUTO_ON + update_appearance() update() // damage and destruction acts @@ -1487,12 +1572,12 @@ occupier.emp_act(severity) if(. & EMP_PROTECT_SELF) return - lighting = 0 - equipment = 0 - environ = 0 - update_icon() + lighting = APC_CHANNEL_OFF + equipment = APC_CHANNEL_OFF + environ = APC_CHANNEL_OFF + update_appearance() update() - addtimer(CALLBACK(src, .proc/reset, APC_RESET_EMP), severity*8) + addtimer(CALLBACK(src, .proc/reset, APC_RESET_EMP), 600) /obj/machinery/power/apc/blob_act(obj/structure/blob/B) set_broken() @@ -1505,11 +1590,10 @@ /obj/machinery/power/apc/proc/set_broken() if(malfai && operating) malfai.malf_picker.processing_time = clamp(malfai.malf_picker.processing_time - 10,0,1000) - stat |= BROKEN operating = FALSE + obj_break() if(occupier) malfvacate(1) - update_icon() update() // overload all the lights in this APC area @@ -1530,23 +1614,14 @@ /obj/machinery/power/apc/proc/shock(mob/user, prb) if(!prob(prb)) - return 0 + return FALSE do_sparks(5, TRUE, src) if(isalien(user)) - return 0 + return FALSE if(electrocute_mob(user, src, src, 1, TRUE)) - return 1 + return TRUE else - return 0 - -/obj/machinery/power/apc/proc/setsubsystem(val) - if(cell && cell.charge > 0) - return (val==1) ? 0 : val - else if(val == 3) - return 1 - else - return 0 - + return FALSE /obj/machinery/power/apc/proc/energy_fail(duration) for(var/obj/machinery/M in area.contents) @@ -1572,12 +1647,8 @@ /obj/machinery/power/apc/proc/set_hijacked_lighting() set waitfor = FALSE - var/hijackerreturn - if (hijacker) - var/obj/item/implant/hijack/H = hijacker.getImplant(/obj/item/implant/hijack) - hijackerreturn = H && !H.stealthmode for(var/obj/machinery/light/L in area) - L.hijacked = hijackerreturn + L.hijacked = hijackerreturn() L.update(FALSE) CHECK_TICK @@ -1593,16 +1664,19 @@ var/normal_requires_auth = CONFIG_GET(flag/nightshift_toggle_requires_auth) return (configured_level && our_level && ((our_level <= configured_level)? public_requires_auth : normal_requires_auth)) -#undef UPSTATE_CELL_IN -#undef UPSTATE_OPENED1 -#undef UPSTATE_OPENED2 -#undef UPSTATE_MAINT -#undef UPSTATE_BROKE -#undef UPSTATE_BLUESCREEN -#undef UPSTATE_WIREEXP -#undef UPSTATE_ALLGOOD -#undef APC_RESET_EMP +#undef APC_CHANNEL_OFF +#undef APC_CHANNEL_AUTO_OFF +#undef APC_CHANNEL_ON +#undef APC_CHANNEL_AUTO_ON + +#undef AUTOSET_FORCE_OFF +#undef AUTOSET_OFF +#undef AUTOSET_ON + +#undef APC_NO_POWER +#undef APC_LOW_POWER +#undef APC_HAS_POWER #undef APC_ELECTRONICS_MISSING #undef APC_ELECTRONICS_INSTALLED @@ -1616,22 +1690,26 @@ #undef APC_CHARGING #undef APC_FULLY_CHARGED -//update_overlay -#undef APC_UPOVERLAY_CHARGEING0 -#undef APC_UPOVERLAY_CHARGEING1 -#undef APC_UPOVERLAY_CHARGEING2 -#undef APC_UPOVERLAY_EQUIPMENT0 -#undef APC_UPOVERLAY_EQUIPMENT1 -#undef APC_UPOVERLAY_EQUIPMENT2 -#undef APC_UPOVERLAY_LIGHTING0 -#undef APC_UPOVERLAY_LIGHTING1 -#undef APC_UPOVERLAY_LIGHTING2 -#undef APC_UPOVERLAY_ENVIRON0 -#undef APC_UPOVERLAY_ENVIRON1 -#undef APC_UPOVERLAY_ENVIRON2 -#undef APC_UPOVERLAY_LOCKED -#undef APC_UPOVERLAY_OPERATING +#undef APC_DRAIN_TIME +#undef APC_POWER_GAIN +#undef APC_RESET_EMP + +// update_state +#undef UPSTATE_CELL_IN +#undef UPSTATE_COVER_SHIFT +#undef UPSTATE_BROKE +#undef UPSTATE_MAINT +#undef UPSTATE_BLUESCREEN +#undef UPSTATE_WIREEXP + +//update_overlay +#undef UPOVERLAY_OPERATING +#undef UPOVERLAY_LOCKED +#undef UPOVERLAY_CHARGING_SHIFT +#undef UPOVERLAY_EQUIPMENT_SHIFT +#undef UPOVERLAY_LIGHTING_SHIFT +#undef UPOVERLAY_ENVIRON_SHIFT #undef MAXIMUM_COG_REGAIN /*Power module, used for APC construction*/ diff --git a/code/modules/power/gravitygenerator.dm b/code/modules/power/gravitygenerator.dm index e37ae56e71..3fe03978bd 100644 --- a/code/modules/power/gravitygenerator.dm +++ b/code/modules/power/gravitygenerator.dm @@ -32,7 +32,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return FALSE /obj/machinery/gravity_generator/ex_act(severity, target) - if(severity == 1) // Very sturdy. + if(severity >= EXPLODE_DEVASTATE) // Very sturdy. set_broken() /obj/machinery/gravity_generator/blob_act(obj/structure/blob/B) @@ -40,12 +40,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne set_broken() /obj/machinery/gravity_generator/zap_act(power, zap_flags) - ..() + . = ..() if(zap_flags & ZAP_MACHINE_EXPLOSIVE) qdel(src)//like the singulo, tesla deletes it. stops it from exploding over and over /obj/machinery/gravity_generator/update_icon_state() icon_state = "[get_status()]_[sprite_number]" + return ..() /obj/machinery/gravity_generator/proc/get_status() return "off" @@ -80,14 +81,19 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne /obj/machinery/gravity_generator/part/get_status() return main_part?.get_status() -/obj/machinery/gravity_generator/part/on_attack_hand(mob/user, act_intent = user.a_intent, unarmed_attack_flags) - return main_part.attack_hand(user) +/obj/machinery/gravity_generator/part/attack_hand(mob/user, list/modifiers) + return main_part.attack_hand(user, modifiers) /obj/machinery/gravity_generator/part/set_broken() ..() if(main_part && !(main_part.stat & BROKEN)) main_part.set_broken() +/// Used to eat args +/obj/machinery/gravity_generator/part/proc/on_update_icon(obj/machinery/gravity_generator/source, updates, updated) + SIGNAL_HANDLER + return update_appearance(updates) + // // Generator which spawns with the station. // @@ -124,7 +130,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne var/charge_count = 100 var/current_overlay = null var/broken_state = 0 - var/setting = 1 //Gravity value when on + var/setting = 1 //Gravity value when on /obj/machinery/gravity_generator/main/Destroy() // If we somehow get deleted, remove all of our other parts. investigate_log("was destroyed!", INVESTIGATE_GRAVITY) @@ -149,13 +155,13 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(count == 5) // Middle middle = part if(count <= 3) // Their sprite is the top part of the generator - part.density = FALSE + part.density= 0 part.layer = WALL_OBJ_LAYER part.sprite_number = count part.main_part = src parts += part - part.update_icon() - part.RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, /atom/proc/update_icon) + part.update_appearance() + part.RegisterSignal(src, COMSIG_ATOM_UPDATED_ICON, /obj/machinery/gravity_generator/part/proc/on_update_icon) /obj/machinery/gravity_generator/main/proc/connected_parts() return parts.len == 8 @@ -178,7 +184,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne if(M.stat & BROKEN) M.set_fix() broken_state = FALSE - update_icon() + update_appearance() set_power() // Interaction @@ -188,33 +194,33 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne switch(broken_state) if(GRAV_NEEDS_SCREWDRIVER) if(I.tool_behaviour == TOOL_SCREWDRIVER) - to_chat(user, "You secure the screws of the framework.") + to_chat(user, span_notice("You secure the screws of the framework.")) I.play_tool_sound(src) broken_state++ - update_icon() + update_appearance() return if(GRAV_NEEDS_WELDING) if(I.tool_behaviour == TOOL_WELDER) if(I.use_tool(src, user, 0, volume=50, amount=1)) - to_chat(user, "You mend the damaged framework.") + to_chat(user, span_notice("You mend the damaged framework.")) broken_state++ - update_icon() + update_appearance() return if(GRAV_NEEDS_PLASTEEL) if(istype(I, /obj/item/stack/sheet/plasteel)) var/obj/item/stack/sheet/plasteel/PS = I if(PS.get_amount() >= 10) PS.use(10) - to_chat(user, "You add the plating to the framework.") + to_chat(user, span_notice("You add the plating to the framework.")) playsound(src.loc, 'sound/machines/click.ogg', 75, TRUE) broken_state++ - update_icon() + update_appearance() else - to_chat(user, "You need 10 sheets of plasteel!") + to_chat(user, span_warning("You need 10 sheets of plasteel!")) return if(GRAV_NEEDS_WRENCH) if(I.tool_behaviour == TOOL_WRENCH) - to_chat(user, "You secure the plating to the framework.") + to_chat(user, span_notice("You secure the plating to the framework.")) I.play_tool_sound(src) set_fix() return @@ -238,7 +244,8 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne return data /obj/machinery/gravity_generator/main/ui_act(action, params) - if(..()) + . = ..() + if(.) return switch(action) @@ -270,7 +277,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne charging_state = new_state ? POWER_UP : POWER_DOWN // Startup sequence animation. investigate_log("is now [charging_state == POWER_UP ? "charging" : "discharging"].", INVESTIGATE_GRAVITY) - update_icon() + update_appearance() // Set the state of the gravity. /obj/machinery/gravity_generator/main/proc/set_state(new_state) @@ -291,7 +298,7 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne investigate_log("was brought offline and there is now no gravity for this level.", INVESTIGATE_GRAVITY) message_admins("The gravity generator was brought offline with no backup generator. [ADMIN_VERBOSEJMP(src)]") - update_icon() + update_appearance() update_list() src.updateUsrDialog() if(alert) @@ -391,13 +398,16 @@ GLOBAL_LIST_EMPTY(gravity_generators) // We will keep track of this by adding ne // Misc /obj/item/paper/guides/jobs/engi/gravity_gen - info = {" -# Gravity Generator Instructions For Dummies -Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

-### It blew up! -Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then please proceed to panic; otherwise follow these steps. -1. Secure the screws of the framework with a screwdriver. -2. Mend the damaged framework with a welding tool. -3. Add additional plasteel plating. -4. Secure the additional plating with a wrench. -"} + name = "paper- 'Generate your own gravity!'" + info = {"

Gravity Generator Instructions For Dummies

+

Surprisingly, gravity isn't that hard to make! All you have to do is inject deadly radioactive minerals into a ball of + energy and you have yourself gravity! You can turn the machine on or off when required but you must remember that the generator + will EMIT RADIATION when charging or discharging, you can tell it is charging or discharging by the noise it makes, so please WEAR PROTECTIVE CLOTHING.

+
+

It blew up!

+

Don't panic! The gravity generator was designed to be easily repaired. If, somehow, the sturdy framework did not survive then + please proceed to panic; otherwise follow these steps.

    +
  1. Secure the screws of the framework with a screwdriver.
  2. +
  3. Mend the damaged framework with a welding tool.
  4. +
  5. Add additional plasteel plating.
  6. +
  7. Secure the additional plating with a wrench.
"} diff --git a/code/modules/power/power.dm b/code/modules/power/power.dm index 9bbdcf4f66..c2dd77290a 100644 --- a/code/modules/power/power.dm +++ b/code/modules/power/power.dm @@ -104,15 +104,23 @@ /obj/machinery/proc/removeStaticPower(value, powerchannel) addStaticPower(-value, powerchannel) -/obj/machinery/proc/power_change() // called whenever the power settings of the containing area change - // by default, check equipment channel & set flag - // can override if needed - if(powered(power_channel)) - stat &= ~NOPOWER - else +/obj/machinery/proc/power_change() + //SIGNAL_HANDLER + //SHOULD_CALL_PARENT(TRUE) - stat |= NOPOWER - return + if(stat & BROKEN) + return + if(powered(power_channel)) + if(stat & NOPOWER) + SEND_SIGNAL(src, COMSIG_MACHINERY_POWER_RESTORED) + . = TRUE + set_machine_stat(stat & ~NOPOWER) + else + if(!(stat & NOPOWER)) + SEND_SIGNAL(src, COMSIG_MACHINERY_POWER_LOST) + . = TRUE + set_machine_stat(stat | NOPOWER) + update_appearance() // connect the machine to a powernet if a node cable is present on the turf /obj/machinery/power/proc/connect_to_network() diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index 2d189338e5..a6b144ebe6 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -47,29 +47,29 @@ if(!loaded_tank) return if(!bitcoinmining) - if(loaded_tank.air_contents.get_moles(/datum/gas/plasma) < 0.0001) + if(loaded_tank.air_contents.get_moles(GAS_PLASMA) < 0.0001) investigate_log("out of fuel.", INVESTIGATE_SINGULO) playsound(src, 'sound/machines/ding.ogg', 50, 1) Radio.talk_into(src, "Insufficient plasma in [get_area(src)] [src], ejecting \the [loaded_tank].", FREQ_ENGINEERING) eject() else - var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.get_moles(/datum/gas/plasma)) - loaded_tank.air_contents.adjust_moles(/datum/gas/plasma, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, gasdrained) + var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.get_moles(GAS_PLASMA)) + loaded_tank.air_contents.adjust_moles(GAS_PLASMA, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, gasdrained) var/power_produced = RAD_COLLECTOR_OUTPUT add_avail(power_produced) stored_power-=power_produced else if(is_station_level(z) && SSresearch.science_tech) - if(!loaded_tank.air_contents.get_moles(/datum/gas/tritium) || !loaded_tank.air_contents.get_moles(/datum/gas/oxygen)) + if(!loaded_tank.air_contents.get_moles(GAS_TRITIUM) || !loaded_tank.air_contents.get_moles(GAS_O2)) playsound(src, 'sound/machines/ding.ogg', 50, 1) Radio.talk_into(src, "Insufficient oxygen and tritium in [get_area(src)] [src] to produce research points, ejecting \the [loaded_tank].", FREQ_ENGINEERING) eject() else var/gasdrained = bitcoinproduction_drain*drainratio - loaded_tank.air_contents.adjust_moles(/datum/gas/tritium, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/oxygen, -gasdrained) - loaded_tank.air_contents.adjust_moles(/datum/gas/carbon_dioxide, gasdrained*2) + loaded_tank.air_contents.adjust_moles(GAS_TRITIUM, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_O2, -gasdrained) + loaded_tank.air_contents.adjust_moles(GAS_CO2, gasdrained*2) var/bitcoins_mined = stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG) if(D) @@ -84,7 +84,7 @@ toggle_power() user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \ "You turn the [src.name] [active? "on":"off"].") - var/fuel = loaded_tank.air_contents.get_moles(/datum/gas/plasma) + var/fuel = loaded_tank.air_contents.get_moles(GAS_PLASMA) investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO) return else diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index 9cc289b06d..907c4e7d65 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -63,7 +63,7 @@ assembly = S assembly.glass_type.on_solar_construction(src) obj_integrity = max_integrity - update_icon() + update_appearance() /obj/machinery/power/solar/crowbar_act(mob/user, obj/item/I) playsound(src.loc, 'sound/machines/click.ogg', 50, TRUE) @@ -86,11 +86,10 @@ /obj/machinery/power/solar/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) - stat |= BROKEN unset_control() - update_icon() /obj/machinery/power/solar/deconstruct(disassembled = TRUE) if(!(flags_1 & NODECONSTRUCT_1)) @@ -99,7 +98,7 @@ assembly.forceMove(loc) assembly.give_glass(stat & BROKEN) else - playsound(src, "shatter", 70, 1) + playsound(src, "shatter", 70, TRUE) var/shard = assembly?.glass_type ? assembly.glass_type.shard_type : /obj/item/shard new shard(loc) new shard(loc) @@ -110,16 +109,15 @@ var/matrix/turner = matrix() turner.Turn(azimuth_current) panel.transform = turner - if(stat & BROKEN) - panel.icon_state = "solar_panel-b" - else - panel.icon_state = "solar_panel" + panel.icon_state = "solar_panel[(stat & BROKEN) ? "-b" : null]" /obj/machinery/power/solar/proc/queue_turn(azimuth) needs_to_turn = TRUE azimuth_target = azimuth /obj/machinery/power/solar/proc/queue_update_solar_exposure() + SIGNAL_HANDLER + needs_to_update_solar_exposure = TRUE //updating right away would be wasteful if we're also turning later /obj/machinery/power/solar/proc/update_turn() @@ -127,7 +125,7 @@ if(azimuth_current != azimuth_target) azimuth_current = azimuth_target occlusion_setup() - update_icon() + update_appearance() needs_to_update_solar_exposure = TRUE ///trace towards sun to see if we're in shadow @@ -173,7 +171,7 @@ control.gen += sgen //Bit of a hack but this whole type is a hack -/obj/machinery/power/solar/fake/Initialize(turf/loc, obj/item/solar_assembly/S) +/obj/machinery/power/solar/fake/Initialize(mapload, obj/item/solar_assembly/S) . = ..() UnregisterSignal(SSsun, COMSIG_SUN_MOVED) @@ -199,6 +197,16 @@ var/static/list/allowed_sheets = typecacheof(list(/obj/item/stack/sheet/glass, /obj/item/stack/sheet/rglass, /obj/item/stack/sheet/plasmaglass, /obj/item/stack/sheet/plasmarglass, /obj/item/stack/sheet/titaniumglass, /obj/item/stack/sheet/plastitaniumglass)) + var/random_offset = 6 //amount in pixels an unanchored assembly may be offset by + +/obj/item/solar_assembly/Initialize(mapload) + . = ..() + if(!anchored && !pixel_x && !pixel_y) + randomise_offset(random_offset) + +/obj/item/solar_assembly/proc/randomise_offset(amount) + pixel_x = rand(-amount, amount) + pixel_y = rand(-amount, amount) // Give back the glass type we were supplied with /obj/item/solar_assembly/proc/give_glass(device_broken) @@ -212,20 +220,21 @@ glass_type.forceMove(Tsec) glass_type = null +/obj/item/solar_assembly/set_anchored(anchorvalue) + . = ..() + if(isnull(.)) + return + randomise_offset(anchored ? 0 : random_offset) /obj/item/solar_assembly/attackby(obj/item/W, mob/user, params) if(W.tool_behaviour == TOOL_WRENCH && isturf(loc)) if(isinspace()) to_chat(user, "You can't secure [src] here.") return - anchored = !anchored - if(anchored) - user.visible_message("[user] wrenches the solar assembly into place.", "You wrench the solar assembly into place.") - W.play_tool_sound(src, 75) - else - user.visible_message("[user] unwrenches the solar assembly from its place.", "You unwrench the solar assembly from its place.") - W.play_tool_sound(src, 75) - return 1 + set_anchored(!anchored) + user.visible_message("[user] [anchored ? null : "un"]wrenches the solar assembly into place.", "You [anchored ? null : "un"]wrench the solar assembly into place.") + W.play_tool_sound(src, 75) + return TRUE if(is_type_in_typecache(W, allowed_sheets)) if(!anchored) @@ -249,16 +258,16 @@ if(istype(W, /obj/item/electronics/tracker)) if(!user.temporarilyRemoveItemFromInventory(W)) return - tracker = 1 + tracker = TRUE qdel(W) user.visible_message("[user] inserts the electronics into the solar assembly.", "You insert the electronics into the solar assembly.") return 1 else if(W.tool_behaviour == TOOL_CROWBAR) new /obj/item/electronics/tracker(src.loc) - tracker = 0 + tracker = FALSE user.visible_message("[user] takes out the electronics from the solar assembly.", "You take out the electronics from the solar assembly.") - return 1 + return TRUE return ..() // @@ -322,11 +331,12 @@ if(stat & NOPOWER) . += mutable_appearance(icon, "[icon_keyboard]_off") return + . += mutable_appearance(icon, icon_keyboard) if(stat & BROKEN) . += mutable_appearance(icon, "[icon_state]_broken") - else - . += mutable_appearance(icon, icon_screen) + return + . += mutable_appearance(icon, icon_screen) /obj/machinery/power/solar_control/ui_interact(mob/user, datum/tgui/ui) ui = SStgui.try_update_ui(user, src, ui) @@ -347,7 +357,8 @@ return data /obj/machinery/power/solar_control/ui_act(action, params) - if(..()) + . = ..() + if(.) return if(action == "azimuth") var/adjust = text2num(params["adjust"]) @@ -381,10 +392,10 @@ return TRUE return FALSE -/obj/machinery/power/solar_control/attackby(obj/item/I, mob/user, params) +/obj/machinery/power/solar_control/attackby(obj/item/I, mob/living/user, params) if(I.tool_behaviour == TOOL_SCREWDRIVER) - if(I.use_tool(src, user, 20, volume = 50)) - if(src.stat & BROKEN) + if(I.use_tool(src, user, 20, volume=50)) + if (src.stat & BROKEN) to_chat(user, "The broken glass falls out.") var/obj/structure/frame/computer/A = new /obj/structure/frame/computer( src.loc ) new /obj/item/shard( src.loc ) @@ -394,7 +405,7 @@ A.circuit = M A.state = 3 A.icon_state = "3" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else to_chat(user, "You disconnect the monitor.") @@ -405,7 +416,7 @@ A.circuit = M A.state = 4 A.icon_state = "4" - A.anchored = TRUE + A.set_anchored(TRUE) qdel(src) else if(user.a_intent != INTENT_HARM && !(I.item_flags & NOBLUDGEON)) attack_hand(user) @@ -423,10 +434,9 @@ playsound(src.loc, 'sound/items/welder.ogg', 100, TRUE) /obj/machinery/power/solar_control/obj_break(damage_flag) - if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1)) + . = ..() + if(.) playsound(loc, 'sound/effects/glassbr3.ogg', 100, TRUE) - stat |= BROKEN - update_icon() /obj/machinery/power/solar_control/process() lastgen = gen @@ -437,6 +447,8 @@ ///Ran every time the sun updates. /obj/machinery/power/solar_control/proc/timed_track() + SIGNAL_HANDLER + if(track == SOLAR_TRACK_TIMED) azimuth_target += azimuth_rate set_panels(azimuth_target) @@ -453,20 +465,12 @@ for(var/obj/machinery/power/solar/S in connected_panels) S.queue_turn(azimuth) -/obj/machinery/power/solar_control/power_change() - ..() - update_icon() - // // MISC // /obj/item/paper/guides/jobs/engi/solars - info = {" -# Welcome! -At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array. -You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker. -Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green! -"} + name = "paper- 'Going green! Setup your own solar array instructions.'" + info = "

Welcome

At greencorps we love the environment, and space. With this package you are able to help mother nature and produce energy without any usage of fossil fuel or plasma! Singularity energy is dangerous while solar energy is safe, which is why it's better. Now here is how you setup your own solar array.

You can make a solar panel by wrenching the solar assembly onto a cable node. Adding a glass panel, reinforced or regular glass will do, will finish the construction of your solar panel. It is that easy!

Now after setting up 19 more of these solar panels you will want to create a solar tracker to keep track of our mother nature's gift, the sun. These are the same steps as before except you insert the tracker equipment circuit into the assembly before performing the final step of adding the glass. You now have a tracker! Now the last step is to add a computer to calculate the sun's movements and to send commands to the solar panels to change direction with the sun. Setting up the solar computer is the same as setting up any computer, so you should have no trouble in doing that. You do need to put a wire node under the computer, and the wire needs to be connected to the tracker.

Congratulations, you should have a working solar array. If you are having trouble, here are some tips. Make sure all solar equipment are on a cable node, even the computer. You can always deconstruct your creations if you make a mistake.

That's all to it, be safe, be green!

" #undef SOLAR_GEN_RATE diff --git a/code/modules/power/supermatter/supermatter.dm b/code/modules/power/supermatter/supermatter.dm index 87adcefeb3..b460cfea51 100644 --- a/code/modules/power/supermatter/supermatter.dm +++ b/code/modules/power/supermatter/supermatter.dm @@ -12,33 +12,17 @@ #define OBJECT (LOWEST + 1) #define LOWEST (1) -#define PLASMA_HEAT_PENALTY 15 // Higher == Bigger heat and waste penalty from having the crystal surrounded by this gas. Negative numbers reduce penalty. -#define OXYGEN_HEAT_PENALTY 1 -#define PLUOXIUM_HEAT_PENALTY -1 -#define TRITIUM_HEAT_PENALTY 10 -#define CO2_HEAT_PENALTY 0.1 -#define NITROGEN_HEAT_PENALTY -1.5 -#define BZ_HEAT_PENALTY 5 -#define H2O_HEAT_PENALTY 8 -//#define FREON_HEAT_PENALTY -10 //very good heat absorbtion and less plasma and o2 generation -//#define HYDROGEN_HEAT_PENALTY 10 // similar heat penalty as tritium (dangerous) - - -//All of these get divided by 10-bzcomp * 5 before having 1 added and being multiplied with power to determine rads -//Keep the negative values here above -10 and we won't get negative rads -#define OXYGEN_TRANSMIT_MODIFIER 1.5 //Higher == Bigger bonus to power generation. -#define PLASMA_TRANSMIT_MODIFIER 4 -#define BZ_TRANSMIT_MODIFIER -2 -#define TRITIUM_TRANSMIT_MODIFIER 30 //We divide by 10, so this works out to 3 -#define PLUOXIUM_TRANSMIT_MODIFIER -5 //Should halve the power output -#define H2O_TRANSMIT_MODIFIER 2 -//#define HYDROGEN_TRANSMIT_MODIFIER 25 //increase the radiation emission, but less than the trit (2.5) - -#define BZ_RADIOACTIVITY_MODIFIER 5 //Improves the effect of transmit modifiers - -#define N2O_HEAT_RESISTANCE 6 //Higher == Gas makes the crystal more resistant against heat damage. -#define PLUOXIUM_HEAT_RESISTANCE 3 -//#define HYDROGEN_HEAT_RESISTANCE 2 // just a bit of heat resistance to spice it up +/datum/auxgm/proc/add_supermatter_properties(datum/gas/gas) + var/g = gas.id + var/list/props = src.supermatter + if(gas.powermix || gas.heat_penalty || gas.transmit_modifier || gas.radioactivity_modifier || gas.heat_resistance || gas.powerloss_inhibition) + props[HEAT_PENALTY][g] = gas.heat_penalty + props[TRANSMIT_MODIFIER][g] = gas.transmit_modifier + props[RADIOACTIVITY_MODIFIER][g] = gas.radioactivity_modifier + props[HEAT_RESISTANCE][g] = gas.heat_resistance + props[POWERLOSS_INHIBITION][g] = gas.powerloss_inhibition + props[POWER_MIX][g] = gas.powermix + props[ALL_SUPERMATTER_GASES] += g #define POWERLOSS_INHIBITION_GAS_THRESHOLD 0.20 //Higher == Higher percentage of inhibitor gas needed before the charge inertia chain reaction effect starts. #define POWERLOSS_INHIBITION_MOLE_THRESHOLD 20 //Higher == More moles of the gas are needed before the charge inertia chain reaction effect starts. //Scales powerloss inhibition down until this amount of moles is reached @@ -116,7 +100,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///The portion of the gasmix we're on that we should remove var/gasefficency = 0.15 ///Used for changing icon states for diff base sprites - var/base_icon_state = "darkmatter" + base_icon_state = "darkmatter" ///Are we exploding? var/final_countdown = FALSE @@ -148,90 +132,17 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/power = 0 ///Determines the rate of positve change in gas comp values var/gas_change_rate = 0.05 - ///The list of gases we will be interacting with in process_atoms() - var/list/gases_we_care_about = list( - /datum/gas/oxygen, - /datum/gas/water_vapor, - /datum/gas/plasma, - /datum/gas/carbon_dioxide, - /datum/gas/nitrous_oxide, - /datum/gas/nitrogen, - /datum/gas/pluoxium, - /datum/gas/tritium, - /datum/gas/bz, -// /datum/gas/freon, -// /datum/gas/hydrogen, - ) - ///The list of gases mapped against their current comp. We use this to calculate different values the supermatter uses, like power or heat resistance. It doesn't perfectly match the air around the sm, instead moving up at a rate determined by gas_change_rate per call. Ranges from 0 to 1 - var/list/gas_comp = list( - /datum/gas/oxygen = 0, - /datum/gas/water_vapor = 0, - /datum/gas/plasma = 0, - /datum/gas/carbon_dioxide = 0, - /datum/gas/nitrous_oxide = 0, - /datum/gas/nitrogen = 0, - /datum/gas/pluoxium = 0, - /datum/gas/tritium = 0, - /datum/gas/bz = 0, -// /datum/gas/freon = 0, -// /datum/gas/hydrogen = 0, - ) - ///The list of gases mapped against their transmit values. We use it to determine the effect different gases have on radiation - var/list/gas_trans = list( - /datum/gas/oxygen = OXYGEN_TRANSMIT_MODIFIER, - /datum/gas/water_vapor = H2O_TRANSMIT_MODIFIER, - /datum/gas/plasma = PLASMA_TRANSMIT_MODIFIER, - /datum/gas/pluoxium = PLUOXIUM_TRANSMIT_MODIFIER, - /datum/gas/tritium = TRITIUM_TRANSMIT_MODIFIER, - /datum/gas/bz = BZ_TRANSMIT_MODIFIER, -// /datum/gas/hydrogen = HYDROGEN_TRANSMIT_MODIFIER, - ) - ///The list of gases mapped against their heat penaltys. We use it to determin molar and heat output - var/list/gas_heat = list( - /datum/gas/oxygen = OXYGEN_HEAT_PENALTY, - /datum/gas/water_vapor = H2O_HEAT_PENALTY, - /datum/gas/plasma = PLASMA_HEAT_PENALTY, - /datum/gas/carbon_dioxide = CO2_HEAT_PENALTY, - /datum/gas/nitrogen = NITROGEN_HEAT_PENALTY, - /datum/gas/pluoxium = PLUOXIUM_HEAT_PENALTY, - /datum/gas/tritium = TRITIUM_HEAT_PENALTY, - /datum/gas/bz = BZ_HEAT_PENALTY, -// /datum/gas/freon = FREON_HEAT_PENALTY, -// /datum/gas/hydrogen = HYDROGEN_HEAT_PENALTY, - ) - ///The list of gases mapped against their heat resistance. We use it to moderate heat damage. - var/list/gas_resist = list( - /datum/gas/nitrous_oxide = N2O_HEAT_RESISTANCE, - /datum/gas/pluoxium = PLUOXIUM_HEAT_RESISTANCE, -// /datum/gas/hydrogen = HYDROGEN_HEAT_RESISTANCE, - ) - ///The list of gases mapped against their powermix ratio - var/list/gas_powermix = list( - /datum/gas/oxygen = 1, - /datum/gas/water_vapor = 1, - /datum/gas/plasma = 1, - /datum/gas/carbon_dioxide = 1, - /datum/gas/nitrogen = -1, - /datum/gas/pluoxium = -1, - /datum/gas/tritium = 1, - /datum/gas/bz = 1, -// /datum/gas/freon = -1, -// /datum/gas/hydrogen = 1, - ) + var/list/gas_comp = list() ///The last air sample's total molar count, will always be above or equal to 0 var/combined_gas = 0 ///Affects the power gain the sm experiances from heat var/gasmix_power_ratio = 0 - ///Affects the amount of o2 and plasma the sm outputs, along with the heat it makes. - var/dynamic_heat_modifier = 1 ///Affects the amount of damage and minimum point at which the sm takes heat damage var/dynamic_heat_resistance = 1 ///Uses powerloss_dynamic_scaling and combined_gas to lessen the effects of our powerloss functions var/powerloss_inhibitor = 1 ///Based on co2 percentage, slowly moves between 0 and 1. We use it to calc the powerloss_inhibitor var/powerloss_dynamic_scaling= 0 - ///Affects the amount of radiation the sm makes. We multiply this with power to find the rads. - var/power_transmission_bonus = 0 ///Used to increase or lessen the amount of damage the sm takes from heat based on molar counts. var/mole_heat_penalty = 0 ///Takes the energy throwing things into the sm generates and slowly turns it into actual power @@ -241,7 +152,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) ///How much the bullets damage should be multiplied by when it is added to the internal variables var/bullet_energy = 2 ///How much hallucination should we produce per unit of power? - var/hallucination_power = 0.1 + var/hallucination_power = 0.05 // 2 seconds per second at a distance of 7 with a typical nitrogen setup ///Our internal radio var/obj/item/radio/radio @@ -283,7 +194,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Initialize() . = ..() uid = gl_uid++ - SSair.atmos_machinery += src + SSair.atmos_air_machinery += src countdown = new(src) countdown.start() GLOB.poi_list |= src @@ -302,7 +213,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) /obj/machinery/power/supermatter_crystal/Destroy() investigate_log("has been destroyed.", INVESTIGATE_SUPERMATTER) - SSair.atmos_machinery -= src + SSair.atmos_air_machinery -= src QDEL_NULL(radio) GLOB.poi_list -= src QDEL_NULL(countdown) @@ -475,12 +386,16 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) var/datum/gas_mixture/removed if(produces_gas) //Remove gas from surrounding area - removed = env.remove(gasefficency * env.total_moles()) + removed = env.remove_ratio(gasefficency) else // Pass all the gas related code an empty gas container removed = new() damage_archived = damage + var/list/gas_info = GLOB.gas_data.supermatter + + var/list/gases_we_care_about = gas_info[ALL_SUPERMATTER_GASES] + /******** EXPERIMENTAL, HUGBOXY AS HELL CITADEL CHANGES: Even in a vaccum, update gas composition and modifiers. This means that the SM will usually have a very small explosion if it ends up being breached to space, @@ -491,7 +406,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(takes_damage) damage += max((power / 1000) * DAMAGE_INCREASE_MULTIPLIER, 0.1) // always does at least some damage combined_gas = max(0, combined_gas - 0.5) // Slowly wear off. - for(var/gasID in gases_we_care_about) + for(var/gasID in gas_comp) gas_comp[gasID] = max(0, gas_comp[gasID] - 0.05) //slowly ramp down else if(takes_damage) @@ -531,46 +446,49 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Prevents huge bursts of gas/heat when a large amount of something is introduced //They range between 0 and 1 for(var/gasID in gases_we_care_about) + if(!(gasID in gas_comp)) + gas_comp[gasID] = 0 gas_comp[gasID] += clamp(max(removed.get_moles(gasID)/combined_gas, 0) - gas_comp[gasID], -1, gas_change_rate) - var/list/heat_mod = gases_we_care_about.Copy() - var/list/transit_mod = gases_we_care_about.Copy() - var/list/resistance_mod = gases_we_care_about.Copy() + var/list/threshold_mod = gases_we_care_about.Copy() + + var/list/powermix = gas_info[POWER_MIX] + var/list/heat = gas_info[HEAT_PENALTY] + var/list/transmit = gas_info[TRANSMIT_MODIFIER] + var/list/resist = gas_info[HEAT_RESISTANCE] + var/list/radioactivity = gas_info[RADIOACTIVITY_MODIFIER] + var/list/inhibition = gas_info[POWERLOSS_INHIBITION] //We're concerned about pluoxium being too easy to abuse at low percents, so we make sure there's a substantial amount. - var/pluoxiumbonus = (gas_comp[/datum/gas/pluoxium] >= 0.15) //makes pluoxium only work at 15%+ - var/h2obonus = 1 - (gas_comp[/datum/gas/water_vapor] * 0.25)//At max this value should be 0.75 + var/pluoxiumbonus = (gas_comp[GAS_PLUOXIUM] >= 0.15) //makes pluoxium only work at 15%+ + var/h2obonus = 1 - (gas_comp[GAS_H2O] * 0.25)//At min this value should be 0.75 // var/freonbonus = (gas_comp[/datum/gas/freon] <= 0.03) //Let's just yeet power output if this shit is high - heat_mod[/datum/gas/pluoxium] = pluoxiumbonus - transit_mod[/datum/gas/pluoxium] = pluoxiumbonus - resistance_mod[/datum/gas/pluoxium] = pluoxiumbonus + threshold_mod[GAS_PLUOXIUM] = pluoxiumbonus //No less then zero, and no greater then one, we use this to do explosions and heat to power transfer //Be very careful with modifing this var by large amounts, and for the love of god do not push it past 1 gasmix_power_ratio = 0 - for(var/gasID in gas_powermix) - gasmix_power_ratio += gas_comp[gasID] * gas_powermix[gasID] - gasmix_power_ratio = clamp(gasmix_power_ratio, 0, 1) - - //Minimum value of -10, maximum value of 23. Effects plasma and o2 output and the output heat - dynamic_heat_modifier = 0 - for(var/gasID in gas_heat) - dynamic_heat_modifier += gas_comp[gasID] * gas_heat[gasID] * (isnull(heat_mod[gasID]) ? 1 : heat_mod[gasID]) - dynamic_heat_modifier *= h2obonus - dynamic_heat_modifier = max(dynamic_heat_modifier, 0.5) - - //Value between 1 and 10. Effects the damage heat does to the crystal + //Affects the amount of o2 and plasma the sm outputs, along with the heat it makes. + var/dynamic_heat_modifier = 0 + //Effects the damage heat does to the crystal. dynamic_heat_resistance = 0 - for(var/gasID in gas_resist) - dynamic_heat_resistance += gas_comp[gasID] * gas_resist[gasID] * (isnull(resistance_mod[gasID]) ? 1 : resistance_mod[gasID]) - dynamic_heat_resistance = max(dynamic_heat_resistance, 1) - - //Value between -5 and 30, used to determine radiation output as it concerns things like collectors. - power_transmission_bonus = 0 - for(var/gasID in gas_trans) - power_transmission_bonus += gas_comp[gasID] * gas_trans[gasID] * (isnull(transit_mod[gasID]) ? 1 : transit_mod[gasID]) + //We multiply this with power to find the rads. + var/power_transmission_bonus = 0 + var/powerloss_inhibition_gas = 0 + var/radioactivity_modifier = 0 + for(var/gasID in gas_comp) + var/this_comp = gas_comp[gasID] * (isnull(threshold_mod[gasID] ? 1 : threshold_mod[gasID])) + gasmix_power_ratio += this_comp * powermix[gasID] + dynamic_heat_modifier += this_comp * heat[gasID] + dynamic_heat_resistance += this_comp * resist[gasID] + power_transmission_bonus += this_comp * transmit[gasID] + powerloss_inhibition_gas += this_comp * inhibition[gasID] + radioactivity_modifier += this_comp * radioactivity[gasID] + dynamic_heat_modifier *= h2obonus power_transmission_bonus *= h2obonus + gasmix_power_ratio = clamp(gasmix_power_ratio, 0, 1) + dynamic_heat_modifier = max(dynamic_heat_modifier, 0.5) //more moles of gases are harder to heat than fewer, so let's scale heat damage around them mole_heat_penalty = max(combined_gas / MOLE_HEAT_PENALTY, 0.25) @@ -578,8 +496,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) //Ramps up or down in increments of 0.02 up to the proportion of co2 //Given infinite time, powerloss_dynamic_scaling = co2comp //Some value between 0 and 1 - if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && gas_comp[/datum/gas/carbon_dioxide] > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 - powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(gas_comp[/datum/gas/carbon_dioxide] - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) + if (combined_gas > POWERLOSS_INHIBITION_MOLE_THRESHOLD && powerloss_inhibition_gas > POWERLOSS_INHIBITION_GAS_THRESHOLD) //If there are more then 20 mols, and more then 20% co2 + powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling + clamp(powerloss_inhibition_gas - powerloss_dynamic_scaling, -0.02, 0.02), 0, 1) else powerloss_dynamic_scaling = clamp(powerloss_dynamic_scaling - 0.05, 0, 1) //Ranges from 0 to 1(1-(value between 0 and 1 * ranges from 1 to 1.5(mol / 500))) @@ -611,30 +529,22 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) if(prob(50)) //(1 + (tritRad + pluoxDampen * bzDampen * o2Rad * plasmaRad / (10 - bzrads))) * freonbonus - radiation_pulse(src, power * max(0, (1 + (power_transmission_bonus/(10-(gas_comp[/datum/gas/bz] * BZ_RADIOACTIVITY_MODIFIER)))) * 1))//freonbonus))// RadModBZ(500%) - if(gas_comp[/datum/gas/bz] >= 0.4 && prob(30 * gas_comp[/datum/gas/bz])) - src.fire_nuclear_particle() // Start to emit radballs at a maximum of 30% chance per tick + radiation_pulse(src, power * max(0, (1 + (power_transmission_bonus/(10-radioactivity_modifier)))))//freonbonus))// RadModBZ(500%) + if(radioactivity_modifier >= 2 && prob(6 * radioactivity_modifier)) + src.fire_nuclear_particle() //Power * 0.55 * a value between 1 and 0.8 var/device_energy = power * REACTION_POWER_MODIFIER - //To figure out how much temperature to add each tick, consider that at one atmosphere's worth - //of pure oxygen, with all four lasers firing at standard energy and no N2 present, at room temperature - //that the device energy is around 2140. At that stage, we don't want too much heat to be put out - //Since the core is effectively "cold" - - //Also keep in mind we are only adding this temperature to (efficiency)% of the one tile the rock - //is on. An increase of 4*C @ 25% efficiency here results in an increase of 1*C / (#tilesincore) overall. - //Power * 0.55 * (some value between 1.5 and 23) / 5 removed.set_temperature(removed.return_temperature() + ((device_energy * dynamic_heat_modifier) / THERMAL_RELEASE_MODIFIER)) - //We can only emit so much heat, that being 57500 + //We don't want our output to be too hot removed.set_temperature(max(0, min(removed.return_temperature(), 2500 * dynamic_heat_modifier))) //Calculate how much gas to release //Varies based on power and gas content - removed.adjust_moles(/datum/gas/plasma, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) + removed.adjust_moles(GAS_PLASMA, max((device_energy * dynamic_heat_modifier) / PLASMA_RELEASE_MODIFIER, 0)) //Varies based on power, gas content, and heat - removed.adjust_moles(/datum/gas/oxygen, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) + removed.adjust_moles(GAS_O2, max(((device_energy + removed.return_temperature() * dynamic_heat_modifier) - T0C) / OXYGEN_RELEASE_MODIFIER, 0)) if(produces_gas) env.merge(removed) @@ -648,6 +558,8 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal) for(var/mob/living/carbon/human/l in fov_viewers(src, HALLUCINATION_RANGE(power))) // If they can see it without mesons on. Bad on them. if(!istype(l.glasses, /obj/item/clothing/glasses/meson)) var/D = sqrt(1 / max(1, get_dist(l, src))) + if(!l.hallucination) + to_chat(l, "Looking at the supermatter unprotected gives you a headache...") l.hallucination += power * hallucination_power * D l.hallucination = clamp(l.hallucination, 0, 200) for(var/mob/living/l in range(src, round((power / 100) ** 0.25))) diff --git a/code/modules/power/turbine.dm b/code/modules/power/turbine.dm index a9acea719c..dda7f27eee 100644 --- a/code/modules/power/turbine.dm +++ b/code/modules/power/turbine.dm @@ -128,13 +128,10 @@ cut_overlays() rpm = 0.9* rpm + 0.1 * rpmtarget - var/datum/gas_mixture/environment = inturf.return_air() - // It's a simplified version taking only 1/10 of the moles from the turf nearby. It should be later changed into a better version + // above todo 7 years and counting - var/transfer_moles = environment.total_moles()/10 - var/datum/gas_mixture/removed = inturf.remove_air(transfer_moles) - gas_contained.merge(removed) + inturf.transfer_air_ratio(gas_contained, 0.1) // RPM function to include compression friction - be advised that too low/high of a compfriction value can make things screwy @@ -221,8 +218,7 @@ if(compressor.gas_contained.total_moles()>0) var/oamount = min(compressor.gas_contained.total_moles(), (compressor.rpm+100)/35000*compressor.capacity) - var/datum/gas_mixture/removed = compressor.gas_contained.remove(oamount) - outturf.assume_air(removed) + outturf.assume_air_moles(compressor.gas_contained, oamount) // If it works, put an overlay that it works! diff --git a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm index 4bd9177373..18607b919a 100644 --- a/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm +++ b/code/modules/procedural_mapping/mapGeneratorModules/helpers.dm @@ -10,16 +10,13 @@ if(!mother) return var/list/map = mother.map - for(var/turf/T in map) - SSair.remove_from_active(T) for(var/turf/open/T in map) if(T.air) if(T.initial_gas_mix) T.air.parse_gas_string(T.initial_gas_mix) - T.temperature = T.air.return_temperature() + T.set_temperature(T.air.return_temperature()) else T.air.copy_from_turf(T) - SSair.add_to_active(T) /datum/mapGeneratorModule/bottomLayer/massdelete spawnableAtoms = list() diff --git a/code/modules/procedural_mapping/mapGenerators/repair.dm b/code/modules/procedural_mapping/mapGenerators/repair.dm index d9380a40dd..a36ac88d6c 100644 --- a/code/modules/procedural_mapping/mapGenerators/repair.dm +++ b/code/modules/procedural_mapping/mapGenerators/repair.dm @@ -41,6 +41,7 @@ set waitfor = FALSE var/turf/B = L atoms += B + B.assemble_baseturfs(B.type) for(var/A in B) atoms += A if(istype(A,/obj/structure/cable)) diff --git a/code/modules/projectiles/ammunition/energy/laser.dm b/code/modules/projectiles/ammunition/energy/laser.dm index f6eca57e29..5b727d76de 100644 --- a/code/modules/projectiles/ammunition/energy/laser.dm +++ b/code/modules/projectiles/ammunition/energy/laser.dm @@ -2,6 +2,9 @@ projectile_type = /obj/item/projectile/beam/laser select_name = "kill" +/obj/item/ammo_casing/energy/laser/minigun + click_cooldown_override = 2 + /obj/item/ammo_casing/energy/lasergun projectile_type = /obj/item/projectile/beam/laser e_cost = 83 diff --git a/code/modules/projectiles/ammunition/energy/special.dm b/code/modules/projectiles/ammunition/energy/special.dm index 2bf7c06ec6..0cea7a361d 100644 --- a/code/modules/projectiles/ammunition/energy/special.dm +++ b/code/modules/projectiles/ammunition/energy/special.dm @@ -32,12 +32,13 @@ /obj/item/ammo_casing/energy/temp projectile_type = /obj/item/projectile/temp select_name = "freeze" - e_cost = 250 + e_cost = 50 // twenty shots before emptying fire_sound = 'sound/weapons/pulse3.ogg' /obj/item/ammo_casing/energy/temp/hot projectile_type = /obj/item/projectile/temp/hot select_name = "bake" + fire_sound = 'sound/weapons/pulse2.ogg' /obj/item/ammo_casing/energy/meteor projectile_type = /obj/item/projectile/meteor diff --git a/code/modules/projectiles/ammunition/energy/stun.dm b/code/modules/projectiles/ammunition/energy/stun.dm index f063672654..cb7f80d949 100644 --- a/code/modules/projectiles/ammunition/energy/stun.dm +++ b/code/modules/projectiles/ammunition/energy/stun.dm @@ -9,6 +9,10 @@ projectile_type = /obj/item/projectile/energy/electrode/security e_cost = 100 +/obj/item/ammo_casing/energy/electrode/hos + projectile_type = /obj/item/projectile/energy/electrode/security/hos + e_cost = 100 + /obj/item/ammo_casing/energy/electrode/spec e_cost = 100 @@ -16,7 +20,6 @@ fire_sound = 'sound/weapons/gunshot.ogg' e_cost = 100 - /obj/item/ammo_casing/energy/electrode/old e_cost = 1000 diff --git a/code/modules/projectiles/boxes_magazines/internal/misc.dm b/code/modules/projectiles/boxes_magazines/internal/misc.dm index 2b87557b39..76f3c88381 100644 --- a/code/modules/projectiles/boxes_magazines/internal/misc.dm +++ b/code/modules/projectiles/boxes_magazines/internal/misc.dm @@ -3,9 +3,3 @@ ammo_type = /obj/item/ammo_casing/caseless/magspear caliber = "speargun" max_ammo = 1 - -/obj/item/ammo_box/magazine/internal/minigun - name = "gatling gun fusion core" - ammo_type = /obj/item/ammo_casing/caseless/laser/gatling - caliber = "gatling" - max_ammo = 5000 diff --git a/code/modules/projectiles/guns/energy/energy_gun.dm b/code/modules/projectiles/guns/energy/energy_gun.dm index 45bc3a79dc..294040b040 100644 --- a/code/modules/projectiles/guns/energy/energy_gun.dm +++ b/code/modules/projectiles/guns/energy/energy_gun.dm @@ -48,12 +48,24 @@ /obj/item/gun/energy/e_gun/hos name = "\improper X-01 MultiPhase Energy Gun" - desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time in exchange for inbuilt advanced firearm EMP shielding." + desc = "This is an expensive, modern recreation of an antique laser gun. This gun has several unique firemodes, but lacks the ability to recharge over time in exchange for inbuilt advanced firearm EMP shielding. Right click in combat mode to fire a taser shot with a cooldown." icon_state = "hoslaser" force = 10 - ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/ion/hos) + ammo_type = list(/obj/item/ammo_casing/energy/disabler, /obj/item/ammo_casing/energy/laser/hos, /obj/item/ammo_casing/energy/ion/hos, /obj/item/ammo_casing/energy/electrode/hos) ammo_x_offset = 4 resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF + var/last_altfire = 0 + var/altfire_delay = 0 + +/obj/item/gun/energy/e_gun/hos/altafterattack(atom/target, mob/user, proximity_flag, params) + . = TRUE + if(last_altfire + altfire_delay > world.time) + return + var/current_index = current_firemode_index + set_firemode_to_type(/obj/item/ammo_casing/energy/electrode) + process_afterattack(target, user, proximity_flag, params) + set_firemode_index(current_index) + last_altfire = world.time /obj/item/gun/energy/e_gun/hos/emp_act(severity) return diff --git a/code/modules/projectiles/guns/ballistic/laser_gatling.dm b/code/modules/projectiles/guns/energy/laser_gatling.dm similarity index 78% rename from code/modules/projectiles/guns/ballistic/laser_gatling.dm rename to code/modules/projectiles/guns/energy/laser_gatling.dm index 244bc5b124..a0274d76d7 100644 --- a/code/modules/projectiles/guns/ballistic/laser_gatling.dm +++ b/code/modules/projectiles/guns/energy/laser_gatling.dm @@ -11,19 +11,19 @@ righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' slot_flags = ITEM_SLOT_BACK w_class = WEIGHT_CLASS_HUGE - var/obj/item/gun/ballistic/minigun/gun + var/obj/item/gun/energy/minigun/gun var/armed = 0 //whether the gun is attached, 0 is attached, 1 is the gun is wielded. var/overheat = 0 - var/overheat_max = 40 + var/overheat_max = 50 var/heat_diffusion = 1 /obj/item/minigunpack/Initialize() . = ..() gun = new(src) - START_PROCESSING(SSobj, src) + START_PROCESSING(SSfastprocess, src) /obj/item/minigunpack/Destroy() - STOP_PROCESSING(SSobj, src) + STOP_PROCESSING(SSfastprocess, src) return ..() /obj/item/minigunpack/process() @@ -68,11 +68,10 @@ if(!M.incapacitated()) - if(istype(over_object, /obj/screen/inventory/hand)) - var/obj/screen/inventory/hand/H = over_object + if(istype(over_object, /atom/movable/screen/inventory/hand)) + var/atom/movable/screen/inventory/hand/H = over_object M.putItemFromInventoryInHandIfPossible(src, H.held_index) - /obj/item/minigunpack/update_icon_state() if(armed) icon_state = "notholstered" @@ -91,8 +90,7 @@ update_icon() user.update_inv_back() - -/obj/item/gun/ballistic/minigun +/obj/item/gun/energy/minigun name = "laser gatling gun" desc = "An advanced laser cannon with an incredible rate of fire. Requires a bulky backpack power source to use." icon = 'icons/obj/guns/minigun.dmi' @@ -103,17 +101,20 @@ slot_flags = null w_class = WEIGHT_CLASS_HUGE custom_materials = null - burst_size = 3 - automatic = 0 - fire_delay = 1 + automatic = 0.5 + fire_delay = 2 + ammo_type = list( + /obj/item/ammo_casing/energy/laser + ) + weapon_weight = WEAPON_HEAVY fire_sound = 'sound/weapons/laser.ogg' - mag_type = /obj/item/ammo_box/magazine/internal/minigun - casing_ejector = FALSE + charge_sections = 0 + shaded_charge = 0 item_flags = NEEDS_PERMIT | SLOWS_WHILE_IN_HAND var/obj/item/minigunpack/ammo_pack -/obj/item/gun/ballistic/minigun/Initialize() +/obj/item/gun/energy/minigun/Initialize() if(istype(loc, /obj/item/minigunpack)) //We should spawn inside an ammo pack so let's use that one. ammo_pack = loc else @@ -121,29 +122,29 @@ return ..() -/obj/item/gun/ballistic/minigun/attack_self(mob/living/user) +/obj/item/gun/energy/minigun/attack_self(mob/living/user) return -/obj/item/gun/ballistic/minigun/dropped(mob/user) +/obj/item/gun/energy/minigun/dropped(mob/user) . = ..() if(ammo_pack) ammo_pack.attach_gun(user) else qdel(src) -/obj/item/gun/ballistic/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) +/obj/item/gun/energy/minigun/process_fire(atom/target, mob/living/user, message = TRUE, params = null, zone_override = "", bonus_spread = 0, stam_cost = 0) if(ammo_pack) if(ammo_pack.overheat < ammo_pack.overheat_max) - ammo_pack.overheat += burst_size + ammo_pack.overheat++ ..() else to_chat(user, "The gun's heat sensor locked the trigger to prevent lens damage.") -/obj/item/gun/ballistic/minigun/afterattack(atom/target, mob/living/user, flag, params) +/obj/item/gun/energy/minigun/afterattack(atom/target, mob/living/user, flag, params) if(!ammo_pack || ammo_pack.loc != user) to_chat(user, "You need the backpack power source to fire the gun!") . = ..() -/obj/item/gun/ballistic/minigun/dropped(mob/living/user) +/obj/item/gun/energy/minigun/dropped(mob/living/user) . = ..() ammo_pack.attach_gun(user) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index f965100846..15acd40172 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -310,9 +310,10 @@ /obj/item/gun/energy/temperature name = "temperature gun" icon_state = "freezegun" + item_state = null desc = "A gun that changes temperatures." ammo_type = list(/obj/item/ammo_casing/energy/temp, /obj/item/ammo_casing/energy/temp/hot) - cell_type = "/obj/item/stock_parts/cell/high" + shaded_charge = TRUE pin = null /obj/item/gun/energy/temperature/security diff --git a/code/modules/projectiles/guns/misc/beam_rifle.dm b/code/modules/projectiles/guns/misc/beam_rifle.dm index 9d9f6aeb83..2ef974a450 100644 --- a/code/modules/projectiles/guns/misc/beam_rifle.dm +++ b/code/modules/projectiles/guns/misc/beam_rifle.dm @@ -280,7 +280,7 @@ /obj/item/gun/energy/beam_rifle/onMouseDown(object, location, params, mob/mob) if(istype(mob)) set_user(mob) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return if((object in mob.contents) || (object == mob)) return @@ -288,7 +288,7 @@ return ..() /obj/item/gun/energy/beam_rifle/onMouseUp(object, location, params, mob/M) - if(istype(object, /obj/screen) && !istype(object, /obj/screen/click_catcher)) + if(istype(object, /atom/movable/screen) && !istype(object, /atom/movable/screen/click_catcher)) return process_aim() if(fire_check() && can_trigger_gun(M)) diff --git a/code/modules/projectiles/guns/misc/syringe_gun.dm b/code/modules/projectiles/guns/misc/syringe_gun.dm index dc2a1df03a..39b7cbf540 100644 --- a/code/modules/projectiles/guns/misc/syringe_gun.dm +++ b/code/modules/projectiles/guns/misc/syringe_gun.dm @@ -114,7 +114,7 @@ can_unsuppress = FALSE /obj/item/gun/syringe/dart/Initialize() - ..() + . = ..() chambered = new /obj/item/ammo_casing/syringegun/dart(src) /obj/item/gun/syringe/dart/attackby(obj/item/A, mob/user, params, show_msg = TRUE) diff --git a/code/modules/projectiles/projectile/energy/stun.dm b/code/modules/projectiles/projectile/energy/stun.dm index 83b753e0a3..acec1ef94f 100644 --- a/code/modules/projectiles/projectile/energy/stun.dm +++ b/code/modules/projectiles/projectile/energy/stun.dm @@ -31,21 +31,28 @@ else if(tase_duration && (C.status_flags & CANKNOCKDOWN) && !HAS_TRAIT(C, TRAIT_STUNIMMUNE) && !HAS_TRAIT(C, TRAIT_TASED_RESISTANCE)) C.apply_status_effect(strong_tase? STATUS_EFFECT_TASED : STATUS_EFFECT_TASED_WEAK, tase_duration) addtimer(CALLBACK(C, /mob/living/carbon.proc/do_jitter_animation, jitter), 5) + else if(iscyborg(target)) + target.visible_message(span_danger("A shower of sparks emit from [target] on impact from [src]!")) + do_sparks(1, TRUE, target) + var/mob/living/silicon/robot/R = target + R.vtec_disable(10 SECONDS) /obj/item/projectile/energy/electrode/on_range() //to ensure the bolt sparks when it reaches the end of its range if it didn't hit a target yet do_sparks(1, TRUE, src) ..() /obj/item/projectile/energy/electrode/security - tase_duration = 30 + tase_duration = 40 knockdown = 0 - stamina = 10 + stamina = 0 knockdown_stamoverride = 0 knockdown_stam_max = 0 strong_tase = FALSE /obj/item/projectile/energy/electrode/security/hos - knockdown = 100 - knockdown_stamoverride = 30 - knockdown_stam_max = null - tase_duration = 10 + tase_duration = 40 + knockdown = 0 + stamina = 0 + knockdown_stamoverride = 0 + knockdown_stam_max = 0 + strong_tase = FALSE diff --git a/code/modules/projectiles/projectile/special/temperature.dm b/code/modules/projectiles/projectile/special/temperature.dm index 71e6e79f59..ec23af6748 100644 --- a/code/modules/projectiles/projectile/special/temperature.dm +++ b/code/modules/projectiles/projectile/special/temperature.dm @@ -1,9 +1,17 @@ /obj/item/projectile/temp name = "freeze beam" icon_state = "ice_2" + pass_flags = PASSTABLE | PASSGLASS | PASSGRILLE damage = 0 + light_range = 2 damage_type = BURN nodamage = FALSE + hitsound = 'sound/weapons/frost.ogg' + hitsound_wall = 'sound/weapons/frost.ogg' + ricochets_max = 50 //Honk! + ricochet_chance = 80 + is_reflectable = TRUE + light_color = LIGHT_COLOR_BLUE flag = "energy" var/temperature = 100 @@ -15,7 +23,12 @@ /obj/item/projectile/temp/hot name = "heat beam" + icon_state = "lava" + damage = 10 + hitsound = 'sound/weapons/sear.ogg' + hitsound_wall = 'sound/weapons/effects/searwall.ogg' temperature = 400 + light_color = LIGHT_COLOR_RED /obj/item/projectile/temp/cryo name = "cryo beam" diff --git a/code/modules/reagents/chemistry/holder.dm b/code/modules/reagents/chemistry/holder.dm index fd6204a8e3..afad323a27 100644 --- a/code/modules/reagents/chemistry/holder.dm +++ b/code/modules/reagents/chemistry/holder.dm @@ -280,71 +280,114 @@ R.handle_reactions() return amount -/datum/reagents/proc/metabolize(mob/living/carbon/C, can_overdose = FALSE, liverless = FALSE) +/** + * Triggers metabolizing for all the reagents in this holder + * + * Arguments: + * * mob/living/carbon/carbon - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom] + * * delta_time - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired + * * can_overdose - Allows overdosing + * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing + */ +/datum/reagents/proc/metabolize(mob/living/carbon/owner, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) var/list/cached_reagents = reagent_list - var/list/cached_addictions = addiction_list - if(C) - expose_temperature(C.bodytemperature, 0.25) - var/need_mob_update = 0 - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(QDELETED(R.holder)) - continue - if(liverless && !R.self_consuming) //need to be metabolized - continue - if(!C) - C = R.holder.my_atom - if(!R.metabolizing) - R.metabolizing = TRUE - R.on_mob_metabolize(C) - if(C && R) - if(C.reagent_check(R) != 1) - if(can_overdose) - if(R.overdose_threshold) - if(R.volume > R.overdose_threshold && !R.overdosed) - R.overdosed = 1 - var/turf/CT = get_turf(C) - log_reagent("OVERDOSE START: [key_name(C)] at [AREACOORD(CT)] started overdosing on [R.volume] units of [R].") - need_mob_update += R.overdose_start(C) - if(R.addiction_threshold) - if(R.volume > R.addiction_threshold && !is_type_in_list(R, cached_addictions)) - var/datum/reagent/new_reagent = new R.type() - cached_addictions.Add(new_reagent) - if(R.overdosed) - need_mob_update += R.overdose_process(C) - if(is_type_in_list(R,cached_addictions)) - for(var/addiction in cached_addictions) - var/datum/reagent/A = addiction - if(istype(R, A)) - A.addiction_stage = -15 // you're satisfied for a good while. - need_mob_update += R.on_mob_life(C) - + if(owner) + expose_temperature(owner.bodytemperature, 0.25) + var/need_mob_update = FALSE + for(var/datum/reagent/reagent as anything in cached_reagents) + need_mob_update += metabolize_reagent(owner, reagent, delta_time, times_fired, can_overdose, liverless) if(can_overdose) if(addiction_tick == 6) addiction_tick = 1 - for(var/addiction in cached_addictions) + for(var/addiction in addiction_list) var/datum/reagent/R = addiction - if(C && R) + if(owner && R) R.addiction_stage++ if(1 <= R.addiction_stage && R.addiction_stage <= R.addiction_stage1_end) - need_mob_update += R.addiction_act_stage1(C) + need_mob_update += R.addiction_act_stage1(owner) else if(R.addiction_stage1_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage2_end) - need_mob_update += R.addiction_act_stage2(C) + need_mob_update += R.addiction_act_stage2(owner) else if(R.addiction_stage2_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage3_end) - need_mob_update += R.addiction_act_stage3(C) + need_mob_update += R.addiction_act_stage3(owner) else if(R.addiction_stage3_end < R.addiction_stage && R.addiction_stage <= R.addiction_stage4_end) - need_mob_update += R.addiction_act_stage4(C) + need_mob_update += R.addiction_act_stage4(owner) else if(R.addiction_stage4_end < R.addiction_stage) remove_addiction(R) else - SEND_SIGNAL(C, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") + SEND_SIGNAL(owner, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") addiction_tick++ - if(C && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. - C.updatehealth() - C.update_mobility() - C.update_stamina() + if(owner && need_mob_update) //some of the metabolized reagents had effects on the mob that requires some updates. + owner.updatehealth() + owner.update_mobility() + owner.update_stamina() update_total() +/* + * Metabolises a single reagent for a target owner carbon mob. See above. + * + * Arguments: + * * mob/living/carbon/owner - The mob to metabolize in, if null it uses [/datum/reagents/var/my_atom] + * * delta_time - the time in server seconds between proc calls (when performing normally it will be 2) + * * times_fired - the number of times the owner's life() tick has been called aka The number of times SSmobs has fired + * * can_overdose - Allows overdosing + * * liverless - Stops reagents that aren't set as [/datum/reagent/var/self_consuming] from metabolizing + */ +/datum/reagents/proc/metabolize_reagent(mob/living/carbon/owner, datum/reagent/reagent, delta_time, times_fired, can_overdose = FALSE, liverless = FALSE) + var/need_mob_update = FALSE + if(QDELETED(reagent.holder)) + return FALSE + + if(!owner) + owner = reagent.holder.my_atom + + if(owner && reagent) + if(!owner.reagent_check(reagent, delta_time, times_fired) != TRUE) + return + if(liverless && !reagent.self_consuming) //need to be metabolized + return + if(!reagent.metabolizing) + reagent.metabolizing = TRUE + reagent.on_mob_metabolize(owner) + if(can_overdose) + if(reagent.overdose_threshold) + if(reagent.volume >= reagent.overdose_threshold && !reagent.overdosed) + reagent.overdosed = TRUE + need_mob_update += reagent.overdose_start(owner) + log_game("[key_name(owner)] has started overdosing on [reagent.name] at [reagent.volume] units.") + + // for(var/addiction in reagent.addiction_types) + // owner.mind?.add_addiction_points(addiction, reagent.addiction_types[addiction] * REAGENTS_METABOLISM) + if(reagent.addiction_threshold) + if(reagent.volume > reagent.addiction_threshold && !is_type_in_list(reagent, addiction_list)) + var/datum/reagent/new_reagent = new reagent.type() + addiction_list.Add(new_reagent) + if(is_type_in_list(reagent, addiction_list)) + for(var/addiction in addiction_list) + var/datum/reagent/A = addiction + if(istype(reagent, A)) + A.addiction_stage = -15 // you're satisfied for a good while. + + if(reagent.overdosed) + need_mob_update += reagent.overdose_process(owner, delta_time, times_fired) + + need_mob_update += reagent.on_mob_life(owner, delta_time, times_fired) + return need_mob_update + +/// Signals that metabolization has stopped, triggering the end of trait-based effects +/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) + var/list/cached_reagents = reagent_list + for(var/datum/reagent/reagent as anything in cached_reagents) + if(QDELETED(reagent.holder)) + continue + if(keep_liverless && reagent.self_consuming) //Will keep working without a liver + continue + if(!C) + C = reagent.holder.my_atom + if(reagent.metabolizing) + reagent.metabolizing = FALSE + reagent.on_mob_end_metabolize(C) + /datum/reagents/proc/remove_addiction(datum/reagent/R) to_chat(my_atom, "You feel like you've gotten over your need for [R.name].") SEND_SIGNAL(my_atom, COMSIG_CLEAR_MOOD_EVENT, "[R.type]_overdose") @@ -354,21 +397,6 @@ addiction_list.Remove(R) qdel(R) -//Signals that metabolization has stopped, triggering the end of trait-based effects -/datum/reagents/proc/end_metabolization(mob/living/carbon/C, keep_liverless = TRUE) - var/list/cached_reagents = reagent_list - for(var/reagent in cached_reagents) - var/datum/reagent/R = reagent - if(QDELETED(R.holder)) - continue - if(keep_liverless && R.self_consuming) //Will keep working without a liver - continue - if(!C) - C = R.holder.my_atom - if(R.metabolizing) - R.metabolizing = FALSE - R.on_mob_end_metabolize(C) - /datum/reagents/proc/conditional_update_move(atom/A, Running = 0) var/list/cached_reagents = reagent_list for(var/reagent in cached_reagents) diff --git a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm index 177b1c70bc..12c91e145a 100644 --- a/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/alcohol_reagents.dm @@ -586,7 +586,7 @@ All effects don't start immediately, but rather get worse over time; the rate is if(AmBloodsucker(C)) disgust_bloodsucker(FALSE, 1) //Bloodsuckers get SOME blood from it, for style reasons. if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume = min((BLOOD_VOLUME_NORMAL*C.blood_ratio), C.blood_volume + 3) //Bloody Mary quickly restores blood loss. + C.adjust_integration_blood(3) //Bloody Mary quickly restores blood loss. ..() /datum/reagent/consumable/ethanol/brave_bull @@ -2516,19 +2516,101 @@ All effects don't start immediately, but rather get worse over time; the rate is color = "#FFFFFF" boozepwr = 35 quality = DRINK_GOOD - taste_description = "a delightful softened punch" - glass_icon_state = "godfather" - glass_name = "Godfather" - glass_desc = "A classic from old Italy and enjoyed by gangsters, pray the orange peel doesnt end up in your mouth." + taste_description = "bad coding" + can_synth = FALSE + var/list/names = list("null fruit" = 1) //Names of the fruits used. Associative list where name is key, value is the percentage of that fruit. + var/list/tastes = list("bad coding" = 1) //List of tastes. See above. + pH = 4 -/datum/reagent/consumable/ethanol/godmother - name = "Godmother" - description = "A twist on a classic, liked more by mature women." - boozepwr = 50 - color = "#E68F00" - quality = DRINK_GOOD - taste_description = "sweetness and a zesty twist" - glass_icon_state = "godmother" - glass_name = "Godmother" - glass_desc = "A lovely fresh smelling cocktail, a true Sicilian delight." +/datum/reagent/consumable/ethanol/fruit_wine/on_new(list/data) + names = data["names"] + tastes = data["tastes"] + boozepwr = data["boozepwr"] + color = data["color"] + generate_data_info(data) +/datum/reagent/consumable/ethanol/fruit_wine/on_merge(list/data, amount) + var/diff = (amount/volume) + if(diff < 1) + color = BlendRGB(color, data["color"], diff/2) //The percentage difference over two, so that they take average if equal. + else + color = BlendRGB(color, data["color"], (1/diff)/2) //Adjust so it's always blending properly. + var/oldvolume = volume-amount + + var/list/cachednames = data["names"] + for(var/name in names | cachednames) + names[name] = ((names[name] * oldvolume) + (cachednames[name] * amount)) / volume + + var/list/cachedtastes = data["tastes"] + for(var/taste in tastes | cachedtastes) + tastes[taste] = ((tastes[taste] * oldvolume) + (cachedtastes[taste] * amount)) / volume + + boozepwr *= oldvolume + var/newzepwr = data["boozepwr"] * amount + boozepwr += newzepwr + boozepwr /= volume //Blending boozepwr to volume. + generate_data_info(data) + +/datum/reagent/consumable/ethanol/fruit_wine/proc/generate_data_info(list/data) + var/minimum_percent = 0.15 //Percentages measured between 0 and 1. + var/list/primary_tastes = list() + var/list/secondary_tastes = list() + glass_name = "glass of [name]" + glass_desc = description + for(var/taste in tastes) + switch(tastes[taste]) + if(minimum_percent*2 to INFINITY) + primary_tastes += taste + if(minimum_percent to minimum_percent*2) + secondary_tastes += taste + + var/minimum_name_percent = 0.35 + name = "" + var/list/names_in_order = sortTim(names, /proc/cmp_numeric_dsc, TRUE) + var/named = FALSE + for(var/fruit_name in names) + if(names[fruit_name] >= minimum_name_percent) + name += "[fruit_name] " + named = TRUE + if(named) + name += "wine" + else + name = "mixed [names_in_order[1]] wine" + + var/alcohol_description + switch(boozepwr) + if(120 to INFINITY) + alcohol_description = "suicidally strong" + if(90 to 120) + alcohol_description = "rather strong" + if(70 to 90) + alcohol_description = "strong" + if(40 to 70) + alcohol_description = "rich" + if(20 to 40) + alcohol_description = "mild" + if(0 to 20) + alcohol_description = "sweet" + else + alcohol_description = "watery" //How the hell did you get negative boozepwr? + + var/list/fruits = list() + if(names_in_order.len <= 3) + fruits = names_in_order + else + for(var/i in 1 to 3) + fruits += names_in_order[i] + fruits += "other plants" + var/fruit_list = english_list(fruits) + description = "A [alcohol_description] wine brewed from [fruit_list]." + + var/flavor = "" + if(!primary_tastes.len) + primary_tastes = list("[alcohol_description] alcohol") + flavor += english_list(primary_tastes) + if(secondary_tastes.len) + flavor += ", with a hint of " + flavor += english_list(secondary_tastes) + taste_description = flavor + if(holder.my_atom) + holder.my_atom.on_reagent_change() diff --git a/code/modules/reagents/chemistry/reagents/drink_reagents.dm b/code/modules/reagents/chemistry/reagents/drink_reagents.dm index f4f5b90398..5059376954 100644 --- a/code/modules/reagents/chemistry/reagents/drink_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drink_reagents.dm @@ -505,11 +505,11 @@ value = REAGENT_VALUE_COMMON /datum/reagent/consumable/nuka_cola/on_mob_metabolize(mob/living/carbon/M) - M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + M.add_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) return ..() /datum/reagent/consumable/nuka_cola/on_mob_end_metabolize(mob/living/carbon/M) - M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + M.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/nuka_cola) return ..() /datum/reagent/consumable/nuka_cola/on_mob_life(mob/living/carbon/M) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 96985514b5..ed80804f28 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -164,62 +164,54 @@ /datum/reagent/drug/methamphetamine name = "Methamphetamine" - description = "Reduces stun times by about 300%, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." + description = "Reduces stun times by about 300%, speeds the user up, and allows the user to quickly recover stamina while dealing a small amount of Brain damage. If overdosed the subject will move randomly, laugh randomly, drop items and suffer from Toxin and Brain damage. If addicted the subject will constantly jitter and drool, before becoming dizzy and losing motor control and eventually suffer heavy toxin damage." reagent_state = LIQUID color = "#FAFAFA" overdose_threshold = 20 - addiction_threshold = 10 metabolization_rate = 0.75 * REAGENTS_METABOLISM - var/brain_damage = TRUE - var/jitter = TRUE - var/confusion = TRUE pH = 5 + addiction_threshold = 10 value = REAGENT_VALUE_UNCOMMON /datum/reagent/drug/methamphetamine/on_mob_metabolize(mob/living/L) ..() - ADD_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) - L.update_movespeed() - ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) /datum/reagent/drug/methamphetamine/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_IGNOREDAMAGESLOWDOWN, type) - L.update_movespeed() - REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/meth) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/methamphetamine) ..() -/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M) +/datum/reagent/drug/methamphetamine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) var/high_message = pick("You feel hyper.", "You feel like you need to go faster.", "You feel like you can run the world.") - if(prob(5)) - to_chat(M, "[high_message]") - M.AdjustAllImmobility(-40, 0) - M.AdjustUnconscious(-40, 0) - M.adjustStaminaLoss(-7.5 * REM, 0) - if(jitter) - M.Jitter(2) - if(brain_damage) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1,4)) - M.heal_overall_damage(2, 2) - if(prob(5)) + if(DT_PROB(2.5, delta_time)) + to_chat(M, span_notice("[high_message]")) + // SEND_SIGNAL(M, COMSIG_ADD_MOOD_EVENT, "tweaking", /datum/mood_event/stimulant_medium, name) + M.AdjustStun(-40 * REM * delta_time) + M.AdjustKnockdown(-40 * REM * delta_time) + M.AdjustUnconscious(-40 * REM * delta_time) + M.AdjustParalyzed(-40 * REM * delta_time) + M.AdjustImmobilized(-40 * REM * delta_time) + M.adjustStaminaLoss(-2 * REM * delta_time, 0) + M.Jitter(2 * REM * delta_time) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 4) * REM * delta_time) + if(DT_PROB(2.5, delta_time)) M.emote(pick("twitch", "shiver")) ..() - . = 1 + . = TRUE -/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M) +/datum/reagent/drug/methamphetamine/overdose_process(mob/living/M, delta_time, times_fired) if(CHECK_MOBILITY(M, MOBILITY_MOVE) && !ismovable(M.loc)) - for(var/i in 1 to 4) + for(var/i in 1 to round(4 * REM * delta_time, 1)) step(M, pick(GLOB.cardinals)) - if(prob(20)) + if(DT_PROB(10, delta_time)) M.emote("laugh") - if(prob(33)) - M.visible_message("[M]'s hands flip out and flail everywhere!") + if(DT_PROB(18, delta_time)) + M.visible_message(span_danger("[M]'s hands flip out and flail everywhere!")) M.drop_all_held_items() ..() - M.adjustToxLoss(1, 0) - M.adjustOrganLoss(ORGAN_SLOT_BRAIN, pick(0.5, 0.6, 0.7, 0.8, 0.9, 1)) - . = 1 + M.adjustToxLoss(1 * REM * delta_time, 0) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, (rand(5, 10) / 10) * REM * delta_time) + . = TRUE /datum/reagent/drug/methamphetamine/addiction_act_stage1(mob/living/M) M.Jitter(5) @@ -256,14 +248,6 @@ ..() . = 1 -/datum/reagent/drug/methamphetamine/changeling - name = "Changeling Adrenaline" - addiction_threshold = 35 - overdose_threshold = 35 - jitter = FALSE - brain_damage = FALSE - value = REAGENT_VALUE_RARE - /datum/reagent/drug/bath_salts name = "Bath Salts" description = "Makes you impervious to stuns and grants a stamina regeneration buff, but you will be a nearly uncontrollable tramp-bearded raving lunatic." diff --git a/code/modules/reagents/chemistry/reagents/food_reagents.dm b/code/modules/reagents/chemistry/reagents/food_reagents.dm index 303fd981fb..a9bdff64b2 100644 --- a/code/modules/reagents/chemistry/reagents/food_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/food_reagents.dm @@ -345,6 +345,8 @@ victim.confused = max(M.confused, 3) victim.damageoverlaytemp = 60 victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 3, 15)) + victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) + addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS) return else if ( eyes_covered ) // Eye cover is better than mouth cover victim.blur_eyes(3) @@ -358,6 +360,8 @@ victim.confused = max(M.confused, 6) victim.damageoverlaytemp = 75 victim.DefaultCombatKnockdown(80, override_hardstun = 0.1, override_stamdmg = min(reac_volume * 5, 25)) + victim.add_movespeed_modifier(/datum/movespeed_modifier/reagent/pepperspray) + addtimer(CALLBACK(victim, /mob.proc/remove_movespeed_modifier, /datum/movespeed_modifier/reagent/pepperspray), 10 SECONDS) victim.update_damage_hud() /datum/reagent/consumable/condensedcapsaicin/on_mob_life(mob/living/carbon/M) @@ -524,10 +528,9 @@ T.MakeSlippery(TURF_WET_LUBE, min_wet_time = 10 SECONDS, wet_time_to_add = reac_volume*2 SECONDS) var/obj/effect/hotspot/hotspot = (locate(/obj/effect/hotspot) in T) if(hotspot) - var/datum/gas_mixture/lowertemp = T.remove_air(T.air.total_moles()) - lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,0)) + var/datum/gas_mixture/lowertemp = T.return_air() + lowertemp.set_temperature(max( min(lowertemp.return_temperature()-2000,lowertemp.return_temperature() / 2) ,TCMB)) lowertemp.react(src) - T.assume_air(lowertemp) qdel(hotspot) /datum/reagent/consumable/enzyme diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index 65443b65c7..a07c5f7a2a 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -396,26 +396,34 @@ metabolization_rate = 0.5 * REAGENTS_METABOLISM overdose_threshold = 60 taste_description = "sweetness and salt" + var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick var/last_added = 0 var/maximum_reachable = BLOOD_VOLUME_NORMAL - 10 //So that normal blood regeneration can continue with salglu active - var/extra_regen = 0.25 // in addition to acting as temporary blood, also add this much to their actual blood per tick pH = 5.5 -/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/M) - if((HAS_TRAIT(M, TRAIT_NOMARROW))) - return - if(last_added) - M.blood_volume -= last_added - last_added = 0 - if(M.blood_volume < maximum_reachable) //Can only up to double your effective blood level. - var/amount_to_add = min(M.blood_volume, volume*5) - var/new_blood_level = min(M.blood_volume + amount_to_add, maximum_reachable) - last_added = new_blood_level - M.blood_volume - M.blood_volume = new_blood_level + extra_regen +/datum/reagent/medicine/salglu_solution/on_mob_life(mob/living/carbon/human/M) if(prob(33)) M.adjustBruteLoss(-0.5*REM, 0) M.adjustFireLoss(-0.5*REM, 0) . = TRUE + if((HAS_TRAIT(M, TRAIT_NOMARROW))) + return ..() + if(last_added) + M.adjust_integration_blood(-last_added, TRUE) + last_added = 0 + if(M.functional_blood() < maximum_reachable) //Can only up to double your effective blood level. + var/new_blood_level = min(volume * 5, maximum_reachable) + last_added = new_blood_level + M.adjust_integration_blood(new_blood_level + (extra_regen * REM)) + if(prob(33)) + M.adjustBruteLoss(-0.5*REM, 0) + M.adjustFireLoss(-0.5*REM, 0) + . = TRUE + ..() + +/datum/reagent/medicine/salglu_solution/on_mob_delete(mob/living/carbon/human/M) + if(last_added) + M.adjust_integration_blood(-last_added, TRUE) ..() /datum/reagent/medicine/salglu_solution/overdose_process(mob/living/M) @@ -706,21 +714,42 @@ addiction_threshold = 30 pH = 12 -/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M) - M.AdjustAllImmobility(-20, FALSE) - M.AdjustUnconscious(-20, FALSE) - M.adjustStaminaLoss(-4.5*REM, FALSE) - M.Jitter(10) - if(prob(50)) - M.confused = max(M.confused, 1) +/datum/reagent/medicine/ephedrine/on_mob_metabolize(mob/living/L) + ..() + L.add_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + +/datum/reagent/medicine/ephedrine/on_mob_end_metabolize(mob/living/L) + L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/ephedrine) + REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + ..() + +/datum/reagent/medicine/ephedrine/on_mob_life(mob/living/carbon/M, delta_time, times_fired) + // if(DT_PROB(10 * (1-creation_purity), delta_time) && iscarbon(M)) + // var/obj/item/I = M.get_active_held_item() + // if(I && M.dropItemToGround(I)) + // to_chat(M, span_notice("Your hands spaz out and you drop what you were holding!")) + // M.Jitter(10) + + M.AdjustAllImmobility(-20 * REM * delta_time) + M.adjustStaminaLoss(-1 * REM * delta_time, FALSE) ..() return TRUE -/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M) - if(prob(33)) - M.adjustToxLoss(0.5*REM, 0) +/datum/reagent/medicine/ephedrine/overdose_process(mob/living/M, delta_time, times_fired) + if(DT_PROB(1, delta_time) && iscarbon(M)) + var/datum/disease/D = new /datum/disease/heart_failure + M.ForceContractDisease(D) + to_chat(M, span_userdanger("You're pretty sure you just felt your heart stop for a second there..")) + M.playsound_local(M, 'sound/effects/singlebeat.ogg', 100, 0) + + if(DT_PROB(3.5, delta_time)) + to_chat(M, span_notice("[pick("Your head pounds.", "You feel a tight pain in your chest.", "You find it hard to stay still.", "You feel your heart practically beating out of your chest.")]")) + + if(DT_PROB(18, delta_time)) + M.adjustToxLoss(1, 0) M.losebreath++ - . = 1 + . = TRUE return TRUE /datum/reagent/medicine/ephedrine/addiction_act_stage1(mob/living/M) @@ -981,7 +1010,7 @@ M.grab_ghost() M.emote("gasp") log_combat(M, M, "revived", src) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] @@ -1274,7 +1303,7 @@ M.adjustCloneLoss(-3*REM, FALSE) M.adjustStaminaLoss(-25*REM,FALSE) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 40 // blood fall out man bad + M.adjust_integration_blood(40) // blood fall out man bad ..() . = 1 @@ -1295,7 +1324,7 @@ M.adjustCloneLoss(-1.25*REM, FALSE) M.adjustStaminaLoss(-4*REM,FALSE) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 3 + M.adjust_integration_blood(3) ..() . = 1 @@ -1415,37 +1444,42 @@ /datum/reagent/medicine/changelingadrenaline name = "Changeling Adrenaline" description = "Reduces the duration of unconciousness, knockdown and stuns. Restores stamina, but deals toxin damage when overdosed." - color = "#918e53" + color = "#C1151D" overdose_threshold = 30 value = REAGENT_VALUE_VERY_RARE -/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) - ..() - ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - -/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) - REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) - ..() - -/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/M as mob) - M.AdjustUnconscious(-20, 0) - M.AdjustAllImmobility(-20, 0) - M.AdjustSleeping(-20, 0) - M.adjustStaminaLoss(-30, 0) +/datum/reagent/medicine/changelingadrenaline/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) ..() + metabolizer.AdjustAllImmobility(-20 * REM * delta_time) + metabolizer.adjustStaminaLoss(-10 * REM * delta_time, 0) + metabolizer.Jitter(10 * REM * delta_time) + metabolizer.Dizzy(10 * REM * delta_time) return TRUE -/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/M as mob) - M.adjustToxLoss(5, 0) //let's make this mildly more toxic because of the stamina buff +/datum/reagent/medicine/changelingadrenaline/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + ADD_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.add_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + +/datum/reagent/medicine/changelingadrenaline/on_mob_end_metabolize(mob/living/L) + ..() + REMOVE_TRAIT(L, TRAIT_SLEEPIMMUNE, type) + REMOVE_TRAIT(L, TRAIT_TASED_RESISTANCE, type) + L.remove_movespeed_mod_immunities(type, /datum/movespeed_modifier/damage_slowdown) + L.Dizzy(0) + L.Jitter(0) + +/datum/reagent/medicine/changelingadrenaline/overdose_process(mob/living/metabolizer, delta_time, times_fired) + metabolizer.adjustToxLoss(1 * REM * delta_time, 0) ..() return TRUE /datum/reagent/medicine/changelinghaste name = "Changeling Haste" description = "Drastically increases movement speed, but deals toxin damage." - color = "#669153" - metabolization_rate = 1 - value = REAGENT_VALUE_VERY_RARE + color = "#AE151D" + metabolization_rate = 2.5 * REAGENTS_METABOLISM /datum/reagent/medicine/changelinghaste/on_mob_metabolize(mob/living/L) ..() @@ -1455,11 +1489,12 @@ L.remove_movespeed_modifier(/datum/movespeed_modifier/reagent/changelinghaste) ..() -/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/M) - M.adjustToxLoss(2, 0) +/datum/reagent/medicine/changelinghaste/on_mob_life(mob/living/carbon/metabolizer, delta_time, times_fired) + metabolizer.adjustToxLoss(2 * REM * delta_time, 0) ..() return TRUE + /datum/reagent/medicine/corazone // Heart attack code will not do damage if corazone is present // because it's SPACE MAGIC ASPIRIN diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 593d77f959..bf93c933de 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -48,7 +48,7 @@ var/mob/living/carbon/C = L var/blood_id = C.get_blood_id() if((HAS_TRAIT(C, TRAIT_NOMARROW) || blood_id == /datum/reagent/blood || blood_id == /datum/reagent/blood/jellyblood) && (method == INJECT || (method == INGEST && C.dna && C.dna.species && (DRINKSBLOOD in C.dna.species.species_traits)))) - C.blood_volume = min(C.blood_volume + round(reac_volume, 0.1), BLOOD_VOLUME_MAXIMUM * C.blood_ratio) + C.adjust_integration_blood(round(reac_volume, 0.1)) // we don't care about bloodtype here, we're just refilling the mob if(reac_volume >= 10 && istype(L) && method != INJECT) @@ -253,7 +253,7 @@ /datum/reagent/water/on_mob_life(mob/living/carbon/M) . = ..() if(M.blood_volume) - M.blood_volume += 0.1 // water is good for you! + M.adjust_integration_blood(0.1) // water is good for you! /* * Water reaction to turf @@ -287,7 +287,9 @@ /datum/reagent/water/reaction_obj(obj/O, reac_volume) O.extinguish() - O.acid_level = 0 + var/datum/component/acid/acid = O.GetComponent(/datum/component/acid) + if(acid) + acid.level = 0 // cubes if(istype(O, /obj/item/reagent_containers/food/snacks/cube)) var/obj/item/reagent_containers/food/snacks/cube/cube = O @@ -368,7 +370,7 @@ /datum/reagent/water/holywater/on_mob_life(mob/living/carbon/M) if(M.blood_volume) - M.blood_volume += 0.1 // water is good for you! + M.adjust_integration_blood(0.1) // water is good for you! if(!data) data = list("misc" = 1) data["misc"]++ @@ -454,7 +456,7 @@ M.adjustBruteLoss(-2, FALSE) M.adjustFireLoss(-2, FALSE) if(ishuman(M) && M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 3 + M.adjust_integration_blood(3) else // Will deal about 90 damage when 50 units are thrown M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) M.adjustToxLoss(2, FALSE) @@ -1144,7 +1146,7 @@ if((HAS_TRAIT(C, TRAIT_NOMARROW))) return if(C.blood_volume < (BLOOD_VOLUME_NORMAL*C.blood_ratio)) - C.blood_volume += 0.25 + C.adjust_integration_blood(0.25) ..() /datum/reagent/iron/reaction_mob(mob/living/M, method=TOUCH, reac_volume) @@ -2550,7 +2552,7 @@ M.adjustBruteLoss(-3, FALSE) M.adjustFireLoss(-3, FALSE) if(ishuman(M) && M.blood_volume < BLOOD_VOLUME_NORMAL) - M.blood_volume += 3 + M.adjust_integration_blood(3) else M.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 150) M.adjustToxLoss(2, FALSE) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index 0655faa1e8..7dd8cac452 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -827,7 +827,7 @@ if(prob(33)) // 1/3rd of the time, let's make it stack with the previous matrix! Mwhahahaha! for(var/whole_screen in screens) - var/obj/screen/plane_master/PM = whole_screen + var/atom/movable/screen/plane_master/PM = whole_screen newmatrix = skew * PM.transform for(var/whole_screen in screens) diff --git a/code/modules/reagents/chemistry/recipes.dm b/code/modules/reagents/chemistry/recipes.dm index 7df061c8aa..41c0ed717e 100644 --- a/code/modules/reagents/chemistry/recipes.dm +++ b/code/modules/reagents/chemistry/recipes.dm @@ -40,6 +40,7 @@ /datum/chemical_reaction/proc/on_reaction(datum/reagents/holder, multiplier, specialreact) + set waitfor = FALSE return //I recommend you set the result amount to the total volume of all components. diff --git a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm index 070d5cb269..2301473c48 100644 --- a/code/modules/reagents/chemistry/recipes/pyrotechnics.dm +++ b/code/modules/reagents/chemistry/recipes/pyrotechnics.dm @@ -72,7 +72,6 @@ R.stun(20) R.reveal(100) R.adjustHealth(50) - sleep(20) for(var/mob/living/carbon/C in get_hearers_in_view(round(multiplier/48,1),get_turf(holder.my_atom))) if(iscultist(C)) to_chat(C, "The divine explosion sears you!") @@ -433,20 +432,24 @@ var/T1 = multiplier * 20 //100 units : Zap 3 times, with powers 2000/5000/12000. Tesla revolvers have a power of 10000 for comparison. var/T2 = multiplier * 50 var/T3 = multiplier * 120 - sleep(5) + var/added_delay = 0.5 SECONDS if(multiplier >= 75) - tesla_zap(holder.my_atom, 7, T1, zap_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) - sleep(15) + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T1), added_delay) + added_delay += 1.5 SECONDS if(multiplier >= 40) - tesla_zap(holder.my_atom, 7, T2, zap_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) - sleep(15) + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T2), added_delay) + added_delay += 1.5 SECONDS if(multiplier >= 10) //10 units minimum for lightning, 40 units for secondary blast, 75 units for tertiary blast. - tesla_zap(holder.my_atom, 7, T3, zap_flags) - playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, 1) + addtimer(CALLBACK(src, .proc/zappy_zappy, holder, T3), added_delay) ..() + +/datum/chemical_reaction/reagent_explosion/teslium_lightning/proc/zappy_zappy(datum/reagents/holder, power) + if(QDELETED(holder.my_atom)) + return + tesla_zap(holder.my_atom, 7, power, zap_flags) + playsound(holder.my_atom, 'sound/machines/defib_zap.ogg', 50, TRUE) + /datum/chemical_reaction/reagent_explosion/teslium_lightning/heat id = "teslium_lightning2" required_temp = 474 diff --git a/code/modules/reagents/chemistry/recipes/slime_extracts.dm b/code/modules/reagents/chemistry/recipes/slime_extracts.dm index 1e78d81f24..fddff17a9d 100644 --- a/code/modules/reagents/chemistry/recipes/slime_extracts.dm +++ b/code/modules/reagents/chemistry/recipes/slime_extracts.dm @@ -3,6 +3,9 @@ var/deletes_extract = TRUE /datum/chemical_reaction/slime/on_reaction(datum/reagents/holder) + use_slime_core(holder) + +/datum/chemical_reaction/slime/proc/use_slime_core(datum/reagents/holder) SSblackbox.record_feedback("tally", "slime_cores_used", 1, "type") if(deletes_extract) delete_extract(holder) @@ -232,8 +235,7 @@ if(holder && holder.my_atom) var/turf/open/T = get_turf(holder.my_atom) if(istype(T)) - var/datum/gas/gastype = /datum/gas/nitrogen - T.atmos_spawn_air("[initial(gastype.id)]=50;TEMP=2.7") + T.atmos_spawn_air("n2=50;TEMP=2.7") /datum/chemical_reaction/slime/slimefireproof name = "Slime Fireproof" @@ -570,7 +572,9 @@ required_other = TRUE /datum/chemical_reaction/slime/slimestop/on_reaction(datum/reagents/holder) - sleep(50) + addtimer(CALLBACK(src, .proc/slime_stop, holder), 5 SECONDS) + +/datum/chemical_reaction/slime/slimestop/proc/slime_stop(datum/reagents/holder) var/obj/item/slime_extract/sepia/extract = holder.my_atom var/turf/T = get_turf(holder.my_atom) new /obj/effect/timestop(T, null, null, null) @@ -579,8 +583,7 @@ var/mob/lastheld = get_mob_by_key(holder.my_atom.fingerprintslast) if(lastheld && !lastheld.equip_to_slot_if_possible(extract, SLOT_HANDS, disable_warning = TRUE)) extract.forceMove(get_turf(lastheld)) - - ..() + use_slime_core(holder) /datum/chemical_reaction/slime/slimecamera name = "Slime Camera" diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index eb3b80b693..02c8a9802c 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -16,9 +16,10 @@ var/stream_mode = 0 //whether we use the more focused mode var/current_range = 3 //the range of tiles the sprayer will reach. var/spray_range = 3 //the range of tiles the sprayer will reach when in spray mode. - var/stream_range = 1 //the range of tiles the sprayer will reach when in stream mode. + var/stream_range = 3 //the range of tiles the sprayer will reach when in stream mode. var/stream_amount = 10 //the amount of reagents transfered when in stream mode. - var/spray_delay = 3 //The amount of sleep() delay between each chempuff step. + /// Amount of time it takes for a spray to completely travel. + var/spray_delay = 8 /// Last world.time of spray var/last_spray = 0 /// Spray cooldown @@ -72,58 +73,19 @@ if((last_spray + spray_cooldown) > world.time) return var/range = clamp(get_dist(src, A), 1, current_range) - var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src)) - D.create_reagents(amount_per_transfer_from_this, NONE, NO_REAGENTS_VALUE) - var/puff_reagent_left = range //how many turf, mob or dense objet we can react with before we consider the chem puff consumed - if(stream_mode) - reagents.trans_to(D, amount_per_transfer_from_this) - puff_reagent_left = 1 - else - reagents.trans_to(D, amount_per_transfer_from_this, 1/range) - D.color = mix_color_from_reagents(D.reagents.reagent_list) + var/wait_step = CEILING(spray_delay * INVERSE(range), world.tick_lag) + var/obj/effect/decal/chempuff/D = new /obj/effect/decal/chempuff(get_turf(src), stream_mode, wait_step, range, stream_mode? 1 : range, amount_per_transfer_from_this) var/turf/T = get_turf(src) if(!T) return log_reagent("SPRAY: [key_name(usr)] fired [src] ([REF(src)]) [COORD(T)] at [A] ([REF(A)]) [COORD(A)] (chempuff: [D.reagents.log_list()])") - var/wait_step = max(round(2+ spray_delay * INVERSE(range)), 2) + if(stream_mode) + reagents.trans_to(D, amount_per_transfer_from_this) + else + reagents.trans_to(D, amount_per_transfer_from_this, 1/range) + D.add_atom_colour(mix_color_from_reagents(D.reagents.reagent_list), TEMPORARY_COLOUR_PRIORITY) last_spray = world.time - INVOKE_ASYNC(src, .proc/do_spray, A, wait_step, D, range, puff_reagent_left) - return TRUE - -/obj/item/reagent_containers/spray/proc/do_spray(atom/A, wait_step, obj/effect/decal/chempuff/D, range, puff_reagent_left) - var/range_left = range - for(var/i=0, i 0 && (!stream_mode || !range_left)) - D.reagents.reaction(get_turf(D), VAPOR) - puff_reagent_left -= 1 - - if(puff_reagent_left <= 0) // we used all the puff so we delete it. - qdel(D) - return - qdel(D) + INVOKE_ASYNC(D, /obj/effect/decal/chempuff/proc/run_puff, A) /obj/item/reagent_containers/spray/attack_self(mob/user) stream_mode = !stream_mode @@ -207,7 +169,7 @@ righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' volume = 40 stream_range = 4 - spray_delay = 1 + spray_delay = 2 amount_per_transfer_from_this = 5 list_reagents = list(/datum/reagent/consumable/condensedcapsaicin = 40) diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index aefb670dd3..e9c17ecc28 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -268,16 +268,19 @@ GLOBAL_LIST_EMPTY(conveyors_by_id) // timed process // if the switch changed, update the linked conveyors -/obj/machinery/conveyor_switch/process() - if(!operated) - return - operated = 0 - +/obj/machinery/conveyor_switch/proc/do_process() + set waitfor = FALSE for(var/obj/machinery/conveyor/C in GLOB.conveyors_by_id[id]) C.operating = position C.update_move_direction() CHECK_TICK +/obj/machinery/conveyor_switch/process() + if(!operated) + return + operated = 0 + do_process() + // attack with hand, switch position /obj/machinery/conveyor_switch/interact(mob/user) add_fingerprint(user) diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index ef3a053027..7fc57ee3a7 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -401,12 +401,15 @@ //check for items in disposal - occupied light if(contents.len > 0) . += "dispover-full" + . += emissive_appearance(icon, "dispover-full", alpha = src.alpha) //charging and ready light if(pressure_charging) . += "dispover-charge" + . += emissive_appearance(icon, "dispover-charge-glow", alpha = src.alpha) else if(full_pressure) . += "dispover-ready" + . += emissive_appearance(icon, "dispover-ready-glow", alpha = src.alpha) /obj/machinery/disposal/bin/proc/do_flush() set waitfor = FALSE @@ -462,7 +465,7 @@ /obj/machinery/disposal/bin/get_remote_view_fullscreens(mob/user) if(user.stat == DEAD || !(user.sight & (SEEOBJS|SEEMOBS))) - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 2) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 2) //Delivery Chute diff --git a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm index 76b016e3de..67890838db 100644 --- a/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm +++ b/code/modules/research/designs/autolathe_desings/autolathe_designs_medical_and_dinnerware.dm @@ -184,10 +184,11 @@ /datum/design/syringe name = "Syringe" id = "syringe" - build_type = AUTOLATHE + build_type = AUTOLATHE | PROTOLATHE materials = list(/datum/material/iron = 10, /datum/material/glass = 20) build_path = /obj/item/reagent_containers/syringe - category = list("initial", "Medical") + category = list("initial", "Medical","Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/health_sensor name = "Health Sensor" diff --git a/code/modules/research/designs/medical_designs.dm b/code/modules/research/designs/medical_designs.dm index bb5989e5c6..88c37ce2a2 100644 --- a/code/modules/research/designs/medical_designs.dm +++ b/code/modules/research/designs/medical_designs.dm @@ -201,6 +201,15 @@ build_path = /obj/item/storage/hypospraykit // let's not summon new hyposprays thanks category = list("Medical Designs") departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/hypospray/mkii + name = "Hypospray Mk. II" + id = "hypospray_mkii" + build_type = PROTOLATHE + materials = list(/datum/material/iron = 1600, /datum/material/glass = 1000) + build_path = /obj/item/hypospray/mkii + category = list("Medical Designs") + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL /datum/design/blood_bag name = "Empty Blood Bag" diff --git a/code/modules/research/designs/misc_designs.dm b/code/modules/research/designs/misc_designs.dm index 7dfe19f635..630a3629cf 100644 --- a/code/modules/research/designs/misc_designs.dm +++ b/code/modules/research/designs/misc_designs.dm @@ -245,6 +245,36 @@ category = list("Equipment") departmental_flags = DEPARTMENTAL_FLAG_SERVICE +/datum/design/emptybottle + name = "Glass Bottle" + desc = "A small, empty bottle for storing liquids." + id = "emptyglassbottle" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 400) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank/small + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/largeemptybottle + name = "Large Glass Bottle" + desc = "A large, empty bottle for storing liquids." + id = "largeemptyglassbottle" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 2000) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/emptypitcher + name = "Pitcher" + desc = "A large Pitcher to hold vast amounts of liquid." + id = "emptypitcher" + build_type = PROTOLATHE + materials = list(/datum/material/glass = 3600) + build_path = /obj/item/reagent_containers/food/drinks/bottle/blank/pitcher + category = list("Equipment") + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + /datum/design/air_horn name = "Air Horn" desc = "Damn son, where'd you find this?" diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index 67af26e468..e6128ed5c2 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -362,14 +362,7 @@ else if(prob(EFFECT_PROB_MEDIUM-badThingCoeff)) visible_message("[src] malfunctions, melting [exp_on] and leaking hot air!") var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() - var/datum/gas_mixture/removed = env.remove(transfer_moles) - if(removed) - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature(min((removed.return_temperature()*heat_capacity + 100000)/heat_capacity, 1000)) - env.merge(removed) + env.adjust_heat(100000) air_update_turf() investigate_log("Experimentor has released hot air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) @@ -408,14 +401,7 @@ else if(prob(EFFECT_PROB_LOW-badThingCoeff)) visible_message("[src] malfunctions, shattering [exp_on] and leaking cold air!") var/datum/gas_mixture/env = loc.return_air() - var/transfer_moles = 0.25 * env.total_moles() - var/datum/gas_mixture/removed = env.remove(transfer_moles) - if(removed) - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature((removed.return_temperature()*heat_capacity - 75000)/heat_capacity) - env.merge(removed) + env.adjust_heat(-75000) air_update_turf() investigate_log("Experimentor has released cold air.", INVESTIGATE_EXPERIMENTOR) ejectItem(TRUE) diff --git a/code/modules/research/machinery/_production.dm b/code/modules/research/machinery/_production.dm index 319b4a2199..98b04a8382 100644 --- a/code/modules/research/machinery/_production.dm +++ b/code/modules/research/machinery/_production.dm @@ -42,6 +42,7 @@ return ..() /obj/machinery/rnd/production/proc/update_research() + set waitfor = FALSE host_research.copy_research_to(stored_research, TRUE) update_designs() diff --git a/code/modules/research/nanites/nanite_program_hub.dm b/code/modules/research/nanites/nanite_program_hub.dm index 85a117f53f..9a625cd0c7 100644 --- a/code/modules/research/nanites/nanite_program_hub.dm +++ b/code/modules/research/nanites/nanite_program_hub.dm @@ -28,11 +28,10 @@ /obj/machinery/nanite_program_hub/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return - SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_program_hub_on", EMISSIVE_LAYER, EMISSIVE_PLANE) + . += mutable_appearance(icon, "nanite_program_hub_on") + . += emissive_appearance(icon, "nanite_program_hub_on") /obj/machinery/nanite_program_hub/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) @@ -148,3 +147,7 @@ disk.program = null disk.name = initial(disk.name) . = TRUE + +/obj/machinery/nanite_program_hub/admin/Initialize() + . = ..() + linked_techweb = SSresearch.admin_tech diff --git a/code/modules/research/nanites/nanite_programmer.dm b/code/modules/research/nanites/nanite_programmer.dm index f23a44909c..d858063cb1 100644 --- a/code/modules/research/nanites/nanite_programmer.dm +++ b/code/modules/research/nanites/nanite_programmer.dm @@ -13,11 +13,10 @@ /obj/machinery/nanite_programmer/update_overlays() . = ..() - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if((stat & (NOPOWER|MAINT|BROKEN)) || panel_open) return - SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", layer, plane) - SSvis_overlays.add_vis_overlay(src, icon, "nanite_programmer_on", EMISSIVE_LAYER, EMISSIVE_PLANE) + . += mutable_appearance(icon, "nanite_programmer_on") + . += emissive_appearance(icon, "nanite_programmer_on") /obj/machinery/nanite_programmer/attackby(obj/item/I, mob/user) if(istype(I, /obj/item/disk/nanite_program)) diff --git a/code/modules/research/nanites/nanite_programs.dm b/code/modules/research/nanites/nanite_programs.dm index 4b6416ecb8..6a2c8bf4fd 100644 --- a/code/modules/research/nanites/nanite_programs.dm +++ b/code/modules/research/nanites/nanite_programs.dm @@ -292,7 +292,7 @@ switch(type) if(1) host_mob.investigate_log("[src] nanite program was deleted by software error.", INVESTIGATE_NANITES) - qdel(src) //kill switch + self_destruct() //kill switch return if(2) //deprogram codes if(corruptable) @@ -306,7 +306,7 @@ toggle() //enable/disable host_mob.investigate_log("[src] nanite program was toggled by software error.", INVESTIGATE_NANITES) if(4) - if(can_trigger) + if(error_flicking && can_trigger) host_mob.investigate_log("[src] nanite program was triggered by software error.", INVESTIGATE_NANITES) trigger() if(5) //Program is scrambled and does something different @@ -315,7 +315,7 @@ var/datum/nanite_program/rogue = new rogue_type host_mob.investigate_log("[src] nanite program was converted into [rogue.name] by software error.", INVESTIGATE_NANITES) nanites.add_program(null, rogue, src) - self_destruct(src) + self_destruct() /datum/nanite_program/proc/receive_signal(code, source) if(activation_code && code == activation_code && !activated) diff --git a/code/modules/research/nanites/nanite_programs/healing.dm b/code/modules/research/nanites/nanite_programs/healing.dm index 9274522553..81a837504a 100644 --- a/code/modules/research/nanites/nanite_programs/healing.dm +++ b/code/modules/research/nanites/nanite_programs/healing.dm @@ -109,7 +109,7 @@ /datum/nanite_program/blood_restoring/active_effect() if(iscarbon(host_mob)) var/mob/living/carbon/C = host_mob - C.blood_volume += 2 + C.adjust_integration_blood(2) /datum/nanite_program/repairing name = "Mechanical Repair" diff --git a/code/modules/research/nanites/nanite_programs/weapon.dm b/code/modules/research/nanites/nanite_programs/weapon.dm index 5c9754ec41..66f6c140f2 100644 --- a/code/modules/research/nanites/nanite_programs/weapon.dm +++ b/code/modules/research/nanites/nanite_programs/weapon.dm @@ -87,8 +87,11 @@ addtimer(CALLBACK(src, .proc/boom), clamp((nanites.nanite_volume * 0.35), 25, 150)) /datum/nanite_program/explosive/proc/boom() - dyn_explosion(get_turf(host_mob), nanites.nanite_volume / 50) - qdel(nanites) + var/nanite_amount = nanites.nanite_volume + var/heavy_range = FLOOR(nanite_amount/100, 1) - 1 + var/light_range = FLOOR(nanite_amount/50, 1) - 1 + explosion(host_mob, 0, heavy_range, light_range) + nanites.delete_nanites() //TODO make it defuse if triggered again diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 657d3b2e12..beb3561025 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -7,12 +7,11 @@ circuit = /obj/item/circuitboard/machine/rdserver var/datum/techweb/stored_research - var/heat_health = 100 //Code for point mining here. var/working = TRUE //temperature should break it. var/server_id = 0 var/base_mining_income = 2 - var/heat_gen = 100 + var/heat_gen = 1 var/heating_power = 40000 var/delay = 5 var/temp_tolerance_low = 0 @@ -32,7 +31,7 @@ var/tot_rating = 0 for(var/obj/item/stock_parts/SP in src) tot_rating += SP.rating - heat_gen /= max(1, tot_rating) + heat_gen = initial(src.heat_gen) / max(1, tot_rating) /obj/machinery/rnd/server/proc/refresh_working() if(stat & EMPED) @@ -56,31 +55,19 @@ . = base_mining_income var/penalty = max((get_env_temp() - temp_tolerance_high), 0) * temp_penalty_coefficient . = max(. - penalty, 0) + produce_heat(. / base_mining_income) /obj/machinery/rnd/server/proc/get_env_temp() var/datum/gas_mixture/environment = loc.return_air() return environment.return_temperature() -/obj/machinery/rnd/server/proc/produce_heat(heat_amt) +/obj/machinery/rnd/server/proc/produce_heat(perc) if(!(stat & (NOPOWER|BROKEN))) //Blatently stolen from space heater. var/turf/L = loc if(istype(L)) var/datum/gas_mixture/env = L.return_air() - if(env.return_temperature() < (heat_amt+T0C)) - - var/transfer_moles = 0.25 * env.total_moles() - - var/datum/gas_mixture/removed = env.remove(transfer_moles) - - if(removed) - - var/heat_capacity = removed.heat_capacity() - if(heat_capacity == 0 || heat_capacity == null) - heat_capacity = 1 - removed.set_temperature(min((removed.return_temperature()*heat_capacity + heating_power)/heat_capacity, 1000)) - - env.merge(removed) - air_update_turf() + env.adjust_heat(heating_power * perc * heat_gen) + air_update_turf() /proc/fix_noid_research_servers() var/list/no_id_servers = list() diff --git a/code/modules/research/techweb/_techweb_node.dm b/code/modules/research/techweb/_techweb_node.dm index c7c2e7ef10..8c91c09abb 100644 --- a/code/modules/research/techweb/_techweb_node.dm +++ b/code/modules/research/techweb/_techweb_node.dm @@ -104,6 +104,6 @@ // Default research tech, prevents bricking design_ids = list("basic_matter_bin", "basic_cell", "basic_scanning", "basic_capacitor", "basic_micro_laser", "micro_mani", "desttagger", "handlabel", "packagewrap", "destructive_analyzer", "circuit_imprinter", "experimentor", "rdconsole", "bepis", "design_disk", "tech_disk", "rdserver", "rdservercontrol", "mechfab", "paystand", - "space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", + "space_heater", "beaker", "large_beaker", "xlarge_beaker", "bucket", "hypovial", "large_hypovial", "syringe", "pillbottle", "sec_shellclip", "sec_beanbag", "sec_rshot", "sec_bshot", "sec_slug", "sec_islug", "sec_dart", "sec_38", "sec_38lethal", "rglass","plasteel","plastitanium","plasmaglass","plasmareinforcedglass","titaniumglass","plastitaniumglass") diff --git a/code/modules/research/techweb/nodes/bepis_nodes.dm b/code/modules/research/techweb/nodes/bepis_nodes.dm index 41d3a08d64..fa17d62e50 100644 --- a/code/modules/research/techweb/nodes/bepis_nodes.dm +++ b/code/modules/research/techweb/nodes/bepis_nodes.dm @@ -55,7 +55,7 @@ display_name = "Nanite Replication Protocols" description = "Advanced behaviours that allow nanites to exploit certain circumstances to replicate faster." prereq_ids = list("nanite_smart") - design_ids = list("kickstart_nanites","factory_nanites","tinker_nanites","offline_nanites","synergy_nanites") + design_ids = list("kickstart_nanites","factory_nanites","offline_nanites","synergy_nanites") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) hidden = TRUE experimental = TRUE diff --git a/code/modules/research/techweb/nodes/biotech_nodes.dm b/code/modules/research/techweb/nodes/biotech_nodes.dm index d4f0a4b913..350bbaa5c3 100644 --- a/code/modules/research/techweb/nodes/biotech_nodes.dm +++ b/code/modules/research/techweb/nodes/biotech_nodes.dm @@ -13,7 +13,7 @@ display_name = "Advanced Biotechnology" description = "Advanced Biotechnology" prereq_ids = list("biotech") - design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "containmentbodybag") + design_ids = list("piercesyringe", "crewpinpointer", "smoke_machine", "plasmarefiller", "limbgrower", "meta_beaker", "healthanalyzer_advanced", "harvester", "holobarrier_med", "defibrillator_compact", "smartdartgun", "medicinalsmartdart", "pHmeter", "hypospray_mkii", "containmentbodybag") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) /datum/techweb_node/bio_process diff --git a/code/modules/research/techweb/nodes/export_nodes.dm b/code/modules/research/techweb/nodes/export_nodes.dm index cbdedef113..5259fc1bfa 100644 --- a/code/modules/research/techweb/nodes/export_nodes.dm +++ b/code/modules/research/techweb/nodes/export_nodes.dm @@ -14,8 +14,8 @@ /datum/techweb_node/bottle_exports id = "bottle_exports" - display_name = "Legal Bottling" + display_name = "Advanced Bottling" prereq_ids = list("blueprinted_bottles") - description = "New bottles for printing and selling." - design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad") + description = "New bottles for printing, storage and selling." + design_ids = list("minikeg", "blooddrop", "slim_gold", "white_bloodmoon", "greenroad", "emptyglassbottle", "largeemptyglassbottle", "emptypitcher") research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 250) diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index f3e14993ed..0c34a251ae 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -1,4 +1,4 @@ -/obj/screen/alert/status_effect/rainbow_protection +/atom/movable/screen/alert/status_effect/rainbow_protection name = "Rainbow Protection" desc = "You are defended from harm, but so are those you might seek to injure!" icon_state = "slime_rainbowshield" @@ -6,7 +6,7 @@ /datum/status_effect/rainbow_protection id = "rainbow_protection" duration = 100 - alert_type = /obj/screen/alert/status_effect/rainbow_protection + alert_type = /atom/movable/screen/alert/status_effect/rainbow_protection var/originalcolor /datum/status_effect/rainbow_protection/on_apply() @@ -29,7 +29,7 @@ "You no longer feel protected...") return ..() -/obj/screen/alert/status_effect/slimeskin +/atom/movable/screen/alert/status_effect/slimeskin name = "Adamantine Slimeskin" desc = "You are covered in a thick, non-neutonian gel." icon_state = "slime_stoneskin" @@ -37,7 +37,7 @@ /datum/status_effect/slimeskin id = "slimeskin" duration = 300 - alert_type = /obj/screen/alert/status_effect/slimeskin + alert_type = /atom/movable/screen/alert/status_effect/slimeskin var/originalcolor /datum/status_effect/slimeskin/on_apply() @@ -91,14 +91,14 @@ owner.forceMove(target.loc) return ..() -/obj/screen/alert/status_effect/freon/stasis +/atom/movable/screen/alert/status_effect/freon/stasis desc = "You're frozen inside of a protective ice cube! While inside, you can't do anything, but are immune to harm! Resist to get out." /datum/status_effect/frozenstasis id = "slime_frozen" status_type = STATUS_EFFECT_UNIQUE duration = -1 //Will remove self when block breaks. - alert_type = /obj/screen/alert/status_effect/freon/stasis + alert_type = /atom/movable/screen/alert/status_effect/freon/stasis var/obj/structure/ice_stasis/cube /datum/status_effect/frozenstasis/on_apply() @@ -162,7 +162,7 @@ qdel(clone) return ..() -/obj/screen/alert/status_effect/clone_decay +/atom/movable/screen/alert/status_effect/clone_decay name = "Clone Decay" desc = "You are simply a construct, and cannot maintain this form forever. You will be returned to your original body if you should fall." icon_state = "slime_clonedecay" @@ -171,7 +171,7 @@ id = "slime_clonedecay" status_type = STATUS_EFFECT_UNIQUE duration = -1 - alert_type = /obj/screen/alert/status_effect/clone_decay + alert_type = /atom/movable/screen/alert/status_effect/clone_decay /datum/status_effect/slime_clone_decay/tick() owner.adjustToxLoss(1, 0) @@ -180,7 +180,7 @@ owner.adjustFireLoss(1, 0) owner.color = "#007BA7" -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -188,7 +188,7 @@ /datum/status_effect/bloodchill id = "bloodchill" duration = 100 - alert_type = /obj/screen/alert/status_effect/bloodchill + alert_type = /atom/movable/screen/alert/status_effect/bloodchill /datum/status_effect/bloodchill/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) @@ -202,7 +202,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bloodchill) return ..() -/obj/screen/alert/status_effect/bloodchill +/atom/movable/screen/alert/status_effect/bloodchill name = "Bloodchilled" desc = "You feel a shiver down your spine after getting hit with a glob of cold blood. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -210,7 +210,7 @@ /datum/status_effect/bonechill id = "bonechill" duration = 80 - alert_type = /obj/screen/alert/status_effect/bonechill + alert_type = /atom/movable/screen/alert/status_effect/bonechill /datum/status_effect/bonechill/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) @@ -226,7 +226,7 @@ owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/bonechill) return ..() -/obj/screen/alert/status_effect/bonechill +/atom/movable/screen/alert/status_effect/bonechill name = "Bonechilled" desc = "You feel a shiver down your spine after hearing the haunting noise of bone rattling. You'll move slower and get frostbite for a while!" icon_state = "bloodchill" @@ -622,7 +622,9 @@ var/obj/O = owner.get_active_held_item() if(O) O.extinguish() //All shamelessly copied from water's reaction_obj, since I didn't seem to be able to get it here for some reason. - O.acid_level = 0 + var/datum/component/acid/acid = O.GetComponent(/datum/component/acid) + if(acid) + acid.level = 0 // Monkey cube if(istype(O, /obj/item/reagent_containers/food/snacks/cube)) to_chat(owner, "[linked_extract] kept your hands wet! It makes [O] expand!") @@ -659,7 +661,7 @@ return ..() //Bluespace has an icon because it's kinda active. -/obj/screen/alert/status_effect/bluespaceslime +/atom/movable/screen/alert/status_effect/bluespaceslime name = "Stabilized Bluespace Extract" desc = "You shouldn't see this, since we set it to change automatically!" icon_state = "slime_bluespace_on" @@ -672,7 +674,7 @@ /datum/status_effect/stabilized/bluespace id = "stabilizedbluespace" colour = "bluespace" - alert_type = /obj/screen/alert/status_effect/bluespaceslime + alert_type = /atom/movable/screen/alert/status_effect/bluespaceslime var/healthcheck /datum/status_effect/stabilized/bluespace/tick() @@ -702,16 +704,20 @@ /datum/status_effect/stabilized/sepia id = "stabilizedsepia" colour = "sepia" - var/mod = 0 + var/list/possible = list( + -0.5, + -0.25, + 0, + 0.5, + 1 + ) + +/datum/status_effect/stabilized/sepia/New(list/arguments) + . = ..() + possible = typelist(NAMEOF(src, possible), possible) /datum/status_effect/stabilized/sepia/tick() - if(prob(50) && mod > -1) - mod-- - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 1) - else if(mod < 1) - mod++ - // yeah a value of 0 does nothing but replacing the trait in place is cheaper than removing and adding repeatedly - owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = 0) + owner.add_or_update_variable_movespeed_modifier(/datum/movespeed_modifier/status_effect/sepia, multiplicative_slowdown = safepick(possible)) return ..() /datum/status_effect/stabilized/sepia/on_remove() @@ -932,6 +938,7 @@ /datum/status_effect/stabilized/lightpink/on_apply() ADD_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/slime/light_pink) return ..() /datum/status_effect/stabilized/lightpink/tick() @@ -943,6 +950,7 @@ /datum/status_effect/stabilized/lightpink/on_remove() REMOVE_TRAIT(owner, TRAIT_FREESPRINT, "stabilized_slime") + owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/slime/light_pink) return ..() /datum/status_effect/stabilized/adamantine diff --git a/code/modules/research/xenobiology/crossbreeding/chilling.dm b/code/modules/research/xenobiology/crossbreeding/chilling.dm index 5325680588..d117e6104c 100644 --- a/code/modules/research/xenobiology/crossbreeding/chilling.dm +++ b/code/modules/research/xenobiology/crossbreeding/chilling.dm @@ -100,7 +100,7 @@ Chilling extracts: for(var/turf/open/T in A) var/datum/gas_mixture/G = T.air if(istype(G)) - G.set_moles(/datum/gas/plasma, 0) + G.set_moles(GAS_PLASMA, 0) filtered = TRUE T.air_update_turf() if(filtered) diff --git a/code/modules/research/xenobiology/crossbreeding/consuming.dm b/code/modules/research/xenobiology/crossbreeding/consuming.dm index af37a70232..8d80613be4 100644 --- a/code/modules/research/xenobiology/crossbreeding/consuming.dm +++ b/code/modules/research/xenobiology/crossbreeding/consuming.dm @@ -322,7 +322,7 @@ Consuming extracts: playsound(get_turf(M), 'sound/effects/splat.ogg', 10, 1) if(iscarbon(M)) var/mob/living/carbon/C = M - C.blood_volume += 25 //Half a vampire drain. + C.adjust_integration_blood(25) //Half a vampire drain. /obj/item/slimecross/consuming/green colour = "green" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index a8cefd9bed..70cd28718c 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -187,7 +187,7 @@ switch(activation_type) if(SLIME_ACTIVATE_MINOR) user.adjust_nutrition(50) - user.blood_volume += 50 + user.adjust_integration_blood(50) to_chat(user, "You activate [src], and your body is refilled with fresh slime jelly!") return 150 diff --git a/code/modules/ruins/spaceruin_code/caravanambush.dm b/code/modules/ruins/spaceruin_code/caravanambush.dm index 740850524c..ab38ed8e4d 100644 --- a/code/modules/ruins/spaceruin_code/caravanambush.dm +++ b/code/modules/ruins/spaceruin_code/caravanambush.dm @@ -1,27 +1,27 @@ //caravan ambush /obj/item/wrench/caravan - color = "#ff0000" + icon_state = "wrench_caravan" desc = "A prototype of a new wrench design, allegedly the red color scheme makes it go faster." name = "experimental wrench" toolspeed = 0.3 /obj/item/screwdriver/caravan - color = "#ff0000" + icon_state = "screwdriver_caravan" desc = "A prototype of a new screwdriver design, allegedly the red color scheme makes it go faster." name = "experimental screwdriver" toolspeed = 0.3 random_color = FALSE /obj/item/wirecutters/caravan - color = "#ff0000" + icon_state = "cutters_caravan" desc = "A prototype of a new wirecutter design, allegedly the red color scheme makes it go faster." name = "experimental wirecutters" toolspeed = 0.3 random_color = FALSE /obj/item/crowbar/red/caravan - color = "#ff0000" + icon_state = "crowbar_caravan" desc = "A prototype of a new crowbar design, allegedly the red color scheme makes it go faster." name = "experimental crowbar" toolspeed = 0.3 diff --git a/code/modules/ruins/spaceruin_code/hilbertshotel.dm b/code/modules/ruins/spaceruin_code/hilbertshotel.dm index 66872ae818..7109c87999 100644 --- a/code/modules/ruins/spaceruin_code/hilbertshotel.dm +++ b/code/modules/ruins/spaceruin_code/hilbertshotel.dm @@ -302,7 +302,7 @@ GLOBAL_VAR_INIT(hhmysteryRoomNumber, 1337) user.reset_perspective(parentSphere) user.set_machine(src) var/datum/action/peepholeCancel/PHC = new - user.overlay_fullscreen("remote_view", /obj/screen/fullscreen/impaired, 1) + user.overlay_fullscreen("remote_view", /atom/movable/screen/fullscreen/impaired, 1) PHC.Grant(user) return TRUE diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm index 7295ab2832..5c96bca07c 100644 --- a/code/modules/shuttle/docking.dm +++ b/code/modules/shuttle/docking.dm @@ -205,3 +205,9 @@ var/turf/oldT = moved_atoms[moved_object] moved_object.lateShuttleMove(oldT, movement_force, movement_direction) +/obj/docking_port/mobile/proc/reset_air() + var/list/turfs = return_ordered_turfs(x, y, z, dir) + for(var/i in 1 to length(turfs)) + var/turf/open/T = turfs[i] + if(istype(T)) + T.air.copy_from_turf(T) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index 36abcb41dc..a215b58b55 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -356,7 +356,7 @@ playsound(console, 'sound/machines/terminal_prompt_confirm.ogg', 25, 0) remote_eye.setLoc(T) to_chat(target, "Jumped to [selected]") - C.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) + C.overlay_fullscreen("flash", /atom/movable/screen/fullscreen/flash/static) C.clear_fullscreen("flash", 3) else playsound(console, 'sound/machines/terminal_prompt_deny.ogg', 25, 0) diff --git a/code/modules/smithing/finished_items.dm b/code/modules/smithing/finished_items.dm index 20eaee8a08..27be8c034d 100644 --- a/code/modules/smithing/finished_items.dm +++ b/code/modules/smithing/finished_items.dm @@ -209,7 +209,7 @@ parry_time_perfect = 2 parry_time_perfect_leeway = 0.75 parry_imperfect_falloff_percent = 7.5 - parry_efficiency_to_counterattack = 100 + parry_efficiency_to_counterattack = INFINITY parry_efficiency_considered_successful = 80 parry_efficiency_perfect = 120 parry_failed_stagger_duration = 3 SECONDS @@ -266,14 +266,15 @@ parry_time_perfect = 2 parry_time_perfect_leeway = 2 parry_failed_stagger_duration = 3 SECONDS - parry_failed_clickcd_duration = 3 SECONDS parry_time_windup = 0 parry_time_spindown = 0 parry_imperfect_falloff_percent = 0 - parry_efficiency_to_counterattack = 100 + parry_efficiency_to_counterattack = INFINITY parry_efficiency_considered_successful = 120 parry_efficiency_perfect = 120 parry_data = list(PARRY_COUNTERATTACK_MELEE_ATTACK_CHAIN = 4) + parry_automatic_enabled = TRUE + autoparry_single_efficiency = 75 //unique hammers /obj/item/melee/smith/hammer/toolbox diff --git a/code/modules/spells/spell_types/aimed.dm b/code/modules/spells/spell_types/aimed.dm index 8fab4a221d..aa2a2e4083 100644 --- a/code/modules/spells/spell_types/aimed.dm +++ b/code/modules/spells/spell_types/aimed.dm @@ -4,7 +4,7 @@ var/projectile_type = /obj/item/projectile/magic/teleport var/deactive_msg = "You discharge your projectile..." var/active_msg = "You charge your projectile!" - var/base_icon_state = "projectile" + base_icon_state = "projectile" var/active_icon_state = "projectile" var/list/projectile_var_overrides = list() var/projectile_amount = 1 //Projectiles per cast. diff --git a/code/modules/station_goals/dna_vault.dm b/code/modules/station_goals/dna_vault.dm index b13c2df770..b68a289e85 100644 --- a/code/modules/station_goals/dna_vault.dm +++ b/code/modules/station_goals/dna_vault.dm @@ -254,8 +254,7 @@ to_chat(H, "You feel resistant to airborne toxins.") if(locate(/obj/item/organ/lungs) in H.internal_organs) var/obj/item/organ/lungs/L = H.internal_organs_slot[ORGAN_SLOT_LUNGS] - L.tox_breath_dam_min = 0 - L.tox_breath_dam_max = 0 + L.gas_max -= GAS_PLASMA ADD_TRAIT(H, TRAIT_VIRUSIMMUNE, "dna_vault") if(VAULT_NOBREATH) to_chat(H, "Your lungs feel great.") diff --git a/code/modules/surgery/advanced/revival.dm b/code/modules/surgery/advanced/revival.dm index 0b864958a0..945dee48e7 100644 --- a/code/modules/surgery/advanced/revival.dm +++ b/code/modules/surgery/advanced/revival.dm @@ -25,7 +25,7 @@ return TRUE /datum/surgery_step/revive name = "electrically stimulate brain" - implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) + implements = list(/obj/item/shockpaddles = 100, /obj/item/abductor/gizmo = 100, /obj/item/rod_of_asclepius = 100, /obj/item/melee/baton = 75, /obj/item/organ/cyberimp/arm/baton = 75, /obj/item/organ/cyberimp/arm/gun/taser = 60, /obj/item/gun/energy/e_gun/advtaser = 60, /obj/item/gun/energy/taser = 60) time = 120 /datum/surgery_step/revive/tool_check(mob/user, obj/item/tool) . = TRUE @@ -69,7 +69,7 @@ for(var/obj/item/organ/O in target.internal_organs)//zap those buggers back to life! if(O.organ_flags & ORGAN_FAILING) O.applyOrganDamage(-5) - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index d595c494b5..6f95fd0f8d 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -32,6 +32,8 @@ var/max_stamina_damage = 0 var/incoming_stam_mult = 1 //Multiplier for incoming staminaloss, decreases when taking staminaloss when the limb is disabled, resets back to 1 when limb is no longer disabled. var/max_damage = 0 + /// Threshold at which we are disabled. Defaults to max_damage if unset. + var/disable_threshold var/stam_heal_tick = 0 //per Life(). Defaults to 0 due to citadel changes var/brute_reduction = 0 //Subtracted to brute damage taken @@ -186,7 +188,7 @@ needs_processing = . //Return TRUE to get whatever mob this is in to update health. -/obj/item/bodypart/proc/on_life() +/obj/item/bodypart/proc/on_life(seconds, times_fired) if(stam_heal_tick && stamina_dam > DAMAGE_PRECISION) //DO NOT update health here, it'll be done in the carbon's life. if(heal_damage(brute = 0, burn = 0, stamina = (stam_heal_tick * (disabled ? 2 : 1)), only_robotic = FALSE, only_organic = FALSE, updating_health = FALSE)) . |= BODYPART_LIFE_UPDATE_HEALTH @@ -505,6 +507,12 @@ return set_disabled(is_disabled(silent), silent) +/** + * Gets the damage at which point we're disabled. + */ +/obj/item/bodypart/proc/get_disable_threshold() + return isnull(disable_threshold)? max_damage : disable_threshold + /obj/item/bodypart/proc/is_disabled(silent = FALSE) if(!owner) return @@ -514,15 +522,16 @@ var/datum/wound/W = i if(W.disabling) return BODYPART_DISABLED_WOUND + var/disable_threshold = get_disable_threshold() if(can_dismember() && !HAS_TRAIT(owner, TRAIT_NODISMEMBER)) . = disabled //inertia, to avoid limbs healing 0.1 damage and being re-enabled - if(get_damage(TRUE) >= max_damage * (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) ? 0.6 : 1)) //Easy limb disable disables the limb at 40% health instead of 0% + if(get_damage(TRUE) >= disable_threshold * (HAS_TRAIT(owner, TRAIT_EASYLIMBDISABLE) ? 0.6 : 1)) //Easy limb disable disables the limb at 40% health instead of 0% if(!last_maxed && !silent) owner.emote("scream") last_maxed = TRUE - if(!is_organic_limb(FALSE) || stamina_dam >= max_damage) + if(!is_organic_limb(FALSE) || stamina_dam >= disable_threshold) return BODYPART_DISABLED_DAMAGE - else if(disabled && (get_damage(TRUE) <= (max_damage * 0.8))) // reenabled at 80% now instead of 50% as of wounds update + else if(disabled && (get_damage(TRUE) <= (disable_threshold * 0.8))) // reenabled at 80% now instead of 50% as of wounds update last_maxed = FALSE return BODYPART_NOT_DISABLED else @@ -783,6 +792,7 @@ . += image(marking_list[1], "[marking_list[2]]_[digitigrade_type]_[use_digitigrade]_[body_zone]", -MARKING_LAYER, image_dir) var/image/limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + var/image/second_limb var/list/aux = list() var/list/auxmarking = list() @@ -816,6 +826,11 @@ else limb.icon_state = "[species_id]_[body_zone]" + if(istype(src, /obj/item/bodypart/l_leg) || istype(src, /obj/item/bodypart/r_leg)) + second_limb = image(layer = -BODYPARTS_LAYER, dir = image_dir) + second_limb.icon = limb.icon + . += second_limb + // Body markings if(length(body_markings_list)) if(species_id == "husk") @@ -904,7 +919,8 @@ draw_color = "#[draw_color]" if(draw_color) if(grayscale) - limb.icon_state += "_g" + if(!second_limb) + limb.icon_state += "_g" limb.color = draw_color if(aux_icons) for(var/a in aux) @@ -922,6 +938,12 @@ for(var/image/marking in markings_list) marking.color = "#141414" + if(second_limb) + var/original_state = limb.icon_state + limb.icon_state = "[original_state]_front" + second_limb.icon_state = "[original_state]_behind" + second_limb.color = limb.color + /obj/item/bodypart/deconstruct(disassembled = TRUE) drop_organs() qdel(src) diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 88b6f0f662..6b5b4a14aa 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -237,7 +237,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = C.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() if(C.gloves) @@ -255,7 +255,7 @@ C.handcuffed = null C.update_handcuffed() if(C.hud_used) - var/obj/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = C.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() if(C.gloves) @@ -340,7 +340,7 @@ if(C.dna.species.mutanthands && !is_pseudopart) C.put_in_hand(new C.dna.species.mutanthands(), held_index) if(C.hud_used) - var/obj/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/hand = C.hud_used.hand_slots["[held_index]"] if(hand) hand.update_icon() C.update_inv_gloves() diff --git a/code/modules/surgery/bodyparts/parts.dm b/code/modules/surgery/bodyparts/parts.dm index 86288564ae..3a08a764d3 100644 --- a/code/modules/surgery/bodyparts/parts.dm +++ b/code/modules/surgery/bodyparts/parts.dm @@ -59,12 +59,13 @@ one though." icon_state = "default_human_l_arm" attack_verb = list("slapped", "punched") - max_damage = 50 + max_damage = 150 + disable_threshold = 75 max_stamina_damage = 50 body_zone = BODY_ZONE_L_ARM body_part = ARM_LEFT aux_icons = list(BODY_ZONE_PRECISE_L_HAND = HANDS_PART_LAYER, "l_hand_behind" = BODY_BEHIND_LAYER) - body_damage_coeff = 0.75 + body_damage_coeff = 0.25 held_index = 1 px_x = -6 px_y = 0 @@ -89,7 +90,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/L = owner.hud_used.hand_slots["[held_index]"] if(L) L.update_icon() @@ -120,11 +121,12 @@ among humans missing their right arm." icon_state = "default_human_r_arm" attack_verb = list("slapped", "punched") - max_damage = 50 + max_damage = 150 + disable_threshold = 75 body_zone = BODY_ZONE_R_ARM body_part = ARM_RIGHT aux_icons = list(BODY_ZONE_PRECISE_R_HAND = HANDS_PART_LAYER, "r_hand_behind" = BODY_BEHIND_LAYER) - body_damage_coeff = 0.75 + body_damage_coeff = 0.25 held_index = 2 px_x = 6 px_y = 0 @@ -150,7 +152,7 @@ if(held_index) owner.dropItemToGround(owner.get_item_for_held_index(held_index)) if(owner.hud_used) - var/obj/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] + var/atom/movable/screen/inventory/hand/R = owner.hud_used.hand_slots["[held_index]"] if(R) R.update_icon() @@ -182,10 +184,11 @@ luck. In this instance, it probably would not have helped." icon_state = "default_human_l_leg" attack_verb = list("kicked", "stomped") - max_damage = 50 + max_damage = 150 + disable_threshold = 75 body_zone = BODY_ZONE_L_LEG body_part = LEG_LEFT - body_damage_coeff = 0.75 + body_damage_coeff = 0.25 px_x = -2 px_y = 12 stam_heal_tick = STAM_RECOVERY_LIMB @@ -240,10 +243,11 @@ // alternative spellings of 'pokey' are availible icon_state = "default_human_r_leg" attack_verb = list("kicked", "stomped") - max_damage = 50 + max_damage = 150 + disable_threshold = 75 body_zone = BODY_ZONE_R_LEG body_part = LEG_RIGHT - body_damage_coeff = 0.75 + body_damage_coeff = 0.25 px_x = 2 px_y = 12 max_stamina_damage = 50 diff --git a/code/modules/surgery/emergency_reboot.dm b/code/modules/surgery/emergency_reboot.dm index 046edd884c..5023480b51 100644 --- a/code/modules/surgery/emergency_reboot.dm +++ b/code/modules/surgery/emergency_reboot.dm @@ -42,7 +42,7 @@ if(target.revive()) target.visible_message("...[target]'s posibrain flickers to life once again!") target.emote("ping") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds var/late = timelimit && (tplus > timelimit) var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT] diff --git a/code/modules/surgery/organs/augments_chest.dm b/code/modules/surgery/organs/augments_chest.dm index ea8c188346..e1b198ade2 100644 --- a/code/modules/surgery/organs/augments_chest.dm +++ b/code/modules/surgery/organs/augments_chest.dm @@ -210,13 +210,9 @@ // Priority 3: use internals tank. var/obj/item/tank/I = owner.internal - if(I && I.air_contents && I.air_contents.total_moles() > num) - var/datum/gas_mixture/removed = I.air_contents.remove(num) - if(removed.total_moles() > 0.005) - T.assume_air(removed) - return 1 - else - T.assume_air(removed) + if(I && I.air_contents && I.air_contents.total_moles() >= num) + T.assume_air_moles(I.air_contents, num) + return 1 toggle(silent = TRUE) return 0 diff --git a/code/modules/surgery/organs/eyes.dm b/code/modules/surgery/organs/eyes.dm index 09f0a901a3..9861a1b639 100644 --- a/code/modules/surgery/organs/eyes.dm +++ b/code/modules/surgery/organs/eyes.dm @@ -41,7 +41,7 @@ return switch(eye_damaged) if(BLURRY_VISION_ONE, BLURRY_VISION_TWO) - owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged) if(BLIND_VISION_THREE) owner.become_blind(EYE_DAMAGE) if(ishuman(owner)) @@ -106,7 +106,7 @@ else if(eye_damaged == BLIND_VISION_THREE) owner.become_blind(EYE_DAMAGE) if(eye_damaged && eye_damaged != BLIND_VISION_THREE) - owner.overlay_fullscreen("eye_damage", /obj/screen/fullscreen/impaired, eye_damaged) + owner.overlay_fullscreen("eye_damage", /atom/movable/screen/fullscreen/impaired, eye_damaged) else owner.clear_fullscreen("eye_damage") diff --git a/code/modules/surgery/organs/liver.dm b/code/modules/surgery/organs/liver.dm index 2037547d36..5c6b66f702 100755 --- a/code/modules/surgery/organs/liver.dm +++ b/code/modules/surgery/organs/liver.dm @@ -25,7 +25,7 @@ var/cachedmoveCalc = 1 food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/iron = 5) -/obj/item/organ/liver/on_life() +/obj/item/organ/liver/on_life(seconds, times_fired) . = ..() if(!. || !owner)//can't process reagents with a failing liver return @@ -40,7 +40,7 @@ damage += (thisamount*toxLethality) //metabolize reagents - owner.reagents.metabolize(owner, can_overdose=TRUE) + owner.reagents.metabolize(owner, seconds, times_fired, can_overdose=TRUE) if(damage > 10 && prob(damage/3))//the higher the damage the higher the probability to_chat(owner, "You feel a dull pain in your abdomen.") diff --git a/code/modules/surgery/organs/lungs.dm b/code/modules/surgery/organs/lungs.dm index c94fb16add..93f88192e5 100644 --- a/code/modules/surgery/organs/lungs.dm +++ b/code/modules/surgery/organs/lungs.dm @@ -27,40 +27,36 @@ food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/medicine/salbutamol = 5) //Breath damage + var/breathing_class = BREATH_OXY // can be a gas instead of a breathing class + var/safe_breath_min = 16 + var/safe_breath_max = 50 + var/safe_breath_dam_min = MIN_TOXIC_GAS_DAMAGE + var/safe_breath_dam_max = MAX_TOXIC_GAS_DAMAGE + var/safe_damage_type = OXY + var/list/gas_min = list() + var/list/gas_max = list( + GAS_CO2 = 30, // Yes it's an arbitrary value who cares? + GAS_METHYL_BROMIDE = 1, + GAS_PLASMA = MOLES_GAS_VISIBLE + ) + var/list/gas_damage = list( + "default" = list( + min = MIN_TOXIC_GAS_DAMAGE, + max = MAX_TOXIC_GAS_DAMAGE, + damage_type = OXY + ), + GAS_PLASMA = list( + min = MIN_TOXIC_GAS_DAMAGE, + max = MAX_TOXIC_GAS_DAMAGE, + damage_type = TOX + ) + ) - var/safe_oxygen_min = 16 // Minimum safe partial pressure of O2, in kPa - var/safe_oxygen_max = 50 // Too much of a good thing, in kPa as well. - var/safe_nitro_min = 0 - var/safe_nitro_max = 0 - var/safe_co2_min = 0 - var/safe_co2_max = 10 // Yes it's an arbitrary value who cares? - var/safe_toxins_min = 0 - var/safe_toxins_max = MOLES_GAS_VISIBLE - var/safe_ch3br_min = 0 - var/safe_ch3br_max = 1 //problematic even at low concentrations - var/safe_methane_min = 0 - var/safe_methane_max = 0 - var/SA_para_min = 1 //Sleeping agent - var/SA_sleep_min = 5 //Sleeping agent + var/SA_para_min = 1 //nitrous values + var/SA_sleep_min = 5 var/BZ_trip_balls_min = 1 //BZ gas var/gas_stimulation_min = 0.002 //Nitryl and Stimulum - var/oxy_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/oxy_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/oxy_damage_type = OXY - var/nitro_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/nitro_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/nitro_damage_type = OXY - var/co2_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/co2_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/co2_damage_type = OXY - var/tox_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/tox_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/tox_damage_type = TOX - var/methane_breath_dam_min = MIN_TOXIC_GAS_DAMAGE - var/methane_breath_dam_max = MAX_TOXIC_GAS_DAMAGE - var/methane_damage_type = OXY - var/cold_message = "your face freezing and an icicle forming" var/cold_level_1_threshold = 260 var/cold_level_2_threshold = 200 @@ -81,7 +77,18 @@ var/crit_stabilizing_reagent = /datum/reagent/medicine/epinephrine +/obj/item/organ/lungs/New() + . = ..() + populate_gas_info() +/obj/item/organ/lungs/proc/populate_gas_info() + gas_min[breathing_class] = safe_breath_min + gas_max[breathing_class] = safe_breath_max + gas_damage[breathing_class] = list( + min = safe_breath_dam_min, + max = safe_breath_dam_max, + damage_type = safe_damage_type + ) //TODO: lung health affects lung function /obj/item/organ/lungs/onDamage(damage_mod) //damage might be too low atm. @@ -128,227 +135,126 @@ H.adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS) H.failed_last_breath = TRUE - if(safe_oxygen_min) - H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - else if(safe_toxins_min) - H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) - else if(safe_co2_min) - H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - else if(safe_nitro_min) - H.throw_alert("not_enough_nitro", /obj/screen/alert/not_enough_nitro) - else if(safe_ch3br_min) - H.throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) + var/alert_category + var/alert_type + if(ispath(breathing_class)) + var/datum/breathing_class/class = GLOB.gas_data.breathing_classes[breathing_class] + alert_category = class.low_alert_category + alert_type = class.low_alert_datum + else + var/list/breath_alert_info = GLOB.gas_data.breath_alert_info + if(breathing_class in breath_alert_info) + var/list/alert = breath_alert_info[breathing_class]["not_enough_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + if(alert_category) + H.throw_alert(alert_category, alert_type) return FALSE + #define PP_MOLES(X) ((X / total_moles) * pressure) + + #define PP(air, gas) PP_MOLES(air.get_moles(gas)) + var/gas_breathed = 0 - //Partial pressures in our breath - var/O2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/oxygen))+(8*breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/pluoxium))) - var/N2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrogen)) - var/Toxins_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma)) - var/CO2_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/carbon_dioxide)) - var/CH4_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/methane)) - var/CH3Br_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/methyl_bromide)) - - - //-- OXY --// - - //Too much oxygen! //Yes, some species may not like it. - if(safe_oxygen_max) - if((O2_pp > safe_oxygen_max) && safe_oxygen_max == 0) //I guess plasma men technically need to have a check. - var/ratio = (breath.get_moles(/datum/gas/oxygen)/safe_oxygen_max) * 10 - H.apply_damage_type(clamp(ratio, oxy_breath_dam_min, oxy_breath_dam_max), oxy_damage_type) - H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) - - else if((O2_pp > safe_oxygen_max) && !(safe_oxygen_max == 0)) //Why yes, this is like too much CO2 and spahget. Dirty lizards. - if(!H.o2overloadtime) - H.o2overloadtime = world.time - else if(world.time - H.o2overloadtime > 120) - H.Dizzy(10) // better than a minute of you're fucked KO, but certainly a wake up call. Honk. - H.adjustOxyLoss(3) - if(world.time - H.o2overloadtime > 300) - H.adjustOxyLoss(8) - if(prob(20)) - H.emote("cough") - H.throw_alert("too_much_oxy", /obj/screen/alert/too_much_oxy) - + var/pressure = breath.return_pressure() + var/total_moles = breath.total_moles() + var/list/breath_alert_info = GLOB.gas_data.breath_alert_info + var/list/breath_results = GLOB.gas_data.breath_results + var/list/breathing_classes = GLOB.gas_data.breathing_classes + var/list/mole_adjustments = list() + for(var/entry in gas_min) + var/required_pp = 0 + var/required_moles = 0 + var/safe_min = gas_min[entry] + var/alert_category = null + var/alert_type = null + if(ispath(entry)) + var/datum/breathing_class/class = breathing_classes[entry] + var/list/gases = class.gases + var/list/products = class.products + alert_category = class.low_alert_category + alert_type = class.low_alert_datum + for(var/gas in gases) + var/moles = breath.get_moles(gas) + var/multiplier = gases[gas] + mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - moles : -moles + required_pp += PP_MOLES(moles) * multiplier + required_moles += moles + if(multiplier > 0) + var/to_add = moles * multiplier + for(var/product in products) + mole_adjustments[product] = (product in mole_adjustments) ? mole_adjustments[product] + to_add : to_add else - H.o2overloadtime = 0 - H.clear_alert("too_much_oxy") - - //Too little oxygen! - if(safe_oxygen_min) - if(O2_pp < safe_oxygen_min) - gas_breathed = handle_too_little_breath(H, O2_pp, safe_oxygen_min, breath.get_moles(/datum/gas/oxygen)) - H.throw_alert("not_enough_oxy", /obj/screen/alert/not_enough_oxy) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-breathModifier) //More damaged lungs = slower oxy rate up to a factor of half - gas_breathed = breath.get_moles(/datum/gas/oxygen) - H.clear_alert("not_enough_oxy") - - //Exhale - breath.adjust_moles(/datum/gas/oxygen, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 - - //-- Nitrogen --// - - //Too much nitrogen! - if(safe_nitro_max) - if(N2_pp > safe_nitro_max) - var/ratio = (breath.get_moles(/datum/gas/nitrogen)/safe_nitro_max) * 10 - H.apply_damage_type(clamp(ratio, nitro_breath_dam_min, nitro_breath_dam_max), nitro_damage_type) - H.throw_alert("too_much_nitro", /obj/screen/alert/too_much_nitro) - H.losebreath += 2 - else - H.clear_alert("too_much_nitro") - - //Too little nitrogen! - if(safe_nitro_min) - if(N2_pp < safe_nitro_min) - gas_breathed = handle_too_little_breath(H, N2_pp, safe_nitro_min, breath.get_moles(/datum/gas/nitrogen)) - H.throw_alert("nitro", /obj/screen/alert/not_enough_nitro) + required_moles = breath.get_moles(entry) + required_pp = PP_MOLES(required_moles) + if(entry in breath_alert_info) + var/list/alert = breath_alert_info[entry]["not_enough_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + mole_adjustments[entry] = -required_moles + mole_adjustments[breath_results[entry]] = required_moles + if(required_pp < safe_min) + var/multiplier = 0 + if(required_moles > 0) + multiplier = handle_too_little_breath(H, required_pp, safe_min, required_moles) / required_moles + for(var/adjustment in mole_adjustments) + mole_adjustments[adjustment] *= multiplier + if(alert_category) + H.throw_alert(alert_category, alert_type) else H.failed_last_breath = FALSE if(H.health >= H.crit_threshold) H.adjustOxyLoss(-breathModifier) - gas_breathed = breath.get_moles(/datum/gas/nitrogen) - H.clear_alert("nitro") - - //Exhale - breath.adjust_moles(/datum/gas/nitrogen, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 - - //-- CO2 --// - - //CO2 does not affect failed_last_breath. So if there was enough oxygen in the air but too much co2, this will hurt you, but only once per 4 ticks, instead of once per tick. - if(safe_co2_max) - if(CO2_pp > safe_co2_max) - if(!H.co2overloadtime) // If it's the first breath with too much CO2 in it, lets start a counter, then have them pass out after 12s or so. - H.co2overloadtime = world.time - else if(world.time - H.co2overloadtime > 120) - H.Unconscious(60) - H.apply_damage_type(3, co2_damage_type) // Lets hurt em a little, let them know we mean business - if(world.time - H.co2overloadtime > 300) // They've been in here 30s now, lets start to kill them for their own good! - H.apply_damage_type(8, co2_damage_type) - H.throw_alert("too_much_co2", /obj/screen/alert/too_much_co2) - if(prob(20)) // Lets give them some chance to know somethings not right though I guess. - H.emote("cough") - + if(alert_category) + H.clear_alert(alert_category) + var/list/danger_reagents = GLOB.gas_data.breath_reagents_dangerous + for(var/entry in gas_max) + var/found_pp = 0 + var/datum/breathing_class/breathing_class = entry + var/datum/reagent/danger_reagent = null + var/alert_category = null + var/alert_type = null + if(ispath(breathing_class)) + breathing_class = breathing_classes[breathing_class] + var/list/gases = breathing_class.gases + alert_category = breathing_class.high_alert_category + alert_type = breathing_class.high_alert_datum + danger_reagent = breathing_class.danger_reagent + for(var/gas in gases) + found_pp += PP(breath, gas) else - H.co2overloadtime = 0 - H.clear_alert("too_much_co2") + danger_reagent = danger_reagents[entry] + if(entry in breath_alert_info) + var/list/alert = breath_alert_info[entry]["too_much_alert"] + alert_category = alert["alert_category"] + alert_type = alert["alert_type"] + found_pp = PP(breath, entry) + if(found_pp > gas_max[entry]) + if(istype(danger_reagent)) + H.reagents.add_reagent(danger_reagent,1) + var/list/damage_info = (entry in gas_damage) ? gas_damage[entry] : gas_damage["default"] + var/dam = found_pp / gas_max[entry] * 10 + H.apply_damage_type(clamp(dam, damage_info["min"], damage_info["max"]), damage_info["damage_type"]) + if(alert_category && alert_type) + H.throw_alert(alert_category, alert_type) + else if(alert_category) + H.clear_alert(alert_category) + var/list/breath_reagents = GLOB.gas_data.breath_reagents + for(var/gas in breath.get_gases()) + if(gas in breath_reagents) + var/datum/reagent/R = breath_reagents[gas] + H.reagents.add_reagent(R, PP(breath,gas)) + mole_adjustments[gas] = (gas in mole_adjustments) ? mole_adjustments[gas] - breath.get_moles(gas) : -breath.get_moles(gas) - //Too little CO2! - if(safe_co2_min) - if(CO2_pp < safe_co2_min) - gas_breathed = handle_too_little_breath(H, CO2_pp, safe_co2_min, breath.get_moles(/datum/gas/carbon_dioxide)) - H.throw_alert("not_enough_co2", /obj/screen/alert/not_enough_co2) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-breathModifier) - gas_breathed = breath.get_moles(/datum/gas/carbon_dioxide) - H.clear_alert("not_enough_co2") - - //Exhale - breath.adjust_moles(/datum/gas/carbon_dioxide, -gas_breathed) - breath.adjust_moles(/datum/gas/oxygen, gas_breathed) - gas_breathed = 0 - - - //-- TOX --// - - //Too much toxins! - if(safe_toxins_max) - if(Toxins_pp > safe_toxins_max) - var/ratio = (breath.get_moles(/datum/gas/plasma)/safe_toxins_max) * 10 - H.apply_damage_type(clamp(ratio, tox_breath_dam_min, tox_breath_dam_max), tox_damage_type) - H.throw_alert("too_much_tox", /obj/screen/alert/too_much_tox) - else - H.clear_alert("too_much_tox") - - - //Too little toxins! - if(safe_toxins_min) - if(Toxins_pp < safe_toxins_min) - gas_breathed = handle_too_little_breath(H, Toxins_pp, safe_toxins_min, breath.get_moles(/datum/gas/plasma)) - H.throw_alert("not_enough_tox", /obj/screen/alert/not_enough_tox) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-breathModifier) - gas_breathed = breath.get_moles(/datum/gas/plasma) - H.clear_alert("not_enough_tox") - - //Exhale - breath.adjust_moles(/datum/gas/plasma, -gas_breathed) - breath.adjust_moles(/datum/gas/carbon_dioxide, gas_breathed) - gas_breathed = 0 - -//-- METHANE --// - - //Too much methane! - if(safe_methane_max) - if(CH4_pp > safe_methane_max) //Same effect as excess nitrogen, generally nontoxic - var/ratio = (breath.get_moles(/datum/gas/methane)/safe_methane_max) * 10 - H.apply_damage_type(clamp(ratio, methane_breath_dam_min, methane_breath_dam_max), methane_damage_type) - H.throw_alert("too_much_ch4", /obj/screen/alert/too_much_ch4) - H.losebreath += 2 - else - H.clear_alert("too_much_ch4") - //Too little methane! - if(safe_methane_min) - if(CH4_pp < safe_methane_min) - gas_breathed = handle_too_little_breath(H, CH4_pp, safe_methane_min, breath.get_moles(/datum/gas/methane)) - H.throw_alert("not_enough_ch4", /obj/screen/alert/not_enough_ch4) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-breathModifier) - gas_breathed = breath.get_moles(/datum/gas/methane) - H.clear_alert("not_enough_ch4") - - //Exhale - breath.adjust_moles(/datum/gas/methane, -gas_breathed) - breath.adjust_moles(/datum/gas/methyl_bromide, gas_breathed) - gas_breathed = 0 - -//-- CH3BR --// - - //Too much methyl bromide! - if(safe_ch3br_max) - if(CH3Br_pp > safe_ch3br_max) - if(prob(CH3Br_pp/0.5)) - H.adjustOrganLoss(ORGAN_SLOT_LUNGS, 3, 150) //Inhaling this is a bad idea - if(prob(CH3Br_pp/2)) - to_chat(H, "Your throat closes up!") - H.silent = max(H.silent, 3) - H.throw_alert("too_much_ch3br", /obj/screen/alert/too_much_ch3br) - else - H.clear_alert("too_much_ch3br") - //Too little methyl bromide! - if(safe_ch3br_min) - if(CH3Br_pp < safe_ch3br_min) - gas_breathed = handle_too_little_breath(H, CH3Br_pp, safe_ch3br_min, breath.get_moles(/datum/gas/methyl_bromide)) - H.throw_alert("not_enough_ch3br", /obj/screen/alert/not_enough_ch3br) - else - H.failed_last_breath = FALSE - if(H.health >= H.crit_threshold) - H.adjustOxyLoss(-breathModifier) - gas_breathed = breath.get_moles(/datum/gas/methyl_bromide) - H.clear_alert("not_enough_ch3br") - - //-- TRACES --// + for(var/gas in mole_adjustments) + breath.adjust_moles(gas, mole_adjustments[gas]) if(breath) // If there's some other shit in the air lets deal with it here. // N2O - var/SA_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitrous_oxide)) + var/SA_pp = PP(breath, GAS_NITROUS) if(SA_pp > SA_para_min) // Enough to make us stunned for a bit H.Unconscious(60) // 60 gives them one second to wake up and run away a bit! if(SA_pp > SA_sleep_min) // Enough to make us sleep as well @@ -362,7 +268,7 @@ // BZ - var/bz_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/bz)) + var/bz_pp = PP(breath, GAS_BZ) if(bz_pp > BZ_trip_balls_min) H.hallucination += 10 H.reagents.add_reagent(/datum/reagent/bz_metabolites,5) @@ -373,16 +279,8 @@ H.hallucination += 5 H.reagents.add_reagent(/datum/reagent/bz_metabolites,1) - - // Tritium - var/trit_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/tritium)) - if (trit_pp > 50) - H.radiation += trit_pp/2 //If you're breathing in half an atmosphere of radioactive gas, you fucked up. - else - H.radiation += trit_pp/10 - // Nitryl - var/nitryl_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/nitryl)) + var/nitryl_pp = PP(breath,GAS_NITRYL) if (prob(nitryl_pp)) to_chat(H, "Your mouth feels like it's burning!") if (nitryl_pp >40) @@ -393,22 +291,22 @@ H.silent = max(H.silent, 3) else H.adjustFireLoss(nitryl_pp/4) - gas_breathed = breath.get_moles(/datum/gas/nitryl) + gas_breathed = breath.get_moles(GAS_NITRYL) if (gas_breathed > gas_stimulation_min) H.reagents.add_reagent(/datum/reagent/nitryl,1) - breath.adjust_moles(/datum/gas/nitryl, -gas_breathed) + breath.adjust_moles(GAS_NITRYL, -gas_breathed) // Stimulum - gas_breathed = breath.get_moles(/datum/gas/stimulum) + gas_breathed = PP(breath,GAS_STIMULUM) if (gas_breathed > gas_stimulation_min) var/existing = H.reagents.get_reagent_amount(/datum/reagent/stimulum) H.reagents.add_reagent(/datum/reagent/stimulum, max(0, 5 - existing)) - breath.adjust_moles(/datum/gas/stimulum, -gas_breathed) + breath.adjust_moles(GAS_STIMULUM, -gas_breathed) // Miasma - if (breath.get_moles(/datum/gas/miasma)) - var/miasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/miasma)) + if (breath.get_moles(GAS_MIASMA)) + var/miasma_pp = PP(breath,GAS_MIASMA) if(miasma_pp > MINIMUM_MOLES_DELTA_TO_MOVE) //Miasma sickness @@ -448,7 +346,7 @@ // Then again, this is a purely hypothetical scenario and hardly reachable owner.adjust_disgust(0.1 * miasma_pp) - breath.adjust_moles(/datum/gas/miasma, -gas_breathed) + breath.adjust_moles(GAS_MIASMA, -gas_breathed) // Clear out moods when no miasma at all else @@ -539,13 +437,13 @@ name = "plasma filter" desc = "A spongy rib-shaped mass for filtering plasma from the air." icon_state = "lungs-plasma" - - safe_oxygen_min = 0 //We don't breath this - safe_oxygen_max = 0 // Like, at all. - safe_toxins_min = 16 //We breath THIS! - safe_toxins_max = 0 + breathing_class = BREATH_PLASMA maxHealth = INFINITY//I don't understand how plamamen work, so I'm not going to try t give them special lungs atm +/obj/item/organ/lungs/plasmaman/populate_gas_info() + ..() + gas_max -= GAS_PLASMA + /obj/item/organ/lungs/cybernetic name = "basic cybernetic lungs" desc = "A basic cybernetic version of the lungs found in traditional humanoid entities." @@ -560,8 +458,8 @@ desc = "A cybernetic version of the lungs found in traditional humanoid entities. Allows for greater intakes of oxygen than organic lungs, requiring slightly less pressure." icon_state = "lungs-c-u" maxHealth = 1.5 * STANDARD_ORGAN_THRESHOLD - safe_oxygen_min = 13 - safe_oxygen_max = 100 + safe_breath_min = 13 + safe_breath_max = 100 emp_vulnerability = 2 /obj/item/organ/lungs/cybernetic/tier3 @@ -569,10 +467,13 @@ desc = "A more advanced version of the stock cybernetic lungs. Features the ability to filter out various airbourne toxins and carbon dioxide even at heavy levels." icon_state = "lungs-c-u2" maxHealth = 2 * STANDARD_ORGAN_THRESHOLD - safe_oxygen_min = 4 //You could literally be breathing the thinnest amount of oxygen and be fine - safe_oxygen_max = 250 //Or be in an enriched oxygen room for that matter - safe_toxins_max = 30 - safe_co2_max = 30 + safe_breath_min = 4 //You could literally be breathing the thinnest amount of oxygen and be fine + safe_breath_max = 250 //Or be in an enriched oxygen room for that matter + gas_max = list( + GAS_PLASMA = 30, + GAS_CO2 = 30, + GAS_METHYL_BROMIDE = 10 + ) SA_para_min = 30 SA_sleep_min = 50 BZ_trip_balls_min = 30 @@ -597,9 +498,8 @@ name = "ash lungs" desc = "blackened lungs identical from specimens recovered from lavaland, unsuited to higher air pressures." icon_state = "lungs-ll" - safe_oxygen_min = 3 //able to handle much thinner oxygen, something something ash storm adaptation - safe_oxygen_max = 18 // Air standard is 22kpA of O2, LL is 14kpA - safe_nitro_max = 28 // Air standard is 82kpA of N2, LL is 23kpA + safe_breath_min = 3 //able to handle much thinner oxygen, something something ash storm adaptation + safe_breath_max = 18 // Air standards is 22kPa of O2, LL is 14kPa cold_level_1_threshold = 280 // Ash Lizards can't take the cold very well, station air is only just warm enough cold_level_2_threshold = 240 @@ -608,24 +508,32 @@ heat_level_1_threshold = 400 // better adapted for heat, obv. Lavaland standard is 300 heat_level_2_threshold = 600 // up 200 from level 1, 1000 is silly but w/e for level 3 +/obj/item/organ/lungs/ashwalker/populate_gas_info() + ..() + gas_max[GAS_N2] = 28 + /obj/item/organ/lungs/slime name = "vacuole" icon_state = "lungs-s" desc = "A large organelle designed to store oxygen and other important gasses." - safe_toxins_max = 0 //We breathe this to gain POWER. - cold_level_1_threshold = 285 // Remember when slimes used to be succeptable to cold? Well.... cold_level_2_threshold = 260 cold_level_3_threshold = 230 maxHealth = 250 +/obj/item/organ/lungs/ashwalker/populate_gas_info() + ..() + gas_max -= GAS_PLASMA + /obj/item/organ/lungs/slime/check_breath(datum/gas_mixture/breath, mob/living/carbon/human/H) . = ..() if (breath) - var/plasma_pp = breath.get_breath_partial_pressure(breath.get_moles(/datum/gas/plasma)) - owner.blood_volume += (0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. + var/total_moles = breath.total_moles() + var/pressure = breath.return_pressure() + var/plasma_pp = PP(breath, GAS_PLASMA) + owner.adjust_integration_blood(0.2 * plasma_pp) // 10/s when breathing literally nothing but plasma, which will suffocate you. /obj/item/organ/lungs/yamerol name = "Yamerol lungs" @@ -637,3 +545,6 @@ . = ..() if(.) applyOrganDamage(2) //Yamerol lungs are temporary + +#undef PP +#undef PP_MOLES diff --git a/code/modules/surgery/organs/organ_internal.dm b/code/modules/surgery/organs/organ_internal.dm index 6cdeadcbb3..1800fe221b 100644 --- a/code/modules/surgery/organs/organ_internal.dm +++ b/code/modules/surgery/organs/organ_internal.dm @@ -92,18 +92,18 @@ on_death() //Kinda hate doing it like this, but I really don't want to call process directly. //Sources; life.dm process_organs -/obj/item/organ/proc/on_death() //Runs when outside AND inside. - decay() +/obj/item/organ/proc/on_death(seconds, times_fired) //Runs when outside AND inside. + decay(seconds, times_fired) //Applys the slow damage over time decay -/obj/item/organ/proc/decay() +/obj/item/organ/proc/decay(seconds, times_fired) if(!can_decay()) STOP_PROCESSING(SSobj, src) return is_cold() if(organ_flags & ORGAN_FROZEN) return - applyOrganDamage(maxHealth * decay_factor) + applyOrganDamage(maxHealth * decay_factor * (seconds * 0.5)) /obj/item/organ/proc/can_decay() if(CHECK_BITFIELD(organ_flags, ORGAN_NO_SPOIL | ORGAN_SYNTHETIC | ORGAN_FAILING)) @@ -151,7 +151,7 @@ organ_flags &= ~ORGAN_FROZEN return FALSE -/obj/item/organ/proc/on_life() //repair organ damage if the organ is not failing or synthetic +/obj/item/organ/proc/on_life(seconds, times_fired) //repair organ damage if the organ is not failing or synthetic if(organ_flags & ORGAN_FAILING || !owner) return FALSE if(organ_flags & ORGAN_SYNTHETIC_EMP) //Synthetic organ has been emped, is now failing. diff --git a/code/modules/surgery/organs/stomach.dm b/code/modules/surgery/organs/stomach.dm index defb062f1a..f436b31513 100644 --- a/code/modules/surgery/organs/stomach.dm +++ b/code/modules/surgery/organs/stomach.dm @@ -62,13 +62,13 @@ H.clear_alert("disgust") SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "disgust") if(DISGUST_LEVEL_GROSS to DISGUST_LEVEL_VERYGROSS) - H.throw_alert("disgust", /obj/screen/alert/gross) + H.throw_alert("disgust", /atom/movable/screen/alert/gross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/gross) if(DISGUST_LEVEL_VERYGROSS to DISGUST_LEVEL_DISGUSTED) - H.throw_alert("disgust", /obj/screen/alert/verygross) + H.throw_alert("disgust", /atom/movable/screen/alert/verygross) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/verygross) if(DISGUST_LEVEL_DISGUSTED to INFINITY) - H.throw_alert("disgust", /obj/screen/alert/disgusted) + H.throw_alert("disgust", /atom/movable/screen/alert/disgusted) SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "disgust", /datum/mood_event/disgusted) /obj/item/organ/stomach/Remove(special = FALSE) diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 12e282200c..e41980cdd3 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -1,8 +1,15 @@ -#define COOLDOWN_STUN 1200 -#define COOLDOWN_KNOCKDOWN 600 -#define COOLDOWN_DAMAGE 600 -#define COOLDOWN_MEME 300 -#define COOLDOWN_NONE 100 +#define COOLDOWN_STUN 300 +#define COOLDOWN_KNOCKDOWN 300 +#define COOLDOWN_DAMAGE 300 +#define COOLDOWN_MEME 150 +#define COOLDOWN_NONE 50 + +/// anything above this requires adminbus, to prevent a cultist from stacking chaplain + cult + specific listener = 8x, which is enough to instantly kill someone with damage. +#define VOG_MAX_STANDARD_POWER 3 +/// max damage we can do in one "blast" to a listener +#define VOG_MAX_BURST_DAMAGE 40 +/// max healing we can do in one "blast" to a listener +#define VOG_MAX_BURST_HEAL 40 /obj/item/organ/vocal_cords //organs that are activated through speech with the :x/MODE_KEY_VOCALCORDS channel name = "vocal cords" @@ -130,13 +137,11 @@ return 0 //no cooldown var/log_message = uppertext(message) - if(!span_list || !span_list.len) - if(iscultist(user)) - span_list = list("narsiesmall") - else if (is_servant_of_ratvar(user)) - span_list = list("ratvar") - else - span_list = list() + if(iscultist(user)) + span_list = list("narsiesmall") + else if (is_servant_of_ratvar(user)) + span_list = list("ratvar") + LAZYINITLIST(span_list) user.say(message, spans = span_list, sanitize = FALSE) @@ -156,39 +161,24 @@ cooldown = COOLDOWN_NONE return cooldown - var/power_multiplier = base_multiplier - - if(user.mind) - //Chaplains are very good at speaking with the voice of god - if(user.mind.assigned_role == "Chaplain") - power_multiplier *= 2 - //Command staff has authority - if(user.mind.assigned_role in GLOB.command_positions) - power_multiplier *= 1.4 - //Why are you speaking - if(user.mind.assigned_role == "Mime") - power_multiplier *= 0.5 - - //Cultists are closer to their gods and are more powerful, but they'll give themselves away - if(iscultist(user)) - power_multiplier *= 2 - else if (is_servant_of_ratvar(user)) - power_multiplier *= 2 - //Try to check if the speaker specified a name or a job to focus on var/list/specific_listeners = list() var/found_string = null + var/devil_target = FALSE //Get the proper job titles message = get_full_job_name(message) + // limitation: this only checks at the start of the message. + // if we wanted to check anywhere we'd have to make the user use delimiters to specify who they're talking to, + // as otherwise it'd be far too computationally and logically expensive to find out who we want. for(var/V in listeners) var/mob/living/L = V var/datum/antagonist/devil/devilinfo = is_devil(L) if(devilinfo && findtext(message, devilinfo.truename)) var/start = findtext(message, devilinfo.truename) listeners = list(L) //Devil names are unique. - power_multiplier *= 5 //if you're a devil and god himself addressed you, you fucked up + devil_target = TRUE //if you're a devil and god himself addressed you, you fucked up //Cut out the name so it doesn't trigger commands message = copytext(message, 1, start) + copytext(message, start + length(devilinfo.truename)) break @@ -207,10 +197,14 @@ //Cut out the job so it doesn't trigger commands found_string = L.mind.assigned_role + var/power_multiplier = get_vog_multiplier(user, base_multiplier, specific_listeners) + var/adminbus = power_multiplier > VOG_MAX_STANDARD_POWER // an admin is being a dunce, bypass hard scaling limits on this message + if(devil_target) + power_multiplier = max(power_multiplier, 5) + if(specific_listeners.len) - listeners = specific_listeners - power_multiplier *= (1 + (1/specific_listeners.len)) //2x on a single guy, 1.5x on two and so on message = copytext(message, length(found_string) + 1) + listeners = specific_listeners.Copy() var/static/regex/stun_words = regex("stop|wait|stand still|hold on|halt") var/static/regex/knockdown_words = regex("drop|fall|trip|knockdown") @@ -264,7 +258,7 @@ cooldown = COOLDOWN_STUN for(var/V in listeners) var/mob/living/L = V - L.Stagger(60 * power_multiplier) + L.Stagger(40 * power_multiplier) //KNOCKDOWN else if(findtext(message, knockdown_words)) @@ -272,6 +266,7 @@ for(var/V in listeners) var/mob/living/L = V L.DefaultCombatKnockdown() + L.Stagger(10 * power_multiplier) //VOMIT else if((findtext(message, vomit_words))) @@ -285,13 +280,13 @@ for(var/mob/living/carbon/C in listeners) if(user.mind && (user.mind.assigned_role == "Curator" || user.mind.assigned_role == "Mime")) power_multiplier *= 3 - C.silent += (10 * power_multiplier) + C.silent += (5 * power_multiplier) //HALLUCINATE else if((findtext(message, hallucinate_words))) cooldown = COOLDOWN_MEME for(var/mob/living/carbon/C in listeners) - new /datum/hallucination/delusion(C, TRUE, null,150 * power_multiplier,0) + new /datum/hallucination/delusion(C, TRUE, null, 150 * power_multiplier, 0) //WAKE UP else if((findtext(message, wakeup_words))) @@ -305,14 +300,14 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.heal_overall_damage(10 * power_multiplier, 10 * power_multiplier, 0, FALSE, FALSE) + L.heal_overall_damage(min(17.5 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_HEAL), min(17.5 * power_multiplier, VOG_MAX_BURST_HEAL), 0, FALSE, FALSE) //BRUTE DAMAGE else if((findtext(message, hurt_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.apply_damage(15 * power_multiplier, def_zone = BODY_ZONE_CHEST, wound_bonus=CANT_WOUND) + L.apply_damage(min(20 * power_multiplier, adminbus? INFINITY : VOG_MAX_BURST_DAMAGE), def_zone = BODY_ZONE_CHEST, wound_bonus = CANT_WOUND) //BLEED else if((findtext(message, bleed_words))) @@ -334,14 +329,14 @@ cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(50 * power_multiplier) + L.adjust_bodytemperature(75 * power_multiplier) //COLD else if((findtext(message, cold_words))) cooldown = COOLDOWN_DAMAGE for(var/V in listeners) var/mob/living/L = V - L.adjust_bodytemperature(-50 * power_multiplier) + L.adjust_bodytemperature(-75 * power_multiplier) //REPULSE else if((findtext(message, repulse_words))) @@ -596,6 +591,34 @@ return cooldown +/proc/get_vog_multiplier(mob/living/carbon/user, base_multiplier = 1, list/specific_listeners = list()) + if(base_multiplier >= VOG_MAX_STANDARD_POWER) + return base_multiplier // an admin bussed you and they probably didn't realize you were a chaplain/cultist. + + var/special_check = get_vog_special(user) + if(!special_check) + return 0 + + . = min(base_multiplier * special_check, VOG_MAX_STANDARD_POWER) // anything above should require conscious admin fuckery, as things are balanced around 3 multiplier tops (see: damage being 15*3) + if(!specific_listeners.len) + return + . = min(. * (1 + (1 / specific_listeners.len)), VOG_MAX_STANDARD_POWER) + +/// get special role multiplier for voice of god. No double dipping. +/proc/get_vog_special(mob/living/carbon/user) + if(iscultist(user) || is_servant_of_ratvar(user)) + return 2 // servant of god + if(user.mind) + // servant of god + if(user.mind.assigned_role == "Chaplain") + return 2 + // shut up you broke your vow + if(user.mind.assigned_role == "Mime") + return 0.5 + if(user.mind.assigned_role in GLOB.command_positions) + return 1.4 // heads are great at speaking with authority + return 1 + ////////////////////////////////////// ///////ENTHRAL VELVET CHORDS////////// ////////////////////////////////////// diff --git a/code/modules/tgui/states/vorepanel.dm b/code/modules/tgui/states/vorepanel.dm new file mode 100644 index 0000000000..b68dfb970a --- /dev/null +++ b/code/modules/tgui/states/vorepanel.dm @@ -0,0 +1,18 @@ + /** + * tgui state: vorepanel_state + * + * Only checks that the user and src_object are the same. + **/ + +GLOBAL_DATUM_INIT(ui_vorepanel_state, /datum/ui_state/vorepanel_state, new) + +/datum/ui_state/vorepanel_state/can_use_topic(src_object, mob/user) + if(src_object != user) + // Note, in order to allow others to look at others vore panels, change this to + // UI_UPDATE + return UI_CLOSE + if(!user.client) + return UI_CLOSE + if(user.stat == DEAD) + return UI_DISABLED + return UI_INTERACTIVE diff --git a/code/modules/tgui/tgui_alert.dm b/code/modules/tgui/tgui_alert.dm index 1a86cca705..d144588ad9 100644 --- a/code/modules/tgui/tgui_alert.dm +++ b/code/modules/tgui/tgui_alert.dm @@ -9,7 +9,7 @@ * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI. * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Set to zero for no timeout. */ -/proc/tgui_alert(mob/user, message, title, list/buttons, timeout = 60 SECONDS) +/proc/tgui_alert(mob/user, message = null, title = null, list/buttons = list("Ok"), timeout = 0) if (!user) user = usr if (!istype(user)) @@ -35,9 +35,9 @@ * * title - The of the alert modal, shown on the top of the TGUI window. * * buttons - The options that can be chosen by the user, each string is assigned a button on the UI. * * callback - The callback to be invoked when a choice is made. - * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Set to zero for no timeout. + * * timeout - The timeout of the alert, after which the modal will close and qdel itself. Disabled by default, can be set to seconds otherwise. */ -/proc/tgui_alert_async(mob/user, message, title, list/buttons, datum/callback/callback, timeout = 60 SECONDS) +/proc/tgui_alert_async(mob/user, message = null, title = null, list/buttons = list("Ok"), datum/callback/callback, timeout = 0) if (!user) user = usr if (!istype(user)) @@ -90,7 +90,7 @@ * the window was closed by the user. */ /datum/tgui_modal/proc/wait() - while (!choice && !closed) + while (!choice && !closed && !QDELETED(src)) stoplag(1) /datum/tgui_modal/ui_interact(mob/user, datum/tgui/ui) @@ -124,10 +124,13 @@ if("choose") if (!(params["choice"] in buttons)) return - choice = params["choice"] + set_choice(params["choice"]) SStgui.close_uis(src) return TRUE +/datum/tgui_modal/proc/set_choice(choice) + src.choice = choice + /** * # async tgui_modal * @@ -138,23 +141,17 @@ var/datum/callback/callback /datum/tgui_modal/async/New(mob/user, message, title, list/buttons, callback, timeout) - ..(user, title, message, buttons, timeout) + ..(user, message, title, buttons, timeout) src.callback = callback /datum/tgui_modal/async/Destroy(force, ...) QDEL_NULL(callback) . = ..() -/datum/tgui_modal/async/ui_close(mob/user) +/datum/tgui_modal/async/set_choice(choice) . = ..() - qdel(src) - -/datum/tgui_modal/async/ui_act(action, list/params) - . = ..() - if (!. || choice == null) - return - callback.InvokeAsync(choice) - qdel(src) + if(!isnull(src.choice)) + callback?.InvokeAsync(src.choice) /datum/tgui_modal/async/wait() return diff --git a/code/modules/tooltip/tooltip.dm b/code/modules/tooltip/tooltip.dm index fd45ea37d9..ca1b163968 100644 --- a/code/modules/tooltip/tooltip.dm +++ b/code/modules/tooltip/tooltip.dm @@ -13,7 +13,7 @@ Configuration: Usage: - Define mouse event procs on your (probably HUD) object and simply call the show and hide procs respectively: - /obj/screen/hud + /atom/movable/screen/hud MouseEntered(location, control, params) usr.client.tooltip.show(params, title = src.name, content = src.desc) @@ -138,12 +138,10 @@ Notes: . = ..() if(tooltips) if(!QDELETED(src)) - var/list/examine_list = examine(src) - var/get_tooltip_data = get_tooltip_data() - if(length(get_tooltip_data)) - examine_list = get_tooltip_data - var/examine_data = examine_list.Join("
") - openToolTip(usr, src, params, title = name, content = examine_data) + var/list/tooltip_data = get_tooltip_data() + if(length(tooltip_data)) + var/examine_data = tooltip_data.Join("
") + openToolTip(usr, src, params, title = name, content = examine_data) /atom/movable/MouseExited(location, control, params) . = ..() diff --git a/code/modules/unit_tests/_unit_tests.dm b/code/modules/unit_tests/_unit_tests.dm index 2745d971ff..7cc72ed1c1 100644 --- a/code/modules/unit_tests/_unit_tests.dm +++ b/code/modules/unit_tests/_unit_tests.dm @@ -44,7 +44,7 @@ // #include "heretic_knowledge.dm" // #include "holidays.dm" #include "initialize_sanity.dm" -#include "keybinding_init.dm" +// #include "keybinding_init.dm" #include "machine_disassembly.dm" #include "medical_wounds.dm" #include "merge_type.dm" diff --git a/code/modules/unit_tests/keybinding_init.dm b/code/modules/unit_tests/keybinding_init.dm index 2bd2fdee1e..16141bc553 100644 --- a/code/modules/unit_tests/keybinding_init.dm +++ b/code/modules/unit_tests/keybinding_init.dm @@ -3,4 +3,4 @@ var/datum/keybinding/KB = i if(initial(KB.keybind_signal) || !initial(KB.name)) continue - Fail("[KB.name] does not have a keybind signal defined.") + Fail("[initial(KB.name)] does not have a keybind signal defined.") diff --git a/code/modules/unit_tests/merge_type.dm b/code/modules/unit_tests/merge_type.dm index ba3cfcf492..1aed82e6a3 100644 --- a/code/modules/unit_tests/merge_type.dm +++ b/code/modules/unit_tests/merge_type.dm @@ -10,6 +10,6 @@ var/list/paths = subtypesof(/obj/item/stack) - blacklist for(var/stackpath in paths) - var/obj/item/stack/stack = stackpath - if(!initial(stack.merge_type)) + var/obj/item/stack/stack = new stackpath + if(!stack.merge_type) Fail("([stack]) lacks set merge_type variable!") diff --git a/code/modules/unit_tests/metabolizing.dm b/code/modules/unit_tests/metabolizing.dm index b7f8fc4f6a..6c0a635b13 100644 --- a/code/modules/unit_tests/metabolizing.dm +++ b/code/modules/unit_tests/metabolizing.dm @@ -11,7 +11,7 @@ /datum/unit_test/metabolization/proc/test_reagent(mob/living/carbon/C, reagent_type) C.reagents.add_reagent(reagent_type, 10) - C.reagents.metabolize(C, can_overdose = TRUE) + C.reagents.metabolize(C, SSMOBS_DT, 1, can_overdose = TRUE) C.reagents.clear_reagents() /datum/unit_test/metabolization/Destroy() diff --git a/code/modules/unit_tests/surgeries.dm b/code/modules/unit_tests/surgeries.dm index 6348057f79..c8ac1d9424 100644 --- a/code/modules/unit_tests/surgeries.dm +++ b/code/modules/unit_tests/surgeries.dm @@ -53,7 +53,8 @@ TEST_ASSERT(!isnull(alice.get_bodypart(BODY_ZONE_HEAD)), "Alice has no head after prosthetic replacement") TEST_ASSERT_EQUAL(alice.get_visible_name(), "Bob", "Bob's head was transplanted onto Alice's body, but their name is not Bob") - +/* +i couldn't actually find anything in the parts of the code it's calling preventing two surgeries, so it's probably somewhere else /datum/unit_test/multiple_surgeries/Run() var/mob/living/carbon/human/user = allocate(/mob/living/carbon/human) var/mob/living/carbon/human/patient_zero = allocate(/mob/living/carbon/human) @@ -65,10 +66,12 @@ var/datum/surgery/organ_manipulation/surgery_for_zero = new INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_zero, BODY_ZONE_CHEST, scalpel, surgery_for_zero) + sleep(1) TEST_ASSERT(surgery_for_zero.step_in_progress, "Surgery on patient zero was not initiated") var/datum/surgery/organ_manipulation/surgery_for_one = new + // Without waiting for the incision to complete, try to start a new surgery TEST_ASSERT(!surgery_step.initiate(user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one), "Was allowed to start a second surgery without the rod of asclepius") TEST_ASSERT(!surgery_for_one.step_in_progress, "Surgery for patient one is somehow in progress, despite not initiating") @@ -76,6 +79,7 @@ user.apply_status_effect(STATUS_EFFECT_HIPPOCRATIC_OATH) INVOKE_ASYNC(surgery_step, /datum/surgery_step/proc/initiate, user, patient_one, BODY_ZONE_CHEST, scalpel, surgery_for_one) TEST_ASSERT(surgery_for_one.step_in_progress, "Surgery on patient one was not initiated, despite having rod of asclepius") +*/ /datum/unit_test/tend_wounds/Run() var/mob/living/carbon/human/patient = allocate(/mob/living/carbon/human) diff --git a/code/modules/unit_tests/teleporters.dm b/code/modules/unit_tests/teleporters.dm index fa2624adaa..0fc9bdb082 100644 --- a/code/modules/unit_tests/teleporters.dm +++ b/code/modules/unit_tests/teleporters.dm @@ -1,8 +1,8 @@ /datum/unit_test/auto_teleporter_linking/Run() // Put down the teleporter machinery var/obj/machinery/teleport/hub/hub = allocate(/obj/machinery/teleport/hub) - var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) var/obj/machinery/computer/teleporter/computer = allocate(/obj/machinery/computer/teleporter, locate(run_loc_bottom_left.x + 2, run_loc_bottom_left.y, run_loc_bottom_left.z)) + var/obj/machinery/teleport/station/station = allocate(/obj/machinery/teleport/station, locate(run_loc_bottom_left.x + 1, run_loc_bottom_left.y, run_loc_bottom_left.z)) TEST_ASSERT_EQUAL(hub.power_station, station, "Hub didn't link to the station") TEST_ASSERT_EQUAL(station.teleporter_console, computer, "Station didn't link to the teleporter console") diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index d125453e5a..d5ddfe63cc 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -9,7 +9,7 @@ /obj/vehicle/ridden/atv/Initialize() . = ..() var/datum/component/riding/D = LoadComponent(/datum/component/riding) - D.vehicle_move_delay = 1 + D.vehicle_move_delay = CONFIG_GET(number/movedelay/run_delay) D.set_riding_offsets(RIDING_OFFSET_ALL, list(TEXT_NORTH = list(0, 4), TEXT_SOUTH = list(0, 4), TEXT_EAST = list(0, 4), TEXT_WEST = list( 0, 4))) D.set_vehicle_dir_layer(SOUTH, ABOVE_MOB_LAYER) D.set_vehicle_dir_layer(NORTH, OBJ_LAYER) diff --git a/code/modules/vehicles/motorized_wheelchair.dm b/code/modules/vehicles/motorized_wheelchair.dm new file mode 100644 index 0000000000..8e2d838066 --- /dev/null +++ b/code/modules/vehicles/motorized_wheelchair.dm @@ -0,0 +1,155 @@ +/obj/vehicle/ridden/wheelchair/motorized + name = "Hoverchair" + desc = "A chair with thrusters. It seems to have a motor in it." + icon = 'icons/obj/vehicles.dmi' + icon_state = "wheelchair_motorized" + max_integrity = 150 + var/speed = 2 + var/power_efficiency = 1 + var/power_usage = 25 + var/panel_open = FALSE + var/list/required_parts = list(/obj/item/stock_parts/manipulator, + /obj/item/stock_parts/manipulator, + /obj/item/stock_parts/capacitor) + var/obj/item/stock_parts/cell/power_cell + +/obj/vehicle/ridden/wheelchair/motorized/CheckParts(list/parts_list) + ..() + refresh_parts() + +/obj/vehicle/ridden/wheelchair/motorized/proc/refresh_parts() + speed = 1 // Should never be under 1 + for(var/obj/item/stock_parts/manipulator/M in contents) + speed += M.rating + for(var/obj/item/stock_parts/capacitor/C in contents) + power_efficiency = C.rating + var/datum/component/riding/D = GetComponent(/datum/component/riding) + D.vehicle_move_delay = round((CONFIG_GET(number/movedelay/run_delay) * 2) / speed, world.tick_lag) + +/obj/vehicle/ridden/wheelchair/motorized/obj_destruction(damage_flag) + var/turf/T = get_turf(src) + for(var/atom/movable/A in contents) + A.forceMove(T) + if(isliving(A)) + var/mob/living/L = A + L.update_mobility() + ..() + +/obj/vehicle/ridden/wheelchair/motorized/driver_move(mob/living/user, direction) + if(istype(user)) + if(!canmove) + return FALSE + if(!power_cell) + to_chat(user, "There seems to be no cell installed in [src].") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE + if(power_cell.charge < power_usage / max(power_efficiency, 1)) + to_chat(user, "The display on [src] blinks 'Out of Power'.") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE + if(user.get_num_arms() < arms_required) + to_chat(user, "You don't have enough arms to operate the motor controller!") + canmove = FALSE + addtimer(VARSET_CALLBACK(src, canmove, TRUE), 20) + return FALSE + power_cell.use(power_usage / max(power_efficiency, 1)) + return ..() + +/obj/vehicle/ridden/wheelchair/motorized/post_buckle_mob(mob/living/user) + . = ..() + density = TRUE + +/obj/vehicle/ridden/wheelchair/motorized/post_unbuckle_mob() + . = ..() + density = FALSE + +/obj/vehicle/ridden/wheelchair/motorized/attack_hand(mob/living/user) + if(power_cell && panel_open) + power_cell.update_icon() + user.put_in_hands(power_cell) + power_cell = null + to_chat(user, "You remove the power cell from [src].") + return + return ..() + +/obj/vehicle/ridden/wheelchair/motorized/attackby(obj/item/I, mob/user, params) + if(I.tool_behaviour == TOOL_SCREWDRIVER) + I.play_tool_sound(src) + panel_open = !panel_open + user.visible_message("[user] [panel_open ? "opens" : "closes"] the maintenance panel on [src].", "You [panel_open ? "open" : "close"] the maintenance panel.") + return + if(panel_open) + if(istype(I, /obj/item/stock_parts/cell)) + if(power_cell) + to_chat(user, "There is a power cell already installed.") + else + I.forceMove(src) + power_cell = I + to_chat(user, "You install the [I].") + refresh_parts() + return + if(istype(I, /obj/item/stock_parts)) + var/obj/item/stock_parts/B = I + var/P + for(var/obj/item/stock_parts/A in contents) + for(var/D in required_parts) + if(ispath(A.type, D)) + P = D + break + if(istype(B, P) && istype(A, P)) + if(B.get_part_rating() > A.get_part_rating()) + B.forceMove(src) + user.put_in_hands(A) + user.visible_message("[user] replaces [A] with [B] in [src].", "You replace [A] with [B].") + break + refresh_parts() + return + return ..() + +/obj/vehicle/ridden/wheelchair/motorized/wrench_act(mob/living/user, obj/item/I) + to_chat(user, "You begin to detach the thrusters...") + if(I.use_tool(src, user, 40, volume=50)) + to_chat(user, "You detach the thrusters and deconstruct the chair.") + new /obj/item/stack/rods(drop_location(), 8) + new /obj/item/stack/sheet/plasteel(drop_location(), 10) + var/turf/T = get_turf(src) + for(var/atom/movable/A in contents) + A.forceMove(T) + if(isliving(A)) + var/mob/living/L = A + L.update_mobility() + qdel(src) + return TRUE + +/obj/vehicle/ridden/wheelchair/motorized/examine(mob/user) + . = ..() + if(panel_open) + . += "There is a small screen on it, [(in_range(user, src) || isobserver(user)) ? "[power_cell ? "it reads:" : "but it is dark."]" : "but you can't see it from here."]" + if(!power_cell || (!in_range(user, src) && !isobserver(user))) + return + . += "Speed: [speed]" + . += "Energy efficiency: [power_efficiency]" + . += "Power: [power_cell.charge] out of [power_cell.maxcharge]" + +/obj/vehicle/ridden/wheelchair/motorized/Bump(atom/movable/M) + . = ..() + // If the speed is higher than delay_multiplier throw the person on the wheelchair away + if(M.density && speed > 2 && has_buckled_mobs()) + var/mob/living/H = buckled_mobs[1] + var/atom/throw_target = get_edge_target_turf(H, pick(GLOB.cardinals)) + unbuckle_mob(H) + H.throw_at(throw_target, 2, 3) + H.Knockdown(100) + H.adjustStaminaLoss(40) + if(isliving(M)) + var/mob/living/D = M + throw_target = get_edge_target_turf(D, pick(GLOB.cardinals)) + D.throw_at(throw_target, 2, 3) + D.Knockdown(80) + D.adjustStaminaLoss(35) + visible_message("[src] crashes into [M], sending [H] and [D] flying!") + else + visible_message("[src] crashes into [M], sending [H] flying!") + playsound(src, 'sound/effects/bang.ogg', 50, 1) diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index a81dff37ad..28145ba8e1 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -26,8 +26,8 @@ AddComponent(/datum/component/simple_rotation,ROTATION_ALTCLICK | ROTATION_CLOCKWISE, CALLBACK(src, .proc/can_user_rotate),CALLBACK(src, .proc/can_be_rotated),null) /obj/vehicle/ridden/wheelchair/obj_destruction(damage_flag) - new /obj/item/stack/rods(drop_location(), 1) - new /obj/item/stack/sheet/metal(drop_location(), 1) + new /obj/item/stack/rods(drop_location(), 8) + new /obj/item/stack/sheet/metal(drop_location(), 2) ..() /obj/vehicle/ridden/wheelchair/Destroy() @@ -53,7 +53,10 @@ /obj/vehicle/ridden/wheelchair/Moved() . = ..() cut_overlays() - playsound(src, 'sound/effects/roll.ogg', 75, 1) + if(istype(src, /obj/vehicle/ridden/wheelchair/motorized)) + playsound(src, 'sound/effects/chairwhoosh.ogg', 75, 1) + else + playsound(src, 'sound/effects/roll.ogg', 75, 1) if(has_buckled_mobs()) handle_rotation_overlayed() @@ -88,8 +91,12 @@ /obj/vehicle/ridden/wheelchair/proc/handle_rotation_overlayed() cut_overlays() - var/image/V = image(icon = icon, icon_state = "wheelchair_overlay", layer = FLY_LAYER, dir = src.dir) - add_overlay(V) + if(istype(src, /obj/vehicle/ridden/wheelchair/motorized)) + var/image/V = image(icon = icon, icon_state = "wheelchair_noverlay", layer = FLY_LAYER, dir = src.dir) + add_overlay(V) + else + var/image/V = image(icon = icon, icon_state = "wheelchair_overlay", layer = FLY_LAYER, dir = src.dir) + add_overlay(V) diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index b86ab6023a..eab1c55ca9 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -243,10 +243,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C . = ..() if(!light_mask) return - - SSvis_overlays.remove_vis_overlay(src, managed_vis_overlays) if(!(stat & BROKEN) && powered()) - SSvis_overlays.add_vis_overlay(src, icon, light_mask, EMISSIVE_LAYER, EMISSIVE_PLANE) + . += emissive_appearance(icon, light_mask) /obj/machinery/vending/obj_break(damage_flag) . = ..() diff --git a/code/modules/vending/boozeomat.dm b/code/modules/vending/boozeomat.dm index 5ec0987111..87f2a0940b 100644 --- a/code/modules/vending/boozeomat.dm +++ b/code/modules/vending/boozeomat.dm @@ -5,6 +5,9 @@ icon_deny = "boozeomat-deny" products = list(/obj/item/reagent_containers/food/drinks/drinkingglass = 30, /obj/item/reagent_containers/food/drinks/drinkingglass/shotglass = 12, + /obj/item/reagent_containers/food/drinks/bottle/blank = 5, + /obj/item/reagent_containers/food/drinks/bottle/blank/small = 10, + /obj/item/reagent_containers/food/drinks/bottle/blank/pitcher = 2, /obj/item/reagent_containers/food/drinks/bottle/gin = 5, /obj/item/reagent_containers/food/drinks/bottle/whiskey = 5, /obj/item/reagent_containers/food/drinks/bottle/tequila = 5, diff --git a/code/modules/vending/clothesmate.dm b/code/modules/vending/clothesmate.dm index a061561383..6adc9d38e6 100644 --- a/code/modules/vending/clothesmate.dm +++ b/code/modules/vending/clothesmate.dm @@ -21,7 +21,7 @@ /obj/item/clothing/suit/jacket/puffer/vest = 4, /obj/item/clothing/suit/jacket/puffer = 4, /obj/item/clothing/suit/hooded/cloak/david = 4, - /obj/item/clothing/neck/cancloak/polychromic = 4, + /obj/item/clothing/neck/cloak/cancloak/polychromic = 4, /obj/item/clothing/suit/bomber = 5, /obj/item/clothing/under/suit/turtle/teal = 3, /obj/item/clothing/under/suit/turtle/grey = 3, diff --git a/code/modules/vore/eating/bellymodes.dm b/code/modules/vore/eating/bellymodes.dm index 7cf36ebc50..8d64ee28f1 100644 --- a/code/modules/vore/eating/bellymodes.dm +++ b/code/modules/vore/eating/bellymodes.dm @@ -150,7 +150,7 @@ SEND_SOUND(M,prey_digest) play_sound = pick(pred_digest) - if(M.vore_flags & ABSORBED) + if(M.vore_flags & ABSORBED || !(M.vore_flags & ABSORBABLE)) //Negative. continue if(M.nutrition >= 100) //Drain them until there's no nutrients left. Slowly "absorb" them. diff --git a/code/modules/vore/eating/living.dm b/code/modules/vore/eating/living.dm index 41d7da16a1..6bc44e6489 100644 --- a/code/modules/vore/eating/living.dm +++ b/code/modules/vore/eating/living.dm @@ -1,17 +1,24 @@ ///////////////////// Mob Living ///////////////////// /mob/living var/vore_flags = 0 - var/showvoreprefs = TRUE // Determines if the mechanical vore preferences button will be displayed on the mob or not. - var/obj/belly/vore_selected // Default to no vore capability. - var/list/vore_organs = list() // List of vore containers inside a mob - var/vore_taste = null // What the character tastes like + // Determines if the mechanical vore preferences button will be displayed on the mob or not. + var/showvoreprefs = TRUE + /// Default to no vore capability. + var/obj/belly/vore_selected + /// List of vore containers inside a mob + var/list/vore_organs = list() + /// What the character tastes like + var/vore_taste = null + /// What the character smells like + var/vore_smell = null + /// Next time vore sounds get played for the prey, do not change manually as it is intended to be set automatically var/next_preyloop // // Hook for generic creation of stuff on new creatures // /hook/living_new/proc/vore_setup(mob/living/M) - add_verb(M, list(/mob/living/proc/preyloop_refresh, /mob/living/proc/lick, /mob/living/proc/escapeOOC)) + add_verb(M, list(/mob/living/proc/preyloop_refresh, /mob/living/proc/lick, /mob/living/proc/smell, /mob/living/proc/escapeOOC)) if(M.vore_flags & NO_VORE) //If the mob isn't supposed to have a stomach, let's not give it an insidepanel so it can make one for itself, or a stomach. return TRUE @@ -59,13 +66,14 @@ // Critical adjustments due to TG grab changes - Poojawa /mob/living/proc/vore_attack(var/mob/living/user, var/mob/living/prey, var/mob/living/pred) - lazy_init_belly() + set waitfor = FALSE if(!user || !prey || !pred) return if(!isliving(pred)) //no badmin, you can't feed people to ghosts or objects. return + lazy_init_belly() if(pred == prey) //you click your target if(!CHECK_BITFIELD(pred.vore_flags,FEEDING)) to_chat(user, "They aren't able to be fed.") @@ -255,6 +263,7 @@ client.prefs.vore_flags = vore_flags // there's garbage data in here, but it doesn't matter client.prefs.vore_taste = vore_taste + client.prefs.vore_smell = vore_smell var/list/serialized = list() for(var/belly in vore_organs) @@ -263,6 +272,8 @@ client.prefs.belly_prefs = serialized + client.prefs.save_character() + return TRUE // @@ -273,8 +284,9 @@ to_chat(src,"You attempted to apply your vore prefs but somehow you're in this character without a client.prefs variable. Tell a dev.") return FALSE ENABLE_BITFIELD(vore_flags,VOREPREF_INIT) - COPY_SPECIFIC_BITFIELDS(vore_flags,client.prefs.vore_flags,DIGESTABLE | DEVOURABLE | FEEDING | LICKABLE) + COPY_SPECIFIC_BITFIELDS(vore_flags, client.prefs.vore_flags, DIGESTABLE | DEVOURABLE | FEEDING | LICKABLE | SMELLABLE | ABSORBABLE | MOBVORE) vore_taste = client.prefs.vore_taste + vore_smell = client.prefs.vore_smell release_vore_contents(silent = TRUE) QDEL_LIST(vore_organs) @@ -378,6 +390,56 @@ else taste_message += "a plain old normal [src]" return taste_message + +// +// Equally important as the above +// +/mob/living/proc/smell() + set name = "Smell Someone" + set category = "Vore" + set desc = "Smell someone nearby!" + + if(incapacitated(ignore_restraints = TRUE)) + to_chat(src, "You can't do that while incapacitated.") + return + if(!CheckActionCooldown()) + to_chat(src, "You can't do that so fast, slow down.") + return + + DelayNextAction(CLICK_CD_MELEE, flush = TRUE) + + var/list/smellable = list() + for(var/mob/living/L in view(1)) + if(L != src && (!L.ckey || L.client?.prefs.vore_flags & SMELLABLE) && Adjacent(L)) + LAZYADD(smellable, L) + for(var/mob/living/listed in smellable) + smellable[listed] = new /mutable_appearance(listed) + + if(!smellable) + return + + var/mob/living/sniffed = show_radial_menu(src, src, smellable, radius = 40, require_near = TRUE) + + if(QDELETED(sniffed) || (sniffed.ckey && !(sniffed.client?.prefs.vore_flags & SMELLABLE)) || !Adjacent(sniffed) || incapacitated(ignore_restraints = TRUE)) + return + + visible_message("[src] smells [sniffed]!","You smell [sniffed]. They smell like [sniffed.get_smell_message()].","Sniff!") + +/mob/living/proc/get_smell_message(allow_generic = TRUE, datum/species/mrace) + if(!vore_smell && !allow_generic) + return FALSE + + var/smell_message = "" + if(vore_smell && (vore_smell != "")) + smell_message += "[vore_smell]" + else + if(ishuman(src)) + var/mob/living/carbon/human/H = src + smell_message += "a normal [H.custom_species ? H.custom_species : H.dna.species]" + else + smell_message += "a plain old normal [src]" + return smell_message + // Check if an object is capable of eating things, based on vore_organs // /proc/has_vore_belly(var/mob/living/O) diff --git a/code/modules/vore/eating/vorepanel.dm b/code/modules/vore/eating/vorepanel.dm index 5622ec0382..8e8cfc4935 100644 --- a/code/modules/vore/eating/vorepanel.dm +++ b/code/modules/vore/eating/vorepanel.dm @@ -2,744 +2,717 @@ // Vore management panel for players // -#define BELLIES_MAX 20 +#define BELLIES_MAX 40 #define BELLIES_NAME_MIN 2 -#define BELLIES_NAME_MAX 24 +#define BELLIES_NAME_MAX 40 #define BELLIES_DESC_MAX 4096 +#define FLAVOR_MAX 400 + +/mob/living + var/datum/vore_look/vorePanel /mob/living/proc/insidePanel() set name = "Vore Panel" set category = "Vore" - var/datum/vore_look/picker_holder = new() - picker_holder.loop = picker_holder - picker_holder.selected = vore_selected + if(!vorePanel) + log_game("VORE: [src] ([type], \ref[src]) didn't have a vorePanel and tried to use the verb.") + vorePanel = new(src) - var/dat = picker_holder.gen_vui(src) - - picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder) - picker_holder.popup.set_content(dat) - picker_holder.popup.open() - vore_flags |= OPEN_PANEL + vorePanel.ui_interact(src) /mob/living/proc/updateVRPanel() //Panel popup update call from belly events. - if(vore_flags & OPEN_PANEL) - var/datum/vore_look/picker_holder = new() - picker_holder.loop = picker_holder - picker_holder.selected = vore_selected - - var/dat = picker_holder.gen_vui(src) - - picker_holder.popup = new(src, "insidePanel","Vore Panel", 450, 700, picker_holder) - picker_holder.popup.set_content(dat) - picker_holder.popup.open() + SStgui.update_uis(vorePanel) // // Callback Handler for the Inside form // /datum/vore_look - var/obj/belly/selected - var/show_interacts = FALSE - var/datum/browser/popup - var/loop = null; // Magic self-reference to stop the handler from being GC'd before user takes action. + var/mob/living/host // Note, we do this in case we ever want to allow people to view others vore panels + var/unsaved_changes = FALSE + var/show_pictures = TRUE + +/datum/vore_look/New(mob/living/new_host) + if(istype(new_host)) + host = new_host + . = ..() /datum/vore_look/Destroy() - loop = null - selected = null - ..() //this is a must - return QDEL_HINT_HARDDEL + host = null + . = ..() -/datum/vore_look/Topic(href,href_list[]) - if (vp_interact(href, href_list)) - popup.set_content(gen_vui(usr)) - usr << output(popup.get_content(), "insidePanel.browser") +/datum/vore_look/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "VorePanel", "Vore Panel") + ui.open() -/datum/vore_look/proc/gen_vui(var/mob/living/user) - var/dat - dat += "Remember to toggle the vore mode, it's to the left of your combat toggle. Open mouth means you're voracious!
" - dat += "Remember that the prey is blind, use audible mode subtle messages to communicate to them with posts!
" - dat += "
" - var/atom/userloc = user.loc - if (isbelly(userloc)) - var/obj/belly/inside_belly = userloc - var/mob/living/eater = inside_belly.owner +// This looks weird, but all tgui_host is used for is state checking +// So this allows us to use the self_state just fine. +/datum/vore_look/ui_host(mob/user) + return host - //Don't display this part if we couldn't find the belly since could be held in hand. - if(inside_belly) - dat += "You are currently [(user.vore_flags & ABSORBED) ? "absorbed into " : "inside "] [eater]'s [inside_belly]!

" +// Note, in order to allow others to look at others vore panels, this state would need +// to be modified. +/datum/vore_look/ui_state(mob/user) + return GLOB.ui_vorepanel_state - if(inside_belly.desc) - dat += "[inside_belly.desc]

" +/datum/vore_look + var/static/list/nom_icons - if (inside_belly.contents.len > 1) - dat += "You can see the following around you:
" - for (var/atom/movable/O in inside_belly) - if(istype(O,/mob/living)) - var/mob/living/M = O - //That's just you - if(M == user) - continue +/datum/vore_look/proc/cached_nom_icon(atom/target) + LAZYINITLIST(nom_icons) - //That's an absorbed person you're checking - if(M.vore_flags & ABSORBED) - if(user.vore_flags & ABSORBED) - dat += "[O]" - continue - else - continue - - //Anything else - dat += "[O]​" - - //Zero-width space, for wrapping - dat += "​" + var/key = "" + if(isobj(target)) + key = "[target.type]" + else if(ismob(target)) + var/mob/M = target + key = "\ref[target][M.real_name]" + if(nom_icons[key]) + . = nom_icons[key] else - dat += "You aren't inside anyone." - - dat += "
" - - dat += "
    " - for(var/belly in user.vore_organs) - var/obj/belly/B = belly - if(B == selected) - dat += "
  1. [B.name]" - else - dat += "
  2. [B.name]" - var/spanstyle - switch(B.digest_mode) - if(DM_HOLD) - spanstyle = "" - if(DM_DIGEST) - spanstyle = "color:red;" - if(DM_HEAL) - spanstyle = "color:darkgreen;" - if(DM_NOISY) - spanstyle = "color:purple;" - if(DM_ABSORB) - spanstyle = "color:purple;" - if(DM_DRAGON) - spanstyle = "color:blue;" - - dat += " ([B.contents.len])
  3. " - - if(user.vore_organs.len < BELLIES_MAX) - dat += "
  4. New+
  5. " - dat += "
" - dat += "
" - - // Selected Belly (contents, configuration) - if(!selected) - dat += "No belly selected. Click one to select it." - else - if(selected.contents.len) - dat += "Contents: " - for(var/O in selected) - - //Mobs can be absorbed, so treat them separately from everything else - if(istype(O,/mob/living)) - var/mob/living/M = O - - //Absorbed gets special color OOoOOOOoooo - if(M.vore_flags & ABSORBED) - dat += "[O]" - continue - - //Anything else - dat += "[O]" - - //Zero-width space, for wrapping - dat += "​" - - //If there's more than one thing, add an [All] button - if(selected.contents.len > 1) - dat += "\[All\]" - - dat += "
" - - //Belly Name Button - dat += "Name:" - dat += " '[selected.name]'" - - //Belly Type button - dat += "
Is Fleshy:" - dat += "[selected.is_wet ? "Yes" : "No"]" - if(selected.is_wet) - dat += "
Internal loop for prey?:" - dat += "[selected.wet_loop ? "Yes" : "No"]" - - //Digest Mode Button - dat += "
Belly Mode:" - dat += " [selected.digest_mode]" - - //Belly verb - dat += "
Vore Verb:" - dat += " '[selected.vore_verb]'" - - //Inside flavortext - dat += "
Flavor Text:" - dat += " '[selected.desc]'" - - //Belly sound - dat += "
Vore Sound: [selected.vore_sound]" - dat += "Test" - - //Release sound - dat += "
Release Sound: [selected.release_sound]" - dat += "Test" - - //Belly messages - dat += "
Belly Messages" - - //Can belly taste? - dat += "
Can Taste:" - dat += " [selected.can_taste ? "Yes" : "No"]" - - //Minimum size prey must be to show up. - dat += "
Required examine size:" - dat += " [selected.bulge_size*100]%" - - //Belly escapability - dat += "
Belly Interactions ([selected.escapable ? "On" : "Off"])" - if(selected.escapable) - dat += "[show_interacts ? "Hide" : "Show"]" - - if(show_interacts && selected.escapable) - dat += "
" - dat += "Interaction Settings ?" - dat += "
Set Belly Escape Chance" - dat += " [selected.escapechance]%" - - dat += "
Set Belly Escape Time" - dat += " [selected.escapetime/10]s" - - //Special
here to add a gap - dat += "
" - dat += "
Set Belly Transfer Chance" - dat += " [selected.transferchance]%" - - dat += "
Set Belly Transfer Location" - dat += " [selected.transferlocation ? selected.transferlocation : "Disabled"]" - - //Special
here to add a gap - dat += "
" - dat += "
Set Belly Absorb Chance" - dat += " [selected.absorbchance]%" - - dat += "
Set Belly Digest Chance" - dat += " [selected.digestchance]%" - dat += "
" - - //Delete button - dat += "
Delete Belly" - - dat += "Set Flavor" - - dat += "
" - - //Under the last HR, save and stuff. - dat += "Save Prefs" - dat += "Refresh" - dat += "Reload Slot Prefs" - - dat += "
" - var/pref_on = "#173d15" - var/pref_off = "#990000" - dat += "
Toggle Digestable (Currently: [(user.vore_flags & DIGESTABLE) ? "ON" : "OFF"])" - dat += "
Toggle Devourable (Currently: [(user.vore_flags & DEVOURABLE) ? "ON" : "OFF"])" - dat += "
Toggle Feeding (Currently: [(user.vore_flags & FEEDING) ? "ON" : "OFF"])" - if(user.client.prefs) - dat += "
Toggle Licking (Currently: [(user.client.prefs.vore_flags & LICKABLE) ? "ON" : "OFF"])" - //Returns the dat html to the vore_look - return dat - -/datum/vore_look/proc/vp_interact(href, href_list) - var/mob/living/user = usr - for(var/H in href_list) - - if(href_list["close"]) - qdel(src) // Cleanup - user.vore_flags &= ~OPEN_PANEL - return - - if(href_list["show_int"]) - show_interacts = !show_interacts - return TRUE //Force update - - if(href_list["int_help"]) - alert("These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ - and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \ - These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ - will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ - only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help") - return FALSE //Force update - - if(href_list["outsidepick"]) - var/atom/movable/tgt = locate(href_list["outsidepick"]) - var/obj/belly/OB = locate(href_list["outsidebelly"]) - if(!(tgt in OB)) //Aren't here anymore, need to update menu. - return TRUE - var/intent = "Examine" - - if(istype(tgt,/mob/living)) - var/mob/living/M = tgt - intent = alert("What do you want to do to them?","Query","Examine","Help Out","Devour") - switch(intent) - if("Examine") //Examine a mob inside another mob - M.examine(user) - - if("Help Out") //Help the inside-mob out - if(user.stat || user.vore_flags & ABSORBED || M.vore_flags & ABSORBED) - to_chat(user,"You can't do that in your state!") - return TRUE - - to_chat(user,"You begin to push [M] to freedom!") - to_chat(M,"[usr] begins to push you to freedom!") - to_chat(M.loc,"Someone is trying to escape from inside you!") - sleep(50) - if(prob(33)) - OB.release_specific_contents(M) - to_chat(usr,"You manage to help [M] to safety!") - to_chat(M,"[user] pushes you free!") - to_chat(OB.owner,"[M] forces free of the confines of your body!") - else - to_chat(user,"[M] slips back down inside despite your efforts.") - to_chat(M," Even with [user]'s help, you slip back inside again.") - to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") - - if("Devour") //Eat the inside mob - if(user.vore_flags & ABSORBED || user.stat) - to_chat(user,"You can't do that in your state!") - return TRUE - - if(!user.vore_selected) - to_chat(user,"Pick a belly on yourself first!") - return TRUE - - var/obj/belly/TB = user.vore_selected - to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M,"[user] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - to_chat(OB.owner,"Someone inside you is eating someone else!") - - sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound. - if((user in OB) && (M in OB)) //Make sure they're still here. - to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") - to_chat(M,"[user] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") - to_chat(OB.owner,"Someone inside you has eaten someone else!") - TB.nom_mob(M) - - else if(istype(tgt,/obj/item)) - var/obj/item/T = tgt - if(!(tgt in OB)) - //Doesn't exist anymore, update. - return TRUE - intent = alert("What do you want to do to that?","Query","Examine","Use Hand") - switch(intent) - if("Examine") - T.examine(user) - - if("Use Hand") - if(user.stat) - to_chat(user,"You can't do that in your state!") - return TRUE - - user.ClickOn(T) - sleep(5) //Seems to exit too fast for the panel to update - - if(href_list["insidepick"]) - var/intent - - //Handle the [All] choice. Ugh inelegant. Someone make this pretty. - if(href_list["pickall"]) - intent = alert("Eject all, Move all?","Query","Eject all","Cancel","Move all") - switch(intent) - if("Cancel") - return FALSE - - if("Eject all") - if(user.stat) - to_chat(user,"You can't do that in your state!") - return FALSE - - selected.release_all_contents() - - if("Move all") - if(user.stat) - to_chat(user,"You can't do that in your state!") - return FALSE - - var/obj/belly/choice = input("Move all where?","Select Belly") as null|anything in user.vore_organs - if(!choice) - return FALSE - - for(var/atom/movable/tgt in selected) - to_chat(tgt,"You're squished from [user]'s [lowertext(selected)] to their [lowertext(choice.name)]!") - selected.transfer_contents(tgt, choice, 1) - - var/atom/movable/tgt = locate(href_list["insidepick"]) - if(!(tgt in selected)) //Old menu, needs updating because they aren't really there. - return TRUE //Forces update - intent = "Examine" - intent = alert("Examine, Eject, Move? Examine if you want to leave this box.","Query","Examine","Eject","Move") - switch(intent) - if("Examine") - tgt.examine(user) - - if("Eject") - if(user.stat) - to_chat(user,"You can't do that in your state!") - return FALSE - - selected.release_specific_contents(tgt) - - if("Move") - if(user.stat) - to_chat(user,"You can't do that in your state!") - return FALSE - - var/obj/belly/choice = input("Move [tgt] where?","Select Belly") as null|anything in user.vore_organs - if(!choice || !(tgt in selected)) - return FALSE - - to_chat(tgt,"You're squished from [user]'s [lowertext(selected.name)] to their [lowertext(choice.name)]!") - selected.transfer_contents(tgt, choice) - - if(href_list["newbelly"]) - if(user.vore_organs.len >= BELLIES_MAX) - return FALSE - - var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) - - var/failure_msg - if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." - // else if(whatever) //Next test here. - else - for(var/belly in user.vore_organs) - var/obj/belly/B = belly - if(lowertext(new_name) == lowertext(B.name)) - failure_msg = "No duplicate belly names, please." - break - - if(failure_msg) //Something went wrong. - alert(user,failure_msg,"Error!") - return FALSE - - var/obj/belly/NB = new(user) - NB.name = new_name - selected = NB - - if(href_list["bellypick"]) - selected = locate(href_list["bellypick"]) - user.vore_selected = selected - - //// - //Please keep these the same order they are on the panel UI for ease of coding - //// - if(href_list["b_name"]) - var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) - - var/failure_msg - if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) - failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." - // else if(whatever) //Next test here. - else - for(var/belly in user.vore_organs) - var/obj/belly/B = belly - if(lowertext(new_name) == lowertext(B.name)) - failure_msg = "No duplicate belly names, please." - break - - if(failure_msg) //Something went wrong. - alert(user,failure_msg,"Error!") - return FALSE - - selected.name = new_name - - if(href_list["b_wetness"]) - selected.is_wet = !selected.is_wet - - if(href_list["b_wetloop"]) - selected.wet_loop = !selected.wet_loop - - if(href_list["b_mode"]) - var/list/menu_list = selected.digest_modes - - var/new_mode = input("Choose Mode (currently [selected.digest_mode])") as null|anything in menu_list - if(!new_mode) - return FALSE - selected.digest_mode = new_mode - - if(href_list["b_desc"]) - var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",selected.desc) as message|null) - - if(new_desc) - new_desc = readd_quotes(new_desc) - if(length(new_desc) > BELLIES_DESC_MAX) - alert("Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error") - return FALSE - selected.desc = new_desc - else //Returned null - return FALSE - - if(href_list["b_msgs"]) - var/list/messages = list( - "Digest Message (to prey)", - "Digest Message (to you)", - "Struggle Message (outside)", - "Struggle Message (inside)", - "Examine Message (when full)", - "Reset All To Default" + . = icon2base64(getFlatIcon(target,defdir=SOUTH,no_anim=TRUE)) + nom_icons[key] = . + +/datum/vore_look/ui_data(mob/user) + var/list/data = list() + + if(!host) + return data + + data["unsaved_changes"] = unsaved_changes + data["show_pictures"] = show_pictures + + var/atom/hostloc = host.loc + var/list/inside = list() + if(isbelly(hostloc)) + var/obj/belly/inside_belly = hostloc + var/mob/living/pred = inside_belly.owner + + inside = list( + "absorbed" = host.vore_flags & ABSORBED, + "belly_name" = inside_belly.name, + "belly_mode" = inside_belly.digest_mode, + "desc" = inside_belly.desc || "No description.", + "pred" = pred, + "ref" = "\ref[inside_belly]", ) - alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message, max 10 messages per topic.","Really, don't.") - var/choice = input(user,"Select a type to modify. Messages from each topic are pulled at random when needed.","Pick Type") as null|anything in messages - var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name." + var/list/inside_contents = list() + for(var/atom/movable/O in inside_belly) + if(O == host) + continue - switch(choice) - if("Digest Message (to prey)") - var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",selected.get_messages("dmp")) as message - if(new_message) - selected.set_messages(new_message,"dmp") + var/list/info = list( + "name" = "[O]", + "absorbed" = FALSE, + "stat" = 0, + "ref" = "\ref[O]", + "outside" = FALSE, + ) + if(show_pictures) + info["icon"] = cached_nom_icon(O) + if(isliving(O)) + var/mob/living/M = O + info["stat"] = M.stat + if(M.vore_flags & ABSORBED) + info["absorbed"] = TRUE + inside_contents.Add(list(info)) + inside["contents"] = inside_contents + data["inside"] = inside - if("Digest Message (to you)") - var/new_message = input(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",selected.get_messages("dmo")) as message - if(new_message) - selected.set_messages(new_message,"dmo") + var/list/our_bellies = list() + for(var/belly in host.vore_organs) + var/obj/belly/B = belly + our_bellies.Add(list(list( + "selected" = (B == host.vore_selected), + "name" = B.name, + "ref" = "\ref[B]", + "digest_mode" = B.digest_mode, + "contents" = LAZYLEN(B.contents), + ))) + data["our_bellies"] = our_bellies - if("Struggle Message (outside)") - var/new_message = input(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",selected.get_messages("smo")) as message - if(new_message) - selected.set_messages(new_message,"smo") + var/list/selected_list = null + if(host.vore_selected) + var/obj/belly/selected = host.vore_selected + selected_list = list( + "belly_name" = selected.name, + "is_wet" = selected.is_wet, + "wet_loop" = selected.wet_loop, + "mode" = selected.digest_mode, + "verb" = selected.vore_verb, + "desc" = selected.desc, + "sound" = selected.vore_sound, + "release_sound" = selected.release_sound, + "can_taste" = selected.can_taste, + "bulge_size" = selected.bulge_size, + ) - if("Struggle Message (inside)") - var/new_message = input(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",selected.get_messages("smi")) as message - if(new_message) - selected.set_messages(new_message,"smi") + selected_list["escapable"] = selected.escapable + selected_list["interacts"] = list() + if(selected.escapable) + selected_list["interacts"]["escapechance"] = selected.escapechance + selected_list["interacts"]["escapetime"] = selected.escapetime + selected_list["interacts"]["transferchance"] = selected.transferchance + selected_list["interacts"]["transferlocation"] = selected.transferlocation + selected_list["interacts"]["absorbchance"] = selected.absorbchance + selected_list["interacts"]["digestchance"] = selected.digestchance - if("Examine Message (when full)") - var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",selected.get_messages("em")) as message - if(new_message) - selected.set_messages(new_message,"em") + var/list/selected_contents = list() + for(var/O in selected) + var/list/info = list( + "name" = "[O]", + "absorbed" = FALSE, + "stat" = 0, + "ref" = "\ref[O]", + "outside" = TRUE, + ) + if(show_pictures) + info["icon"] = cached_nom_icon(O) + if(isliving(O)) + var/mob/living/M = O + info["stat"] = M.stat + if(M.vore_flags & ABSORBED) + info["absorbed"] = TRUE + selected_contents.Add(list(info)) + selected_list["contents"] = selected_contents - if("Reset All To Default") - var/confirm = alert(user,"This will delete any custom messages. Are you sure?","Confirmation","DELETE","Cancel") - if(confirm == "DELETE") - selected.digest_messages_prey = initial(selected.digest_messages_prey) - selected.digest_messages_owner = initial(selected.digest_messages_owner) - selected.struggle_messages_outside = initial(selected.struggle_messages_outside) - selected.struggle_messages_inside = initial(selected.struggle_messages_inside) + data["selected"] = selected_list + data["prefs"] = list( + "digestable" = CHECK_BITFIELD(host.vore_flags, DIGESTABLE), + "devourable" = CHECK_BITFIELD(host.vore_flags, DEVOURABLE), + "feeding" = CHECK_BITFIELD(host.vore_flags, FEEDING), + "absorbable" = CHECK_BITFIELD(host.vore_flags, ABSORBABLE), + "allowmobvore" = CHECK_BITFIELD(host.vore_flags, MOBVORE), + "vore_sounds" = CHECK_BITFIELD(host.client.prefs.cit_toggles, EATING_NOISES), + "digestion_sounds" = CHECK_BITFIELD(host.client.prefs.cit_toggles, DIGESTION_NOISES), + "lickable" = CHECK_BITFIELD(host.vore_flags, LICKABLE), + "smellable" = CHECK_BITFIELD(host.vore_flags, SMELLABLE), + ) - if(href_list["b_verb"]) - var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) + return data - if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) - alert("Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") - return FALSE +/datum/vore_look/ui_act(action, params) + if(..()) + return TRUE - selected.vore_verb = new_verb + switch(action) + if("show_pictures") + show_pictures = !show_pictures + return TRUE + if("int_help") + tgui_alert(usr, "These control how your belly responds to someone using 'resist' while inside you. The percent chance to trigger each is listed below, \ + and you can change them to whatever you see fit. Setting them to 0% will disable the possibility of that interaction. \ + These only function as long as interactions are turned on in general. Keep in mind, the 'belly mode' interactions (digest/absorb) \ + will affect all prey in that belly, if one resists and triggers digestion/absorption. If multiple trigger at the same time, \ + only the first in the order of 'Escape > Transfer > Absorb > Digest' will occur.","Interactions Help") + return TRUE - if(href_list["b_release"]) - var/choice = input(user,"Currently set to [selected.release_sound]","Select Sound") as null|anything in GLOB.pred_release_sounds + // Host is inside someone else, and is trying to interact with something else inside that person. + if("pick_from_inside") + return pick_from_inside(usr, params) - if(!choice) - return + // Host is trying to interact with something in host's belly. + if("pick_from_outside") + return pick_from_outside(usr, params) - selected.release_sound = choice - - if(href_list["b_releasesoundtest"]) - var/sound/releasetest = GLOB.prey_release_sounds[selected.release_sound] - if(releasetest) - SEND_SOUND(user, releasetest) - - if(href_list["b_sound"]) - var/choice = input(user,"Currently set to [selected.vore_sound]","Select Sound") as null|anything in GLOB.pred_vore_sounds - - if(!choice) - return - - selected.vore_sound = choice - - if(href_list["b_soundtest"]) - var/sound/voretest = GLOB.prey_vore_sounds[selected.vore_sound] - if(voretest) - SEND_SOUND(user, voretest) - - if(href_list["b_tastes"]) - selected.can_taste = !selected.can_taste - - if(href_list["b_bulge_size"]) - var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null - if(new_bulge == null) - return - if(new_bulge == 0) //Disable. - selected.bulge_size = 0 - to_chat(user,"Your stomach will not be seen on examine.") - else if (!ISINRANGE(new_bulge,25,200)) - selected.bulge_size = 0.25 //Set it to the default. - to_chat(user,"Invalid size.") - else if(new_bulge) - selected.bulge_size = (new_bulge/100) - - if(href_list["b_escapable"]) - if(selected.escapable == FALSE) //Possibly escapable and special interactions. - selected.escapable = TRUE - to_chat(usr,"Prey now have special interactions with your [lowertext(selected.name)] depending on your settings.") - else if(selected.escapable == TRUE) //Never escapable. - selected.escapable = FALSE - to_chat(usr,"Prey will not be able to have special interactions with your [lowertext(selected.name)].") - show_interacts = FALSE //Force the hiding of the panel - else - alert("Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1 - selected.escapable = FALSE - show_interacts = FALSE //Force the hiding of the panel - - if(href_list["b_escapechance"]) - var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null - if(!isnull(escape_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options - selected.escapechance = sanitize_integer(escape_chance_input, 0, 100, initial(selected.escapechance)) - - if(href_list["b_escapetime"]) - var/escape_time_input = input(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time") as num|null - if(!isnull(escape_time_input)) - selected.escapetime = sanitize_integer(escape_time_input*10, 10, 600, initial(selected.escapetime)) - - if(href_list["b_transferchance"]) - var/transfer_chance_input = input(user, "Set belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null - if(!isnull(transfer_chance_input)) - selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(selected.transferchance)) - - if(href_list["b_transferlocation"]) - var/obj/belly/choice = input("Where do you want your [lowertext(selected.name)] to lead if prey resists?","Select Belly") as null|anything in (user.vore_organs + "None - Remove" - selected) - - if(!choice) //They cancelled, no changes - return FALSE - else if(choice == "None - Remove") - selected.transferlocation = null - else - selected.transferlocation = choice.name - - if(href_list["b_absorbchance"]) - var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null - if(!isnull(absorb_chance_input)) - selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(selected.absorbchance)) - - if(href_list["b_digestchance"]) - var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null - if(!isnull(digest_chance_input)) - selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(selected.digestchance)) - - if(href_list["b_del"]) - var/alert = alert("Are you sure you want to delete your [lowertext(selected.name)]?","Confirmation","Delete","Cancel") - if(!alert == "Delete") - return FALSE - - var/failure_msg = "" - - var/dest_for //Check to see if it's the destination of another vore organ. - for(var/belly in user.vore_organs) - var/obj/belly/B = belly - if(B.transferlocation == selected) - dest_for = B.name - failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. " - break - - if(selected.contents.len) - failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same. - if(selected.immutable) - failure_msg += "This belly is marked as undeletable. " - if(user.vore_organs.len == 1) - failure_msg += "You must have at least one belly. " - - if(failure_msg) - alert(user,failure_msg,"Error!") - return FALSE - - qdel(selected) - selected = user.vore_organs[1] - user.vore_selected = user.vore_organs[1] - - if(href_list["saveprefs"]) - if(!(user.client?.prefs)) - return FALSE - if(!user.copy_to_prefs_vr() || !user.client.prefs.save_character()) - to_chat(user, "Belly Preferences not saved!") - log_admin("Could not save vore prefs on USER: [user].") - else - to_chat(user, "Belly Preferences were saved!") - - if(href_list["applyprefs"]) - var/alert = alert("Are you sure you want to reload the current slot preferences? This will remove your current vore organs and eject their contents.","Confirmation","Reload","Cancel") - if(!alert == "Reload") - return FALSE - if(!user.copy_from_prefs_vr()) - alert("ERROR: Vore preferences failed to apply!","Error") - else - to_chat(user,"Vore preferences applied from active slot!") - - if(href_list["setflavor"]) - var/new_flavor = html_encode(input(usr,"What your character tastes like (40ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",user.vore_taste) as text|null) - if(!new_flavor) - return FALSE - - new_flavor = readd_quotes(new_flavor) - if(length(new_flavor) > MAX_TASTE_LEN) - alert("Entered flavor/taste text too long. [MAX_TASTE_LEN] character limit.","Error!") - return FALSE - user.vore_taste = new_flavor - - if(href_list["toggledg"]) - var/choice = alert(user, "This button is for those who don't like being digested. It can make you undigestable to all mobs. Digesting you is currently: [(user.vore_flags & DIGESTABLE) ? "Allowed" : "Prevented"]", "", "Allow Digestion", "Cancel", "Prevent Digestion") - if(!user || !user.client) - return - switch(choice) - if("Cancel") + if("newbelly") + if(host.vore_organs.len >= BELLIES_MAX) return FALSE - if("Allow Digestion") - user.vore_flags |= DIGESTABLE - user.client.prefs.vore_flags |= DIGESTABLE - if("Prevent Digestion") - user.vore_flags &= ~DIGESTABLE - user.client.prefs.vore_flags &= ~DIGESTABLE - if(href_list["toggledvor"]) - var/choice = alert(user, "This button is for those who don't like vore at all. Devouring you is currently: [(user.vore_flags & DEVOURABLE) ? "Allowed" : "Prevented"]", "", "Allow Devourment", "Cancel", "Prevent Devourment") - if(!user || !user.client) - return - switch(choice) - if("Cancel") + var/new_name = html_encode(input(usr,"New belly's name:","New Belly") as text|null) + + var/failure_msg + if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in host.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break + + if(failure_msg) //Something went wrong. + tgui_alert_async(usr, failure_msg, "Error!") + return TRUE + + var/obj/belly/NB = new(host) + NB.name = new_name + host.vore_selected = NB + unsaved_changes = TRUE + return TRUE + + if("bellypick") + host.vore_selected = locate(params["bellypick"]) + return TRUE + if("move_belly") + var/dir = text2num(params["dir"]) + if(LAZYLEN(host.vore_organs) <= 1) + to_chat(usr, "You can't sort bellies with only one belly to sort...") + return TRUE + + var/current_index = host.vore_organs.Find(host.vore_selected) + if(current_index) + var/new_index = clamp(current_index + dir, 1, LAZYLEN(host.vore_organs)) + host.vore_organs.Swap(current_index, new_index) + unsaved_changes = TRUE + return TRUE + + if("set_attribute") + return set_attr(usr, params) + + if("saveprefs") + if(!host.copy_to_prefs_vr()) + tgui_alert_async(usr, "Belly Preferences not saved!", "Error") + log_admin("Could not save vore prefs on USER: [usr].") + else + to_chat(usr, "Belly Preferences were saved!") + unsaved_changes = FALSE + return TRUE + if("reloadprefs") + var/alert = tgui_alert(usr, "Are you sure you want to reload character slot preferences? This will remove your current vore organs and eject their contents.","Confirmation",list("Reload","Cancel")) + if(alert != "Reload") return FALSE - if("Allow Devourment") - user.vore_flags |= DEVOURABLE - user.client.prefs.vore_flags |= DEVOURABLE - if("Prevent Devourment") - user.vore_flags &= ~DEVOURABLE - user.client.prefs.vore_flags &= ~DEVOURABLE - - if(href_list["toggledfeed"]) - var/choice = alert(user, "This button is to toggle your ability to be fed to others. Feeding predators is currently: [(user.vore_flags & FEEDING) ? "Allowed" : "Prevented"]", "", "Allow Feeding", "Cancel", "Prevent Feeding") - if(!user || !user.client) - return - switch(choice) - if("Cancel") + if(!host.copy_from_prefs_vr()) + tgui_alert_async(usr, "ERROR: Virgo-specific preferences failed to apply!","Error") + else + to_chat(usr, "Vore preferences applied from active slot!") + unsaved_changes = FALSE + return TRUE + if("setflavor") + var/new_flavor = html_encode(input(usr,"What your character tastes like (400ch limit). This text will be printed to the pred after 'X tastes of...' so just put something like 'strawberries and cream':","Character Flavor",host.vore_taste) as text|null) + if(!new_flavor) return FALSE - if("Allow Feeding") - user.vore_flags |= FEEDING - user.client.prefs.vore_flags |= FEEDING - if("Prevent Feeding") - user.vore_flags &= ~FEEDING - user.client.prefs.vore_flags &= ~FEEDING - if(href_list["toggledlickable"]) - var/choice = alert(user, "This button is to toggle your ability to be licked. Being licked is currently: [(user.client.prefs.vore_flags & LICKABLE) ? "Allowed" : "Prevented"]", "", "Allow Licking", "Cancel", "Prevent Licking") - if(!user || !user.client) - return - switch(choice) - if("Cancel") + new_flavor = readd_quotes(new_flavor) + if(length(new_flavor) > FLAVOR_MAX) + tgui_alert_async(usr, "Entered flavor/taste text too long. [FLAVOR_MAX] character limit.","Error!") + return FALSE + host.vore_taste = new_flavor + unsaved_changes = TRUE + return TRUE + if("setsmell") + var/new_smell = html_encode(input(usr,"What your character smells like (400ch limit). This text will be printed to the pred after 'X smells of...' so just put something like 'strawberries and cream':","Character Smell",host.vore_smell) as text|null) + if(!new_smell) return FALSE - if("Allow Licking") - user.client.prefs.vore_flags |= LICKABLE - if("Prevent Licking") - user.client.prefs.vore_flags &= ~LICKABLE - //Refresh when interacted with, returning 1 makes vore_look.Topic update - return TRUE + new_smell = readd_quotes(new_smell) + if(length(new_smell) > FLAVOR_MAX) + tgui_alert_async(usr, "Entered perfume/smell text too long. [FLAVOR_MAX] character limit.","Error!") + return FALSE + host.vore_smell = new_smell + unsaved_changes = TRUE + return TRUE + if("toggle_digest") + TOGGLE_BITFIELD(host.vore_flags, DIGESTABLE) + if(host.client.prefs) + COPY_SPECIFIC_BITFIELDS(host.client.prefs.vore_flags, host.vore_flags, DIGESTABLE) + unsaved_changes = TRUE + return TRUE + if("toggle_devour") + TOGGLE_BITFIELD(host.vore_flags, DEVOURABLE) + if(host.client.prefs) + COPY_SPECIFIC_BITFIELDS(host.client.prefs.vore_flags, host.vore_flags, DEVOURABLE) + unsaved_changes = TRUE + return TRUE + if("toggle_feed") + TOGGLE_BITFIELD(host.vore_flags, FEEDING) + if(host.client.prefs) + COPY_SPECIFIC_BITFIELDS(host.client.prefs.vore_flags, host.vore_flags, FEEDING) + unsaved_changes = TRUE + return TRUE + if("toggle_absorbable") + TOGGLE_BITFIELD(host.vore_flags, ABSORBABLE) + if(host.client.prefs) + COPY_SPECIFIC_BITFIELDS(host.client.prefs.vore_flags, host.vore_flags, ABSORBABLE) + unsaved_changes = TRUE + return TRUE + if("toggle_mobvore") + TOGGLE_BITFIELD(host.vore_flags, MOBVORE) + if(host.client.prefs) + COPY_SPECIFIC_BITFIELDS(host.client.prefs.vore_flags, host.vore_flags, MOBVORE) + unsaved_changes = TRUE + return TRUE + if("toggle_vore_sounds") + TOGGLE_BITFIELD(host.client.prefs.cit_toggles, EATING_NOISES) + unsaved_changes = TRUE + return TRUE + if("toggle_digestion_sounds") + TOGGLE_BITFIELD(host.client.prefs.cit_toggles, DIGESTION_NOISES) + unsaved_changes = TRUE + return TRUE + if("toggle_lickable") + TOGGLE_BITFIELD(host.vore_flags, LICKABLE) + unsaved_changes = TRUE + return TRUE + if("toggle_smellable") + TOGGLE_BITFIELD(host.vore_flags, SMELLABLE) + unsaved_changes = TRUE + return TRUE + +/datum/vore_look/proc/pick_from_inside(mob/user, params) + var/atom/movable/target = locate(params["pick"]) + var/obj/belly/OB = locate(params["belly"]) + + if(!(target in OB)) + return TRUE // Aren't here anymore, need to update menu + + var/intent = "Examine" + if(isliving(target)) + intent = tgui_alert(usr, "What do you want to do to them?","Query",list("Examine","Help Out","Devour")) + + else if(istype(target, /obj/item)) + intent = tgui_alert(usr, "What do you want to do to that?","Query",list("Examine","Use Hand")) + + switch(intent) + if("Examine") //Examine a mob inside another mob + var/list/results = target.examine(host) + if(!results || !results.len) + results = list("You were unable to examine that. Tell a developer!") + to_chat(user, jointext(results, "
")) + return TRUE + + if("Use Hand") + if(host.stat) + to_chat(user, "You can't do that in your state!") + return TRUE + + host.ClickOn(target) + return TRUE + + if(!isliving(target)) + return + + var/mob/living/M = target + switch(intent) + if("Help Out") //Help the inside-mob out + if(host.stat || host.vore_flags & ABSORBED || M.vore_flags & ABSORBED) + to_chat(user, "You can't do that in your state!") + return TRUE + + to_chat(user,"You begin to push [M] to freedom!") + to_chat(M,"[host] begins to push you to freedom!") + to_chat(M.loc,"Someone is trying to escape from inside you!") + sleep(50) + if(prob(33)) + OB.release_specific_contents(M) + to_chat(user,"You manage to help [M] to safety!") + to_chat(M,"[host] pushes you free!") + to_chat(OB.owner,"[M] forces free of the confines of your body!") + else + to_chat(user,"[M] slips back down inside despite your efforts.") + to_chat(M," Even with [host]'s help, you slip back inside again.") + to_chat(OB.owner,"Your body efficiently shoves [M] back where they belong.") + return TRUE + + if("Devour") //Eat the inside mob + if(host.stat || host.vore_flags & ABSORBED) + to_chat(user,"You can't do that in your state!") + return TRUE + + if(!host.vore_selected) + to_chat(user,"Pick a belly on yourself first!") + return TRUE + + var/obj/belly/TB = host.vore_selected + to_chat(user,"You begin to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[host] begins to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you is eating someone else!") + + sleep(TB.nonhuman_prey_swallow_time) //Can't do after, in a stomach, weird things abound. + if((host in OB) && (M in OB)) //Make sure they're still here. + to_chat(user,"You manage to [lowertext(TB.vore_verb)] [M] into your [lowertext(TB.name)]!") + to_chat(M,"[host] manages to [lowertext(TB.vore_verb)] you into their [lowertext(TB.name)]!") + to_chat(OB.owner,"Someone inside you has eaten someone else!") + TB.nom_mob(M) + +/datum/vore_look/proc/pick_from_outside(mob/user, params) + var/intent + + //Handle the [All] choice. Ugh inelegant. Someone make this pretty. + if(params["pickall"]) + intent = tgui_alert(usr, "Eject all, Move all?","Query",list("Eject all","Cancel","Move all")) + switch(intent) + if("Cancel") + return TRUE + + if("Eject all") + if(host.stat) + to_chat(user,"You can't do that in your state!") + return TRUE + + host.vore_selected.release_all_contents() + return TRUE + + if("Move all") + if(host.stat) + to_chat(user,"You can't do that in your state!") + return TRUE + + var/obj/belly/choice = tgui_input_list(usr, "Move all where?","Select Belly", host.vore_organs) + if(!choice) + return FALSE + + for(var/atom/movable/target in host.vore_selected) + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected)] to their [lowertext(choice.name)]!") + host.vore_selected.transfer_contents(target, choice, 1) + return TRUE + return + + var/atom/movable/target = locate(params["pick"]) + if(!(target in host.vore_selected)) + return TRUE // Not in our X anymore, update UI + var/list/available_options = list("Examine", "Eject", "Move") + intent = tgui_alert(user, "What would you like to do with [target]?", "Vore Pick", available_options) + switch(intent) + if("Examine") + var/list/results = target.examine(host) + if(!results || !results.len) + results = list("You were unable to examine that. Tell a developer!") + to_chat(user, jointext(results, "
")) + return TRUE + + if("Eject") + if(host.stat) + to_chat(user,"You can't do that in your state!") + return TRUE + + host.vore_selected.release_specific_contents(target) + return TRUE + + if("Move") + if(host.stat) + to_chat(user,"You can't do that in your state!") + return TRUE + + var/obj/belly/choice = tgui_input_list(usr, "Move [target] where?","Select Belly", host.vore_organs) + if(!choice || !(target in host.vore_selected)) + return TRUE + + to_chat(target,"You're squished from [host]'s [lowertext(host.vore_selected.name)] to their [lowertext(choice.name)]!") + host.vore_selected.transfer_contents(target, choice) + return TRUE + +/datum/vore_look/proc/set_attr(mob/user, params) + if(!host.vore_selected) + tgui_alert_async(usr, "No belly selected to modify.") + return FALSE + + var/attr = params["attribute"] + switch(attr) + if("b_name") + var/new_name = html_encode(input(usr,"Belly's new name:","New Name") as text|null) + + var/failure_msg + if(length(new_name) > BELLIES_NAME_MAX || length(new_name) < BELLIES_NAME_MIN) + failure_msg = "Entered belly name length invalid (must be longer than [BELLIES_NAME_MIN], no more than than [BELLIES_NAME_MAX])." + // else if(whatever) //Next test here. + else + for(var/belly in host.vore_organs) + var/obj/belly/B = belly + if(lowertext(new_name) == lowertext(B.name)) + failure_msg = "No duplicate belly names, please." + break + + if(failure_msg) //Something went wrong. + tgui_alert_async(user,failure_msg,"Error!") + return FALSE + + host.vore_selected.name = new_name + . = TRUE + if("b_wetness") + host.vore_selected.is_wet = !host.vore_selected.is_wet + . = TRUE + if("b_wetloop") + host.vore_selected.wet_loop = !host.vore_selected.wet_loop + . = TRUE + if("b_mode") + var/list/menu_list = host.vore_selected.digest_modes.Copy() + var/new_mode = tgui_input_list(usr, "Choose Mode (currently [host.vore_selected.digest_mode])", "Mode Choice", menu_list) + if(!new_mode) + return FALSE + + host.vore_selected.digest_mode = new_mode + . = TRUE + if("b_desc") + var/new_desc = html_encode(input(usr,"Belly Description ([BELLIES_DESC_MAX] char limit):","New Description",host.vore_selected.desc) as message|null) + + if(new_desc) + new_desc = readd_quotes(new_desc) + if(length(new_desc) > BELLIES_DESC_MAX) + tgui_alert_async(usr, "Entered belly desc too long. [BELLIES_DESC_MAX] character limit.","Error") + return FALSE + host.vore_selected.desc = new_desc + . = TRUE + if("b_msgs") + tgui_alert(user,"Setting abusive or deceptive messages will result in a ban. Consider this your warning. Max 150 characters per message (500 for idle messages), max 10 messages per topic.","Really, don't.") // Should remain tgui_alert() (blocking) + var/help = " Press enter twice to separate messages. '%pred' will be replaced with your name. '%prey' will be replaced with the prey's name. '%belly' will be replaced with your belly's name. '%count' will be replaced with the number of anything in your belly (will not work for absorbed examine). '%countprey' will be replaced with the number of living prey in your belly (or absorbed prey for absorbed examine)." + switch(params["msgtype"]) + if("dmp") + var/new_message = input(user,"These are sent to prey when they expire. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Digest Message (to prey)",host.vore_selected.get_messages("dmp")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"dmp") + + if("dmo") + var/new_message = input(user,"These are sent to you when prey expires in you. Write them in 2nd person ('you feel X'). Avoid using %pred in this type."+help,"Digest Message (to you)",host.vore_selected.get_messages("dmo")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"dmo") + + if("smo") + var/new_message = input(user,"These are sent to those nearby when prey struggles. Write them in 3rd person ('X's Y bulges')."+help,"Struggle Message (outside)",host.vore_selected.get_messages("smo")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"smo") + + if("smi") + var/new_message = input(user,"These are sent to prey when they struggle. Write them in 2nd person ('you feel X'). Avoid using %prey in this type."+help,"Struggle Message (inside)",host.vore_selected.get_messages("smi")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"smi") + + if("em") + var/new_message = input(user,"These are sent to people who examine you when this belly has contents. Write them in 3rd person ('Their %belly is bulging')."+help,"Examine Message (when full)",host.vore_selected.get_messages("em")) as message + if(new_message) + host.vore_selected.set_messages(new_message,"em") + + if("reset") + var/confirm = tgui_alert(user,"This will delete any custom messages. Are you sure?","Confirmation",list("Cancel","DELETE")) + if(confirm == "DELETE") + host.vore_selected.digest_messages_prey = initial(host.vore_selected.digest_messages_prey) + host.vore_selected.digest_messages_owner = initial(host.vore_selected.digest_messages_owner) + host.vore_selected.struggle_messages_outside = initial(host.vore_selected.struggle_messages_outside) + host.vore_selected.struggle_messages_inside = initial(host.vore_selected.struggle_messages_inside) + host.vore_selected.examine_messages = initial(host.vore_selected.examine_messages) + host.vore_selected.emote_lists = initial(host.vore_selected.emote_lists) + . = TRUE + if("b_verb") + var/new_verb = html_encode(input(usr,"New verb when eating (infinitive tense, e.g. nom or swallow):","New Verb") as text|null) + + if(length(new_verb) > BELLIES_NAME_MAX || length(new_verb) < BELLIES_NAME_MIN) + tgui_alert_async(usr, "Entered verb length invalid (must be longer than [BELLIES_NAME_MIN], no longer than [BELLIES_NAME_MAX]).","Error") + return FALSE + + host.vore_selected.vore_verb = new_verb + . = TRUE + if("b_release") + var/choice = tgui_input_list(user,"Currently set to [host.vore_selected.release_sound]","Select Sound", GLOB.pred_release_sounds) + + if(!choice) + return FALSE + + host.vore_selected.release_sound = choice + . = TRUE + if("b_releasesoundtest") + var/sound/releasetest = GLOB.pred_release_sounds[host.vore_selected.release_sound] + + if(releasetest) + SEND_SOUND(user, releasetest) + . = FALSE //Testing sound, no changes. + if("b_sound") + var/choice = tgui_input_list(user,"Currently set to [host.vore_selected.vore_sound]","Select Sound", GLOB.prey_vore_sounds) + + if(!choice) + return FALSE + + host.vore_selected.vore_sound = choice + . = TRUE + if("b_soundtest") + var/sound/voretest = GLOB.prey_vore_sounds[host.vore_selected.vore_sound] + if(voretest) + SEND_SOUND(user, voretest) + . = FALSE //Testing sound, no changes. + if("b_tastes") + host.vore_selected.can_taste = !host.vore_selected.can_taste + . = TRUE + if("b_bulge_size") + var/new_bulge = input(user, "Choose the required size prey must be to show up on examine, ranging from 25% to 200% Set this to 0 for no text on examine.", "Set Belly Examine Size.") as num|null + if(new_bulge == null) + return FALSE + if(new_bulge == 0) //Disable. + host.vore_selected.bulge_size = 0 + to_chat(user,"Your stomach will not be seen on examine.") + else if (!ISINRANGE(new_bulge,25,200)) + host.vore_selected.bulge_size = 0.25 //Set it to the default. + to_chat(user,"Invalid size.") + else if(new_bulge) + host.vore_selected.bulge_size = (new_bulge/100) + . = TRUE + if("b_escapable") + if(host.vore_selected.escapable == 0) //Possibly escapable and special interactions. + host.vore_selected.escapable = 1 + to_chat(usr,"Prey now have special interactions with your [lowertext(host.vore_selected.name)] depending on your settings.") + else if(host.vore_selected.escapable == 1) //Never escapable. + host.vore_selected.escapable = 0 + to_chat(usr,"Prey will not be able to have special interactions with your [lowertext(host.vore_selected.name)].") + else + tgui_alert_async(usr, "Something went wrong. Your stomach will now not have special interactions. Press the button enable them again and tell a dev.","Error") //If they somehow have a varable that's not 0 or 1 + host.vore_selected.escapable = 0 + . = TRUE + if("b_escapechance") + var/escape_chance_input = input(user, "Set prey escape chance on resist (as %)", "Prey Escape Chance") as num|null + if(!isnull(escape_chance_input)) //These have to be 'null' because both cancel and 0 are valid, separate options + host.vore_selected.escapechance = sanitize_integer(escape_chance_input, 0, 100, initial(host.vore_selected.escapechance)) + . = TRUE + if("b_escapetime") + var/escape_time_input = input(user, "Set number of seconds for prey to escape on resist (1-60)", "Prey Escape Time") as num|null + if(!isnull(escape_time_input)) + host.vore_selected.escapetime = sanitize_integer(escape_time_input*10, 10, 600, initial(host.vore_selected.escapetime)) + . = TRUE + if("b_transferchance") + var/transfer_chance_input = input(user, "Set belly transfer chance on resist (as %). You must also set the location for this to have any effect.", "Prey Escape Time") as num|null + if(!isnull(transfer_chance_input)) + host.vore_selected.transferchance = sanitize_integer(transfer_chance_input, 0, 100, initial(host.vore_selected.transferchance)) + . = TRUE + if("b_transferlocation") + var/obj/belly/choice = tgui_input_list(usr, "Where do you want your [lowertext(host.vore_selected.name)] to lead if prey resists?","Select Belly", (host.vore_organs + "None - Remove" - host.vore_selected)) + + if(!choice) //They cancelled, no changes + return FALSE + else if(choice == "None - Remove") + host.vore_selected.transferlocation = null + else + host.vore_selected.transferlocation = choice.name + . = TRUE + if("b_absorbchance") + var/absorb_chance_input = input(user, "Set belly absorb mode chance on resist (as %)", "Prey Absorb Chance") as num|null + if(!isnull(absorb_chance_input)) + host.vore_selected.absorbchance = sanitize_integer(absorb_chance_input, 0, 100, initial(host.vore_selected.absorbchance)) + . = TRUE + if("b_digestchance") + var/digest_chance_input = input(user, "Set belly digest mode chance on resist (as %)", "Prey Digest Chance") as num|null + if(!isnull(digest_chance_input)) + host.vore_selected.digestchance = sanitize_integer(digest_chance_input, 0, 100, initial(host.vore_selected.digestchance)) + . = TRUE + if("b_del") + var/alert = tgui_alert(usr, "Are you sure you want to delete your [lowertext(host.vore_selected.name)]?","Confirmation",list("Cancel","Delete")) + if(!(alert == "Delete")) + return FALSE + + var/failure_msg = "" + + var/dest_for //Check to see if it's the destination of another vore organ. + for(var/belly in host.vore_organs) + var/obj/belly/B = belly + if(B.transferlocation == host.vore_selected) + dest_for = B.name + failure_msg += "This is the destiantion for at least '[dest_for]' belly transfers. Remove it as the destination from any bellies before deleting it. " + break + + if(host.vore_selected.contents.len) + failure_msg += "You cannot delete bellies with contents! " //These end with spaces, to be nice looking. Make sure you do the same. + if(host.vore_selected.immutable) + failure_msg += "This belly is marked as undeletable. " + if(host.vore_organs.len == 1) + failure_msg += "You must have at least one belly. " + + if(failure_msg) + tgui_alert_async(user,failure_msg,"Error!") + return FALSE + + qdel(host.vore_selected) + host.vore_selected = host.vore_organs[1] + . = TRUE + + if(.) + unsaved_changes = TRUE diff --git a/code/modules/zombie/organs.dm b/code/modules/zombie/organs.dm index 2681f781a9..a724d26314 100644 --- a/code/modules/zombie/organs.dm +++ b/code/modules/zombie/organs.dm @@ -45,7 +45,7 @@ if(!owner) return if(!(src in owner.internal_organs)) - Remove(owner) + INVOKE_ASYNC(src,.proc/Remove,owner) if(owner.mob_biotypes & MOB_MINERAL)//does not process in inorganic things return if (causes_damage && !iszombie(owner) && owner.stat != DEAD) diff --git a/config/antag_rep.txt b/config/antag_rep.txt deleted file mode 100644 index e8a7250686..0000000000 --- a/config/antag_rep.txt +++ /dev/null @@ -1,5 +0,0 @@ -## Custom antag reputation values -## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles -## e.g. -## ANTAG_REP Captain 10 -## ANTAG_REP Assistant 0 diff --git a/config/config.txt b/config/config.txt index 611d63cb24..c0c683373d 100644 --- a/config/config.txt +++ b/config/config.txt @@ -1,18 +1,7 @@ # You can use the "$include" directive to split your configs however you want -$include game_options.txt -$include dbconfig.txt -$include comms.txt -$include antag_rep.txt -$include resources.txt -# Cit-specific imports -$include donator_groupings.txt -$include dynamic_config.txt -$include plushies/defines.txt -$include job_threats.txt -$include policy.txt -$include persistence.txt -$include respawns.txt +# MAKE SURE ENTRIES ARE SORTED IN THE SAME FASHION THEY ARE IN THE .dm +# if you don't do this i will find you and put lemons on your eyes. # You can use the @ character at the beginning of a config option to lock it from being edited in-game # Example usage: @@ -22,523 +11,31 @@ $include respawns.txt # Which explicitly disables LOG_TWITTER, as well as locking it. # There are various options which are hard-locked for security reasons. -## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice. -# SERVERNAME tgstation -## Server tagline: This will appear right below the server's title. -# SERVERTAGLINE A generic TG-based server - -## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. -# SERVERSQLNAME tgstation - -## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. -STATIONNAME Space Station 13 - -## Put on byond hub: Uncomment this to put your server on the byond hub. -#HUB - -## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. -LOBBY_COUNTDOWN 120 - -## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. -ROUND_END_COUNTDOWN 90 - -## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -ADMIN_LEGACY_SYSTEM - -##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel -#PROTECT_LEGACY_ADMINS - -##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel -#PROTECT_LEGACY_RANKS - -##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt -##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags -#LOAD_LEGACY_RANKS_ONLY - -## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. -BAN_LEGACY_SYSTEM - -## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank -ENABLE_LOCALHOST_RANK - -## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. -## You need to set up your database to use the SQL based system. -## This flag is automatically enabled if SQL_ENABLED isn't -MENTOR_LEGACY_SYSTEM - -#Mentors only see ckeys by default. Uncomment to have them only see mob name -#MENTORS_MOBNAME_ONLY - -## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing -## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. -## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. -## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means -## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. -#USE_AGE_RESTRICTION_FOR_JOBS - -## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. -#USE_ACCOUNT_AGE_FOR_JOBS - -## Unhash this to track player playtime in the database. Requires database to be enabled. -#USE_EXP_TRACKING -## Unhash this to enable playtime requirements for head jobs. -#USE_EXP_RESTRICTIONS_HEADS -## Unhash this to override head jobs' playtime requirements with this number of hours. -## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes. -#USE_EXP_RESTRICTIONS_HEADS_HOURS 3 -## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. -#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT -## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. -#USE_EXP_RESTRICTIONS_OTHER -## Allows admins to bypass job playtime requirements. -#USE_EXP_RESTRICTIONS_ADMIN_BYPASS - -## log OOC channel -LOG_OOC - -## log client Say -LOG_SAY - -## log admin actions -LOG_ADMIN - -## log admin chat -LOG_ADMINCHAT - -## log client access (logon/logoff) -LOG_ACCESS - -## log game actions (start of round, results, etc.) -LOG_GAME - -## log player votes -LOG_VOTE - -## log player crafting -LOG_CRAFT - -## log client Whisper -LOG_WHISPER - -## log emotes -LOG_EMOTE - -## log attack messages -LOG_ATTACK - -## log pda messages -LOG_PDA - -## log telecomms messages -LOG_TELECOMMS - -## log prayers -LOG_PRAYER - -## log lawchanges -LOG_LAW - -## log crew manifest to seperate file -LOG_MANIFEST - -## log job divide debugging information -#LOG_JOB_DEBUG - -## log all world.Topic() calls -# LOG_WORLD_TOPIC - -## enables use of the proc twitterize() that lets you take a large list of strings and turn it into a JSON file of tweet sized strings. -## As an example of how this could be """useful""" look towards Poly (https://twitter.com/Poly_the_Parrot) -# LOG_TWITTER - -## Enable logging pictures -# LOG_PICTURES - -## log virus and actions -LOG_VIRUS - -##Log camera pictures - Must have picture logging enabled -PICTURE_LOGGING_CAMERA - -## period of time in seconds for players to be considered inactive -# INACTIVITY_PERIOD 300 - -## period of time in seconds for players to be considered afk and kickable -# AFK_PERIOD 600 - -## disconnect players who are considered afk -# KICK_INACTIVE - -## Comment this out to stop admins being able to choose their personal ooccolor -ALLOW_ADMIN_OOCCOLOR - -## Job slot open/close by identification consoles delay in seconds -ID_CONSOLE_JOBSLOT_DELAY 30 - -## allow players to initiate a restart vote -#ALLOW_VOTE_RESTART - -## allow players to initate a mode-change start -#ALLOW_VOTE_MODE - -## min delay (deciseconds) between voting sessions (default 10 minutes) -VOTE_DELAY 6000 - -## time period (deciseconds) which voting session will last (default 1 minute) -VOTE_PERIOD 600 - -## autovote initial delay (deciseconds) before first automatic transfer vote call (default 120 minutes) -## Set to 0 to disable the subsystem altogether. -VOTE_AUTOTRANSFER_INITIAL 72000 - -## autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes) -VOTE_AUTOTRANSFER_INTERVAL 18000 - -## autovote maximum votes until automatic transfer call. (default 4) -## Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. -## Set to -1 to disable the maximum votes cap. -VOTE_AUTOTRANSFER_MAXIMUM 4 - -## prevents dead players from voting or starting votes -# NO_DEAD_VOTE - -## players' votes default to "No vote" (otherwise, default to "No change") -# DEFAULT_NO_VOTE - -## disables calling del(src) on newmobs if they logout before spawnin in -# DONT_DEL_NEWMOB - -## set a hosted by name for unix platforms -HOSTEDBY Yournamehere - -## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. -## Set to 1 to jobban them from those positions, set to 0 to allow them. -# GUEST_JOBBAN - -## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) -GUEST_BAN - -## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) -CHECK_RANDOMIZER - -## IPINTEL: -## This allows you to detect likely proxies by checking ips against getipintel.net -## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning -#IPINTEL_RATING_BAD 0.9 -## Contact email, (required to use the service, leaving blank or default disables IPINTEL) -#IPINTEL_EMAIL ch@nge.me -## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) -#IPINTEL_SAVE_GOOD 12 -## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) -#IPINTEL_SAVE_BAD 3 -## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) -#IPINTEL_DOMAIN check.getipintel.net - -## Uncomment to allow web client connections -#ALLOW_WEBCLIENT - -## Uncomment to restrict web client connections to byond members -## This makes for a nice pay gate to cut down on ban evading, as the webclient's cid system isn't that great -## byond membership starts at $10 for 3 months, so to use the webclient to evade, they would have sink 10 bucks in each evade. -#WEBCLIENT_ONLY_BYOND_MEMBERS - -## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server -#USEWHITELIST - -## set a server location for world reboot. Don't include the byond://, just give the address and port. -## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. -# SERVER ss13.example.com:2506 - -## forum address -# FORUMURL https://citadel-station.net/forum/ - -## Wiki address -# WIKIURL https://katlin.dog/citadel-wiki - -## Rules address -# RULESURL https://katlin.dog/citadel-rules/main - -## Github address -# GITHUBURL https://github.com/Citadel-Station-13/Citadel-Station-13 - -## Round specific stats address -## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() -## This will take priority over the game logs address during reboot. -## Example: https://atlantaned.space/statbus/round.php?round= -# ROUNDSTATSURL http://citadel-station.net/slimbus/ - -## Game Logs address -## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. -## Example: https://tgstation13.org/parsed-logs/basil/data/logs/ -# GAMELOGURL - -## Github repo id -##This can be found by going to https://api.github.com/users//repos -##Or https://api.github.com/orgs//repos if the repo owner is an organization -# GITHUBREPOID 62485194 - -## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. -# BANAPPEALS https://citadel-station.net/forum/viewforum.php?f=8&sid=a0ce5331d5594ef6d49661609c6f4ff9 - -## System command that invokes youtube-dl, used by Play Internet Sound. -## You can install youtube-dl with -## "pip install youtube-dl" if you have pip installed -## from https://github.com/rg3/youtube-dl/releases -## or your package manager -## The default value assumes youtube-dl is in your system PATH -# INVOKE_YOUTUBEDL youtube-dl - -## In-game features -##Toggle for having jobs load up from the .txt -# LOAD_JOBS_FROM_TXT - -## Uncomment this to forbid admins from possessing the singularity. -#FORBID_SINGULO_POSSESSION - -## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM. -## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) -#POPUP_ADMIN_PM - -## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR -ALLOW_HOLIDAYS - -## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin. -#SHOW_IRC_NAME - -## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster. -##This is currently a testing optimized setting. A good value for production would be 98. -TICK_LIMIT_MC_INIT 500 - -##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second). -## This also controls the client network update rate, as well as the default client fps -TICKLAG 0.5 - -##Can also be set as per-second value, the following value is identical to the above. -#FPS 20 - -## Comment this out to disable automuting -#AUTOMUTE_ON - -## Uncomment this to let players see their own notes (they can still be set by admins only) -#SEE_OWN_NOTES - -### Comment these two out to prevent notes fading out over time for admins. -## Notes older then this will start fading out. -NOTE_FRESH_DAYS 91.31055 -## Notes older then this will be completely faded out. -NOTE_STALE_DAYS 365.2422 - -##Note: all population caps can be used with each other if desired. - -## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. -#SOFT_POPCAP 100 - -## Message for soft cap -SOFT_POPCAP_MESSAGE Be warned that the server is currently serving a high number of users, consider using alternative game servers. - -## Uncomment for 'hard' population caps, players will not be allowed to spawn if the living crew exceeds the listed number, though they may still observe or wait for the living crew to decrease in size. -#HARD_POPCAP 150 - -## Message for hard cap -HARD_POPCAP_MESSAGE The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers. - -## Uncomment for 'extreme' population caps, players will not be allowed to join the server if living crew exceeds the listed number. -#EXTREME_POPCAP 200 - -## Message for extreme cap -EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, find alternative servers. - -## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) -## Requres database -NOTIFY_NEW_PLAYER_AGE 0 - -## Notify admins when a player connects if their byond account was created in the last X days -## Requires database -NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 - -## Notify the irc channel when a new player makes their first connection -## Requres database -#IRC_FIRST_CONNECTION_ALERT - -## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) -## Requires database -#PANIC_BUNKER - -## If a player connects during a bunker with less then or this amount of living time (Minutes), we deny the connection -#PANIC_BUNKER_LIVING 90 - -## The message the Panic Bunker gives when someone is rejected by it -## %minutes% is replaced with PANIC_BUNKER_LIVING on runtime, remove it if you don't want this -#PANIC_BUNKER_MESSAGE Sorry, but the server is currently not accepting connections from players with less than %minutes% minutes of living time. - -## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. -## You probably want this to be the same as CROSS_SERVER_ADDRESS -#PANIC_SERVER_ADDRESS byond://address:port - -##Name of the place to send people rejected by the bunker -#PANIC_SERVER_NAME [Put the name here] - -##Automated age verification, comment this out to not ask new users if they are 18+ -#AGE_VERIFICATION - -## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog -#AGGRESSIVE_CHANGELOG - -## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes -AUTOCONVERT_NOTES - -## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm -ANNOUNCE_ADMIN_LOGOUT - -## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm -#ANNOUNCE_ADMIN_LOGIN - -## Map rotation -## You should edit maps.txt to match your configuration when you enable this. -MAPROTATION - -## TG-style map rotation -## By default, Citadel uses a more traditional method of map voting, where at the end of a round, players are given a full upfront vote. -## This PR will disable that, and will make the server use TG's map rotation instead. -#TGSTYLE_MAPROTATION - -## Map voting -## Allows players to vote for their preffered map -## When it's set to zero, the map will be randomly picked each round -ALLOW_MAP_VOTING 1 - -## Map voting type -## Determines what kind of vote the map vote is -## Options are: -## PLURALITY (default, only vote for one option) -## APPROVAL (can vote for as many as you want), I -## IRV (vote by ranked choice, winner determined by instant runoff algorithm) -## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) -MAP_VOTE_TYPE APPROVAL - -## Map rotate chance delta -## This is the chance of map rotation factored to the round length. -## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) -## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) -#MAPROTATIONCHANCEDELTA 0.75 - -## AUTOADMIN -## The default admin rank -AUTOADMIN_RANK Game Master - -## Uncomment to automatically give that admin rank to all players -#AUTOADMIN - -## CLIENT VERSION CONTROL -## This allows you to configure the minimum required client version, as well as a warning version, and message for both. -## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. -## These messages will be followed by one stating the clients current version and the required version for clarity. -## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead -#CLIENT_WARN_VERSION 511 -#CLIENT_WARN_POPUP -#CLIENT_WARN_MESSAGE Byond released 511 as the stable release. You can set the framerate your client runs at, which makes the game feel very different and cool. Shortly after its release we will end up using 511 client features and you will be forced to update. -CLIENT_ERROR_VERSION 511 -CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. -## The minimum build needed for joining the server, if using 512, a good minimum build would be 1421 as that disables the Middle Mouse Button exploit. -CLIENT_ERROR_BUILD 1421 - -## TOPIC RATE LIMITING -## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 or comment out to disable. -SECOND_TOPIC_LIMIT 10 - -MINUTE_TOPIC_LIMIT 100 - - -## CLICK RATE LIMITING -## Same as above, but applies to clicking on objects in the game window. -## This should be a higher then the interface limit to allow for the spam clickly nature of most battles. -## Admins are exempt from these limits. -## Hitting the minute limit notifies admins. -## Set to 0 to disable. -SECOND_CLICK_LIMIT 15 - -MINUTE_CLICK_LIMIT 400 - -##Error handling related options -## The "cooldown" time for each occurence of a unique error -#ERROR_COOLDOWN 600 -## How many occurences before the next will silence them -#ERROR_LIMIT 90 -## How long a unique error will be silenced for -#ERROR_SILENCE_TIME 6000 -##How long to wait between messaging admins about occurences of a unique error -#ERROR_MSG_DELAY 50 - -## Chat Announce Options -## Various messages to be sent to game chats -## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS4 -## If using TGS4, the string option can be set as a chat channel tag to limit the message to channels of that tag type (case-sensitive) -## i.e. CHAT_ANNOUNCE_NEW_GAME chat_channel_tag - -## Send a message with the station name starting a new game -#CHAT_ANNOUNCE_NEW_GAME - -## Allow admin hrefs that don't use the new token system, will eventually be removed -DEBUG_ADMIN_HREFS - -###Master Controller High Pop Mode### - -##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc) -##Default base MC tick rate (1 = process every "byond tick" (see: tick_lag/fps config settings), 2 = process every 2 byond ticks, etc) -## Setting this to 0 will prevent the Master Controller from ticking -BASE_MC_TICK_RATE 1 - -##High population MC tick rate -## Byond rounds timer values UP, but the tick rate is modified with heuristics during lag spites so setting this to something like 2 -## will make it run every 2 byond ticks, but will also double the effect of anti-lag heuristics. You can instead set it to something like -## 1.1 to make it run every 2 byond ticks, but only increase the effect of anti-lag heuristics by 10%. or 1.5 for 50%. -## (As an aside, you could in theory also reduce the effect of anti-lag heuristics in the base tick rate by setting it to something like 0.5) -HIGH_POP_MC_TICK_RATE 1.1 - -##Engage high pop mode if player count raises above this (Player in this context means any connected user. Lobby, ghost or in-game all count) -HIGH_POP_MC_MODE_AMOUNT 65 - -##Disengage high pop mode if player count drops below this -DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 - -## Uncomment to prevent the world from sleeping while no players are connected after initializations -#RESUME_AFTER_INITIALIZATIONS - -## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools. -#ROUNDS_UNTIL_HARD_RESTART 10 - -## Number of days for an individual panic bunker passthrough entry to be wiped. Note that they're also wiped as soon as a player is in the database. -#MAX_BUNKER_DAYS 7 - -##Default screen resolution, in tiles. -## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. -## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. -## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. -DEFAULT_VIEW 21x15 - -### FAIL2TOPIC: -### Automated IP bans for world/Topic() spammers -### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. -### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. -## Enabled -#FAIL2TOPIC_ENABLED -## Minimum wait time in deciseconds between valid requests -FAIL2TOPIC_RATE_LIMIT 10 -## Number of requests after breaching rate limit that triggers a ban -FAIL2TOPIC_MAX_FAILS 5 -## Firewall rule name used on physical server -## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND -FAIL2TOPIC_RULE_NAME _dd_fail2topic - -## Enable automatic profiling - Byond 513.1506 and newer only. -#AUTO_PROFILE - -## Uncomment to enable global ban DB using the provided URL. The API should expect to receive a ckey at the end of the URL. -## More API details can be found here: https://centcom.melonmesa.com -CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search +$include entries/admin.txt +$include entries/alert.txt +$include entries/antag_rep.txt +$include entries/comms.txt +$include entries/connections.txt +$include entries/dbconfig.txt +$include entries/debris.txt +$include entries/donator.txt +$include entries/dynamic.txt +$include entries/fetish_content.txt +$include entries/gamemodes.txt +$include entries/general.txt +$include entries/jexp.txt +$include entries/logging.txt +$include entries/movespeed.txt +$include entries/persistence.txt +$include entries/policy.txt +$include entries/resources.txt +$include entries/respawns.txt +$include entries/security.txt +$include entries/server.txt +$include entries/stamina_combat.txt +$include entries/threat.txt +$include entries/urls.txt +$include entries/vote.txt + +$include plushies/defines.txt diff --git a/config/donator_groupings.txt b/config/donator_groupings.txt deleted file mode 100644 index b26d1efe22..0000000000 --- a/config/donator_groupings.txt +++ /dev/null @@ -1,8 +0,0 @@ -#this is a bad system but I'm lazy so it piggybacks off config loader system. -#Specify group followed by ckey for each ckey. - -#TIER_1_DONATORS test_ckey - -#TIER_2_DONATORS test_ckey - -#TIER_3_DONATORS test_ckey diff --git a/config/entries/admin.txt b/config/entries/admin.txt new file mode 100644 index 0000000000..883bda9422 --- /dev/null +++ b/config/entries/admin.txt @@ -0,0 +1,79 @@ +## Comment this out if you want to use the SQL based admin system, the legacy system uses admins.txt. +## You need to set up your database to use the SQL based system. +## This flag is automatically enabled if SQL_ENABLED isn't +ADMIN_LEGACY_SYSTEM + +##Uncomment this to stop any admins loaded by the legacy system from having their rank edited by the permissions panel +#PROTECT_LEGACY_ADMINS + +##Uncomment this to stop any ranks loaded by the legacy system from having their flags edited by the permissions panel +#PROTECT_LEGACY_RANKS + +##Uncomment this to have admin ranks only loaded from the legacy admin_ranks.txt +##If enabled, each time admins are loaded ranks the database will be updated with the current ranks and their flags +#LOAD_LEGACY_RANKS_ONLY + +## Comment this out if you want to use the SQL based banning system. The legacy systems use the files in the data folder. You need to set up your database to use the SQL based system. +BAN_LEGACY_SYSTEM + +## Comment this out to stop locally connected clients from being given the almost full access !localhost! admin rank +ENABLE_LOCALHOST_RANK + +## Comment this out if you want to use the SQL based mentor system, the legacy system uses mentors.txt. +## You need to set up your database to use the SQL based system. +## This flag is automatically enabled if SQL_ENABLED isn't +MENTOR_LEGACY_SYSTEM + +#Mentors only see ckeys by default. Uncomment to have them only see mob name +#MENTORS_MOBNAME_ONLY + +## Uncomment this to forbid admins from possessing the singularity. +#FORBID_SINGULO_POSSESSION + +## Uncomment to show a popup 'reply to' window to every non-admin that receives an adminPM. +## The intention is to make adminPMs more visible. (although I fnd popups annoying so this defaults to off) +#POPUP_ADMIN_PM + +## Uncomment this to let players see their own notes (they can still be set by admins only) +#SEE_OWN_NOTES + +### Comment these two out to prevent notes fading out over time for admins. +## Notes older then this will start fading out. +NOTE_FRESH_DAYS 91.31055 +## Notes older then this will be completely faded out. +NOTE_STALE_DAYS 365.2422 + +## Comment this out if you've used the mass conversion sql proc for notes or want to stop converting notes +AUTOCONVERT_NOTES + +## Comment this out to stop admin messages sent anytime an admin disconnects from a round in play, you can edit the messages in admin.dm +ANNOUNCE_ADMIN_LOGOUT + +## Uncomment to have an admin message sent anytime an admin connects to a round in play, you can edit the messages in admin.dm +#ANNOUNCE_ADMIN_LOGIN + +## More API details can be found here: https://centcom.melonmesa.com +CENTCOM_BAN_DB https://centcom.melonmesa.com/ban/search + +## AUTOADMIN +## The default admin rank +AUTOADMIN_RANK Game Master + +## Uncomment to automatically give that admin rank to all players +#AUTOADMIN + +## Comment this out to stop admins being able to choose their personal ooccolor +ALLOW_ADMIN_OOCCOLOR + +## Set to jobban "Guest-" accounts from Captain, HoS, HoP, CE, RD, CMO, Warden, Security, Detective, and AI positions. +## Set to 1 to jobban them from those positions, set to 0 to allow them. +# GUEST_JOBBAN + +## Uncomment this to stop people connecting to your server without a registered ckey. (i.e. guest-* are all blocked from connecting) +GUEST_BAN + +## Comment this out to disable automuting +#AUTOMUTE_ON + +## Allow admin hrefs that don't use the new token system, will eventually be removed +DEBUG_ADMIN_HREFS diff --git a/config/entries/alert.txt b/config/entries/alert.txt new file mode 100644 index 0000000000..5a03eadaec --- /dev/null +++ b/config/entries/alert.txt @@ -0,0 +1,13 @@ +## ALERT LEVELS ### +ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. +ALERT_BLUE_UPTO The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted. +ALERT_BLUE_DOWNTO Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted. +ALERT_AMBER_UPTO There are signficant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised. +ALERT_AMBER_DOWNTO The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored. +ALERT_RED_UPTO There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted. +ALERT_RED_DOWNTO The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force. +ALERT_DELTA Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. + +## Determines the minimum alert level for the security cyborg model to be chosen +## 0: Green, 1:Blue, 2:Amber, 3:Red, 4:Delta +MINIMUM_SECBORG_ALERT 3 diff --git a/config/entries/antag_rep.txt b/config/entries/antag_rep.txt new file mode 100644 index 0000000000..6cd9315a0c --- /dev/null +++ b/config/entries/antag_rep.txt @@ -0,0 +1,19 @@ +## disclaimer: this is a confusing file. reading and understanding antag rep code is recommended for future headmins/server leads. + +## Use the antagonist reputation system +# ANTAG_REP + +## Maximum antag roll ticketts someone can have +# ANTAG_REP_MAXIMUM 200 + +## "Free" tickets someone gets on roll +# DEFAULT_ANTAG_TICKETS 100 + +## Maximum **STORED** tickets used ontop of default per roll +# MAX_TICKETS_PER_ROLL 100 + +## Custom antag reputation values +## List of job titles followed by antag rep value, all prefixed with ANTAG_REP. See code/modules/jobs/job_types for titles +## e.g. +## ANTAG_REP Captain 10 +## ANTAG_REP Assistant 0 diff --git a/config/comms.txt b/config/entries/comms.txt similarity index 78% rename from config/comms.txt rename to config/entries/comms.txt index ae336d484b..7af6a758d3 100644 --- a/config/comms.txt +++ b/config/entries/comms.txt @@ -7,9 +7,12 @@ #CROSS_SERVER ServerName byond:\\address:port ## Name that the server calls itself in communications -#CROSS_COMMS_NAME +# CROSS_COMMS_NAME Citadel Main ## Network-name used for cross-server broadcasts made from communication consoles. ## Servers that do not match this network-name will have their messages discarded. ## Leaving this commented will allow all messages through, regardless of network. #CROSS_COMMS_NETWORK default_network + +## CITADEL CONFIG: List of cross server URLs, same as CROSS_SERVER, to send bunker override messages for +## Format is the same as CROSS_SERVER. diff --git a/config/entries/connections.txt b/config/entries/connections.txt new file mode 100644 index 0000000000..6351a77fcf --- /dev/null +++ b/config/entries/connections.txt @@ -0,0 +1,93 @@ +## Deny all new connections by ckeys we haven't seen before (exempts admins and only denies the connection if the database is enabled and connected) +## Requires database +#PANIC_BUNKER + +## If a player connects during a bunker with less then or this amount of living time (Minutes), we deny the connection +#PANIC_BUNKER_LIVING 90 + +## The message the Panic Bunker gives when someone is rejected by it +## %minutes% is replaced with PANIC_BUNKER_LIVING on runtime, remove it if you don't want this +#PANIC_BUNKER_MESSAGE Sorry, but the server is currently not accepting connections from players with less than %minutes% minutes of living time. + +## If panic bunker is on and a player is rejected (see above), attempt to send them to this connected server (see below) instead. +## You probably want this to be the same as CROSS_SERVER_ADDRESS +#PANIC_SERVER_ADDRESS byond://address:port + +##Name of the place to send people rejected by the bunker +#PANIC_SERVER_NAME [Put the name here] + +## Number of days for an individual panic bunker passthrough entry to be wiped. Note that they're also wiped as soon as a player is in the database. +#MAX_BUNKER_DAYS 7 + +## Notify admins when a new player connects for the first x days a player's been around. (0 for first connection only, -1 for never) +## Requres database +NOTIFY_NEW_PLAYER_AGE 0 + +## Notify admins when a player connects if their byond account was created in the last X days +## Requires database +NOTIFY_NEW_PLAYER_ACCOUNT_AGE 1 + +##Automated age verification, comment this out to not ask new users if they are 18+ +#AGE_VERIFICATION + +## Notify the irc channel when a new player makes their first connection +## Requres database +#IRC_FIRST_CONNECTION_ALERT + +## Comment this out to disable checking for the cid randomizer dll. (disabled if database isn't enabled or connected) +CHECK_RANDOMIZER + +## IPINTEL: +## This allows you to detect likely proxies by checking ips against getipintel.net +## Rating to warn at: (0.9 is good, 1 is 100% likely to be a spammer/proxy, 0.8 is 80%, etc) anything equal to or higher then this number triggers an admin warning +#IPINTEL_RATING_BAD 0.9 +## Contact email, (required to use the service, leaving blank or default disables IPINTEL) +#IPINTEL_EMAIL ch@nge.me +## How long to save good matches (ipintel rate limits to 15 per minute and 500 per day. so this shouldn't be too low, getipintel.net suggests 6 hours, time is in hours) (Your ip will get banned if you go over 500 a day too many times) +#IPINTEL_SAVE_GOOD 12 +## How long to save bad matches (these numbers can change as ips change hands, best not to save these for too long in case somebody gets a new ip used by a spammer/proxy before.) +#IPINTEL_SAVE_BAD 3 +## Domain name to query (leave commented out for the default, only needed if you pay getipintel.net for more querys) +#IPINTEL_DOMAIN check.getipintel.net + +## Uncomment to have the changelog file automatically open when a user connects and hasn't seen the latest changelog +#AGGRESSIVE_CHANGELOG + +## Uncomment to allow web client connections +#ALLOW_WEBCLIENT + +## Uncomment to restrict web client connections to byond members +## This makes for a nice pay gate to cut down on ban evading, as the webclient's cid system isn't that great +## byond membership starts at $10 for 3 months, so to use the webclient to evade, they would have sink 10 bucks in each evade. +#WEBCLIENT_ONLY_BYOND_MEMBERS + +## CLIENT VERSION CONTROL +## This allows you to configure the minimum required client version, as well as a warning version, and message for both. +## These trigger for any version below (non-inclusive) the given version, so 510 triggers on 509 or lower. +## These messages will be followed by one stating the clients current version and the required version for clarity. +## If CLIENT_WARN_POPUP is uncommented a popup window with the message will be displayed instead +#CLIENT_WARN_VERSION 511 +#CLIENT_WARN_POPUP +#CLIENT_WARN_MESSAGE Byond released 511 as the stable release. You can set the framerate your client runs at, which makes the game feel very different and cool. Shortly after its release we will end up using 511 client features and you will be forced to update. +CLIENT_ERROR_VERSION 511 +CLIENT_ERROR_MESSAGE Your version of byond is not supported. Please upgrade. +## The minimum build needed for joining the server, if using 512, a good minimum build would be 1421 as that disables the Middle Mouse Button exploit. +CLIENT_ERROR_BUILD 1421 + +## Uncomment for 'soft' population caps, players will be warned while joining if the living crew exceeds the listed number. +#SOFT_POPCAP 100 + +## Message for soft cap +SOFT_POPCAP_MESSAGE Be warned that the server is currently serving a high number of users, consider using alternative game servers. + +## Uncomment for 'hard' population caps, players will not be allowed to spawn if the living crew exceeds the listed number, though they may still observe or wait for the living crew to decrease in size. +#HARD_POPCAP 150 + +## Message for hard cap +HARD_POPCAP_MESSAGE The server is currently serving a high number of users, You cannot currently join. You may wait for the number of living crew to decline, observe, or find alternative servers. + +## Uncomment for 'extreme' population caps, players will not be allowed to join the server if living crew exceeds the listed number. +#EXTREME_POPCAP 200 + +## Message for extreme cap +EXTREME_POPCAP_MESSAGE The server is currently serving a high number of users, find alternative servers. diff --git a/config/dbconfig.txt b/config/entries/dbconfig.txt similarity index 93% rename from config/dbconfig.txt rename to config/entries/dbconfig.txt index 3a058fe563..d5bc37bce7 100644 --- a/config/dbconfig.txt +++ b/config/entries/dbconfig.txt @@ -43,3 +43,6 @@ BSQL_THREAD_LIMIT 50 ## Uncomment to enable verbose BSQL communication logs #BSQL_DEBUG + +## Time to wait before considering a query as lingering too long +@QUERY_DEBUG_LOG_TIMEOUT 70 diff --git a/config/entries/debris.txt b/config/entries/debris.txt new file mode 100644 index 0000000000..345ce6610f --- /dev/null +++ b/config/entries/debris.txt @@ -0,0 +1,8 @@ +## Default turf threshold to get dirt +TURF_DIRT_THRESHOLD 100 + +## Default alpha of dirt on spawn +DIRT_ALPHA_STARTING 127 + +## Multiplier for how dirty walking over a turf makes it +TURF_DIRTY_MULTIPLIER 1 diff --git a/config/entries/donator.txt b/config/entries/donator.txt new file mode 100644 index 0000000000..42c0461bf8 --- /dev/null +++ b/config/entries/donator.txt @@ -0,0 +1,11 @@ +## Citadel donator system +## this is a bad system but I'm lazy so it piggybacks off config loader system. +## File isn't properly documented because the donator system desperately needs a rewrite and I can't be arsed to right now. + +#Specify group followed by ckey for each ckey. + +#TIER_1_DONATORS test_ckey + +#TIER_2_DONATORS test_ckey + +#TIER_3_DONATORS test_ckey diff --git a/config/dynamic_config.txt b/config/entries/dyanmic.txt similarity index 98% rename from config/dynamic_config.txt rename to config/entries/dyanmic.txt index 480f6d8ed8..e08fb7634d 100644 --- a/config/dynamic_config.txt +++ b/config/entries/dyanmic.txt @@ -307,3 +307,12 @@ DYNAMIC_ASSASSINATE_COST 2 DYNAMIC_WAROPS_REQUIREMENT 60 DYNAMIC_WAROPS_COST 10 + +## Storyteller min players +# STORYTELLER_MIN_PLAYERS CHAOTIC 35 + +## Storyteller minimum chaos +# STORYTELLER_MIN_CHAOS CHAOTIC 75 + +## Storyteller maximum chaos +# STORYTELLER_MAX_CHAOS CHAOTIC 250 diff --git a/config/entries/fetish_content.txt b/config/entries/fetish_content.txt new file mode 100644 index 0000000000..6fabd095d8 --- /dev/null +++ b/config/entries/fetish_content.txt @@ -0,0 +1,33 @@ +## Breast cups selectable from the character creation menu. Keep em lowercase. +BREASTS_CUPS_PREFS a +BREASTS_CUPS_PREFS b +BREASTS_CUPS_PREFS c +BREASTS_CUPS_PREFS d +BREASTS_CUPS_PREFS e +BREASTS_CUPS_PREFS f +BREASTS_CUPS_PREFS g +BREASTS_CUPS_PREFS h + +## Minimum and maximum limits for penis length from the character creation menu. +PENIS_MIN_INCHES_PREFS 1 +PENIS_MAX_INCHES_PREFS 24 + +## Body size configs, the feature will be disabled if both min and max have the same value. +BODY_SIZE_MIN 0.9 +BODY_SIZE_MAX 1.25 + +## Allowed visibility toggles + +# SAFE_VISIBILITY_TOGGLES Always visible +SAFE_VISIBILITY_TOGGLES Hidden by clothes +SAFE_VISIBILITY_TOGGLES Hidden by underwear +SAFE_VISIBILITY_TOGGLES Always hidden + +## Pun-Pun movement slowdown given to characters with a body size smaller than this value, +## to compensate for their smaller hitbox. +## To disable, just make sure the value is lower than 'body_size_min' +THRESHOLD_BODY_SIZE_PENALTY 1 + +## Multiplier used in the smaller strides slowdown calculation. +## Doesn't apply to floating or crawling mobs. +BODY_SIZE_SLOWDOWN_MULTIPLIER 0 diff --git a/config/entries/gamemodes.txt b/config/entries/gamemodes.txt new file mode 100644 index 0000000000..f78c3743aa --- /dev/null +++ b/config/entries/gamemodes.txt @@ -0,0 +1,178 @@ +## Comment to disable weighting modes by how chaotic recent mode rolls were. +WEIGH_BY_RECENT_CHAOS + +## The weight adjustment will be proportional to this power relative to the "ideal" weight range. +## e.g. if we have a weight range of 0-5, and an exponent of 1, 6 will be weighted 1/2, 7 1/3 etc. +## if exponent is 2, it'll be 1/4, 1/9 etc. +CHAOS_EXPONENT 1 + +## Percent weight reductions for three of the most recent modes + +REPEATED_MODE_ADJUST 45 30 10 + +## Probablities for game modes chosen in 'secret' and 'random' modes. +## Default probablity is 1, increase to make that mode more likely to be picked. +## Set to 0 to disable that mode. + +PROBABILITY TRAITOR 5 +PROBABILITY TRAITORBRO 2 +PROBABILITY TRAITORCHAN 4 +PROBABILITY INTERNAL_AFFAIRS 3 +PROBABILITY NUCLEAR 2 +PROBABILITY REVOLUTION 2 +PROBABILITY CULT 2 +PROBABILITY CHANGELING 2 +PROBABILITY WIZARD 4 +PROBABILITY MONKEY 0 +PROBABILITY METEOR 0 +PROBABILITY EXTENDED 0 +PROBABILITY SECRET_EXTENDED 0 +PROBABILITY DEVIL 0 +PROBABILITY DEVIL_AGENTS 0 +PROBABILITY CLOWNOPS 0 +PROBABILITY BLOODSUCKER 0 + +## You probably want to keep sandbox off by default for secret and random. +PROBABILITY SANDBOX 0 + +## Toggles for continuous modes. +## Modes that aren't continuous will end the instant all antagonists are dead. + +CONTINUOUS TRAITOR +CONTINUOUS TRAITORBRO +CONTINUOUS TRAITORCHAN +CONTINUOUS INTERNAL_AFFAIRS +#CONTINUOUS NUCLEAR +#CONTINUOUS REVOLUTION +CONTINUOUS CULT +CONTINUOUS CLOCKWORK_CULT +CONTINUOUS CHANGELING +CONTINUOUS WIZARD +#CONTINUOUS MONKEY +CONTINUOUS BLOODSUCKER +CONTINUOUS HERESY + +##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! + +CONTINUOUS METEOR +CONTINUOUS EXTENDED +CONTINUOUS SECRET_EXTENDED + +## Toggles for allowing midround antagonists (aka mulligan antagonists). +## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. + +MIDROUND_ANTAG TRAITOR +#MIDROUND_ANTAG TRAITORBRO +MIDROUND_ANTAG TRAITORCHAN +MIDROUND_ANTAG INTERNAL_AFFAIRS +#MIDROUND_ANTAG NUCLEAR +#MIDROUND_ANTAG REVOLUTION +MIDROUND_ANTAG CULT +MIDROUND_ANTAG CLOCKWORK_CULT +MIDROUND_ANTAG CHANGELING +MIDROUND_ANTAG WIZARD +#MIDROUND_ANTAG MONKEY + +## Toggles for whether this mode should force antags even if not enough players have it enabled. +## If it's off, it just won't roll as many antags. +#FORCE_ANTAG_COUNT TRAITOR +#FORCE_ANTAG_COUNT TRAITORBRO +#FORCE_ANTAG_COUNT TRAITORCHAN +#FORCE_ANTAG_COUNT INTERNAL_AFFAIRS +FORCE_ANTAG_COUNT NUCLEAR +FORCE_ANTAG_COUNT REVOLUTION +FORCE_ANTAG_COUNT CULT +FORCE_ANTAG_COUNT CLOCKWORK_CULT +#FORCE_ANTAG_COUNT CHANGELING +#FORCE_ANTAG_COUNT WIZARD +#FORCE_ANTAG_COUNT MONKEY + +## A config for how much each game mode's chaos level is. +## All of them have reasonable defaults, but this can be used to adjust them. +## 0-9, where 0 is lowest chaos (should only be extended) and 9 is highest (wizard? nukies?) +#CHAOS_LEVEL EXTENDED 0 + +## Uncomment these for overrides of the minimum / maximum number of players in a round type. +## If you set any of these occasionally check to see if you still need them as the modes +## will still be actively rebalanced around the SUGGESTED populations, not your overrides. +## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to +## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. + +#MIN_POP TRAITOR 0 +#MAX_POP TRAITOR -1 + +#MIN_POP TRAITORBRO 0 +#MAX_POP TRAITORBRO -1 + +#MIN_POP TRAITORCHAN 15 +#MAX_POP TRAITORCHAN -1 + +#MIN_POP DOUBLE_AGENTS 25 +#MAX_POP DOUBLE_AGENTS -1 + +#MIN_POP NUCLEAR 0 +#MAX_POP NUCLEAR -1 + +#MIN_POP REVOLUTION 20 +#MAX_POP REVOLUTION -1 + +#MIN_POP CULT 24 +#MAX_POP CULT -1 + +#MIN_POP CLOCKWORK_CULT 24 +#MAX_POP CLOCKWORK_CULT -1 + +#MIN_POP CHANGELING 15 +#MAX_POP CHANGELING -1 + +#MIN_POP WIZARD 20 +#MAX_POP WIZARD -1 + +#MIN_POP MONKEY 20 +#MAX_POP MONKEY -1 + +#MIN_POP METEOR 0 +#MAX_POP METEOR -1 + +#MIN_POP DEVIL 0 +#MAX_POP DEVIL -1 + +#MIN_POP DEVIL_AGENTS 25 +#MAX_POP DEVIL_AGENTS -1 + +## Setting at least one mode to be playable at 0/1 players is required. +#MIN_POP EXTENDED 0 +#MAX_POP EXTENDED -1 + +## Variables calculate how number of antagonists will scale to population. +## Used as (Antagonists = Population / Coeff) +## Set to 0 to disable scaling and use default numbers instead. +TRAITOR_SCALING_COEFF 6 +## per brother TEAM +BROTHER_SCALING_COEFF 12 +CHANGELING_SCALING_COEFF 6 +## heretics +ECULT_SCALING_COEFF 5 +## per abductor TEAM +ABDUCTOR_SCALING_COEFF 15 + +## Variables calculate how number of open security officer positions will scale to population. +## Used as (Officers = Population / Coeff) +## Set to 0 to disable scaling and use default numbers instead. +SECURITY_SCALING_COEFF 8 + +## The number of objectives traitors get. +## Not including escaping/hijacking. +TRAITOR_OBJECTIVES_AMOUNT 2 +BROTHER_OBJECTIVES_AMOUNT 2 + +## Uncomment to prohibit jobs that start with loyalty +## implants from being most antagonists. +#PROTECT_ROLES_FROM_ANTAGONIST + +## Uncomment to prohibit assistants from becoming most antagonists. +#PROTECT_ASSISTANT_FROM_ANTAGONIST + + +## If late-joining players have a chance to become a traitor/changeling +ALLOW_LATEJOIN_ANTAGONISTS diff --git a/config/game_options.txt b/config/entries/general.txt similarity index 63% rename from config/game_options.txt rename to config/entries/general.txt index b9d763e5b0..3584af63c7 100644 --- a/config/game_options.txt +++ b/config/entries/general.txt @@ -1,3 +1,51 @@ +## Lobby time: This is the amount of time between rounds that players have to setup their characters and be ready. +LOBBY_COUNTDOWN 120 + +## Round End Time: This is the amount of time after the round ends that players have to murder death kill each other. +ROUND_END_COUNTDOWN 90 + +## period of time in seconds for players to be considered inactive +# INACTIVITY_PERIOD 300 + +## period of time in seconds for players to be considered afk and kickable +# AFK_PERIOD 600 + +## disconnect players who are considered afk +# KICK_INACTIVE + +## Job slot open/close by identification consoles delay in seconds +ID_CONSOLE_JOBSLOT_DELAY 30 + + +## disables calling del(src) on newmobs if they logout before spawnin in +# DONT_DEL_NEWMOB + +## In-game features +##Toggle for having jobs load up from the .txt +# LOAD_JOBS_FROM_TXT + + +## Uncomment to allow special 'Easter-egg' events on special holidays such as seasonal holidays and stuff like 'Talk Like a Pirate Day' :3 YAARRR +ALLOW_HOLIDAYS + +## Uncomment to show the names of the admin sending a pm from IRC instead of showing as a stealthmin. +#SHOW_IRC_NAME + +## Chat Announce Options +## Various messages to be sent to game chats +## Uncommenting these will enable them, by default they will be broadcast to Game chat channels on TGS3 or non-admin channels on TGS4 +## If using TGS4, the string option can be set as a chat channel tag to limit the message to channels of that tag type (case-sensitive) +## i.e. CHAT_ANNOUNCE_NEW_GAME chat_channel_tag + +## Send a message with the station name starting a new game +#CHAT_ANNOUNCE_NEW_GAME + +##Default screen resolution, in tiles. +## By default, this is 15x15, which gets simplified to 7 by BYOND, as it is a 1:1 screen ratio. +## For reference, Goonstation uses a resolution of 21x15 for it's widescreen mode. +## Do note that changing this value will affect the title screen. The title screen will have to be updated manually if this is changed. +DEFAULT_VIEW 21x15 + ## HEALTH ### ##Damage multiplier, effects both weapons and healing on all mobs. For example, 1.25 would result in 25% higher damage. @@ -22,30 +70,6 @@ OOC_DURING_ROUND ## Comment this out if you want to disable emojis EMOJIS -## MOB MOVEMENT ### - -## We suggest editing these variables ingame to find a good speed for your server. -## To do this you must be a high level admin. Open the 'debug' tab ingame. -## Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. - -## These values get directly added to values and totals ingame. -## To speed things up make the number negative, to slow things down, make the number positive. - -## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. -RUN_DELAY 1 -WALK_DELAY 4 - -## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! -## Entries completely override all subtypes. Later entries have precedence over earlier entries. -## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and -## /mob/living/carbon/human on the last entry, the last entry will override the first. -MULTIPLICATIVE_MOVESPEED /mob/living/carbon/human 1 -##MULTIPLICATIVE_MOVESPEED /mob/living/silicon/robot 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/monkey 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien 0 -##MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal/slime 0 -MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1 - ## NAMES ### ## If uncommented this adds a random surname to a player's name if they only specify one name. @@ -54,205 +78,18 @@ MULTIPLICATIVE_MOVESPEED /mob/living/simple_animal 1 ## If uncommented, this forces all players to use random names !and appearances!. #FORCE_RANDOM_NAMES - -## ALERT LEVELS ### -ALERT_GREEN All threats to the station have passed. Security may not have weapons visible, privacy laws are once again fully enforced. -ALERT_BLUE_UPTO The station has received reliable information about potential threats to the station. Security staff may have weapons visible, random searches are permitted. -ALERT_BLUE_DOWNTO Significant confirmed threats have been neutralized. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still permitted. -ALERT_AMBER_UPTO There are signficant confirmed threats to the station. Security staff may have weapons unholstered at all times. Random searches are allowed and advised. -ALERT_AMBER_DOWNTO The immediate threat has passed. Security is no longer authorized to use lethal force, but may continue to have weapons drawn. Access requirements have been restored. -ALERT_RED_UPTO There is an immediate serious threat to the station. Security is now authorized to use lethal force. Additionally, access requirements on some machines have been lifted. -ALERT_RED_DOWNTO The station's destruction has been averted. There is still however an immediate serious threat to the station. Security is still authorized to use lethal force. -ALERT_DELTA Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill. - - - ## GAME MODES ### ## Uncomment to not send a roundstart intercept report. Gamemodes may override this. #NO_INTERCEPT_REPORT -## Comment to disable weighting modes by how chaotic recent mode rolls were. -WEIGH_BY_RECENT_CHAOS - -## The weight adjustment will be proportional to this power relative to the "ideal" weight range. -## e.g. if we have a weight range of 0-5, and an exponent of 1, 6 will be weighted 1/2, 7 1/3 etc. -## if exponent is 2, it'll be 1/4, 1/9 etc. -CHAOS_EXPONENT 1 - -## Probablities for game modes chosen in 'secret' and 'random' modes. -## Default probablity is 1, increase to make that mode more likely to be picked. -## Set to 0 to disable that mode. - -PROBABILITY TRAITOR 5 -PROBABILITY TRAITORBRO 2 -PROBABILITY TRAITORCHAN 4 -PROBABILITY INTERNAL_AFFAIRS 3 -PROBABILITY NUCLEAR 2 -PROBABILITY REVOLUTION 2 -PROBABILITY CULT 2 -PROBABILITY CHANGELING 2 -PROBABILITY WIZARD 4 -PROBABILITY MONKEY 0 -PROBABILITY METEOR 0 -PROBABILITY EXTENDED 0 -PROBABILITY SECRET_EXTENDED 0 -PROBABILITY DEVIL 0 -PROBABILITY DEVIL_AGENTS 0 -PROBABILITY CLOWNOPS 0 -PROBABILITY BLOODSUCKER 0 - -## You probably want to keep sandbox off by default for secret and random. -PROBABILITY SANDBOX 0 - -## Percent weight reductions for three of the most recent modes - -REPEATED_MODE_ADJUST 45 30 10 - -## Toggles for continuous modes. -## Modes that aren't continuous will end the instant all antagonists are dead. - -CONTINUOUS TRAITOR -CONTINUOUS TRAITORBRO -CONTINUOUS TRAITORCHAN -CONTINUOUS INTERNAL_AFFAIRS -#CONTINUOUS NUCLEAR -#CONTINUOUS REVOLUTION -CONTINUOUS CULT -CONTINUOUS CLOCKWORK_CULT -CONTINUOUS CHANGELING -CONTINUOUS WIZARD -#CONTINUOUS MONKEY -CONTINUOUS BLOODSUCKER -CONTINUOUS HERESY - -##Note: do not toggle continuous off for these modes, as they have no antagonists and would thus end immediately! - -CONTINUOUS METEOR -CONTINUOUS EXTENDED -CONTINUOUS SECRET_EXTENDED - - -## Toggles for allowing midround antagonists (aka mulligan antagonists). -## In modes that are continuous, if all antagonists should die then a new set of antagonists will be created. - -MIDROUND_ANTAG TRAITOR -#MIDROUND_ANTAG TRAITORBRO -MIDROUND_ANTAG TRAITORCHAN -MIDROUND_ANTAG INTERNAL_AFFAIRS -#MIDROUND_ANTAG NUCLEAR -#MIDROUND_ANTAG REVOLUTION -MIDROUND_ANTAG CULT -MIDROUND_ANTAG CLOCKWORK_CULT -MIDROUND_ANTAG CHANGELING -MIDROUND_ANTAG WIZARD -#MIDROUND_ANTAG MONKEY - -## Toggles for whether this mode should force antags even if not enough players have it enabled. -## If it's off, it just won't roll as many antags. -#FORCE_ANTAG_COUNT TRAITOR -#FORCE_ANTAG_COUNT TRAITORBRO -#FORCE_ANTAG_COUNT TRAITORCHAN -#FORCE_ANTAG_COUNT INTERNAL_AFFAIRS -FORCE_ANTAG_COUNT NUCLEAR -FORCE_ANTAG_COUNT REVOLUTION -FORCE_ANTAG_COUNT CULT -FORCE_ANTAG_COUNT CLOCKWORK_CULT -#FORCE_ANTAG_COUNT CHANGELING -#FORCE_ANTAG_COUNT WIZARD -#FORCE_ANTAG_COUNT MONKEY - -## A config for how much each game mode's chaos level is. -## All of them have reasonable defaults, but this can be used to adjust them. -## 0-9, where 0 is lowest chaos (should only be extended) and 9 is highest (wizard? nukies?) -#CHAOS_LEVEL EXTENDED 0 - -## Uncomment these for overrides of the minimum / maximum number of players in a round type. -## If you set any of these occasionally check to see if you still need them as the modes -## will still be actively rebalanced around the SUGGESTED populations, not your overrides. -## Notes: For maximum number of players a value of -1 means no maximum. Setting minimums to -## VERY low numbers (< 5) can lead to errors if the roundtypes were not designed for that. - -#MIN_POP TRAITOR 0 -#MAX_POP TRAITOR -1 - -#MIN_POP TRAITORBRO 0 -#MAX_POP TRAITORBRO -1 - -#MIN_POP TRAITORCHAN 15 -#MAX_POP TRAITORCHAN -1 - -#MIN_POP DOUBLE_AGENTS 25 -#MAX_POP DOUBLE_AGENTS -1 - -#MIN_POP NUCLEAR 0 -#MAX_POP NUCLEAR -1 - -#MIN_POP REVOLUTION 20 -#MAX_POP REVOLUTION -1 - -#MIN_POP CULT 24 -#MAX_POP CULT -1 - -#MIN_POP CLOCKWORK_CULT 24 -#MAX_POP CLOCKWORK_CULT -1 - -#MIN_POP CHANGELING 15 -#MAX_POP CHANGELING -1 - -#MIN_POP WIZARD 20 -#MAX_POP WIZARD -1 - -#MIN_POP MONKEY 20 -#MAX_POP MONKEY -1 - -#MIN_POP METEOR 0 -#MAX_POP METEOR -1 - -#MIN_POP DEVIL 0 -#MAX_POP DEVIL -1 - -#MIN_POP DEVIL_AGENTS 25 -#MAX_POP DEVIL_AGENTS -1 - -## Setting at least one mode to be playable at 0/1 players is required. -#MIN_POP EXTENDED 0 -#MAX_POP EXTENDED -1 - +## If non-human species are barred from joining as a head of staff +#ENFORCE_HUMAN_AUTHORITY ## The amount of time it takes for the emergency shuttle to be called, from round start. SHUTTLE_REFUEL_DELAY 12000 -## Variables calculate how number of antagonists will scale to population. -## Used as (Antagonists = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -TRAITOR_SCALING_COEFF 6 -BROTHER_SCALING_COEFF 6 -CHANGELING_SCALING_COEFF 6 - -## Variables calculate how number of open security officer positions will scale to population. -## Used as (Officers = Population / Coeff) -## Set to 0 to disable scaling and use default numbers instead. -SECURITY_SCALING_COEFF 8 - -## The number of objectives traitors get. -## Not including escaping/hijacking. -TRAITOR_OBJECTIVES_AMOUNT 2 -BROTHER_OBJECTIVES_AMOUNT 2 - -## Uncomment to prohibit jobs that start with loyalty -## implants from being most antagonists. -#PROTECT_ROLES_FROM_ANTAGONIST - -## Uncomment to prohibit assistants from becoming most antagonists. -#PROTECT_ASSISTANT_FROM_ANTAGONIST - -## If non-human species are barred from joining as a head of staff -#ENFORCE_HUMAN_AUTHORITY - -## If late-joining players have a chance to become a traitor/changeling -ALLOW_LATEJOIN_ANTAGONISTS ## Comment this out to disable the antagonist reputation system. This system rewards players who participate in the game instead of greytiding by giving them slightly higher odds to ## roll antagonist in subsequent rounds until they get it. @@ -303,9 +140,6 @@ ALLOW_AI_MULTICAM ## Uncomment to prevent the security cyborg module from being chosen #DISABLE_SECBORG -## Determines the minimum alert level for the security cyborg model to be chosen -## 0: Green, 1:Blue, 2:Amber, 3:Red, 4:Delta -MINIMUM_SECBORG_ALERT 3 ## Peacekeeper Borg ### ## Uncomment to prevent the peacekeeper cyborg module from being chosen @@ -643,39 +477,10 @@ BOX_RANDOM_ENGINE Box Empty,0 BOX_RANDOM_ENGINE Box Antimatter,1 BOX_RANDOM_ENGINE Box P.A.C.M.A.N,1 -## Whether or not there's a mode tier list vote after the secret/extended vote. -MODETIER_VOTING - -## Number of modes dropped by the modetier vote during mode selection, after vote. -DROPPED_MODES 3 ## Whether the suicide verb is allowed. # SUICIDE_ALLOWED -## Breast cups selectable from the character creation menu. Keep em lowercase. -BREASTS_CUPS_PREFS a -BREASTS_CUPS_PREFS b -BREASTS_CUPS_PREFS c -BREASTS_CUPS_PREFS d -BREASTS_CUPS_PREFS e - -## Minimum and maximum limits for penis length from the character creation menu. -PENIS_MIN_INCHES_PREFS 1 -PENIS_MAX_INCHES_PREFS 20 - -## Body size configs, the feature will be disabled if both min and max have the same value. -BODY_SIZE_MIN 0.9 -BODY_SIZE_MAX 1.25 - -## Pun-Pun movement slowdown given to characters with a body size smaller than this value, -## to compensate for their smaller hitbox. -## To disable, just make sure the value is lower than 'body_size_min' -THRESHOLD_BODY_SIZE_PENALTY 1 - -## Multiplier used in the smaller strides slowdown calculation. -## Doesn't apply to floating or crawling mobs. -BODY_SIZE_SLOWDOWN_MULTIPLIER 0 - ## Allows players to set a hexadecimal color of their choice as skin tone, on top of the standard ones. ALLOW_CUSTOM_SKINTONES @@ -683,11 +488,6 @@ ALLOW_CUSTOM_SKINTONES ## Camera mobs, AIs, ghosts and some other are of course exempt from this. This also doesn't influence simplemob AI, for the best. #USE_FIELD_OF_VISION -## Default turf threshold to get dirt -TURF_DIRT_THRESHOLD 100 - -## Default alpha of dirt on spawn -DIRT_ALPHA_STARTING 127 ## Allows pAI custom holoforms PAI_CUSTOM_HOLOFORMS diff --git a/config/entries/jexp.txt b/config/entries/jexp.txt new file mode 100644 index 0000000000..e46d743a66 --- /dev/null +++ b/config/entries/jexp.txt @@ -0,0 +1,23 @@ +## Uncomment this entry to have certain jobs require your account to be at least a certain number of days old to select. You can configure the exact age requirement for different jobs by editing +## the minimal_player_age variable in the files in folder /code/game/jobs/job/.. for the job you want to edit. Set minimal_player_age to 0 to disable age requirement for that job. +## REQUIRES the database set up to work. Keep it hashed if you don't have a database set up. +## NOTE: If you have just set-up the database keep this DISABLED, as player age is determined from the first time they connect to the server with the database up. If you just set it up, it means +## you have noone older than 0 days, since noone has been logged yet. Only turn this on once you have had the database up for 30 days. +#USE_AGE_RESTRICTION_FOR_JOBS + +## Uncomment this to have the job system use the player's account creation date, rather than the when they first joined the server for job timers. +#USE_ACCOUNT_AGE_FOR_JOBS + +## Unhash this to track player playtime in the database. Requires database to be enabled. +#USE_EXP_TRACKING +## Unhash this to enable playtime requirements for head jobs. +#USE_EXP_RESTRICTIONS_HEADS +## Unhash this to override head jobs' playtime requirements with this number of hours. +## Leave this commented out to use the values defined in the job datums. Values in the datums are stored as minutes. +#USE_EXP_RESTRICTIONS_HEADS_HOURS 3 +## Unhash this to change head jobs' playtime requirements so that they're based on department playtime, rather than crew playtime. +#USE_EXP_RESTRICTIONS_HEADS_DEPARTMENT +## Unhash this to enable playtime requirements for certain non-head jobs, like Engineer and Scientist. +#USE_EXP_RESTRICTIONS_OTHER +## Allows admins to bypass job playtime requirements. +#USE_EXP_RESTRICTIONS_ADMIN_BYPASS diff --git a/config/entries/logging.txt b/config/entries/logging.txt new file mode 100644 index 0000000000..1690dbfacf --- /dev/null +++ b/config/entries/logging.txt @@ -0,0 +1,85 @@ +## log OOC channel +LOG_OOC + +## log client Say +LOG_SAY + +## log admin actions +@LOG_ADMIN + +## log admin chat +@LOG_ADMINCHAT + +## log client access (logon/logoff) +LOG_ACCESS + +## log game actions (start of round, results, etc.) +LOG_GAME + +## log player votes +LOG_VOTE + +## log player crafting +LOG_CRAFT + +## log client Whisper +LOG_WHISPER + +## log emotes +LOG_EMOTE + +## log attack messages +LOG_ATTACK + +## log pda messages +LOG_PDA + +## log telecomms messages +LOG_TELECOMMS + +## log prayers +LOG_PRAYER + +## log lawchanges +LOG_LAW + +## log crew manifest to seperate file +LOG_MANIFEST + +## log job divide debugging information +LOG_JOB_DEBUG + +## Log shuttle related actions +LOG_SHUTTLE + +## log all world.Topic() calls +LOG_WORLD_TOPIC + +## enables use of the proc twitterize() that lets you take a large list of strings and turn it into a JSON file of tweet sized strings. +## As an example of how this could be """useful""" look towards Poly (https://twitter.com/Poly_the_Parrot) +# LOG_TWITTER + +## Enable logging pictures +LOG_PICTURES + +## Log camera pictures +PICTURE_LOGGING_CAMERA + +## log virus and actions +LOG_VIRUS + +## Log all raw hrefs of tgui, rather than letting tgui logging handle it. KEEP THIS OFF UNLESS YOU KNOW WHAT YOU ARE DOING. +# EMERGENCY_TGUI_LOGGING + +## Cooldown time for each occurance of a unique runtime in deciseconds +ERROR_COOLDOWN 600 + +## Max runtimes of one type before silencing +ERROR_LIMIT 50 + +## How long an unique runtime will be silenced for when reaching limit in deciseconds +ERROR_SILENCE_TIME 6000 + +How long to wait between messaging admins about an unique runtime +ERROR_MSG_DELAY 50 + diff --git a/config/entries/movespeed.txt b/config/entries/movespeed.txt new file mode 100644 index 0000000000..67f9ab503b --- /dev/null +++ b/config/entries/movespeed.txt @@ -0,0 +1,56 @@ +## MOB MOVEMENT ### + +## We suggest editing these variables ingame to find a good speed for your server. +## To do this you must be a high level admin. Open the 'debug' tab ingame. +## Select "Debug Controller" and then, in the popup, select "Configuration". These variables should have the same name. + +## These values get directly added to values and totals ingame. +## To speed things up make the number negative, to slow things down, make the number positive. + +## These modify the run/walk speed of all mobs before the mob-specific modifiers are applied. +RUN_DELAY 1.5 +WALK_DELAY 4 + +## The variables below affect the movement of specific mob types. THIS AFFECTS ALL SUBTYPES OF THE TYPE YOU CHOOSE! +## Entries completely override all subtypes. Later entries have precedence over earlier entries. +## This means if you put /mob 0 on the last entry, it will null out all changes, while if you put /mob as the first entry and +## /mob/living/carbon/human on the last entry, the last entry will override the first. +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien -1 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/sentinel -0.75 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/drone -0.5 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/royal/praetorian 0 +MULTIPLICATIVE_MOVESPEED /mob/living/carbon/alien/humanoid/royal/queen 2 + +## The above, only when a mob is FLOATING +MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living/carbon -0.5 +MULTIPLICATIVE_MOVESPEED_FLOATING /mob/living 0 + +## Whether or not sprint is enabled +SPRINT_ENABLED 0 + +## When sprint is off, how much does getting staggered slow you +SPRINTLESS_STAGGER_SLOWDOWN 0.5 + +## When sprint is off, how much does getting shoved off balance slow you +SPRINTLESS_OFF_BALANCE_SLOWDOWN 0.85 + +## Melee stagger power multiplier +MELEE_STAGGER_FACTOR 1 + +## Sprint speed increase +SPRINT_SPEED_INCREASE 1 + +## Max tiles/second increase from sprint +SPRINT_MAX_TILES_INCREASE 5 + +## Absolute max speed sprint can make someone go (tiles/second) +SPRINT_ABSOLUTE_MAX_TILES 13 + +## Max sprint buffer +SPRINT_BUFFER_MAX 24 + +## Stamina/tile when bufer empty +SPRINT_STAMINA_COST 1.4 + +## Buffer regen/decisecond - 0.4 = 4/second +SPRINT_BUFFER_REGEN_PER_DS 0.4 diff --git a/config/persistence.txt b/config/entries/persistence.txt similarity index 100% rename from config/persistence.txt rename to config/entries/persistence.txt diff --git a/config/entries/policy.txt b/config/entries/policy.txt new file mode 100644 index 0000000000..07f64b5b2a --- /dev/null +++ b/config/entries/policy.txt @@ -0,0 +1,24 @@ +## Policy configuration +## Current valid keys are: +## ON_CLONE - displayed after a successful cloning operation to the cloned person +## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold +## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold +## SDGF - displayed on SDGF clone spawning +## SDGF_GOOD - displayed on SDGF clone spawning, if the clone is loyal +## SDGF_BAD - displayed on SDGF clone spawning, if the clone is not loyal +## PAI - displayed on PAI personality being loaded +## EXAMPLE: +## POLICY ON_CLONE insert text here span classes are fully supported + +POLICY ON_CLONE Your thoughts are hazy as the cloning algorithms reboot your consciousness. Unfortunately for you, the imperfect nature of the process has left out your more recent, less entrenched memories.
You only remember vague details of your death, without clear recollection of who or what is specifically responsible for your demise.
(If you were murdered, you do not remember the exact name or appearance of your killer, only vague details of how they killed you rather than the exact murder weapon. (ex: drank something and blanked out, felt an impact in the back and bled out)
If you died to environmental hazards like ash storms or spacing, this is not as applicable -- however, keep in mind that if someone set you up to die to that, like being tossed forcefully into space, that the previous clause of not remembering killer name in a murder applies!
+ +POLICY ON_DEFIB_LATE Your mind barely responds as first as you are forcefully returned to the world of the living after all too long in a state of decay. While medicine may restore your brain functions, you can't seem to remember your latest memories...
You only remember vague details of your death, without clear recollection of who or what is specifically responsible for your demise.
(If you were murdered, you do not remember the exact name or appearance of your killer, only vague details of how they killed you rather than the exact murder weapon. (ex: drank something and blanked out, felt an impact in the back and bled out)
If you died to environmental hazards like ash storms or spacing, this is not as applicable -- however, keep in mind that if someone set you up to die to that, like being tossed forcefully into space, that the previous clause of not remembering killer name in a murder applies!
+ +POLICY ON_DEFIB_INTACT You barely miss a beat as you gasp, awakening from the slumber of the deceased. The rapid resuscitation has saved you from the worst effects of brain damage.
You recall all information leading up to your death and exact details on method of death and killer if applicable, as long as you were conscious to witness such. + +POLICY PAI If you are given an ERP-related directive without OOC consent, ahelp immediately.w + +## Misc entries for above + +## Defib time limit for "cloning memory disorder" memory loss in seconds +DEFIB_CMD_TIME_LIMIT 300 diff --git a/config/resources.txt b/config/entries/resources.txt similarity index 100% rename from config/resources.txt rename to config/entries/resources.txt diff --git a/config/respawns.txt b/config/entries/respawns.txt similarity index 90% rename from config/respawns.txt rename to config/entries/respawns.txt index 804a856a93..41c76eaabc 100644 --- a/config/respawns.txt +++ b/config/entries/respawns.txt @@ -2,7 +2,7 @@ RESPAWNS_ENABLED ## Minutes delay before allowing respawns, either from death or observing. Not an integer. -RESPAWN_DELAY 15.0 +RESPAWN_DELAY 10.0 ## Minutes delay before allowing respawns, if the user cryo'd. Not an integer. RESPAWN_DELAY_CRYO 5.0 @@ -16,8 +16,8 @@ ALLOW_NON_ASSISTANT_RESPAWN ## Allow respawning as the same character # ALLOW_SAME_CHARACTER_RESPAWN -## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observe locks you out. -# RESPAWN_PENALTY_INCLUDES_OBSERVE +## Observing is considered a respawn for the purposes of role lockouts. Defaults to disabled. When disabled, only RESPAWNING rather than returning from observer locks you out. +RESPAWN_PENALTY_INCLUDES_OBSERVE ## Time in minutes from round start before respawn is enabled RESPAWN_MINIMUM_DELAY_ROUNDSTART 30.0 diff --git a/config/entries/security.txt b/config/entries/security.txt new file mode 100644 index 0000000000..e6a13d5cdf --- /dev/null +++ b/config/entries/security.txt @@ -0,0 +1,38 @@ +### FAIL2TOPIC: +### Automated IP bans for world/Topic() spammers +### NOTE FOR WINDOWS HOSTS: This requires you to be running dreamdaemon as an administrator for it to work at all. TGS3 handles this automatically, and honestly there's no reason not to be using TGS3 if you're hosting on Windows. +### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing. +## Enabled +#FAIL2TOPIC_ENABLED +## Minimum wait time in deciseconds between valid requests +FAIL2TOPIC_RATE_LIMIT 10 +## Number of requests after breaching rate limit that triggers a ban +FAIL2TOPIC_MAX_FAILS 5 +## Firewall rule name used on physical server +## FOR LINUX HOSTS: This is used as the chain name. The iptables chain doesn't get created or hooked up to INPUT automatically, so you'll have to get that set up yourself. Recommended name: BYOND +@FAIL2TOPIC_RULE_NAME _dd_fail2topic + +## Topic max size before it's rejected, using BYOND length() +TOPIC_MAX_SIZE 8192 + +## Fail2topic rate limit whitelist. Using any external IPs is not recommended. +# TOPIC_RATE_LIMIT_WHITELIST 127.0.0.1:1337 + +## TOPIC RATE LIMITING +## This allows you to limit how many topic calls (clicking on an interface window) the client can do in any given game second and/or game minute. +## Admins are exempt from these limits. +## Hitting the minute limit notifies admins. +## Set to 0 or comment out to disable. +SECOND_TOPIC_LIMIT 10 + +MINUTE_TOPIC_LIMIT 100 + +## CLICK RATE LIMITING +## Same as above, but applies to clicking on objects in the game window. +## This should be a higher then the interface limit to allow for the spam clickly nature of most battles. +## Admins are exempt from these limits. +## Hitting the minute limit notifies admins. +## Set to 0 to disable. +SECOND_CLICK_LIMIT 15 + +MINUTE_CLICK_LIMIT 400 diff --git a/config/entries/server.txt b/config/entries/server.txt new file mode 100644 index 0000000000..0ffd5b21a3 --- /dev/null +++ b/config/entries/server.txt @@ -0,0 +1,68 @@ +## Enable automatic profiling - Byond 513.1506 and newer only. +#AUTO_PROFILE + +## Server name: This appears at the top of the screen in-game and in the BYOND hub. Uncomment and replace 'tgstation' with the name of your choice. +# SERVERNAME tgstation + +## Server tagline: This will appear right below the server's title. +# SERVERTAGLINE A generic TG-based server + +## Server SQL name: This is the name used to identify the server to the SQL DB, distinct from SERVERNAME as it must be at most 32 characters. +# SERVERSQLNAME tgstation + +## Station name: The name of the station as it is referred to in-game. If commented out, the game will generate a random name instead. +STATIONNAME Space Station 13 + +## Put on byond hub: Uncomment this to put your server on the byond hub. +#HUB + +## Defines the ticklimit for subsystem initialization (In percents of a byond tick). Lower makes world start smoother. Higher makes it faster. +##This is currently a testing optimized setting. A good value for production would be 98. +TICK_LIMIT_MC_INIT 500 + +##Defines the ticklag for the world. Ticklag is the amount of time between game ticks (aka byond ticks) (in 1/10ths of a second). +## This also controls the client network update rate, as well as the default client fps +TICKLAG 0.5 + +##Can also be set as per-second value, the following value is identical to the above. +#FPS 20 + +## Set to prevent anyone but those ckeys listed in config/whitelist.txt and config/admins.txt from joining your server +#USEWHITELIST + +## set a hosted by name for unix platforms +HOSTEDBY Yournamehere + +## System command that invokes youtube-dl, used by Play Internet Sound. +## You can install youtube-dl with +## "pip install youtube-dl" if you have pip installed +## from https://github.com/rg3/youtube-dl/releases +## or your package manager +## The default value assumes youtube-dl is in your system PATH +# INVOKE_YOUTUBEDL youtube-dl + +###Master Controller High Pop Mode### + +##The Master Controller(MC) is the primary system controlling timed tasks and events in SS13 (lobby timer, game checks, lighting updates, atmos, etc) +##Default base MC tick rate (1 = process every "byond tick" (see: tick_lag/fps config settings), 2 = process every 2 byond ticks, etc) +## Setting this to 0 will prevent the Master Controller from ticking +BASE_MC_TICK_RATE 1 + +##High population MC tick rate +## Byond rounds timer values UP, but the tick rate is modified with heuristics during lag spites so setting this to something like 2 +## will make it run every 2 byond ticks, but will also double the effect of anti-lag heuristics. You can instead set it to something like +## 1.1 to make it run every 2 byond ticks, but only increase the effect of anti-lag heuristics by 10%. or 1.5 for 50%. +## (As an aside, you could in theory also reduce the effect of anti-lag heuristics in the base tick rate by setting it to something like 0.5) +HIGH_POP_MC_TICK_RATE 1.1 + +##Engage high pop mode if player count raises above this (Player in this context means any connected user. Lobby, ghost or in-game all count) +HIGH_POP_MC_MODE_AMOUNT 65 + +##Disengage high pop mode if player count drops below this +DISABLE_HIGH_POP_MC_MODE_AMOUNT 60 + +## Uncomment to prevent the world from sleeping while no players are connected after initializations +#RESUME_AFTER_INITIALIZATIONS + +## Uncomment to set the number of /world/Reboot()s before the DreamDaemon restarts itself. 0 means restart every round. Requires tgstation server tools. +#ROUNDS_UNTIL_HARD_RESTART 10 diff --git a/config/entries/stamina_combat.txt b/config/entries/stamina_combat.txt new file mode 100644 index 0000000000..5339502586 --- /dev/null +++ b/config/entries/stamina_combat.txt @@ -0,0 +1,28 @@ +## haha these keys are going to collide with other stuff for sure someday + +## OUT_OF_COMBAT_TIMER, PERCENT_REGENERATION_OUT_OF_COMBAT disabled - combat mode has been yanked from the codebase and made a UI toggle. + +## Maximum stamina buffer +BUFFER_MAX 25 + +## Seconds until out of combat regen kicks in +# OUT_OF_COMBAT_TIMER 15 + +## Base regen per second +BASE_REGENERATION 3.5 + +## Regenerate this % of total buffer when out of combat +# PERCENT_REGENERATION_OUT_OF_COMBAT + +## Seconds after an action for which regeneration is penalized +POST_ACTION_PENALTY_DELAY 5 + +## Factor to multiply by for penalizing post action regen +POST_ACTION_PENALTY_FACTOR 0.25 + +## Factor to multiply by for stamina usage past buffer into health +OVERDRAW_PENALTY_FACTOR 1.5 + +## Completely disable stamina combat by giving people infinite buffers. +## Has serious balance implications. +# DISABLE_STAMBUFFER diff --git a/config/job_threats.txt b/config/entries/threat.txt similarity index 91% rename from config/job_threats.txt rename to config/entries/threat.txt index e57edb66e4..fa7c5cffa5 100644 --- a/config/job_threats.txt +++ b/config/entries/threat.txt @@ -6,4 +6,4 @@ ## Custom antag threat values, see above ## e.g. -## ANTAG_THREAT Traitor 5 \ No newline at end of file +## ANTAG_THREAT Traitor 5 diff --git a/config/entries/urls.txt b/config/entries/urls.txt new file mode 100644 index 0000000000..f307245055 --- /dev/null +++ b/config/entries/urls.txt @@ -0,0 +1,37 @@ +## set a server location for world reboot. Don't include the byond://, just give the address and port. +## Don't set this to the same server, BYOND will automatically restart players to the server when it has restarted. +# SERVER ss13.example.com:2506 + +## forum address +# FORUMURL https://citadel-station.net/forum/ + +## Wiki address +# WIKIURL https://citadel-station.net/wikimain/index.php + +## Wiki address of upstream +WIKIURLTG http://www.tgstation13.org/wiki + +## Rules address +# RULESURL https://citadel-station.net/wikimain/index.php?title=Rules_-_Main + +## Github address +# GITHUBURL https://github.com/Citadel-Station-13/Citadel-Station-13 + +## Round specific stats address +## Link to round specific parsed logs; IE statbus. It is appended with the RoundID automatically by ticker/Reboot() +## This will take priority over the game logs address during reboot. +## Example: https://atlantaned.space/statbus/round.php?round= +# ROUNDSTATSURL http://citadel-station.net/slimbus/ + +## Game Logs address +## Incase you don't have a fancy parsing system, but still want players to be able to find where you keep your server's logs. +## Example: https://tgstation13.org/parsed-logs/basil/data/logs/ +# GAMELOGURL + +## Github repo id +##This can be found by going to https://api.github.com/users//repos +##Or https://api.github.com/orgs//repos if the repo owner is an organization +# GITHUBREPOID 62485194 + +## Ban appeals URL - usually for a forum or wherever people should go to contact your admins. +# BANAPPEALS https://citadel-station.net/forum/viewforum.php?f=8&sid=a0ce5331d5594ef6d49661609c6f4ff9 diff --git a/config/entries/vote.txt b/config/entries/vote.txt new file mode 100644 index 0000000000..14c7c36a4e --- /dev/null +++ b/config/entries/vote.txt @@ -0,0 +1,67 @@ +## allow players to initiate a restart vote +#ALLOW_VOTE_RESTART + +## allow players to initate a mode-change start +#ALLOW_VOTE_MODE + +## min delay (deciseconds) between voting sessions (default 10 minutes) +VOTE_DELAY 6000 + +## time period (deciseconds) which voting session will last (default 1 minute) +VOTE_PERIOD 600 + +## autovote initial delay (deciseconds) before first automatic transfer vote call (default 120 minutes) +## Set to 0 to disable the subsystem altogether. +VOTE_AUTOTRANSFER_INITIAL 72000 + +## autovote delay (deciseconds) before sequential automatic transfer votes are called (default 30 minutes) +VOTE_AUTOTRANSFER_INTERVAL 18000 + +## autovote maximum votes until automatic transfer call. (default 4) +## Set to 0 to force automatic crew transfer after the 'vote_autotransfer_initial' elapsed. +## Set to -1 to disable the maximum votes cap. +VOTE_AUTOTRANSFER_MAXIMUM 4 + +## prevents dead players from voting or starting votes +# NO_DEAD_VOTE + +## players' votes default to "No vote" (otherwise, default to "No change") +# DEFAULT_NO_VOTE + +## Map rotation +## You should edit maps.txt to match your configuration when you enable this. +MAPROTATION + +## TG-style map rotation +## By default, Citadel uses a more traditional method of map voting, where at the end of a round, players are given a full upfront vote. +## This PR will disable that, and will make the server use TG's map rotation instead. +#TGSTYLE_MAPROTATION + +## Map voting +## Allows players to vote for their preffered map +## When it's set to zero, the map will be randomly picked each round +ALLOW_MAP_VOTING 1 + +## Map voting type +## Determines what kind of vote the map vote is +## Options are: +## PLURALITY (default, only vote for one option) +## APPROVAL (can vote for as many as you want), I +## IRV (vote by ranked choice, winner determined by instant runoff algorithm) +## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm) +MAP_VOTE_TYPE APPROVAL + +## Map rotate chance delta +## This is the chance of map rotation factored to the round length. +## A value of 1 would mean the map rotation chance is the round length in minutes (hour long round == 60% rotation chance) +## A value of 0.5 would mean the map rotation chance is half of the round length in minutes (hour long round == 30% rotation chance) +#MAPROTATIONCHANCEDELTA 0.75 + +## Whether or not there's a mode tier list vote after the secret/extended vote. +MODETIER_VOTING + +## Number of modes dropped by the modetier vote during mode selection, after vote. +DROPPED_MODES 3 + +## Whether or not you must be readied up to vote gamemode +#MUST_BE_READIED_TO_VOTE_GAMEMODE diff --git a/config/external_rsc_urls.txt b/config/external_rsc_urls.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/config/policy.txt b/config/policy.txt deleted file mode 100644 index 502b525ad0..0000000000 --- a/config/policy.txt +++ /dev/null @@ -1,16 +0,0 @@ -## Policy configuration -## Current valid keys are: -## ON_CLONE - displayed after a successful cloning operation to the cloned person -## ON_DEFIB_INTACT - displayed after defibbing before memory loss time threshold -## ON_DEFIB_LATE - displayed after defibbing post memory loss time threshold -## SDGF - displayed on SDGF clone spawning -## SDGF_GOOD - displayed on SDGF clone spawning, if the clone is loyal -## SDGF_BAD - displayed on SDGF clone spawning, if the clone is not loyal -## PAI - displayed on PAI personality being loaded -## EXAMPLE: -## POLICYCONFIG ON_CLONE insert text here span classes are fully supported - -## Misc entries for above - -## Defib time limit for "cloning memory disorder" memory loss in seconds -# DEFIB_CMD_TIME_LIMIT 300 diff --git a/dependencies.sh b/dependencies.sh index 0fbad2153c..cdbdcd98df 100644 --- a/dependencies.sh +++ b/dependencies.sh @@ -4,11 +4,14 @@ #Final authority on what's required to fully build the project # byond version -export BYOND_MAJOR=513 -export BYOND_MINOR=1536 +export BYOND_MAJOR=514 +export BYOND_MINOR=1556 #rust_g git tag -export RUST_G_VERSION=0.4.7 +export RUST_G_VERSION=0.4.8 + +#auxmos git tag +export AUXMOS_VERSION=v0.2.3 #node version export NODE_VERSION=12 diff --git a/html/changelog.html b/html/changelog.html index a7a4a13929..e2aef333e1 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -50,6 +50,433 @@ -->
+

20 August 2021

+

EmeraldSundisk updated:

+
    +
  • Adds a law office/courtroom to OmegaStation
  • +
  • Adds a gateway to OmegaStation
  • +
  • Adds a pool/maintenance bar to OmegaStation
  • +
  • Removes the original maintenance garden in OmegaStation tweak: Relocates the bathrooms to the starboard hall tweak: Modifies port quarter maintenance to include some affected items
  • +
+

Putnam3145 updated:

+
    +
  • Beach now has showers
  • +
+

TripleShades updated:

+
    +
  • At least four or five space heaters spread across Pubby Station Maints
  • +
  • Missing decal in Pubby Station engineering
  • +
  • Moved an atmos alarm in the SM emitter chamber so it wont be destroyed
  • +
+

WanderingFox95 updated:

+
    +
  • Empty bottles and pitchers are available to the bartender now.
  • +
  • They even come with 10 different fillstates!
  • +
  • Better Shark Tails, dodododododo~
  • +
  • The old ones are now listed as carp tails.
  • +
+ +

18 August 2021

+

timothyteakettle updated:

+
    +
  • lets you select 4 prosthetic limbs instead of only 2
  • +
+ +

16 August 2021

+

BlueWildrose updated:

+
    +
  • Incapacitated mobs are blacklisted from being human-level intelligence sentience event candidates. This is particularly important due to slimes in BZ stasis on the station.
  • +
+

bunny232 updated:

+
    +
  • Polyvitiligo actually changes your color now
  • +
+ +

13 August 2021

+

Putnam3145 updated:

+
    +
  • makes certain organs no longer have circular references
  • +
+ +

12 August 2021

+

Arturlang updated:

+
    +
  • Nonslimes and nonvampires will no longer be able to increase their blood to stupid heights
  • +
+

Putnam3145 updated:

+
    +
  • Supermatter values use auxgm
  • +
+

cadyn updated:

+
    +
  • precompile.sh and build.sh updated, auxmos set to 0.2.3 in dependencies.sh
  • +
+ +

11 August 2021

+

timothyteakettle updated:

+
    +
  • lets felinids, humans and moths have markings
  • +
+ +

09 August 2021

+

Arturlang updated:

+
    +
  • Nanite machinery overlays should now work properly
  • +
  • screen objects are now atom/movables instead
  • +
  • Update appearance is used for updating atoms now instead of update_icon and such
  • +
+

BlueWildrose updated:

+
    +
  • Old gateway animation is back. Feedback is given that the gateway is open again.
  • +
+

Putnam3145 updated:

+
    +
  • Rod of asclepius can now be used for revival surgery
  • +
+ +

07 August 2021

+

BlueWildrose updated:

+
    +
  • The black dress, pink tutu, the bathrobe, the kimonos, and the qipaos no longer have a missing pixel when wearing them with the feminine bodytype. They're also no longer adjustable (they have no sprite for the adjusted variant and therefore it would just make an error if someone did that.)
  • +
+

Putnam3145 updated:

+
    +
  • Supernova rad storms are now half as likely per tick tweak: Supernovae don't announce they're ending if they never announced they're starting tweak: Supernovae say explicitly no rad storms can happen if they can't
  • +
  • Monstermos is back
  • +
+ +

05 August 2021

+

Putnam3145 updated:

+
    +
  • organs decay again
  • +
+ +

04 August 2021

+

BlueWildrose updated:

+
    +
  • The debrained overlay actually shows for brainless corpses now instead of showing a blue error.
  • +
+

timothyteakettle updated:

+
    +
  • legs are no longer awful
  • +
+ +

03 August 2021

+

zeroisthebiggay updated:

+
    +
  • tempgun is a laser
  • +
  • bake mode is useful
  • +
  • tempgun has less shots
  • +
  • tempgun has more sprites
  • +
+ +

02 August 2021

+

TripleShades updated:

+
    +
  • Decorative (read: Station-safe) water tile in the code
  • +
  • Pubby's new water feature wont kill atmosphere anymore
  • +
+ +

31 July 2021

+

MrJWhit updated:

+
    +
  • Fixes some minor mistakes around space near boxstation.
  • +
+

TripleShades updated:

+
    +
  • Fountain area to public mining station-side tweak: Moved around the tables and chairs and monitor at public mining station-side
  • +
+

WanderingFox95 updated:

+
    +
  • Added new ruin maps: The Bathhouse, The Library, The Engineering outpost, The Hotsprings(un-cursed), Lust, Wrath and an alternate spawn for the BDM in the form of a mining outpost, based on the same Ruins on the Ice Moon. removed: A lot of the fun items within the ice moon-based ruins that would break mining even more and trading cards.
  • +
  • Yes, this includes that the lavaland version of the hot spring is literally just water and not cursed. tweak: Also "fixed" that only one version of the BDM ruin ever spawns. Not sure it needed fixing but even locally hosted, only blooddrunk2.dmm would spawn. Since I added another spawn for the BDM, I fixed that too.
  • +
+ +

29 July 2021

+

EmeraldSundisk updated:

+
    +
  • Adds decals between Virology and the general Medbay to provide clarity
  • +
  • Adds an airlock with access to the Engineering Cooling Loop
  • +
  • The Maintenance Theater now has a suitable amount of dust
  • +
  • Removed an errant entertainment monitor left in the morgue
  • +
  • Removed redundant scrubber piping in and around the bar and kitchen tweak: Slightly readjusts an airpipe to take advantage of newfound space tweak: The Toxins Lab has received (predominantly) visual adjustments as to render it more in line with the general science department tweak: Toxins Storage is no longer its own area and as such needn't worry about APCs
  • +
  • Hydroponics now has a proper APC as intended
  • +
+ +

27 July 2021

+

Putnam3145 updated:

+
    +
  • Generic fires work now
  • +
  • A knock-on effect of the HE pipe change is that space cooling is ~8.4x as powerful
  • +
+ +

26 July 2021

+

SandPoot updated:

+
    +
  • Removes a sneaky transform button on the vore panel.
  • +
+ +

24 July 2021

+

MrJWhit updated:

+
    +
  • Replaces the northwest maint room on box with a sadness room
  • +
  • Replaces bar stripper room with an arcade on boxstation
  • +
  • Squished the west bathrooms a bit and made a room to sell things on boxstation.
  • +
  • Southeast maint hallway on box is now ziggy and zaggier.
  • +
  • Fixed pipes being not connected with the recent map PR for boxstation.
  • +
+

Putnam3145 updated:

+
    +
  • hallucination now bottoms out at 0
  • +
  • supermatter now causes only half the hallucinations
  • +
+

cadyn updated:

+
    +
  • auxmos bump for dependencies.sh
  • +
+ +

23 July 2021

+

silicons updated:

+
    +
  • Batons are slightly more powerful.
  • +
+ +

19 July 2021

+

Arturlang updated:

+
    +
  • The crafting button should no longer silently make more copies of itself on reconects
  • +
  • There are no longer two copies of the crafting component.
  • +
  • There is no longer a rogue d in tracer.dm tweak: Everything in Misc was moved to Miscelanious in the crafting menu, and Misc was nuked from orbit. Nobody will miss you.
  • +
+

MrJWhit updated:

+
    +
  • Fixes a memory leak, there's a good chance that it's the same one that killed kilo.
  • +
+

SandPoot updated:

+
    +
  • Put back mob vore with a pref.
  • +
  • Taken some stuff from tg for tgui_alert.
  • +
  • Refactored a lot of code on vore panel.
  • +
+

WanderingFox95 updated:

+
    +
  • custom plasteel kegs
  • +
+

YakumoChen updated:

+
    +
  • You can now wear the suffering of others on your head with just a sheet of human skin!
  • +
  • Human skin hats
  • +
+

keronshb updated:

+
    +
  • Stripping/equipping things to a conscious braindead person (AKA a human owned by a disconnected player) will now give them a message with your visible name and roughly how long ago you touched their stuff when they login again. Touching someone's pockets or adjusting their gear other than equipping/unequipping is not logged. After 5 minutes, you'll have forgotten both their name and exactly how long ago past those 5 minutes it happened. (Credit to Ryll-Ryll)
  • +
  • LAZYNULL
  • +
  • Breaking mirrors now gives you a bad omen
  • +
+

timothyteakettle updated:

+
    +
  • anthros can now select the cow tail
  • +
  • new quirk that allows you to eat trash
  • +
+ +

18 July 2021

+

timothyteakettle updated:

+
    +
  • fixes photosynthesis stopping nutrition going past well fed from non-photosynthesis means
  • +
+ +

17 July 2021

+

cadyn updated:

+
    +
  • precompile.sh updated
  • +
+ +

15 July 2021

+

Putnam3145 updated:

+
    +
  • fixes a major source of lag
  • +
+ +

14 July 2021

+

Putnam3145 updated:

+
    +
  • Acid is now a component
  • +
+ +

13 July 2021

+

MrJWhit updated:

+
    +
  • Adds a mirror above the sink in the captains bedroom in pubby
  • +
+ +

12 July 2021

+

Putnam3145 updated:

+
    +
  • causes_dirt_buildup_on_floor is now just a thing humans do instead of a weird var only true for humans
  • +
+ +

11 July 2021

+

shellspeed1 updated:

+
    +
  • replaces the seed machine with a biogen in the survival pod.
  • +
  • corrected an issue regarding wrong pair of gloves in the pod for DYI wiring .
  • +
+ +

10 July 2021

+

WanderingFox95 updated:

+
    +
  • Returns the wheelchair sprites to having, you know, wheels?
  • +
  • A motorized wheelchair addsound: Chairwhoosh.
  • +
+ +

09 July 2021

+

MrJWhit updated:

+
    +
  • Made a light not exist on the same tile as a door on pubby.
  • +
  • Makes the RD APC automatically connect to the powernet with the correct wire on pubby.
  • +
  • Added another wall for the AM engine so it doesn't space the airlock roundstart.
  • +
+ +

07 July 2021

+

DeltaFire15 updated:

+
    +
  • Golem / Plasmaman species color should work again.
  • +
+ +

05 July 2021

+

Putnam3145 updated:

+
    +
  • Watchers no longer search 9 tiles away for stuff then throw the result away if it's more than 1 tile away
  • +
  • Auxmos pull now uses a tag instead of pulling straight from the main branch
  • +
+

WanderingFox95 updated:

+
    +
  • Moved a sprite one pixel to the left.
  • +
+

zeroisthebiggay updated:

+
    +
  • tg based tool resprites
  • +
  • wirecutters have proper overlays
  • +
+ +

04 July 2021

+

cadyn updated:

+
    +
  • Updated server scripts for proper linux support
  • +
+ +

03 July 2021

+

DeltaFire15 updated:

+
    +
  • Turrets on nonlethal mode now once again shoot till the target is stamcrit as opposed to unable to use items, resolving some issues.
  • +
+

Putnam3145 updated:

+
    +
  • A bunch of sleeping process() calls now either don't sleep or make sure to call a proc with waitfor set to FALSE
  • +
+

WanderingFox95 updated:

+
    +
  • The axolotl ears in the .dmi file actually exist to the game now.
  • +
+ +

02 July 2021

+

silicons updated:

+
    +
  • spray bottles work again.
  • +
+ +

30 June 2021

+

WanderingFox95 updated:

+
    +
  • More plushies in the code.
  • +
  • Nabbed some plushie sprites from Cit RP and TG and made some myself. Enjoy!
  • +
  • The Daily Whiplash (Newspaper Baton) is now available! (Using sticky tape to stick a newspaper onto a baton) Bap!
  • +
  • A rolled up newspaper sprite was provided.
  • +
  • Switched Gateway and Vault locations on Boxstation, bringing it more in line with other stations.
  • +
+

bunny232 updated:

+
    +
  • The pubby xenobiology air/scrubber network is now isolated from the rest of the station
  • +
+

qweq12yt updated:

+
    +
  • HoP's cargo access was removed...
  • +
+

shellspeed1 updated:

+
    +
  • NT has lost experimental KA tech to miners who were lost in the field. Make sure to try and recover it.
  • +
  • Adds an extremely expensive survival pod to mining for people to work towards. Get to work cracking rocks today.
  • +
+ +

28 June 2021

+

Putnam3145 updated:

+
    +
  • APCs aren't infinite power anymore
  • +
  • FDA, LINDA without the bookkeeping.
  • +
  • Putnamos, a simpler replacement for Monstermos. If I can get Monstermos to work, this will be Monstermos instead.
  • +
  • LINDA, the old active-turfs-based atmos subsystem.
  • +
  • Monstermos? I would rather not get rid of this, but I can't get it to work correctly.
  • +
  • Extools has been removed, and loading extools alongside auxtools will cause massive problems. If this is tested or merged, remove extools from the static files.
  • +
+

WanderingFox95 updated:

+
    +
  • Carrots are good for your eyes - but eyes are also good for your carrots. Adds the googly eyes trait to walkingshrooms (Oculary Mimicry)
  • +
  • Googly Eyes - they make everything better.
  • +
+ +

25 June 2021

+

MrJWhit updated:

+
    +
  • Adds two missing decals to the 5x5 SM.
  • +
+

brokenOculus updated:

+
    +
  • pillbottles and syringesare now printable from the medbay protolathe, shiftstart. Hyposprays are now printable in medbay lathe under advanced biotech.
  • +
+ +

24 June 2021

+

WanderingFox95 updated:

+
    +
  • An announcement to let players know the Cat Surgeon has come to visit.
  • +
  • Upped the Volume of his spawn noise and lowered the spawn weight slightly.
  • +
+ +

23 June 2021

+

DeltaFire15 updated:

+
    +
  • A bunch of small nanite things should be less wonky
  • +
  • Slimes are no longer immune to vomiting (undocumented change from a previous PR)
  • +
  • Fruit wine exists again.
  • +
  • Airlock hacking no longer sleeps.
  • +
  • The clockwork gateway deconstruction no longer sleeps.
  • +
  • Teslium reactions and Holywater booms no longer sleep.
  • +
  • Slime timestop no longer sleeps.
  • +
+

Putnam3145 updated:

+
    +
  • inelastic exports no longer uselessly do exponential functions
  • +
+ +

22 June 2021

+

bunny232 updated:

+
    +
  • Adds a missing win door to meta xenobiology pen 6
  • +
+

silicons updated:

+
    +
  • no more doubleroasting
  • +
+ +

21 June 2021

+

silicons updated:

+
    +
  • glowshroom scaling
  • +
+

timothyteakettle updated:

+
    +
  • vore is 0.1% less shitcode
  • +
+

20 June 2021

Arturlang updated:

    @@ -104,566 +531,6 @@
    • Ling Bone Gauntlets work again
    - -

    17 June 2021

    -

    Vynzill updated:

    -
      -
    • ability to change crafted armwrap sprite to alternate one.
    • -
    • extended armwrap icon and sprite
    • -
    -

    timothyteakettle updated:

    -
      -
    • fixes an oversight causing embed jostling to do 2x as much damage as it should
    • -
    - -

    16 June 2021

    -

    silicons updated:

    -
      -
    • on_found works again
    • -
    - -

    15 June 2021

    -

    EmeraldSundisk updated:

    -
      -
    • Xenobiology now has proper lighting
    • -
    • The Corporate Showroom now has a proper front door
    • -
    • Mining snowmobiles now have keys
    • -
    • Adjusts area designations so GENTURF icons should no longer be visible in-game
    • -
    - -

    14 June 2021

    -

    EmeraldSundisk updated:

    -
      -
    • Adds a brand new, wholly unique mining base to Snaxi tweak: A thorough redesign of Snaxi (see PR #14818 for more info)
    • -
    • Increases the number of electrical connections between substations
    • -
    -

    MrJWhit updated:

    -
      -
    • Removes cat meteors.
    • -
    -

    SandPoot updated:

    -
      -
    • Tablet computers now have a pen slot, they can almost replace your pda!
    • -
    • Removed a bracket from printer's examine.
    • -
    • The cosmetic turtleneck and skirtleneck no longer start with broken sensors.
    • -
    -

    TripleShades updated:

    -
      -
    • Lights to AI Sat Walkways
    • -
    • Lights to Atmospherics
    • -
    • Floor labels to Atmospherics Gas Miner containment units
    • -
    • Gas canisters from Gas Miner containment units
    • -
    • Excessive wiring in Security and Detective's Office
    • -
    -

    qweq12yt updated:

    -
      -
    • Locker orders now properly bundle together in a single locker (still separated by buyer).
    • -
    • Changed some package names to be more accurate.
    • -
    -

    timothyteakettle updated:

    -
      -
    • bees can go in containers and are released upon opening the container
    • -
    • 7 more round tips have been added
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • new singularity hammer sprite
    • -
    • various slight sprite additions
    • -
    • distinctive combat defib sprite
    • -
    • a onesleeved croptop accessory sprited by trojan coyote
    • -
    • new bank machine sprite
    • -
    • unused goon coffin sprite
    • -
    • new water cooler sprite
    • -
    - -

    12 June 2021

    -

    silicons updated:

    -
      -
    • xenos are now truly immune to stamina damage.
    • -
    - -

    10 June 2021

    -

    Arturlang updated:

    -
      -
    • Holoparasites for traitors now cost 12 crystals, for operatives 8, the ricochet eyepath traitor item now 4.
    • -
    -

    DrPainis updated:

    -
      -
    • goliath calamari
    • -
    • cat meteors
    • -
    -

    Linzolle updated:

    -
      -
    • cults can build in maintenance (and other small areas) again.
    • -
    • centcom can no longer be selected as the target area for narsie to be summoned??????
    • -
    -

    MrJWhit updated:

    -
      -
    • Moves medical holodeck to the restricted category
    • -
    -

    SandPoot updated:

    -
      -
    • Uses some of the existing images for the typing indicators.
    • -
    • Fixes soulstone shard not working for non-cultists.
    • -
    -

    WanderingFox95 updated:

    -
      -
    • A random event for the cat surgeon to invade the station. Listen for scary noises!
    • -
    • Screaming Cat SFX, you know, for the mood.
    • -
    -

    bunny232 updated:

    -
      -
    • Atmos resin now properly prevents all atmos from moving
    • -
    • Air tanks now properly have a 21/79 o2/n2 mix
    • -
    • Hydroponics can now make 5u of slimejelly by injecting 3 oil, 2 radium and 1 tinea luxor into a glowshroom
    • -
    -

    keronshb updated:

    -
      -
    • Made it so Off Balance only disarms if they're shoved into a wall or person.
    • -
    • Reduced Off Balance time to 2 seconds.
    • -
    • Pierced Realities despawn after 3 minutes and 15 seconds, new unresearched realities spawn in after that time elsewhere to help other heretics get back into the game.
    • -
    • A required sacrifice amount for heretic's second to last and last powers are added to discourage only rushing for holes.
    • -
    • An announcement automatically plays to everyone that there's a heretic gunning for ascension upon learning the 2nd to last power
    • -
    • Blade Shatters are now used in hand other than with a HUD icon tweak: Adjusted some TGUI menus for the book to reflect how many sacrifices a heretic has and how many are required for certain powers
    • -
    • Fixes sprite issue for Void Cloak for people who have digigrade legs.
    • -
    • Fixes the Raw Prophet recipe to match the description
    • -
    • Lets the Cargo Shuttle use Disposal Pipes again
    • -
    • Adds motivation and adds it to the uplink
    • -
    • Adds Judgement Cut projectiles
    • -
    • Adds Judgement Cut hit effects and firing effects.
    • -
    • added sounds for the firing and hit sounds of Judgement Cuts, created by @dzahlus
    • -
    • Adds Floor Cluwnes and event for midround
    • -
    • Adds Cluwne mutation
    • -
    • Adds Cluwne spell
    • -
    • Adds Cluwnes
    • -
    • Adds Cluwne Mask + shoes
    • -
    • Adds Floor Cluwne spawn button
    • -
    • Adds Cluwne smite button
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • Fixed an exploit allowing you to grab people from anywhere with a clowncar.
    • -
    • revenant essence objective reduced
    • -
    - -

    06 June 2021

    -

    bunny232 updated:

    -
      -
    • Pools are capable of mist at lower temperatures
    • -
    - -

    05 June 2021

    -

    Arturlang updated:

    -
      -
    • float sanity now makes it not actually run if it's actively being thrown
    • -
    -

    coderbus13 updated:

    -
      -
    • Pubby's toxins injector now starts at 200L, like it does on other maps
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • light floppy dog ears
    • -
    - -

    04 June 2021

    -

    MrJWhit updated:

    -
      -
    • Adds a missing pipe
    • -
    -

    Putnam3145 updated:

    -
      -
    • sniper rifle doesn't ruin your round instantly now
    • -
    - -

    03 June 2021

    -

    MrJWhit updated:

    -
      -
    • Removed some debug tiles on the xenoruin.
    • -
    -

    TripleShades updated:

    -
      -
    • Added a camera to both solar entryways
    • -
    • Added an intercom to toxin's launch for the doppler
    • -
    • The fake nuke auth disk in the library
    • -
    - -

    29 May 2021

    -

    Kraseo updated:

    -
      -
    • No more slamming into people while bloodcrawled.
    • -
    -

    Linzolle updated:

    -
      -
    • brand intelligence event works again
    • -
    -

    keronshb updated:

    -
      -
    • swag outfit available in clothesmate
    • -
    • swag shoes availble in clothesmate resprite: changed swag shoes icon to the one twaticus made.
    • -
    • Adds the clown mob spawner for admins
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • puglism damage can no longer stack with scarp
    • -
    - -

    26 May 2021

    -

    bunny232 updated:

    -
      -
    • Removed two random 'captain's office' tiles from space on meta station
    • -
    - -

    24 May 2021

    -

    zeroisthebiggay updated:

    -
      -
    • New traitor item: the Mauler Gauntlets! Punch hard, punch good! Eight telecrystals, buy today!
    • -
    • hairs from Airborne Snitch
    • -
    - -

    23 May 2021

    -

    Putnam3145 updated:

    -
      -
    • Antag and species no longer remove all traits if one has a blacklisted trait
    • -
    -

    WanderingFox95 updated:

    -
      -
    • Replaced the antlers showing up when you select deer ears with actual deer ears. Literally why was that even a thing before?
    • -
    • Straight rabbit ears are now a thing.
    • -
    -

    keronshb updated:

    -
      -
    • 30 > 25 pop req for contractor kit
    • -
    • adds a special hud for simple mobs.
    • -
    • a lot of >32x32 mobs now have icons for their health dolls
    • -
    - -

    21 May 2021

    -

    Putnam3145 updated:

    -
      -
    • Fixed activity being attached to minds instead of mobs on antag attach.
    • -
    - -

    20 May 2021

    -

    qweq12yt updated:

    -
      -
    • Fixed void cloak voiding itself into oblivion.
    • -
    • You can now order emag shuttles again.
    • -
    -

    timothyteakettle updated:

    -
      -
    • ports rp's marking system
    • -
    - -

    19 May 2021

    -

    WanderingFox95 updated:

    -
      -
    • The E-Fink, a mending tool for food.
    • -
    • A backwards bladeslice. (Yes, for the E-fink)
    • -
    • And Icons for the E-fink, of course.
    • -
    -

    shellspeed1 updated:

    -
      -
    • Survival pods can now be designated as requiring power. Survival pods with this feature should include an APC when created and will run out of power rather quickly if no source is added. Perfect for true emergencies.
    • -
    • An empty survival pod has been added to the mining vendor. This is an extremely barebones pod featuring only a gps, table, apc, and the standard fridge for some donk pockets.
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • New Alcohol Amaretto and various cocktails
    • -
    • more drink mixture flavortext
    • -
    • you're going to Baystation
    • -
    - -

    15 May 2021

    -

    bunny232 updated:

    -
      -
    • Corrects the bot pathing by engineering on meta station
    • -
    -

    timothyteakettle updated:

    -
      -
    • borg spraycans have a five second delay before being able to knock someone down again
    • -
    - -

    14 May 2021

    -

    keronshb updated:

    -
      -
    • Removes VOG sleep command since it was an undocumented readd.
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • consealed
    • -
    - -

    13 May 2021

    -

    Linzolle updated:

    -
      -
    • anthromorphic -> anthropomorphic
    • -
    -

    WanderingFox95 updated:

    -
      -
    • Pinot Mort (Necropolis Wine), a new, (totally healthy) mixed drink!
    • -
    -

    qweq12yt updated:

    -
      -
    • Fixed sleeping disky spam (it still sleeps soundly, but every minute instead of every two seconds)
    • -
    • Fixed Hulks not breaking cuffs, zipties, restraints.
    • -
    -

    silicons updated:

    -
      -
    • A deterministic wave explosion system has been added. Use it with wave_explosion().
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • vegas style bunny ears
    • -
    - -

    12 May 2021

    -

    DeltaFire15 updated:

    -
      -
    • find_safe_turf no longer always fails on safe oxygen levels(??)
    • -
    • Heretic bladeshatters now actually take the heretic's z into account as intended, instead of always being station z tweak: Message for failing the bladeshatter despite succeeding the do_after tweak: Improves bladeshatter a bit by making it safer codewise
    • -
    - -

    11 May 2021

    -

    LetterN updated:

    -
      -
    • fixes emagging console shuttle purchases
    • -
    • syndie melee simplemobs has no more bullshit shield
    • -
    -

    bunny232 updated:

    -
      -
    • Delta station xenobiology department has received enhanced scrubbing and ventilation capabilities similar to box and meta
    • -
    - -

    09 May 2021

    -

    Putnam3145 updated:

    -
      -
    • Priority announcement admeme verb
    • -
    -

    SandPoot updated:

    -
      -
    • Fixed Cyborg examines adding an extra weird line.
    • -
    • Everything can be set to have tooltips, and even coded to have neat tooltips.
    • -
    • Makes it so humans and borgs already have tooltips.
    • -
    -

    TheObserver-sys updated:

    -
      -
    • Fixes most of the weird handling bugs and improves cigarette case handling in general.
    • -
    • The Gorlex Marauders have seen fit to allow you to purchase the .45-70 GOVT rare ammo, at a premium cost. Don't waste it.
    • -
    -

    WanderingFox95 updated:

    -
      -
    • added the unrolling pin, an innovative solution to dough-based mishaps.
    • -
    • added visuals for the unrolling pin
    • -
    -

    dzahlus updated:

    -
      -
    • added new malf AI spawn and doomsday sound
    • -
    • removed old malf AI spawn and doomsday sound
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • pirates now have a medbay and several other things qualifying as a buff
    • -
    • pirates lost their toilet
    • -
    - -

    08 May 2021

    -

    Arturlang updated:

    -
      -
    • Synthblood bottles now have the proper color and probably won't poison you anymore
    • -
    -

    timothyteakettle updated:

    -
      -
    • lets humans have digi legs (and avian legs)
    • -
    - -

    05 May 2021

    -

    The0bserver, with a great amount of advice from TripleZeta/TetraZeta updated:

    -
      -
    • Adds a new crate type, for use with any manner of cheeky breeki shenanigans, as well as with existing Russian contraband.
    • -
    -

    bunny232 updated:

    -
      -
    • There's some new vents and scrubbers in the meta station xenobiology department. Welders and wrenches not included*
    • -
    -

    keronshb updated:

    -
      -
    • Nightmare Shadow Jaunt threshold up to 0.4
    • -
    • Vendor and Engraved message light down to 0.3
    • -
    - -

    03 May 2021

    -

    TripleShades updated:

    -
      -
    • Added two air alarms to Pubby Security, one in the evidence locker room and one in the main equipment back room
    • -
    • pAI Card back to outside Research in Meta Station
    • -
    • Pubby Disposals now shunts to space
    • -
    • Maintinence Areas being not applied to certain airlocks as well as stealing minor walls
    • -
    • Box Surgery Storage camera is now renamed to be on the network
    • -
    • Box Paramedic Station camera is now renamed to be on the network, and no longer steals the Morgue's cam tweak: Box Surgery Storage is now it's own proper room
    • -
    - -

    01 May 2021

    -

    qweq12yt updated:

    -
      -
    • Restores the sprite for the Riot Suit.
    • -
    - -

    30 April 2021

    -

    DrPainis updated:

    -
      -
    • Bubblegum's hallucinations are capitalized.
    • -
    -

    Melbert, SandPoot updated:

    -
      -
    • TGUI Limbgrower
    • -
    • Refactored the limbgrower to modernize the code and allow for more types of designs.
    • -
    • The limbgrower now supports plumbing ducts.
    • -
    • Fixes genitals not actually getting data from disks.
    • -
    • Adds two special helpers.
    • -
    -

    SandPoot updated:

    -
      -
    • The decal painter now has visible previews for your tile painting funs.
    • -
    • Fixes decal painter painting in the opposite direction.
    • -
    -

    TheObserver-sys updated:

    -
      -
    • Restores the access lock on crates that should have them, given the goods inside.
    • -
    • Makes the 10MM Surplus Rifle a less awful thing to use.
    • -
    • replaces unarmored things with their armored versions.
    • -
    • Illegal Tech Ammo actually is fucking reasonable, now.
    • -
    • Expensive Illegal Tech Ammo Boxes are now constructible, with actually justifiable prices.
    • -
    -

    WanderingFox95 updated:

    -
      -
    • There's finally a reason for the reagent dart gun to exist and be used!
    • -
    -

    akada updated:

    -
      -
    • Changes the space adaptation sprite to something less intrusive and more subtle.
    • -
    -

    necromanceranne updated:

    -
      -
    • Basic cybernetic organs: they're worse than organic! Basic stomachs, hearts, lungs and livers! For when you hate someone enough to not bother harvesting organs from a monkeyhuman!
    • -
    • Cybernetic organs have been adjusted into three tiers: 1 (basic), 2 (standard, better than organic) and 3 (absolutely better than organic but expensive to print)
    • -
    • Cybernetic organs that are emp'd instead suffer different effects based on the severity of the emp. The bigger the emp, the worse the effect is.
    • -
    • Rather than outright bricking, severely emp'd cyberorgans degrade over time very quickly, requiring replacement in the near future.
    • -
    • Fake blindfolds in the loadout. They don't obscure vision, for better or worse.
    • -
    - -

    29 April 2021

    -

    Putnam3145 updated:

    -
      -
    • Fixed a couple runtimes in activity (threat) tracking
    • -
    -

    keronshb updated:

    -
      -
    • Removes the Reinforcement Chromosome from Genetics.
    • -
    - -

    26 April 2021

    -

    Trigg, stylemistake and SandPoot updated:

    -
      -
    • Admins just got a new TGUI Select Equipment menu tweak: Prevents the window from creating sprites for any animated version there might be. (this guarantees consistant sprite size/amount)
    • -
    - -

    25 April 2021

    -

    DrPainis updated:

    -
      -
    • Bubblegum is now capitalized.
    • -
    - -

    22 April 2021

    -

    Whoneedspacee updated:

    -
      -
    • new arena attack where ash drake summons lava around you
    • -
    • removed old swooping above you, instead flies above you instantly
    • -
    • ash drake now spawns temporary lava pools instead of meteors falling down
    • -
    • ash drake takes twice as long to swoop down now that he instantly goes above you
    • -
    • ash drake now moves twice as fast
    • -
    • increases the odds of lava spawns in the lava pool attack
    • -
    • increases fire line damage and decreases lava attacks direct damage tweak: ash drake fire now shoots in the direction of the target tweak: changes times of certain animations tweak: changes sounds of meteor falling to lava creation
    • -
    • a bug where ash drakes attacks did not damage mechs
    • -
    • changes meteor icon to lava creation animation from lava staff
    • -
    • Mass fire attack, sends fire out from the ash drake in all directions
    • -
    • Adds an enraged attack for ash drake, heals him as well as making him glow and go faster, spawning massive amounts of fire in all directions
    • -
    • Removes the old triple swoop with lava pools attack tweak: Lava pools can now spawn with the normal fire breath attack sometimes tweak: Lava pools now have changed delays for lesser amounts so they don't all just place around one area tweak: Increases default swoop delay
    • -
    • Teleporting out of the lava arena now has some actual consequences by enraging the ash drake
    • -
    • Makes lava arena a bit less laggy by not recalculating range_turfs every time
    • -
    • Fixes the arena attack selecting inaccessible tiles as the safe tile though this will not change the turfs to basalt temporarily to prevent moving through indestructible walls
    • -
    • Fire lines would not spawn if their range would place their final turf location outside of the map
    • -
    • The arena attack will no longer destroy indestructible open turfs
    • -
    • ash drake fire does less damage now
    • -
    • ash drake takes longer to swoop down now
    • -
    • tiles take longer to fully convert into lava now, slowing down the arena attack as well
    • -
    • fire breath now moves slower
    • -
    • triple fire breath for the lava swoop only happens below half health now
    • -
    • The arena attack not making safespots when you fight it in a mech
    • -
    - -

    21 April 2021

    -

    necromanceranne updated:

    -
      -
    • Stun batons (not police batons/telebatons) no longer knockdown on leftclick.
    • -
    • Stun batons apply a knockdown and tase effect on right click, but once every few seconds (they still don't disarm). They are vulnerable to a shove disarm briefly, however. Standard batons have a cooldown of 5 seconds. Stun prods have a cooldown of 7 seconds.
    • -
    • Taser resistance prevents the knockdown, so any chem that grants this (like adrenals) protects you from this knockdown.
    • -
    • Stun batons apply a stagger when they hit someone, preventing sprinting for a few seconds.
    • -
    • Stun batons respect melee armor for their stamina damage, but their cells, based on max charge, grant armor penetration. For every 1000 charge, they gain 1 armor pen. (Roundstart batons have 15 pen, just fyi)
    • -
    • Shoves can disarm you of any item, not just guns.
    • -
    • Removes a duplicate trait definition for TRAIT_NICE_SHOT.
    • -
    - -

    20 April 2021

    -

    BlueWildrose updated:

    -
      -
    • New slimeperson organs that aren't really that different from humans for now.
    • -
    • Some blue organs for slimepeople.
    • -
    • Space pirate sleepers can now be crowbared to be destroyed.
    • -
    -

    DrPainis updated:

    -
      -
    • ash drake meat
    • -
    -

    Hatterhat updated:

    -
      -
    • Plastitanium glass now properly applies the *2 bonus for integrity and efficiency when used as a solar panel.
    • -
    -

    HeroWithYay updated:

    -
      -
    • replaced some icons
    • -
    -

    Putnam3145 updated:

    -
      -
    • Bluespace pipes, which can teleport gas over long distances
    • -
    • Donk co traitor class (assassin-heavy)
    • -
    • Waffle co traitor class (freeform)
    • -
    • Admin-only activity tracking system only attached to antags for now tweak: Objective rerolling can now be done twice
    • -
    • Sabotage objectives won't give "free objective" anymore
    • -
    -

    The0bserver, TripleZeta, and AsciiSquid updated:

    -
      -
    • New, easily concealable weapons, chambered in .38, .357, and .45-70 Govt. Fun for the whole family!
    • -
    • Some smugglers seem to have acquired a high amount of .38 derringers, and are looking to offload them to those of gray morality, with no questions asked!
    • -
    • An enigmatic gun collector has seen fit to do special acquisition work for the Gorlex Marauders, selling the fruits of his labor for a premium price. If you have the right electomagnetic sequence, you might be able to contact him to acquire a piece of his armory.
    • -
    -

    coiax updated:

    -
      -
    • Nuke ops can now purchase a box of "deathrattle implants". When an implanted person dies, all the other users of the implant will get a message, saying who died and where they died.
    • -
    -

    keronshb updated:

    -
      -
    • Weight per blood is .03 now instead of .05
    • -
    • Dragnet Snare breakout timer is now 2.5 seconds down from 5 seconds.
    • -
    -

    qweq12yt updated:

    -
      -
    • Fixed a bug where some cargo crates would never arrive and still charge users
    • -
    -

    zeroisthebiggay updated:

    -
      -
    • the box ghost burger
    • -
GoonStation 13 Development Team diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 59ec30afb3..580cf51a2f 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -29538,3 +29538,303 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. zeroisthebiggay: - imageadd: beltslot sprites for various items - imageadd: resprite for telebaton +2021-06-21: + silicons: + - bugfix: glowshroom scaling + timothyteakettle: + - bugfix: vore is 0.1% less shitcode +2021-06-22: + bunny232: + - bugfix: Adds a missing win door to meta xenobiology pen 6 + silicons: + - bugfix: no more doubleroasting +2021-06-23: + DeltaFire15: + - bugfix: A bunch of small nanite things should be less wonky + - bugfix: Slimes are no longer immune to vomiting (undocumented change from a previous + PR) + - bugfix: Fruit wine exists again. + - code_imp: Airlock hacking no longer sleeps. + - code_imp: The clockwork gateway deconstruction no longer sleeps. + - code_imp: Teslium reactions and Holywater booms no longer sleep. + - code_imp: Slime timestop no longer sleeps. + Putnam3145: + - bugfix: inelastic exports no longer uselessly do exponential functions +2021-06-24: + WanderingFox95: + - rscadd: An announcement to let players know the Cat Surgeon has come to visit. + - balance: Upped the Volume of his spawn noise and lowered the spawn weight slightly. +2021-06-25: + MrJWhit: + - rscadd: Adds two missing decals to the 5x5 SM. + brokenOculus: + - rscadd: pillbottles and syringesare now printable from the medbay protolathe, + shiftstart. Hyposprays are now printable in medbay lathe under advanced biotech. +2021-06-28: + Putnam3145: + - bugfix: APCs aren't infinite power anymore + - rscadd: FDA, LINDA without the bookkeeping. + - rscadd: Putnamos, a simpler replacement for Monstermos. If I can get Monstermos + to work, this will be Monstermos instead. + - rscdel: LINDA, the old active-turfs-based atmos subsystem. + - rscdel: Monstermos? I would rather not get rid of this, but I can't get it to + work correctly. + - server: Extools has been removed, and loading extools alongside auxtools will + cause massive problems. If this is tested or merged, remove extools from the + static files. + WanderingFox95: + - rscadd: Carrots are good for your eyes - but eyes are also good for your carrots. + Adds the googly eyes trait to walkingshrooms (Oculary Mimicry) + - imageadd: Googly Eyes - they make everything better. +2021-06-30: + WanderingFox95: + - rscadd: More plushies in the code. + - imageadd: Nabbed some plushie sprites from Cit RP and TG and made some myself. + Enjoy! + - rscadd: The Daily Whiplash (Newspaper Baton) is now available! (Using sticky tape + to stick a newspaper onto a baton) Bap! + - imageadd: A rolled up newspaper sprite was provided. + - balance: Switched Gateway and Vault locations on Boxstation, bringing it more + in line with other stations. + bunny232: + - rscadd: The pubby xenobiology air/scrubber network is now isolated from the rest + of the station + qweq12yt: + - rscdel: HoP's cargo access was removed... + shellspeed1: + - balance: NT has lost experimental KA tech to miners who were lost in the field. + Make sure to try and recover it. + - rscadd: Adds an extremely expensive survival pod to mining for people to work + towards. Get to work cracking rocks today. +2021-07-02: + silicons: + - bugfix: spray bottles work again. +2021-07-03: + DeltaFire15: + - bugfix: Turrets on nonlethal mode now once again shoot till the target is stamcrit + as opposed to unable to use items, resolving some issues. + Putnam3145: + - bugfix: A bunch of sleeping process() calls now either don't sleep or make sure + to call a proc with waitfor set to FALSE + WanderingFox95: + - bugfix: The axolotl ears in the .dmi file actually exist to the game now. +2021-07-04: + cadyn: + - server: Updated server scripts for proper linux support +2021-07-05: + Putnam3145: + - bugfix: Watchers no longer search 9 tiles away for stuff then throw the result + away if it's more than 1 tile away + - server: Auxmos pull now uses a tag instead of pulling straight from the main branch + WanderingFox95: + - bugfix: Moved a sprite one pixel to the left. + zeroisthebiggay: + - imageadd: tg based tool resprites + - bugfix: wirecutters have proper overlays +2021-07-07: + DeltaFire15: + - bugfix: Golem / Plasmaman species color should work again. +2021-07-09: + MrJWhit: + - bugfix: Made a light not exist on the same tile as a door on pubby. + - bugfix: Makes the RD APC automatically connect to the powernet with the correct + wire on pubby. + - rscadd: Added another wall for the AM engine so it doesn't space the airlock roundstart. +2021-07-10: + WanderingFox95: + - imageadd: Returns the wheelchair sprites to having, you know, wheels? + - rscadd: 'A motorized wheelchair addsound: Chairwhoosh.' +2021-07-11: + shellspeed1: + - balance: replaces the seed machine with a biogen in the survival pod. + - bugfix: corrected an issue regarding wrong pair of gloves in the pod for DYI wiring + . +2021-07-12: + Putnam3145: + - refactor: causes_dirt_buildup_on_floor is now just a thing humans do instead of + a weird var only true for humans +2021-07-13: + MrJWhit: + - rscadd: Adds a mirror above the sink in the captains bedroom in pubby +2021-07-14: + Putnam3145: + - refactor: Acid is now a component +2021-07-15: + Putnam3145: + - bugfix: fixes a major source of lag +2021-07-17: + cadyn: + - server: precompile.sh updated +2021-07-18: + timothyteakettle: + - bugfix: fixes photosynthesis stopping nutrition going past well fed from non-photosynthesis + means +2021-07-19: + Arturlang: + - bugfix: The crafting button should no longer silently make more copies of itself + on reconects + - code_imp: There are no longer two copies of the crafting component. + - code_imp: 'There is no longer a rogue d in tracer.dm tweak: Everything in Misc + was moved to Miscelanious in the crafting menu, and Misc was nuked from orbit. + Nobody will miss you.' + MrJWhit: + - bugfix: Fixes a memory leak, there's a good chance that it's the same one that + killed kilo. + SandPoot: + - rscadd: Put back mob vore with a pref. + - code_imp: Taken some stuff from tg for tgui_alert. + - refactor: Refactored a lot of code on vore panel. + WanderingFox95: + - rscadd: custom plasteel kegs + YakumoChen: + - rscadd: You can now wear the suffering of others on your head with just a sheet + of human skin! + - imageadd: Human skin hats + keronshb: + - rscadd: Stripping/equipping things to a conscious braindead person (AKA a human + owned by a disconnected player) will now give them a message with your visible + name and roughly how long ago you touched their stuff when they login again. + Touching someone's pockets or adjusting their gear other than equipping/unequipping + is not logged. After 5 minutes, you'll have forgotten both their name and exactly + how long ago past those 5 minutes it happened. (Credit to Ryll-Ryll) + - rscadd: LAZYNULL + - rscadd: Breaking mirrors now gives you a bad omen + timothyteakettle: + - bugfix: anthros can now select the cow tail + - rscadd: new quirk that allows you to eat trash +2021-07-23: + silicons: + - balance: Batons are slightly more powerful. +2021-07-24: + MrJWhit: + - rscadd: Replaces the northwest maint room on box with a sadness room + - rscadd: Replaces bar stripper room with an arcade on boxstation + - rscadd: Squished the west bathrooms a bit and made a room to sell things on boxstation. + - balance: Southeast maint hallway on box is now ziggy and zaggier. + - bugfix: Fixed pipes being not connected with the recent map PR for boxstation. + Putnam3145: + - bugfix: hallucination now bottoms out at 0 + - balance: supermatter now causes only half the hallucinations + cadyn: + - server: auxmos bump for dependencies.sh +2021-07-26: + SandPoot: + - rscdel: Removes a sneaky transform button on the vore panel. +2021-07-27: + Putnam3145: + - bugfix: Generic fires work now + - balance: A knock-on effect of the HE pipe change is that space cooling is ~8.4x + as powerful +2021-07-29: + EmeraldSundisk: + - rscadd: Adds decals between Virology and the general Medbay to provide clarity + - rscadd: Adds an airlock with access to the Engineering Cooling Loop + - rscadd: The Maintenance Theater now has a suitable amount of dust + - rscdel: Removed an errant entertainment monitor left in the morgue + - rscdel: 'Removed redundant scrubber piping in and around the bar and kitchen tweak: + Slightly readjusts an airpipe to take advantage of newfound space tweak: The + Toxins Lab has received (predominantly) visual adjustments as to render it more + in line with the general science department tweak: Toxins Storage is no longer + its own area and as such needn''t worry about APCs' + - bugfix: Hydroponics now has a proper APC as intended +2021-07-31: + MrJWhit: + - bugfix: Fixes some minor mistakes around space near boxstation. + TripleShades: + - rscadd: 'Fountain area to public mining station-side tweak: Moved around the tables + and chairs and monitor at public mining station-side' + WanderingFox95: + - rscadd: 'Added new ruin maps: The Bathhouse, The Library, The Engineering outpost, + The Hotsprings(un-cursed), Lust, Wrath and an alternate spawn for the BDM in + the form of a mining outpost, based on the same Ruins on the Ice Moon. removed: + A lot of the fun items within the ice moon-based ruins that would break mining + even more and trading cards.' + - balance: 'Yes, this includes that the lavaland version of the hot spring is literally + just water and not cursed. tweak: Also "fixed" that only one version of the + BDM ruin ever spawns. Not sure it needed fixing but even locally hosted, only + blooddrunk2.dmm would spawn. Since I added another spawn for the BDM, I fixed + that too.' +2021-08-02: + TripleShades: + - rscadd: 'Decorative (read: Station-safe) water tile in the code' + - bugfix: Pubby's new water feature wont kill atmosphere anymore +2021-08-03: + zeroisthebiggay: + - balance: tempgun is a laser + - balance: bake mode is useful + - balance: tempgun has less shots + - imageadd: tempgun has more sprites +2021-08-04: + BlueWildrose: + - bugfix: The debrained overlay actually shows for brainless corpses now instead + of showing a blue error. + timothyteakettle: + - bugfix: legs are no longer awful +2021-08-05: + Putnam3145: + - bugfix: organs decay again +2021-08-07: + BlueWildrose: + - bugfix: The black dress, pink tutu, the bathrobe, the kimonos, and the qipaos + no longer have a missing pixel when wearing them with the feminine bodytype. + They're also no longer adjustable (they have no sprite for the adjusted variant + and therefore it would just make an error if someone did that.) + Putnam3145: + - balance: 'Supernova rad storms are now half as likely per tick tweak: Supernovae + don''t announce they''re ending if they never announced they''re starting tweak: + Supernovae say explicitly no rad storms can happen if they can''t' + - rscadd: Monstermos is back +2021-08-09: + Arturlang: + - bugfix: Nanite machinery overlays should now work properly + - code_imp: screen objects are now atom/movables instead + - code_imp: Update appearance is used for updating atoms now instead of update_icon + and such + BlueWildrose: + - bugfix: Old gateway animation is back. Feedback is given that the gateway is open + again. + Putnam3145: + - balance: Rod of asclepius can now be used for revival surgery +2021-08-11: + timothyteakettle: + - rscadd: lets felinids, humans and moths have markings +2021-08-12: + Arturlang: + - rscdel: Nonslimes and nonvampires will no longer be able to increase their blood + to stupid heights + Putnam3145: + - refactor: Supermatter values use auxgm + cadyn: + - server: precompile.sh and build.sh updated, auxmos set to 0.2.3 in dependencies.sh +2021-08-13: + Putnam3145: + - bugfix: makes certain organs no longer have circular references +2021-08-16: + BlueWildrose: + - bugfix: Incapacitated mobs are blacklisted from being human-level intelligence + sentience event candidates. This is particularly important due to slimes in + BZ stasis on the station. + bunny232: + - bugfix: Polyvitiligo actually changes your color now +2021-08-18: + timothyteakettle: + - rscadd: lets you select 4 prosthetic limbs instead of only 2 +2021-08-20: + EmeraldSundisk: + - rscadd: Adds a law office/courtroom to OmegaStation + - rscadd: Adds a gateway to OmegaStation + - rscadd: Adds a pool/maintenance bar to OmegaStation + - rscdel: 'Removes the original maintenance garden in OmegaStation tweak: Relocates + the bathrooms to the starboard hall tweak: Modifies port quarter maintenance + to include some affected items' + Putnam3145: + - rscadd: Beach now has showers + TripleShades: + - rscadd: At least four or five space heaters spread across Pubby Station Maints + - rscadd: Missing decal in Pubby Station engineering + - bugfix: Moved an atmos alarm in the SM emitter chamber so it wont be destroyed + WanderingFox95: + - rscadd: Empty bottles and pitchers are available to the bartender now. + - imageadd: They even come with 10 different fillstates! + - imageadd: Better Shark Tails, dodododododo~ + - rscadd: The old ones are now listed as carp tails. diff --git a/icons/mob/clothing/custom_w.dmi b/icons/mob/clothing/custom_w.dmi index 1a4acbc242..199232d73b 100644 Binary files a/icons/mob/clothing/custom_w.dmi and b/icons/mob/clothing/custom_w.dmi differ diff --git a/icons/mob/clothing/head.dmi b/icons/mob/clothing/head.dmi index da499d5e7d..2dc094f7d1 100644 Binary files a/icons/mob/clothing/head.dmi and b/icons/mob/clothing/head.dmi differ diff --git a/icons/mob/human_parts.dmi b/icons/mob/human_parts.dmi index 34a1ada483..3310d911cb 100644 Binary files a/icons/mob/human_parts.dmi and b/icons/mob/human_parts.dmi differ diff --git a/icons/mob/human_parts_greyscale.dmi b/icons/mob/human_parts_greyscale.dmi index c404fbcacb..d04323b02b 100644 Binary files a/icons/mob/human_parts_greyscale.dmi and b/icons/mob/human_parts_greyscale.dmi differ diff --git a/icons/mob/inhands/equipment/tools_lefthand.dmi b/icons/mob/inhands/equipment/tools_lefthand.dmi index c25ea837da..27aaef50b1 100644 Binary files a/icons/mob/inhands/equipment/tools_lefthand.dmi and b/icons/mob/inhands/equipment/tools_lefthand.dmi differ diff --git a/icons/mob/inhands/equipment/tools_righthand.dmi b/icons/mob/inhands/equipment/tools_righthand.dmi index 65f1145278..54f8f6560d 100644 Binary files a/icons/mob/inhands/equipment/tools_righthand.dmi and b/icons/mob/inhands/equipment/tools_righthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_lefthand.dmi b/icons/mob/inhands/weapons/guns_lefthand.dmi index 07000f43aa..ca742c9c7f 100644 Binary files a/icons/mob/inhands/weapons/guns_lefthand.dmi and b/icons/mob/inhands/weapons/guns_lefthand.dmi differ diff --git a/icons/mob/inhands/weapons/guns_righthand.dmi b/icons/mob/inhands/weapons/guns_righthand.dmi index cf07bbba91..a277b29993 100644 Binary files a/icons/mob/inhands/weapons/guns_righthand.dmi and b/icons/mob/inhands/weapons/guns_righthand.dmi differ diff --git a/icons/mob/legfile1test.dmi b/icons/mob/legfile1test.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/legfile1test.dmi differ diff --git a/icons/mob/legfile2test.dmi b/icons/mob/legfile2test.dmi new file mode 100644 index 0000000000..cf74d73796 Binary files /dev/null and b/icons/mob/legfile2test.dmi differ diff --git a/icons/mob/radial.dmi b/icons/mob/radial.dmi index e681069131..27b268eea0 100644 Binary files a/icons/mob/radial.dmi and b/icons/mob/radial.dmi differ diff --git a/icons/obj/bureaucracy.dmi b/icons/obj/bureaucracy.dmi index b778a9d1a2..7b00c155ef 100644 Binary files a/icons/obj/bureaucracy.dmi and b/icons/obj/bureaucracy.dmi differ diff --git a/icons/obj/clothing/belt_overlays.dmi b/icons/obj/clothing/belt_overlays.dmi index 5f31a65ffa..0799920a6c 100644 Binary files a/icons/obj/clothing/belt_overlays.dmi and b/icons/obj/clothing/belt_overlays.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 0091961588..e63044df9e 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/custom.dmi b/icons/obj/custom.dmi index 7b00d52f8f..89da4b43a0 100644 Binary files a/icons/obj/custom.dmi and b/icons/obj/custom.dmi differ diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index 34f9867ee9..b507b3bcdd 100644 Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index b7f21a1fe4..0f49bc6d5f 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/guns/energy.dmi b/icons/obj/guns/energy.dmi index 158c95ee5d..5a9493e874 100644 Binary files a/icons/obj/guns/energy.dmi and b/icons/obj/guns/energy.dmi differ diff --git a/icons/obj/hydroponics/harvest.dmi b/icons/obj/hydroponics/harvest.dmi index 7474bb87ab..08d8cf8fa1 100644 Binary files a/icons/obj/hydroponics/harvest.dmi and b/icons/obj/hydroponics/harvest.dmi differ diff --git a/icons/obj/machines/gateway.dmi b/icons/obj/machines/gateway.dmi index 5ba943bb89..99a74a68bc 100644 Binary files a/icons/obj/machines/gateway.dmi and b/icons/obj/machines/gateway.dmi differ diff --git a/icons/obj/nuke_tools.dmi b/icons/obj/nuke_tools.dmi index 799c4baabb..7f5c730fe5 100644 Binary files a/icons/obj/nuke_tools.dmi and b/icons/obj/nuke_tools.dmi differ diff --git a/icons/obj/objects.dmi b/icons/obj/objects.dmi index b9c891ddb9..6d29b8df8e 100644 Binary files a/icons/obj/objects.dmi and b/icons/obj/objects.dmi differ diff --git a/icons/obj/plushes.dmi b/icons/obj/plushes.dmi index 97c3ea1409..69cec1a6fd 100644 Binary files a/icons/obj/plushes.dmi and b/icons/obj/plushes.dmi differ diff --git a/icons/obj/reagentfillings.dmi b/icons/obj/reagentfillings.dmi index 8115036b6f..7926ead12d 100644 Binary files a/icons/obj/reagentfillings.dmi and b/icons/obj/reagentfillings.dmi differ diff --git a/icons/obj/tools.dmi b/icons/obj/tools.dmi index 8414c8b95c..a720aff62c 100644 Binary files a/icons/obj/tools.dmi and b/icons/obj/tools.dmi differ diff --git a/icons/obj/vehicles.dmi b/icons/obj/vehicles.dmi index d12851f572..14b19caef8 100644 Binary files a/icons/obj/vehicles.dmi and b/icons/obj/vehicles.dmi differ diff --git a/libbyond-extools.so b/libbyond-extools.so deleted file mode 100644 index bdae36893f..0000000000 Binary files a/libbyond-extools.so and /dev/null differ diff --git a/modular_citadel/code/modules/client/loadout/__donator.dm b/modular_citadel/code/modules/client/loadout/__donator.dm index 39ed9d6ec8..c1489da94a 100644 --- a/modular_citadel/code/modules/client/loadout/__donator.dm +++ b/modular_citadel/code/modules/client/loadout/__donator.dm @@ -554,3 +554,9 @@ slot = SLOT_W_UNIFORM path = /obj/item/clothing/under/smaiden ckeywhitelist = list("ultimarifox") + +/datum/gear/donator/mgasmask + name = "Military Gas Mask" + slot = SLOT_IN_BACKPACK + path = /obj/item/clothing/mask/gas/military + ckeywhitelist = list("unclebourbon") diff --git a/modular_citadel/code/modules/client/loadout/neck.dm b/modular_citadel/code/modules/client/loadout/neck.dm index 6be13b75d9..128285628a 100644 --- a/modular_citadel/code/modules/client/loadout/neck.dm +++ b/modular_citadel/code/modules/client/loadout/neck.dm @@ -103,6 +103,6 @@ /datum/gear/neck/cancloak name = "Canvas Cloak" - path = /obj/item/clothing/neck/cancloak/polychromic + path = /obj/item/clothing/neck/cloak/cancloak/polychromic loadout_flags = LOADOUT_CAN_NAME | LOADOUT_CAN_DESCRIPTION | LOADOUT_CAN_COLOR_POLYCHROMIC loadout_initial_colors = list("#585858", "#373737", "#BEBEBE") diff --git a/modular_citadel/code/modules/custom_loadout/custom_items.dm b/modular_citadel/code/modules/custom_loadout/custom_items.dm index b7d04e0780..14114c513b 100644 --- a/modular_citadel/code/modules/custom_loadout/custom_items.dm +++ b/modular_citadel/code/modules/custom_loadout/custom_items.dm @@ -229,6 +229,14 @@ mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' icon_state = "stalker" +/obj/item/clothing/mask/gas/military + name = "Military Gas Mask" + desc = "A rare PMC gas mask, one of the very expensive kinds. The inside looks comfortable to wear for a while. The blood red eyes however seem to stare back at you. Creepy." + icon = 'icons/obj/custom.dmi' + item_state = "mgas" + mob_overlay_icon = 'icons/mob/clothing/custom_w.dmi' + icon_state = "mgas" + /obj/item/reagent_containers/food/drinks/flask/steel name = "The End" desc = "A plain steel flask, sealed by lock and key. The front is inscribed with The End." diff --git a/modular_citadel/code/modules/mob/living/carbon/carbon.dm b/modular_citadel/code/modules/mob/living/carbon/carbon.dm index 3a683ca2ff..bea34c27a2 100644 --- a/modular_citadel/code/modules/mob/living/carbon/carbon.dm +++ b/modular_citadel/code/modules/mob/living/carbon/carbon.dm @@ -6,11 +6,11 @@ if(SEND_SIGNAL(src, COMSIG_COMBAT_MODE_CHECK, COMBAT_MODE_TOGGLED)) return FALSE //let's not override the main draw of the game these days voremode = !voremode - var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + var/atom/movable/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() return TRUE /mob/living/carbon/proc/disable_vore_mode() voremode = FALSE - var/obj/screen/voretoggle/T = locate() in hud_used?.static_inventory + var/atom/movable/screen/voretoggle/T = locate() in hud_used?.static_inventory T?.update_icon_state() diff --git a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm index 60c009bc29..3725e46b38 100644 --- a/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm +++ b/modular_citadel/code/modules/reagents/chemistry/reagents/SDGF.dm @@ -109,7 +109,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING ZI.Insert(SM) log_reagent("FERMICHEM: [M] ckey: [M.key]'s zombie_infection has been transferred to their clone") - var/list/policies = CONFIG_GET(keyed_list/policyconfig) + var/list/policies = CONFIG_GET(keyed_list/policy) var/policy = policies[POLICYCONFIG_SDGF] if(policy) to_chat(SM,policy) @@ -127,7 +127,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING else to_chat(SM, "While you find your newfound existence strange, you share the same memories as [M.real_name]. However, You find yourself indifferent to the goals you previously had, and take more interest in your newfound independence, but still have an indescribable care for the safety of your original.") log_reagent("FERMICHEM: [SM] ckey: [SM.key]'s is not bound by [M] ckey [M.key]'s will, and is free to determine their own goals, while respecting and acting as their origin.") - + to_chat(SM, "You feel a strange sensation building in your mind as you realise there's two of you. Before you get a chance to think about it, you suddenly split from your old body, and find yourself face to face with your original, a perfect clone of your origin.") SM.client?.change_view(CONFIG_GET(string/default_view)) to_chat(M, "You feel a strange sensation building in your mind as you realise there's two of you. Before you get a chance to think about it, a mass splits from you, and find yourself face to face with yourself.") @@ -226,7 +226,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING M.adjustCloneLoss(-10, 0) //I don't want to make Rezadone obsolete. M.adjustBruteLoss(-25, 0)// Note that this takes a long time to apply and makes you fat and useless when it's in you, I don't think this small burst of healing will be useful considering how long it takes to get there. M.adjustFireLoss(-25, 0) - M.blood_volume += 250 + M.adjust_integration_blood(250) M.heal_bodypart_damage(1,1) M.action_cooldown_mod = 1 if (M.nutrition < 1500) @@ -236,7 +236,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING to_chat(M, "the cells fail to hold enough mass to generate a clone, instead diffusing into your system.") M.adjustBruteLoss(-10, 0) M.adjustFireLoss(-10, 0) - M.blood_volume += 100 + M.adjust_integration_blood(100) M.action_cooldown_mod = 1 if (M.nutrition < 1500) M.adjust_nutrition(500) @@ -309,7 +309,7 @@ IMPORTANT FACTORS TO CONSIDER WHILE BALANCING /datum/reagent/fermi/SDGFheal/on_mob_life(mob/living/carbon/M)//Used to heal the clone after splitting, the clone spawns damaged. (i.e. insentivies players to make more than required, so their clone doesn't have to be treated) if(M.blood_volume < (BLOOD_VOLUME_NORMAL*M.blood_ratio)) - M.blood_volume += 10 + M.adjust_integration_blood(10) M.adjustCloneLoss(-2, 0) M.setOrganLoss(ORGAN_SLOT_BRAIN, -1) M.adjust_nutrition(10) diff --git a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm index ab39e6f4a7..edaaeb19b2 100644 --- a/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm +++ b/modular_citadel/code/modules/reagents/chemistry/recipes/fermi.dm @@ -28,6 +28,7 @@ //Called when temperature is above a certain threshold, or if purity is too low. /datum/chemical_reaction/proc/FermiExplode(datum/reagents/R0, var/atom/my_atom, volume, temp, pH, Exploding = FALSE) + set waitfor = FALSE if (Exploding == TRUE) return diff --git a/modular_citadel/icons/mob/mam_ears.dmi b/modular_citadel/icons/mob/mam_ears.dmi index 51541619d4..dd3ea5f82b 100644 Binary files a/modular_citadel/icons/mob/mam_ears.dmi and b/modular_citadel/icons/mob/mam_ears.dmi differ diff --git a/modular_citadel/icons/mob/mam_tails.dmi b/modular_citadel/icons/mob/mam_tails.dmi index 5e5a87c199..c1ffced3d5 100644 Binary files a/modular_citadel/icons/mob/mam_tails.dmi and b/modular_citadel/icons/mob/mam_tails.dmi differ diff --git a/sound/effects/chairwhoosh.ogg b/sound/effects/chairwhoosh.ogg new file mode 100644 index 0000000000..907659f7cb Binary files /dev/null and b/sound/effects/chairwhoosh.ogg differ diff --git a/sound/weapons/frost.ogg b/sound/weapons/frost.ogg new file mode 100644 index 0000000000..67884e87be Binary files /dev/null and b/sound/weapons/frost.ogg differ diff --git a/tgstation.dme b/tgstation.dme index 2399f5f09a..f3fb62af87 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -17,7 +17,7 @@ #include "_maps\_basemap.dm" #include "code\_compile_options.dm" #include "code\world.dm" -#include "code\__DEFINES\_extools.dm" +#include "code\__DEFINES\_auxtools.dm" #include "code\__DEFINES\_globals.dm" #include "code\__DEFINES\_protect.dm" #include "code\__DEFINES\_tick.dm" @@ -109,6 +109,7 @@ #include "code\__DEFINES\sight.dm" #include "code\__DEFINES\sound.dm" #include "code\__DEFINES\spaceman_dmm.dm" +#include "code\__DEFINES\spans.dm" #include "code\__DEFINES\species.dm" #include "code\__DEFINES\stat.dm" #include "code\__DEFINES\stat_tracking.dm" @@ -155,6 +156,7 @@ #include "code\__DEFINES\storage\_storage.dm" #include "code\__DEFINES\storage\volumetrics.dm" #include "code\__HELPERS\_cit_helpers.dm" +#include "code\__HELPERS\_extools_api.dm" #include "code\__HELPERS\_lists.dm" #include "code\__HELPERS\_logging.dm" #include "code\__HELPERS\_string_lists.dm" @@ -176,6 +178,7 @@ #include "code\__HELPERS\icon_smoothing.dm" #include "code\__HELPERS\icons.dm" #include "code\__HELPERS\level_traits.dm" +#include "code\__HELPERS\lighting.dm" #include "code\__HELPERS\matrices.dm" #include "code\__HELPERS\mobs.dm" #include "code\__HELPERS\mouse_control.dm" @@ -200,6 +203,7 @@ #include "code\__HELPERS\vector.dm" #include "code\__HELPERS\verbs.dm" #include "code\__HELPERS\view.dm" +#include "code\__HELPERS\yelling.dm" #include "code\__HELPERS\sorts\__main.dm" #include "code\__HELPERS\sorts\InsertSort.dm" #include "code\__HELPERS\sorts\MergeSort.dm" @@ -289,32 +293,43 @@ #include "code\controllers\subsystem.dm" #include "code\controllers\configuration\config_entry.dm" #include "code\controllers\configuration\configuration.dm" +#include "code\controllers\configuration\entries\admin.dm" +#include "code\controllers\configuration\entries\alert.dm" +#include "code\controllers\configuration\entries\antag_rep.dm" #include "code\controllers\configuration\entries\comms.dm" +#include "code\controllers\configuration\entries\connections.dm" #include "code\controllers\configuration\entries\dbconfig.dm" +#include "code\controllers\configuration\entries\debris.dm" #include "code\controllers\configuration\entries\donator.dm" #include "code\controllers\configuration\entries\dynamic.dm" -#include "code\controllers\configuration\entries\fail2topic.dm" -#include "code\controllers\configuration\entries\game_options.dm" +#include "code\controllers\configuration\entries\fetish_content.dm" +#include "code\controllers\configuration\entries\gamemodes.dm" #include "code\controllers\configuration\entries\general.dm" +#include "code\controllers\configuration\entries\jexp.dm" #include "code\controllers\configuration\entries\logging.dm" +#include "code\controllers\configuration\entries\movespeed.dm" #include "code\controllers\configuration\entries\persistence.dm" #include "code\controllers\configuration\entries\plushies.dm" #include "code\controllers\configuration\entries\policy.dm" #include "code\controllers\configuration\entries\resources.dm" #include "code\controllers\configuration\entries\respawns.dm" +#include "code\controllers\configuration\entries\security.dm" +#include "code\controllers\configuration\entries\server.dm" #include "code\controllers\configuration\entries\stamina_combat.dm" +#include "code\controllers\configuration\entries\threat.dm" +#include "code\controllers\configuration\entries\urls.dm" +#include "code\controllers\configuration\entries\vote.dm" #include "code\controllers\subsystem\achievements.dm" -#include "code\controllers\subsystem\acid.dm" #include "code\controllers\subsystem\activity.dm" #include "code\controllers\subsystem\adjacent_air.dm" #include "code\controllers\subsystem\air.dm" -#include "code\controllers\subsystem\air_turfs.dm" #include "code\controllers\subsystem\assets.dm" #include "code\controllers\subsystem\atoms.dm" #include "code\controllers\subsystem\augury.dm" #include "code\controllers\subsystem\autotransfer.dm" #include "code\controllers\subsystem\blackbox.dm" #include "code\controllers\subsystem\blackmarket.dm" +#include "code\controllers\subsystem\callback.dm" #include "code\controllers\subsystem\chat.dm" #include "code\controllers\subsystem\communications.dm" #include "code\controllers\subsystem\dbcore.dm" @@ -456,6 +471,7 @@ #include "code\datums\brain_damage\special.dm" #include "code\datums\brain_damage\split_personality.dm" #include "code\datums\components\_component.dm" +#include "code\datums\components\acid.dm" #include "code\datums\components\activity.dm" #include "code\datums\components\anti_magic.dm" #include "code\datums\components\armor_plate.dm" @@ -636,6 +652,7 @@ #include "code\datums\elements\swimming.dm" #include "code\datums\elements\sword_point.dm" #include "code\datums\elements\tactical.dm" +#include "code\datums\elements\trash.dm" #include "code\datums\elements\turf_transparency.dm" #include "code\datums\elements\update_icon_blocker.dm" #include "code\datums\elements\update_icon_updates_onmob.dm" @@ -1791,11 +1808,13 @@ #include "code\modules\asset_cache\transports\asset_transport.dm" #include "code\modules\asset_cache\transports\webroot_transport.dm" #include "code\modules\atmospherics\multiz.dm" +#include "code\modules\atmospherics\auxgm\breathing_classes.dm" +#include "code\modules\atmospherics\auxgm\gas_types.dm" #include "code\modules\atmospherics\environmental\LINDA_fire.dm" #include "code\modules\atmospherics\environmental\LINDA_system.dm" #include "code\modules\atmospherics\environmental\LINDA_turf_tile.dm" +#include "code\modules\atmospherics\gasmixtures\auxgm.dm" #include "code\modules\atmospherics\gasmixtures\gas_mixture.dm" -#include "code\modules\atmospherics\gasmixtures\gas_types.dm" #include "code\modules\atmospherics\gasmixtures\immutable_mixtures.dm" #include "code\modules\atmospherics\gasmixtures\reactions.dm" #include "code\modules\atmospherics\machinery\airalarm.dm" @@ -3124,7 +3143,6 @@ #include "code\modules\projectiles\guns\ballistic\automatic.dm" #include "code\modules\projectiles\guns\ballistic\bow.dm" #include "code\modules\projectiles\guns\ballistic\derringer.dm" -#include "code\modules\projectiles\guns\ballistic\laser_gatling.dm" #include "code\modules\projectiles\guns\ballistic\launchers.dm" #include "code\modules\projectiles\guns\ballistic\magweapon.dm" #include "code\modules\projectiles\guns\ballistic\pistol.dm" @@ -3135,6 +3153,7 @@ #include "code\modules\projectiles\guns\energy\energy_gun.dm" #include "code\modules\projectiles\guns\energy\kinetic_accelerator.dm" #include "code\modules\projectiles\guns\energy\laser.dm" +#include "code\modules\projectiles\guns\energy\laser_gatling.dm" #include "code\modules\projectiles\guns\energy\megabuster.dm" #include "code\modules\projectiles\guns\energy\mounted.dm" #include "code\modules\projectiles\guns\energy\plasma_cit.dm" @@ -3589,6 +3608,7 @@ #include "code\modules\tgui\states\observer.dm" #include "code\modules\tgui\states\physical.dm" #include "code\modules\tgui\states\self.dm" +#include "code\modules\tgui\states\vorepanel.dm" #include "code\modules\tgui\states\zlevel.dm" #include "code\modules\tgui_panel\audio.dm" #include "code\modules\tgui_panel\external.dm" @@ -3615,6 +3635,7 @@ #include "code\modules\vehicles\atv.dm" #include "code\modules\vehicles\bicycle.dm" #include "code\modules\vehicles\lavaboat.dm" +#include "code\modules\vehicles\motorized_wheelchair.dm" #include "code\modules\vehicles\pimpin_ride.dm" #include "code\modules\vehicles\ridden.dm" #include "code\modules\vehicles\scooter.dm" diff --git a/tgui/packages/tgui/interfaces/VorePanel.js b/tgui/packages/tgui/interfaces/VorePanel.js new file mode 100644 index 0000000000..3e29c8bff4 --- /dev/null +++ b/tgui/packages/tgui/interfaces/VorePanel.js @@ -0,0 +1,591 @@ +/* eslint-disable max-len */ +import { Fragment } from 'inferno'; +import { useBackend, useLocalState } from "../backend"; +import { Box, Button, Flex, Collapsible, Icon, LabeledList, NoticeBox, Section, Tabs } from "../components"; +import { Window } from "../layouts"; + +const stats = [ + null, + 'average', + 'bad', +]; + +const digestModeToColor = { + "Hold": null, + "Dragon": "blue", + "Digest": "red", + "Absorb": "purple", + "Unabsorb": "purple", +}; + +const digestModeToPreyMode = { + "Hold": "being held.", + "Digest": "being digested.", + "Absorb": "being absorbed.", + "Unabsorb": "being unabsorbed.", + "Dragon": "being digested by a powerful creature.", +}; + +/** + * There are three main sections to this UI. + * - The Inside Panel, where all relevant data for interacting with a belly you're in is located. + * - The Belly Selection Panel, where you can select what belly people will go into and customize the active one. + * - User Preferences, where you can adjust all of your vore preferences on the fly. + */ +export const VorePanel = (props, context) => { + const { act, data } = useBackend(context); + return ( + + + {data.unsaved_changes && ( + + + + Warning: Unsaved Changes! + + + + ) || null} + {show_pictures && ( + + {contents.map(thing => ( + + + {thing.name} + + ))} + + ) || ( + + {contents.map(thing => ( + + + + ))} + + )} + + ); +}; + +const VoreUserPreferences = (props, context) => { + const { act, data } = useBackend(context); + + const { + digestable, + devourable, + feeding, + absorbable, + allowmobvore, + vore_sounds, + digestion_sounds, + lickable, + smellable, + } = data.prefs; + + const { + show_pictures, + } = data; + + return ( +
act("show_pictures")}> + Contents Preference: {show_pictures ? "Show Pictures" : "Show List"} + + }> + + +
+ + ); +}; diff --git a/tools/build/binaries/README.md b/tools/build/binaries/README.md new file mode 100644 index 0000000000..625f337d98 --- /dev/null +++ b/tools/build/binaries/README.md @@ -0,0 +1 @@ +This directory is used to store temporary files to create binaries on linux \ No newline at end of file diff --git a/tools/build/build b/tools/build/build index 0e202e1bba..cd4d804e8f 100755 --- a/tools/build/build +++ b/tools/build/build @@ -1,4 +1,6 @@ #!/bin/sh + +#Build TGUI set -e cd "$(dirname "$0")" exec ../bootstrap/node build.js "$@" diff --git a/tools/build/build.js b/tools/build/build.js index 33767ebd72..0f04441334 100755 --- a/tools/build/build.js +++ b/tools/build/build.js @@ -124,7 +124,7 @@ const taskDm = (...injectedDefines) => new Task('dm') .depends('html/**') .depends('icons/**') .depends('interface/**') - .depends(process.platform === 'win32' ? 'byond-extools.*' : 'libbyond-extools.*') + .depends(process.platform === 'win32' ? 'auxmos.*' : 'libauxmos.*') .depends('tgui/public/tgui.html') .depends('tgui/public/*.bundle.*') .depends(`${DME_NAME}.dme`) diff --git a/tools/build/build.sh b/tools/build/build.sh new file mode 100755 index 0000000000..62372eff2d --- /dev/null +++ b/tools/build/build.sh @@ -0,0 +1,75 @@ +#!/bin/sh + +#Detect OS and use corresponding package manager for dependencies. Currently only works for arch, debian/ubuntu, and RHEL/fedora/CentOS +if [[ -f '/etc/arch-release' ]]; then + echo -ne '\n y' | sudo pacman --needed -Sy base-devel git curl nodejs unzip +fi +if [[ -f '/etc/debian version' ]]; then + sudo dpkg --add-architecture i386 + sudo apt-get update + sudo apt-get install -y build-essential git curl lib32z1 pkg-config libssl-dev:i386 libssl-dev nodejs unzip g++-multilib libc6-i386 libstdc++6:i386 +fi +if [[ -f '/etc/centos-release' ]] || [[ -f '/etc/fedora-release' ]]; then #DNF should work for both of these + sudo dnf --refresh install make automake gcc gcc-c++ kernel-devel git curl unzip glibc-devel.i686 openssl-devel.i686 libgcc.i686 libstdc++-devel.i686 +fi + +cd binaries + +#Install rust if not present +if ! [ -x "$has_cargo" ]; then + echo "Installing rust..." + curl https://sh.rustup.rs -sSf | sh -s -- -y + . ~/.profile +fi + +#Download/update rust-g repo +if [ ! -d "rust-g" ]; then + echo "Cloning rust-g..." + git clone https://github.com/tgstation/rust-g + cd rust-g + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu +else + echo "Fetching rust-g..." + cd rust-g + git fetch + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu +fi + +#Compile and move rust-g binary to repo root +echo "Deploying rust-g..." +git checkout "$RUST_G_VERSION" +env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --target=i686-unknown-linux-gnu +mv target/i686-unknown-linux-gnu/release/librust_g.so ../../../../librust_g.so +cd .. + +#Download/update auxmos repo +if [ ! -d "auxmos" ]; then + echo "Cloning auxmos..." + git clone https://github.com/Putnam3145/auxmos + cd auxmos + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu +else + echo "Fetching auxmos..." + cd auxmos + git fetch + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu +fi + +#Compile and move auxmos binary to repo root +echo "Deploying auxmos..." +git checkout "$AUXMOS_VERSION" +env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features all_reaction_hooks,explosive_decompression -- -C target-cpu=native +mv target/i686-unknown-linux-gnu/release/libauxmos.so ../../../../libauxmos.so +cd ../.. + +#Install BYOND +cd ../.. +./tools/ci/install_byond.sh +source $HOME/BYOND/byond/bin/byondsetup + +cd tools/build + +#Build TGUI +set -e +cd "$(dirname "$0")" +exec ../bootstrap/node build.js "$@" diff --git a/tools/ci/check_grep.sh b/tools/ci/check_grep.sh index 9638215bb8..079f79704d 100755 --- a/tools/ci/check_grep.sh +++ b/tools/ci/check_grep.sh @@ -6,6 +6,10 @@ shopt -s globstar st=0 +if git grep -P "\r\n"; then + echo "ERROR: CRLF line endings detected. Please stop using the webeditor, and fix it using a desktop Git client." + st = 1 +fi; if grep -El '^\".+\" = \(.+\)' _maps/**/*.dmm; then echo "ERROR: Non-TGM formatted map detected. Please convert it using Map Merger!" st=1 diff --git a/tools/ci/install_auxmos.sh b/tools/ci/install_auxmos.sh new file mode 100644 index 0000000000..bfdbe7199b --- /dev/null +++ b/tools/ci/install_auxmos.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +set -euo pipefail + +source dependencies.sh + +mkdir -p ~/.byond/bin +wget -O ~/.byond/bin/libauxmos.so "https://github.com/Putnam3145/auxmos/releases/download/${AUXMOS_VERSION}/libauxmos.so" +chmod +x ~/.byond/bin/libauxmos.so +ldd ~/.byond/bin/libauxmos.so diff --git a/tools/ci/install_rust_g.sh b/tools/ci/install_rust_g.sh old mode 100755 new mode 100644 diff --git a/tools/ci/run_server.sh b/tools/ci/run_server.sh index ef548370f1..4d943846f0 100755 --- a/tools/ci/run_server.sh +++ b/tools/ci/run_server.sh @@ -7,11 +7,6 @@ mkdir ci_test/config #test config cp tools/ci/ci_config.txt ci_test/config/config.txt -#throw extools into ldd -cp libbyond-extools.so ~/.byond/bin/libbyond-extools.so -chmod +x ~/.byond/bin/libbyond-extools.so -ldd ~/.byond/bin/libbyond-extools.so - cd ci_test DreamDaemon tgstation.dmb -close -trusted -verbose -params "log-directory=ci" cd .. diff --git a/tools/deploy.sh b/tools/deploy.sh index d09b606a86..f6fc14d67d 100755 --- a/tools/deploy.sh +++ b/tools/deploy.sh @@ -22,8 +22,6 @@ fi cp tgstation.dmb tgstation.rsc $1/ cp -r _maps/* $1/_maps/ -cp -r icons/runtime/* $1/icons/runtime/ -cp -r sound/runtime/* $1/sound/runtime/ cp -r strings/* $1/strings/ #remove .dm files from _maps diff --git a/tools/tgs4_scripts/PreCompile.sh b/tools/tgs4_scripts/PreCompile.sh index f21036ab19..6130736b4e 100755 --- a/tools/tgs4_scripts/PreCompile.sh +++ b/tools/tgs4_scripts/PreCompile.sh @@ -66,31 +66,27 @@ env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo build --release --target=i686-un mv target/i686-unknown-linux-gnu/release/librust_g.so "$1/librust_g.so" cd .. -# get dependencies for extools -apt-get install -y cmake build-essential gcc-multilib g++-multilib cmake wget +# Auxtools dependencies +apt-get install -y build-essential g++-multilib libc6-i386 libstdc++6:i386 -# update extools -if [ ! -d "extools" ]; then - echo "Cloning extools..." - git clone https://github.com/MCHSL/extools - cd extools/byond-extools +# Update auxmos +if [ ! -d "auxmos" ]; then + echo "Cloning auxmos..." + git clone https://github.com/Putnam3145/auxmos + cd auxmos + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu else - echo "Fetching extools..." - cd extools/byond-extools + echo "Fetching auxmos..." + cd auxmos git fetch + ~/.cargo/bin/rustup target add i686-unknown-linux-gnu fi -echo "Deploying extools..." -git checkout "$EXTOOLS_VERSION" -if [ -d "build" ]; then - rm -R build -fi -mkdir build -cd build -cmake .. -make -mv libbyond-extools.so "$1/libbyond-extools.so" -cd ../../.. +echo "Deploying auxmos..." +git checkout "$AUXMOS_VERSION" +env PKG_CONFIG_ALLOW_CROSS=1 ~/.cargo/bin/cargo rustc --release --target=i686-unknown-linux-gnu --features all_reaction_hooks,explosive_decompression -- -C target-cpu=native +mv -f target/i686-unknown-linux-gnu/release/libauxmos.so "$1/libauxmos.so" +cd .. # install or update youtube-dl when not present, or if it is present with pip3, # which we assume was used to install it